@controlplane/cli
Version:
Control Plane Corporation CLI
125 lines • 5.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.HelmReleaseMigrator = void 0;
const constants_1 = require("./constants");
const resolver_1 = require("../commands/resolver");
const helm_base_1 = require("./helm-base");
class HelmReleaseMigrator extends helm_base_1.HelmBase {
constructor(client, session, args, ensureDeletion, secret) {
super(client, session, args, ensureDeletion);
// Required Parameters
this.secret = secret;
// Parameters dependant
this.secretSelfLink = (0, resolver_1.resolveToLink)('secret', secret.name, this.session.context);
}
// Public Methods //
async migrate() {
// Check if the secret is already at the latest version
if (this.secret.tags && this.secret.tags[constants_1.CPLN_HELM_SCHEMA_LATEST_VERSION_TAG_KEY] === constants_1.CPLN_HELM_SCHEMA_LATEST_VERSION) {
// No need to migrate
return;
}
// Handle the migration safely
try {
// Parse the data of the secret into a IHasSchemaVersion, no need to worry about parsing issues because
// we are sure that the schema version could either be '1' or '2' for now.
const releaseHasSchemaVersion = JSON.parse(this.secret.data.payload);
// Migrate based on the schema version
switch (releaseHasSchemaVersion.schemaVersion) {
case '1':
// Migrate from version 1 to version 2
const legacyReleaseV2 = await this.migrateFromVersion1ToVersion2(releaseHasSchemaVersion);
// Migrate from version 2 to version 3
await this.migrateFromVersion2ToVersion3(legacyReleaseV2);
break;
case '2':
// Migrate from version 2 to version 3
await this.migrateFromVersion2ToVersion3(releaseHasSchemaVersion);
break;
}
}
catch (e) {
this.session.err(`ERROR: Failed to migrate release '${this.releaseName}'.`);
this.session.abort({ error: e });
}
}
// Private Methods //
async migrateFromVersion1ToVersion2(legacyReleaseV1) {
var _a;
const resources = [];
for (const resource of legacyReleaseV1.resources) {
try {
resources.push({
...resource,
template: await this.fetchResource(resource.kind, resource.link),
});
}
catch (e) {
// Ignore 404
if (((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) !== 404) {
throw e;
}
}
}
return {
schemaVersion: '2',
release: legacyReleaseV1.release,
deployments: [
{
gvc: '',
revision: 1,
updated: new Date().toISOString(),
status: 'deployed',
chart: '',
appVersion: '',
description: legacyReleaseV1.description,
config: {},
values: {},
valuesFiles: [],
resources,
},
],
};
}
async migrateFromVersion2ToVersion3(legacyReleaseV2) {
// A variable to hold all secret creation promises so we can await for the creation asynchronously
const promises = [];
// Iterate over each release deployment and create a new secret with the revision number
for (const deployment of legacyReleaseV2.deployments) {
// Construct the release object for schema version 3
const release = {
schemaVersion: '3',
name: legacyReleaseV2.release,
info: {
firstDeployed: new Date(this.secret.created).toISOString(),
lastDeployed: deployment.updated,
description: deployment.description,
status: deployment.status,
notes: '',
resources: deployment.resources,
},
chart: {
metadata: {
name: deployment.chart,
appVersion: deployment.appVersion,
},
values: deployment.values,
},
config: deployment.config,
manifest: '',
version: deployment.revision,
gvc: deployment.gvc,
// Custom Properties
valuesFiles: deployment.valuesFiles,
};
// Create a new secret with the release object
promises.push(this.createReleaseSecret(release, this.secret.tags));
}
// Wait for all secrets to be created
await Promise.all(promises);
// Delete the original secret after successful migration
await this.client.delete(this.secretSelfLink);
}
}
exports.HelmReleaseMigrator = HelmReleaseMigrator;
//# sourceMappingURL=helm-release-migrator.js.map