@axway/axway-central-cli
Version:
Manage APIs, services and publish to the Amplify Marketplace
359 lines (350 loc) • 14.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.updateSubResourceType = exports.createSecret = exports.createNewIDPSecretResource = exports.createNewIDPResource = exports.createNewDataPlaneSecretResource = exports.createNewDataPlaneResource = exports.createNewAgentResource = exports.createDosaAndCerts = exports.createByResourceType = exports.createBackUpConfigs = void 0;
var _chalk = _interopRequireDefault(require("chalk"));
var _snooplogg = _interopRequireDefault(require("snooplogg"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _bashCommands = require("../../../common/bashCommands");
var _Kubectl = require("../../../common/Kubectl");
var _PlatformClient = require("../../../common/PlatformClient");
var _types = require("../../../common/types");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const {
log
} = (0, _snooplogg.default)('central: install: helpers: creators');
const createBackUpConfigs = async configFiles => {
let fileExist = false;
let dateTimeStamp = new Date().toISOString().slice(0, 10).concat(' ').concat(new Date().toLocaleTimeString('it-IT')).replace(/:\s*/g, '.');
const backupDate = `${dateTimeStamp}-`;
for (let configFile of configFiles) {
if (_fsExtra.default.existsSync(configFile)) {
fileExist = true;
let backupFile = backupDate + configFile;
await _fsExtra.default.copyFile(configFile, backupFile).then(() => {
console.log(`Created backup file ${backupFile}`);
}).catch(err => {
console.error(err);
});
}
}
return fileExist;
};
exports.createBackUpConfigs = createBackUpConfigs;
const createDosaAndCerts = async (client, name) => {
console.log('Creating a new service account.');
const {
publicKey,
privateKey
} = await (0, _bashCommands.createKeyPair)();
const publicCert = _fsExtra.default.readFileSync(publicKey).toString();
const account = await client.createServiceAccount({
name: name,
desc: name,
publicKey: publicCert,
roles: [_PlatformClient.PlatformServiceAccountRole.ApiCentralAdmin]
});
console.log(_chalk.default.green(`New service account "${account.name}" with clientId "${account.client_id}" has been successfully created.`));
console.log(_chalk.default.green(`The private key has been placed at ${privateKey}\nThe public key has been placed at ${publicKey}`));
return new _types.DosaAccount(account.client_id, publicKey, privateKey);
};
exports.createDosaAndCerts = createDosaAndCerts;
const updateSubResourceType = async (client, defsManager, name, resourceType, resourceShortName, scopeName = '', subResources = {}) => {
var _defs$0$resource$spec, _defs$0$resource$spec2;
const defs = defsManager.findDefsByWord(resourceShortName);
if (!defs) {
throw Error(`the server doesn't have a resource type "${resourceType}"`);
}
const knownSubResourcesNames = (_defs$0$resource$spec = (_defs$0$resource$spec2 = defs[0].resource.spec.subResources) === null || _defs$0$resource$spec2 === void 0 ? void 0 : _defs$0$resource$spec2.names) !== null && _defs$0$resource$spec !== void 0 ? _defs$0$resource$spec : [];
for (let [key, value] of Object.entries(subResources)) {
if (knownSubResourcesNames.includes(key)) {
console.log(`Updating subresource ${key} on ${resourceType}`);
const resource = {
name
};
Object.assign(resource, {
[key]: value
});
await client.updateSubResource({
resourceDef: defs[0].resource,
resource: resource,
subResourceName: key,
scopeDef: defs[0].scope ? defs[0].scope : undefined,
scopeName: defs[0].scope ? scopeName || name : undefined
});
}
}
};
exports.updateSubResourceType = updateSubResourceType;
const createByResourceType = async (client, defsManager, name, resourceType, resourceShortName, spec = {}, scopeName = '', subResources = {}) => {
var _defs$0$resource$spec3, _defs$0$resource$spec4;
console.log(`Creating a new ${resourceType}`);
// NOTE: only a first found set is used
const defs = defsManager.findDefsByWord(resourceShortName);
if (!defs) {
throw Error(`the server doesn't have a resource type "${resourceType}"`);
}
// @ts-ignore payload
const resource = {
name,
spec
};
const knownSubResourcesNames = (_defs$0$resource$spec3 = (_defs$0$resource$spec4 = defs[0].resource.spec.subResources) === null || _defs$0$resource$spec4 === void 0 ? void 0 : _defs$0$resource$spec4.names) !== null && _defs$0$resource$spec3 !== void 0 ? _defs$0$resource$spec3 : [];
for (let [key, value] of Object.entries(subResources)) {
if (knownSubResourcesNames.includes(key)) {
Object.assign(resource, {
[key]: value
});
}
}
const withSubRes = subResources !== null;
const result = await client.createResource({
resource,
resourceDef: defs[0].resource,
scopeDef: defs[0].scope ? defs[0].scope : undefined,
scopeName: defs[0].scope ? scopeName || name : undefined,
withSubResources: withSubRes
});
if (!result.data) {
var _result$error;
const errMsg = `cannot create a new ${resourceType.toLowerCase()}`;
if ((_result$error = result.error) !== null && _result$error !== void 0 && _result$error.length) {
throw Error(`${errMsg}: ${result.error[0].detail}.`);
} else {
throw Error(`${errMsg}.`);
}
} else {
console.log(`New ${resourceType.toLowerCase()} "${result.data.name}" has been successfully created.`);
}
return result.data.name;
};
exports.createByResourceType = createByResourceType;
const createNewAgentResource = async (client, defsManager, envName, dataPlaneType, agentResource, agentType, owningTeam, agentName, dataPlaneName, frequency, queue, config, filterDA) => {
console.log(`Creating a new ${agentResource}, with data plane type: ${dataPlaneType}.`);
// NOTE: only a first found set is used
const defs = defsManager.findDefsByWord(agentType);
if (!defs) {
throw Error(`the server doesn't have a resource type "${agentType}"`);
}
// create the dataplane object
let withSubResources = false;
let dataplane = {};
if (dataPlaneName) {
dataplane.name = dataPlaneName;
withSubResources = true;
}
frequency ? dataplane.frequency = frequency : null;
queue ? agentResource === _types.AgentResourceKind.da ? dataplane.queueDiscovery = queue : dataplane.queueTrafficCollection = queue : null;
config ? null : config = {
owningTeam: owningTeam,
filter: dataPlaneType === _types.DataPlaneNames.AWS || _types.DataPlaneNames.AZURE ? filterDA === null || filterDA === void 0 ? void 0 : filterDA.trim() : ''
};
const result = await client.createResource({
// @ts-ignore payload
resource: {
title: agentName,
spec: {
dataplaneType: dataPlaneType,
config: config
},
dataplane: dataplane
},
resourceDef: defs[0].resource,
scopeDef: defs[0].scope ? defs[0].scope : undefined,
scopeName: envName,
withSubResources: withSubResources
});
if (!result.data) {
var _result$error2;
const errMsg = `cannot create a new agent`;
if ((_result$error2 = result.error) !== null && _result$error2 !== void 0 && _result$error2.length) {
throw Error(`${errMsg}: ${result.error[0].detail}.`);
} else {
throw Error(`${errMsg}.`);
}
} else {
console.log(`New agent of type "${defs[0].resource.name}" named "${result.data.name}" has been successfully created.`);
}
return result.data.name;
};
/**
* @description Helper func to create a new DataPlane resource
* @param client API Service Client
* @param defsManager Definition Manager
* @param envName Environment Name
* @param dataPlaneType DataPlane Type
*/
exports.createNewAgentResource = createNewAgentResource;
const createNewDataPlaneResource = async (client, defsManager, envName, dataPlaneType, config) => {
console.log(`Creating a new Dataplane resource, with type: ${dataPlaneType}.`);
// NOTE: only a first found set is used
const defs = defsManager.findDefsByWord("dp");
if (!defs) {
throw Error(`the server doesn't have a resource type "Dataplane"`);
}
const result = await client.createResource({
// @ts-ignore payload
resource: {
title: dataPlaneType + " Dataplane",
spec: {
type: dataPlaneType,
config: config
}
},
resourceDef: defs[0].resource,
scopeDef: defs[0].scope ? defs[0].scope : undefined,
scopeName: envName
});
if (!result.data) {
var _result$error3;
const errMsg = `cannot create a new dataplane`;
if ((_result$error3 = result.error) !== null && _result$error3 !== void 0 && _result$error3.length) {
throw Error(`${errMsg}: ${result.error[0].detail}.`);
} else {
throw Error(`${errMsg}.`);
}
} else {
console.log(`New dataplane of type "${defs[0].resource.name}" named "${result.data.name}" has been successfully created.`);
}
return result.data;
};
/**
* @description Helper func to create a new DataPlane resource
* @param client API Service Client
* @param defsManager Definition Manager
* @param envName Environment Name
* @param dataPlaneName DataPlane Name
* @param accessData Encrypted Access Data
*/
exports.createNewDataPlaneResource = createNewDataPlaneResource;
const createNewDataPlaneSecretResource = async (client, defsManager, envName, dataPlaneType, dataPlaneName, accessData) => {
console.log(`Creating a new DataplaneSecret resource.`);
// NOTE: only a first found set is used
const defs = defsManager.findDefsByWord("dps");
if (!defs) {
throw Error(`the server doesn't have a resource type "DataplaneSecret"`);
}
const result = await client.createResource({
// @ts-ignore payload
resource: {
title: dataPlaneType + " Dataplane Secret",
spec: {
dataplane: dataPlaneName,
data: accessData
}
},
resourceDef: defs[0].resource,
scopeDef: defs[0].scope ? defs[0].scope : undefined,
scopeName: envName
});
log(result);
if (!result.data) {
var _result$error4;
const errMsg = `cannot create a new agent`;
if ((_result$error4 = result.error) !== null && _result$error4 !== void 0 && _result$error4.length) {
throw Error(`${errMsg}: ${result.error[0].detail}.`);
} else {
throw Error(`${errMsg}.`);
}
} else {
console.log(`New secret of type "${defs[0].resource.name}" named "${result.data.name}" has been successfully created.`);
}
return result.data;
};
/**
* @description Helper func to create a new Identity Provider resource
* @param client API Service Client
* @param defsManager Definition Manager
* @param idpConfig IDP Configuration from inputs
*/
exports.createNewDataPlaneSecretResource = createNewDataPlaneSecretResource;
const createNewIDPResource = async (client, defsManager, idpConfig) => {
console.log(`Creating a new Identity Provider resource.`);
// NOTE: only a first found set is used
const defs = defsManager.findDefsByWord("idp");
if (!defs) {
throw Error(`the server doesn't have a resource type Identity Provider`);
}
const result = await client.createResource({
// @ts-ignore payload
resource: {
title: idpConfig.title,
spec: idpConfig.getSpec()
},
resourceDef: defs[0].resource,
scopeDef: defs[0].scope ? defs[0].scope : undefined
});
log(result);
if (!result.data) {
var _result$error5;
const errMsg = `cannot create a new agent`;
if ((_result$error5 = result.error) !== null && _result$error5 !== void 0 && _result$error5.length) {
throw Error(`${errMsg}: ${result.error[0].detail}.`);
} else {
throw Error(`${errMsg}.`);
}
} else {
console.log(`New Identity Provider of type "${defs[0].resource.name}" named "${result.data.name}" has been successfully created.`);
}
return result.data;
};
/**
* @description Helper func to create a new Identity Provider Secret resource
* @param client API Service Client
* @param defsManager Definition Manager
* @param idpAuthConfig IDP Auth Configuration from inputs
* @param idpResource IDP Configuration received after creating the IDP from inputs
*/
exports.createNewIDPResource = createNewIDPResource;
const createNewIDPSecretResource = async (client, defsManager, idpAuthConfig, idpResource) => {
console.log(`Creating a new Identity Provider Secret resource.`);
// NOTE: only a first found set is used
const defs = defsManager.findDefsByWord("idpsec");
if (!defs) {
throw Error(`the server doesn't have a resource type Identity Provider Secret`);
}
const result = await client.createResource({
// @ts-ignore payload
resource: {
title: idpResource.title + ' IDPSecret',
spec: idpAuthConfig.getSpec()
},
resourceDef: defs[0].resource,
scopeDef: defs[0].scope ? defs[0].scope : undefined,
scopeName: idpResource.name
});
log(result);
if (!result.data) {
var _result$error6;
const errMsg = `cannot create a new agent`;
if ((_result$error6 = result.error) !== null && _result$error6 !== void 0 && _result$error6.length) {
throw Error(`${errMsg}: ${result.error[0].detail}.`);
} else {
throw Error(`${errMsg}.`);
}
} else {
console.log(`New Identity Provider of type "${defs[0].resource.name}" named "${result.data.name}" has been successfully created.`);
}
return result.data;
};
/**
* @description Helper func to check for existing secret, and clean up old secret before creating a new one.
* @param namespace Namespace to create the secret in.
* @param secretName The name of the secret.
* @param createFunc A function that will create the secret
*/
exports.createNewIDPSecretResource = createNewIDPSecretResource;
const createSecret = async (namespace, secretName, createFunc) => {
const secrets = await _Kubectl.kubectl.get('secrets', `-n ${namespace} ${secretName}`);
// NotFound errors are ok. Throw an error for anything else.
if (secrets.error && !secrets.error.includes('NotFound')) {
throw Error(secrets.error);
}
// delete the secret if it already exists and then re-create it.
if (secrets.data.length > 0) {
await _Kubectl.kubectl.delete('secret', `-n ${namespace} ${secretName}`);
}
await createFunc();
};
exports.createSecret = createSecret;