UNPKG

@controlplane/cli

Version:

Control Plane Corporation CLI

125 lines 5.27 kB
"use strict"; 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