diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5961f1d7..070b6fc3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -154,8 +154,8 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max - calculation-build-push: - name: Calculation Build & Push Docker + analysis-build-push: + name: Analysis Build & Push Docker needs: backend-test runs-on: ubuntu-latest permissions: @@ -179,15 +179,15 @@ jobs: id: meta run: echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - - name: Build and push Calculation Docker image + - name: Build and push Analysis Docker image uses: docker/build-push-action@v7 with: context: . - file: ./calculation.Dockerfile + file: ./analysis.Dockerfile push: true tags: | - dxworks/scriptbee/calculation:${{ steps.meta.outputs.version }} - dxworks/scriptbee/calculation:latest + dxworks/scriptbee/analysis:${{ steps.meta.outputs.version }} + dxworks/scriptbee/analysis:latest cache-from: type=gha cache-to: type=gha,mode=max @@ -196,7 +196,7 @@ jobs: # ------------------------------------------------------------------ create-release: name: Create GitHub Release - needs: [ ui-build-push, gateway-build-push, calculation-build-push ] + needs: [ ui-build-push, gateway-build-push, analysis-build-push ] runs-on: ubuntu-latest permissions: contents: write diff --git a/ScriptBeeClient/src/app/components/instance-manager/instance-manager.component.ts b/ScriptBeeClient/src/app/components/instance-manager/instance-manager.component.ts index 21a99626..3fee230d 100644 --- a/ScriptBeeClient/src/app/components/instance-manager/instance-manager.component.ts +++ b/ScriptBeeClient/src/app/components/instance-manager/instance-manager.component.ts @@ -10,7 +10,7 @@ import { rxResource } from '@angular/core/rxjs-interop'; import { of } from 'rxjs'; import { InstanceService } from '../../services/instances/instance.service'; import { ProjectStateService } from '../../services/projects/project-state.service'; -import { CalculationInstanceStatus, InstanceInfo } from '../../types/instance'; +import { InstanceStatus, InstanceInfo } from '../../types/instance'; import { ConfirmationDialogComponent } from '../dialogs/confirmation-dialog/confirmation-dialog.component'; @Component({ @@ -56,7 +56,7 @@ export class InstanceManagerComponent { return this.instances().find((i) => i.id === id); }); - getStatusIcon(status: CalculationInstanceStatus): string { + getStatusIcon(status: InstanceStatus): string { switch (status) { case 'Running': return 'check_circle'; @@ -71,7 +71,7 @@ export class InstanceManagerComponent { } } - getStatusClass(status: CalculationInstanceStatus): string { + getStatusClass(status: InstanceStatus): string { return status.toLowerCase(); } diff --git a/ScriptBeeClient/src/app/types/instance.ts b/ScriptBeeClient/src/app/types/instance.ts index 04bbbccf..5a05aacd 100644 --- a/ScriptBeeClient/src/app/types/instance.ts +++ b/ScriptBeeClient/src/app/types/instance.ts @@ -1,7 +1,7 @@ -export type CalculationInstanceStatus = 'Allocating' | 'Running' | 'Deallocating' | 'NotFound'; +export type InstanceStatus = 'Allocating' | 'Running' | 'Deallocating' | 'NotFound'; export interface InstanceInfo { id: string; creationDate: string; - status: CalculationInstanceStatus; + status: InstanceStatus; } diff --git a/ScriptBeeWebApp/src/Analysis/Application/UseCases.Analysis/CalculationInstanceCommand.cs b/ScriptBeeWebApp/src/Analysis/Application/UseCases.Analysis/CalculationInstanceCommand.cs deleted file mode 100644 index 6056cbad..00000000 --- a/ScriptBeeWebApp/src/Analysis/Application/UseCases.Analysis/CalculationInstanceCommand.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace ScriptBee.UseCases.Analysis; - -public record CalculationInstanceCommand(string ImageName); diff --git a/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Config/UserFolderSettings.cs b/ScriptBeeWebApp/src/Common/Application.Model/Config/UserFolderSettings.cs similarity index 64% rename from ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Config/UserFolderSettings.cs rename to ScriptBeeWebApp/src/Common/Application.Model/Config/UserFolderSettings.cs index 38534126..c53f1fb1 100644 --- a/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Config/UserFolderSettings.cs +++ b/ScriptBeeWebApp/src/Common/Application.Model/Config/UserFolderSettings.cs @@ -1,4 +1,4 @@ -namespace ScriptBee.Artifacts.Config; +namespace ScriptBee.Application.Model.Config; public class UserFolderSettings { diff --git a/ScriptBeeWebApp/src/Common/Model/Instance/CalculationInstanceStatus.cs b/ScriptBeeWebApp/src/Common/Model/Instance/AnalysisInstanceStatus.cs similarity index 74% rename from ScriptBeeWebApp/src/Common/Model/Instance/CalculationInstanceStatus.cs rename to ScriptBeeWebApp/src/Common/Model/Instance/AnalysisInstanceStatus.cs index 5cc62e23..bc6c10ac 100644 --- a/ScriptBeeWebApp/src/Common/Model/Instance/CalculationInstanceStatus.cs +++ b/ScriptBeeWebApp/src/Common/Model/Instance/AnalysisInstanceStatus.cs @@ -1,6 +1,6 @@ namespace ScriptBee.Domain.Model.Instance; -public enum CalculationInstanceStatus +public enum AnalysisInstanceStatus { Allocating, Running, diff --git a/ScriptBeeWebApp/src/Common/Model/Instance/InstanceInfo.cs b/ScriptBeeWebApp/src/Common/Model/Instance/InstanceInfo.cs index 76cd8a82..f73a26f2 100644 --- a/ScriptBeeWebApp/src/Common/Model/Instance/InstanceInfo.cs +++ b/ScriptBeeWebApp/src/Common/Model/Instance/InstanceInfo.cs @@ -7,5 +7,5 @@ public record InstanceInfo( ProjectId ProjectId, string Url, DateTimeOffset CreationDate, - CalculationInstanceStatus Status + AnalysisInstanceStatus Status ); diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Analysis.Instance.Docker.csproj b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Analysis.Instance.Docker.csproj index 02da4c38..734b71df 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Analysis.Instance.Docker.csproj +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Analysis.Instance.Docker.csproj @@ -8,6 +8,7 @@ + diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/CalculationInstanceDockerAdapter.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/AnalysisInstanceDockerAdapter.cs similarity index 65% rename from ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/CalculationInstanceDockerAdapter.cs rename to ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/AnalysisInstanceDockerAdapter.cs index 7965a41b..ce969428 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/CalculationInstanceDockerAdapter.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/AnalysisInstanceDockerAdapter.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using ScriptBee.Analysis.Instance.Docker.Config; +using ScriptBee.Application.Model.Config; using ScriptBee.Domain.Model.Analysis; using ScriptBee.Domain.Model.Instance; using ScriptBee.Domain.Model.Project; @@ -12,10 +13,11 @@ namespace ScriptBee.Analysis.Instance.Docker; -public class CalculationInstanceDockerAdapter( - IOptions config, +public class AnalysisInstanceDockerAdapter( + IOptions config, + IOptions userFolderSettingsOptions, IConfiguration configuration, - ILogger logger, + ILogger logger, IFreePortProvider freePortProvider ) : IAllocateInstance, IDeallocateInstance, IGetInstanceStatus { @@ -26,8 +28,8 @@ public async Task Allocate( CancellationToken cancellationToken = default ) { - var calculationDockerConfig = config.Value; - using var client = CreateDockerClient(calculationDockerConfig); + var analysisDockerConfig = config.Value; + using var client = CreateDockerClient(analysisDockerConfig); await PullImageIfNeeded(client, image.ImageName, cancellationToken); @@ -36,36 +38,32 @@ public async Task Allocate( var portBindings = new Dictionary> { { - $"{calculationDockerConfig.Port}/tcp", + $"{analysisDockerConfig.Port}/tcp", new List { new() { HostPort = hostPort.ToString() } } }, }; var mongoDbConnectionString = - calculationDockerConfig.MongoDbConnectionString + analysisDockerConfig.MongoDbConnectionString ?? configuration.GetConnectionString("mongodb"); var response = await client.Containers.CreateContainerAsync( new CreateContainerParameters { - Name = $"scriptbee-calculation-{instanceId}", + Name = $"scriptbee-analysis-{instanceId}", Image = image.ImageName, HostConfig = new HostConfig { - NetworkMode = calculationDockerConfig.Network, + NetworkMode = analysisDockerConfig.Network, PortBindings = portBindings, + Binds = GetBinds(), }, ExposedPorts = new Dictionary { - { $"{calculationDockerConfig.Port}/tcp", new EmptyStruct() }, - }, - Env = new List - { - $"ScriptBee__InstanceId={instanceId}", - $"ScriptBee__ProjectId={projectDetails.Id}", - $"ScriptBee__ProjectName={projectDetails.Name}", - $"ConnectionStrings__mongodb={mongoDbConnectionString}", + { $"{analysisDockerConfig.Port}/tcp", new EmptyStruct() }, }, + Env = GetEnvironmentVariables(projectDetails, instanceId, mongoDbConnectionString), + Volumes = GetVolumes(), }, cancellationToken ); @@ -82,29 +80,19 @@ await client.Containers.StartContainerAsync( return await GetContainerUrl( client, response.ID, - calculationDockerConfig.Network, + analysisDockerConfig.Network, hostPort, cancellationToken ); } - private static DockerClient CreateDockerClient(CalculationDockerConfig calculationDockerConfig) + public async Task Deallocate(InstanceInfo instanceInfo, CancellationToken cancellationToken) { - return new DockerClientConfiguration( - new Uri(calculationDockerConfig.DockerSocket) - ).CreateClient(); - } - - public async Task Deallocate( - InstanceInfo calculationInstanceInfo, - CancellationToken cancellationToken - ) - { - var containerName = $"scriptbee-calculation-{calculationInstanceInfo.Id}"; + var containerName = $"scriptbee-analysis-{instanceInfo.Id}"; logger.LogInformation("Attempting to deallocate container: {Name}", containerName); - var calculationDockerConfig = config.Value; - using var client = CreateDockerClient(calculationDockerConfig); + var analysisDockerConfig = config.Value; + using var client = CreateDockerClient(analysisDockerConfig); IList containers = await client.Containers.ListContainersAsync( new ContainersListParameters @@ -164,6 +152,107 @@ await client.Containers.RemoveContainerAsync( } } + public async Task GetStatus( + InstanceId instanceId, + CancellationToken cancellationToken + ) + { + var containerName = $"scriptbee-analysis-{instanceId}"; + var analysisDockerConfig = config.Value; + using var client = CreateDockerClient(analysisDockerConfig); + + var containers = await client.Containers.ListContainersAsync( + new ContainersListParameters + { + All = true, + Filters = new Dictionary> + { + { + "name", + new Dictionary { { containerName, true } } + }, + }, + }, + cancellationToken + ); + + var container = containers.FirstOrDefault(); + + if (container == null) + { + return AnalysisInstanceStatus.NotFound; + } + + return container.State.ToLower() switch + { + "running" => AnalysisInstanceStatus.Running, + "created" or "restarting" => AnalysisInstanceStatus.Allocating, + "removing" => AnalysisInstanceStatus.Deallocating, + _ => AnalysisInstanceStatus.NotFound, + }; + } + + private List GetEnvironmentVariables( + ProjectDetails projectDetails, + InstanceId instanceId, + string? mongoDbConnectionString + ) + { + var environmentVariables = new List + { + $"ScriptBee__InstanceId={instanceId}", + $"ScriptBee__ProjectId={projectDetails.Id}", + $"ScriptBee__ProjectName={projectDetails.Name}", + $"ConnectionStrings__mongodb={mongoDbConnectionString}", + }; + + if ( + string.IsNullOrEmpty(userFolderSettingsOptions.Value.UserFolderPath) + && string.IsNullOrEmpty(config.Value.UserFolderHostPath) + ) + { + return environmentVariables; + } + + environmentVariables.Add($"UserFolder__UserFolderPath={config.Value.UserFolderVolumePath}"); + + return environmentVariables; + } + + private List GetBinds() + { + var hostPath = + config.Value.UserFolderHostPath ?? userFolderSettingsOptions.Value.UserFolderPath; + return string.IsNullOrEmpty(hostPath) + ? [] + : [$"{hostPath}:{config.Value.UserFolderVolumePath}"]; + } + + private Dictionary GetVolumes() + { + var hostPath = + config.Value.UserFolderHostPath ?? userFolderSettingsOptions.Value.UserFolderPath; + if ( + string.IsNullOrEmpty(hostPath) + || string.IsNullOrEmpty(config.Value.UserFolderVolumePath) + ) + { + return new Dictionary(); + } + + return new Dictionary + { + { config.Value.UserFolderVolumePath, new EmptyStruct() }, + }; + } + + private static DockerClient CreateDockerClient(AnalysisDockerConfig analysisDockerConfig) + { + return new DockerClientConfiguration( + new Uri(analysisDockerConfig.DockerSocket) + ).CreateClient(); + } + private static async Task GetContainerUrl( DockerClient client, string containerId, @@ -195,7 +284,7 @@ private async Task PullImageIfNeeded( { var parts = imageName.Split(":"); var image = parts[0]; - var tag = parts[1]; + var tag = parts.Length > 1 ? parts[1] : "latest"; var images = await client.Images.ListImagesAsync( new ImagesListParameters @@ -228,44 +317,4 @@ await client.Images.CreateImageAsync( logger.LogInformation("Image {Image}:{Tag} already exists", image, tag); } } - - public async Task GetStatus( - InstanceId instanceId, - CancellationToken cancellationToken - ) - { - var containerName = $"scriptbee-calculation-{instanceId}"; - var calculationDockerConfig = config.Value; - using var client = CreateDockerClient(calculationDockerConfig); - - var containers = await client.Containers.ListContainersAsync( - new ContainersListParameters - { - All = true, - Filters = new Dictionary> - { - { - "name", - new Dictionary { { containerName, true } } - }, - }, - }, - cancellationToken - ); - - var container = containers.FirstOrDefault(); - - if (container == null) - { - return CalculationInstanceStatus.NotFound; - } - - return container.State.ToLower() switch - { - "running" => CalculationInstanceStatus.Running, - "created" or "restarting" => CalculationInstanceStatus.Allocating, - "removing" => CalculationInstanceStatus.Deallocating, - _ => CalculationInstanceStatus.NotFound, - }; - } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Config/CalculationDockerConfig.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Config/AnalysisDockerConfig.cs similarity index 64% rename from ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Config/CalculationDockerConfig.cs rename to ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Config/AnalysisDockerConfig.cs index 8d8fc2a9..093dd12f 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Config/CalculationDockerConfig.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Config/AnalysisDockerConfig.cs @@ -1,6 +1,6 @@ namespace ScriptBee.Analysis.Instance.Docker.Config; -public class CalculationDockerConfig +public class AnalysisDockerConfig { public required string DockerSocket { get; init; } @@ -9,4 +9,8 @@ public class CalculationDockerConfig public string? Network { get; init; } public string? MongoDbConnectionString { get; init; } + + public string? UserFolderVolumePath { get; init; } + + public string? UserFolderHostPath { get; init; } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Extensions/AnalysisDockerInstanceExtensions.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Extensions/AnalysisDockerInstanceExtensions.cs index 88a3543b..0f3e3bb7 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Extensions/AnalysisDockerInstanceExtensions.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Analysis.Instance.Docker/Extensions/AnalysisDockerInstanceExtensions.cs @@ -11,14 +11,12 @@ public static IServiceCollection AddDockerInstanceAdapter( string dockerConfigSection ) { - services - .AddOptions() - .BindConfiguration("ScriptBee:Calculation:Docker"); + services.AddOptions().BindConfiguration("ScriptBee:Analysis:Docker"); return services .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton(); + .AddSingleton() + .AddSingleton() + .AddSingleton(); } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/Entity/MongodbProjectInstance.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/Entity/MongodbProjectInstance.cs index 111bbcc9..f777f874 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/Entity/MongodbProjectInstance.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/Entity/MongodbProjectInstance.cs @@ -13,14 +13,14 @@ public class MongodbProjectInstance : IDocument public required string Url { get; init; } public DateTimeOffset CreationDate { get; init; } - public InstanceInfo ToCalculationInstanceInfo() + public InstanceInfo ToInstanceInfo() { return new InstanceInfo( new InstanceId(Id), Domain.Model.Project.ProjectId.FromValue(ProjectId), Url, CreationDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ); } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/ProjectInstancesPersistenceAdapter.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/ProjectInstancesPersistenceAdapter.cs index 771be61b..870acebe 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/ProjectInstancesPersistenceAdapter.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Persistence.Mongodb.Gateway/ProjectInstancesPersistenceAdapter.cs @@ -34,7 +34,7 @@ CancellationToken cancellationToken cancellationToken ); - return projectInstances.Select(instance => instance.ToCalculationInstanceInfo()); + return projectInstances.Select(instance => instance.ToInstanceInfo()); } public async Task> Get( @@ -49,7 +49,7 @@ CancellationToken cancellationToken return new InstanceDoesNotExistsError(id); } - return instance.ToCalculationInstanceInfo(); + return instance.ToInstanceInfo(); } public async Task Delete(InstanceInfo instanceInfo, CancellationToken cancellationToken) diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Web/Config/ScriptBeeCalculationConfig.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Web/Config/ScriptBeeAnalysisConfig.cs similarity index 65% rename from ScriptBeeWebApp/src/Gateway/Adapters/Web/Config/ScriptBeeCalculationConfig.cs rename to ScriptBeeWebApp/src/Gateway/Adapters/Web/Config/ScriptBeeAnalysisConfig.cs index 9df3087f..475a78de 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Web/Config/ScriptBeeCalculationConfig.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Web/Config/ScriptBeeAnalysisConfig.cs @@ -2,11 +2,11 @@ namespace ScriptBee.Web.Config; -public class ScriptBeeCalculationConfig +public class ScriptBeeAnalysisConfig { public required string Image { get; init; } public required string Driver { get; init; } - public CalculationDockerConfig? Docker { get; init; } + public AnalysisDockerConfig? Docker { get; init; } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Web/EndpointDefinitions/Instances/GetProjectInstancesEndpoint.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Web/EndpointDefinitions/Instances/GetProjectInstancesEndpoint.cs index 88d53027..db670461 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Web/EndpointDefinitions/Instances/GetProjectInstancesEndpoint.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Web/EndpointDefinitions/Instances/GetProjectInstancesEndpoint.cs @@ -27,8 +27,8 @@ private static async Task> GetAllInstance ) { var id = ProjectId.FromValue(projectId); - var calculationInstanceInfos = await useCase.GetAllInstances(id, cancellationToken); + var instanceInfos = await useCase.GetAllInstances(id, cancellationToken); - return TypedResults.Ok(WebGetProjectInstancesListResponse.Map(calculationInstanceInfos)); + return TypedResults.Ok(WebGetProjectInstancesListResponse.Map(instanceInfos)); } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Web/Extensions/ScriptBeeCalculationConfigExtensions.cs b/ScriptBeeWebApp/src/Gateway/Adapters/Web/Extensions/ScriptBeeAnalysisConfigExtensions.cs similarity index 58% rename from ScriptBeeWebApp/src/Gateway/Adapters/Web/Extensions/ScriptBeeCalculationConfigExtensions.cs rename to ScriptBeeWebApp/src/Gateway/Adapters/Web/Extensions/ScriptBeeAnalysisConfigExtensions.cs index 6e993155..07c94b08 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Web/Extensions/ScriptBeeCalculationConfigExtensions.cs +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Web/Extensions/ScriptBeeAnalysisConfigExtensions.cs @@ -7,28 +7,28 @@ namespace ScriptBee.Web.Extensions; -public static class ScriptBeeCalculationConfigExtensions +public static class ScriptBeeAnalysisConfigExtensions { public static IServiceCollection AddAnalysisConfig( this IServiceCollection services, ConfigurationManager configurationManager ) { - var scriptBeeCalculationConfig = configurationManager - .GetSection("ScriptBee:Calculation") - .Get()!; + var scriptBeeAnalysisConfig = configurationManager + .GetSection("ScriptBee:Analysis") + .Get()!; - if (scriptBeeCalculationConfig.Driver != "Docker") + if (scriptBeeAnalysisConfig.Driver != "Docker") { - throw new AnalysisInstanceDriverTypeNotSupported(scriptBeeCalculationConfig.Driver); + throw new AnalysisInstanceDriverTypeNotSupported(scriptBeeAnalysisConfig.Driver); } services.AddSingleton( _ => new InstanceTemplateProvider( - new AnalysisInstanceImage(scriptBeeCalculationConfig.Image) + new AnalysisInstanceImage(scriptBeeAnalysisConfig.Image) ) ); - return services.AddDockerInstanceAdapter("ScriptBee:Calculation:Docker"); + return services.AddDockerInstanceAdapter("ScriptBee:Analysis:Docker"); } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.Development.json b/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.Development.json index d5f223a0..e1447374 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.Development.json +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.Development.json @@ -10,10 +10,11 @@ } }, "ScriptBee": { - "Calculation": { + "Analysis": { "Docker": { "DockerSocket": "npipe://./pipe/docker_engine", - "MongoDbConnectionString": "mongodb://root:example@host.docker.internal:27017/ScriptBee?authSource=admin" + "MongoDbConnectionString": "mongodb://root:example@host.docker.internal:27017/ScriptBee?authSource=admin", + "UserFolderHostPath": "" } } } diff --git a/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.json b/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.json index 2b4e0f13..531fac0d 100644 --- a/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.json +++ b/ScriptBeeWebApp/src/Gateway/Adapters/Web/appsettings.json @@ -30,11 +30,12 @@ "UserFolder": { }, "ScriptBee": { - "Calculation": { - "Image": "dxworks/scriptbee/calculation:latest", + "Analysis": { + "Image": "dxworks/scriptbee/analysis:latest", "Driver": "Docker", "Docker": { - "DockerSocket": "unix:///var/run/docker.sock" + "DockerSocket": "unix:///var/run/docker.sock", + "UserFolderVolumePath": "/root/.scriptbee" } } }, diff --git a/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IDeallocateInstance.cs b/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IDeallocateInstance.cs index 5759a840..cef7673e 100644 --- a/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IDeallocateInstance.cs +++ b/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IDeallocateInstance.cs @@ -4,5 +4,5 @@ namespace ScriptBee.Ports.Instance.Allocation; public interface IDeallocateInstance { - Task Deallocate(InstanceInfo calculationInstanceInfo, CancellationToken cancellationToken); + Task Deallocate(InstanceInfo instanceInfo, CancellationToken cancellationToken); } diff --git a/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IGetInstanceStatus.cs b/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IGetInstanceStatus.cs index 7ab69586..2b6f4c0e 100644 --- a/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IGetInstanceStatus.cs +++ b/ScriptBeeWebApp/src/Gateway/Application/Ports.Instance.Allocation/IGetInstanceStatus.cs @@ -4,7 +4,7 @@ namespace ScriptBee.Ports.Instance.Allocation; public interface IGetInstanceStatus { - Task GetStatus( + Task GetStatus( InstanceId instanceId, CancellationToken cancellationToken ); diff --git a/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/AllocateProjectInstanceService.cs b/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/AllocateProjectInstanceService.cs index d11a5da9..84ea4008 100644 --- a/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/AllocateProjectInstanceService.cs +++ b/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/AllocateProjectInstanceService.cs @@ -55,7 +55,7 @@ CancellationToken cancellationToken projectDetails.Id, instanceUrl, dateTimeProvider.UtcNow(), - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ); var info = await createProjectInstance.Create(instanceInfo, cancellationToken); diff --git a/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/InstallPluginsForNewlyAllocatedInstance.cs b/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/InstallPluginsForNewlyAllocatedInstance.cs index 346e40b6..f12a560d 100644 --- a/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/InstallPluginsForNewlyAllocatedInstance.cs +++ b/ScriptBeeWebApp/src/Gateway/Application/Service.Project/Analysis/InstallPluginsForNewlyAllocatedInstance.cs @@ -18,15 +18,15 @@ public async Task InstallPlugins( CancellationToken cancellationToken ) { - CalculationInstanceStatus status; + AnalysisInstanceStatus status; do { await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); status = await getInstanceStatus.GetStatus(instanceInfo.Id, cancellationToken); - } while (status == CalculationInstanceStatus.Allocating); + } while (status == AnalysisInstanceStatus.Allocating); - if (status != CalculationInstanceStatus.Running) + if (status != AnalysisInstanceStatus.Running) { logger.LogWarning( "Could not install plugins for instance {Instance} because instance is {Status}", diff --git a/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/ConfigFoldersService.cs b/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/ConfigFoldersService.cs index a726643e..8a842489 100644 --- a/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/ConfigFoldersService.cs +++ b/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/ConfigFoldersService.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.Options; -using ScriptBee.Artifacts.Config; +using ScriptBee.Application.Model.Config; using ScriptBee.Domain.Model.Config; using ScriptBee.Domain.Model.Project; diff --git a/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Extensions/ConfigureProjectScriptingExtensions.cs b/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Extensions/ConfigureProjectScriptingExtensions.cs index 43d172a1..2758322e 100644 --- a/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Extensions/ConfigureProjectScriptingExtensions.cs +++ b/ScriptBeeWebApp/src/Workspace/Artifacts/Artifacts/Extensions/ConfigureProjectScriptingExtensions.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using ScriptBee.Artifacts.Config; +using ScriptBee.Application.Model.Config; namespace ScriptBee.Artifacts.Extensions; diff --git a/ScriptBeeWebApp/test/Common/Tests.Common/InstanceInfoFixture.cs b/ScriptBeeWebApp/test/Common/Tests.Common/InstanceInfoFixture.cs index 839b14c4..176a94f9 100644 --- a/ScriptBeeWebApp/test/Common/Tests.Common/InstanceInfoFixture.cs +++ b/ScriptBeeWebApp/test/Common/Tests.Common/InstanceInfoFixture.cs @@ -11,6 +11,6 @@ public static InstanceInfo BasicInstanceInfo(ProjectId projectId) => projectId, "http://instance", DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ); } diff --git a/ScriptBeeWebApp/test/Common/Tests.Common/TestWebApplicationFactory.cs b/ScriptBeeWebApp/test/Common/Tests.Common/TestWebApplicationFactory.cs index 23d78dfa..ccc53e9a 100644 --- a/ScriptBeeWebApp/test/Common/Tests.Common/TestWebApplicationFactory.cs +++ b/ScriptBeeWebApp/test/Common/Tests.Common/TestWebApplicationFactory.cs @@ -43,9 +43,9 @@ private static void ConfigureConfigurations(IWebHostBuilder builder) { var configurationValues = new Dictionary { - { "ScriptBee:Calculation:Driver", "Docker" }, - { "ScriptBee:Calculation:Image", "test-image" }, - { "ScriptBee:Calculation:Docker:DockerSocket", "unix:///var/run/docker.sock" }, + { "ScriptBee:Analysis:Driver", "Docker" }, + { "ScriptBee:Analysis:Image", "test-image" }, + { "ScriptBee:Analysis:Docker:DockerSocket", "unix:///var/run/docker.sock" }, }; var configuration = new ConfigurationBuilder() .AddInMemoryCollection(configurationValues) diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/CalculationInstanceDockerAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/AnalysisInstanceDockerAdapterTest.cs similarity index 60% rename from ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/CalculationInstanceDockerAdapterTest.cs rename to ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/AnalysisInstanceDockerAdapterTest.cs index a932615f..49b85511 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/CalculationInstanceDockerAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/AnalysisInstanceDockerAdapterTest.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Options; using NSubstitute; using ScriptBee.Analysis.Instance.Docker.Config; +using ScriptBee.Application.Model.Config; using ScriptBee.Domain.Model.Analysis; using ScriptBee.Domain.Model.Instance; using ScriptBee.Domain.Model.Project; @@ -11,31 +12,47 @@ namespace ScriptBee.Analysis.Instance.Docker.Tests; -public class CalculationInstanceDockerAdapterTest : IClassFixture +public class AnalysisInstanceDockerAdapterTest : IClassFixture { private readonly IFreePortProvider _freePortProvider = Substitute.For(); private readonly DockerFixture _dockerFixture; private readonly IConfiguration _configuration = Substitute.For(); - private readonly ILogger _logger; - private readonly IOptions _configOptions; + private readonly ILogger _logger; + private readonly IOptions _configOptions; + private readonly IOptions _userFolderOptions; private readonly int _testPort; private const string TestMongoConnectionString = "mongodb://test:27017"; private const string OverrideMongoConnectionString = "mongodb://mongodb-host:27017"; - public CalculationInstanceDockerAdapterTest( + private static readonly string TestUserFolderPath = Path.Combine( + Path.GetTempPath(), + "scriptbee-test-userfolder" + ) + .Replace("\\", "/"); + private static readonly string OverrideHostPath = Path.Combine( + Path.GetTempPath(), + "scriptbee-test-override" + ) + .Replace("\\", "/"); + + public AnalysisInstanceDockerAdapterTest( DockerFixture dockerFixture, ITestOutputHelper outputHelper ) { _dockerFixture = dockerFixture; - var config = new CalculationDockerConfig + var config = new AnalysisDockerConfig { DockerSocket = dockerFixture.DockerClient.Configuration.EndpointBaseUri.ToString(), Network = DockerFixture.TestNetworkName, + UserFolderVolumePath = "/root/.scriptbee", }; _configOptions = Options.Create(config); + _userFolderOptions = Options.Create( + new UserFolderSettings { UserFolderPath = TestUserFolderPath } + ); _testPort = new FreePortProvider().GetFreeTcpPort(); _freePortProvider.GetFreeTcpPort().Returns(_testPort); @@ -47,15 +64,16 @@ ITestOutputHelper outputHelper var loggerFactory = LoggerFactory.Create(builder => builder.AddProvider(new XUnitLoggerProvider(outputHelper)) ); - _logger = loggerFactory.CreateLogger(); + _logger = loggerFactory.CreateLogger(); } [Fact] public async Task Allocate_ShouldCreateAndStartContainerAndReturnUrlWithNetworkIP() { // Arrange - var adapter = new CalculationInstanceDockerAdapter( + var adapter = new AnalysisInstanceDockerAdapter( _configOptions, + _userFolderOptions, _configuration, _logger, _freePortProvider @@ -80,7 +98,7 @@ public async Task Allocate_ShouldCreateAndStartContainerAndReturnUrlWithNetworkI TestContext.Current.CancellationToken ); var ourContainer = containers.FirstOrDefault(c => - c.Names.Contains($"/scriptbee-calculation-{instanceId}") + c.Names.Contains($"/scriptbee-analysis-{instanceId}") ); ourContainer.ShouldNotBeNull(); ourContainer.State.ShouldBe("running"); @@ -97,8 +115,9 @@ public async Task Allocate_ShouldCreateAndStartContainerAndReturnUrlWithNetworkI public async Task Allocate_ShouldUseConfiguredNetworkAndContainerName() { // Arrange - var adapter = new CalculationInstanceDockerAdapter( + var adapter = new AnalysisInstanceDockerAdapter( _configOptions, + _userFolderOptions, _configuration, _logger, _freePortProvider @@ -126,7 +145,7 @@ await adapter.Allocate( "name", new Dictionary { - { $"scriptbee-calculation-{instanceId}", true }, + { $"scriptbee-analysis-{instanceId}", true }, } }, }, @@ -134,7 +153,7 @@ await adapter.Allocate( TestContext.Current.CancellationToken ); containers.ShouldHaveSingleItem(); - containers.First().Names.ShouldContain($"/scriptbee-calculation-{instanceId}"); + containers.First().Names.ShouldContain($"/scriptbee-analysis-{instanceId}"); containers.First().NetworkSettings.Networks.ShouldContainKey(DockerFixture.TestNetworkName); } @@ -142,8 +161,9 @@ await adapter.Allocate( public async Task Allocate_ShouldPassEnvironmentVariables() { // Arrange - var adapter = new CalculationInstanceDockerAdapter( + var adapter = new AnalysisInstanceDockerAdapter( _configOptions, + _userFolderOptions, _configuration, _logger, _freePortProvider @@ -167,7 +187,7 @@ await adapter.Allocate( // Assert var containerInspect = await _dockerFixture.DockerClient.Containers.InspectContainerAsync( - $"scriptbee-calculation-{instanceId}", + $"scriptbee-analysis-{instanceId}", TestContext.Current.CancellationToken ); @@ -177,20 +197,132 @@ await adapter.Allocate( containerInspect.Config.Env.ShouldContain( $"ConnectionStrings__mongodb={TestMongoConnectionString}" ); + containerInspect.Config.Env.ShouldContain( + $"UserFolder__UserFolderPath={_configOptions.Value.UserFolderVolumePath}" + ); + } + + [Fact] + public async Task Allocate_ShouldMountVolumes_WhenUserFolderIsConfigured() + { + // Arrange + var adapter = new AnalysisInstanceDockerAdapter( + _configOptions, + _userFolderOptions, + _configuration, + _logger, + _freePortProvider + ); + var projectDetails = ProjectDetailsFixture.BasicProjectDetails(ProjectId.FromValue("id")); + var instanceId = new InstanceId(Guid.NewGuid()); + var image = new AnalysisInstanceImage(DockerFixture.TestImageName); + + // Act + await adapter.Allocate( + projectDetails, + instanceId, + image, + TestContext.Current.CancellationToken + ); + + // Assert + var containerInspect = await _dockerFixture.DockerClient.Containers.InspectContainerAsync( + $"scriptbee-analysis-{instanceId}", + TestContext.Current.CancellationToken + ); + + containerInspect.HostConfig.Binds.ShouldContain( + $"{TestUserFolderPath}:{_configOptions.Value.UserFolderVolumePath}" + ); + } + + [Fact] + public async Task Allocate_ShouldUseUserFolderHostPath_WhenConfigured() + { + // Arrange + var config = new AnalysisDockerConfig + { + DockerSocket = _dockerFixture.DockerClient.Configuration.EndpointBaseUri.ToString(), + Network = DockerFixture.TestNetworkName, + UserFolderVolumePath = "/root/.scriptbee", + UserFolderHostPath = OverrideHostPath, + }; + var adapter = new AnalysisInstanceDockerAdapter( + Options.Create(config), + _userFolderOptions, + _configuration, + _logger, + _freePortProvider + ); + var projectDetails = ProjectDetailsFixture.BasicProjectDetails(ProjectId.FromValue("id")); + var instanceId = new InstanceId(Guid.NewGuid()); + var image = new AnalysisInstanceImage(DockerFixture.TestImageName); + + // Act + await adapter.Allocate( + projectDetails, + instanceId, + image, + TestContext.Current.CancellationToken + ); + + // Assert + var containerInspect = await _dockerFixture.DockerClient.Containers.InspectContainerAsync( + $"scriptbee-analysis-{instanceId}", + TestContext.Current.CancellationToken + ); + + containerInspect.HostConfig.Binds.ShouldContain( + $"{OverrideHostPath}:{_configOptions.Value.UserFolderVolumePath}" + ); + } + + [Fact] + public async Task Allocate_ShouldNotMountVolumes_WhenNoUserFolderIsConfigured() + { + // Arrange + var adapter = new AnalysisInstanceDockerAdapter( + _configOptions, + Options.Create(new UserFolderSettings { UserFolderPath = null }), + _configuration, + _logger, + _freePortProvider + ); + var projectDetails = ProjectDetailsFixture.BasicProjectDetails(ProjectId.FromValue("id")); + var instanceId = new InstanceId(Guid.NewGuid()); + var image = new AnalysisInstanceImage(DockerFixture.TestImageName); + + // Act + await adapter.Allocate( + projectDetails, + instanceId, + image, + TestContext.Current.CancellationToken + ); + + // Assert + var containerInspect = await _dockerFixture.DockerClient.Containers.InspectContainerAsync( + $"scriptbee-analysis-{instanceId}", + TestContext.Current.CancellationToken + ); + + containerInspect.HostConfig.Binds.ShouldBeEmpty(); } [Fact] public async Task Allocate_ShouldUseOverrideMongoDbConnectionString_WhenConfigured() { // Arrange - var config = new CalculationDockerConfig + var config = new AnalysisDockerConfig { DockerSocket = _dockerFixture.DockerClient.Configuration.EndpointBaseUri.ToString(), Network = DockerFixture.TestNetworkName, + UserFolderVolumePath = "/root/.scriptbee", MongoDbConnectionString = OverrideMongoConnectionString, }; - var adapter = new CalculationInstanceDockerAdapter( + var adapter = new AnalysisInstanceDockerAdapter( Options.Create(config), + _userFolderOptions, _configuration, _logger, _freePortProvider @@ -209,7 +341,7 @@ await adapter.Allocate( // Assert var containerInspect = await _dockerFixture.DockerClient.Containers.InspectContainerAsync( - $"scriptbee-calculation-{instanceId}", + $"scriptbee-analysis-{instanceId}", TestContext.Current.CancellationToken ); @@ -222,8 +354,9 @@ await adapter.Allocate( public async Task Deallocate_ShouldStopAndRemoveExistingContainer() { // Arrange - var adapter = new CalculationInstanceDockerAdapter( + var adapter = new AnalysisInstanceDockerAdapter( _configOptions, + _userFolderOptions, _configuration, _logger, _freePortProvider @@ -231,7 +364,7 @@ public async Task Deallocate_ShouldStopAndRemoveExistingContainer() var projectDetails = ProjectDetailsFixture.BasicProjectDetails(ProjectId.FromValue("id")); var instanceId = new InstanceId(Guid.NewGuid()); var instanceImage = new AnalysisInstanceImage(DockerFixture.TestImageName); - var containerName = $"scriptbee-calculation-{instanceId}"; + var containerName = $"scriptbee-analysis-{instanceId}"; var instanceUrl = await adapter.Allocate( projectDetails, @@ -245,7 +378,7 @@ public async Task Deallocate_ShouldStopAndRemoveExistingContainer() ProjectId.FromValue("project-id"), instanceUrl, DateTimeOffset.UtcNow, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ); // Act @@ -272,8 +405,9 @@ public async Task Deallocate_ShouldStopAndRemoveExistingContainer() [Fact] public async Task Deallocate_ShouldNotThrowException_IfContainerNotFound() { - var adapter = new CalculationInstanceDockerAdapter( + var adapter = new AnalysisInstanceDockerAdapter( _configOptions, + _userFolderOptions, _configuration, _logger, _freePortProvider @@ -284,7 +418,7 @@ public async Task Deallocate_ShouldNotThrowException_IfContainerNotFound() ProjectId.FromValue("project-id"), "http://fakeurl", DateTimeOffset.UtcNow, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ); var exception = await Record.ExceptionAsync(() => diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/DockerFixture.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/DockerFixture.cs index a5e50100..3197319a 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/DockerFixture.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Analysis.Instance.Docker.Tests/DockerFixture.cs @@ -28,7 +28,7 @@ public async ValueTask DisposeAsync() { { "name", - new Dictionary { { "scriptbee-calculation", true } } + new Dictionary { { "scriptbee-analysis", true } } }, }, } diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Persistence.Mongodb.Gateway.Tests/ProjectInstancesPersistenceAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Persistence.Mongodb.Gateway.Tests/ProjectInstancesPersistenceAdapterTest.cs index ccbaa62c..97d59fd5 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Persistence.Mongodb.Gateway.Tests/ProjectInstancesPersistenceAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Persistence.Mongodb.Gateway.Tests/ProjectInstancesPersistenceAdapterTest.cs @@ -89,14 +89,14 @@ await _mongoCollection.InsertOneAsync( ProjectId.FromValue("all-project-id-1"), "http://test:80", creationDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), new( new InstanceId("47e981a7-9cd6-46d6-ba11-7f3c65ce38a2"), ProjectId.FromValue("all-project-id-1"), "http://test:80", creationDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), } ); @@ -128,7 +128,7 @@ await _mongoCollection.InsertOneAsync( ProjectId.FromValue("project-id"), "http://test:80", creationDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ) ); } @@ -158,7 +158,7 @@ public async Task GivenNoInstanceInfo_ShouldDeleteSuccessful() ProjectId.FromValue("project-id"), "http://test:80", creationDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ) @@ -188,7 +188,7 @@ await _adapter.Delete( ProjectId.FromValue("project-id"), "http://test:80", creationDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/ClearInstanceContextAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/ClearInstanceContextAdapterTest.cs index 2a082dfd..74e1df25 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/ClearInstanceContextAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/ClearInstanceContextAdapterTest.cs @@ -32,7 +32,7 @@ await _clearInstanceContextAdapter.Clear( ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetInstanceContextAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetInstanceContextAdapterTest.cs index 4b30dbe1..c2322747 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetInstanceContextAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetInstanceContextAdapterTest.cs @@ -48,7 +48,7 @@ public async Task GetContextSlices() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetPluginsAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetPluginsAdapterTest.cs index ee65a2b4..0b89fdaa 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetPluginsAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/GetPluginsAdapterTest.cs @@ -38,7 +38,7 @@ public async Task ShouldReturnLoaderPlugin() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); @@ -72,7 +72,7 @@ public async Task ShouldReturnLinkerPlugin() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); @@ -106,7 +106,7 @@ public async Task ShouldReturnHelperFunctionsPlugin() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); @@ -142,7 +142,7 @@ public async Task ShouldReturnScriptGeneratorPlugin() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); @@ -180,7 +180,7 @@ public async Task ShouldReturnScriptRunnerPlugin() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); @@ -221,7 +221,7 @@ public async Task ShouldReturnUiPlugin() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); @@ -260,7 +260,7 @@ public async Task GivenUnknownKind_ShouldReturnPluginWithoutExtensionPoints() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), TestContext.Current.CancellationToken ); diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/InstallPluginAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/InstallPluginAdapterTest.cs index 9b4f6e4e..5e8affad 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/InstallPluginAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/InstallPluginAdapterTest.cs @@ -44,7 +44,7 @@ await _installPluginAdapter.Install( ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), "plugin-id", "1.2.3", diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LinkInstanceContextAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LinkInstanceContextAdapterTest.cs index 117602c9..58e1ac72 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LinkInstanceContextAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LinkInstanceContextAdapterTest.cs @@ -32,7 +32,7 @@ await _linkInstanceContextAdapter.Link( ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), ["linker-id"], TestContext.Current.CancellationToken diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LoadInstanceContextAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LoadInstanceContextAdapterTest.cs index 8055ee00..e2f2577d 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LoadInstanceContextAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/LoadInstanceContextAdapterTest.cs @@ -33,7 +33,7 @@ await _loadInstanceContextAdapter.Load( ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), new Dictionary> { diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/TriggerInstanceAnalysisAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/TriggerInstanceAnalysisAdapterTest.cs index c43fa36f..82a02af9 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/TriggerInstanceAnalysisAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/TriggerInstanceAnalysisAdapterTest.cs @@ -49,7 +49,7 @@ public async Task TriggerAnalysis() ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), new ScriptId("403e05ae-f16b-4fd7-8d23-375b1d2accb4"), TestContext.Current.CancellationToken diff --git a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/UninstallPluginAdapterTest.cs b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/UninstallPluginAdapterTest.cs index 0d45b585..45691150 100644 --- a/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/UninstallPluginAdapterTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Adapters/Rest.Tests/UninstallPluginAdapterTest.cs @@ -38,7 +38,7 @@ await _uninstallPluginAdapter.Uninstall( ProjectId.FromValue("id"), _server.Urls[0], DateTimeOffset.Now, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ), "plugin-id", "1.2.3", diff --git a/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/AllocateProjectInstanceServiceTest.cs b/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/AllocateProjectInstanceServiceTest.cs index e1ef160f..2d597fd9 100644 --- a/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/AllocateProjectInstanceServiceTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/AllocateProjectInstanceServiceTest.cs @@ -80,7 +80,7 @@ public async Task GivenProject_ExpectInstanceToBeCreatedAndAllocated() projectId, "http://instance-url", createdDate, - CalculationInstanceStatus.NotFound + AnalysisInstanceStatus.NotFound ); var analysisInstanceImage = new AnalysisInstanceImage("scriptbee/analysis:latest"); _getProject diff --git a/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/GetProjectInstancesServiceTest.cs b/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/GetProjectInstancesServiceTest.cs index 22ced376..b630d933 100644 --- a/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/GetProjectInstancesServiceTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/GetProjectInstancesServiceTest.cs @@ -34,15 +34,15 @@ public async Task GetAllProjectInstances() projectId, "http://url:8080", DateTimeOffset.UtcNow, - CalculationInstanceStatus.Allocating + AnalysisInstanceStatus.Allocating ); - IEnumerable expectedCalculationInstanceInfos = [instanceInfo]; + IEnumerable expectedInstanceInfos = [instanceInfo]; _getAllProjectInstances .GetAll(projectId, Arg.Any()) - .Returns(Task.FromResult(expectedCalculationInstanceInfos)); + .Returns(Task.FromResult(expectedInstanceInfos)); _getInstanceStatus .GetStatus(instanceId, Arg.Any()) - .Returns(CalculationInstanceStatus.Allocating); + .Returns(AnalysisInstanceStatus.Allocating); var instanceInfos = await _getProjectInstancesService.GetAllInstances( projectId, diff --git a/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/InstallPluginsForNewlyAllocatedInstanceTest.cs b/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/InstallPluginsForNewlyAllocatedInstanceTest.cs index ac77b0d3..e157c43a 100644 --- a/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/InstallPluginsForNewlyAllocatedInstanceTest.cs +++ b/ScriptBeeWebApp/test/Gateway/Application/Service.Project.Tests/Analysis/InstallPluginsForNewlyAllocatedInstanceTest.cs @@ -42,7 +42,7 @@ public async Task GivenInstanceRunning_ShouldInstallProjectPlugins() _getInstanceStatus .GetStatus(instanceInfo.Id, Arg.Any()) - .Returns(CalculationInstanceStatus.Allocating, CalculationInstanceStatus.Running); + .Returns(AnalysisInstanceStatus.Allocating, AnalysisInstanceStatus.Running); // Act await _installPluginsForNewlyAllocatedInstance.InstallPlugins( @@ -70,7 +70,7 @@ public async Task GivenInstanceNotFound_ShouldNotInstallAnything() _getInstanceStatus .GetStatus(instanceInfo.Id, Arg.Any()) - .Returns(CalculationInstanceStatus.Allocating, CalculationInstanceStatus.NotFound); + .Returns(AnalysisInstanceStatus.Allocating, AnalysisInstanceStatus.NotFound); // Act await _installPluginsForNewlyAllocatedInstance.InstallPlugins( diff --git a/ScriptBeeWebApp/test/Workspace/Artifacts/Artifacts.Tests/ConfigFoldersServiceTest.cs b/ScriptBeeWebApp/test/Workspace/Artifacts/Artifacts.Tests/ConfigFoldersServiceTest.cs index 39cff671..9de6129b 100644 --- a/ScriptBeeWebApp/test/Workspace/Artifacts/Artifacts.Tests/ConfigFoldersServiceTest.cs +++ b/ScriptBeeWebApp/test/Workspace/Artifacts/Artifacts.Tests/ConfigFoldersServiceTest.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.Options; -using ScriptBee.Artifacts.Config; +using ScriptBee.Application.Model.Config; using ScriptBee.Domain.Model.Project; namespace ScriptBee.Artifacts.Tests; diff --git a/calculation.Dockerfile b/analysis.Dockerfile similarity index 100% rename from calculation.Dockerfile rename to analysis.Dockerfile