Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions astra-db-java/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,20 @@
</systemPropertyVariables>
</configuration>
</plugin>

<!-- Build test-jar for other modules to use test utilities -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -110,14 +116,17 @@ public AstraDBAdmin(AdminOptions options) {
if (dataAPIClientOptions.getObservers() != null) {
Map<String, ApiRequestObserver> 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
Expand Down Expand Up @@ -158,6 +167,83 @@ public List<AstraAvailableRegionInfo> 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<PcuGroup> listPcuGroups(CloudProviderType cloud, String cloudRegion) {
List<PcuGroup> 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<PcuGroup> 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 ---
// --------------------
Expand Down Expand Up @@ -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.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.datastax.astra.client.admin.definition;

public class PCUGroupDefinition {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.datastax.astra.client.admin.definition;

public class PCUTypeDefinition {
}
Original file line number Diff line number Diff line change
@@ -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<CreateDatabaseOptions> {

boolean waitForDb = false;

/**
* Gets waitForDb
*
* @return value of waitForDb
*/
public boolean isWaitForDb() {
return waitForDb;
}
}
Original file line number Diff line number Diff line change
@@ -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";



}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
Loading
Loading