diff --git a/Shared.IntegrationTesting/DockerHelper.cs b/Shared.IntegrationTesting/DockerHelper.cs index bf9b5acb..b952ea27 100644 --- a/Shared.IntegrationTesting/DockerHelper.cs +++ b/Shared.IntegrationTesting/DockerHelper.cs @@ -21,7 +21,7 @@ public abstract class DockerHelper #region Methods /// - /// Setups the voucher management acl container. + /// Setups the estate management container. /// /// Name of the container. /// The logger. @@ -30,59 +30,234 @@ public abstract class DockerHelper /// The host folder. /// The docker credentials. /// Name of the security service container. - /// Name of the voucher management container. + /// The event store connection string. + /// The SQL server details. /// The client details. /// if set to true [force latest image]. /// The security service port. /// The additional environment variables. /// - public static IContainerService SetupVoucherManagementACLContainer(String containerName, ILogger logger, String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - String securityServiceContainerName, - String voucherManagementContainerName, - (string clientId, string clientSecret) clientDetails, - Boolean forceLatestImage = false, - Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, - List additionalEnvironmentVariables = null) + public static IContainerService SetupEstateManagementContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + String securityServiceContainerName, + String eventStoreConnectionString, + (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) + sqlServerDetails, + (String clientId, String clientSecret) clientDetails, + Boolean forceLatestImage = false, + Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, + List additionalEnvironmentVariables = null) { - logger.LogInformation("About to Start Voucher Management ACL Container"); + logger.LogInformation("About to Start Estate Management Container"); List environmentVariables = new List(); + environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreConnectionString}"); environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"AppSettings:VoucherManagementApi=http://{voucherManagementContainerName}:{DockerHelper.VoucherManagementDockerPort}"); environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"urls=http://*:{DockerHelper.VoucherManagementACLDockerPort}"); - environmentVariables.Add($"AppSettings:ClientId={clientDetails.clientId}"); - environmentVariables.Add($"AppSettings:ClientSecret={clientDetails.clientSecret}"); + environmentVariables.Add($"urls=http://*:{DockerHelper.EstateManagementDockerPort}"); + environmentVariables + .Add($"ConnectionStrings:EstateReportingReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=EstateReportingReadModel\""); if (additionalEnvironmentVariables != null) { environmentVariables.AddRange(additionalEnvironmentVariables); } - ContainerBuilder voucherManagementAclContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.VoucherManagementACLDockerPort) - .UseNetwork(networkServices.ToArray()); - if (String.IsNullOrEmpty(hostFolder) == false) + ContainerBuilder estateManagementContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.EstateManagementDockerPort) + .UseNetwork(networkServices.ToArray()); + if (string.IsNullOrEmpty(hostFolder) == false) { - voucherManagementAclContainer = voucherManagementAclContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); + estateManagementContainer = estateManagementContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); } if (dockerCredentials.HasValue) { - voucherManagementAclContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + estateManagementContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); } // Now build and return the container - IContainerService builtContainer = voucherManagementAclContainer.Build().Start().WaitForPort($"{DockerHelper.VoucherManagementACLDockerPort}/tcp", 30000); + IContainerService builtContainer = estateManagementContainer.Build().Start().WaitForPort($"{DockerHelper.EstateManagementDockerPort}/tcp", 30000); - logger.LogInformation("Voucher Management ACL Container Started"); + logger.LogInformation("Estate Management Container Started"); + + return builtContainer; + } + + /// + /// Setups the estate reporting container. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network services. + /// The host folder. + /// The docker credentials. + /// Name of the security service container. + /// The event store connection string. + /// The SQL server details. + /// The client details. + /// if set to true [force latest image]. + /// The security service port. + /// The additional environment variables. + /// + public static IContainerService SetupEstateReportingContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + String securityServiceContainerName, + String eventStoreConnectionString, + (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) + sqlServerDetails, + (String clientId, String clientSecret) clientDetails, + Boolean forceLatestImage = false, + Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, + List additionalEnvironmentVariables = null) + { + logger.LogInformation("About to Start Estate Reporting Container"); + + List environmentVariables = new List(); + environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreConnectionString}"); + environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"urls=http://*:{DockerHelper.EstateReportingDockerPort}"); + environmentVariables + .Add($"ConnectionStrings:EstateReportingReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=EstateReportingReadModel\""); + + if (additionalEnvironmentVariables != null) + { + environmentVariables.AddRange(additionalEnvironmentVariables); + } + + ContainerBuilder estateReportingContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.EstateReportingDockerPort) + .UseNetwork(networkServices.ToArray()); + + if (string.IsNullOrEmpty(hostFolder) == false) + { + estateReportingContainer = estateReportingContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); + } + + if (dockerCredentials.HasValue) + { + estateReportingContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + } + + // Now build and return the container + IContainerService builtContainer = estateReportingContainer.Build().Start().WaitForPort($"{DockerHelper.EstateReportingDockerPort}/tcp", 30000); + + logger.LogInformation("Estate Reporting Container Started"); + + return builtContainer; + } + + /// + /// Setups the event store container. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network service. + /// The host folder. + /// if set to true [force latest image]. + /// + public static IContainerService SetupEventStoreContainer(String containerName, + ILogger logger, + String imageName, + INetworkService networkService, + String hostFolder, + Boolean forceLatestImage = false) + { + logger.LogInformation("About to Start Event Store Container"); + + List environmentVariables = new List(); + environmentVariables.Add("EVENTSTORE_RUN_PROJECTIONS=all"); + environmentVariables.Add("EVENTSTORE_START_STANDARD_PROJECTIONS=true"); + environmentVariables.Add("EVENTSTORE_INSECURE=true"); + environmentVariables.Add("EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP=true"); + environmentVariables.Add("EVENTSTORE_ENABLE_EXTERNAL_TCP=true"); + + var eventStoreContainerBuilder = new Builder().UseContainer().UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.EventStoreHttpDockerPort) + .ExposePort(DockerHelper.EventStoreTcpDockerPort).WithName(containerName) + .WithEnvironment(environmentVariables.ToArray()).UseNetwork(networkService); + + if (string.IsNullOrEmpty(hostFolder) == false) + { + eventStoreContainerBuilder = eventStoreContainerBuilder.Mount(hostFolder, "/var/log/eventstore", MountType.ReadWrite); + } + + IContainerService eventStoreContainer = eventStoreContainerBuilder.Build().Start().WaitForPort("2113/tcp", 30000); + + logger.LogInformation("Event Store Container Started"); + + return eventStoreContainer; + } + + /// + /// Setups the messaging service container. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network services. + /// The host folder. + /// The docker credentials. + /// Name of the security service container. + /// The event store connection string. + /// The client details. + /// if set to true [force latest image]. + /// The security service port. + /// + public static IContainerService SetupMessagingServiceContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + String securityServiceContainerName, + String eventStoreConnectionString, + (String clientId, String clientSecret) clientDetails, + Boolean forceLatestImage = false, + Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort) + { + logger.LogInformation("About to Start Messaging Service Container"); + + List environmentVariables = new List(); + environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreConnectionString}"); + environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"urls=http://*:{DockerHelper.MessagingServiceDockerPort}"); + environmentVariables.Add("AppSettings:EmailProxy=Integration"); + environmentVariables.Add("AppSettings:SMSProxy=Integration"); + + ContainerBuilder messagingServiceContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.MessagingServiceDockerPort) + .UseNetwork(networkServices.ToArray()); //.Mount(hostFolder, "/home", MountType.ReadWrite); + + if (string.IsNullOrEmpty(hostFolder) == false) + { + messagingServiceContainer = messagingServiceContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); + } + + if (dockerCredentials.HasValue) + { + messagingServiceContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + } + + // Now build and return the container + IContainerService builtContainer = messagingServiceContainer.Build().Start().WaitForPort($"{DockerHelper.MessagingServiceDockerPort}/tcp", 30000); + + logger.LogInformation("Messaging Service Container Started"); return builtContainer; } - + /// /// Setups the security service container. /// @@ -124,7 +299,7 @@ public static IContainerService SetupSecurityServiceContainer(String containerNa networkService }.ToArray()); - if (String.IsNullOrEmpty(hostFolder) == false) + if (string.IsNullOrEmpty(hostFolder) == false) { securityServiceContainer = securityServiceContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); } @@ -142,7 +317,52 @@ public static IContainerService SetupSecurityServiceContainer(String containerNa return builtContainer; } - + + /// + /// Setups the test host container. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network services. + /// The host folder. + /// The docker credentials. + /// The SQL server details. + /// if set to true [force latest image]. + /// + public static IContainerService SetupTestHostContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) sqlServerDetails, + Boolean forceLatestImage = false) + { + logger.LogInformation("About to Start Test Hosts Container"); + + List environmentVariables = new List(); + environmentVariables + .Add($"ConnectionStrings:TestBankReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=TestBankReadModel\""); + environmentVariables.Add("ASPNETCORE_ENVIRONMENT=IntegrationTest"); + + ContainerBuilder testHostContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.TestHostPort) + .UseNetwork(networkServices.ToArray()).Mount(hostFolder, "/home", MountType.ReadWrite); + + if (dockerCredentials.HasValue) + { + testHostContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + } + + // Now build and return the container + IContainerService builtContainer = testHostContainer.Build().Start().WaitForPort($"{DockerHelper.TestHostPort}/tcp", 30000); + + logger.LogInformation("Test Hosts Container Started"); + + return builtContainer; + } + /// /// Setups the test network. /// @@ -217,7 +437,7 @@ public static IContainerService SetupTransactionProcessorACLContainer(String con networkService }.ToArray()); - if (String.IsNullOrEmpty(hostFolder) == false) + if (string.IsNullOrEmpty(hostFolder) == false) { transactionProcessorACLContainer = transactionProcessorACLContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); } @@ -235,27 +455,243 @@ public static IContainerService SetupTransactionProcessorACLContainer(String con return builtContainer; } - - /// - /// Starts the containers for scenario run. - /// - /// Name of the scenario. - /// - public abstract Task StartContainersForScenarioRun(String scenarioName); /// - /// Starts the SQL container with open connection. + /// Setups the transaction processor container. /// /// Name of the container. /// The logger. /// Name of the image. - /// The network service. + /// The network services. /// The host folder. /// The docker credentials. - /// Name of the SQL user. - /// The SQL password. - /// - public static IContainerService StartSqlContainerWithOpenConnection(String containerName, + /// Name of the security service container. + /// Name of the estate management container. + /// The event store connection string. + /// The client details. + /// Name of the testhost container. + /// Name of the voucher management container. + /// if set to true [force latest image]. + /// The security service port. + /// The additional environment variables. + /// + public static IContainerService SetupTransactionProcessorContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + String securityServiceContainerName, + String estateManagementContainerName, + String eventStoreConnectionString, + (String clientId, String clientSecret) clientDetails, + String testhostContainerName, + String voucherManagementContainerName, + Boolean forceLatestImage = false, + Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, + List additionalEnvironmentVariables = null) + { + logger.LogInformation("About to Start Transaction Processor Container"); + + List environmentVariables = new List(); + environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreConnectionString}"); + environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"AppSettings:EstateManagementApi=http://{estateManagementContainerName}:{DockerHelper.EstateManagementDockerPort}"); + environmentVariables.Add($"AppSettings:VoucherManagementApi=http://{voucherManagementContainerName}:{DockerHelper.VoucherManagementDockerPort}"); + environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"urls=http://*:{DockerHelper.TransactionProcessorDockerPort}"); + environmentVariables.Add($"AppSettings:ClientId={clientDetails.clientId}"); + environmentVariables.Add($"AppSettings:ClientSecret={clientDetails.clientSecret}"); + environmentVariables.Add("AppSettings:SubscriptionFilter=TransactionProcessor"); + + environmentVariables.Add($"OperatorConfiguration:Safaricom:Url=http://{testhostContainerName}:9000/api/safaricom"); + + if (additionalEnvironmentVariables != null) + { + environmentVariables.AddRange(additionalEnvironmentVariables); + } + + ContainerBuilder transactionProcessorContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.TransactionProcessorDockerPort) + .UseNetwork(networkServices.ToArray()); + + if (string.IsNullOrEmpty(hostFolder) == false) + { + transactionProcessorContainer = transactionProcessorContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); + } + + if (dockerCredentials.HasValue) + { + transactionProcessorContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + } + + // Now build and return the container + IContainerService builtContainer = transactionProcessorContainer.Build().Start().WaitForPort($"{DockerHelper.TransactionProcessorDockerPort}/tcp", 30000); + + logger.LogInformation("Transaction Processor Container Started"); + + return builtContainer; + } + + /// + /// Setups the voucher management acl container. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network services. + /// The host folder. + /// The docker credentials. + /// Name of the security service container. + /// Name of the voucher management container. + /// The client details. + /// if set to true [force latest image]. + /// The security service port. + /// The additional environment variables. + /// + public static IContainerService SetupVoucherManagementACLContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + String securityServiceContainerName, + String voucherManagementContainerName, + (String clientId, String clientSecret) clientDetails, + Boolean forceLatestImage = false, + Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, + List additionalEnvironmentVariables = null) + { + logger.LogInformation("About to Start Voucher Management ACL Container"); + + List environmentVariables = new List(); + environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"AppSettings:VoucherManagementApi=http://{voucherManagementContainerName}:{DockerHelper.VoucherManagementDockerPort}"); + environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"urls=http://*:{DockerHelper.VoucherManagementACLDockerPort}"); + environmentVariables.Add($"AppSettings:ClientId={clientDetails.clientId}"); + environmentVariables.Add($"AppSettings:ClientSecret={clientDetails.clientSecret}"); + + if (additionalEnvironmentVariables != null) + { + environmentVariables.AddRange(additionalEnvironmentVariables); + } + + ContainerBuilder voucherManagementAclContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.VoucherManagementACLDockerPort) + .UseNetwork(networkServices.ToArray()); + if (string.IsNullOrEmpty(hostFolder) == false) + { + voucherManagementAclContainer = voucherManagementAclContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); + } + + if (dockerCredentials.HasValue) + { + voucherManagementAclContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + } + + // Now build and return the container + IContainerService builtContainer = voucherManagementAclContainer.Build().Start().WaitForPort($"{DockerHelper.VoucherManagementACLDockerPort}/tcp", 30000); + + logger.LogInformation("Voucher Management ACL Container Started"); + + return builtContainer; + } + + /// + /// Setups the voucher management container. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network services. + /// The host folder. + /// The docker credentials. + /// Name of the security service container. + /// Name of the estate management container. + /// The event store connection string. + /// The SQL server details. + /// The client details. + /// if set to true [force latest image]. + /// The security service port. + /// The additional environment variables. + /// + public static IContainerService SetupVoucherManagementContainer(String containerName, + ILogger logger, + String imageName, + List networkServices, + String hostFolder, + (String URL, String UserName, String Password)? dockerCredentials, + String securityServiceContainerName, + String estateManagementContainerName, + String eventStoreConnectionString, + (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) + sqlServerDetails, + (String clientId, String clientSecret) clientDetails, + Boolean forceLatestImage = false, + Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, + List additionalEnvironmentVariables = null) + { + logger.LogInformation("About to Start Voucher Management Container"); + + List environmentVariables = new List(); + environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreConnectionString}"); + environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"AppSettings:EstateManagementApi=http://{estateManagementContainerName}:{DockerHelper.EstateManagementDockerPort}"); + environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); + environmentVariables.Add($"urls=http://*:{DockerHelper.VoucherManagementDockerPort}"); + environmentVariables.Add($"AppSettings:ClientId={clientDetails.clientId}"); + environmentVariables.Add($"AppSettings:ClientSecret={clientDetails.clientSecret}"); + environmentVariables + .Add($"ConnectionStrings:EstateReportingReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=EstateReportingReadModel\""); + + if (additionalEnvironmentVariables != null) + { + environmentVariables.AddRange(additionalEnvironmentVariables); + } + + ContainerBuilder voucherManagementContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) + .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.VoucherManagementDockerPort) + .UseNetwork(networkServices.ToArray()); + + if (string.IsNullOrEmpty(hostFolder) == false) + { + voucherManagementContainer = voucherManagementContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); + } + + if (dockerCredentials.HasValue) + { + voucherManagementContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); + } + + // Now build and return the container + IContainerService builtContainer = voucherManagementContainer.Build().Start().WaitForPort($"{DockerHelper.VoucherManagementDockerPort}/tcp", 30000); + + logger.LogInformation("Voucher Management Container Started"); + + return builtContainer; + } + + /// + /// Starts the containers for scenario run. + /// + /// Name of the scenario. + /// + public abstract Task StartContainersForScenarioRun(String scenarioName); + + /// + /// Starts the SQL container with open connection. + /// + /// Name of the container. + /// The logger. + /// Name of the image. + /// The network service. + /// The host folder. + /// The docker credentials. + /// Name of the SQL user. + /// The SQL password. + /// + public static IContainerService StartSqlContainerWithOpenConnection(String containerName, ILogger logger, String imageName, INetworkService networkService, @@ -356,11 +792,21 @@ public static IContainerService StartSqlContainerWithOpenConnection(String conta /// public const Int32 EventStoreTcpDockerPort = 1113; + /// + /// The messaging service docker port + /// + public const Int32 MessagingServiceDockerPort = 5006; + /// /// The security service docker port /// public const Int32 SecurityServiceDockerPort = 5001; + /// + /// The test host port + /// + public const Int32 TestHostPort = 9000; + /// /// The transaction processor acl docker port /// @@ -371,413 +817,16 @@ public static IContainerService StartSqlContainerWithOpenConnection(String conta /// public const Int32 TransactionProcessorDockerPort = 5002; - /// - /// The voucher management docker port - /// - public const Int32 VoucherManagementDockerPort = 5007; /// /// The voucher management acl docker port /// public const Int32 VoucherManagementACLDockerPort = 5008; - public const Int32 TestHostPort = 9000; - - #endregion - - public static IContainerService SetupTestHostContainer(String containerName, ILogger logger, String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) - sqlServerDetails, - Boolean forceLatestImage = false) - { - logger.LogInformation("About to Start Test Hosts Container"); - - List environmentVariables = new List(); - environmentVariables - .Add($"ConnectionStrings:TestBankReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=TestBankReadModel\""); - environmentVariables.Add("ASPNETCORE_ENVIRONMENT=IntegrationTest"); - - ContainerBuilder testHostContainer = new Builder().UseContainer().WithName(containerName) - .WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.TestHostPort) - .UseNetwork(networkServices.ToArray()).Mount(hostFolder, "/home", MountType.ReadWrite); - - if (dockerCredentials.HasValue) - { - testHostContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); - } - - // Now build and return the container - IContainerService builtContainer = testHostContainer.Build().Start().WaitForPort($"{DockerHelper.TestHostPort}/tcp", 30000); - - logger.LogInformation("Test Hosts Container Started"); - - return builtContainer; - } - /// - /// Setups the voucher management container. + /// The voucher management docker port /// - /// Name of the container. - /// The logger. - /// Name of the image. - /// The network services. - /// The host folder. - /// The docker credentials. - /// Name of the security service container. - /// Name of the estate management container. - /// Name of the event store container. - /// The SQL server details. - /// The client details. - /// if set to true [force latest image]. - /// The security service port. - /// The additional environment variables. - /// - public static IContainerService SetupVoucherManagementContainer(String containerName, ILogger logger, String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - String securityServiceContainerName, - String estateManagementContainerName, - String eventStoreAddress, - (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) - sqlServerDetails, - (string clientId, string clientSecret) clientDetails, - Boolean forceLatestImage = false, - Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, - List additionalEnvironmentVariables = null) - { - logger.LogInformation("About to Start Voucher Management Container"); - - List environmentVariables = new List(); - environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreAddress}:{DockerHelper.EventStoreHttpDockerPort}"); - environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"AppSettings:EstateManagementApi=http://{estateManagementContainerName}:{DockerHelper.EstateManagementDockerPort}"); - environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"urls=http://*:{DockerHelper.VoucherManagementDockerPort}"); - environmentVariables.Add($"AppSettings:ClientId={clientDetails.clientId}"); - environmentVariables.Add($"AppSettings:ClientSecret={clientDetails.clientSecret}"); - environmentVariables - .Add($"ConnectionStrings:EstateReportingReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=EstateReportingReadModel\""); - - if (additionalEnvironmentVariables != null) - { - environmentVariables.AddRange(additionalEnvironmentVariables); - } - - ContainerBuilder voucherManagementContainer = new Builder().UseContainer().WithName(containerName) - .WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.VoucherManagementDockerPort) - .UseNetwork(networkServices.ToArray()); - - if (String.IsNullOrEmpty(hostFolder) == false) - { - voucherManagementContainer = voucherManagementContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); - } - - if (dockerCredentials.HasValue) - { - voucherManagementContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); - } - - // Now build and return the container - IContainerService builtContainer = voucherManagementContainer.Build().Start().WaitForPort($"{DockerHelper.VoucherManagementDockerPort}/tcp", 30000); - - logger.LogInformation("Voucher Management Container Started"); - - return builtContainer; - } - - /// - /// Setups the estate management container. - /// - /// Name of the container. - /// The logger. - /// Name of the image. - /// The network services. - /// The host folder. - /// The docker credentials. - /// Name of the security service container. - /// The event store address. - /// The SQL server details. - /// The client details. - /// if set to true [force latest image]. - /// The security service port. - /// The additional environment variables. - /// - public static IContainerService SetupEstateManagementContainer(String containerName, - ILogger logger, - String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - String securityServiceContainerName, - String eventStoreAddress, - (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) - sqlServerDetails, - (String clientId, String clientSecret) clientDetails, - Boolean forceLatestImage = false, - Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, - List additionalEnvironmentVariables = null) - { - logger.LogInformation("About to Start Estate Management Container"); - - List environmentVariables = new List(); - environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreAddress}:{DockerHelper.EventStoreHttpDockerPort}"); - environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"urls=http://*:{DockerHelper.EstateManagementDockerPort}"); - environmentVariables - .Add($"ConnectionStrings:EstateReportingReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=EstateReportingReadModel\""); - - if (additionalEnvironmentVariables != null) - { - environmentVariables.AddRange(additionalEnvironmentVariables); - } - - ContainerBuilder estateManagementContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.EstateManagementDockerPort) - .UseNetwork(networkServices.ToArray()); - if (String.IsNullOrEmpty(hostFolder) == false) - { - estateManagementContainer = estateManagementContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); - } - - if (dockerCredentials.HasValue) - { - estateManagementContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); - } - - // Now build and return the container - IContainerService builtContainer = estateManagementContainer.Build().Start().WaitForPort($"{DockerHelper.EstateManagementDockerPort}/tcp", 30000); - - logger.LogInformation("Estate Management Container Started"); - - return builtContainer; - } - - /// - /// Setups the estate reporting container. - /// - /// Name of the container. - /// The logger. - /// Name of the image. - /// The network services. - /// The host folder. - /// The docker credentials. - /// Name of the security service container. - /// The SQL server details. - /// The client details. - /// if set to true [force latest image]. - /// The security service port. - /// The additional environment variables. - /// - public static IContainerService SetupEstateReportingContainer(String containerName, - ILogger logger, - String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - String securityServiceContainerName, - String eventStoreAddress, - (String sqlServerContainerName, String sqlServerUserName, String sqlServerPassword) - sqlServerDetails, - (String clientId, String clientSecret) clientDetails, - Boolean forceLatestImage = false, - Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, - List additionalEnvironmentVariables = null) - { - logger.LogInformation("About to Start Estate Reporting Container"); - - List environmentVariables = new List(); - environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreAddress}:{DockerHelper.EventStoreHttpDockerPort}"); - environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"urls=http://*:{DockerHelper.EstateReportingDockerPort}"); - environmentVariables - .Add($"ConnectionStrings:EstateReportingReadModel=\"server={sqlServerDetails.sqlServerContainerName};user id={sqlServerDetails.sqlServerUserName};password={sqlServerDetails.sqlServerPassword};database=EstateReportingReadModel\""); - - if (additionalEnvironmentVariables != null) - { - environmentVariables.AddRange(additionalEnvironmentVariables); - } - - ContainerBuilder estateReportingContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.EstateReportingDockerPort) - .UseNetwork(networkServices.ToArray()); - - if (String.IsNullOrEmpty(hostFolder) == false) - { - estateReportingContainer = estateReportingContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); - } - - if (dockerCredentials.HasValue) - { - estateReportingContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); - } - - // Now build and return the container - IContainerService builtContainer = estateReportingContainer.Build().Start().WaitForPort($"{DockerHelper.EstateReportingDockerPort}/tcp", 30000); - - logger.LogInformation("Estate Reporting Container Started"); - - return builtContainer; - } - - /// - /// Setups the transaction processor container. - /// - /// Name of the container. - /// The logger. - /// Name of the image. - /// The network services. - /// The host folder. - /// The docker credentials. - /// Name of the security service container. - /// Name of the estate management container. - /// The event store address. - /// The client details. - /// Name of the testhost container. - /// Name of the voucher management container. - /// if set to true [force latest image]. - /// The security service port. - /// The additional environment variables. - /// - public static IContainerService SetupTransactionProcessorContainer(String containerName, - ILogger logger, - String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - String securityServiceContainerName, - String estateManagementContainerName, - String eventStoreAddress, - (String clientId, String clientSecret) clientDetails, - String testhostContainerName, - String voucherManagementContainerName, - Boolean forceLatestImage = false, - Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort, - List additionalEnvironmentVariables = null) - { - logger.LogInformation("About to Start Transaction Processor Container"); - - List environmentVariables = new List(); - environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreAddress}:{DockerHelper.EventStoreHttpDockerPort}"); - environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"AppSettings:EstateManagementApi=http://{estateManagementContainerName}:{DockerHelper.EstateManagementDockerPort}"); - environmentVariables.Add($"AppSettings:VoucherManagementApi=http://{voucherManagementContainerName}:{DockerHelper.VoucherManagementDockerPort}"); - environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"urls=http://*:{DockerHelper.TransactionProcessorDockerPort}"); - environmentVariables.Add($"AppSettings:ClientId={clientDetails.clientId}"); - environmentVariables.Add($"AppSettings:ClientSecret={clientDetails.clientSecret}"); - environmentVariables.Add($"AppSettings:SubscriptionFilter=TransactionProcessor"); - - environmentVariables.Add($"OperatorConfiguration:Safaricom:Url=http://{testhostContainerName}:9000/api/safaricom"); - - if (additionalEnvironmentVariables != null) - { - environmentVariables.AddRange(additionalEnvironmentVariables); - } - - ContainerBuilder transactionProcessorContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.TransactionProcessorDockerPort) - .UseNetwork(networkServices.ToArray()); - - if (String.IsNullOrEmpty(hostFolder) == false) - { - transactionProcessorContainer = transactionProcessorContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); - } - if (dockerCredentials.HasValue) - { - transactionProcessorContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); - } - - // Now build and return the container - IContainerService builtContainer = transactionProcessorContainer.Build().Start().WaitForPort($"{DockerHelper.TransactionProcessorDockerPort}/tcp", 30000); - - logger.LogInformation("Transaction Processor Container Started"); - - return builtContainer; - } - - public static IContainerService SetupEventStoreContainer(String containerName, - ILogger logger, - String imageName, - INetworkService networkService, - String hostFolder, - Boolean forceLatestImage = false) - { - logger.LogInformation("About to Start Event Store Container"); - - List environmentVariables = new List(); - environmentVariables.Add("EVENTSTORE_RUN_PROJECTIONS=all"); - environmentVariables.Add("EVENTSTORE_START_STANDARD_PROJECTIONS=true"); - environmentVariables.Add("EVENTSTORE_INSECURE=true"); - environmentVariables.Add("EVENTSTORE_ENABLE_ATOM_PUB_OVER_HTTP=true"); - environmentVariables.Add("EVENTSTORE_ENABLE_EXTERNAL_TCP=true"); - - var eventStoreContainerBuilder = new Builder().UseContainer().UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.EventStoreHttpDockerPort) - .ExposePort(DockerHelper.EventStoreTcpDockerPort).WithName(containerName) - .WithEnvironment(environmentVariables.ToArray()).UseNetwork(networkService); - - if (String.IsNullOrEmpty(hostFolder) == false) - { - eventStoreContainerBuilder = eventStoreContainerBuilder.Mount(hostFolder, "/var/log/eventstore", MountType.ReadWrite); - } - - IContainerService eventStoreContainer = eventStoreContainerBuilder.Build().Start().WaitForPort("2113/tcp", 30000); - - logger.LogInformation("Event Store Container Started"); - - return eventStoreContainer; - } - - public const int MessagingServiceDockerPort = 5006; - - public static IContainerService SetupMessagingServiceContainer(String containerName, - ILogger logger, - String imageName, - List networkServices, - String hostFolder, - (String URL, String UserName, String Password)? dockerCredentials, - String securityServiceContainerName, - String eventStoreAddress, - (String clientId, String clientSecret) clientDetails, - Boolean forceLatestImage = false, - Int32 securityServicePort = DockerHelper.SecurityServiceDockerPort) - { - logger.LogInformation("About to Start Messaging Service Container"); - - List environmentVariables = new List(); - environmentVariables.Add($"EventStoreSettings:ConnectionString={eventStoreAddress}:{DockerHelper.EventStoreHttpDockerPort}"); - environmentVariables.Add($"AppSettings:SecurityService=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"SecurityConfiguration:Authority=https://{securityServiceContainerName}:{securityServicePort}"); - environmentVariables.Add($"urls=http://*:{DockerHelper.MessagingServiceDockerPort}"); - environmentVariables.Add("AppSettings:EmailProxy=Integration"); - environmentVariables.Add("AppSettings:SMSProxy=Integration"); - - ContainerBuilder messagingServiceContainer = new Builder().UseContainer().WithName(containerName).WithEnvironment(environmentVariables.ToArray()) - .UseImage(imageName, forceLatestImage).ExposePort(DockerHelper.MessagingServiceDockerPort) - .UseNetwork(networkServices.ToArray());//.Mount(hostFolder, "/home", MountType.ReadWrite); - - if (String.IsNullOrEmpty(hostFolder) == false) - { - messagingServiceContainer = messagingServiceContainer.Mount(hostFolder, "/home/txnproc/trace", MountType.ReadWrite); - } - - if (dockerCredentials.HasValue) - { - messagingServiceContainer.WithCredential(dockerCredentials.Value.URL, dockerCredentials.Value.UserName, dockerCredentials.Value.Password); - } - - // Now build and return the container - IContainerService builtContainer = messagingServiceContainer.Build().Start().WaitForPort($"{DockerHelper.MessagingServiceDockerPort}/tcp", 30000); - - logger.LogInformation("Messaging Service Container Started"); + public const Int32 VoucherManagementDockerPort = 5007; - return builtContainer; - } + #endregion } } \ No newline at end of file diff --git a/Shared/Shared.csproj b/Shared/Shared.csproj index c3762605..ef0a1bac 100644 --- a/Shared/Shared.csproj +++ b/Shared/Shared.csproj @@ -13,12 +13,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - +