diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index da88e2d..638a92e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -22,7 +22,7 @@ jobs: run: dotnet restore - name: Build run: dotnet build --no-restore - - name: Test + - name: Run unit tests working-directory: ./test/SnD.ApiClient.Tests run: | dotnet add package coverlet.msbuild && @@ -33,3 +33,19 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} lcov-file: ./test/Coverage/coverage.info + + - name: Setup just + uses: extractions/setup-just@v3 + + - name: Setup integration tests + run: just up + + - name: Run acceptance tests + working-directory: ./test/SnD.ApiClient.Tests.Acceptance + run: | + dotnet test SnD.ApiClient.Tests.Acceptance.csproj --configuration Debug --runtime linux-x64 + + - name: Get logs from application pods + if: always() + run: | + kubectl describe pods --namespace default || true diff --git a/integration_tests/kind.yaml b/integration_tests/kind.yaml new file mode 100644 index 0000000..44c43cb --- /dev/null +++ b/integration_tests/kind.yaml @@ -0,0 +1,14 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: + - role: control-plane + extraPortMappings: + - containerPort: 80 + hostPort: 5555 + protocol: TCP + - containerPort: 30043 + hostPort: 9000 + protocol: TCP + - containerPort: 30042 + hostPort: 9042 + protocol: TCP diff --git a/integration_tests/manifests/hello-world-algorithm.yaml b/integration_tests/manifests/hello-world-algorithm.yaml new file mode 100644 index 0000000..4222b12 --- /dev/null +++ b/integration_tests/manifests/hello-world-algorithm.yaml @@ -0,0 +1,68 @@ +apiVersion: science.sneaksanddata.com/v1 +kind: NexusAlgorithmTemplate +metadata: + name: hello-world + annotations: + "helm.sh/hook": post-install,post-upgrade + "helm.sh/hook-weight": "0" + "helm.sh/hook-delete-policy": before-hook-creation +spec: + args: + - main.py + - '--sas-uri=%s' + - '--request-id=%s' + command: python + computeResources: + cpuLimit: 1000m + memoryLimit: 1000Mi + container: + image: nexus-hello + registry: ghcr.io/sneaksanddata + serviceAccountName: nexus + versionTag: 0.1.2 + datadogIntegrationSettings: + mountDatadogSocket: true + errorHandlingBehaviour: + fatalExitCodes: + - 137 + transientExitCodes: + - 139 + runtimeEnvironment: + deadlineSeconds: 120 + environmentVariables: + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: PROTEUS__DD_SITE + value: datadoghq.eu + - name: NEXUS__ALGORITHM_NAME + value: nexus-hello + - name: NEXUS__SCHEDULER_URL + value: http://nexus.nexus.svc.cluster.local:8080 + - name: NEXUS__RECEIVER_URL + value: http://dockerhost.nexus.svc.cluster.local:8081 + - name: NEXUS__STORAGE_CLIENT_CLASS + value: adapta.storage.blob.s3_storage_client.S3StorageClient + - name: ALGORITHM_STORAGE__BASE_PATH + value: s3a://nexus/storage + - name: NEXUS__ALGORITHM_OUTPUT_PATH + value: s3a://nexus/result + - name: NEXUS__TELEMETRY_PATH + value: s3a://nexus/telemetry + - name: ALGORITHM_STORAGE_TYPE + value: S3 + - name: PROTEUS__AWS_REGION + value: us-east-1 + - name: PROTEUS__AWS_ENDPOINT + value: http://dockerhost.nexus.svc.cluster.local:9000 + - name: PROTEUS__AWS_SECRET_ACCESS_KEY + value: minioadmin + - name: PROTEUS__AWS_ACCESS_KEY_ID + value: minioadmin + mappedEnvironmentVariables: [] + maximumRetries: 1 + workgroupRef: + group: science.sneaksanddata.com + kind: NexusAlgorithmWorkgroup + name: default diff --git a/integration_tests/manifests/hello-world-workgroup.yaml b/integration_tests/manifests/hello-world-workgroup.yaml new file mode 100644 index 0000000..5ed56b3 --- /dev/null +++ b/integration_tests/manifests/hello-world-workgroup.yaml @@ -0,0 +1,13 @@ +apiVersion: science.sneaksanddata.com/v1 +kind: NexusAlgorithmWorkgroup +metadata: + name: default + annotations: + "helm.sh/hook": post-install,post-upgrade + "helm.sh/hook-weight": "1" + "helm.sh/hook-delete-policy": before-hook-creation +spec: + affinity: {} + cluster: kind-nexus-shard-0 + description: Default workgroup + tolerations: [] \ No newline at end of file diff --git a/integration_tests/manifests/ingress.yaml b/integration_tests/manifests/ingress.yaml new file mode 100644 index 0000000..bc69ec2 --- /dev/null +++ b/integration_tests/manifests/ingress.yaml @@ -0,0 +1,39 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: receiver + annotations: + nginx.ingress.kubernetes.io/use-regex: "true" + nginx.ingress.kubernetes.io/rewrite-target: /$2 +spec: + ingressClassName: nginx + rules: + - http: + paths: + - pathType: ImplementationSpecific + path: /receiver(/|$)(.*) + backend: + service: + name: nexus-receiver + port: + number: 8080 +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: scheduler + annotations: + nginx.ingress.kubernetes.io/use-regex: "true" + nginx.ingress.kubernetes.io/rewrite-target: /$2 +spec: + ingressClassName: nginx + rules: + - http: + paths: + - pathType: ImplementationSpecific + path: /scheduler(/|$)(.*) + backend: + service: + name: nexus + port: + number: 8080 diff --git a/integration_tests/manifests/minio.yaml b/integration_tests/manifests/minio.yaml new file mode 100644 index 0000000..5e23bae --- /dev/null +++ b/integration_tests/manifests/minio.yaml @@ -0,0 +1,116 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: minio + labels: + app: minio +spec: + replicas: 1 + selector: + matchLabels: + app: minio + template: + metadata: + labels: + app: minio + spec: + hostname: minio-e2e + containers: + - name: minio + image: quay.io/minio/minio + args: + - server + - /data + - "--console-address" + - ":9123" + ports: + - containerPort: 9000 + - containerPort: 9123 + livenessProbe: + httpGet: + path: / + port: 9123 + initialDelaySeconds: 30 + periodSeconds: 30 + timeoutSeconds: 10 + failureThreshold: 5 + readinessProbe: + httpGet: + path: / + port: 9123 + initialDelaySeconds: 30 + periodSeconds: 30 + timeoutSeconds: 10 + failureThreshold: 5 +--- +apiVersion: v1 +kind: Service +metadata: + name: minio +spec: + selector: + app: minio + ports: + - name: api + port: 9000 + targetPort: 9000 + - name: console + port: 9123 + targetPort: 9123 + type: ClusterIP +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: minio-setup +spec: + backoffLimit: 5 + template: + spec: + restartPolicy: OnFailure + containers: + - name: minio-setup + image: quay.io/minio/minio + command: + - /bin/sh + - -c + - | + echo "Waiting for Minio to be available via mc..." + max_retries=30 + attempt=1 + until mc alias set e2e "http://minio.default.svc.cluster.local:9000" minioadmin minioadmin >/dev/null 2>&1; do + if (( attempt >= max_retries )); then + echo "minio did not become available after $max_retries attempts." + exit 1 + fi + sleep 1 + ((attempt++)) + done + echo "mc is available." + mc admin info e2e + mc mb --ignore-existing e2e/tmp + mc mb --ignore-existing e2e/nexus + mc mb --ignore-existing e2e/nexus-sdk-tests +--- +apiVersion: v1 +kind: Service +metadata: + name: minio-node-port +spec: + selector: + app: minio + ports: + - port: 9000 + targetPort: 9000 + nodePort: 30043 + type: NodePort +--- +apiVersion: v1 +kind: Secret +metadata: + name: minio-credentials +stringData: + NEXUS__S3_BUFFER__ACCESS_KEY_ID: "minioadmin" + NEXUS__S3_BUFFER__SECRET_ACCESS_KEY: "minioadmin" + NEXUS__S3_BUFFER__ENDPOINT: "http://minio.default.svc.cluster.local:9000" + NEXUS__S3_BUFFER__REGION: "us-east-1" diff --git a/integration_tests/manifests/nexus-algorithm-sa.yaml b/integration_tests/manifests/nexus-algorithm-sa.yaml new file mode 100644 index 0000000..9fe2bc2 --- /dev/null +++ b/integration_tests/manifests/nexus-algorithm-sa.yaml @@ -0,0 +1,12 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: nexus:serviceaccount:nexus +subjects: + - kind: ServiceAccount + name: nexus + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: admin diff --git a/integration_tests/manifests/scylladb.yaml b/integration_tests/manifests/scylladb.yaml new file mode 100644 index 0000000..58e7b9a --- /dev/null +++ b/integration_tests/manifests/scylladb.yaml @@ -0,0 +1,85 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: scylla +spec: + replicas: 1 + selector: + matchLabels: + app: scylla + template: + metadata: + labels: + app: scylla + spec: + initContainers: + - name: create-scylla-yaml + image: busybox + command: ["/bin/sh", "-c", "touch /scylla-conf/scylla.yaml"] + volumeMounts: + - name: scylla-conf + mountPath: /scylla-conf + containers: + - name: scylla + image: scylladb/scylla + command: ["scylla"] + args: + - "--rpc-address" + - "0.0.0.0" + - "--broadcast-rpc-address" + - "127.0.0.1" + - "--smp" + - "1" + - "--developer-mode=1" + livenessProbe: + exec: + command: + - /bin/sh + - -c + - '[ "$(nodetool statusgossip)" = "running" ]' + initialDelaySeconds: 30 + periodSeconds: 30 + timeoutSeconds: 10 + failureThreshold: 5 + volumeMounts: + - name: scylla-conf + mountPath: /conf/scylla.yaml + subPath: scylla.yaml + volumes: + - name: scylla-conf + emptyDir: {} +--- +apiVersion: v1 +kind: Service +metadata: + name: scylla +spec: + selector: + app: scylla + ports: + - name: cql + port: 9042 + targetPort: 9042 + type: ClusterIP +--- +apiVersion: v1 +kind: Secret +metadata: + name: cassandra-credentials +stringData: + NEXUS__SCYLLA_CQL_STORE__HOSTS: "scylla.default.svc.cluster.local" + NEXUS__SCYLLA_CQL_STORE__USER: "cassandra" + NEXUS__SCYLLA_CQL_STORE__PASSWORD: "cassandra" +--- +apiVersion: v1 +kind: Service +metadata: + name: scylla-node-port +spec: + selector: + app: scylla + ports: + - port: 9042 + targetPort: 9042 + nodePort: 30042 + type: NodePort diff --git a/integration_tests/storage/checkpoints.cql b/integration_tests/storage/checkpoints.cql new file mode 100644 index 0000000..c807069 --- /dev/null +++ b/integration_tests/storage/checkpoints.cql @@ -0,0 +1,29 @@ +create table nexus.checkpoints +( + algorithm text, + id text, + lifecycle_stage text, + payload_uri text, + result_uri text, + algorithm_failure_cause text, + algorithm_failure_details text, + received_by_host text, + received_at timestamp, + sent_at timestamp, + applied_configuration text, + configuration_overrides text, + content_hash text, + last_modified timestamp, + tag text, + api_version text, + job_uid text, + parent text, + payload_valid_for text, + PRIMARY KEY ((algorithm, id)) +); + +create index submission_tag ON nexus.checkpoints (tag); + +create index host ON nexus.checkpoints (received_by_host); + +create index lifecycle_stage ON nexus.checkpoints (lifecycle_stage); diff --git a/integration_tests/storage/prepare-scylla.sh b/integration_tests/storage/prepare-scylla.sh new file mode 100755 index 0000000..217897a --- /dev/null +++ b/integration_tests/storage/prepare-scylla.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +# Wait for cqlsh to be ready by running 'describe keyspaces', retry max 30 times +echo "Waiting for ScyllaDB to be available via cqlsh..." +max_retries=30 +attempt=1 +until cqlsh localhost -e "DESCRIBE KEYSPACES;" >/dev/null 2>&1; do + if (( attempt >= max_retries )); then + echo "cqlsh did not become available after $max_retries attempts." + exit 1 + fi + sleep 1 + ((attempt++)) +done +echo "cqlsh is available." + +cqlsh localhost -e "CREATE KEYSPACE nexus WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 1 };" + +echo 'Applying checkpoints table' + +cqlsh localhost -f /opt/storage/checkpoints.cql + +echo 'Checking table' + +cqlsh localhost -e 'SELECT * FROM nexus.checkpoints' + +echo 'Applying submission_buffer table' + +cqlsh localhost -f /opt/storage/submission_buffer.cql + +echo 'Checking table' + +cqlsh localhost -e 'SELECT * FROM nexus.submission_buffer' diff --git a/integration_tests/storage/submission_buffer.cql b/integration_tests/storage/submission_buffer.cql new file mode 100644 index 0000000..b1868a5 --- /dev/null +++ b/integration_tests/storage/submission_buffer.cql @@ -0,0 +1,8 @@ +create table nexus.submission_buffer +( + algorithm text, + id text, + cluster text, + template text, + PRIMARY KEY ((algorithm, id)) +); diff --git a/justfile b/justfile new file mode 100644 index 0000000..47376b6 --- /dev/null +++ b/justfile @@ -0,0 +1,98 @@ +default: + @just --list + +fresh: stop up + +up: start-kind-cluster \ + install-ingress-controller \ + create-ingress \ + scylla \ + dbschema \ + shards-kubeconfig \ + crd \ + algorithm \ + scheduler \ + receiver \ + supervisor \ + minio \ + wait-for-services + +stop: + kind delete cluster + +start-kind-cluster: + kind create cluster --config=integration_tests/kind.yaml + +install-ingress-controller: + kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/deploy-ingress-nginx.yaml + kubectl rollout status deployment/ingress-nginx-controller -n ingress-nginx --timeout=180s + +create-ingress: + # Create ingress rules for services + for i in $(seq 1 30); do \ + kubectl apply -f ./integration_tests/manifests/ingress.yaml && break || \ + (echo "Retry $i/30: failed to apply ingress, retrying in 1s..." && sleep 1); \ + done; \ + if [ $i -eq 30 ]; then \ + echo "Failed to apply ingress after 30 attempts."; \ + exit 1; \ + fi + +scylla: + kubectl apply -f integration_tests/manifests/scylladb.yaml + kubectl rollout status deployment/scylla --timeout=180s + +minio: + kubectl apply -f integration_tests/manifests/minio.yaml + kubectl rollout status deployment/minio --timeout=180s + +crd: + helm upgrade --install nexus-crd oci://ghcr.io/sneaksanddata/helm/nexus-crd --version v1.0.0 + +algorithm: + kubectl apply -f integration_tests/manifests/hello-world-algorithm.yaml + kubectl apply -f integration_tests/manifests/hello-world-workgroup.yaml + kubectl apply -f integration_tests/manifests/nexus-algorithm-sa.yaml + +shards-kubeconfig: + kind get kubeconfig \ + | yq -o=json '.clusters[].cluster.server = "https://kubernetes.default.svc.cluster.local"' \ + | kubectl create secret generic nexus-shards --from-file=kind-nexus-shard-0.kubeconfig=/dev/stdin --type=Opaque --dry-run=client -o yaml \ + | kubectl apply -f - + +scheduler: + helm upgrade --install nexus oci://ghcr.io/sneaksanddata/helm/nexus --version v1.1.12 \ + --set scheduler.replicas=1 \ + --set scheduler.config.cqlStore.type=scylla \ + --set scheduler.config.cqlStore.secretRefEnabled=true \ + --set 'extraEnvFrom[0].secretRef.name=cassandra-credentials' \ + --set 'scheduler.config.cqlStore.secretName=cassandra-credentials' \ + --set 'scheduler.config.s3Buffer.s3Credentials.secretRefEnabled=true' \ + --set 'scheduler.config.s3Buffer.s3Credentials.secretName=minio-credentials' \ + --set 'scheduler.config.s3Buffer.processing.payloadStoragePath=s3a://nexus' + + +receiver: + helm upgrade --install nexus-receiver oci://ghcr.io/sneaksanddata/helm/nexus-receiver --version v1.1.4 \ + --set receiver.replicas=1 \ + --set receiver.config.cqlStore.type=scylla \ + --set receiver.config.cqlStore.secretRefEnabled=true \ + --set 'extraEnvFrom[0].secretRef.name=cassandra-credentials' \ + --set receiver.config.cqlStore.secretName="cassandra-credentials" + +supervisor: + helm upgrade --install nexus-supervisor oci://ghcr.io/sneaksanddata/helm/nexus-supervisor --version v0.1.6 \ + --set 'extraEnvFrom[0].secretRef.name=cassandra-credentials' \ + --set 'supervisor.replicas=1' \ + --set 'supervisor.config.cqlStore.type=scylla' \ + --set 'supervisor.config.cqlStore.secretRefEnabled=true' \ + --set 'supervisor.config.cqlStore.secretName=cassandra-credentials' \ + --set 'supervisor.config.resourceNamespace=default' + +wait-for-services: + kubectl rollout status deployment/nexus --timeout=180s + kubectl rollout status deployment/nexus-receiver --timeout=180s + kubectl rollout status deployment/nexus-supervisor --timeout=180s + +dbschema: + docker run --rm -v $(pwd)/integration_tests/storage:/opt/storage --network=host --entrypoint /opt/storage/prepare-scylla.sh scylladb/scylla:5.0.1 \ No newline at end of file diff --git a/src/SnD.ApiClient.Azure/SnD.ApiClient.Azure.csproj b/src/SnD.ApiClient.Azure/SnD.ApiClient.Azure.csproj index 61280d8..e1fc27e 100644 --- a/src/SnD.ApiClient.Azure/SnD.ApiClient.Azure.csproj +++ b/src/SnD.ApiClient.Azure/SnD.ApiClient.Azure.csproj @@ -1,7 +1,7 @@ - net6.0 + net10.0 latest enable latest @@ -18,8 +18,9 @@ - - + + + diff --git a/src/SnD.ApiClient.Nexus.Generated/SnD.ApiClient.Nexus.Generated.csproj b/src/SnD.ApiClient.Nexus.Generated/SnD.ApiClient.Nexus.Generated.csproj index ac63c4a..0361301 100644 --- a/src/SnD.ApiClient.Nexus.Generated/SnD.ApiClient.Nexus.Generated.csproj +++ b/src/SnD.ApiClient.Nexus.Generated/SnD.ApiClient.Nexus.Generated.csproj @@ -1,7 +1,7 @@  - net6.0 + net10.0 enable enable diff --git a/src/SnD.ApiClient/SnD.ApiClient.csproj b/src/SnD.ApiClient/SnD.ApiClient.csproj index 003bb5d..b545354 100644 --- a/src/SnD.ApiClient/SnD.ApiClient.csproj +++ b/src/SnD.ApiClient/SnD.ApiClient.csproj @@ -1,7 +1,7 @@ - net6.0 + net10.0 enable latest SnD.ApiClient @@ -22,14 +22,17 @@ - - - - + + + + - - + + + + + diff --git a/test/SnD.ApiClient.Tests.Acceptance/Config/AcceptanceTestsConfiguration.cs b/test/SnD.ApiClient.Tests.Acceptance/Config/AcceptanceTestsConfiguration.cs index af22089..e630f0d 100644 --- a/test/SnD.ApiClient.Tests.Acceptance/Config/AcceptanceTestsConfiguration.cs +++ b/test/SnD.ApiClient.Tests.Acceptance/Config/AcceptanceTestsConfiguration.cs @@ -18,4 +18,10 @@ public class AcceptanceTestsConfiguration /// Payload serialized to string /// public string AlgorithmPayload { get; set; } + + /// + /// Use BoxerTokenProvider as authentication provider for NexusClient on Azure environment. + /// If false will add EmptyTokenProvider which does not interact with Boxer. + /// + public bool UseBoxerTokenProviderOnAzure { get; set; } } \ No newline at end of file diff --git a/test/SnD.ApiClient.Tests.Acceptance/Nexus/EmptyAuthenticationProvider.cs b/test/SnD.ApiClient.Tests.Acceptance/Nexus/EmptyAuthenticationProvider.cs new file mode 100644 index 0000000..ce21a2f --- /dev/null +++ b/test/SnD.ApiClient.Tests.Acceptance/Nexus/EmptyAuthenticationProvider.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Kiota.Abstractions; +using Microsoft.Kiota.Abstractions.Authentication; + +namespace SnD.ApiClient.Tests.Acceptance.Nexus; + +public class EmptyAuthenticationProvider: IAuthenticationProvider +{ + private const string Token = "mockToken"; + + public Task AuthenticateRequestAsync(RequestInformation request, + Dictionary? additionalAuthenticationContext = null, + CancellationToken cancellationToken = default) + { + request.Headers.Add("Authorization", $"Bearer {Token}"); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/test/SnD.ApiClient.Tests.Acceptance/Nexus/NexusAcceptancetests.cs b/test/SnD.ApiClient.Tests.Acceptance/Nexus/NexusAcceptancetests.cs index 419a7ff..f1653cc 100644 --- a/test/SnD.ApiClient.Tests.Acceptance/Nexus/NexusAcceptancetests.cs +++ b/test/SnD.ApiClient.Tests.Acceptance/Nexus/NexusAcceptancetests.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Kiota.Abstractions.Authentication; using SnD.ApiClient.Azure; using SnD.ApiClient.Config; using SnD.ApiClient.Extensions; @@ -29,17 +30,20 @@ public NexusAcceptanceTests() var configurationRoot = new ConfigurationBuilder().AddJsonFile("appsettings.test.json").Build(); configurationRoot.GetSection(nameof(AcceptanceTestsConfiguration)).Bind(this.configuration); - this.services = new ServiceCollection() + var serviceCollection = new ServiceCollection() .Configure(configurationRoot.GetSection(nameof(BoxerTokenProviderOptions))) .AddSingleton() .AddLogging(conf => conf.AddConsole()) - .AuthorizeWithBoxerOnAzure() - .AddAuthenticationProvider() .Configure(configurationRoot.GetSection(nameof(NexusClientOptions))) .AddNexusRetryPolicy(sp => new RetryAllErrors(sp.GetRequiredService>(), sp.GetRequiredService>())) - .AddNexusClient() - .BuildServiceProvider(); + .AddNexusClient(); + + serviceCollection = configuration.UseBoxerTokenProviderOnAzure + ? serviceCollection.AuthorizeWithBoxerOnAzure().AddAuthenticationProvider() + : serviceCollection.AddSingleton(); + + this.services = serviceCollection.BuildServiceProvider(); } [SkippableFact] diff --git a/test/SnD.ApiClient.Tests.Acceptance/SnD.ApiClient.Tests.Acceptance.csproj b/test/SnD.ApiClient.Tests.Acceptance/SnD.ApiClient.Tests.Acceptance.csproj index 649033c..b1064f4 100644 --- a/test/SnD.ApiClient.Tests.Acceptance/SnD.ApiClient.Tests.Acceptance.csproj +++ b/test/SnD.ApiClient.Tests.Acceptance/SnD.ApiClient.Tests.Acceptance.csproj @@ -1,7 +1,7 @@ - net6.0 + net10.0 false @@ -11,13 +11,13 @@ - - - - - - - + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/SnD.ApiClient.Tests.Acceptance/appsettings.test.json b/test/SnD.ApiClient.Tests.Acceptance/appsettings.test.json index af7acb5..2dea489 100644 --- a/test/SnD.ApiClient.Tests.Acceptance/appsettings.test.json +++ b/test/SnD.ApiClient.Tests.Acceptance/appsettings.test.json @@ -10,16 +10,17 @@ "BaseUri": "", "IdentityProvider": "" }, + "UseBoxerTokenProviderOnAzure": false, "NexusClientOptions": { - "BaseUri": "", + "BaseUri": "http://localhost:5555/scheduler", "MaxRetryAttempts": 3, "RetryIntervalSeconds": 5 }, "AcceptanceTestsConfiguration": { "AlgorithmRequest": {}, - "AlgorithmName": "", + "AlgorithmName": "hello-world", "AlgorithmConfiguration": {}, - "AlgorithmPayload": "" + "AlgorithmPayload": "{\"hello_text\": \"hello\", \"hello_author\": \"world\"}" } } \ No newline at end of file diff --git a/test/SnD.ApiClient.Tests/SnD.ApiClient.Tests.csproj b/test/SnD.ApiClient.Tests/SnD.ApiClient.Tests.csproj index 65445e3..df1350f 100644 --- a/test/SnD.ApiClient.Tests/SnD.ApiClient.Tests.csproj +++ b/test/SnD.ApiClient.Tests/SnD.ApiClient.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net10.0 false @@ -15,9 +15,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + +