@atomist/sdm
Version:
Atomist Software Delivery Machine SDK
133 lines • 4.84 kB
JavaScript
;
/*
* Copyright © 2020 Atomist, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteAppResources = exports.deleteSpec = void 0;
const logger_1 = require("@atomist/automation-client/lib/util/logger");
const error_1 = require("../support/error");
const retry_1 = require("../support/retry");
const api_1 = require("./api");
const config_1 = require("./config");
const labels_1 = require("./labels");
const request_1 = require("./request");
const resource_1 = require("./resource");
const spec_1 = require("./spec");
/**
* Delete a resource if it exists. If the resource does not exist,
* do nothing.
*
* @param spec Kuberenetes spec of resource to delete
* @return DeleteResponse if object existed and was deleted, undefined if it did not exist
*/
async function deleteSpec(spec) {
const slug = spec_1.specSlug(spec);
let client;
try {
const kc = config_1.loadKubeConfig();
client = kc.makeApiClient(api_1.K8sObjectApi);
}
catch (e) {
e.message = `Failed to create Kubernetes client: ${error_1.k8sErrMsg(e)}`;
throw e;
}
try {
await client.read(spec);
}
catch (e) {
logger_1.logger.debug(`Kubernetes resource ${slug} does not exist: ${error_1.k8sErrMsg(e)}`);
return undefined;
}
logger_1.logger.info(`Deleting resource ${slug} using '${resource_1.logObject(spec)}'`);
return retry_1.logRetry(() => client.delete(spec), `delete resource ${slug}`);
}
exports.deleteSpec = deleteSpec;
/**
* Delete resources associated with application described by `arg.req`, if
* any exists. If no matching resources exist, do nothing. Return
* ann array of deleted resources, which may be empty.
*
* @param arg Specification of what and how to delete for what application
* @return Array of deleted resources
*/
async function deleteAppResources(arg) {
const slug = request_1.appName(arg.req);
const selector = labels_1.labelSelector(arg.req);
const toDelete = [];
try {
const limit = 500;
let continu;
do {
let listResp;
const args = [
undefined,
undefined,
continu,
undefined,
selector,
limit,
];
if (arg.namespaced) {
listResp = await arg.lister.call(arg.api, arg.req.ns, ...args);
}
else if (arg.namespaced === false) {
listResp = await arg.lister.apply(arg.api, args);
}
toDelete.push(...listResp.body.items.map(r => {
r.kind = r.kind || arg.kind; // list response does not include kind
return r;
}));
continu = listResp.body.metadata._continue;
} while (!!continu);
}
catch (e) {
e.message = `Failed to list ${arg.kind} for ${slug}: ${error_1.k8sErrMsg(e)}`;
throw e;
}
const deleted = [];
const errs = [];
for (const resource of toDelete) {
const resourceSlug = arg.namespaced
? `${arg.kind}/${resource.metadata.namespace}/${resource.metadata.name}`
: `${arg.kind}/${resource.metadata.name}`;
logger_1.logger.info(`Deleting ${resourceSlug} for ${slug}`);
try {
const args = [
undefined,
undefined,
undefined,
undefined,
"Background",
];
if (arg.namespaced) {
await arg.deleter.call(arg.api, resource.metadata.name, resource.metadata.namespace, ...args);
}
else if (arg.namespaced === false) {
await arg.deleter.call(arg.api, resource.metadata.name, ...args);
}
deleted.push(resource);
}
catch (e) {
e.message = `Failed to delete ${resourceSlug} for ${slug}: ${error_1.k8sErrMsg(e)}`;
errs.push(e);
}
}
if (errs.length > 0) {
throw new Error(`Failed to delete ${arg.kind} resources for ${slug}: ${errs.map(e => e.message).join("; ")}`);
}
return deleted;
}
exports.deleteAppResources = deleteAppResources;
//# sourceMappingURL=delete.js.map