Skip to content

Commit edd80e8

Browse files
committed
Admin class overhauls (#79)
* make DataAPIDbAdmin keyspace options no longer extend AdminBlockingOptions * refactor raw db info into more workable objects * more unified naming convention of admin interfaces * bit of name tweaking * some admin info itnerface tweaking * light, temp documentation
1 parent 97650d3 commit edd80e8

23 files changed

+660
-560
lines changed

etc/astra-db-ts.api.md

Lines changed: 119 additions & 160 deletions
Large diffs are not rendered by default.

src/administration/astra-admin.ts

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,26 @@
1414
// noinspection ExceptionCaughtLocallyJS
1515

1616
import {
17-
AdminBlockingOptions,
1817
AdminSpawnOptions,
19-
CreateDatabaseOptions,
20-
DatabaseConfig,
21-
FullDatabaseInfo,
22-
ListDatabasesOptions,
18+
AstraAdminBlockingOptions,
19+
AstraDatabaseConfig,
20+
CreateAstraDatabaseOptions,
21+
ListAstraDatabasesOptions,
2322
} from '@/src/administration/types';
2423
import { AstraDbAdmin } from '@/src/administration/astra-db-admin';
2524
import { Db } from '@/src/db/db';
25+
import { buildAstraDatabaseAdminInfo } from '@/src/administration/utils';
2626
import { DEFAULT_DEVOPS_API_ENDPOINTS, DEFAULT_KEYSPACE, HttpMethods } from '@/src/lib/api/constants';
2727
import { DevOpsAPIHttpClient } from '@/src/lib/api/clients/devops-api-http-client';
2828
import { TokenProvider, WithTimeout } from '@/src/lib';
29+
import { AstraDbAdminInfo } from '@/src/administration/types/admin/database-info';
2930
import { parseAdminSpawnOpts } from '@/src/client/parsers/spawn-admin';
3031
import { InternalRootClientOpts } from '@/src/client/types/internal';
3132
import { buildAstraEndpoint } from '@/src/lib/utils';
3233
import { Logger } from '@/src/lib/logging/logger';
3334
import { DbSpawnOptions } from '@/src/client';
3435
import { $CustomInspect } from '@/src/lib/constants';
36+
import { SomeDoc } from '@/src/documents';
3537

3638
/**
3739
* An administrative class for managing Astra databases, including creating, listing, and deleting databases.
@@ -62,6 +64,7 @@ import { $CustomInspect } from '@/src/lib/constants';
6264
export class AstraAdmin {
6365
readonly #defaultOpts: InternalRootClientOpts;
6466
readonly #httpClient: DevOpsAPIHttpClient;
67+
readonly #environment: 'dev' | 'test' | 'prod';
6568

6669
/**
6770
* Use {@link DataAPIClient.admin} to obtain an instance of this class.
@@ -80,16 +83,19 @@ export class AstraAdmin {
8083
adminToken: token,
8184
logging: Logger.advanceConfig(rootOpts.adminOptions.logging, adminOpts?.logging),
8285
additionalHeaders: { ...rootOpts.adminOptions.additionalHeaders, ...adminOpts?.additionalHeaders },
86+
astraEnv: adminOpts?.astraEnv ?? rootOpts.adminOptions.astraEnv,
8387
},
8488
dbOptions: {
8589
...rootOpts.dbOptions,
8690
token: TokenProvider.parseToken([rootOpts.dbOptions.token, token], 'admin token'),
8791
},
8892
};
8993

94+
this.#environment = this.#defaultOpts.adminOptions.astraEnv ?? 'prod';
95+
9096
this.#httpClient = new DevOpsAPIHttpClient({
91-
baseUrl: this.#defaultOpts.adminOptions.endpointUrl || DEFAULT_DEVOPS_API_ENDPOINTS.prod,
9297
logging: this.#defaultOpts.adminOptions.logging,
98+
baseUrl: this.#defaultOpts.adminOptions.endpointUrl ?? DEFAULT_DEVOPS_API_ENDPOINTS[this.#environment],
9399
emitter: rootOpts.emitter,
94100
fetchCtx: rootOpts.fetchCtx,
95101
userAgent: rootOpts.userAgent,
@@ -262,8 +268,7 @@ export class AstraAdmin {
262268

263269
public dbAdmin(endpointOrId: string, regionOrOptions?: string | DbSpawnOptions, maybeOptions?: DbSpawnOptions): AstraDbAdmin {
264270
/* @ts-expect-error - calls internal representation of method */
265-
return this.db(endpointOrId, regionOrOptions, maybeOptions)
266-
.admin(this.#defaultOpts.adminOptions);
271+
return this.db(endpointOrId, regionOrOptions, maybeOptions).admin(this.#defaultOpts.adminOptions);
267272
}
268273

269274
/**
@@ -278,13 +283,13 @@ export class AstraAdmin {
278283
*
279284
* @returns A promise that resolves to the complete database information.
280285
*/
281-
public async dbInfo(id: string, options?: WithTimeout): Promise<FullDatabaseInfo> {
286+
public async dbInfo(id: string, options?: WithTimeout): Promise<AstraDbAdminInfo> {
282287
const resp = await this.#httpClient.request({
283288
method: HttpMethods.Get,
284289
path: `/databases/${id}`,
285290
}, options);
286291

287-
return resp.data as FullDatabaseInfo;
292+
return buildAstraDatabaseAdminInfo(resp.data!, this.#environment);
288293
}
289294

290295
/**
@@ -297,7 +302,7 @@ export class AstraAdmin {
297302
* You can also filter by the database status using the `include` option, and by the database provider using the
298303
* `provider` option.
299304
*
300-
* See {@link ListDatabasesOptions} for complete information about the options available for this operation.
305+
* See {@link ListAstraDatabasesOptions} for complete information about the options available for this operation.
301306
*
302307
* @example
303308
* ```typescript
@@ -313,23 +318,23 @@ export class AstraAdmin {
313318
* @param options - The options to filter the databases by.
314319
* @returns A list of the complete information for all the databases matching the given filter.
315320
*/
316-
public async listDatabases(options?: ListDatabasesOptions): Promise<FullDatabaseInfo[]> {
321+
public async listDatabases(options?: ListAstraDatabasesOptions): Promise<AstraDbAdminInfo[]> {
317322
const params = {} as Record<string, string>;
318323

319324
if (typeof options?.include === 'string') {
320-
(params['include'] = options.include);
325+
params['include'] = options.include;
321326
}
322327

323328
if (typeof options?.provider === 'string') {
324-
(params['provider'] = options.provider);
329+
params['provider'] = options.provider;
325330
}
326331

327332
if (typeof options?.limit === 'number') {
328-
(params['limit'] = String(options.skip));
333+
params['limit'] = String(options.skip);
329334
}
330335

331336
if (typeof options?.skip === 'number') {
332-
(params['starting_after'] = String(options.skip));
337+
params['starting_after'] = String(options.skip);
333338
}
334339

335340
const resp = await this.#httpClient.request({
@@ -338,13 +343,13 @@ export class AstraAdmin {
338343
params: params,
339344
}, options);
340345

341-
return resp.data as FullDatabaseInfo[];
346+
return resp.data!.map((d: SomeDoc) => buildAstraDatabaseAdminInfo(d, this.#environment));
342347
}
343348

344349
/**
345350
* Creates a new database with the given configuration.
346351
*
347-
* **NB. this is a long-running operation. See {@link AdminBlockingOptions} about such blocking operations.** The
352+
* **NB. this is a long-running operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
348353
* default polling interval is 10 seconds. Expect it to take roughly 2 min to complete.
349354
*
350355
* Note that **the `name` field is non-unique** and thus creating a database, even with the same options, is **not
@@ -354,7 +359,7 @@ export class AstraAdmin {
354359
* will override any default options set when creating the {@link DataAPIClient} through a deep merge (i.e. unset
355360
* properties in the options object will just default to the default options).
356361
*
357-
* See {@link CreateDatabaseOptions} for complete information about the options available for this operation.
362+
* See {@link CreateAstraDatabaseOptions} for complete information about the options available for this operation.
358363
*
359364
* @example
360365
* ```typescript
@@ -393,7 +398,7 @@ export class AstraAdmin {
393398
*
394399
* @returns The AstraDbAdmin instance for the newly created database.
395400
*/
396-
public async createDatabase(config: DatabaseConfig, options?: CreateDatabaseOptions): Promise<AstraDbAdmin> {
401+
public async createDatabase(config: AstraDatabaseConfig, options?: CreateAstraDatabaseOptions): Promise<AstraDbAdmin> {
397402
const definition = {
398403
capacityUnits: 1,
399404
tier: 'serverless',
@@ -422,7 +427,7 @@ export class AstraAdmin {
422427
/**
423428
* Terminates a database by ID or by a given {@link Db} instance.
424429
*
425-
* **NB. this is a long-running operation. See {@link AdminBlockingOptions} about such blocking operations.** The
430+
* **NB. this is a long-running operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
426431
* default polling interval is 10 seconds. Expect it to take roughly 6-7 min to complete.
427432
*
428433
* The database info will still be accessible by ID, or by using the {@link AstraAdmin.listDatabases} method with the filter
@@ -444,7 +449,7 @@ export class AstraAdmin {
444449
*
445450
* @remarks Use with caution. Wear a harness. Don't say I didn't warn you.
446451
*/
447-
public async dropDatabase(db: Db | string, options?: AdminBlockingOptions): Promise<void> {
452+
public async dropDatabase(db: Db | string, options?: AstraAdminBlockingOptions): Promise<void> {
448453
const id = typeof db === 'string' ? db : db.id;
449454

450455
await this.#httpClient.requestLongRunning({

src/administration/astra-db-admin.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,13 @@
1414
// noinspection ExceptionCaughtLocallyJS
1515

1616
import {
17-
AdminBlockingOptions,
1817
AdminSpawnOptions,
19-
CreateKeyspaceOptions,
20-
FullDatabaseInfo,
18+
AstraAdminBlockingOptions,
19+
AstraCreateKeyspaceOptions,
2120
} from '@/src/administration/types';
2221
import { DbAdmin } from '@/src/administration/db-admin';
2322
import { WithTimeout } from '@/src/lib/types';
24-
import { extractAstraEnvironment } from '@/src/administration/utils';
23+
import { buildAstraDatabaseAdminInfo, extractAstraEnvironment } from '@/src/administration/utils';
2524
import { FindEmbeddingProvidersResult } from '@/src/administration/types/db-admin/find-embedding-providers';
2625
import { DEFAULT_DEVOPS_API_ENDPOINTS, HttpMethods } from '@/src/lib/api/constants';
2726
import { DevOpsAPIHttpClient } from '@/src/lib/api/clients/devops-api-http-client';
@@ -30,8 +29,9 @@ import { StaticTokenProvider, TokenProvider } from '@/src/lib';
3029
import { isNullish } from '@/src/lib/utils';
3130
import { parseAdminSpawnOpts } from '@/src/client/parsers/spawn-admin';
3231
import { InternalRootClientOpts } from '@/src/client/types/internal';
33-
import { Logger } from '@/src/lib/logging/logger';
3432
import { $CustomInspect } from '@/src/lib/constants';
33+
import { AstraDbAdminInfo } from '@/src/administration/types/admin/database-info';
34+
import { Logger } from '@/src/lib/logging/logger';
3535

3636
/**
3737
* An administrative class for managing Astra databases, including creating, listing, and deleting keyspaces.
@@ -69,6 +69,7 @@ import { $CustomInspect } from '@/src/lib/constants';
6969
export class AstraDbAdmin extends DbAdmin {
7070
readonly #httpClient: DevOpsAPIHttpClient;
7171
readonly #db: Db;
72+
readonly #environment: 'dev' | 'test' | 'prod';
7273

7374
/**
7475
* Use {@link Db.admin} or {@link AstraAdmin.dbAdmin} to obtain an instance of this class.
@@ -86,10 +87,10 @@ export class AstraDbAdmin extends DbAdmin {
8687
? dbToken
8788
: _adminToken;
8889

89-
const environment = extractAstraEnvironment(endpoint);
90+
this.#environment = adminOpts?.astraEnv ?? rootOpts.adminOptions.astraEnv ?? extractAstraEnvironment(endpoint);
9091

9192
this.#httpClient = new DevOpsAPIHttpClient({
92-
baseUrl: adminOpts?.endpointUrl ?? rootOpts.adminOptions.endpointUrl ?? DEFAULT_DEVOPS_API_ENDPOINTS[environment],
93+
baseUrl: DEFAULT_DEVOPS_API_ENDPOINTS[this.#environment],
9394
logging: Logger.advanceConfig(rootOpts.adminOptions.logging, adminOpts?.logging),
9495
fetchCtx: rootOpts.fetchCtx,
9596
emitter: rootOpts.emitter,
@@ -171,13 +172,13 @@ export class AstraDbAdmin extends DbAdmin {
171172
*
172173
* @returns A promise that resolves to the complete database information.
173174
*/
174-
public async info(options?: WithTimeout): Promise<FullDatabaseInfo> {
175+
public async info(options?: WithTimeout): Promise<AstraDbAdminInfo> {
175176
const resp = await this.#httpClient.request({
176177
method: HttpMethods.Get,
177178
path: `/databases/${this.#db.id}`,
178179
}, options);
179180

180-
return resp.data as FullDatabaseInfo;
181+
return buildAstraDatabaseAdminInfo(resp.data!, this.#environment);
181182
}
182183

183184
/**
@@ -197,13 +198,13 @@ export class AstraDbAdmin extends DbAdmin {
197198
* @returns A promise that resolves to list of all the keyspaces in the database.
198199
*/
199200
public override async listKeyspaces(options?: WithTimeout): Promise<string[]> {
200-
return this.info(options).then(i => [i.info.keyspace!, ...i.info.additionalKeyspaces ?? []].filter(Boolean));
201+
return this.info(options).then(i => i.keyspaces);
201202
}
202203

203204
/**
204205
* Creates a new, additional, keyspace for this database.
205206
*
206-
* **NB. this is a "long-running" operation. See {@link AdminBlockingOptions} about such blocking operations.** The
207+
* **NB. this is a "long-running" operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
207208
* default polling interval is 1 second. Expect it to take roughly 8-10 seconds to complete.
208209
*
209210
* @example
@@ -230,7 +231,7 @@ export class AstraDbAdmin extends DbAdmin {
230231
*
231232
* @returns A promise that resolves when the operation completes.
232233
*/
233-
public override async createKeyspace(keyspace: string, options?: CreateKeyspaceOptions): Promise<void> {
234+
public override async createKeyspace(keyspace: string, options?: AstraCreateKeyspaceOptions): Promise<void> {
234235
if (options?.updateDbKeyspace) {
235236
this.#db.useKeyspace(keyspace);
236237
}
@@ -250,7 +251,7 @@ export class AstraDbAdmin extends DbAdmin {
250251
/**
251252
* Drops a keyspace from this database.
252253
*
253-
* **NB. this is a "long-running" operation. See {@link AdminBlockingOptions} about such blocking operations.** The
254+
* **NB. this is a "long-running" operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
254255
* default polling interval is 1 second. Expect it to take roughly 8-10 seconds to complete.
255256
*
256257
* @example
@@ -278,7 +279,7 @@ export class AstraDbAdmin extends DbAdmin {
278279
*
279280
* @returns A promise that resolves when the operation completes.
280281
*/
281-
public override async dropKeyspace(keyspace: string, options?: AdminBlockingOptions): Promise<void> {
282+
public override async dropKeyspace(keyspace: string, options?: AstraAdminBlockingOptions): Promise<void> {
282283
await this.#httpClient.requestLongRunning({
283284
method: HttpMethods.Delete,
284285
path: `/databases/${this.#db.id}/keyspaces/${keyspace}`,
@@ -294,7 +295,7 @@ export class AstraDbAdmin extends DbAdmin {
294295
/**
295296
* Drops the database.
296297
*
297-
* **NB. this is a long-running operation. See {@link AdminBlockingOptions} about such blocking operations.** The
298+
* **NB. this is a long-running operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
298299
* default polling interval is 10 seconds. Expect it to take roughly 6-7 min to complete.
299300
*
300301
* The database info will still be accessible by ID, or by using the {@link AstraAdmin.listDatabases} method with the filter
@@ -312,7 +313,7 @@ export class AstraDbAdmin extends DbAdmin {
312313
*
313314
* @remarks Use with caution. Use a surge protector. Don't say I didn't warn you.
314315
*/
315-
public async drop(options?: AdminBlockingOptions): Promise<void> {
316+
public async drop(options?: AstraAdminBlockingOptions): Promise<void> {
316317
await this.#httpClient.requestLongRunning({
317318
method: HttpMethods.Post,
318319
path: `/databases/${this.#db.id}/terminate`,

src/administration/data-api-db-admin.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// limitations under the License.
1414
// noinspection ExceptionCaughtLocallyJS
1515

16-
import { AdminBlockingOptions, AdminSpawnOptions, LocalCreateKeyspaceOptions } from '@/src/administration/types';
16+
import { AdminSpawnOptions, LocalCreateKeyspaceOptions } from '@/src/administration/types';
1717
import { DbAdmin } from '@/src/administration/db-admin';
1818
import { WithTimeout } from '@/src/lib/types';
1919
import { FindEmbeddingProvidersResult } from '@/src/administration/types/db-admin/find-embedding-providers';
@@ -141,7 +141,7 @@ export class DataAPIDbAdmin extends DbAdmin {
141141
/**
142142
* Creates a new, additional, keyspace for this database.
143143
*
144-
* **NB. The operation will always wait for the operation to complete, regardless of the {@link AdminBlockingOptions}. Expect it to take roughly 8-10 seconds.**
144+
* **NB. The operation will always wait for the operation to complete, regardless of the {@link AstraAdminBlockingOptions}. Expect it to take roughly 8-10 seconds.**
145145
*
146146
* @example
147147
* ```typescript
@@ -184,7 +184,7 @@ export class DataAPIDbAdmin extends DbAdmin {
184184
/**
185185
* Drops a keyspace from this database.
186186
*
187-
* **NB. The operation will always wait for the operation to complete, regardless of the {@link AdminBlockingOptions}. Expect it to take roughly 8-10 seconds.**
187+
* **NB. The operation will always wait for the operation to complete, regardless of the {@link AstraAdminBlockingOptions}. Expect it to take roughly 8-10 seconds.**
188188
*
189189
* @example
190190
* ```typescript
@@ -202,7 +202,7 @@ export class DataAPIDbAdmin extends DbAdmin {
202202
*
203203
* @returns A promise that resolves when the operation completes.
204204
*/
205-
public override async dropKeyspace(keyspace: string, options?: AdminBlockingOptions): Promise<void> {
205+
public override async dropKeyspace(keyspace: string, options?: WithTimeout): Promise<void> {
206206
await this.#httpClient.executeCommand({ dropKeyspace: { name: keyspace } }, { maxTimeMS: options?.maxTimeMS, keyspace: null });
207207
}
208208

src/administration/db-admin.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
// limitations under the License.
1414
// noinspection ExceptionCaughtLocallyJS
1515

16-
import { AdminBlockingOptions, CreateKeyspaceOptions } from '@/src/administration/types';
1716
import { FindEmbeddingProvidersResult } from '@/src/administration/types/db-admin/find-embedding-providers';
1817
import { WithTimeout } from '@/src/lib';
1918
import { Db } from '@/src/db';
@@ -85,7 +84,7 @@ export abstract class DbAdmin {
8584
/**
8685
* Creates a new, additional, keyspace for this database.
8786
*
88-
* **NB. this is a "long-running" operation. See {@link AdminBlockingOptions} about such blocking operations.** The
87+
* **NB. this is a "long-running" operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
8988
* default polling interval is 1 second. Expect it to take roughly 8-10 seconds to complete.
9089
*
9190
* @example
@@ -112,11 +111,11 @@ export abstract class DbAdmin {
112111
*
113112
* @returns A promise that resolves when the operation completes.
114113
*/
115-
abstract createKeyspace(keyspace: string, options?: CreateKeyspaceOptions): Promise<void>;
114+
abstract createKeyspace(keyspace: string, options?: WithTimeout): Promise<void>;
116115
/**
117116
* Drops a keyspace from this database.
118117
*
119-
* **NB. this is a "long-running" operation. See {@link AdminBlockingOptions} about such blocking operations.** The
118+
* **NB. this is a "long-running" operation. See {@link AstraAdminBlockingOptions} about such blocking operations.** The
120119
* default polling interval is 1 second. Expect it to take roughly 8-10 seconds to complete.
121120
*
122121
* @example
@@ -144,5 +143,5 @@ export abstract class DbAdmin {
144143
*
145144
* @returns A promise that resolves when the operation completes.
146145
*/
147-
abstract dropKeyspace(keyspace: string, options?: AdminBlockingOptions): Promise<void>;
146+
abstract dropKeyspace(keyspace: string, options?: WithTimeout): Promise<void>;
148147
}

0 commit comments

Comments
 (0)