From b881f97c3e22e636dedac0812f92bdfa7998dcab Mon Sep 17 00:00:00 2001 From: Yaroslav Svitlytskyi Date: Fri, 19 Jan 2024 03:44:49 +0100 Subject: [PATCH 1/5] feature: added kafka starter webhook logic --- .../entity/PropertiesEntity.java | 5 +- .../resource/HealthResource.java | 4 +- .../KafkaStarterClientServiceFacade.java | 26 +++++++ .../common/IKafkaStarterClientService.java | 14 ++++ .../ISmallRyeHealthCheckClientService.java} | 4 +- .../service/vendor/VendorFacade.java | 27 ++++--- .../service/vendor/aws/AWSVendorService.java | 76 ++++++++----------- ...ReadinessWaiter.java => VendorWaiter.java} | 2 +- .../src/main/resources/application.properties | 5 +- script/aws/deployment/kafka/main.py | 2 +- 10 files changed, 99 insertions(+), 66 deletions(-) create mode 100644 api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/KafkaStarterClientServiceFacade.java create mode 100644 api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java rename api-server/src/main/java/com/resourcetracker/service/client/{SmallRyeHealthCheckClientService.java => smallrye/ISmallRyeHealthCheckClientService.java} (81%) rename api-server/src/main/java/com/resourcetracker/service/vendor/common/{ReadinessWaiter.java => VendorWaiter.java} (96%) diff --git a/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java b/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java index 4bc1fd73..f08a4b9c 100644 --- a/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java +++ b/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java @@ -57,8 +57,9 @@ public class PropertiesEntity { @ConfigProperty(name = "resourcetracker-kafka.image") String resourceTrackerKafkaImage; - @ConfigProperty(name = "resourcetracker-kafka.image.version") - String resourceTrackerKafkaImageVersion; + // + // @ConfigProperty(name = "resourcetracker-kafka.image.version") + // String resourceTrackerKafkaImageVersion; @ConfigProperty(name = "resourcetracker-kafka.host.alias") String resourceTrackerKafkaHostAlias; diff --git a/api-server/src/main/java/com/resourcetracker/resource/HealthResource.java b/api-server/src/main/java/com/resourcetracker/resource/HealthResource.java index 67b9401c..637025bc 100644 --- a/api-server/src/main/java/com/resourcetracker/resource/HealthResource.java +++ b/api-server/src/main/java/com/resourcetracker/resource/HealthResource.java @@ -9,7 +9,7 @@ import com.resourcetracker.model.HealthCheckResult; import com.resourcetracker.model.ReadinessCheckApplication; import com.resourcetracker.model.ReadinessCheckResult; -import com.resourcetracker.service.client.SmallRyeHealthCheckClientService; +import com.resourcetracker.service.client.smallrye.ISmallRyeHealthCheckClientService; import com.resourcetracker.service.healthcheck.readiness.ReadinessCheckService; import com.resourcetracker.service.terraform.workspace.WorkspaceService; import com.resourcetracker.service.terraform.workspace.facade.WorkspaceFacade; @@ -27,7 +27,7 @@ public class HealthResource implements HealthResourceApi { @Inject WorkspaceService workspaceService; - @Inject @RestClient SmallRyeHealthCheckClientService smallRyeHealthCheckClientService; + @Inject @RestClient ISmallRyeHealthCheckClientService smallRyeHealthCheckClientService; @Override public HealthCheckResult v1HealthGet() { diff --git a/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/KafkaStarterClientServiceFacade.java b/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/KafkaStarterClientServiceFacade.java new file mode 100644 index 00000000..c6b7c494 --- /dev/null +++ b/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/KafkaStarterClientServiceFacade.java @@ -0,0 +1,26 @@ +package com.resourcetracker.service.client.kafkastarter; + +import com.resourcetracker.service.client.kafkastarter.common.IKafkaStarterClientService; +import java.net.URI; +import org.eclipse.microprofile.rest.client.RestClientBuilder; + +/** Represents Kafka starter service client facade. */ +public class KafkaStarterClientServiceFacade { + private final IKafkaStarterClientService kafkaStarterClientService; + + public KafkaStarterClientServiceFacade(String host, Integer port) { + kafkaStarterClientService = + RestClientBuilder.newBuilder() + .baseUri(URI.create(String.format("http://%s:%d", host, port))) + .build(IKafkaStarterClientService.class); + } + + /** + * Sends query to the Kafka starter client to deploy Kafka with the given external host. + * + * @param host external host to be used as advertised listener. + */ + public void deploy(String host) { + kafkaStarterClientService.qDeployPost(host); + } +} diff --git a/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java b/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java new file mode 100644 index 00000000..ddf1184e --- /dev/null +++ b/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java @@ -0,0 +1,14 @@ +package com.resourcetracker.service.client.kafkastarter.common; + +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +/** Represents client for Kafka starter endpoints. */ +@RegisterRestClient +public interface IKafkaStarterClientService { + @POST + @Path("/deploy") + void qDeployPost(@QueryParam("host") String host); +} diff --git a/api-server/src/main/java/com/resourcetracker/service/client/SmallRyeHealthCheckClientService.java b/api-server/src/main/java/com/resourcetracker/service/client/smallrye/ISmallRyeHealthCheckClientService.java similarity index 81% rename from api-server/src/main/java/com/resourcetracker/service/client/SmallRyeHealthCheckClientService.java rename to api-server/src/main/java/com/resourcetracker/service/client/smallrye/ISmallRyeHealthCheckClientService.java index 0fc4d90b..9d2c82b1 100644 --- a/api-server/src/main/java/com/resourcetracker/service/client/SmallRyeHealthCheckClientService.java +++ b/api-server/src/main/java/com/resourcetracker/service/client/smallrye/ISmallRyeHealthCheckClientService.java @@ -1,4 +1,4 @@ -package com.resourcetracker.service.client; +package com.resourcetracker.service.client.smallrye; import com.resourcetracker.model.HealthCheckResult; import jakarta.ws.rs.GET; @@ -10,7 +10,7 @@ /** Represents client for SmallRye health check endpoints. */ @Path("/q") @RegisterRestClient(configKey = "small-rye-health-check") -public interface SmallRyeHealthCheckClientService { +public interface ISmallRyeHealthCheckClientService { @GET @Path("/health") @Produces(MediaType.APPLICATION_JSON) diff --git a/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java b/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java index 12f9adbc..f7ca42c6 100644 --- a/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java +++ b/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java @@ -6,13 +6,13 @@ import com.resourcetracker.converter.SecretsConverter; import com.resourcetracker.dto.*; import com.resourcetracker.entity.PropertiesEntity; -import com.resourcetracker.exception.ContainerStartupFailureException; import com.resourcetracker.exception.SecretsConversionException; import com.resourcetracker.model.TerraformDeploymentApplication; import com.resourcetracker.model.TerraformDestructionApplication; import com.resourcetracker.model.ValidationSecretsApplication; import com.resourcetracker.model.ValidationSecretsApplicationResult; import com.resourcetracker.model.ValidationSecretsApplicationResultSecrets; +import com.resourcetracker.service.client.kafkastarter.KafkaStarterClientServiceFacade; import com.resourcetracker.service.vendor.aws.AWSVendorService; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -129,10 +129,10 @@ public String startContainerExecution( properties.getGitCommitId()), AWSKafkaTaskDefinitionRegistrationDto.of( properties.getResourceTrackerKafkaImage(), - properties.getResourceTrackerKafkaImageVersion(), + properties.getGitCommitId(), properties.getAwsResourceTrackerKafkaName(), properties.getResourceTrackerKafkaMainPort(), - properties.getResourceTrackerKafkaStarterPort(), + properties.getResourceTrackerKafkaStarterPort(), serviceMachineAddress, properties.getResourceTrackerKafkaHostAlias(), properties.getKafkaTopic(), @@ -165,12 +165,21 @@ public String startContainerExecution( terraformDeploymentApplication.getCredentials().getRegion(), properties.getAwsReadinessPeriod()); - // yield awsVendorService.getMachineAddress( - // properties.getAwsResourceTrackerKafkaName(), - // awsDeploymentResult.getEcsCluster().getValue(), - // awsCredentialsProvider, - // terraformDeploymentApplication.getCredentials().getRegion()); - yield "0.0.0.0"; + serviceMachineAddress = + awsVendorService.getMachineAddress( + properties.getAwsResourceTrackerCommonFamily(), + awsDeploymentResult.getEcsCluster().getValue(), + ecsTaskDefinitionsArn, + awsCredentialsProvider, + terraformDeploymentApplication.getCredentials().getRegion()); + + KafkaStarterClientServiceFacade kafkaStarterClientServiceFacade = + new KafkaStarterClientServiceFacade( + serviceMachineAddress, properties.getResourceTrackerKafkaStarterPort()); + + kafkaStarterClientServiceFacade.deploy(serviceMachineAddress); + + yield serviceMachineAddress; } }; } diff --git a/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java b/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java index 3de18a4c..6e25892e 100644 --- a/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java +++ b/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java @@ -9,9 +9,6 @@ import com.amazonaws.services.ecs.AmazonECS; import com.amazonaws.services.ecs.AmazonECSClientBuilder; import com.amazonaws.services.ecs.model.*; -import com.amazonaws.services.identitymanagement.AmazonIdentityManagement; -import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder; -import com.amazonaws.services.identitymanagement.model.DeleteRoleRequest; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.HeadBucketRequest; @@ -28,13 +25,12 @@ import com.resourcetracker.dto.AWSDeploymentResultDto; import com.resourcetracker.dto.AWSSecretsDto; import com.resourcetracker.dto.AWSTaskDefinitionRegistrationDto; -import com.resourcetracker.service.vendor.common.ReadinessWaiter; +import com.resourcetracker.service.vendor.common.VendorWaiter; import jakarta.enterprise.context.ApplicationScoped; import java.io.IOException; -import java.util.Iterator; +import java.util.HashMap; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -90,6 +86,18 @@ public String registerEcsTaskDefinitions( .withCredentials(awsCredentialsProvider) .build(); + LogConfiguration logConfiguration = + new LogConfiguration() + .withLogDriver(LogDriver.Awslogs) + .withOptions( + new HashMap<>() { + { + put("awslogs-group", "agent-logs-test"); + put("awslogs-region", "us-west-2"); + put("awslogs-stream-prefix", "ecs/resourcetracker-kafka"); + } + }); + PortMapping mainPortMapping = new PortMapping() .withContainerPort( @@ -102,15 +110,15 @@ public String registerEcsTaskDefinitions( .getKafkaContainerMainPort()); PortMapping starterPortMapping = - new PortMapping() - .withContainerPort( - ecsTaskDefinitionRegistrationDto - .getAwsKafkaTaskDefinitionRegistrationDto() - .getKafkaContainerStarterPort()) - .withHostPort( - ecsTaskDefinitionRegistrationDto - .getAwsKafkaTaskDefinitionRegistrationDto() - .getKafkaContainerStarterPort()); + new PortMapping() + .withContainerPort( + ecsTaskDefinitionRegistrationDto + .getAwsKafkaTaskDefinitionRegistrationDto() + .getKafkaContainerStarterPort()) + .withHostPort( + ecsTaskDefinitionRegistrationDto + .getAwsKafkaTaskDefinitionRegistrationDto() + .getKafkaContainerStarterPort()); KeyValuePair kraftCreateTopicsKeyPair = new KeyValuePair() @@ -142,9 +150,8 @@ public String registerEcsTaskDefinitions( .getKafkaContainerName()) .withEssential(true) .withPortMappings(mainPortMapping, starterPortMapping) - .withEnvironment( - kraftCreateTopicsKeyPair, - kraftPartitionsPerTopicKeyPair) + .withLogConfiguration(logConfiguration) + .withEnvironment(kraftCreateTopicsKeyPair, kraftPartitionsPerTopicKeyPair) .withImage( String.format( "%s:%s", @@ -271,21 +278,6 @@ public void runEcsTask( ecsClient.updateService(updateServiceRequest); } -// /** -// * Gathers output returned by ECS Task run action, if fail happens. -// * -// * @param runTaskResult embedded result of ECS Task run action. -// * @return gathered output of ECS Task run action. -// */ -// private String gatherRunEcsTaskResultOutput(RunTaskResult runTaskResult) { -// return runTaskResult.getFailures().stream() -// .map( -// element -> -// String.format( -// "%s, %s, %s", element.getArn(), element.getDetail(), element.getReason())) -// .collect(Collectors.joining(";")); -// } - /** * Retrieves remote machine address from the given ECS Task details. * @@ -334,7 +326,7 @@ public void waitForEcsTaskReadiness( .withCredentials(awsCredentialsProvider) .build(); - ReadinessWaiter.awaitFor( + VendorWaiter.awaitFor( () -> { ListTasksResult listTasksResult = ecsClient.listTasks(listTasksRequest); @@ -514,18 +506,12 @@ public void removeS3Bucket( .withCredentials(awsCredentialsProvider) .build(); - ObjectListing objects = simpleStorage.listObjects(name); - while (true) { - Iterator iter = objects.getObjectSummaries().iterator(); - while (iter.hasNext()) { - simpleStorage.deleteObject(name, iter.next().getKey()); + for (ObjectListing objects = simpleStorage.listObjects(name); + !objects.isTruncated(); + objects = simpleStorage.listNextBatchOfObjects(objects)) { + for (S3ObjectSummary s3ObjectSummary : objects.getObjectSummaries()) { + simpleStorage.deleteObject(name, s3ObjectSummary.getKey()); } - - if (!objects.isTruncated()) { - break; - } - - objects = simpleStorage.listNextBatchOfObjects(objects); } simpleStorage.deleteBucket(name); diff --git a/api-server/src/main/java/com/resourcetracker/service/vendor/common/ReadinessWaiter.java b/api-server/src/main/java/com/resourcetracker/service/vendor/common/VendorWaiter.java similarity index 96% rename from api-server/src/main/java/com/resourcetracker/service/vendor/common/ReadinessWaiter.java rename to api-server/src/main/java/com/resourcetracker/service/vendor/common/VendorWaiter.java index ee46c12f..f6e29704 100644 --- a/api-server/src/main/java/com/resourcetracker/service/vendor/common/ReadinessWaiter.java +++ b/api-server/src/main/java/com/resourcetracker/service/vendor/common/VendorWaiter.java @@ -5,7 +5,7 @@ import lombok.SneakyThrows; /** Represents readiness waiter used for to wait for resource availability. */ -public class ReadinessWaiter { +public class VendorWaiter { private static final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(4); diff --git a/api-server/src/main/resources/application.properties b/api-server/src/main/resources/application.properties index ce119aae..e526c5fa 100644 --- a/api-server/src/main/resources/application.properties +++ b/api-server/src/main/resources/application.properties @@ -42,9 +42,6 @@ resourcetracker-agent.context.alias=RESOURCETRACKER_AGENT_CONTEXT # Describes ResourceTracker Kafka starter Docker image name. resourcetracker-kafka.image=ghcr.io/yarikrevich/resourcetracker-kafka-starter -# Describes ResourceTracker Kafka starter Docker image version. -resourcetracker-kafka.image.version=latest - # Describes Kafka host environment variable name. resourcetracker-kafka.host.alias=KRAFT_CONTAINER_HOST_NAME @@ -58,7 +55,7 @@ resourcetracker-kafka.partitions.alias=KRAFT_PARTITIONS_PER_TOPIC resourcetracker-kafka.main.port=9093 # Describes ResourceTracker Kafka starter starter port mapping. -resourcetracker-kafka.starter.port=8090 +resourcetracker-kafka.starter.port=8080 # Describes default regions for different providers. aws.default.region=us-west-2 diff --git a/script/aws/deployment/kafka/main.py b/script/aws/deployment/kafka/main.py index e33eddb3..4ee6324a 100644 --- a/script/aws/deployment/kafka/main.py +++ b/script/aws/deployment/kafka/main.py @@ -16,7 +16,7 @@ def deploy(): host = request.args.get('host') - os.system(f'KRAFT_CONTAINER_HOST_NAME={host} bash /opt/docker-entrypoint.sh') + os.spawnl(os.P_DETACH, f'KRAFT_CONTAINER_HOST_NAME={host} bash /opt/docker-entrypoint.sh') return "", 201 From b9910cf4ff78b17572c31384a7c6a07848a07e95 Mon Sep 17 00:00:00 2001 From: Yaroslav Svitlytskyi Date: Fri, 19 Jan 2024 03:50:59 +0100 Subject: [PATCH 2/5] fix: fixed bugs --- script/aws/deployment/kafka/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/aws/deployment/kafka/main.py b/script/aws/deployment/kafka/main.py index 4ee6324a..8b012c98 100644 --- a/script/aws/deployment/kafka/main.py +++ b/script/aws/deployment/kafka/main.py @@ -16,7 +16,7 @@ def deploy(): host = request.args.get('host') - os.spawnl(os.P_DETACH, f'KRAFT_CONTAINER_HOST_NAME={host} bash /opt/docker-entrypoint.sh') + os.system(f'KRAFT_CONTAINER_HOST_NAME={host} bash /opt/docker-entrypoint.sh &') return "", 201 From 464fc243cb2320af20a54a02c88146539330de57 Mon Sep 17 00:00:00 2001 From: Yaroslav Svitlytskyi Date: Fri, 19 Jan 2024 17:23:59 +0100 Subject: [PATCH 3/5] feature: updated docs --- README.md | 20 ++++++-- .../entity/PropertiesEntity.java | 7 ++- .../service/kafka/KafkaService.java | 44 +++++++++++++++-- .../service/vendor/VendorFacade.java | 20 ++++++++ .../service/vendor/aws/AWSVendorService.java | 14 +++--- .../src/main/resources/application.properties | 2 + docs/detailed-design-raw.md | 45 ++++++++++++------ docs/detailed-design.png | Bin 99020 -> 124433 bytes docs/high-level-design-raw.md | 13 ++++- docs/high-level-design.png | Bin 36959 -> 70143 bytes 10 files changed, 130 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 2e5e4435..fa479fae 100644 --- a/README.md +++ b/README.md @@ -22,13 +22,15 @@ All setup related operations are processed via **Makefile** placed in the root d ### CLI -In order to build CLI it's required to execute the following command. Initially it cleans the environment and build Java project using **Maven** +In order to build CLI it's required to execute the following command. Initially it cleans the environment and builds Java project using **Maven** ```shell make build-cli ``` After the execution of command given above the executable will be generated and placed into **bin** folder in the root directory of the project +**CLI** build automatically places default **user.yaml** configuration file into ~/.resourcetracker/config directory. + ### GUI In order to build GUI it's required to execute the following command. Initially it cleans the environment and build Java project using **Maven** @@ -38,15 +40,23 @@ make build-gui After the execution of command given above the executable will be generated and placed into **bin** folder in the root directory of the project -GUI build automatically compiles API Server and places both executable JAR and other dependencies into **~/.resourcetracker/bin/api-server** directory +**GUI** build automatically compiles **API Server** and places both executable JAR and other dependencies into **~/.resourcetracker/bin/api-server** directory -It's highly recommended not to move API Server files from the default local directory +It's highly recommended not to move **API Server** files from the default local directory ### API Server -In order to build API Server it's required to execute the following command. Initially it cleans the environment and build Java project using **Maven** +In order to build **API Server** it's required to execute the following command. Initially it cleans the environment and build Java project using **Maven** ```shell make build-api-server ``` -After the execution of command given above the executable will be generated and placed into **bin** folder in the root directory of the project \ No newline at end of file +After the execution of command given above the executable will be generated and placed into **bin** folder in the root directory of the project + +## Use cases + +### CLI + + + +### GUI \ No newline at end of file diff --git a/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java b/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java index f08a4b9c..5511819c 100644 --- a/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java +++ b/api-server/src/main/java/com/resourcetracker/entity/PropertiesEntity.java @@ -30,6 +30,9 @@ public class PropertiesEntity { @ConfigProperty(name = "kafka.partitions") String kafkaPartitions; + @ConfigProperty(name = "kafka.readiness.period") + Integer kafkaReadinessPeriod; + @ConfigProperty(name = "terraform.directory") String terraformDirectory; @@ -57,10 +60,6 @@ public class PropertiesEntity { @ConfigProperty(name = "resourcetracker-kafka.image") String resourceTrackerKafkaImage; - // - // @ConfigProperty(name = "resourcetracker-kafka.image.version") - // String resourceTrackerKafkaImageVersion; - @ConfigProperty(name = "resourcetracker-kafka.host.alias") String resourceTrackerKafkaHostAlias; diff --git a/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java b/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java index 77d7a79f..ab838da1 100644 --- a/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java +++ b/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java @@ -16,6 +16,7 @@ import org.apache.kafka.common.errors.TimeoutException; import org.apache.kafka.common.errors.UnsupportedVersionException; +/** */ public class KafkaService { private AdminClient kafkaAdminClient; @@ -25,7 +26,13 @@ public class KafkaService { private final KafkaConsumer kafkaConsumer; - public KafkaService(String kafkaBootstrapServer, PropertiesEntity properties) { + public KafkaService(String kafkaBootstrapServerHost, PropertiesEntity properties) { + String kafkaBootstrapServer = + String.format( + "%s:%d", kafkaBootstrapServerHost, properties.getResourceTrackerKafkaMainPort()); + + System.out.println(kafkaBootstrapServerHost); + Properties kafkaAdminClientProps = new Properties(); kafkaAdminClientProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapServer); @@ -52,6 +59,11 @@ public KafkaService(String kafkaBootstrapServer, PropertiesEntity properties) { this.kafkaConsumer.subscribe(Collections.singletonList(properties.getKafkaTopic())); } + /** + * Checks if Kafka service is connected to Kafka cluster at the given address. + * + * @return result of the check. + */ public boolean isConnected() { if (isAvailable()) { if (Objects.isNull(kafkaAdminClient)) { @@ -74,10 +86,16 @@ public boolean isConnected() { return false; } - private boolean isAvailable() { + /** + * Checks if Kafka service is available at the given address. + * + * @return result of the check. + */ + public boolean isAvailable() { URL url; + try { - url = URI.create(kafkaBootstrapServer).toURL(); + url = URI.create(String.format("http://%s", kafkaBootstrapServer)).toURL(); } catch (MalformedURLException e) { return false; } @@ -91,6 +109,26 @@ private boolean isAvailable() { } } + /** + * Checks if the given Kafka topic exists. + * + * @param name given Kafka topic name. + * @return result of the check. + */ + public boolean isTopicExist(String name) { + kafkaAdminClient.listTopics().names().whenComplete((e, b) -> System.out.println(e.stream().toList())); + +// return !kafkaConsumer.listTopics().keySet().stream() +// .filter(element -> !element.equals(name)) +// .toList() +// .isEmpty(); + + return false; + } + + /** + * @return + */ public List consumeLogs() { List kafkaLogsTopicEntities = new ArrayList<>(); diff --git a/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java b/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java index f7ca42c6..73c3c823 100644 --- a/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java +++ b/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java @@ -13,7 +13,9 @@ import com.resourcetracker.model.ValidationSecretsApplicationResult; import com.resourcetracker.model.ValidationSecretsApplicationResultSecrets; import com.resourcetracker.service.client.kafkastarter.KafkaStarterClientServiceFacade; +import com.resourcetracker.service.kafka.KafkaService; import com.resourcetracker.service.vendor.aws.AWSVendorService; +import com.resourcetracker.service.vendor.common.VendorWaiter; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -179,6 +181,24 @@ public String startContainerExecution( kafkaStarterClientServiceFacade.deploy(serviceMachineAddress); + KafkaService kafkaService = new KafkaService(serviceMachineAddress, properties); + + VendorWaiter.awaitFor( + () -> { + if (kafkaService.isAvailable()) { + return true; + } + + System.out.println("before"); + + System.out.println(kafkaService.isTopicExist(properties.getKafkaTopic())); + + System.out.println("after"); + + return kafkaService.isTopicExist(properties.getKafkaTopic()); + }, + properties.getKafkaReadinessPeriod()); + yield serviceMachineAddress; } }; diff --git a/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java b/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java index 6e25892e..437f7a9a 100644 --- a/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java +++ b/api-server/src/main/java/com/resourcetracker/service/vendor/aws/AWSVendorService.java @@ -506,13 +506,15 @@ public void removeS3Bucket( .withCredentials(awsCredentialsProvider) .build(); - for (ObjectListing objects = simpleStorage.listObjects(name); - !objects.isTruncated(); - objects = simpleStorage.listNextBatchOfObjects(objects)) { - for (S3ObjectSummary s3ObjectSummary : objects.getObjectSummaries()) { - simpleStorage.deleteObject(name, s3ObjectSummary.getKey()); + ObjectListing objects = simpleStorage.listObjects(name); + + do { + for (S3ObjectSummary summary : objects.getObjectSummaries()) { + simpleStorage.deleteObject(name, summary.getKey()); } - } + + objects = simpleStorage.listNextBatchOfObjects(objects); + } while (objects.isTruncated()); simpleStorage.deleteBucket(name); diff --git a/api-server/src/main/resources/application.properties b/api-server/src/main/resources/application.properties index e526c5fa..b24eafdb 100644 --- a/api-server/src/main/resources/application.properties +++ b/api-server/src/main/resources/application.properties @@ -30,6 +30,8 @@ kafka.topic=logs # Describes Kafka partitions used for the deployment. kafka.partitions=1 +kafka.readiness.period=4000 + # Describes the name of the storage bucket where remote Terraform state is saved. remote-storage.name=resourcetracker-state diff --git a/docs/detailed-design-raw.md b/docs/detailed-design-raw.md index b437f9d0..ff524968 100644 --- a/docs/detailed-design-raw.md +++ b/docs/detailed-design-raw.md @@ -12,6 +12,7 @@ participant "API Server" as apiserver box "Cloud environment" #Lavender queue "Kafka" as kafka +participant "Kafka starter" as kafkastarter participant "Agent" as agent entity "Cloud provider" as cloudprovider end box @@ -21,32 +22,47 @@ end box note over kafka: Kafka is considered to be used in persisted mode opt "endpoints" -opt "/v1/state [GET]" -apiserver -> kafka: retrieve resource state -kafka -> apiserver: transform data stream\naccording to the specified\nfilters +opt "/v1/secrets/acquire [POST]" +apiserver -> cloudprovider: validate provided credentials +cloudprovider -> apiserver: validation result +end +opt "/v1/topic/logs [GET]" +apiserver -> kafka: retrieve state for the given "logs" topic +kafka -> apiserver: transform data stream according to the specified filters end opt "/v1/terraform/apply [POST]" -apiserver -> cloudprovider: deploy resource\ntracking infrostructure -apiserver -> agent: configure agent properties -apiserver -> kafka: deploy kafka cluster -apiserver -> kafka: configure kafka cluster\nin persisted mode +apiserver -> cloudprovider: deploy resource tracking infrastructure +apiserver -> kafkastarter: request kafka cluster startup +kafkastarter -> kafka: start kafka cluster end opt "/v1/terraform/destroy [POST]" -apiserver -> agent: stop agent -apiserver -> kafka: stop kafka cluster and clean up persisted data -apiserver -> cloudprovider: clean up deployed\nresource tracking\ninfrostructure +apiserver -> cloudprovider: destroy resource tracking infrastructure end end -opt "execution flow" +opt "agent execution flow" agent -> cloudprovider: execute remote operations agent <-- cloudprovider: remote operation result -agent --> kafka: push latest resource state +agent --> kafka: push latest resource state to "logs" topic end opt "requests" note over client: Uses properties specified in a client\nconfiguration file located in\n a common directory - +opt "credentials validation" +client -> apiserver: /v1/secrets/acquire [POST] +end +opt "script validation" +client -> apiserver: /v1/script/acquire [POST] +end +opt "health check" +client -> apiserver: /v1/health [GET] +end +opt "readiness check" +client -> apiserver: /v1/readiness [GET] +end +opt "version validation" +client -> apiserver: /v1/info/version [GET] +end opt "infrustructure deployment" client -> apiserver: /v1/terraform/apply [POST] end @@ -54,8 +70,7 @@ opt "infrustructure clean up" client -> apiserver: /v1/terraform/destroy [POST] end opt "state retrieval" -client -> apiserver: /v1/state [GET] -client <-- apiserver: up-to-date state +client -> apiserver: /v1/topic/logs [GET] end end ``` \ No newline at end of file diff --git a/docs/detailed-design.png b/docs/detailed-design.png index 5ef58a0189ea449b9538d39b7b212c4c0e51e5cc..2c30540258c070a54b733ced111a29c5eda7e185 100644 GIT binary patch literal 124433 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�zrTe$6i%(!4@JL&3iqnGIE2Soh24j&4cJOC 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≠LnZxZ0{l4 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 diff --git a/docs/high-level-design-raw.md b/docs/high-level-design-raw.md index 8c46df69..8d4b85cf 100644 --- a/docs/high-level-design-raw.md +++ b/docs/high-level-design-raw.md @@ -11,15 +11,24 @@ component "Control plain" { node "API Server" cloud "Cloud environment" { -node "Kafka" +cloud "Agent container" { node "Agent" +} + +cloud "Kafka container" { +node "Kafka" +node "Kafka starter" +} hexagon "Cloud provider" [Agent] <--> [Cloud provider]: "Execute remote operation\nand save the result" [Agent] --> [Kafka]: "Push latest resource state" } -[API Server] --> [Kafka]: "Perform deployment and event filtering\t\t" +[API Server] --> [Agent]: " Perform infrastructure deployment\n" +[API Server] --> [Kafka starter]: " Initialize Kafka startup\n" +[Kafka starter] --> [Kafka]: "Start Kafka cluster\n" +[API Server] <--> [Kafka]: "Perform event filtering\t\t" } [Client] --> [API Server]: " Perform resource related operations" diff --git a/docs/high-level-design.png b/docs/high-level-design.png index bc2453117dcde77efb96f81d61bd7a21ed12137f..03e6456d0a553d038cd5c135331e664acb34a8cc 100644 GIT binary patch literal 70143 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%0D#XbjM( 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 literal 36959 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 Date: Sat, 20 Jan 2024 00:24:40 +0100 Subject: [PATCH 4/5] feature: added progress bar for CLI --- .../service/kafka/KafkaService.java | 19 +---- .../aws/command/DestroyCommandService.java | 2 - .../aws/command/InitCommandService.java | 2 - .../service/vendor/VendorFacade.java | 16 +---- .../main/java/com/resourcetracker/App.java | 10 ++- .../dto/VisualizationLabelDto.java | 26 +++++++ .../entity/PropertiesEntity.java | 12 ++++ .../service/command/BaseCommandService.java | 38 +++++++++- .../aws/AWSStartExternalCommandService.java | 9 ++- .../state/StateExternalCommandService.java | 5 +- .../aws/AWSStopExternalCommandService.java | 5 +- .../VersionExternalCommandService.java | 13 +++- .../ReadinessCheckInternalCommandService.java | 1 + .../visualization/VisualizationService.java | 48 +++++++++++++ .../common/IVisualizationLabel.java | 28 ++++++++ .../label/StartCommandVisualizationLabel.java | 72 +++++++++++++++++++ .../label/StopCommandVisualizationLabel.java | 4 ++ .../VersionCommandVisualizationLabel.java | 69 ++++++++++++++++++ .../state/VisualizationState.java | 28 ++++++++ cli/src/main/resources/application.properties | 13 +++- config/tf/aws/ecs/main.tf | 70 ++---------------- config/tf/aws/ecs/output.tf | 8 +-- config/tf/aws/main.tf | 2 +- 23 files changed, 384 insertions(+), 116 deletions(-) create mode 100644 cli/src/main/java/com/resourcetracker/dto/VisualizationLabelDto.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/common/IVisualizationLabel.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/state/VisualizationState.java diff --git a/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java b/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java index ab838da1..422bc0fc 100644 --- a/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java +++ b/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java @@ -110,24 +110,9 @@ public boolean isAvailable() { } /** - * Checks if the given Kafka topic exists. + * Retrieves messages from "logs" topic. * - * @param name given Kafka topic name. - * @return result of the check. - */ - public boolean isTopicExist(String name) { - kafkaAdminClient.listTopics().names().whenComplete((e, b) -> System.out.println(e.stream().toList())); - -// return !kafkaConsumer.listTopics().keySet().stream() -// .filter(element -> !element.equals(name)) -// .toList() -// .isEmpty(); - - return false; - } - - /** - * @return + * @return retrieved messages. */ public List consumeLogs() { List kafkaLogsTopicEntities = new ArrayList<>(); diff --git a/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/DestroyCommandService.java b/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/DestroyCommandService.java index c92dc968..939dbcf4 100644 --- a/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/DestroyCommandService.java +++ b/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/DestroyCommandService.java @@ -32,8 +32,6 @@ public DestroyCommandService( TerraformConfigurationHelper.getContentEnvironmentVariables( agentContext, gitCommitId)); }; - - System.out.println(command); } @Override diff --git a/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/InitCommandService.java b/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/InitCommandService.java index c8bfdfdd..5e1aa607 100644 --- a/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/InitCommandService.java +++ b/api-server/src/main/java/com/resourcetracker/service/terraform/provider/aws/command/InitCommandService.java @@ -27,8 +27,6 @@ public InitCommandService( workspaceUnitDirectory, credentials), AWSProviderConfigurationHelper.getBackendConfig(credentials)); }; - - System.out.println(command); } @Override diff --git a/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java b/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java index 73c3c823..68fdd52e 100644 --- a/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java +++ b/api-server/src/main/java/com/resourcetracker/service/vendor/VendorFacade.java @@ -183,21 +183,7 @@ public String startContainerExecution( KafkaService kafkaService = new KafkaService(serviceMachineAddress, properties); - VendorWaiter.awaitFor( - () -> { - if (kafkaService.isAvailable()) { - return true; - } - - System.out.println("before"); - - System.out.println(kafkaService.isTopicExist(properties.getKafkaTopic())); - - System.out.println("after"); - - return kafkaService.isTopicExist(properties.getKafkaTopic()); - }, - properties.getKafkaReadinessPeriod()); + VendorWaiter.awaitFor(kafkaService::isAvailable, properties.getKafkaReadinessPeriod()); yield serviceMachineAddress; } diff --git a/cli/src/main/java/com/resourcetracker/App.java b/cli/src/main/java/com/resourcetracker/App.java index 25884119..58e124a2 100644 --- a/cli/src/main/java/com/resourcetracker/App.java +++ b/cli/src/main/java/com/resourcetracker/App.java @@ -15,6 +15,10 @@ import com.resourcetracker.service.command.internal.readiness.provider.aws.AWSReadinessCheckInternalCommandService; import com.resourcetracker.service.config.ConfigService; import com.resourcetracker.service.config.common.ValidConfigService; +import com.resourcetracker.service.visualization.VisualizationService; +import com.resourcetracker.service.visualization.common.label.StartCommandVisualizationLabel; +import com.resourcetracker.service.visualization.common.label.VersionCommandVisualizationLabel; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -49,7 +53,11 @@ ConfigService.class, ValidConfigService.class, BuildProperties.class, - PropertiesEntity.class + PropertiesEntity.class, + StartCommandVisualizationLabel.class, + VersionCommandVisualizationLabel.class, + VisualizationService.class, + VisualizationState.class }) public class App implements ApplicationRunner, ExitCodeGenerator { private static final Logger logger = LogManager.getLogger(App.class); diff --git a/cli/src/main/java/com/resourcetracker/dto/VisualizationLabelDto.java b/cli/src/main/java/com/resourcetracker/dto/VisualizationLabelDto.java new file mode 100644 index 00000000..d7145fd3 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/dto/VisualizationLabelDto.java @@ -0,0 +1,26 @@ +package com.resourcetracker.dto; + +import lombok.AllArgsConstructor; + +/** */ +@AllArgsConstructor(staticName = "of") +public class VisualizationLabelDto { + private final String message; + + private final Integer percentage; + + @Override + public String toString() { + int filledLength = (int) Math.round((double) percentage / 100 * 20); + int emptyLength = 20 - filledLength; + + return "[" + + "#".repeat(Math.max(0, filledLength)) + + "-".repeat(Math.max(0, emptyLength)) + + "] " + + percentage + + "%" + + " " + + message; + } +} diff --git a/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java b/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java index 8a2d9220..eaf48f7f 100644 --- a/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java +++ b/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java @@ -22,6 +22,18 @@ public class PropertiesEntity { @Value("${config.user.file}") private String configUserFilePath; + @Value("${progress.visualization.period}") + private Integer progressVisualizationPeriod; + + @Value("${progress.visualization.secrets-acquire-request}") + private String progressVisualizationSecretsAcquireRequestLabel; + + @Value("${progress.visualization.script-acquire-request}") + private String progressVisualizationScriptAcquireRequestLabel; + + @Value("${progress.visualization.version-info-request}") + private String progressVisualizationVersionInfoRequestLabel; + @Bean private static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { PropertySourcesPlaceholderConfigurer propsConfig = new PropertySourcesPlaceholderConfigurer(); diff --git a/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java index fc6a0618..3cd61bc9 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java @@ -7,13 +7,17 @@ import com.resourcetracker.service.command.external.version.VersionExternalCommandService; import com.resourcetracker.service.command.internal.health.HealthCheckInternalCommandService; import com.resourcetracker.service.command.internal.readiness.ReadinessCheckInternalCommandService; +import com.resourcetracker.service.visualization.VisualizationService; +import com.resourcetracker.service.visualization.common.label.StartCommandVisualizationLabel; +import com.resourcetracker.service.visualization.common.label.VersionCommandVisualizationLabel; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import picocli.CommandLine.Command; -/** Represents command management service. */ +/** Represents general command management service. */ @Service @Command( name = "help", @@ -35,21 +39,38 @@ public class BaseCommandService { @Autowired private ReadinessCheckInternalCommandService readinessCheckInternalCommandService; + @Autowired private StartCommandVisualizationLabel startCommandVisualizationLabel; + + @Autowired private VersionCommandVisualizationLabel versionCommandVisualizationLabel; + + @Autowired private VisualizationService visualizationService; + + @Autowired private VisualizationState visualizationState; + /** Provides access to start command service. */ @Command(description = "Start remote requests execution") private void start() { + visualizationState.setLabel(startCommandVisualizationLabel); + + visualizationService.process(); + try { healthCheckInternalCommandService.process(); startCommandService.process(); } catch (ApiServerException e) { logger.fatal(e.getMessage()); + return; } + + visualizationService.await(); } /** Provides access to state command service. */ @Command(description = "Retrieve state of remote requests executions") private void state() { + visualizationService.process(); + try { healthCheckInternalCommandService.process(); readinessCheckInternalCommandService.process(); @@ -57,19 +78,27 @@ private void state() { stateCommandService.process(); } catch (ApiServerException e) { logger.fatal(e.getMessage()); + return; } + + visualizationService.await(); } /** Provides access to stop command service. */ @Command(description = "Stop remote requests execution") private void stop() { + visualizationService.process(); + try { healthCheckInternalCommandService.process(); stopCommandService.process(); } catch (ApiServerException e) { logger.fatal(e.getMessage()); + return; } + + visualizationService.await(); } /** Provides access to version command service. */ @@ -77,10 +106,17 @@ private void stop() { description = "Retrieve version of ResourceTracker CLI and ResourceTracker API Server(if available)") private void version() { + visualizationState.setLabel(versionCommandVisualizationLabel); + + visualizationService.process(); + try { versionCommandService.process(); } catch (ApiServerException e) { logger.fatal(e.getMessage()); + return; } + + visualizationService.await(); } } diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java index adfedbd0..d333d5e4 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java @@ -13,6 +13,7 @@ import com.resourcetracker.service.client.command.SecretsAcquireClientCommandService; import com.resourcetracker.service.command.ICommand; import com.resourcetracker.service.config.ConfigService; +import com.resourcetracker.service.visualization.state.VisualizationState; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -35,11 +36,15 @@ public class AWSStartExternalCommandService implements ICommand { @Autowired private ScriptAcquireClientCommandService scriptAcquireClientCommandService; + @Autowired private VisualizationState visualizationState; + /** * @see ICommand */ @Override public void process() throws ApiServerException { + visualizationState.getLabel().pushNext(); + ConfigEntity.Cloud.AWSCredentials credentials = CredentialsConverter.convert( configService.getConfig().getCloud().getCredentials(), @@ -52,6 +57,8 @@ public void process() throws ApiServerException { secretsAcquireClientCommandService.process(validationSecretsApplicationDto); if (validationSecretsApplicationResult.getValid()) { + visualizationState.getLabel().pushNext(); + List requests = configService.getConfig().getRequests().stream() .map( @@ -87,7 +94,7 @@ public void process() throws ApiServerException { applyClientCommandService.process(terraformDeploymentApplication); - System.out.println("Deployment with the given configuration was started!"); + visualizationState.addResult("Deployment with the given configuration was started!"); } else { logger.fatal(new ScriptDataValidationException().getMessage()); } diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java index 72a581ef..acaf47ee 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java @@ -7,6 +7,7 @@ import com.resourcetracker.model.TopicLogsResult; import com.resourcetracker.service.client.command.LogsClientCommandService; import com.resourcetracker.service.command.ICommand; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +21,8 @@ public class StateExternalCommandService implements ICommand { @Autowired private LogsClientCommandService logsClientCommandService; + @Autowired private VisualizationState visualizationState; + /** * @see ICommand */ @@ -35,7 +38,7 @@ public void process() throws ApiServerException { ObjectMapper mapper = new ObjectMapper(); try { - System.out.println(mapper.writeValueAsString(topicLogsResult)); + visualizationState.addResult(mapper.writeValueAsString(topicLogsResult)); } catch (JsonProcessingException e) { logger.fatal(e.getMessage()); } diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java index d1eeccf2..e922617f 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java @@ -15,6 +15,7 @@ import com.resourcetracker.service.client.command.SecretsAcquireClientCommandService; import com.resourcetracker.service.command.ICommand; import com.resourcetracker.service.config.ConfigService; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +32,8 @@ public class AWSStopExternalCommandService implements ICommand { @Autowired private SecretsAcquireClientCommandService secretsAcquireClientCommandService; + @Autowired private VisualizationState visualizationState; + /** * @see ICommand */ @@ -65,7 +68,7 @@ public void process() throws ApiServerException { destroyClientCommandService.process(terraformDestructionApplication); - System.out.println("Deployment with the given configuration file was stopped!"); + visualizationState.addResult("Deployment with the given configuration file was stopped!"); } else { logger.fatal(new CloudCredentialsValidationException().getMessage()); } diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/version/VersionExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/version/VersionExternalCommandService.java index 5aee8c62..56f559d6 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/version/VersionExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/version/VersionExternalCommandService.java @@ -6,6 +6,7 @@ import com.resourcetracker.service.client.command.HealthCheckClientCommandService; import com.resourcetracker.service.client.command.VersionClientCommandService; import com.resourcetracker.service.command.ICommand; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,17 +19,23 @@ public class VersionExternalCommandService implements ICommand { @Autowired private HealthCheckClientCommandService healthCheckClientCommandService; + @Autowired private VisualizationState visualizationState; + /** * @see ICommand */ public void process() throws ApiServerException { + visualizationState.getLabel().pushNext(); + try { ApplicationInfoResult applicationInfoResult = versionClientCommandService.process(null); - System.out.printf( - "API Server version: %s\n", applicationInfoResult.getExternalApi().getHash()); + visualizationState.addResult( + String.format( + "API Server version: %s", applicationInfoResult.getExternalApi().getHash())); } finally { - System.out.printf("Client version: %s\n", properties.getGitCommitId()); + visualizationState.addResult( + String.format("Client version: %s", properties.getGitCommitId())); } } } diff --git a/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/ReadinessCheckInternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/ReadinessCheckInternalCommandService.java index 434de4eb..1c2c2748 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/ReadinessCheckInternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/ReadinessCheckInternalCommandService.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +/** Represents readiness check internal command service. */ @Service public class ReadinessCheckInternalCommandService implements ICommand { @Autowired private ConfigService configService; diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java b/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java new file mode 100644 index 00000000..4fee7fe6 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java @@ -0,0 +1,48 @@ +package com.resourcetracker.service.visualization; + +import com.resourcetracker.entity.PropertiesEntity; +import com.resourcetracker.service.visualization.state.VisualizationState; +import java.util.concurrent.*; +import lombok.SneakyThrows; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** Represents visualization service used to indicate current execution steps. */ +@Service +public class VisualizationService { + @Autowired private PropertiesEntity properties; + + @Autowired private VisualizationState visualizationState; + + private final ScheduledExecutorService scheduledExecutorService = + Executors.newScheduledThreadPool(2); + + private final CountDownLatch latch = new CountDownLatch(1); + + /** Starts progress visualization processor. */ + public void process() { + scheduledExecutorService.scheduleAtFixedRate( + () -> { + if (visualizationState.getLabel().isNext()) { + System.out.println(visualizationState.getLabel().getCurrent()); + } + + if (visualizationState.getLabel().isEmpty()) { + latch.countDown(); + } + }, + 0, + properties.getProgressVisualizationPeriod(), + TimeUnit.MILLISECONDS); + } + + /** Awaits for visualization service to end its processes. */ + @SneakyThrows + public void await() { + latch.await(); + + System.out.print("\n"); + + visualizationState.getResult().forEach(System.out::println); + } +} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/IVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/IVisualizationLabel.java new file mode 100644 index 00000000..9e0eb8d5 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/IVisualizationLabel.java @@ -0,0 +1,28 @@ +package com.resourcetracker.service.visualization.common; + +/** Represents iterative interface for visualization label. */ +public interface IVisualizationLabel { + /** + * Checks if there are steps available in the storage. + * + * @return result of the check. + */ + boolean isEmpty(); + + /** + * Checks if there is next step in the specified label. + * + * @return result of the check. + */ + boolean isNext(); + + /** Pushes next step in the specified label. */ + void pushNext(); + + /** + * Returns string interpretation of the current step. + * + * @return string interpretation of the current step. + */ + String getCurrent(); +} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java new file mode 100644 index 00000000..9a36261a --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java @@ -0,0 +1,72 @@ +package com.resourcetracker.service.visualization.common.label; + +import com.resourcetracker.dto.VisualizationLabelDto; +import com.resourcetracker.entity.PropertiesEntity; +import com.resourcetracker.service.visualization.common.IVisualizationLabel; +import java.util.ArrayDeque; +import java.util.concurrent.locks.ReentrantLock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** Represents label set used for apply command service. */ +@Service +public class StartCommandVisualizationLabel implements IVisualizationLabel { + private final ArrayDeque stepsQueue = new ArrayDeque<>(); + + private final ArrayDeque batchQueue = new ArrayDeque<>(); + + private final ReentrantLock mutex = new ReentrantLock(); + + public StartCommandVisualizationLabel(@Autowired PropertiesEntity properties) { + stepsQueue.add( + VisualizationLabelDto.of( + properties.getProgressVisualizationSecretsAcquireRequestLabel(), 20)); + stepsQueue.add( + VisualizationLabelDto.of( + properties.getProgressVisualizationScriptAcquireRequestLabel(), 40)); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isEmpty() { + return stepsQueue.isEmpty(); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isNext() { + mutex.lock(); + + try { + return !batchQueue.isEmpty(); + } finally { + mutex.unlock(); + } + } + + /** + * @see IVisualizationLabel + */ + @Override + public void pushNext() { + if (!isEmpty()) { + mutex.lock(); + + batchQueue.push(stepsQueue.pop().toString()); + + mutex.unlock(); + } + } + + /** + * @see IVisualizationLabel + */ + @Override + public String getCurrent() { + return batchQueue.pop(); + } +} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java new file mode 100644 index 00000000..23211ec4 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java @@ -0,0 +1,4 @@ +package com.resourcetracker.service.visualization.common.label; + +/** Represents label set used for apply command service. */ +public class StopCommandVisualizationLabel {} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java new file mode 100644 index 00000000..0cbfc458 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java @@ -0,0 +1,69 @@ +package com.resourcetracker.service.visualization.common.label; + +import com.resourcetracker.dto.VisualizationLabelDto; +import com.resourcetracker.entity.PropertiesEntity; +import com.resourcetracker.service.visualization.common.IVisualizationLabel; +import java.util.ArrayDeque; +import java.util.concurrent.locks.ReentrantLock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** Represents label set used for apply command service. */ +@Service +public class VersionCommandVisualizationLabel implements IVisualizationLabel { + private final ArrayDeque stepsQueue = new ArrayDeque<>(); + + private final ArrayDeque batchQueue = new ArrayDeque<>(); + + private final ReentrantLock mutex = new ReentrantLock(); + + public VersionCommandVisualizationLabel(@Autowired PropertiesEntity properties) { + stepsQueue.add( + VisualizationLabelDto.of( + properties.getProgressVisualizationVersionInfoRequestLabel(), 100)); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isEmpty() { + return stepsQueue.isEmpty(); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isNext() { + mutex.lock(); + + try { + return !batchQueue.isEmpty(); + } finally { + mutex.unlock(); + } + } + + /** + * @see IVisualizationLabel + */ + @Override + public void pushNext() { + if (!isEmpty()) { + mutex.lock(); + + batchQueue.push(stepsQueue.pop().toString()); + + mutex.unlock(); + } + } + + /** + * @see IVisualizationLabel + */ + @Override + public String getCurrent() { + return batchQueue.pop(); + } +} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/state/VisualizationState.java b/cli/src/main/java/com/resourcetracker/service/visualization/state/VisualizationState.java new file mode 100644 index 00000000..9d2be5d6 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/state/VisualizationState.java @@ -0,0 +1,28 @@ +package com.resourcetracker.service.visualization.state; + +import com.resourcetracker.service.visualization.common.IVisualizationLabel; +import java.util.*; +import lombok.Getter; +import lombok.Setter; +import org.springframework.stereotype.Service; + +/** + * Represents general visualization state used to gather output values to be processed by + * visualization service. + */ +@Getter +@Service +public class VisualizationState { + @Setter private IVisualizationLabel label; + + private final List result = new ArrayList<>(); + + /** + * Adds given message to the result array. + * + * @param message given message to be added to result array. + */ + public void addResult(String message) { + result.add(message); + } +} diff --git a/cli/src/main/resources/application.properties b/cli/src/main/resources/application.properties index cf1354f1..98b70de0 100644 --- a/cli/src/main/resources/application.properties +++ b/cli/src/main/resources/application.properties @@ -5,4 +5,15 @@ spring.main.web-application-type=NONE # Describes the path and name of a configuration file. config.root=.resourcetracker/config config.user.file=user.yaml -config.api-server.file=api-server.yaml \ No newline at end of file + +# Describes visualizer state update period +progress.visualization.period=1000 + +# Describes visualization label used for secrets validation request process. +progress.visualization.secrets-acquire-request=Checking if the given cloud credentials are valid + +# Describes visualization label used for script validation request process. +progress.visualization.script-acquire-request=Checking if the given script is allowed to be used + +# Describes visualization label used for version request process. +progress.visualization.version-info-request=Sending request to API Server to retrieve its version information \ No newline at end of file diff --git a/config/tf/aws/ecs/main.tf b/config/tf/aws/ecs/main.tf index efd60386..ca0487b0 100644 --- a/config/tf/aws/ecs/main.tf +++ b/config/tf/aws/ecs/main.tf @@ -72,68 +72,12 @@ resource "aws_ecs_task_definition" "resourcetracker_ecs_instance_task_definition container_definitions = jsonencode([ { - name: "resourcetracker-init", - essential: true, - command: ["/bin/ash", "-c", "echo 'ResourceTracker initialization ${var.resourcetracker_agent_version}' && sleep 60m"], - image: "busybox" + name : "resourcetracker-init", + essential : true, + command : [ + "/bin/ash", "-c", "echo 'ResourceTracker initialization ${var.resourcetracker_agent_version}' && sleep 60m" + ], + image : "busybox" } ]) -# container_definitions = jsonencode([ -# { -# name: "resourcetracker-agent", -# essential: true, -# depends_on: { -# condition: "START", -# container_name: "resourcetracker-kafka", -# }, -# environment: [ -# { -# name: "RESOURCETRACKER_AGENT_CONTEXT", -# value: var.resourcetracker_agent_context, -# }, -# ], -# image: "ghcr.io/yarikrevich/resourcetracker-agent:${var.resourcetracker_agent_version}", -# logConfiguration: { -# "logDriver": "awslogs", -# "options": { -# "awslogs-group": "agent-logs-test", -# "awslogs-region": "us-west-2", -# "awslogs-stream-prefix": "ecs/resourcetracker-agent" -# } -# } -# }, -# { -# name: "resourcetracker-kafka", -# essential: true, -# environment: [ -## { -## name: "KRAFT_CONTAINER_HOST_NAME", -## value: data.aws_network_interface.resourcetracker_ecs_instance_interface.association[0].public_ip, -## }, -# { -# name: "KRAFT_CREATE_TOPICS", -# value: "logs", -# }, -# { -# name: "KRAFT_PARTITIONS_PER_TOPIC", -# value: "1" -# } -# ], -# image: "ghcr.io/yarikrevich/resourcetracker-kafka-starter:latest", -# portMappings: [ -# { -# containerPort: 9093, -# hostPort: 9093 -# } -# ], -# logConfiguration: { -# "logDriver": "awslogs", -# "options": { -# "awslogs-group": "kafka-logs-test", -# "awslogs-region": "us-west-2", -# "awslogs-stream-prefix": "ecs/resourcetracker-kafka" -# } -# } -# } -# ]) -} +} \ No newline at end of file diff --git a/config/tf/aws/ecs/output.tf b/config/tf/aws/ecs/output.tf index 9b5800d7..5eac46ef 100644 --- a/config/tf/aws/ecs/output.tf +++ b/config/tf/aws/ecs/output.tf @@ -1,6 +1,5 @@ output "ecs_task_definition"{ value = aws_ecs_task_definition.resourcetracker_ecs_instance_task_definitions.arn -# value = aws_ecs_service.resourcetracker_ecs_instance.task_definition } output "ecs_service"{ @@ -9,9 +8,4 @@ output "ecs_service"{ output "ecs_cluster" { value = aws_ecs_cluster.resourcetracker_ecs_cluster.id -} - -#output "public_ip" { -# value = data.aws_network_interface.resourcetracker_ecs_instance_interface.association[0].public_ip -## value = aws_network_interface.interface_tags.association[0].public_ip -#} \ No newline at end of file +} \ No newline at end of file diff --git a/config/tf/aws/main.tf b/config/tf/aws/main.tf index d01cb4e2..f57a91c2 100644 --- a/config/tf/aws/main.tf +++ b/config/tf/aws/main.tf @@ -2,7 +2,7 @@ provider "aws" {} module "ecs" { source = "./ecs" -# resourcetracker_agent_version = var.resourcetracker_agent_version + resourcetracker_agent_version = var.resourcetracker_agent_version resourcetracker_agent_context = var.resourcetracker_agent_context } From f64ed75e2eaaee424848d48750924c0d588f3480 Mon Sep 17 00:00:00 2001 From: Yaroslav Svitlytskyi Date: Sat, 20 Jan 2024 05:04:28 +0100 Subject: [PATCH 5/5] fix: fixed bugs --- .../common/IKafkaStarterClientService.java | 3 +- .../service/kafka/KafkaService.java | 32 +++---- api-server/src/main/openapi/openapi.yml | 11 +-- .../main/java/com/resourcetracker/App.java | 6 ++ .../entity/PropertiesEntity.java | 24 ++++++ .../service/command/BaseCommandService.java | 12 +++ .../aws/AWSStartExternalCommandService.java | 4 +- .../state/StateExternalCommandService.java | 33 ++----- .../aws/AWSStateExternalCommandService.java | 86 +++++++++++++++++++ .../aws/AWSStopExternalCommandService.java | 6 +- .../HealthCheckInternalCommandService.java | 10 +-- ...SReadinessCheckInternalCommandService.java | 64 ++------------ .../visualization/VisualizationService.java | 6 +- .../label/StartCommandVisualizationLabel.java | 34 +++++--- .../label/StateCommandVisualizationLabel.java | 82 ++++++++++++++++++ .../label/StopCommandVisualizationLabel.java | 80 ++++++++++++++++- .../VersionCommandVisualizationLabel.java | 28 +++--- cli/src/main/resources/application.properties | 26 +++++- 18 files changed, 407 insertions(+), 140 deletions(-) create mode 100644 cli/src/main/java/com/resourcetracker/service/command/external/state/provider/aws/AWSStateExternalCommandService.java create mode 100644 cli/src/main/java/com/resourcetracker/service/visualization/common/label/StateCommandVisualizationLabel.java diff --git a/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java b/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java index ddf1184e..ac554c03 100644 --- a/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java +++ b/api-server/src/main/java/com/resourcetracker/service/client/kafkastarter/common/IKafkaStarterClientService.java @@ -3,11 +3,12 @@ import jakarta.ws.rs.POST; import jakarta.ws.rs.Path; import jakarta.ws.rs.QueryParam; +import java.io.Closeable; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; /** Represents client for Kafka starter endpoints. */ @RegisterRestClient -public interface IKafkaStarterClientService { +public interface IKafkaStarterClientService extends Closeable { @POST @Path("/deploy") void qDeployPost(@QueryParam("host") String host); diff --git a/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java b/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java index 422bc0fc..5850d35c 100644 --- a/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java +++ b/api-server/src/main/java/com/resourcetracker/service/kafka/KafkaService.java @@ -10,11 +10,13 @@ import java.util.concurrent.ExecutionException; import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache.kafka.clients.consumer.KafkaConsumer; import org.apache.kafka.common.Node; import org.apache.kafka.common.errors.TimeoutException; import org.apache.kafka.common.errors.UnsupportedVersionException; +import org.springframework.kafka.support.serializer.JsonDeserializer; /** */ public class KafkaService { @@ -31,8 +33,6 @@ public KafkaService(String kafkaBootstrapServerHost, PropertiesEntity properties String.format( "%s:%d", kafkaBootstrapServerHost, properties.getResourceTrackerKafkaMainPort()); - System.out.println(kafkaBootstrapServerHost); - Properties kafkaAdminClientProps = new Properties(); kafkaAdminClientProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapServer); @@ -44,7 +44,15 @@ public KafkaService(String kafkaBootstrapServerHost, PropertiesEntity properties Properties kafkaConsumerProps = new Properties(); - kafkaConsumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, UUID.randomUUID().toString()); + String groupId = UUID.randomUUID().toString(); + + kafkaConsumerProps.put( + ConsumerConfig.GROUP_INSTANCE_ID_CONFIG, + String.format("scheduler_coordinator_%s", groupId)); + kafkaConsumerProps.put(JsonDeserializer.TRUSTED_PACKAGES, "*"); + kafkaConsumerProps.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); + kafkaConsumerProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); + kafkaConsumerProps.put(ConsumerConfig.GROUP_ID_CONFIG, groupId); kafkaConsumerProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBootstrapServer); kafkaConsumerProps.put( ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, @@ -115,21 +123,15 @@ public boolean isAvailable() { * @return retrieved messages. */ public List consumeLogs() { - List kafkaLogsTopicEntities = new ArrayList<>(); + List result = new ArrayList<>(); - ConsumerRecords records = kafkaConsumer.poll(Duration.ofSeconds(5)); + ConsumerRecords records = kafkaConsumer.poll(Duration.ofSeconds(30)); - System.out.println(records.count()); - - // ListIterator> iter = - // (ListIterator>) records.iterator(); - // - // while (iter.hasNext()) { - // ConsumerRecord record = iter.next(); - // kafkaLogsTopicEntities.add(record.value()); - // } + for (ConsumerRecord record : records) { + result.add(record.value()); + } - return kafkaLogsTopicEntities; + return result; } @PreDestroy diff --git a/api-server/src/main/openapi/openapi.yml b/api-server/src/main/openapi/openapi.yml index 1e3a884e..aa119fb5 100644 --- a/api-server/src/main/openapi/openapi.yml +++ b/api-server/src/main/openapi/openapi.yml @@ -360,15 +360,16 @@ components: $ref: "#/components/schemas/CredentialsFields" ReadinessCheckResult: required: + - name - status - - checks + - data properties: + name: + type: string status: $ref: "#/components/schemas/ReadinessCheckStatus" - checks: - type: array - items: - $ref: "#/components/schemas/ReadinessCheckUnit" + data: + type: object ReadinessCheckUnit: required: - name diff --git a/cli/src/main/java/com/resourcetracker/App.java b/cli/src/main/java/com/resourcetracker/App.java index 58e124a2..ff7546dc 100644 --- a/cli/src/main/java/com/resourcetracker/App.java +++ b/cli/src/main/java/com/resourcetracker/App.java @@ -7,6 +7,7 @@ import com.resourcetracker.service.command.external.start.StartExternalCommandService; import com.resourcetracker.service.command.external.start.provider.aws.AWSStartExternalCommandService; import com.resourcetracker.service.command.external.state.StateExternalCommandService; +import com.resourcetracker.service.command.external.state.provider.aws.AWSStateExternalCommandService; import com.resourcetracker.service.command.external.stop.StopExternalCommandService; import com.resourcetracker.service.command.external.stop.provider.aws.AWSStopExternalCommandService; import com.resourcetracker.service.command.external.version.VersionExternalCommandService; @@ -17,6 +18,8 @@ import com.resourcetracker.service.config.common.ValidConfigService; import com.resourcetracker.service.visualization.VisualizationService; import com.resourcetracker.service.visualization.common.label.StartCommandVisualizationLabel; +import com.resourcetracker.service.visualization.common.label.StateCommandVisualizationLabel; +import com.resourcetracker.service.visualization.common.label.StopCommandVisualizationLabel; import com.resourcetracker.service.visualization.common.label.VersionCommandVisualizationLabel; import com.resourcetracker.service.visualization.state.VisualizationState; import org.apache.logging.log4j.LogManager; @@ -34,6 +37,7 @@ @Import({ BaseCommandService.class, StartExternalCommandService.class, + AWSStateExternalCommandService.class, StateExternalCommandService.class, StopExternalCommandService.class, VersionExternalCommandService.class, @@ -55,6 +59,8 @@ BuildProperties.class, PropertiesEntity.class, StartCommandVisualizationLabel.class, + StopCommandVisualizationLabel.class, + StateCommandVisualizationLabel.class, VersionCommandVisualizationLabel.class, VisualizationService.class, VisualizationState.class diff --git a/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java b/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java index eaf48f7f..542ac83b 100644 --- a/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java +++ b/cli/src/main/java/com/resourcetracker/entity/PropertiesEntity.java @@ -31,9 +31,33 @@ public class PropertiesEntity { @Value("${progress.visualization.script-acquire-request}") private String progressVisualizationScriptAcquireRequestLabel; + @Value("${progress.visualization.apply-request}") + private String progressVisualizationApplyRequestLabel; + + @Value("${progress.visualization.apply-response}") + private String progressVisualizationApplyResponseLabel; + + @Value("${progress.visualization.destroy-request}") + private String progressVisualizationDestroyRequestLabel; + + @Value("${progress.visualization.destroy-response}") + private String progressVisualizationDestroyResponseLabel; + + @Value("${progress.visualization.state-request}") + private String progressVisualizationStateRequestLabel; + + @Value("${progress.visualization.state-response}") + private String progressVisualizationStateResponseLabel; + @Value("${progress.visualization.version-info-request}") private String progressVisualizationVersionInfoRequestLabel; + @Value("${progress.visualization.health-check-request}") + private String progressVisualizationHealthCheckRequestLabel; + + @Value("${progress.visualization.readiness-check-request}") + private String progressVisualizationReadinessCheckRequestLabel; + @Bean private static PropertySourcesPlaceholderConfigurer placeholderConfigurer() { PropertySourcesPlaceholderConfigurer propsConfig = new PropertySourcesPlaceholderConfigurer(); diff --git a/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java index 3cd61bc9..f62246ee 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/BaseCommandService.java @@ -9,6 +9,8 @@ import com.resourcetracker.service.command.internal.readiness.ReadinessCheckInternalCommandService; import com.resourcetracker.service.visualization.VisualizationService; import com.resourcetracker.service.visualization.common.label.StartCommandVisualizationLabel; +import com.resourcetracker.service.visualization.common.label.StateCommandVisualizationLabel; +import com.resourcetracker.service.visualization.common.label.StopCommandVisualizationLabel; import com.resourcetracker.service.visualization.common.label.VersionCommandVisualizationLabel; import com.resourcetracker.service.visualization.state.VisualizationState; import org.apache.logging.log4j.LogManager; @@ -41,6 +43,10 @@ public class BaseCommandService { @Autowired private StartCommandVisualizationLabel startCommandVisualizationLabel; + @Autowired private StopCommandVisualizationLabel stopCommandVisualizationLabel; + + @Autowired private StateCommandVisualizationLabel stateCommandVisualizationLabel; + @Autowired private VersionCommandVisualizationLabel versionCommandVisualizationLabel; @Autowired private VisualizationService visualizationService; @@ -69,6 +75,8 @@ private void start() { /** Provides access to state command service. */ @Command(description = "Retrieve state of remote requests executions") private void state() { + visualizationState.setLabel(stateCommandVisualizationLabel); + visualizationService.process(); try { @@ -87,6 +95,8 @@ private void state() { /** Provides access to stop command service. */ @Command(description = "Stop remote requests execution") private void stop() { + visualizationState.setLabel(stopCommandVisualizationLabel); + visualizationService.process(); try { @@ -111,6 +121,8 @@ private void version() { visualizationService.process(); try { + healthCheckInternalCommandService.process(); + versionCommandService.process(); } catch (ApiServerException e) { logger.fatal(e.getMessage()); diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java index d333d5e4..a7b46a73 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/start/provider/aws/AWSStartExternalCommandService.java @@ -82,6 +82,8 @@ public void process() throws ApiServerException { scriptAcquireClientCommandService.process(validationScriptApplicationDto); if (validationScriptApplicationResult.getValid()) { + visualizationState.getLabel().pushNext(); + CredentialsFields credentialsFields = CredentialsFields.of( AWSSecrets.of( @@ -94,7 +96,7 @@ public void process() throws ApiServerException { applyClientCommandService.process(terraformDeploymentApplication); - visualizationState.addResult("Deployment with the given configuration was started!"); + visualizationState.getLabel().pushNext(); } else { logger.fatal(new ScriptDataValidationException().getMessage()); } diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java index acaf47ee..a96e5ec7 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/state/StateExternalCommandService.java @@ -1,46 +1,25 @@ package com.resourcetracker.service.command.external.state; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.resourcetracker.exception.ApiServerException; -import com.resourcetracker.exception.ApiServerNotAvailableException; -import com.resourcetracker.model.TopicLogsResult; -import com.resourcetracker.service.client.command.LogsClientCommandService; import com.resourcetracker.service.command.ICommand; -import com.resourcetracker.service.visualization.state.VisualizationState; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.resourcetracker.service.command.external.state.provider.aws.AWSStateExternalCommandService; +import com.resourcetracker.service.config.ConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClientResponseException; /** Represents state external command service. */ @Service public class StateExternalCommandService implements ICommand { - private static final Logger logger = LogManager.getLogger(StateExternalCommandService.class); + @Autowired private ConfigService configService; - @Autowired private LogsClientCommandService logsClientCommandService; - - @Autowired private VisualizationState visualizationState; + @Autowired private AWSStateExternalCommandService awsStateExternalCommandService; /** * @see ICommand */ public void process() throws ApiServerException { - TopicLogsResult topicLogsResult; - - try { - topicLogsResult = logsClientCommandService.process(null); - } catch (WebClientResponseException e) { - throw new ApiServerException( - new ApiServerNotAvailableException(e.getResponseBodyAsString()).getMessage()); - } - - ObjectMapper mapper = new ObjectMapper(); - try { - visualizationState.addResult(mapper.writeValueAsString(topicLogsResult)); - } catch (JsonProcessingException e) { - logger.fatal(e.getMessage()); + switch (configService.getConfig().getCloud().getProvider()) { + case AWS -> awsStateExternalCommandService.process(); } } } diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/state/provider/aws/AWSStateExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/state/provider/aws/AWSStateExternalCommandService.java new file mode 100644 index 00000000..5754d871 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/command/external/state/provider/aws/AWSStateExternalCommandService.java @@ -0,0 +1,86 @@ +package com.resourcetracker.service.command.external.state.provider.aws; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.resourcetracker.converter.CredentialsConverter; +import com.resourcetracker.dto.ValidationSecretsApplicationDto; +import com.resourcetracker.entity.ConfigEntity; +import com.resourcetracker.exception.ApiServerException; +import com.resourcetracker.exception.ApiServerNotAvailableException; +import com.resourcetracker.model.*; +import com.resourcetracker.service.client.command.LogsClientCommandService; +import com.resourcetracker.service.client.command.SecretsAcquireClientCommandService; +import com.resourcetracker.service.command.ICommand; +import com.resourcetracker.service.config.ConfigService; +import com.resourcetracker.service.visualization.state.VisualizationState; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.reactive.function.client.WebClientResponseException; + +/** Represents start external command service for AWS provider. */ +@Service +public class AWSStateExternalCommandService implements ICommand { + @Autowired private ConfigService configService; + + @Autowired private SecretsAcquireClientCommandService secretsAcquireClientCommandService; + + @Autowired private LogsClientCommandService logsClientCommandService; + + @Autowired private VisualizationState visualizationState; + + /** + * @see ICommand + */ + @Override + public void process() throws ApiServerException { + visualizationState.getLabel().pushNext(); + + ConfigEntity.Cloud.AWSCredentials credentials = + CredentialsConverter.convert( + configService.getConfig().getCloud().getCredentials(), + ConfigEntity.Cloud.AWSCredentials.class); + + ValidationSecretsApplicationDto validationSecretsApplicationDto = + ValidationSecretsApplicationDto.of(Provider.AWS, credentials.getFile()); + + ValidationSecretsApplicationResult validationSecretsApplicationResult = + secretsAcquireClientCommandService.process(validationSecretsApplicationDto); + + if (validationSecretsApplicationResult.getValid()) { + visualizationState.getLabel().pushNext(); + + CredentialsFields credentialsFields = + CredentialsFields.of( + AWSSecrets.of( + validationSecretsApplicationResult.getSecrets().getAccessKey(), + validationSecretsApplicationResult.getSecrets().getSecretKey()), + credentials.getRegion()); + + TopicLogsResult topicLogsResult; + + TopicLogsApplication topicLogsApplication = + TopicLogsApplication.of(Provider.AWS, credentialsFields); + + try { + topicLogsResult = logsClientCommandService.process(topicLogsApplication); + } catch (WebClientResponseException e) { + throw new ApiServerException( + new ApiServerNotAvailableException(e.getResponseBodyAsString()).getMessage()); + } + + visualizationState.getLabel().pushNext(); + + ObjectMapper mapper = new ObjectMapper(); + topicLogsResult + .getResult() + .forEach( + element -> { + try { + visualizationState.addResult(mapper.writeValueAsString(element)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + }); + } + } +} diff --git a/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java index e922617f..b8d3ef3c 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/external/stop/provider/aws/AWSStopExternalCommandService.java @@ -39,6 +39,8 @@ public class AWSStopExternalCommandService implements ICommand { */ @Override public void process() throws ApiServerException { + visualizationState.getLabel().pushNext(); + ConfigEntity.Cloud.AWSCredentials credentials = CredentialsConverter.convert( configService.getConfig().getCloud().getCredentials(), @@ -51,6 +53,8 @@ public void process() throws ApiServerException { secretsAcquireClientCommandService.process(validationSecretsApplicationDto); if (validationSecretsApplicationResult.getValid()) { + visualizationState.getLabel().pushNext(); + CredentialsFields credentialsFields = CredentialsFields.of( AWSSecrets.of( @@ -68,7 +72,7 @@ public void process() throws ApiServerException { destroyClientCommandService.process(terraformDestructionApplication); - visualizationState.addResult("Deployment with the given configuration file was stopped!"); + visualizationState.getLabel().pushNext(); } else { logger.fatal(new CloudCredentialsValidationException().getMessage()); } diff --git a/cli/src/main/java/com/resourcetracker/service/command/internal/health/HealthCheckInternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/internal/health/HealthCheckInternalCommandService.java index 190df1c1..3ae680e5 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/internal/health/HealthCheckInternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/internal/health/HealthCheckInternalCommandService.java @@ -6,23 +6,23 @@ import com.resourcetracker.model.HealthCheckStatus; import com.resourcetracker.service.client.command.HealthCheckClientCommandService; import com.resourcetracker.service.command.ICommand; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class HealthCheckInternalCommandService implements ICommand { - private static final Logger logger = - LogManager.getLogger(HealthCheckInternalCommandService.class); - @Autowired private HealthCheckClientCommandService healthCheckClientCommandService; + @Autowired private VisualizationState visualizationState; + /** * @see ICommand */ @Override public void process() throws ApiServerException { + visualizationState.getLabel().pushNext(); + HealthCheckResult healthCheckResult = healthCheckClientCommandService.process(null); if (healthCheckResult.getStatus() == HealthCheckStatus.DOWN) { diff --git a/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/provider/aws/AWSReadinessCheckInternalCommandService.java b/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/provider/aws/AWSReadinessCheckInternalCommandService.java index 7c06a4fd..04ef4f25 100644 --- a/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/provider/aws/AWSReadinessCheckInternalCommandService.java +++ b/cli/src/main/java/com/resourcetracker/service/command/internal/readiness/provider/aws/AWSReadinessCheckInternalCommandService.java @@ -10,27 +10,27 @@ import com.resourcetracker.service.client.command.SecretsAcquireClientCommandService; import com.resourcetracker.service.command.ICommand; import com.resourcetracker.service.config.ConfigService; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.resourcetracker.service.visualization.state.VisualizationState; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class AWSReadinessCheckInternalCommandService implements ICommand { - private static final Logger logger = - LogManager.getLogger(AWSReadinessCheckInternalCommandService.class); - @Autowired private ConfigService configService; @Autowired private SecretsAcquireClientCommandService secretsAcquireClientCommandService; @Autowired private ReadinessCheckClientCommandService readinessCheckClientCommandService; + @Autowired private VisualizationState visualizationState; + /** * @see ICommand */ @Override public void process() throws ApiServerException { + visualizationState.getLabel().pushNext(); + ConfigEntity.Cloud.AWSCredentials credentials = CredentialsConverter.convert( configService.getConfig().getCloud().getCredentials(), @@ -58,61 +58,9 @@ public void process() throws ApiServerException { if (readinessCheckResult.getStatus() == ReadinessCheckStatus.DOWN) { throw new ApiServerException( - new ApiServerNotAvailableException(readinessCheckResult.getChecks().toString()) + new ApiServerNotAvailableException(readinessCheckResult.getData().toString()) .getMessage()); } } } - // - // ConfigEntity.Cloud.AWSCredentials credentials = - // CredentialsConverter.convert( - // configService.getConfig().getCloud().getCredentials(), - // ConfigEntity.Cloud.AWSCredentials.class); - // - // ValidationSecretsApplicationDto validationSecretsApplicationDto = - // ValidationSecretsApplicationDto.of(Provider.AWS, credentials.getFile()); - // - // ValidationSecretsApplicationResult validationSecretsApplicationResult = - // secretsAcquireClientCommandService.process(validationSecretsApplicationDto); - // - // if (validationSecretsApplicationResult.getValid()) { - // List requests = - // configService.getConfig().getRequests().stream() - // .map( - // element -> { - // try { - // return DeploymentRequest.of( - // element.getName(), - // Files.readString(Paths.get(element.getFile())), - // element.getFrequency()); - // } catch (IOException e) { - // throw new RuntimeException(e); - // } - // }) - // .toList(); - // - // ValidationScriptApplicationDto validationScriptApplicationDto = - // ValidationScriptApplicationDto.of( - // requests.stream().map(DeploymentRequest::getScript).toList()); - // - // ValidationScriptApplicationResult validationScriptApplicationResult = - // scriptAcquireClientCommandService.process(validationScriptApplicationDto); - // - // if (validationScriptApplicationResult.getValid()) { - // CredentialsFields credentialsFields = - // CredentialsFields.of( - // AWSSecrets.of( - // - // validationSecretsApplicationResult.getSecrets().getAccessKey(), - // - // validationSecretsApplicationResult.getSecrets().getSecretKey()), - // credentials.getRegion()); - // - // - // - // - // - // - // - } diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java b/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java index 4fee7fe6..9d644fc5 100644 --- a/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java +++ b/cli/src/main/java/com/resourcetracker/service/visualization/VisualizationService.java @@ -27,7 +27,7 @@ public void process() { System.out.println(visualizationState.getLabel().getCurrent()); } - if (visualizationState.getLabel().isEmpty()) { + if (visualizationState.getLabel().isEmpty() && !visualizationState.getLabel().isNext()) { latch.countDown(); } }, @@ -41,7 +41,9 @@ public void process() { public void await() { latch.await(); - System.out.print("\n"); + if (!visualizationState.getResult().isEmpty()) { + System.out.print("\n"); + } visualizationState.getResult().forEach(System.out::println); } diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java index 9a36261a..37ce0975 100644 --- a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StartCommandVisualizationLabel.java @@ -4,6 +4,7 @@ import com.resourcetracker.entity.PropertiesEntity; import com.resourcetracker.service.visualization.common.IVisualizationLabel; import java.util.ArrayDeque; +import java.util.List; import java.util.concurrent.locks.ReentrantLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,12 +19,17 @@ public class StartCommandVisualizationLabel implements IVisualizationLabel { private final ReentrantLock mutex = new ReentrantLock(); public StartCommandVisualizationLabel(@Autowired PropertiesEntity properties) { - stepsQueue.add( - VisualizationLabelDto.of( - properties.getProgressVisualizationSecretsAcquireRequestLabel(), 20)); - stepsQueue.add( - VisualizationLabelDto.of( - properties.getProgressVisualizationScriptAcquireRequestLabel(), 40)); + stepsQueue.addAll( + List.of( + VisualizationLabelDto.of( + properties.getProgressVisualizationHealthCheckRequestLabel(), 10), + VisualizationLabelDto.of( + properties.getProgressVisualizationSecretsAcquireRequestLabel(), 30), + VisualizationLabelDto.of( + properties.getProgressVisualizationScriptAcquireRequestLabel(), 60), + VisualizationLabelDto.of(properties.getProgressVisualizationApplyRequestLabel(), 90), + VisualizationLabelDto.of( + properties.getProgressVisualizationApplyResponseLabel(), 100))); } /** @@ -53,13 +59,11 @@ public boolean isNext() { */ @Override public void pushNext() { - if (!isEmpty()) { - mutex.lock(); + mutex.lock(); - batchQueue.push(stepsQueue.pop().toString()); + batchQueue.push(stepsQueue.pop().toString()); - mutex.unlock(); - } + mutex.unlock(); } /** @@ -67,6 +71,12 @@ public void pushNext() { */ @Override public String getCurrent() { - return batchQueue.pop(); + mutex.lock(); + + try { + return batchQueue.pollLast(); + } finally { + mutex.unlock(); + } } } diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StateCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StateCommandVisualizationLabel.java new file mode 100644 index 00000000..73a4b2d2 --- /dev/null +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StateCommandVisualizationLabel.java @@ -0,0 +1,82 @@ +package com.resourcetracker.service.visualization.common.label; + +import com.resourcetracker.dto.VisualizationLabelDto; +import com.resourcetracker.entity.PropertiesEntity; +import com.resourcetracker.service.visualization.common.IVisualizationLabel; +import java.util.ArrayDeque; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** Represents label set used for apply command service. */ +@Service +public class StateCommandVisualizationLabel implements IVisualizationLabel { + private final ArrayDeque stepsQueue = new ArrayDeque<>(); + + private final ArrayDeque batchQueue = new ArrayDeque<>(); + + private final ReentrantLock mutex = new ReentrantLock(); + + public StateCommandVisualizationLabel(@Autowired PropertiesEntity properties) { + stepsQueue.addAll( + List.of( + VisualizationLabelDto.of( + properties.getProgressVisualizationHealthCheckRequestLabel(), 10), + VisualizationLabelDto.of( + properties.getProgressVisualizationReadinessCheckRequestLabel(), 30), + VisualizationLabelDto.of( + properties.getProgressVisualizationSecretsAcquireRequestLabel(), 50), + VisualizationLabelDto.of(properties.getProgressVisualizationStateRequestLabel(), 90), + VisualizationLabelDto.of( + properties.getProgressVisualizationStateResponseLabel(), 100))); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isEmpty() { + return stepsQueue.isEmpty(); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isNext() { + mutex.lock(); + + try { + return !batchQueue.isEmpty(); + } finally { + mutex.unlock(); + } + } + + /** + * @see IVisualizationLabel + */ + @Override + public void pushNext() { + mutex.lock(); + + batchQueue.push(stepsQueue.pop().toString()); + + mutex.unlock(); + } + + /** + * @see IVisualizationLabel + */ + @Override + public String getCurrent() { + mutex.lock(); + + try { + return batchQueue.pollLast(); + } finally { + mutex.unlock(); + } + } +} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java index 23211ec4..9c6e4d3e 100644 --- a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/StopCommandVisualizationLabel.java @@ -1,4 +1,80 @@ package com.resourcetracker.service.visualization.common.label; -/** Represents label set used for apply command service. */ -public class StopCommandVisualizationLabel {} +import com.resourcetracker.dto.VisualizationLabelDto; +import com.resourcetracker.entity.PropertiesEntity; +import com.resourcetracker.service.visualization.common.IVisualizationLabel; +import java.util.ArrayDeque; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** Represents label set used for destroy command service. */ +@Service +public class StopCommandVisualizationLabel implements IVisualizationLabel { + private final ArrayDeque stepsQueue = new ArrayDeque<>(); + + private final ArrayDeque batchQueue = new ArrayDeque<>(); + + private final ReentrantLock mutex = new ReentrantLock(); + + public StopCommandVisualizationLabel(@Autowired PropertiesEntity properties) { + stepsQueue.addAll( + List.of( + VisualizationLabelDto.of( + properties.getProgressVisualizationHealthCheckRequestLabel(), 10), + VisualizationLabelDto.of( + properties.getProgressVisualizationSecretsAcquireRequestLabel(), 50), + VisualizationLabelDto.of(properties.getProgressVisualizationDestroyRequestLabel(), 90), + VisualizationLabelDto.of( + properties.getProgressVisualizationDestroyResponseLabel(), 100))); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isEmpty() { + return stepsQueue.isEmpty(); + } + + /** + * @see IVisualizationLabel + */ + @Override + public boolean isNext() { + mutex.lock(); + + try { + return !batchQueue.isEmpty(); + } finally { + mutex.unlock(); + } + } + + /** + * @see IVisualizationLabel + */ + @Override + public void pushNext() { + mutex.lock(); + + batchQueue.push(stepsQueue.pop().toString()); + + mutex.unlock(); + } + + /** + * @see IVisualizationLabel + */ + @Override + public String getCurrent() { + mutex.lock(); + + try { + return batchQueue.pollLast(); + } finally { + mutex.unlock(); + } + } +} diff --git a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java index 0cbfc458..a7c6b091 100644 --- a/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java +++ b/cli/src/main/java/com/resourcetracker/service/visualization/common/label/VersionCommandVisualizationLabel.java @@ -4,11 +4,12 @@ import com.resourcetracker.entity.PropertiesEntity; import com.resourcetracker.service.visualization.common.IVisualizationLabel; import java.util.ArrayDeque; +import java.util.List; import java.util.concurrent.locks.ReentrantLock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -/** Represents label set used for apply command service. */ +/** Represents label set used for version command service. */ @Service public class VersionCommandVisualizationLabel implements IVisualizationLabel { private final ArrayDeque stepsQueue = new ArrayDeque<>(); @@ -18,9 +19,12 @@ public class VersionCommandVisualizationLabel implements IVisualizationLabel { private final ReentrantLock mutex = new ReentrantLock(); public VersionCommandVisualizationLabel(@Autowired PropertiesEntity properties) { - stepsQueue.add( - VisualizationLabelDto.of( - properties.getProgressVisualizationVersionInfoRequestLabel(), 100)); + stepsQueue.addAll( + List.of( + VisualizationLabelDto.of( + properties.getProgressVisualizationHealthCheckRequestLabel(), 10), + VisualizationLabelDto.of( + properties.getProgressVisualizationVersionInfoRequestLabel(), 100))); } /** @@ -50,13 +54,11 @@ public boolean isNext() { */ @Override public void pushNext() { - if (!isEmpty()) { - mutex.lock(); + mutex.lock(); - batchQueue.push(stepsQueue.pop().toString()); + batchQueue.push(stepsQueue.pop().toString()); - mutex.unlock(); - } + mutex.unlock(); } /** @@ -64,6 +66,12 @@ public void pushNext() { */ @Override public String getCurrent() { - return batchQueue.pop(); + mutex.lock(); + + try { + return batchQueue.pollLast(); + } finally { + mutex.unlock(); + } } } diff --git a/cli/src/main/resources/application.properties b/cli/src/main/resources/application.properties index 98b70de0..07e434b9 100644 --- a/cli/src/main/resources/application.properties +++ b/cli/src/main/resources/application.properties @@ -15,5 +15,29 @@ progress.visualization.secrets-acquire-request=Checking if the given cloud crede # Describes visualization label used for script validation request process. progress.visualization.script-acquire-request=Checking if the given script is allowed to be used +# Describes visualization label used for infrastructure deployment request process. +progress.visualization.apply-request=Sending infrastructure deployment request + +# Describes visualization label used for infrastructure deployment response. +progress.visualization.apply-response=Application of deployment infrastructure has been completed + +# Describes visualization label used for infrastructure destruction request process. +progress.visualization.destroy-request=Sending infrastructure destruction request + +# Describes visualization label used for infrastructure destruction response. +progress.visualization.destroy-response=Destruction of deployed infrastructure has been completed + +# Describes visualization label used for general state retrieval request process. +progress.visualization.state-request=Sending general state retrieval request + +# Describes visualization label used for general state retrieval response. +progress.visualization.state-response=General state has been retrieved successfully + # Describes visualization label used for version request process. -progress.visualization.version-info-request=Sending request to API Server to retrieve its version information \ No newline at end of file +progress.visualization.version-info-request=Sending request to API Server to retrieve its version information + +# Describes visualization label used for health check request. +progress.visualization.health-check-request=Sending health check request + +# Describes visualization label used for readiness check request. +progress.visualization.readiness-check-request=Sending readiness check request \ No newline at end of file