Skip to content

[DMS-865] Add year dropdown to swagger UI #2287

[DMS-865] Add year dropdown to swagger UI

[DMS-865] Add year dropdown to swagger UI #2287

# SPDX-License-Identifier: Apache-2.0
# Licensed to the Ed-Fi Alliance under one or more agreements.
# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0.
# See the LICENSE and NOTICES files in the project root for more information.
name: On DMS Pull Request
on:
push:
# Running on push to main to support CodeQL on C#
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
CONFIGURATION: "Release"
permissions: read-all
jobs:
scan-actions-bidi:
name: Scan Actions, scan all files for BIDI Trojan Attacks
uses: Ed-Fi-Alliance-OSS/Ed-Fi-Actions/.github/workflows/repository-scanner.yml@main
with:
config-file-path: ./.github/workflows/bidi-config.json
run-unit-tests:
name: Run Unit Tests
runs-on: ubuntu-latest
permissions:
checks: write
defaults:
run:
shell: pwsh
steps:
- name: Checkout the Repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Cache Nuget packages
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup dotnet
uses: actions/setup-dotnet@87b7050bc53ea08284295505d98d2aa94301e852 # v4.2
with:
dotnet-version: "8.0.x"
- name: Build
run: ./build-dms.ps1 Build -Configuration ${{ env.CONFIGURATION }}
- name: Install Coverlet Reference
if: success()
run: |
dotnet tool install --global coverlet.console
dotnet tool install --global dotnet-reportgenerator-globaltool
- name: Run Unit Tests
run: ./build-dms.ps1 UnitTest -Configuration ${{ env.CONFIGURATION }}
- name: Generate Coverage Report
if: ${{ hashFiles('coverage.cobertura.xml') != '' }}
run: ./build-dms.ps1 Coverage
- name: Upload Coverage Report
if: always()
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: Coverage Report
path: coveragereport
- name: Upload Test Results
uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1
if: (success() || failure())
with:
name: Unit Tests
path: "**/*.trx"
path-replace-backslashes: "true"
reporter: dotnet-trx
run-integration-tests:
name: Run Integration Tests
runs-on: ubuntu-latest
permissions:
checks: write
defaults:
run:
shell: pwsh
services:
postgres:
image: postgres:16.3-alpine
options: >-
--health-cmd="pg_isready"
--health-interval=10s
--health-timeout=5s
--health-retries=5
ports:
- 5432:5432
env:
POSTGRES_HOST_AUTH_METHOD: trust
steps:
- name: Checkout the Repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Cache Nuget packages
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup dotnet
uses: actions/setup-dotnet@87b7050bc53ea08284295505d98d2aa94301e852 # v4.2
with:
dotnet-version: "8.0.x"
- name: Build
run: ./build-dms.ps1 Build -Configuration ${{ env.CONFIGURATION }}
- name: Run Integration Tests
if: success()
run: ./build-dms.ps1 IntegrationTest -Configuration ${{ env.CONFIGURATION }}
- name: Upload Integration Test Results
uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1
if: (success() || failure())
with:
name: Integration Tests
path: "**/*.trx"
path-replace-backslashes: "true"
reporter: dotnet-trx
run-e2e-tests:
name: Run ${{matrix.queryhandler}} E2E Tests (IdentityProvider ${{matrix.identityprovider}})
runs-on: ubuntu-latest
strategy:
matrix:
identityprovider: [keycloak, self-contained]
queryhandler: [postgresql]
permissions:
checks: write
defaults:
run:
shell: pwsh
steps:
- name: Checkout the Repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Cache Docker layers
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ hashFiles('src/Directory.Packages.props', 'src/dms/Dockerfile', 'src/dms/**') }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build DMS Docker image
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0
with:
load: true
context: ./src/dms
file: ./src/dms/Dockerfile
build-contexts: |
parentdir=./src
push: false
tags: dms-local-dms:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
- name: Cache Nuget packages
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup dotnet
uses: actions/setup-dotnet@87b7050bc53ea08284295505d98d2aa94301e852 # v4.2
with:
dotnet-version: "8.0.x"
- name: Build
run: ./build-dms.ps1 Build -Configuration ${{ env.CONFIGURATION }} -IdentityProvider ${{matrix.identityprovider}}
- name: Add Kafka hostname to /etc/hosts
run: echo "127.0.0.1 dms-kafka1" | sudo tee -a /etc/hosts
- name: Run ${{matrix.queryhandler}} - IdentityProvider (${{matrix.identityprovider}}) E2E Tests
if: success()
env:
KAFKA_BOOTSTRAP_SERVERS: dms-kafka1:9092
run: |
./build-dms.ps1 E2ETest -Configuration ${{ env.CONFIGURATION }} -SkipDockerBuild -IdentityProvider ${{matrix.identityprovider}}
- name: Export Docker Logs
if: failure()
run: |
$logDir = "${{ github.workspace }}/logs"
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
docker ps --format "{{.Names}}" | ForEach-Object {
$container = $_
$logPath = Join-Path $logDir "$container.log"
docker logs $container > $logPath
}
shell: pwsh
- name: Upload Logs
if: failure()
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: ${{matrix.queryhandler}}-test-logs
path: |
${{ github.workspace }}/logs
retention-days: 10
- name: Upload Test Results
uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1
if: (success() || failure())
with:
name: E2E Test Results
path: "**/*.trx"
path-replace-backslashes: "true"
reporter: dotnet-trx
run-instance-management-e2e-tests:
name: Run Instance Management E2E Tests (Route Qualifiers)
runs-on: ubuntu-latest
permissions:
checks: write
defaults:
run:
shell: pwsh
steps:
- name: Checkout the Repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Cache Docker layers
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ hashFiles('src/Directory.Packages.props', 'src/dms/Dockerfile', 'src/dms/**') }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build DMS Docker image
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0
with:
load: true
context: ./src/dms
file: ./src/dms/Dockerfile
build-contexts: |
parentdir=./src
push: false
tags: dms-local-dms:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
- name: Cache Nuget packages
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup dotnet
uses: actions/setup-dotnet@87b7050bc53ea08284295505d98d2aa94301e852 # v4.2
with:
dotnet-version: "8.0.x"
- name: Build
run: ./build-dms.ps1 Build -Configuration ${{ env.CONFIGURATION }}
- name: Add Kafka hostname to /etc/hosts
run: echo "127.0.0.1 dms-kafka1" | sudo tee -a /etc/hosts
- name: Run Instance Management E2E Tests
if: success()
env:
KAFKA_BOOTSTRAP_SERVERS: dms-kafka1:9092
DMS_API_URL: http://localhost:8080
run: |
# Build script handles Docker environment setup, database configuration, and test execution
./build-dms.ps1 InstanceE2ETest -Configuration ${{ env.CONFIGURATION }}
- name: Export Docker Logs
if: failure()
run: |
Write-Host "Capturing Docker container logs before teardown..." -ForegroundColor Cyan
$logDir = "${{ github.workspace }}/logs"
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
docker ps -a --format "{{.Names}}" | ForEach-Object {
$container = $_
Write-Host "Capturing logs for container: $container" -ForegroundColor Yellow
$logPath = Join-Path $logDir "$container.log"
docker logs $container > $logPath 2>&1
# Also display DMS logs in the workflow output for easier debugging
if ($container -eq "dms-local-dms") {
Write-Host "`n========== DMS Container Logs ==========" -ForegroundColor Cyan
docker logs $container 2>&1
Write-Host "`n========================================`n" -ForegroundColor Cyan
}
}
shell: pwsh
- name: Teardown Instance Management Test Environment
if: always()
run: |
# Use the Instance Management teardown script to stop Docker
./src/dms/tests/EdFi.InstanceManagement.Tests.E2E/teardown-local-dms.ps1
- name: Upload Logs
if: failure()
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: instance-management-test-logs
path: |
${{ github.workspace }}/logs
retention-days: 10
- name: Upload Test Results
uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1
if: (success() || failure())
with:
name: Instance Management E2E Test Results
path: "**/*.trx"
path-replace-backslashes: "true"
reporter: dotnet-trx
build-and-start-dms:
name: Build and Start DMS, Download OpenAPI Specs
runs-on: ubuntu-latest
defaults:
run:
shell: pwsh
steps:
- name: Checkout the Repo
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Cache Nuget packages
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Cache Docker layers
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 #v4.2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ hashFiles('src/Directory.Packages.props', 'src/dms/Dockerfile', 'src/dms/**') }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build DMS Docker image
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0
with:
load: true
context: ./src/dms
file: ./src/dms/Dockerfile
build-contexts: |
parentdir=./src
push: false
tags: dms-local-dms:latest
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
- name: Setup dotnet
uses: actions/setup-dotnet@87b7050bc53ea08284295505d98d2aa94301e852 # v4.2
with:
dotnet-version: "8.0.x"
- name: Build
run: ./build-dms.ps1 Build -Configuration ${{ env.CONFIGURATION }}
- name: Start DMS Docker
run: |
./start-local-dms.ps1 -EnvironmentFile "./.env.e2e" -EnableConfig -r
working-directory: eng/docker-compose/
- name: Wait for DMS to be ready
run: |
$maxAttempts = 10
$attempt = 0
$ready = $false
while (-not $ready -and $attempt -lt $maxAttempts) {
$attempt++
Write-Host "Waiting for DMS to be ready (attempt $attempt/$maxAttempts)..."
try {
$response = Invoke-WebRequest -Uri "http://localhost:8080/metadata/specifications/resources-spec.json" -Method Get -TimeoutSec 5 -ErrorAction Stop
if ($response.StatusCode -eq 200) {
$ready = $true
Write-Host "DMS is ready!"
}
}
catch {
Write-Host "DMS not ready yet: $_"
Start-Sleep -Seconds 10
}
}
if (-not $ready) {
throw "DMS did not become ready within the timeout period"
}
- name: Download OpenAPI specs
run: |
mkdir specs
Invoke-WebRequest -Uri "http://localhost:8080/metadata/specifications/resources-spec.json" -OutFile "specs/resources-spec.json"
Invoke-WebRequest -Uri "http://localhost:8080/metadata/specifications/descriptors-spec.json" -OutFile "specs/descriptors-spec.json"
Invoke-WebRequest -Uri "http://localhost:8080/metadata/specifications/discovery-spec.json" -OutFile "specs/discovery-spec.json"
- name: Upload Resources Spec
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: resources-spec
path: specs/resources-spec.json
- name: Upload Descriptors Spec
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: descriptors-spec
path: specs/descriptors-spec.json
- name: Upload Discovery Spec
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: discovery-spec
path: specs/discovery-spec.json
validate-resources-spec:
name: Validate Resources Spec
runs-on: ubuntu-latest
needs: build-and-start-dms
steps:
- name: Download Resources Spec
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 #v4.1.8
with:
name: resources-spec
path: specs
- name: Validate Resources Spec
uses: swaggerexpert/swagger-editor-validate@54b85e2f5c1fcdee85308dd57cad8c8ec19d3970
with:
definition-file: specs/resources-spec.json
default-timeout: 45000 # 45 seconds
- name: Download Resources Spec
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 #v4.1.8
with:
name: descriptors-spec
path: specs
- name: Validate Descriptors Spec
uses: swaggerexpert/swagger-editor-validate@54b85e2f5c1fcdee85308dd57cad8c8ec19d3970
with:
definition-file: specs/descriptors-spec.json
default-timeout: 45000
validate-descriptors-spec:
name: Validate Descriptors Spec
runs-on: ubuntu-latest
needs: build-and-start-dms
steps:
- name: Download Descriptors Spec
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 #v4.1.8
with:
name: descriptors-spec
path: specs
- name: Validate Descriptors Spec
uses: swaggerexpert/swagger-editor-validate@54b85e2f5c1fcdee85308dd57cad8c8ec19d3970
with:
definition-file: specs/descriptors-spec.json
default-timeout: 45000
validate-discovery-spec:
name: Validate Discovery Spec
runs-on: ubuntu-latest
needs: build-and-start-dms
steps:
- name: Download Discovery Spec
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 #v4.1.8
with:
name: discovery-spec
path: specs
- name: Validate Discovery Spec
uses: swaggerexpert/swagger-editor-validate@54b85e2f5c1fcdee85308dd57cad8c8ec19d3970
with:
definition-file: specs/discovery-spec.json
default-timeout: 45000 # 45 seconds
event_file:
name: Upload Event File
runs-on: ubuntu-latest
needs:
[
run-unit-tests,
run-e2e-tests,
run-instance-management-e2e-tests,
run-integration-tests,
validate-resources-spec,
validate-descriptors-spec,
validate-discovery-spec,
]
if: always()
steps:
- name: Upload
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5
with:
name: Event File
path: ${{ github.event_path }}