Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
62ad1655d5 | |||
caf3a095f2 | |||
89e44b2e5f | |||
a617f51b19 | |||
355e04fd1d | |||
89bd767bea | |||
e567ebbf21 | |||
33311348e2 | |||
d6e914edab | |||
da7b866f23 | |||
7654d780b1 | |||
dbd9b661c6 | |||
e19d0b4deb | |||
f0ebb719f7 | |||
c8e0666bc6 | |||
0d0b106f90 | |||
c9073df7cd | |||
f65200703d | |||
57970b3d10 | |||
b4d9f40c41 |
67
changelog.md
67
changelog.md
@ -1,5 +1,72 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2024-12-30 - 4.11.0 - feat(external-registry)
|
||||||
|
Introduce external registry management
|
||||||
|
|
||||||
|
- Added ExternalRegistryManager to handle external registry operations.
|
||||||
|
- Implemented ability to create, retrieve, and delete external registries.
|
||||||
|
- Enhanced Cloudly class to include ExternalRegistryManager.
|
||||||
|
|
||||||
|
## 2024-12-29 - 4.10.0 - feat(apiclient)
|
||||||
|
Added support for managing external registries in the API client.
|
||||||
|
|
||||||
|
- Introduced methods to get a registry by ID, get all registries, and create a new registry in the externalRegistry object.
|
||||||
|
- Updated external registry request interfaces to match new API client capabilities.
|
||||||
|
|
||||||
|
## 2024-12-29 - 4.9.0 - feat(apiclient)
|
||||||
|
Add external registry management capabilities to Cloudly API client.
|
||||||
|
|
||||||
|
- Introduce ExternalRegistry class with methods for getting, creating, and updating external registries.
|
||||||
|
- Expand requests module to handle external registry management, including creation and deletion.
|
||||||
|
|
||||||
|
## 2024-12-28 - 4.8.1 - fix(interfaces)
|
||||||
|
Fix image location schema in IImage interface
|
||||||
|
|
||||||
|
- Refactored the 'external' object within IImage data to a 'location' object.
|
||||||
|
- Added 'internal' boolean to 'location' to specify internal/external status.
|
||||||
|
|
||||||
|
## 2024-12-28 - 4.8.0 - feat(manager.registry)
|
||||||
|
Add external registry management
|
||||||
|
|
||||||
|
- Introduced ExternalRegistry class for handling external registry configurations.
|
||||||
|
- Updated IExternalRegistry interface to include registry details.
|
||||||
|
- Enhanced IImage interface to support linking with external registries.
|
||||||
|
|
||||||
|
## 2024-12-28 - 4.7.1 - fix(secretmanagement)
|
||||||
|
Refactor secret bundle actions and improve authorization handling
|
||||||
|
|
||||||
|
- Refactored secret bundle handling by renaming methods and reorganizing static and instance methods in SecretBundle class.
|
||||||
|
- Added getSecretBundleByAuthorization method to SecretBundle.
|
||||||
|
- Improved getFlatKeyValueObjectForEnvironment to accurately retrieve key-value pairs for specified environments.
|
||||||
|
- Removed deprecated IEnvBundle interface and related request handler for better clarity and code usage.
|
||||||
|
- Updated request interfaces related to secret bundles for consistent method naming and arguments.
|
||||||
|
|
||||||
|
## 2024-12-22 - 4.7.0 - feat(apiclient)
|
||||||
|
Add method to flatten secret bundles into key-value objects.
|
||||||
|
|
||||||
|
- SecretBundle: Implemented toFlatKeyValueObject method to flatten secret groups into key-value pairs.
|
||||||
|
- Removed stale SecretManager class from apiclient.
|
||||||
|
|
||||||
|
## 2024-12-22 - 4.6.0 - feat(cloudlyapiclient)
|
||||||
|
Extend CloudlyApiClient with cluster, secretbundle, and secretgroup methods
|
||||||
|
|
||||||
|
- Added methods to CloudlyApiClient for managing clusters: getClusterById, getClusters, createCluster.
|
||||||
|
- Added methods to CloudlyApiClient for managing secret bundles: getSecretBundleById, getSecretBundles, createSecretBundle.
|
||||||
|
- Added methods to CloudlyApiClient for managing secret groups: getSecretGroupById, getSecretGroups, createSecretGroup.
|
||||||
|
|
||||||
|
## 2024-12-22 - 4.5.5 - fix(apiclient)
|
||||||
|
Fixed image creation method in cloudlyApiClient
|
||||||
|
|
||||||
|
- Corrected method call from 'images.createImage' to 'image.createImage' to ensure proper image creation.
|
||||||
|
- Updated cluster retrieval methods and ensured proper API routes are being called.
|
||||||
|
|
||||||
|
## 2024-12-21 - 4.5.4 - fix(ts_web)
|
||||||
|
Fix action type and data fields in appstate for CRUD operations
|
||||||
|
|
||||||
|
- Correct request method in createSecretGroupAction to accurately reflect the purpose.
|
||||||
|
- Align the deleteSecretGroupAction and deleteSecretBundleAction request types with proper interfaces.
|
||||||
|
- Ensure data payload matches backend requirements for secret group and secret bundle operations.
|
||||||
|
|
||||||
## 2024-12-21 - 4.5.3 - fix(secret-management)
|
## 2024-12-21 - 4.5.3 - fix(secret-management)
|
||||||
Refactor secret management to use distinct secret bundle and group APIs. Introduce API client classes for secret bundles and groups.
|
Refactor secret management to use distinct secret bundle and group APIs. Introduce API client classes for secret bundles and groups.
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@serve.zone/cloudly",
|
"name": "@serve.zone/cloudly",
|
||||||
"version": "4.5.3",
|
"version": "4.11.0",
|
||||||
"private": false,
|
"private": false,
|
||||||
"description": "A comprehensive tool for managing containerized applications across multiple cloud providers using Docker Swarmkit, featuring web, CLI, and API interfaces.",
|
"description": "A comprehensive tool for managing containerized applications across multiple cloud providers using Docker Swarmkit, featuring web, CLI, and API interfaces.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -57,7 +57,7 @@ tap.test('should get an identity', async () => {
|
|||||||
|
|
||||||
let image: Image;
|
let image: Image;
|
||||||
tap.test('should create and upload an image', async () => {
|
tap.test('should create and upload an image', async () => {
|
||||||
image = await testClient.images.createImage({
|
image = await testClient.image.createImage({
|
||||||
name: 'test',
|
name: 'test',
|
||||||
description: 'test'
|
description: 'test'
|
||||||
});
|
});
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@serve.zone/cloudly',
|
name: '@serve.zone/cloudly',
|
||||||
version: '4.5.3',
|
version: '4.11.0',
|
||||||
description: 'A comprehensive tool for managing containerized applications across multiple cloud providers using Docker Swarmkit, featuring web, CLI, and API interfaces.'
|
description: 'A comprehensive tool for managing containerized applications across multiple cloud providers using Docker Swarmkit, featuring web, CLI, and API interfaces.'
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import { CloudlyTaskmanager } from './manager.task/taskmanager.js';
|
|||||||
import { CloudlySecretManager } from './manager.secret/classes.secretmanager.js';
|
import { CloudlySecretManager } from './manager.secret/classes.secretmanager.js';
|
||||||
import { CloudlyServerManager } from './manager.server/classes.servermanager.js';
|
import { CloudlyServerManager } from './manager.server/classes.servermanager.js';
|
||||||
import { ExternalApiManager } from './manager.status/statusmanager.js';
|
import { ExternalApiManager } from './manager.status/statusmanager.js';
|
||||||
|
import { ExternalRegistryManager } from './manager.externalregistry/index.js';
|
||||||
import { ImageManager } from './manager.image/classes.imagemanager.js';
|
import { ImageManager } from './manager.image/classes.imagemanager.js';
|
||||||
import { logger } from './logger.js';
|
import { logger } from './logger.js';
|
||||||
import { CloudlyAuthManager } from './manager.auth/classes.authmanager.js';
|
import { CloudlyAuthManager } from './manager.auth/classes.authmanager.js';
|
||||||
@ -54,6 +55,7 @@ export class Cloudly {
|
|||||||
public clusterManager: ClusterManager;
|
public clusterManager: ClusterManager;
|
||||||
public coreflowManager: CloudlyCoreflowManager;
|
public coreflowManager: CloudlyCoreflowManager;
|
||||||
public externalApiManager: ExternalApiManager;
|
public externalApiManager: ExternalApiManager;
|
||||||
|
public externalRegistryManager: ExternalRegistryManager;
|
||||||
public imageManager: ImageManager;
|
public imageManager: ImageManager;
|
||||||
public taskManager: CloudlyTaskmanager;
|
public taskManager: CloudlyTaskmanager;
|
||||||
public serverManager: CloudlyServerManager;
|
public serverManager: CloudlyServerManager;
|
||||||
@ -80,6 +82,7 @@ export class Cloudly {
|
|||||||
this.clusterManager = new ClusterManager(this);
|
this.clusterManager = new ClusterManager(this);
|
||||||
this.coreflowManager = new CloudlyCoreflowManager(this);
|
this.coreflowManager = new CloudlyCoreflowManager(this);
|
||||||
this.externalApiManager = new ExternalApiManager(this);
|
this.externalApiManager = new ExternalApiManager(this);
|
||||||
|
this.externalRegistryManager = new ExternalRegistryManager(this);
|
||||||
this.imageManager = new ImageManager(this);
|
this.imageManager = new ImageManager(this);
|
||||||
this.taskManager = new CloudlyTaskmanager(this);
|
this.taskManager = new CloudlyTaskmanager(this);
|
||||||
this.secretManager = new CloudlySecretManager(this);
|
this.secretManager = new CloudlySecretManager(this);
|
||||||
|
@ -38,13 +38,13 @@ export class ClusterManager {
|
|||||||
console.log(await cluster.createSavableObject());
|
console.log(await cluster.createSavableObject());
|
||||||
this.cloudlyRef.serverManager.ensureServerInfrastructure();
|
this.cloudlyRef.serverManager.ensureServerInfrastructure();
|
||||||
return {
|
return {
|
||||||
clusterConfig: await cluster.createSavableObject(),
|
cluster: await cluster.createSavableObject(),
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.cluster.IRequest_GetAllClusters>(
|
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.cluster.IReq_Any_Cloudly_GetClusters>(
|
||||||
new plugins.typedrequest.TypedHandler('getAllClusters', async (dataArg) => {
|
new plugins.typedrequest.TypedHandler('getClusters', async (dataArg) => {
|
||||||
// TODO: do authentication here
|
// TODO: do authentication here
|
||||||
const clusters = await this.getAllClusters();
|
const clusters = await this.getAllClusters();
|
||||||
return {
|
return {
|
||||||
@ -56,12 +56,12 @@ export class ClusterManager {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// delete cluster
|
// delete cluster
|
||||||
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.cluster.IRequest_DeleteCluster>(
|
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.cluster.IReq_Any_Cloudly_DeleteClusterById>(
|
||||||
new plugins.typedrequest.TypedHandler('deleteCluster', async (reqDataArg, toolsArg) => {
|
new plugins.typedrequest.TypedHandler('deleteClusterById', async (reqDataArg, toolsArg) => {
|
||||||
await toolsArg.passGuards([this.cloudlyRef.authManager.adminIdentityGuard], reqDataArg);
|
await toolsArg.passGuards([this.cloudlyRef.authManager.adminIdentityGuard], reqDataArg);
|
||||||
await this.deleteCluster(reqDataArg.clusterId);
|
await this.deleteCluster(reqDataArg.clusterId);
|
||||||
return {
|
return {
|
||||||
success: true,
|
ok: true,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
40
ts/manager.externalregistry/classes.externalregistry.ts
Normal file
40
ts/manager.externalregistry/classes.externalregistry.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import * as plugins from '../plugins.js';
|
||||||
|
import * as paths from '../paths.js';
|
||||||
|
import type { Cloudly } from 'ts/classes.cloudly.js';
|
||||||
|
import type { ExternalRegistryManager } from './classes.externalregistrymanager.js';
|
||||||
|
|
||||||
|
export class ExternalRegistry extends plugins.smartdata.SmartDataDbDoc<ExternalRegistry, plugins.servezoneInterfaces.data.IExternalRegistry, ExternalRegistryManager> {
|
||||||
|
// STATIC
|
||||||
|
public static async getRegistryById(registryIdArg: string) {
|
||||||
|
const externalRegistry = await this.getInstance({
|
||||||
|
id: registryIdArg,
|
||||||
|
});
|
||||||
|
return externalRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getRegistries() {
|
||||||
|
const externalRegistries = await this.getInstances({});
|
||||||
|
return externalRegistries;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async createExternalRegistry(registryDataArg: Partial<plugins.servezoneInterfaces.data.IExternalRegistry['data']>) {
|
||||||
|
const externalRegistry = new ExternalRegistry();
|
||||||
|
externalRegistry.id = await ExternalRegistry.getNewId();
|
||||||
|
Object.assign(externalRegistry, registryDataArg);
|
||||||
|
await externalRegistry.save();
|
||||||
|
return externalRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
// INSTANCE
|
||||||
|
|
||||||
|
@plugins.smartdata.svDb()
|
||||||
|
public id: string;
|
||||||
|
|
||||||
|
@plugins.smartdata.svDb()
|
||||||
|
public data: plugins.servezoneInterfaces.data.IExternalRegistry['data'];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
import * as plugins from '../plugins.js';
|
||||||
|
import { Cloudly } from '../classes.cloudly.js';
|
||||||
|
import { ExternalRegistry } from './classes.externalregistry.js';
|
||||||
|
|
||||||
|
export class ExternalRegistryManager {
|
||||||
|
public cloudlyRef: Cloudly;
|
||||||
|
public typedrouter = new plugins.typedrequest.TypedRouter();
|
||||||
|
public CExternalRegistry = plugins.smartdata.setDefaultManagerForDoc(this, ExternalRegistry);
|
||||||
|
|
||||||
|
get db() {
|
||||||
|
return this.cloudlyRef.mongodbConnector.smartdataDb;
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(cloudlyRef: Cloudly) {
|
||||||
|
this.cloudlyRef = cloudlyRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async start() {
|
||||||
|
// lets set up a typedrouter
|
||||||
|
this.typedrouter.addTypedRouter(this.typedrouter);
|
||||||
|
|
||||||
|
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.externalRegistry.IReq_GetRegistryById>(
|
||||||
|
new plugins.typedrequest.TypedHandler('getExternalRegistryById', async (dataArg) => {
|
||||||
|
const registry = await ExternalRegistry.getRegistryById(dataArg.id);
|
||||||
|
return {
|
||||||
|
registry: await registry.createSavableObject(),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.externalRegistry.IReq_GetRegistries>(
|
||||||
|
new plugins.typedrequest.TypedHandler('getExternalRegistries', async (dataArg) => {
|
||||||
|
const registries = await ExternalRegistry.getRegistries();
|
||||||
|
return {
|
||||||
|
registries: await Promise.all(
|
||||||
|
registries.map((registry) => registry.createSavableObject())
|
||||||
|
),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
this.typedrouter.addTypedHandler<plugins.servezoneInterfaces.requests.externalRegistry.IReq_CreateRegistry>(
|
||||||
|
new plugins.typedrequest.TypedHandler('createExternalRegistry', async (dataArg) => {
|
||||||
|
const registry = await ExternalRegistry.createExternalRegistry(dataArg.registryData);
|
||||||
|
return {
|
||||||
|
registry: await registry.createSavableObject(),
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
2
ts/manager.externalregistry/index.ts
Normal file
2
ts/manager.externalregistry/index.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
export * from './classes.externalregistrymanager.js';
|
||||||
|
export * from './classes.externalregistry.js';
|
@ -148,30 +148,26 @@ export class CloudlySecretManager {
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.typedrouter.addTypedHandler(
|
this.typedrouter.addTypedHandler(
|
||||||
new plugins.typedrequest.TypedHandler<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetEnvBundle>(
|
new plugins.typedrequest.TypedHandler<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetFlatKeyValueObject>(
|
||||||
'getEnvBundle',
|
'getFlatKeyValueObject',
|
||||||
async (dataArg) => {
|
async (dataArg) => {
|
||||||
const wantedBundle = await SecretBundle.getInstance({
|
const wantedBundle = await SecretBundle.getInstance({
|
||||||
data: {
|
data: {
|
||||||
authorizations: {
|
authorizations: {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
$elemMatch: {
|
$elemMatch: {
|
||||||
secretAccessKey: dataArg.authorization,
|
secretAccessKey: dataArg.secretBundleAuthorization.secretAccessKey,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const authorization = await wantedBundle.getAuthorizationFromAuthKey(
|
const authorization = await wantedBundle.getAuthorizationFromAuthKey(
|
||||||
dataArg.authorization,
|
dataArg.secretBundleAuthorization.secretAccessKey,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
envBundle: {
|
flatKeyValueObject: await wantedBundle.getKeyValueObjectForEnvironment(
|
||||||
configKeyValueObject: await wantedBundle.getKeyValueObjectForEnvironment(
|
|
||||||
authorization.environment,
|
authorization.environment,
|
||||||
),
|
),
|
||||||
environment: authorization.environment,
|
|
||||||
timeSensitive: false,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
@ -4,6 +4,10 @@ export type TClientType = 'api' | 'ci' | 'coreflow' | 'cli' | 'serverconfig';
|
|||||||
|
|
||||||
import { Image } from './classes.image.js';
|
import { Image } from './classes.image.js';
|
||||||
import { Service } from './classes.service.js';
|
import { Service } from './classes.service.js';
|
||||||
|
import { Cluster } from './classes.cluster.js';
|
||||||
|
import { SecretBundle } from './classes.secretbundle.js';
|
||||||
|
import { SecretGroup } from './classes.secretgroup.js';
|
||||||
|
import { ExternalRegistry } from './classes.externalregistry.js';
|
||||||
|
|
||||||
export class CloudlyApiClient {
|
export class CloudlyApiClient {
|
||||||
private cloudlyUrl: string;
|
private cloudlyUrl: string;
|
||||||
@ -156,7 +160,20 @@ export class CloudlyApiClient {
|
|||||||
return typedResponse.certificate;
|
return typedResponse.certificate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public images = {
|
public externalRegistry = {
|
||||||
|
// ExternalRegistry
|
||||||
|
getRegistryById: async (registryNameArg: string) => {
|
||||||
|
return ExternalRegistry.getExternalRegistryById(this, registryNameArg);
|
||||||
|
},
|
||||||
|
getRegistries: async () => {
|
||||||
|
return ExternalRegistry.getExternalRegistries(this);
|
||||||
|
},
|
||||||
|
createRegistry: async (optionsArg: Parameters<typeof ExternalRegistry.createExternalRegistry>[1]) => {
|
||||||
|
return ExternalRegistry.createExternalRegistry(this, optionsArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public image = {
|
||||||
// Images
|
// Images
|
||||||
getImageById: async (imageIdArg: string) => {
|
getImageById: async (imageIdArg: string) => {
|
||||||
return Image.getImageById(this, imageIdArg);
|
return Image.getImageById(this, imageIdArg);
|
||||||
@ -181,4 +198,43 @@ export class CloudlyApiClient {
|
|||||||
return Service.createService(this, optionsArg);
|
return Service.createService(this, optionsArg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public cluster = {
|
||||||
|
// Clusters
|
||||||
|
getClusterById: async (clusterIdArg: string) => {
|
||||||
|
return Cluster.getClusterById(this, clusterIdArg);
|
||||||
|
},
|
||||||
|
getClusters: async () => {
|
||||||
|
return Cluster.getClusters(this);
|
||||||
|
},
|
||||||
|
createCluster: async (optionsArg: Parameters<typeof Cluster.createCluster>[1]) => {
|
||||||
|
return Cluster.createCluster(this, optionsArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public secretbundle = {
|
||||||
|
// SecretBundles
|
||||||
|
getSecretBundleById: async (secretBundleIdArg: string) => {
|
||||||
|
return SecretBundle.getSecretBundleById(this, secretBundleIdArg);
|
||||||
|
},
|
||||||
|
getSecretBundles: async () => {
|
||||||
|
return SecretBundle.getSecretBundles(this);
|
||||||
|
},
|
||||||
|
createSecretBundle: async (optionsArg: Parameters<typeof SecretBundle.createSecretBundle>[1]) => {
|
||||||
|
return SecretBundle.createSecretBundle(this, optionsArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public secretgroup = {
|
||||||
|
// SecretGroups
|
||||||
|
getSecretGroupById: async (secretGroupIdArg: string) => {
|
||||||
|
return SecretGroup.getSecretGroupById(this, secretGroupIdArg);
|
||||||
|
},
|
||||||
|
getSecretGroups: async () => {
|
||||||
|
return SecretGroup.getSecretGroups(this);
|
||||||
|
},
|
||||||
|
createSecretGroup: async (optionsArg: Parameters<typeof SecretGroup.createSecretGroup>[1]) => {
|
||||||
|
return SecretGroup.createSecretGroup(this, optionsArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,84 @@
|
|||||||
|
import { CloudlyApiClient } from './classes.cloudlyapiclient.js';
|
||||||
import * as plugins from './plugins.js';
|
import * as plugins from './plugins.js';
|
||||||
|
|
||||||
export class Cluster {
|
export class Cluster implements plugins.servezoneInterfaces.data.ICluster {
|
||||||
public getServers() {}
|
// STATIC
|
||||||
|
public static async getClusterById(cloudlyClientRef: CloudlyApiClient, clusterIdArg: string) {
|
||||||
|
const getClusterByIdTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.cluster.IReq_Any_Cloudly_GetClusterById>(
|
||||||
|
'getClusterById'
|
||||||
|
);
|
||||||
|
const response = await getClusterByIdTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
clusterId: clusterIdArg,
|
||||||
|
});
|
||||||
|
const newCluster = new Cluster(cloudlyClientRef);
|
||||||
|
Object.assign(newCluster, response.cluster);
|
||||||
|
return newCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getClusters(cloudlyClientRef: CloudlyApiClient) {
|
||||||
|
const getClustersTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.cluster.IReq_Any_Cloudly_GetClusters>(
|
||||||
|
'getClusters'
|
||||||
|
);
|
||||||
|
const response = await getClustersTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
});
|
||||||
|
const clusterConfigs: Cluster[] = [];
|
||||||
|
for (const clusterConfig of response.clusters) {
|
||||||
|
const newCluster = new Cluster(cloudlyClientRef);
|
||||||
|
Object.assign(newCluster, clusterConfig);
|
||||||
|
clusterConfigs.push(newCluster);
|
||||||
|
}
|
||||||
|
return clusterConfigs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async createCluster(cloudlyClientRef: CloudlyApiClient, clusterNameArg: string) {
|
||||||
|
const createClusterTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.cluster.IRequest_CreateCluster>(
|
||||||
|
'createCluster'
|
||||||
|
);
|
||||||
|
const response = await createClusterTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
clusterName: clusterNameArg,
|
||||||
|
});
|
||||||
|
const newCluster = new Cluster(cloudlyClientRef);
|
||||||
|
Object.assign(newCluster, response.cluster);
|
||||||
|
return newCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
// INSTANCE
|
||||||
|
public id: string;
|
||||||
|
public data: plugins.servezoneInterfaces.data.ICluster['data'];
|
||||||
|
public cloudlyClientRef: CloudlyApiClient;
|
||||||
|
|
||||||
|
constructor(cloudlyClientRef: CloudlyApiClient) {
|
||||||
|
this.cloudlyClientRef = cloudlyClientRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async update() {
|
||||||
|
const updateClusterTR = this.cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.cluster.IReq_Any_Cloudly_UpdateCluster>(
|
||||||
|
'updateCluster'
|
||||||
|
);
|
||||||
|
const response = await updateClusterTR.fire({
|
||||||
|
identity: this.cloudlyClientRef.identity,
|
||||||
|
clusterData: this.data,
|
||||||
|
});
|
||||||
|
|
||||||
|
const resultClusterData = response.resultCluster.data;
|
||||||
|
plugins.smartexpect.expect(resultClusterData).toEqual(this.data);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async delete(cloudlyClientRef: CloudlyApiClient, clusterIdArg: string) {
|
||||||
|
const deleteClusterTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.cluster.IReq_Any_Cloudly_DeleteClusterById>(
|
||||||
|
'deleteClusterById'
|
||||||
|
);
|
||||||
|
const response = await deleteClusterTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
clusterId: this.id,
|
||||||
|
});
|
||||||
|
plugins.smartexpect.expect(response.ok).toBeTrue();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
83
ts_apiclient/classes.externalregistry.ts
Normal file
83
ts_apiclient/classes.externalregistry.ts
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
import * as plugins from './plugins.js';
|
||||||
|
import type { CloudlyApiClient } from './classes.cloudlyapiclient.js';
|
||||||
|
|
||||||
|
export class ExternalRegistry implements plugins.servezoneInterfaces.data.IExternalRegistry {
|
||||||
|
// STATIC
|
||||||
|
public static async getExternalRegistryById(cloudlyClientRef: CloudlyApiClient, registryNameArg: string) {
|
||||||
|
const getRegistryByIdTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.externalRegistry.IReq_GetRegistryById>(
|
||||||
|
'getExternalRegistryById'
|
||||||
|
);
|
||||||
|
const response = await getRegistryByIdTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
id: registryNameArg,
|
||||||
|
});
|
||||||
|
const newRegistry = new ExternalRegistry(cloudlyClientRef);
|
||||||
|
Object.assign(newRegistry, response.registry);
|
||||||
|
return newRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async getExternalRegistries(cloudlyClientRef: CloudlyApiClient) {
|
||||||
|
const getRegistriesTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.externalRegistry.IReq_GetRegistries>(
|
||||||
|
'getExternalRegistries'
|
||||||
|
);
|
||||||
|
const response = await getRegistriesTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
});
|
||||||
|
const registryConfigs: ExternalRegistry[] = [];
|
||||||
|
for (const registryConfig of response.registries) {
|
||||||
|
const newRegistry = new ExternalRegistry(cloudlyClientRef);
|
||||||
|
Object.assign(newRegistry, registryConfig);
|
||||||
|
registryConfigs.push(newRegistry);
|
||||||
|
}
|
||||||
|
return registryConfigs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async createExternalRegistry(cloudlyClientRef: CloudlyApiClient, registryDataArg: Partial<plugins.servezoneInterfaces.data.IExternalRegistry['data']>) {
|
||||||
|
const createRegistryTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.externalRegistry.IReq_CreateRegistry>(
|
||||||
|
'createExternalRegistry'
|
||||||
|
);
|
||||||
|
const response = await createRegistryTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
registryData: registryDataArg as plugins.servezoneInterfaces.data.IExternalRegistry['data'],
|
||||||
|
});
|
||||||
|
const newRegistry = new ExternalRegistry(cloudlyClientRef);
|
||||||
|
Object.assign(newRegistry, response.registry);
|
||||||
|
return newRegistry;
|
||||||
|
}
|
||||||
|
|
||||||
|
// INSTANCE
|
||||||
|
public id: string;
|
||||||
|
public data: plugins.servezoneInterfaces.data.IExternalRegistry['data'];
|
||||||
|
public cloudlyClientRef: CloudlyApiClient;
|
||||||
|
|
||||||
|
constructor(cloudlyClientRef: CloudlyApiClient) {
|
||||||
|
this.cloudlyClientRef = cloudlyClientRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async update() {
|
||||||
|
const updateRegistryTR = this.cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.externalRegistry.IReq_UpdateRegistry>(
|
||||||
|
'updateExternalRegistry'
|
||||||
|
);
|
||||||
|
const response = await updateRegistryTR.fire({
|
||||||
|
identity: this.cloudlyClientRef.identity,
|
||||||
|
registryData: this.data,
|
||||||
|
});
|
||||||
|
|
||||||
|
const resultRegistryData = response.resultRegistry.data;
|
||||||
|
plugins.smartexpect.expect(resultRegistryData).toEqual(this.data);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async delete(cloudlyClientRef: CloudlyApiClient, registryIdArg: string) {
|
||||||
|
const deleteRegistryTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.externalRegistry.IReq_DeleteRegistryById>(
|
||||||
|
'deleteExternalRegistryById'
|
||||||
|
);
|
||||||
|
const response = await deleteRegistryTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
registryId: this.id,
|
||||||
|
});
|
||||||
|
plugins.smartexpect.expect(response.ok).toBeTrue();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
@ -1,16 +1,9 @@
|
|||||||
import * as plugins from './plugins.js';
|
import * as plugins from './plugins.js';
|
||||||
import type { CloudlyApiClient } from './classes.cloudlyapiclient.js';
|
import type { CloudlyApiClient } from './classes.cloudlyapiclient.js';
|
||||||
|
import { SecretGroup } from './classes.secretgroup.js';
|
||||||
|
|
||||||
export class SecretBundle implements plugins.servezoneInterfaces.data.ISecretBundle {
|
export class SecretBundle implements plugins.servezoneInterfaces.data.ISecretBundle {
|
||||||
public cloudlyClientRef: CloudlyApiClient;
|
// STATIC
|
||||||
|
|
||||||
public id: string;
|
|
||||||
public data: plugins.servezoneInterfaces.data.ISecretBundle['data'];
|
|
||||||
|
|
||||||
constructor(cloudlyClientRef: CloudlyApiClient) {
|
|
||||||
this.cloudlyClientRef = cloudlyClientRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async getSecretBundleById(cloudlyClientRef: CloudlyApiClient, secretBundleIdArg: string) {
|
public static async getSecretBundleById(cloudlyClientRef: CloudlyApiClient, secretBundleIdArg: string) {
|
||||||
const getSecretBundleByIdTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetSecretBundleById>(
|
const getSecretBundleByIdTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetSecretBundleById>(
|
||||||
'getSecretBundleById'
|
'getSecretBundleById'
|
||||||
@ -24,6 +17,19 @@ export class SecretBundle implements plugins.servezoneInterfaces.data.ISecretBun
|
|||||||
return newSecretBundle;
|
return newSecretBundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async getSecretBundleByAuthorization(cloudlyClientRef: CloudlyApiClient, secretBundleAuthorizationArg: plugins.servezoneInterfaces.data.ISecretBundleAuthorization) {
|
||||||
|
const getSecretBundleByAuthorizationTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetSecretBundleByAuthorization>(
|
||||||
|
'getSecretBundleByAuthorization'
|
||||||
|
);
|
||||||
|
const response = await getSecretBundleByAuthorizationTR.fire({
|
||||||
|
identity: cloudlyClientRef.identity,
|
||||||
|
secretBundleAuthorization: secretBundleAuthorizationArg,
|
||||||
|
});
|
||||||
|
const newSecretBundle = new SecretBundle(cloudlyClientRef);
|
||||||
|
Object.assign(newSecretBundle, response.secretBundle);
|
||||||
|
return newSecretBundle;
|
||||||
|
}
|
||||||
|
|
||||||
public static async getSecretBundles(cloudlyClientRef: CloudlyApiClient) {
|
public static async getSecretBundles(cloudlyClientRef: CloudlyApiClient) {
|
||||||
const getSecretBundlesTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetSecretBundles>(
|
const getSecretBundlesTR = cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetSecretBundles>(
|
||||||
'getSecretBundles'
|
'getSecretBundles'
|
||||||
@ -64,6 +70,17 @@ export class SecretBundle implements plugins.servezoneInterfaces.data.ISecretBun
|
|||||||
return newSecretBundle;
|
return newSecretBundle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// INSTANCE
|
||||||
|
|
||||||
|
public cloudlyClientRef: CloudlyApiClient;
|
||||||
|
|
||||||
|
public id: string;
|
||||||
|
public data: plugins.servezoneInterfaces.data.ISecretBundle['data'];
|
||||||
|
|
||||||
|
constructor(cloudlyClientRef: CloudlyApiClient) {
|
||||||
|
this.cloudlyClientRef = cloudlyClientRef;
|
||||||
|
}
|
||||||
|
|
||||||
public async update() {
|
public async update() {
|
||||||
const updateSecretBundleTR = this.cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_UpdateSecretBundle>(
|
const updateSecretBundleTR = this.cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_UpdateSecretBundle>(
|
||||||
'updateSecretBundle'
|
'updateSecretBundle'
|
||||||
@ -93,4 +110,26 @@ export class SecretBundle implements plugins.servezoneInterfaces.data.ISecretBun
|
|||||||
plugins.smartexpect.expect(response.ok).toBeTrue();
|
plugins.smartexpect.expect(response.ok).toBeTrue();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async getFlatKeyValueObjectForEnvironment(environmentArg: string = 'production') {
|
||||||
|
const bundleAuthorization = this.data.authorizations.find(authorization => {
|
||||||
|
return authorization.environment === environmentArg;
|
||||||
|
});
|
||||||
|
if (bundleAuthorization) {
|
||||||
|
throw new Error(`no matching environment >>${environmentArg} found in secret bundle`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getFlatKeyValueObjectTR = this.cloudlyClientRef.typedsocketClient.createTypedRequest<plugins.servezoneInterfaces.requests.secretbundle.IReq_GetFlatKeyValueObject>(
|
||||||
|
'getFlatKeyValueObject'
|
||||||
|
);
|
||||||
|
const response = await getFlatKeyValueObjectTR.fire({
|
||||||
|
identity: this.cloudlyClientRef.identity,
|
||||||
|
seccretBundleId: this.id,
|
||||||
|
secretBundleAuthorization: bundleAuthorization,
|
||||||
|
});
|
||||||
|
|
||||||
|
const flatKeyValueObject: {[key: string]: string} = response.flatKeyValueObject;
|
||||||
|
|
||||||
|
return flatKeyValueObject;
|
||||||
|
}
|
||||||
}
|
}
|
@ -72,14 +72,7 @@ export class SecretGroup implements plugins.servezoneInterfaces.data.ISecretGrou
|
|||||||
identity: this.cloudlyClientRef.identity,
|
identity: this.cloudlyClientRef.identity,
|
||||||
secretGroup: {
|
secretGroup: {
|
||||||
id: this.id,
|
id: this.id,
|
||||||
data: {
|
data: this.data,
|
||||||
name: this.data.name,
|
|
||||||
description: this.data.description,
|
|
||||||
environments: this.data.environments,
|
|
||||||
key: this.data.key,
|
|
||||||
tags: this.data.tags,
|
|
||||||
priority: this.data.priority,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
import * as plugins from './plugins.js';
|
|
||||||
import type { CloudlyApiClient } from './classes.cloudlyapiclient.js';
|
|
||||||
|
|
||||||
import { SecretBundle } from './classes.secretbundle.js';
|
|
||||||
import { SecretGroup } from './classes.secretgroup.js';
|
|
||||||
|
|
||||||
export class SecretManager {
|
|
||||||
// INSTANCE
|
|
||||||
cloudlyClientRef: CloudlyApiClient;
|
|
||||||
|
|
||||||
constructor(cloudlyClientRef: CloudlyApiClient) {
|
|
||||||
this.cloudlyClientRef = cloudlyClientRef;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async getSecretGroupsAndBundles() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The secret group has a secret bundle.
|
|
||||||
* This function essentially returns the secret bundle as a flat object.
|
|
||||||
* In other words, it resolves secret groups and
|
|
||||||
*/
|
|
||||||
public async getSecretBundleAsFlatObject(environmentArg: string = 'production') {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
export interface IEnvBundle {
|
|
||||||
environment: string;
|
|
||||||
timeSensitive: boolean;
|
|
||||||
configKeyValueObject: {[key: string]: string};
|
|
||||||
}
|
|
12
ts_interfaces/data/externalregistry.ts
Normal file
12
ts_interfaces/data/externalregistry.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import * as plugins from '../plugins.js';
|
||||||
|
|
||||||
|
export interface IExternalRegistry {
|
||||||
|
id: string;
|
||||||
|
data: {
|
||||||
|
type: 'docker' | 'npm';
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
};
|
||||||
|
}
|
@ -4,6 +4,11 @@ export interface IImage {
|
|||||||
id: string;
|
id: string;
|
||||||
data: {
|
data: {
|
||||||
name: string;
|
name: string;
|
||||||
|
location: {
|
||||||
|
internal: boolean;
|
||||||
|
externalRegistryId: string;
|
||||||
|
externalImageTag: string;
|
||||||
|
}
|
||||||
description: string;
|
description: string;
|
||||||
versions: Array<{
|
versions: Array<{
|
||||||
versionString: string;
|
versionString: string;
|
||||||
|
@ -3,8 +3,8 @@ export * from './cluster.js';
|
|||||||
export * from './config.js';
|
export * from './config.js';
|
||||||
export * from './deployment.js';
|
export * from './deployment.js';
|
||||||
export * from './docker.js';
|
export * from './docker.js';
|
||||||
export * from './env.js';
|
|
||||||
export * from './event.js';
|
export * from './event.js';
|
||||||
|
export * from './externalregistry.js';
|
||||||
export * from './image.js';
|
export * from './image.js';
|
||||||
export * from './secretbundle.js';
|
export * from './secretbundle.js';
|
||||||
export * from './secretgroup.js'
|
export * from './secretgroup.js'
|
||||||
|
@ -45,9 +45,11 @@ export interface ISecretBundle {
|
|||||||
/**
|
/**
|
||||||
* authrozations select a specific environment of a config bundle
|
* authrozations select a specific environment of a config bundle
|
||||||
*/
|
*/
|
||||||
authorizations: Array<{
|
authorizations: Array<ISecretBundleAuthorization>;
|
||||||
secretAccessKey: string;
|
|
||||||
environment: string;
|
|
||||||
}>;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ISecretBundleAuthorization {
|
||||||
|
secretAccessKey: string;
|
||||||
|
environment: string;
|
||||||
|
}
|
||||||
|
@ -5,11 +5,11 @@ import * as plugins from '../plugins.js';
|
|||||||
/**
|
/**
|
||||||
* get all clusters
|
* get all clusters
|
||||||
*/
|
*/
|
||||||
export interface IRequest_GetAllClusters extends plugins.typedrequestInterfaces.implementsTR<
|
export interface IReq_Any_Cloudly_GetClusters extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
IRequest_GetAllClusters
|
IReq_Any_Cloudly_GetClusters
|
||||||
> {
|
> {
|
||||||
method: 'getAllClusters';
|
method: 'getClusters';
|
||||||
request: {
|
request: {
|
||||||
identity: userInterfaces.IIdentity;
|
identity: userInterfaces.IIdentity;
|
||||||
};
|
};
|
||||||
@ -18,6 +18,21 @@ export interface IRequest_GetAllClusters extends plugins.typedrequestInterfaces.
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IReq_Any_Cloudly_GetClusterById
|
||||||
|
extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_Any_Cloudly_GetClusterById
|
||||||
|
> {
|
||||||
|
method: 'getClusterById';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
clusterId: string;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
cluster: clusterInterfaces.ICluster;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export interface IRequest_CreateCluster extends plugins.typedrequestInterfaces.implementsTR<
|
export interface IRequest_CreateCluster extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
IRequest_CreateCluster
|
IRequest_CreateCluster
|
||||||
@ -28,40 +43,40 @@ export interface IRequest_CreateCluster extends plugins.typedrequestInterfaces.i
|
|||||||
clusterName: string;
|
clusterName: string;
|
||||||
};
|
};
|
||||||
response: {
|
response: {
|
||||||
clusterConfig: clusterInterfaces.ICluster;
|
cluster: clusterInterfaces.ICluster;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* updates a cluster
|
* updates a cluster
|
||||||
*/
|
*/
|
||||||
export interface IRequest_UpdateCluster extends plugins.typedrequestInterfaces.implementsTR<
|
export interface IReq_Any_Cloudly_UpdateCluster extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
IRequest_UpdateCluster
|
IReq_Any_Cloudly_UpdateCluster
|
||||||
> {
|
> {
|
||||||
method: 'updateCluster';
|
method: 'updateCluster';
|
||||||
request: {
|
request: {
|
||||||
identity: userInterfaces.IIdentity;
|
identity: userInterfaces.IIdentity;
|
||||||
clusterConfig: clusterInterfaces.ICluster;
|
clusterData: clusterInterfaces.ICluster['data'];
|
||||||
};
|
};
|
||||||
response: {
|
response: {
|
||||||
clusterConfig: clusterInterfaces.ICluster;
|
resultCluster: clusterInterfaces.ICluster;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* deletes a cluster
|
* deletes a cluster
|
||||||
*/
|
*/
|
||||||
export interface IRequest_DeleteCluster extends plugins.typedrequestInterfaces.implementsTR<
|
export interface IReq_Any_Cloudly_DeleteClusterById extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
IRequest_DeleteCluster
|
IReq_Any_Cloudly_DeleteClusterById
|
||||||
> {
|
> {
|
||||||
method: 'deleteCluster';
|
method: 'deleteClusterById';
|
||||||
request: {
|
request: {
|
||||||
identity: userInterfaces.IIdentity;
|
identity: userInterfaces.IIdentity;
|
||||||
clusterId: string;
|
clusterId: string;
|
||||||
};
|
};
|
||||||
response: {
|
response: {
|
||||||
success: boolean;
|
ok: boolean;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
72
ts_interfaces/requests/externalregistry.ts
Normal file
72
ts_interfaces/requests/externalregistry.ts
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
import * as plugins from '../plugins.js';
|
||||||
|
import * as data from '../data/index.js';
|
||||||
|
import * as userInterfaces from '../data/user.js';
|
||||||
|
|
||||||
|
export interface IReq_GetRegistryById extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_GetRegistryById
|
||||||
|
> {
|
||||||
|
method: 'getExternalRegistryById';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
id: string;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
registry: data.IExternalRegistry;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReq_GetRegistries extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_GetRegistries
|
||||||
|
> {
|
||||||
|
method: 'getExternalRegistries';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
registries: data.IExternalRegistry[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReq_CreateRegistry extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_CreateRegistry
|
||||||
|
> {
|
||||||
|
method: 'createExternalRegistry';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
registryData: data.IExternalRegistry['data'];
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
registry: data.IExternalRegistry;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReq_UpdateRegistry extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_UpdateRegistry
|
||||||
|
> {
|
||||||
|
method: 'updateExternalRegistry';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
registryData: data.IExternalRegistry['data'];
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
resultRegistry: data.IExternalRegistry;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReq_DeleteRegistryById extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_DeleteRegistryById
|
||||||
|
> {
|
||||||
|
method: 'deleteExternalRegistryById';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
registryId: string;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
ok: boolean;
|
||||||
|
};
|
||||||
|
}
|
@ -4,6 +4,7 @@ import * as adminRequests from './admin.js';
|
|||||||
import * as certificateRequests from './certificate.js';
|
import * as certificateRequests from './certificate.js';
|
||||||
import * as clusterRequests from './cluster.js';
|
import * as clusterRequests from './cluster.js';
|
||||||
import * as configRequests from './config.js';
|
import * as configRequests from './config.js';
|
||||||
|
import * as externalRegistryRequests from './externalregistry.js';
|
||||||
import * as identityRequests from './identity.js';
|
import * as identityRequests from './identity.js';
|
||||||
import * as imageRequests from './image.js';
|
import * as imageRequests from './image.js';
|
||||||
import * as informRequests from './inform.js';
|
import * as informRequests from './inform.js';
|
||||||
@ -22,6 +23,7 @@ export {
|
|||||||
certificateRequests as certificate,
|
certificateRequests as certificate,
|
||||||
clusterRequests as cluster,
|
clusterRequests as cluster,
|
||||||
configRequests as config,
|
configRequests as config,
|
||||||
|
externalRegistryRequests as externalRegistry,
|
||||||
identityRequests as identity,
|
identityRequests as identity,
|
||||||
imageRequests as image,
|
imageRequests as image,
|
||||||
informRequests as inform,
|
informRequests as inform,
|
||||||
|
@ -2,26 +2,6 @@ import * as plugins from '../plugins.js';
|
|||||||
import * as data from '../data/index.js';
|
import * as data from '../data/index.js';
|
||||||
import * as userInterfaces from '../data/user.js';
|
import * as userInterfaces from '../data/user.js';
|
||||||
|
|
||||||
/**
|
|
||||||
* when retrieving secrets for actual use, you do this in the form of an envBundle.
|
|
||||||
*/
|
|
||||||
export interface IReq_GetEnvBundle extends plugins.typedrequestInterfaces.implementsTR<
|
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
|
||||||
IReq_GetEnvBundle
|
|
||||||
> {
|
|
||||||
method: 'getEnvBundle';
|
|
||||||
request: {
|
|
||||||
authorization: string;
|
|
||||||
/**
|
|
||||||
* specify this if you want to get a warning, if the envBundle is for an unexpected environment
|
|
||||||
*/
|
|
||||||
environment?: string;
|
|
||||||
};
|
|
||||||
response: {
|
|
||||||
envBundle: data.IEnvBundle;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IReq_GetSecretBundles extends plugins.typedrequestInterfaces.implementsTR<
|
export interface IReq_GetSecretBundles extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
IReq_GetSecretBundles
|
IReq_GetSecretBundles
|
||||||
@ -36,6 +16,21 @@ export interface IReq_GetSecretBundles extends plugins.typedrequestInterfaces.im
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IReq_GetSecretBundleById extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_GetSecretBundleById
|
||||||
|
> {
|
||||||
|
method: 'getSecretBundleById';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
secretBundleId: string;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
secretBundle: data.ISecretBundle;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
export interface IReq_CreateSecretBundle extends plugins.typedrequestInterfaces.implementsTR<
|
export interface IReq_CreateSecretBundle extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
plugins.typedrequestInterfaces.ITypedRequest,
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
IReq_CreateSecretBundle
|
IReq_CreateSecretBundle
|
||||||
@ -77,3 +72,32 @@ export interface IReq_DeleteSecretBundleById extends plugins.typedrequestInterfa
|
|||||||
ok: boolean;
|
ok: boolean;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IReq_GetSecretBundleByAuthorization extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_GetSecretBundleByAuthorization
|
||||||
|
> {
|
||||||
|
method: 'getSecretBundleByAuthorization';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
secretBundleAuthorization: data.ISecretBundleAuthorization;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
secretBundle: data.ISecretBundle;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IReq_GetFlatKeyValueObject extends plugins.typedrequestInterfaces.implementsTR<
|
||||||
|
plugins.typedrequestInterfaces.ITypedRequest,
|
||||||
|
IReq_GetFlatKeyValueObject
|
||||||
|
> {
|
||||||
|
method: 'getFlatKeyValueObject';
|
||||||
|
request: {
|
||||||
|
identity: userInterfaces.IIdentity;
|
||||||
|
seccretBundleId: string;
|
||||||
|
secretBundleAuthorization: data.ISecretBundleAuthorization;
|
||||||
|
};
|
||||||
|
response: {
|
||||||
|
flatKeyValueObject: {[key: string]: string};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@serve.zone/cloudly',
|
name: '@serve.zone/cloudly',
|
||||||
version: '4.5.3',
|
version: '4.11.0',
|
||||||
description: 'A comprehensive tool for managing containerized applications across multiple cloud providers using Docker Swarmkit, featuring web, CLI, and API interfaces.'
|
description: 'A comprehensive tool for managing containerized applications across multiple cloud providers using Docker Swarmkit, featuring web, CLI, and API interfaces.'
|
||||||
}
|
}
|
||||||
|
@ -123,9 +123,9 @@ export const getAllDataAction = dataState.createAction(async (statePartArg) => {
|
|||||||
|
|
||||||
// Clusters
|
// Clusters
|
||||||
const trGetClusters =
|
const trGetClusters =
|
||||||
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.cluster.IRequest_GetAllClusters>(
|
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.cluster.IReq_Any_Cloudly_GetClusters>(
|
||||||
'/typedrequest',
|
'/typedrequest',
|
||||||
'getAllClusters'
|
'getClusters'
|
||||||
);
|
);
|
||||||
const responseClusters = await trGetClusters.fire({
|
const responseClusters = await trGetClusters.fire({
|
||||||
identity: loginStatePart.getState().identity,
|
identity: loginStatePart.getState().identity,
|
||||||
@ -144,14 +144,13 @@ export const createSecretGroupAction = dataState.createAction(
|
|||||||
async (statePartArg, payloadArg: plugins.interfaces.data.ISecretGroup) => {
|
async (statePartArg, payloadArg: plugins.interfaces.data.ISecretGroup) => {
|
||||||
let currentState = statePartArg.getState();
|
let currentState = statePartArg.getState();
|
||||||
const trCreateSecretGroup =
|
const trCreateSecretGroup =
|
||||||
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.secret.IReq_Admin_CreateSecretBundlesAndGroups>(
|
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.secretgroup.IReq_CreateSecretGroup>(
|
||||||
'/typedrequest',
|
'/typedrequest',
|
||||||
'adminCreateSecretBundlesAndGroups'
|
'createSecretGroup'
|
||||||
);
|
);
|
||||||
const response = await trCreateSecretGroup.fire({
|
const response = await trCreateSecretGroup.fire({
|
||||||
identity: loginStatePart.getState().identity,
|
identity: loginStatePart.getState().identity,
|
||||||
secretBundles: [],
|
secretGroup: payloadArg,
|
||||||
secretGroups: [payloadArg],
|
|
||||||
});
|
});
|
||||||
currentState = await dataState.dispatchAction(getAllDataAction, null);
|
currentState = await dataState.dispatchAction(getAllDataAction, null);
|
||||||
return currentState;
|
return currentState;
|
||||||
@ -163,14 +162,13 @@ export const deleteSecretGroupAction = dataState.createAction(
|
|||||||
async (statePartArg, payloadArg: { secretGroupId: string }) => {
|
async (statePartArg, payloadArg: { secretGroupId: string }) => {
|
||||||
let currentState = statePartArg.getState();
|
let currentState = statePartArg.getState();
|
||||||
const trDeleteSecretGroup =
|
const trDeleteSecretGroup =
|
||||||
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.secret.IReq_Admin_DeleteSecretBundlesAndGroups>(
|
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.secretgroup.IReq_DeleteSecretGroupById>(
|
||||||
'/typedrequest',
|
'/typedrequest',
|
||||||
'adminDeleteConfigBundlesAndSecretGroups'
|
'deleteSecretGroupById'
|
||||||
);
|
);
|
||||||
const response = await trDeleteSecretGroup.fire({
|
const response = await trDeleteSecretGroup.fire({
|
||||||
identity: loginStatePart.getState().identity,
|
identity: loginStatePart.getState().identity,
|
||||||
secretBundleIds: [],
|
secretGroupId: payloadArg.secretGroupId,
|
||||||
secretGroupIds: [payloadArg.secretGroupId],
|
|
||||||
});
|
});
|
||||||
currentState = await dataState.dispatchAction(getAllDataAction, null);
|
currentState = await dataState.dispatchAction(getAllDataAction, null);
|
||||||
return currentState;
|
return currentState;
|
||||||
@ -182,14 +180,13 @@ export const deleteSecretBundleAction = dataState.createAction(
|
|||||||
async (statePartArg, payloadArg: { configBundleId: string }) => {
|
async (statePartArg, payloadArg: { configBundleId: string }) => {
|
||||||
let currentState = statePartArg.getState();
|
let currentState = statePartArg.getState();
|
||||||
const trDeleteConfigBundle =
|
const trDeleteConfigBundle =
|
||||||
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.secret.IReq_Admin_DeleteSecretBundlesAndGroups>(
|
new domtools.plugins.typedrequest.TypedRequest<plugins.interfaces.requests.secretbundle.IReq_DeleteSecretBundleById>(
|
||||||
'/typedrequest',
|
'/typedrequest',
|
||||||
'adminDeleteConfigBundlesAndSecretGroups'
|
'deleteSecretBundleById'
|
||||||
);
|
);
|
||||||
const response = await trDeleteConfigBundle.fire({
|
const response = await trDeleteConfigBundle.fire({
|
||||||
identity: loginStatePart.getState().identity,
|
identity: loginStatePart.getState().identity,
|
||||||
secretBundleIds: [payloadArg.configBundleId],
|
secretBundleId: payloadArg.configBundleId,
|
||||||
secretGroupIds: [],
|
|
||||||
});
|
});
|
||||||
currentState = await dataState.dispatchAction(getAllDataAction, null);
|
currentState = await dataState.dispatchAction(getAllDataAction, null);
|
||||||
return currentState;
|
return currentState;
|
||||||
@ -263,7 +260,7 @@ export const addClusterAction = dataState.createAction(
|
|||||||
currentState = {
|
currentState = {
|
||||||
...currentState,
|
...currentState,
|
||||||
...{
|
...{
|
||||||
clusters: [...currentState.clusters, response.clusterConfig],
|
clusters: [...currentState.clusters, response.cluster],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return currentState;
|
return currentState;
|
||||||
|
Reference in New Issue
Block a user