From 09041ca1b5aeec64cde60a1865cacbb0ec66d2c3 Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Thu, 11 Jun 2026 15:11:12 +0200 Subject: [PATCH 1/2] feat: PCU groups implementation and related changes --- astra-db-java/pom.xml | 14 ++ .../astra/client/admin/AstraDBAdmin.java | 113 ++++++++++++++- .../admin/definition/DatabaseDefinition.java | 78 ++++++++++ .../admin/options/CreateDatabaseOptions.java | 21 +++ .../com/dtsx/astra/sdk/AstraOpsClient.java | 9 +- .../db/domain/DatabaseCreationBuilder.java | 32 +++++ .../db/domain/DatabaseCreationRequest.java | 37 ++++- .../dtsx/astra/sdk/pcu/PcuGroupOpsClient.java | 3 +- ...upsClient.java => PcuGroupsOpsClient.java} | 83 +++++++++-- .../pcu/domain/PcuCapacityWorkloadType.java | 34 +++++ .../dtsx/astra/sdk/pcu/domain/PcuGroup.java | 4 +- .../domain/PcuGroupCreateUpdateRequest.java | 34 ++++- .../pcu/domain/PcuGroupCreationRequest.java | 14 +- .../sdk/pcu/domain/PcuGroupUpdateRequest.java | 9 +- .../astra/sdk/pcu/domain/PcuInstanceType.java | 22 +++ .../sdk/pcu/domain/PcuProvisionType.java | 1 + .../dtsx/astra/sdk/pcu/domain/PcuType.java | 19 +++ .../sdk/pcu/domain/PcuTypeLocationFilter.java | 15 ++ .../astra/sdk/pcu/domain/PcuTypeResolver.java | 58 ++++++++ .../dtsx/astra/sdk/AbstractDevopsApiTest.java | 8 +- .../astra/sdk/pcu/PCUGroupClientTest.java | 135 ++++++++++++++++++ .../com/dtsx/astra/sdk/pcu/ParkingTest.java | 10 -- .../astra/sdk/pcu/PcuTypeResolverTest.java | 132 +++++++++++++++++ .../skills/spring-boot-data-api/README.md | 26 +++- .../{ => assets}/examples/basic/README.md | 0 .../templates/Controller.java.template | 0 .../templates/Document.java.template | 0 .../templates/Repository.java.template | 0 .../templates/Service.java.template | 0 .../templates/application.yml.template | 0 tools/data-api-tools/pom.xml | 9 ++ .../com/datastax/astra/tool/copy/README.md | 86 +++++++++++ .../src/test/resources/logback-test.xml | 15 ++ .../src/test/resources/test-config.properties | 49 +++++++ 34 files changed, 1019 insertions(+), 51 deletions(-) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/DatabaseDefinition.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/admin/options/CreateDatabaseOptions.java rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/{PcuGroupsClient.java => PcuGroupsOpsClient.java} (68%) create mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuCapacityWorkloadType.java create mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuInstanceType.java create mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuType.java create mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeLocationFilter.java create mode 100644 astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeResolver.java create mode 100644 astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientTest.java delete mode 100644 astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/ParkingTest.java create mode 100644 astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PcuTypeResolverTest.java rename integrations/skills/spring-boot-data-api/{ => assets}/examples/basic/README.md (100%) rename integrations/skills/spring-boot-data-api/{ => assets}/templates/Controller.java.template (100%) rename integrations/skills/spring-boot-data-api/{ => assets}/templates/Document.java.template (100%) rename integrations/skills/spring-boot-data-api/{ => assets}/templates/Repository.java.template (100%) rename integrations/skills/spring-boot-data-api/{ => assets}/templates/Service.java.template (100%) rename integrations/skills/spring-boot-data-api/{ => assets}/templates/application.yml.template (100%) create mode 100644 tools/data-api-tools/src/test/java/com/datastax/astra/tool/copy/README.md create mode 100644 tools/data-api-tools/src/test/resources/logback-test.xml create mode 100644 tools/data-api-tools/src/test/resources/test-config.properties diff --git a/astra-db-java/pom.xml b/astra-db-java/pom.xml index b235a7d3..c1b9e290 100644 --- a/astra-db-java/pom.xml +++ b/astra-db-java/pom.xml @@ -158,6 +158,20 @@ + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + test-jar + + + + diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java index 6c453237..0c66ae26 100644 --- a/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/AstraDBAdmin.java @@ -21,8 +21,10 @@ */ import com.datastax.astra.client.admin.commands.AstraAvailableRegionInfo; +import com.datastax.astra.client.admin.definition.DatabaseDefinition; import com.datastax.astra.client.admin.options.AdminOptions; import com.datastax.astra.client.admin.options.AstraFindAvailableRegionsOptions; +import com.datastax.astra.client.admin.options.CreateDatabaseOptions; import com.datastax.astra.client.core.options.DataAPIClientOptions; import com.datastax.astra.client.databases.definition.DatabaseInfo; import com.datastax.astra.client.databases.DatabaseOptions; @@ -38,6 +40,8 @@ import com.dtsx.astra.sdk.db.domain.FilterByOrgType; import com.dtsx.astra.sdk.db.domain.RegionType; import com.dtsx.astra.sdk.db.exception.DatabaseNotFoundException; +import com.dtsx.astra.sdk.pcu.PcuGroupsOpsClient; +import com.dtsx.astra.sdk.pcu.domain.PcuGroup; import com.dtsx.astra.sdk.utils.AstraRc; import com.dtsx.astra.sdk.utils.observability.ApiRequestObserver; import com.dtsx.astra.sdk.utils.observability.LoggingRequestObserver; @@ -46,7 +50,6 @@ import java.net.http.HttpClient; import java.time.Duration; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -77,6 +80,9 @@ public class AstraDBAdmin { /** Client for Astra Devops Api. */ final AstraDBOpsClient devopsDbClient; + /** Client for Astra Devops Api PCU. */ + final PcuGroupsOpsClient devopsPcuClient; + /** Options to personalized http client other client options. */ final AdminOptions adminOptions; @@ -110,14 +116,17 @@ public AstraDBAdmin(AdminOptions options) { if (dataAPIClientOptions.getObservers() != null) { Map devopsObservers = new HashMap<>(); if (dataAPIClientOptions.getObservers().containsKey(LoggingCommandObserver.class.getSimpleName())) { - System.out.println("Logging enabled for AstraDBAdmin operations."); devopsObservers.put("logging", new LoggingRequestObserver(AstraDBAdmin.class)); } this.devopsDbClient = new AstraDBOpsClient(options.getToken(), dataAPIClientOptions.getAstraEnvironment(), devopsObservers); + this.devopsPcuClient = new PcuGroupsOpsClient(options.getToken(), + dataAPIClientOptions.getAstraEnvironment(), devopsObservers); } else { this.devopsDbClient = new AstraDBOpsClient(options.getToken(), dataAPIClientOptions.getAstraEnvironment()); + this.devopsPcuClient = new PcuGroupsOpsClient(options.getToken(), + dataAPIClientOptions.getAstraEnvironment()); } // Local Agent for Resume @@ -158,6 +167,83 @@ public List findAvailableRegions(AstraFindAvailableReg .toList(); } + // -------------------- + // -- PCU Support --- + // -------------------- + + /** + * Lists PCU (Processing Capacity Units) groups filtered by cloud provider and region. + * PCU groups manage compute resources for databases across cloud providers and regions. + * + * @param cloud + * cloud provider to filter by (AWS, GCP, AZURE), or null for all providers + * @param cloudRegion + * cloud region to filter by (e.g., "us-east-1"), or null for all regions + * @return + * list of PCU groups matching the specified filters + */ + public List listPcuGroups(CloudProviderType cloud, String cloudRegion) { + List pcus = devopsPcuClient.findAll().toList(); + // Filter by cloud provider if specified + if (cloud != null) { + pcus = pcus.stream() + .filter(pcu -> cloud.equals(pcu.getCloudProvider())) + .collect(Collectors.toList()); + } + + // Filter by region if specified + if (cloudRegion != null && !cloudRegion.isBlank()) { + pcus = pcus.stream() + .filter(pcu -> cloudRegion.equals(pcu.getRegion())) + .collect(Collectors.toList()); + } + + return pcus; + } + + /** + * Lists all PCU (Processing Capacity Units) groups in the organization. + * This is a convenience method that returns all PCU groups without filtering. + * + * @return + * list of all PCU groups + */ + public List listPcuGroups() { + return listPcuGroups(null, null); + } + + /** + * Checks if a PCU group exists by its identifier. + * This is a convenience method that checks existence without filtering by cloud or region. + * + * @param pcuGroupId + * PCU group UUID to check + * @return + * true if the PCU group exists, false otherwise + */ + public boolean pcuGroupExists(UUID pcuGroupId) { + return pcuGroupExists(pcuGroupId, null, null); + } + + /** + * Checks if a PCU group exists by its identifier, optionally filtered by cloud provider and region. + * + * @param pcuGroupId + * PCU group UUID to check + * @param cloud + * cloud provider to filter by (AWS, GCP, AZURE), or null for all providers + * @param cloudRegion + * cloud region to filter by (e.g., "us-east-1"), or null for all regions + * @return + * true if the PCU group exists and matches the filters, false otherwise + */ + public boolean pcuGroupExists(UUID pcuGroupId, CloudProviderType cloud, String cloudRegion) { + Assert.notNull(pcuGroupId, "pcuGroupId"); + return listPcuGroups(cloud, cloudRegion) + .stream() + .anyMatch(pcuGroup -> pcuGroupId.equals(pcuGroup.getId())); + } + // -------------------- // -- Databases --- // -------------------- @@ -298,6 +384,29 @@ public DatabaseAdmin createDatabase(String name, CloudProviderType cloud, String return createDatabase(name, cloud, cloudRegion, true); } + /** + * Create new database with a name on free tier. The database name should not exist in the tenant. + * + * @param name + * unique name for the database + * @param definition + * definition of the database + * @return + * database admin object + */ + public DatabaseAdmin createDatabase(String name, DatabaseDefinition definition, CreateDatabaseOptions options) { + Assert.notNull(definition, "definition"); + Assert.hasLength(name, "name"); + DatabaseCreationRequest req = definition.asRequest(); + req.setName(name); + UUID newDbId = UUID.fromString(devopsDbClient.create(req)); + log.info("Database {} is starting (id={}): it will take about a minute please wait...", name, newDbId); + if (options != null && options.isWaitForDb()) { + waitForDatabase(devopsDbClient.database(newDbId.toString())); + } + return getDatabaseAdmin(newDbId); + } + /** * Delete a Database if exists from its identifier. * diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/DatabaseDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/DatabaseDefinition.java new file mode 100644 index 00000000..b884dee3 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/DatabaseDefinition.java @@ -0,0 +1,78 @@ +package com.datastax.astra.client.admin.definition; + +import com.dtsx.astra.sdk.db.domain.CloudProviderType; +import com.dtsx.astra.sdk.db.domain.DatabaseCreationBuilder; +import com.dtsx.astra.sdk.db.domain.DatabaseCreationRequest; +import com.dtsx.astra.sdk.db.domain.DatabaseCreationType; +import lombok.Builder; +import lombok.Data; + +import java.util.UUID; + +@Data +@Builder +public class DatabaseDefinition { + + /** Default region. **/ + public static final String DEFAULT_REGION = "us-east1"; + + /** Default tier. **/ + public static final String DEFAULT_TIER = "serverless"; + + /** Default cloud. **/ + public static final CloudProviderType DEFAULT_CLOUD = CloudProviderType.GCP; + + /** CloudProvider where the database lives. */ + private CloudProviderType cloudProvider = DEFAULT_CLOUD; + + /** Region. */ + private String region = DEFAULT_REGION; + + /** Database type. */ + private String tier = DEFAULT_TIER; + + /** Name of the database--user friendly identifier. */ + private String name; + + /** Keyspace name in database */ + private String keyspace; + + /** + * CapacityUnits is the amount of space available (horizontal scaling) + * for the database. For free tier the max CU's is 1, and 100 + * for CXX/DXX the max is 12 on startup. + */ + private Integer capacity = 1; + + /** + * Default is null, if vector will be added + */ + private DatabaseCreationType dbType; + + /** + * Identifier to assign a database to a PCU group directly. + */ + private UUID pcuGroupID; + + /** + * Projection as the creation request + * + * @return + * db creation request + */ + public DatabaseCreationRequest asRequest() { + DatabaseCreationBuilder builder = DatabaseCreationRequest.builder(); + builder.capacityUnit(capacity); + builder.name(name); + builder.cloudProvider(cloudProvider); + builder.cloudRegion(region); + builder.tier(tier); + builder.keyspace(keyspace); + builder.withVector(); + builder.dbType(dbType); + if (pcuGroupID != null) { + builder.assignToPCUGroup(pcuGroupID); + } + return builder.build(); + } +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/CreateDatabaseOptions.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/CreateDatabaseOptions.java new file mode 100644 index 00000000..78e748c3 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/options/CreateDatabaseOptions.java @@ -0,0 +1,21 @@ +package com.datastax.astra.client.admin.options; + +import com.datastax.astra.client.core.options.BaseOptions; +import lombok.Setter; +import lombok.experimental.Accessors; + +@Setter +@Accessors(fluent = true, chain = true) +public class CreateDatabaseOptions extends BaseOptions { + + boolean waitForDb = false; + + /** + * Gets waitForDb + * + * @return value of waitForDb + */ + public boolean isWaitForDb() { + return waitForDb; + } +} diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/AstraOpsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/AstraOpsClient.java index ec7202ab..2faef93f 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/AstraOpsClient.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/AstraOpsClient.java @@ -6,7 +6,7 @@ import com.dtsx.astra.sdk.org.TokensClient; import com.dtsx.astra.sdk.org.UsersClient; import com.dtsx.astra.sdk.org.domain.*; -import com.dtsx.astra.sdk.pcu.PcuGroupsClient; +import com.dtsx.astra.sdk.pcu.PcuGroupsOpsClient; import com.dtsx.astra.sdk.streaming.AstraStreamingClient; import com.dtsx.astra.sdk.utils.ApiLocator; import com.dtsx.astra.sdk.utils.ApiResponseHttp; @@ -172,12 +172,13 @@ public TokensClient tokens() { // ------------------------------------------------------ /** - * Work with PCU groups. + * Work with PCU groups. With are using 'pcus' matching both devops path, also pcus support types + * https://docs.datastax.com/en/astra-api-docs/_attachments/devops-api/index.html#tag/PCU/operation/pcuGet * * @return * pcu groups client */ - public PcuGroupsClient pcuGroups() { // TODO `pcu()` or `pcuGroups()`? - return new PcuGroupsClient(token, environment); + public PcuGroupsOpsClient pcus() { + return new PcuGroupsOpsClient(token, environment); } } diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationBuilder.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationBuilder.java index 1251c888..7250c00c 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationBuilder.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationBuilder.java @@ -16,6 +16,8 @@ package com.dtsx.astra.sdk.db.domain; +import java.util.UUID; + /** * Builder for database creation. */ @@ -48,9 +50,15 @@ public class DatabaseCreationBuilder { /** Option to enable the vector preview. */ protected boolean vector = false; + /** Option to enable the vector preview. */ + protected DatabaseCreationType dbType; + /** capacity unit. */ protected int capacityUnits = 1; + /** Identifier to assign a database to a PCU group directly. */ + protected UUID pcuGroupUUID; + /** Default constructor. */ public DatabaseCreationBuilder() {} @@ -132,6 +140,19 @@ public DatabaseCreationBuilder capacityUnit(int unit) { return this; } + /** + * Builder for a PCU group + * + * @param pcuGroupId + * identifier for the PCU group + * @return + * current instance + */ + public DatabaseCreationBuilder assignToPCUGroup(UUID pcuGroupId) { + this.pcuGroupUUID = pcuGroupId; + return this; + } + /** * Enable Vector. * @@ -143,6 +164,17 @@ public DatabaseCreationBuilder withVector() { return this; } + /** + * Builder for a dbType + * + * @return + * database creation request + */ + public DatabaseCreationBuilder dbType(DatabaseCreationType dbType) { + this.dbType = dbType; + return this; + } + /** * Build the immutable beans. * diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationRequest.java index 14d3beba..76ae47ea 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationRequest.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/db/domain/DatabaseCreationRequest.java @@ -16,6 +16,11 @@ package com.dtsx.astra.sdk.db.domain; +import lombok.AccessLevel; +import lombok.Setter; + +import java.util.UUID; + /** * Database creation request * @@ -58,7 +63,12 @@ public class DatabaseCreationRequest { /** * Default is null, if vector will be added */ - private DatabaseCreationType dbType; + protected DatabaseCreationType dbType; + + /** + * Identifier to assign a database to a PCU group directly. + */ + private UUID pcuGroupUUID; /** * default constructor. @@ -78,7 +88,10 @@ public DatabaseCreationRequest(DatabaseCreationBuilder builder) { this.name = builder.name; this.region = builder.region; this.tier = builder.tier; - if (builder.vector) { + this.pcuGroupUUID = builder.pcuGroupUUID; + if (builder.dbType != null) { + this.dbType = builder.dbType; + } else if (builder.vector) { this.dbType = DatabaseCreationType.vector; } } @@ -103,6 +116,16 @@ public String getName() { return name; } + /** + * Setter name update + * + * @param name + * name update + */ + public void setName(String name) { + this.name = name; + } + /** * Getter accessor for attribute 'keyspace'. * @@ -132,6 +155,16 @@ public CloudProviderType getCloudProvider() { public String getTier() { return tier; } + + /** + * Getter accessor for attribute 'pcuGroupUUID'. + * + * @return + * current value of 'pcuGroupUUID' + */ + public UUID getPcuGroupUUID() { + return pcuGroupUUID; + } /** * Getter accessor for attribute 'capacityUnits'. diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupOpsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupOpsClient.java index 5aaa748a..2ff58ffb 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupOpsClient.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupOpsClient.java @@ -21,6 +21,7 @@ */ @Slf4j public class PcuGroupOpsClient extends AbstractApiClient { + /** * PCU group unique identifier. */ @@ -87,7 +88,7 @@ public Optional find() { * if the PCU group does not exist */ public PcuGroup get() { - return new PcuGroupsClient(token, environment).findById(pcuGroupId).orElseThrow(() -> PcuGroupNotFoundException.forId(pcuGroupId)); + return new PcuGroupsOpsClient(token, environment).findById(pcuGroupId).orElseThrow(() -> PcuGroupNotFoundException.forId(pcuGroupId)); } /** diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsOpsClient.java similarity index 68% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsClient.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsOpsClient.java index 9ad0f7e7..69c2d259 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsClient.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsOpsClient.java @@ -2,16 +2,20 @@ import com.dtsx.astra.sdk.pcu.domain.PcuGroup; import com.dtsx.astra.sdk.pcu.domain.PcuGroupCreationRequest; +import com.dtsx.astra.sdk.pcu.domain.PcuType; +import com.dtsx.astra.sdk.pcu.domain.PcuTypeLocationFilter; import com.dtsx.astra.sdk.pcu.exception.PcuGroupNotFoundException; import com.dtsx.astra.sdk.pcu.exception.PcuGroupsNotFoundException; import com.dtsx.astra.sdk.AbstractApiClient; import com.dtsx.astra.sdk.utils.*; +import com.dtsx.astra.sdk.utils.observability.ApiRequestObserver; import com.fasterxml.jackson.core.type.TypeReference; import lombok.extern.slf4j.Slf4j; import lombok.val; import java.net.HttpURLConnection; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Stream; @@ -20,38 +24,91 @@ * Provides operations for creating, finding, and managing PCU groups. */ @Slf4j -public class PcuGroupsClient extends AbstractApiClient { +public class PcuGroupsOpsClient extends AbstractApiClient { + private static final TypeReference> RESPONSE_PCU_GROUPS = new TypeReference<>(){}; /** * Constructor with token for production environment. * - * @param token - * authentication token + * @param token authentication token */ - public PcuGroupsClient(String token) { - super(token, AstraEnvironment.PROD); + public PcuGroupsOpsClient(String token) { + this(token, AstraEnvironment.PROD); } /** - * Constructor with token and environment. + * Constructor with token for different environment + * + * @param token authentication token + * @param environment astra environment + */ + public PcuGroupsOpsClient(String token, AstraEnvironment environment) { + super(token, environment); + } + + /** + * As immutable object use builder to initiate the object. * - * @param token - * authentication token * @param env - * target Astra environment + * define target environment to be used + * @param token + * authenticated token + * @param observers + * list of observers */ - public PcuGroupsClient(String token, AstraEnvironment env) { - super(token, env); + public PcuGroupsOpsClient(String token, AstraEnvironment env, Map observers) { + super(token, env, observers); + HttpClientWrapper.registerObservers(observers); } + // --------------------------------- + // ---- TYPES ---- + // --------------------------------- + + private static final TypeReference> RESPONSE_PCU_TYPES = new TypeReference<>(){}; + /** {@inheritDoc} */ @Override public String getServiceName() { return "pcu.groups"; } + // --------------------------------- + // ---- PCU TYPES ---- + // --------------------------------- + + public Stream listPcuTypes(PcuTypeLocationFilter request) { + String contextPath = "/types"; + boolean first = true; + if (request != null) { + if (Utils.hasLength(request.getProvider())) { + first = false; + contextPath = contextPath + "?provider=" + request.getProvider(); + } + if (Utils.hasLength(request.getRegion())) { + if (!first) { + contextPath = contextPath + "®ion=" + request.getRegion(); + } else { + contextPath = contextPath + "?region=" + request.getRegion(); + } + } + } + + val res = GET(getEndpointPcus() + contextPath, getOperationName("find")); + try { + return JsonUtils.unmarshallType(res.getBody(), RESPONSE_PCU_TYPES).stream(); + } catch (Exception e) { + ApiResponseError responseError = null; + try { + responseError = JsonUtils.unmarshallBean(res.getBody(), ApiResponseError.class); + System.out.println(responseError.toString()); + } catch (Exception ignored) {} + throw e; + } + } + // --------------------------------- // ---- CRUD ---- // --------------------------------- @@ -67,7 +124,9 @@ public String getServiceName() { * if creation fails */ public PcuGroup create(PcuGroupCreationRequest req) { - val res = POST(getEndpointPcus(), JsonUtils.marshall(List.of(req.withDefaultsAndValidations())), getOperationName("create")); + String payload = JsonUtils.marshall(List.of(req.withDefaultsAndValidations())); + System.out.println(payload); + val res = POST(getEndpointPcus(), payload, getOperationName("create")); if (HttpURLConnection.HTTP_CREATED != res.getCode()) { throw new IllegalStateException("Expected code 201 to create pcu group but got " + res.getCode() + "body=" + res.getBody()); diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuCapacityWorkloadType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuCapacityWorkloadType.java new file mode 100644 index 00000000..3e5e0c26 --- /dev/null +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuCapacityWorkloadType.java @@ -0,0 +1,34 @@ +package com.dtsx.astra.sdk.pcu.domain; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.experimental.Accessors; + +/** + * Enumeration of PCU (Processing Capacity Units) provisioning types. + * Defines how compute resources are allocated for a PCU group. + */ +@Getter +@Accessors(fluent = true) +@RequiredArgsConstructor +public enum PcuCapacityWorkloadType { + + /** + * Shared provisioning - resources are shared across multiple tenants. + * More cost-effective but with potential resource contention. + */ + FLEXIBLE("flexible"), + + /** + * Dedicated provisioning - resources are exclusively allocated. + * Higher cost but guaranteed performance and isolation. + */ + COMMITED("commited"); + + /** + * JSON serialization value for the provision type. + */ + @JsonValue + private final String fieldValue; +} diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroup.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroup.java index 0e6d47e8..60b30152 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroup.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroup.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.util.UUID; + /** * Represents a PCU (Processing Capacity Units) Group in Astra. * A PCU group manages compute resources for databases across cloud providers and regions. @@ -18,7 +20,7 @@ public class PcuGroup { * Unique identifier for the PCU group. */ @JsonProperty("uuid") - private String id; + private UUID id; /** * Organization identifier. diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreateUpdateRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreateUpdateRequest.java index 98ce90f1..c8362445 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreateUpdateRequest.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreateUpdateRequest.java @@ -1,6 +1,7 @@ package com.dtsx.astra.sdk.pcu.domain; import com.dtsx.astra.sdk.db.domain.CloudProviderType; +import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -36,16 +37,45 @@ public abstract class PcuGroupCreateUpdateRequest { */ protected String region; + // -------------------------------------- + // Capacity Details + // -------------------------------------- + + /** + * Committed vs Flexible Workload. + *

+ * Commited: Committed capacity workloads include continuously-provisioned resources, and they can never scale to zero. + * Committed capacity workloads are intended for any database in any environment that requires long-term, continuous + * availability, such as multi-region databases and latency sensitive workloads. + *

+ * Flexible capacity workloads: PCU groups for flexible capacity workloads are billed entirely at the HCU rate, and they + * have the option to manually scale to zero. With flexible capacity workloads, you are billed for continuous HCU usage + * based on the group’s minimum capacity. While flexible capacity workloads don’t require a commitment to reserved capacity, + * they don’t offer cost savings for continuous usage that can be realized at the RCU rate. + */ + protected PcuCapacityWorkloadType workloadType; + + /** + * Provisioning type for the PCU group. + */ + @Setter(AccessLevel.NONE) + protected PcuProvisionType provisionType; + + public PcuGroupCreateUpdateRequest setProvisionType(PcuProvisionType provisionType) { + this.provisionType = provisionType; + return this; + } + /** * Minimum number of PCUs (must be greater or equals to 1). */ protected Integer min; // Integers so they're nullable - + /** * Maximum number of PCUs (must be greater or equals to min). */ protected Integer max; - + /** * Number of reserved PCUs (must be non-negative and lower or equals to min). */ diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreationRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreationRequest.java index 2b155551..7062761b 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreationRequest.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreationRequest.java @@ -12,15 +12,11 @@ @Setter @SuperBuilder public final class PcuGroupCreationRequest extends PcuGroupCreateUpdateRequest { + /** * Instance type for the PCU group (e.g., "standard"). */ private String instanceType; - - /** - * Provisioning type for the PCU group. - */ - private PcuProvisionType provisionType; /** * Applies default values and validates the request before creation. @@ -34,15 +30,19 @@ public PcuGroupCreationRequest withDefaultsAndValidations() { this.provisionType = PcuProvisionType.SHARED; } - // TODO do we really want a default for this? (since pcu instance types are changing) + // De if (this.instanceType == null || this.instanceType.isBlank()) { - this.instanceType = "standard"; + this.instanceType = PcuInstanceType.SMALL.toString(); } if (this.reserved == null) { this.reserved = 0; + this.min = 1; + this.max = 1; } return this; } + + } diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupUpdateRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupUpdateRequest.java index e97dd5c8..d0e43a33 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupUpdateRequest.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupUpdateRequest.java @@ -32,11 +32,10 @@ public PcuGroupCreateUpdateRequest withDefaultsAndValidations(PcuGroup base) { internalRep.setMin(this.min == null ? base.getMin() : this.min); internalRep.setMax(this.max == null ? base.getMax() : this.max); internalRep.setReserved(this.reserved == null ? base.getReserved() : this.reserved); - internalRep.validate(); return internalRep - .setPcuGroupUUID(base.getId()) + .setPcuGroupUUID(base.getId().toString()) .setInstanceType(base.getInstanceType()) .setProvisionType(base.getProvisionType()); } @@ -50,10 +49,14 @@ public PcuGroupCreateUpdateRequest withDefaultsAndValidations(PcuGroup base) { static class InternalRep extends PcuGroupUpdateRequest { private String pcuGroupUUID; private String instanceType; - private PcuProvisionType provisionType; InternalRep() { super(); } + + public InternalRep setProvisionType(PcuProvisionType provisionType) { + super.setProvisionType(provisionType); + return this; + } } } diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuInstanceType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuInstanceType.java new file mode 100644 index 00000000..25c6989c --- /dev/null +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuInstanceType.java @@ -0,0 +1,22 @@ +package com.dtsx.astra.sdk.pcu.domain; + +import lombok.Getter; + +@Getter +public enum PcuInstanceType { + + SMALL("small"), + MEDIUM("medium"), + GENERAL_PURPOSE("generalPurpose"), + CACHE_OPTIMIZED("cacheOptimized"), + + // Legacy + STANDARD("standard"), + STORAGE_OPTIMIZED("storageOptimized"); + + final String code; + + PcuInstanceType(String code) { + this.code = code; + } +} diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuProvisionType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuProvisionType.java index 87718e8c..4d5dfd98 100644 --- a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuProvisionType.java +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuProvisionType.java @@ -13,6 +13,7 @@ @Accessors(fluent = true) @RequiredArgsConstructor public enum PcuProvisionType { + /** * Shared provisioning - resources are shared across multiple tenants. * More cost-effective but with potential resource contention. diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuType.java new file mode 100644 index 00000000..087503ff --- /dev/null +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuType.java @@ -0,0 +1,19 @@ +package com.dtsx.astra.sdk.pcu.domain; + +import com.dtsx.astra.sdk.db.domain.CloudProviderType; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +@Data +@NoArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class PcuType { + String type; + String region; + String provider; + Map details; + boolean enabled; +} diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeLocationFilter.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeLocationFilter.java new file mode 100644 index 00000000..d2588df9 --- /dev/null +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeLocationFilter.java @@ -0,0 +1,15 @@ +package com.dtsx.astra.sdk.pcu.domain; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class PcuTypeLocationFilter { + String provider; + String region; +} diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeResolver.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeResolver.java new file mode 100644 index 00000000..3c6d5ef1 --- /dev/null +++ b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeResolver.java @@ -0,0 +1,58 @@ +package com.dtsx.astra.sdk.pcu.domain; + +import java.util.List; + +/** + * Utility class for resolving default PCU types based on availability and configuration. + */ +public class PcuTypeResolver { + + /** + * Resolves the default PCU type based on available types and mini PCU configuration. + * + *

Selection priority when mini PCU is enabled: + * SMALL > MEDIUM > GENERAL_PURPOSE > CACHE_OPTIMIZED + * + *

Selection priority when mini PCU is disabled: + * GENERAL_PURPOSE > CACHE_OPTIMIZED (SMALL and MEDIUM are ignored) + * + * @param availableTypes list of available PCU family types + * @param miniPcuEnabled whether mini PCU is enabled + * @return the selected PCU family, or null if no suitable type is available + */ + public static PcuInstanceType resolveDefaultPcuType(List availableTypes, boolean miniPcuEnabled) { + if (availableTypes == null || availableTypes.isEmpty()) { + return null; + } + + if (miniPcuEnabled) { + // Priority: SMALL > MEDIUM > GENERAL_PURPOSE > CACHE_OPTIMIZED + if (availableTypes.contains(PcuInstanceType.SMALL)) { + return PcuInstanceType.SMALL; + } + if (availableTypes.contains(PcuInstanceType.MEDIUM)) { + return PcuInstanceType.MEDIUM; + } + if (availableTypes.contains(PcuInstanceType.GENERAL_PURPOSE)) { + return PcuInstanceType.GENERAL_PURPOSE; + } + if (availableTypes.contains(PcuInstanceType.CACHE_OPTIMIZED)) { + return PcuInstanceType.CACHE_OPTIMIZED; + } + } else { + // Priority: GENERAL_PURPOSE > CACHE_OPTIMIZED (ignore SMALL and MEDIUM) + if (availableTypes.contains(PcuInstanceType.GENERAL_PURPOSE)) { + return PcuInstanceType.GENERAL_PURPOSE; + } + if (availableTypes.contains(PcuInstanceType.CACHE_OPTIMIZED)) { + return PcuInstanceType.CACHE_OPTIMIZED; + } + } + + return null; + } + + private PcuTypeResolver() { + // Utility class - prevent instantiation + } +} diff --git a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/AbstractDevopsApiTest.java b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/AbstractDevopsApiTest.java index 64607136..e6af0f1c 100644 --- a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/AbstractDevopsApiTest.java +++ b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/AbstractDevopsApiTest.java @@ -36,22 +36,22 @@ public abstract class AbstractDevopsApiTest { /** * Reference to Databases Client. */ - private static AstraDBOpsClient databasesClient; + protected static AstraDBOpsClient databasesClient; /** * Reference to organization client. */ - private static AstraOpsClient apiDevopsClient; + protected static AstraOpsClient apiDevopsClient; /** * Working db. */ - private static DbOpsClient dbClient; + protected static DbOpsClient dbClient; /** * Reference to Databases Client. */ - private static AstraStreamingClient streamingClient; + protected static AstraStreamingClient streamingClient; /** * Access DB client. diff --git a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientTest.java b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientTest.java new file mode 100644 index 00000000..0b641318 --- /dev/null +++ b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientTest.java @@ -0,0 +1,135 @@ +package com.dtsx.astra.sdk.pcu; + +import com.dtsx.astra.sdk.AbstractDevopsApiTest; +import com.dtsx.astra.sdk.AstraOpsClient; +import com.dtsx.astra.sdk.db.domain.CloudProviderType; +import com.dtsx.astra.sdk.db.domain.DatabaseCreationRequest; +import com.dtsx.astra.sdk.db.domain.DatabaseStatusType; +import com.dtsx.astra.sdk.org.domain.Organization; +import com.dtsx.astra.sdk.pcu.domain.PcuCapacityWorkloadType; +import com.dtsx.astra.sdk.pcu.domain.PcuGroup; +import com.dtsx.astra.sdk.pcu.domain.PcuGroupCreationRequest; +import com.dtsx.astra.sdk.pcu.domain.PcuInstanceType; +import com.dtsx.astra.sdk.pcu.domain.PcuProvisionType; +import com.dtsx.astra.sdk.pcu.domain.PcuType; +import com.dtsx.astra.sdk.pcu.domain.PcuTypeLocationFilter; +import com.dtsx.astra.sdk.utils.AstraEnvironment; +import com.dtsx.astra.sdk.utils.JsonUtils; +import com.dtsx.astra.sdk.utils.TestUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import java.util.UUID; +import java.util.stream.Stream; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class PCUGroupClientTest extends AbstractDevopsApiTest { + + public static final String TOKEN = "change_me"; + public static final String TEST_REGION = "us-west-2"; + + @BeforeAll + public static void beforeAll() { + apiDevopsClient = new AstraOpsClient(TOKEN, AstraEnvironment.DEV); + } + + @Test + @Order(1) + public void shouldAccessOrganizationInDev() { + Organization org = getApiDevopsClient().getOrganization(); + Assertions.assertNotNull(org); + Assertions.assertNotNull(org.getId()); + Assertions.assertNotNull(org.getName()); + Assertions.assertTrue(org .getName().startsWith("Data API")); + } + + @Test + @Order(2) + public void shouldListPcuGroupsType() { + PcuTypeLocationFilter location = new PcuTypeLocationFilter(CloudProviderType.AWS.getCode().toLowerCase(), TEST_REGION); + Stream types = getApiDevopsClient().pcus().listPcuTypes(location); + Assertions.assertNotNull(types); + System.out.println(JsonUtils.marshall(types.toList())); + } + + @Test + @Order(2) + public void shouldListPcuGroups() { + Stream groups = getApiDevopsClient().pcus().findAll(); + System.out.println(groups.toList()); + } + + @Test + @Order(2) + public void shouldCreatePcuGroup() { + PcuGroupCreationRequest createPcu = PcuGroupCreationRequest + .builder() + .title("pcu_group_from_java") + .description("my first PCU group") + .instanceType("standard") + .cloudProvider(CloudProviderType.AWS) + .region(TEST_REGION) + .workloadType(PcuCapacityWorkloadType.FLEXIBLE) + .provisionType(PcuProvisionType.SHARED) + .reserved(1) + .min(1) + .max(1) + .build(); + + PcuGroup group = getApiDevopsClient().pcus().create(createPcu); + System.out.println(group); + } + + @Test + @Order(2) + public void shouldCreateMiniPcu() { + PcuGroupCreationRequest createPcu = PcuGroupCreationRequest + .builder() + .title("java_client_mini_pcu") + .description("java_client_mini_pcu") + .instanceType(PcuInstanceType.SMALL.getCode()) + .cloudProvider(CloudProviderType.AWS) + .region(TEST_REGION) + .workloadType(PcuCapacityWorkloadType.COMMITED) + .provisionType(PcuProvisionType.SHARED) + .reserved(1) + .min(1) + .max(1) + .build(); + PcuGroup group = getApiDevopsClient().pcus().create(createPcu); + System.out.println(group); + } + + @Test + @Order(2) + public void shouldDeletePcuGroup() { + getApiDevopsClient().pcus().group("57dde257-86c6-4646-9247-670cd8a4d360").delete(); + } + + @Test + @Order(3) + public void should_create_db_and_assign_pcu() throws InterruptedException { + UUID miniPcuUUID = UUID.fromString("57dde257-86c6-4646-9247-670cd8a4d360"); + DatabaseCreationRequest dbCreation = DatabaseCreationRequest + .builder() + .name("vector_db_in_mini_pcu") + .keyspace(SDK_TEST_KEYSPACE) + .cloudProvider(CloudProviderType.AWS) + .cloudRegion(TEST_REGION) + .withVector() + .assignToPCUGroup(miniPcuUUID) + .build(); + String dbId = getApiDevopsClient().db().create(dbCreation); + Thread.sleep(10000); + Assertions.assertTrue(getDatabasesClient().findById(dbId).isPresent()); + Assertions.assertNotNull(getDatabasesClient().database(dbId).get()); + Assertions.assertTrue(getDatabasesClient().findByName("vector_db_in_mini_pcu").count() > 0); + // When + TestUtils.waitForDbStatus(getDatabasesClient().database(dbId), DatabaseStatusType.ACTIVE, 500); + } + +} diff --git a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/ParkingTest.java b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/ParkingTest.java deleted file mode 100644 index 0d1b53e4..00000000 --- a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/ParkingTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dtsx.astra.sdk.pcu; - -import com.dtsx.astra.sdk.AstraOpsClient; -import com.dtsx.astra.sdk.utils.AstraEnvironment; -import lombok.val; -import org.junit.jupiter.api.Test; - -public class ParkingTest { - -} diff --git a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PcuTypeResolverTest.java b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PcuTypeResolverTest.java new file mode 100644 index 00000000..1cae4610 --- /dev/null +++ b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PcuTypeResolverTest.java @@ -0,0 +1,132 @@ +package com.dtsx.astra.sdk.pcu; + +import com.dtsx.astra.sdk.pcu.domain.PcuInstanceType; +import com.dtsx.astra.sdk.pcu.domain.PcuTypeResolver; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * Test class for PcuTypeResolver. + */ +@DisplayName("PcuTypeResolver Tests") +class PcuTypeResolverTest { + + @Nested + @DisplayName("Mini PCU Enabled") + class MiniPcuEnabled { + + @Test + @DisplayName("Selects SMALL when SMALL is available") + void selectsSmallWhenSmallIsAvailable() { + List availableTypes = Arrays.asList( + PcuInstanceType.SMALL, + PcuInstanceType.MEDIUM, + PcuInstanceType.GENERAL_PURPOSE, + PcuInstanceType.CACHE_OPTIMIZED + ); + + assertEquals( + PcuInstanceType.SMALL, + PcuTypeResolver.resolveDefaultPcuType(availableTypes, true) + ); + } + + @Test + @DisplayName("Selects MEDIUM when SMALL is unavailable but MEDIUM exists") + void selectsMediumWhenSmallUnavailableButMediumExists() { + List availableTypes = Arrays.asList( + PcuInstanceType.MEDIUM, + PcuInstanceType.GENERAL_PURPOSE + ); + + assertEquals( + PcuInstanceType.MEDIUM, + PcuTypeResolver.resolveDefaultPcuType(availableTypes, true) + ); + } + + @Test + @DisplayName("Selects GENERAL_PURPOSE when only GENERAL_PURPOSE and CACHE_OPTIMIZED exist") + void selectsGeneralPurposeWhenOnlyGeneralPurposeAndCacheOptimizedExist() { + List availableTypes = Arrays.asList( + PcuInstanceType.GENERAL_PURPOSE, + PcuInstanceType.CACHE_OPTIMIZED + ); + + assertEquals( + PcuInstanceType.GENERAL_PURPOSE, + PcuTypeResolver.resolveDefaultPcuType(availableTypes, true) + ); + } + + @Test + @DisplayName("Selects CACHE_OPTIMIZED when it is the only available type") + void selectsCacheOptimizedWhenItIsTheOnlyAvailableType() { + List availableTypes = Collections.singletonList( + PcuInstanceType.CACHE_OPTIMIZED + ); + + assertEquals( + PcuInstanceType.CACHE_OPTIMIZED, + PcuTypeResolver.resolveDefaultPcuType(availableTypes, true) + ); + } + + @Test + @DisplayName("Returns null when no types are available") + void returnsNullWhenNoTypesAreAvailable() { + assertNull(PcuTypeResolver.resolveDefaultPcuType(Collections.emptyList(), true)); + } + } + + @Nested + @DisplayName("Mini PCU Disabled") + class MiniPcuDisabled { + + @Test + @DisplayName("Selects GENERAL_PURPOSE when GENERAL_PURPOSE is available") + void selectsGeneralPurposeWhenGeneralPurposeIsAvailable() { + List availableTypes = Arrays.asList( + PcuInstanceType.GENERAL_PURPOSE, + PcuInstanceType.CACHE_OPTIMIZED + ); + + assertEquals( + PcuInstanceType.GENERAL_PURPOSE, + PcuTypeResolver.resolveDefaultPcuType(availableTypes, false) + ); + } + + @Test + @DisplayName("Selects CACHE_OPTIMIZED when it is the only available type") + void selectsCacheOptimizedWhenItIsTheOnlyAvailableType() { + List availableTypes = Collections.singletonList( + PcuInstanceType.CACHE_OPTIMIZED + ); + + assertEquals( + PcuInstanceType.CACHE_OPTIMIZED, + PcuTypeResolver.resolveDefaultPcuType(availableTypes, false) + ); + } + + @Test + @DisplayName("Returns null when only SMALL or MEDIUM are available") + void returnsNullWhenOnlySmallOrMediumAreAvailable() { + List availableTypes = Arrays.asList( + PcuInstanceType.SMALL, + PcuInstanceType.MEDIUM + ); + + assertNull(PcuTypeResolver.resolveDefaultPcuType(availableTypes, false)); + } + } +} diff --git a/integrations/skills/spring-boot-data-api/README.md b/integrations/skills/spring-boot-data-api/README.md index a290b4a0..04fc6257 100644 --- a/integrations/skills/spring-boot-data-api/README.md +++ b/integrations/skills/spring-boot-data-api/README.md @@ -5,8 +5,8 @@ A comprehensive AI-powered skill for building production-ready Spring Boot appli ## Quick Links - πŸ“š **[Main Skill Document](SKILL.md)** - Complete step-by-step guide -- πŸ“ **[Code Templates](templates/)** - Reusable code templates -- πŸ’‘ **[Basic Example](examples/basic/)** - Minimal working example +- πŸ“ **[Code Templates](assets/templates/)** - Reusable code templates +- πŸ’‘ **[Basic Example](assets/examples/basic/)** - Minimal working example ## What You'll Learn @@ -29,6 +29,26 @@ A comprehensive AI-powered skill for building production-ready Spring Boot appli 30-45 minutes +## Folder Structure + +``` +spring-boot-data-api/ +β”œβ”€β”€ README.md # This file +β”œβ”€β”€ SKILL.md # Main skill guide +β”œβ”€β”€ references/ # Additional reference docs (future) +β”œβ”€β”€ scripts/ # Automation scripts (future) +└── assets/ # Reusable assets + β”œβ”€β”€ templates/ # Code templates + β”‚ β”œβ”€β”€ Document.java.template + β”‚ β”œβ”€β”€ Repository.java.template + β”‚ β”œβ”€β”€ Service.java.template + β”‚ β”œβ”€β”€ Controller.java.template + β”‚ └── application.yml.template + └── examples/ # Working examples + └── basic/ # Basic example + └── README.md +``` + ## How to Use This Skill ### With Claude @@ -70,7 +90,7 @@ integrations/skills/spring-boot-data-api/SKILL.md ``` 2. **Use templates to generate code:** - - Copy templates from `templates/` directory + - Copy templates from `assets/templates/` directory - Replace placeholders ({{CLASS_NAME}}, {{COLLECTION_NAME}}, etc.) - Customize for your use case diff --git a/integrations/skills/spring-boot-data-api/examples/basic/README.md b/integrations/skills/spring-boot-data-api/assets/examples/basic/README.md similarity index 100% rename from integrations/skills/spring-boot-data-api/examples/basic/README.md rename to integrations/skills/spring-boot-data-api/assets/examples/basic/README.md diff --git a/integrations/skills/spring-boot-data-api/templates/Controller.java.template b/integrations/skills/spring-boot-data-api/assets/templates/Controller.java.template similarity index 100% rename from integrations/skills/spring-boot-data-api/templates/Controller.java.template rename to integrations/skills/spring-boot-data-api/assets/templates/Controller.java.template diff --git a/integrations/skills/spring-boot-data-api/templates/Document.java.template b/integrations/skills/spring-boot-data-api/assets/templates/Document.java.template similarity index 100% rename from integrations/skills/spring-boot-data-api/templates/Document.java.template rename to integrations/skills/spring-boot-data-api/assets/templates/Document.java.template diff --git a/integrations/skills/spring-boot-data-api/templates/Repository.java.template b/integrations/skills/spring-boot-data-api/assets/templates/Repository.java.template similarity index 100% rename from integrations/skills/spring-boot-data-api/templates/Repository.java.template rename to integrations/skills/spring-boot-data-api/assets/templates/Repository.java.template diff --git a/integrations/skills/spring-boot-data-api/templates/Service.java.template b/integrations/skills/spring-boot-data-api/assets/templates/Service.java.template similarity index 100% rename from integrations/skills/spring-boot-data-api/templates/Service.java.template rename to integrations/skills/spring-boot-data-api/assets/templates/Service.java.template diff --git a/integrations/skills/spring-boot-data-api/templates/application.yml.template b/integrations/skills/spring-boot-data-api/assets/templates/application.yml.template similarity index 100% rename from integrations/skills/spring-boot-data-api/templates/application.yml.template rename to integrations/skills/spring-boot-data-api/assets/templates/application.yml.template diff --git a/tools/data-api-tools/pom.xml b/tools/data-api-tools/pom.xml index df336ac0..5814c186 100644 --- a/tools/data-api-tools/pom.xml +++ b/tools/data-api-tools/pom.xml @@ -19,6 +19,15 @@ astra-db-java ${project.version} + + + + com.datastax.astra + astra-db-java + ${project.version} + test-jar + test + diff --git a/tools/data-api-tools/src/test/java/com/datastax/astra/tool/copy/README.md b/tools/data-api-tools/src/test/java/com/datastax/astra/tool/copy/README.md new file mode 100644 index 00000000..a6b24de8 --- /dev/null +++ b/tools/data-api-tools/src/test/java/com/datastax/astra/tool/copy/README.md @@ -0,0 +1,86 @@ +# CollectionCloner Integration Tests + +This directory contains integration tests for the `CollectionCloner` utility. + +## Test Coverage + +The `CollectionClonerIT` test suite covers: + +1. **Basic Cloning** - Small collection (50 documents) with default settings +2. **Large Collection Cloning** - 2500+ documents with parallel reading (tests estimatedDocumentCount) +3. **Document Transformation** - Using DocumentMapper to transform documents during cloning +4. **Custom Thread Pools** - Testing different read/insert thread pool configurations +5. **Empty Collection** - Handling edge case of empty source collection +6. **Duplicate Prevention** - Verifying no duplicates are created on repeated cloning + +## Running the Tests + +### Prerequisites + +- Local HCD/DSE instance running on `http://localhost:8181` (default) +- OR Astra database with proper credentials configured + +### Run Tests Locally (HCD/DSE) + +```bash +# From project root +mvn test -pl tools/data-api-tools + +# Or from tools/data-api-tools directory +mvn test +``` + +### Run Tests Against Astra + +```bash +# Set environment variables +export ASTRA_DB_APPLICATION_TOKEN= +export ASTRA_DB_API_ENDPOINT= + +# Run tests +mvn test -pl tools/data-api-tools -Dtest.environment=astra_prod +``` + +## Test Configuration + +Tests use configuration from: +- `src/test/resources/test-config.properties` - Default local settings +- Environment variables can override config file settings +- Inherits from `AbstractDataAPITest` in astra-db-java module + +## Performance Expectations + +With default settings (5 read threads, 10 insert threads): +- Small collections (< 100 docs): < 5 seconds +- Medium collections (500 docs): < 15 seconds +- Large collections (2500+ docs): < 60 seconds + +Actual performance depends on: +- Network latency +- Database load +- Document size and complexity +- Available system resources + +## Troubleshooting + +### Test Failures + +1. **Connection refused**: Ensure HCD/DSE is running on localhost:8181 +2. **Timeout errors**: Increase timeout in test configuration +3. **Duplicate key errors**: Expected behavior when cloning to non-empty target + +### Logging + +Adjust log levels in `src/test/resources/logback-test.xml`: +```xml + +``` + +## Adding New Tests + +When adding new test cases: +1. Extend `CollectionClonerIT` class +2. Use `@Order` annotation to control execution sequence +3. Clean up collections in `@BeforeAll` and `@AfterAll` +4. Use descriptive test method names: `should__()` +5. Add assertions to verify expected behavior diff --git a/tools/data-api-tools/src/test/resources/logback-test.xml b/tools/data-api-tools/src/test/resources/logback-test.xml new file mode 100644 index 00000000..5cf5eec7 --- /dev/null +++ b/tools/data-api-tools/src/test/resources/logback-test.xml @@ -0,0 +1,15 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + diff --git a/tools/data-api-tools/src/test/resources/test-config.properties b/tools/data-api-tools/src/test/resources/test-config.properties new file mode 100644 index 00000000..252cf7cf --- /dev/null +++ b/tools/data-api-tools/src/test/resources/test-config.properties @@ -0,0 +1,49 @@ +# Test Configuration for Data API Tools Integration Tests +# This file is used by CollectionClonerIT and other integration tests + +# Default test environment - Astra Production +test.environment=astra_prod + +# ======================================== +# Astra Configuration +# ======================================== +# You can configure Astra connection in two ways: +# +# Option 1: Environment Variables (recommended for CI/CD) +# ASTRA_DB_APPLICATION_TOKEN - Your Astra DB token +# +# Option 2: Properties file (convenient for local development) +# Uncomment and set the property below: +# astra.token=AstraCS:...your-token-here... + +# Astra settings +astra.keyspace=default_keyspace +astra.cloud.provider=AWS +astra.cloud.region=us-east-2 + +# Test settings +test.timeout.seconds=300 +test.log.progress=true +test.vectorize=true +test.reranking=true + +# ======================================== +# Local HCD/DSE Configuration (commented out) +# Uncomment these lines and set test.environment=local to run against local HCD/DSE +# ======================================== +# test.environment=local +# local.endpoint=http://localhost:8181 +# local.keyspace=default_keyspace +# local.username=cassandra +# local.password=cassandra +# test.vectorize=false +# test.reranking=false + +# ======================================== +# Notes: +# ======================================== +# - For Astra tests, the framework automatically creates/finds a database +# based on cloud provider and region settings above +# - You don't need to specify ASTRA_DB_API_ENDPOINT - it's derived from +# the database name, cloud provider, and region +# - Priority: Environment Variables > System Properties > Config File From 63e88e5164d13a87924fc140418d473cca9d468b Mon Sep 17 00:00:00 2001 From: Cedrick Lunven Date: Thu, 25 Jun 2026 18:37:33 +0200 Subject: [PATCH 2/2] PCU group updqtes --- .../client/admin/definition/PCUGroupDefinition.java | 4 ++++ .../client/admin/definition/PCUTypeDefinition.java | 4 ++++ .../client/exceptions/AstraDevOpsAPIException.java | 13 +++++++++++++ ...va => PCUGroupDatacenterAssociationsClient.java} | 0 ...cuGroupOpsClient.java => PCUGroupOpsClient.java} | 0 ...GroupsOpsClient.java => PCUGroupsOpsClient.java} | 0 ...rkloadType.java => PCUCapacityWorkloadType.java} | 0 .../sdk/pcu/domain/{PcuGroup.java => PCUGroup.java} | 0 ...equest.java => PCUGroupCreateUpdateRequest.java} | 0 ...ionRequest.java => PCUGroupCreationRequest.java} | 0 ...tion.java => PCUGroupDatacenterAssociation.java} | 0 ...GroupStatusType.java => PCUGroupStatusType.java} | 0 ...pdateRequest.java => PCUGroupUpdateRequest.java} | 0 .../{PcuInstanceType.java => PCUInstanceType.java} | 0 ...{PcuProvisionType.java => PCUProvisionType.java} | 0 .../sdk/pcu/domain/{PcuType.java => PCUType.java} | 0 ...cationFilter.java => PCUTypeLocationFilter.java} | 0 .../{PcuTypeResolver.java => PCUTypeResolver.java} | 0 ...upClientTest.java => PCUGroupClientDevTest.java} | 0 ...peResolverTest.java => PCUTypeResolverTest.java} | 0 20 files changed, 21 insertions(+) create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUGroupDefinition.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUTypeDefinition.java create mode 100644 astra-db-java/src/main/java/com/datastax/astra/client/exceptions/AstraDevOpsAPIException.java rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/{PcuGroupDatacenterAssociationsClient.java => PCUGroupDatacenterAssociationsClient.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/{PcuGroupOpsClient.java => PCUGroupOpsClient.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/{PcuGroupsOpsClient.java => PCUGroupsOpsClient.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuCapacityWorkloadType.java => PCUCapacityWorkloadType.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuGroup.java => PCUGroup.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuGroupCreateUpdateRequest.java => PCUGroupCreateUpdateRequest.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuGroupCreationRequest.java => PCUGroupCreationRequest.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuGroupDatacenterAssociation.java => PCUGroupDatacenterAssociation.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuGroupStatusType.java => PCUGroupStatusType.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuGroupUpdateRequest.java => PCUGroupUpdateRequest.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuInstanceType.java => PCUInstanceType.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuProvisionType.java => PCUProvisionType.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuType.java => PCUType.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuTypeLocationFilter.java => PCUTypeLocationFilter.java} (100%) rename astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/{PcuTypeResolver.java => PCUTypeResolver.java} (100%) rename astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/{PCUGroupClientTest.java => PCUGroupClientDevTest.java} (100%) rename astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/{PcuTypeResolverTest.java => PCUTypeResolverTest.java} (100%) diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUGroupDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUGroupDefinition.java new file mode 100644 index 00000000..9be09bd7 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUGroupDefinition.java @@ -0,0 +1,4 @@ +package com.datastax.astra.client.admin.definition; + +public class PCUGroupDefinition { +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUTypeDefinition.java b/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUTypeDefinition.java new file mode 100644 index 00000000..c01721e3 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/admin/definition/PCUTypeDefinition.java @@ -0,0 +1,4 @@ +package com.datastax.astra.client.admin.definition; + +public class PCUTypeDefinition { +} diff --git a/astra-db-java/src/main/java/com/datastax/astra/client/exceptions/AstraDevOpsAPIException.java b/astra-db-java/src/main/java/com/datastax/astra/client/exceptions/AstraDevOpsAPIException.java new file mode 100644 index 00000000..03f9a2c1 --- /dev/null +++ b/astra-db-java/src/main/java/com/datastax/astra/client/exceptions/AstraDevOpsAPIException.java @@ -0,0 +1,13 @@ +package com.datastax.astra.client.exceptions; + +import lombok.Getter; + +@Getter +public class DevOpsAPIException extends RuntimeException { + + /** Default error message. */ + public static final String DEFAULT_ERROR_MESSAGE = "Unexpected error occurred for Astra Devops API"; + + + +} diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupDatacenterAssociationsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PCUGroupDatacenterAssociationsClient.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupDatacenterAssociationsClient.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PCUGroupDatacenterAssociationsClient.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupOpsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PCUGroupOpsClient.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupOpsClient.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PCUGroupOpsClient.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsOpsClient.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PCUGroupsOpsClient.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PcuGroupsOpsClient.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/PCUGroupsOpsClient.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuCapacityWorkloadType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUCapacityWorkloadType.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuCapacityWorkloadType.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUCapacityWorkloadType.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroup.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroup.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroup.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroup.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreateUpdateRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupCreateUpdateRequest.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreateUpdateRequest.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupCreateUpdateRequest.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreationRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupCreationRequest.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupCreationRequest.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupCreationRequest.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupDatacenterAssociation.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupDatacenterAssociation.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupDatacenterAssociation.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupDatacenterAssociation.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupStatusType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupStatusType.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupStatusType.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupStatusType.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupUpdateRequest.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupUpdateRequest.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuGroupUpdateRequest.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUGroupUpdateRequest.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuInstanceType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUInstanceType.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuInstanceType.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUInstanceType.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuProvisionType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUProvisionType.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuProvisionType.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUProvisionType.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuType.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUType.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuType.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUType.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeLocationFilter.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUTypeLocationFilter.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeLocationFilter.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUTypeLocationFilter.java diff --git a/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeResolver.java b/astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUTypeResolver.java similarity index 100% rename from astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PcuTypeResolver.java rename to astra-sdk-devops/src/main/java/com/dtsx/astra/sdk/pcu/domain/PCUTypeResolver.java diff --git a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientTest.java b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientDevTest.java similarity index 100% rename from astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientTest.java rename to astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUGroupClientDevTest.java diff --git a/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PcuTypeResolverTest.java b/astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUTypeResolverTest.java similarity index 100% rename from astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PcuTypeResolverTest.java rename to astra-sdk-devops/src/test/java/com/dtsx/astra/sdk/pcu/PCUTypeResolverTest.java