@axway/axway-central-cli
Version:
Manage APIs, services and publish to the Amplify Marketplace
408 lines (401 loc) • 28.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ProductizationHelper = void 0;
var _types = require("../../../common/types");
var _utils = require("../../../common/utils");
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
class ProductizationHelper {
constructor(apiServerClient) {
_defineProperty(this, "apiServerClient", void 0);
this.apiServerClient = apiServerClient;
}
/**
* Bulk Productization of API services.
* @param resources array of API services to be productized
*/
async bulkProductizeAPIServices(resources, sortedDefsMap, transferOwnership) {
const sortedDefsArray = Array.from(sortedDefsMap.values());
let bulkResultMap = new Map();
for (const resource of resources) {
var _resource$spec, _resource$spec$apiSer, _resource$metadata, _resource$metadata$sc, _resource$spec6, _resource$spec6$apiSe, _resource$metadata2, _resource$spec13, _resource$spec13$apiS;
let bulkResult = {
success: [],
error: [],
warning: []
};
if (!(resource !== null && resource !== void 0 && (_resource$spec = resource.spec) !== null && _resource$spec !== void 0 && (_resource$spec$apiSer = _resource$spec.apiService) !== null && _resource$spec$apiSer !== void 0 && _resource$spec$apiSer.name)) {
var _resource$spec2, _resource$spec2$apiSe, _resource$spec3, _resource$spec3$apiSe;
let errorMessage = `Found an entry without a logical name for "kind/${_types.Kind.APIService}".`;
bulkResult.error.push({
name: resource === null || resource === void 0 ? void 0 : (_resource$spec2 = resource.spec) === null || _resource$spec2 === void 0 ? void 0 : (_resource$spec2$apiSe = _resource$spec2.apiService) === null || _resource$spec2$apiSe === void 0 ? void 0 : _resource$spec2$apiSe.name,
kind: _types.Kind.APIService,
error: new Error(errorMessage)
});
bulkResultMap.set((_resource$spec3 = resource.spec) === null || _resource$spec3 === void 0 ? void 0 : (_resource$spec3$apiSe = _resource$spec3.apiService) === null || _resource$spec3$apiSe === void 0 ? void 0 : _resource$spec3$apiSe.name, bulkResult);
continue;
}
if (!((_resource$metadata = resource.metadata) !== null && _resource$metadata !== void 0 && (_resource$metadata$sc = _resource$metadata.scope) !== null && _resource$metadata$sc !== void 0 && _resource$metadata$sc.name)) {
var _resource$spec4, _resource$spec4$apiSe, _resource$spec5, _resource$spec5$apiSe;
let errorMessage = `Found an API Service without a scope name for "kind/${_types.Kind.Environment}".`;
bulkResult.error.push({
name: resource === null || resource === void 0 ? void 0 : (_resource$spec4 = resource.spec) === null || _resource$spec4 === void 0 ? void 0 : (_resource$spec4$apiSe = _resource$spec4.apiService) === null || _resource$spec4$apiSe === void 0 ? void 0 : _resource$spec4$apiSe.name,
kind: _types.Kind.Environment,
error: new Error(errorMessage)
});
bulkResultMap.set((_resource$spec5 = resource.spec) === null || _resource$spec5 === void 0 ? void 0 : (_resource$spec5$apiSe = _resource$spec5.apiService) === null || _resource$spec5$apiSe === void 0 ? void 0 : _resource$spec5$apiSe.name, bulkResult);
continue;
}
const apiSvcResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.APIService, _types.Kind.Environment);
const envResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.Environment);
const assetResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.Asset);
const productResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.Product);
const apiSvc = await this.apiServerClient.getResourceByName({
resourceDef: apiSvcResourceDef,
resourceName: resource === null || resource === void 0 ? void 0 : (_resource$spec6 = resource.spec) === null || _resource$spec6 === void 0 ? void 0 : (_resource$spec6$apiSe = _resource$spec6.apiService) === null || _resource$spec6$apiSe === void 0 ? void 0 : _resource$spec6$apiSe.name,
scopeDef: envResourceDef,
scopeName: (_resource$metadata2 = resource.metadata) === null || _resource$metadata2 === void 0 ? void 0 : _resource$metadata2.scope.name
});
if (apiSvc.data && !apiSvc.error) {
var _apiSvc$data, _apiSvc$data$metadata, _resource$metadata3, _apiServiceInstances$, _apiServiceInstances$2, _assetResourcesResult2, _assetResourcesResult3, _assetResourcesResult4, _assetResourcesResult5, _bulkResult$warning;
const apiSvcInstanceResDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.APIServiceInstance, _types.Kind.Environment);
const query = 'metadata.references.id==' + ((_apiSvc$data = apiSvc.data) === null || _apiSvc$data === void 0 ? void 0 : (_apiSvc$data$metadata = _apiSvc$data.metadata) === null || _apiSvc$data$metadata === void 0 ? void 0 : _apiSvc$data$metadata.id);
const apiServiceInstances = await this.apiServerClient.getResourcesList({
resourceDef: apiSvcInstanceResDef,
scopeDef: envResourceDef,
scopeName: (_resource$metadata3 = resource.metadata) === null || _resource$metadata3 === void 0 ? void 0 : _resource$metadata3.scope.name,
query: query
});
// Donot continue if there are no api service instances
if (apiServiceInstances.error && ((_apiServiceInstances$ = apiServiceInstances.error) === null || _apiServiceInstances$ === void 0 ? void 0 : _apiServiceInstances$.length) > 0 || !apiServiceInstances.data || ((_apiServiceInstances$2 = apiServiceInstances.data) === null || _apiServiceInstances$2 === void 0 ? void 0 : _apiServiceInstances$2.length) === 0) {
var _resource$spec7, _resource$spec7$apiSe, _resource$spec8, _resource$spec8$apiSe, _resource$spec9, _resource$spec9$apiSe;
bulkResult.error.push({
name: resource === null || resource === void 0 ? void 0 : (_resource$spec7 = resource.spec) === null || _resource$spec7 === void 0 ? void 0 : (_resource$spec7$apiSe = _resource$spec7.apiService) === null || _resource$spec7$apiSe === void 0 ? void 0 : _resource$spec7$apiSe.name,
kind: resource.kind,
error: new Error('Unable to find APIServiceInstances for API Service: ' + (resource === null || resource === void 0 ? void 0 : (_resource$spec8 = resource.spec) === null || _resource$spec8 === void 0 ? void 0 : (_resource$spec8$apiSe = _resource$spec8.apiService) === null || _resource$spec8$apiSe === void 0 ? void 0 : _resource$spec8$apiSe.name))
});
bulkResultMap.set((_resource$spec9 = resource.spec) === null || _resource$spec9 === void 0 ? void 0 : (_resource$spec9$apiSe = _resource$spec9.apiService) === null || _resource$spec9$apiSe === void 0 ? void 0 : _resource$spec9$apiSe.name, bulkResult);
continue;
}
let assetResourcesResult = await this.createAssetResourcesForAPIServiceProductization(apiSvc.data, sortedDefsMap, apiServiceInstances, transferOwnership);
if (assetResourcesResult.error.length > 0) {
var _assetResourcesResult, _resource$spec0, _resource$spec0$apiSe;
// if there is an error at any stage while productizing an api service,
// clean up the resources created until that stage to avoid duplicate resources hanging around
const asset = (_assetResourcesResult = assetResourcesResult.warning) === null || _assetResourcesResult === void 0 ? void 0 : _assetResourcesResult.find(result => result.kind === _types.Kind.Asset);
if (asset !== undefined) {
await this.cleanupResourcesOnFailure(asset, assetResourceDef);
}
bulkResult.error.push(...assetResourcesResult.error);
bulkResultMap.set((_resource$spec0 = resource.spec) === null || _resource$spec0 === void 0 ? void 0 : (_resource$spec0$apiSe = _resource$spec0.apiService) === null || _resource$spec0$apiSe === void 0 ? void 0 : _resource$spec0$apiSe.name, bulkResult);
continue;
}
const assetName = (_assetResourcesResult2 = assetResourcesResult.warning) === null || _assetResourcesResult2 === void 0 ? void 0 : (_assetResourcesResult3 = _assetResourcesResult2.find(res => res.kind === _types.Kind.Asset)) === null || _assetResourcesResult3 === void 0 ? void 0 : _assetResourcesResult3.name;
const assetReleaseTagName = (_assetResourcesResult4 = assetResourcesResult.warning) === null || _assetResourcesResult4 === void 0 ? void 0 : (_assetResourcesResult5 = _assetResourcesResult4.find(res => res.kind === _types.Kind.ReleaseTag)) === null || _assetResourcesResult5 === void 0 ? void 0 : _assetResourcesResult5.name;
if (assetResourcesResult.warning) (_bulkResult$warning = bulkResult.warning) === null || _bulkResult$warning === void 0 ? void 0 : _bulkResult$warning.push(...assetResourcesResult.warning);
// check if asset release tag is created, then only proceed with creation of product resources
await this.checkForAssetReleaseTag(sortedDefsArray, assetReleaseTagName, assetName).then(async result => {
if (result) {
await this.waitForAssetActivation(assetResourceDef, assetName).then(async active => {
if (active) {
var _bulkResult$warning2;
let productResourcesResult = await this.createProductResourcesForAPIServiceProductization(apiSvc.data, sortedDefsMap, transferOwnership, assetName);
if (productResourcesResult.error.length > 0) {
var _assetResourcesResult6, _productResourcesResu;
// if there is an error at any stage while productizing an api service,
// clean up the resources created until that stage to avoid duplicate resources hanging around
const asset = (_assetResourcesResult6 = assetResourcesResult.warning) === null || _assetResourcesResult6 === void 0 ? void 0 : _assetResourcesResult6.find(result => result.kind === _types.Kind.Asset);
const product = (_productResourcesResu = productResourcesResult.warning) === null || _productResourcesResu === void 0 ? void 0 : _productResourcesResu.find(result => result.kind === _types.Kind.Product);
if (asset !== undefined) {
await this.cleanupResourcesOnFailure(asset, assetResourceDef);
}
if (product !== undefined) {
await this.cleanupResourcesOnFailure(product, productResourceDef);
}
bulkResult.error.push(...productResourcesResult.error);
}
if (productResourcesResult.warning) (_bulkResult$warning2 = bulkResult.warning) === null || _bulkResult$warning2 === void 0 ? void 0 : _bulkResult$warning2.push(...productResourcesResult.warning);
} else {
var _resource$spec1, _resource$spec1$apiSe;
if (assetResourcesResult.warning && assetResourcesResult.warning.length > 0) {
const asset = assetResourcesResult.warning.find(result => result.kind === _types.Kind.Asset);
asset ? await this.cleanupResourcesOnFailure(asset, assetResourceDef) : undefined;
}
bulkResult.error.push({
name: resource === null || resource === void 0 ? void 0 : (_resource$spec1 = resource.spec) === null || _resource$spec1 === void 0 ? void 0 : (_resource$spec1$apiSe = _resource$spec1.apiService) === null || _resource$spec1$apiSe === void 0 ? void 0 : _resource$spec1$apiSe.name,
kind: _types.Kind.Asset,
error: new Error('Asset status not set to active while productizing api service')
});
}
});
} else {
var _resource$spec10, _resource$spec10$apiS;
if (assetResourcesResult.warning && assetResourcesResult.warning.length > 0) {
const asset = assetResourcesResult.warning.find(result => result.kind === _types.Kind.Asset);
asset ? await this.cleanupResourcesOnFailure(asset, assetResourceDef) : undefined;
}
bulkResult.error.push({
name: resource === null || resource === void 0 ? void 0 : (_resource$spec10 = resource.spec) === null || _resource$spec10 === void 0 ? void 0 : (_resource$spec10$apiS = _resource$spec10.apiService) === null || _resource$spec10$apiS === void 0 ? void 0 : _resource$spec10$apiS.name,
kind: _types.Kind.ReleaseTag,
error: new Error('Unable to get asset release status while productizing api service')
});
}
});
} else {
var _resource$spec11, _resource$spec11$apiS, _resource$spec12, _resource$spec12$apiS, _resource$metadata4;
bulkResult.error.push({
name: resource === null || resource === void 0 ? void 0 : (_resource$spec11 = resource.spec) === null || _resource$spec11 === void 0 ? void 0 : (_resource$spec11$apiS = _resource$spec11.apiService) === null || _resource$spec11$apiS === void 0 ? void 0 : _resource$spec11$apiS.name,
kind: resource.kind,
error: new Error('Unable to find API Service with name: ' + (resource === null || resource === void 0 ? void 0 : (_resource$spec12 = resource.spec) === null || _resource$spec12 === void 0 ? void 0 : (_resource$spec12$apiS = _resource$spec12.apiService) === null || _resource$spec12$apiS === void 0 ? void 0 : _resource$spec12$apiS.name) + ' in Environment scope: ' + ((_resource$metadata4 = resource.metadata) === null || _resource$metadata4 === void 0 ? void 0 : _resource$metadata4.scope.name))
});
}
bulkResultMap.set((_resource$spec13 = resource.spec) === null || _resource$spec13 === void 0 ? void 0 : (_resource$spec13$apiS = _resource$spec13.apiService) === null || _resource$spec13$apiS === void 0 ? void 0 : _resource$spec13$apiS.name, bulkResult);
}
return bulkResultMap;
}
/**
* Create asset resources needed for productizing API services.
* @param apiService the apiService resource that needs to be productized
* @param sortedDefsMap sorted resource definition map
* @param apiServiceInstances api service instances referenced by the api service
* @param transferOwnership transfer ownership from api service to asset
*/
async createAssetResourcesForAPIServiceProductization(apiService, sortedDefsMap, apiServiceInstances, transferOwnership) {
var _apiService$owner, _apiService$spec, _apiService$spec$icon, _assetResponse$warnin;
let bulkResult = {
success: [],
error: [],
warning: []
};
let resources = [];
const resourceName = apiService.name;
const sortedDefsArray = Array.from(sortedDefsMap.values());
// 1. Asset.
const assetResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.Asset);
let assetResource = (0, _utils.buildGenericResource)({
resourceDef: assetResourceDef
});
// carry over the title of API Service to the asset title
assetResource.title = apiService === null || apiService === void 0 ? void 0 : apiService.title;
// transfer the ownership from api service if asked to
if (transferOwnership && apiService !== null && apiService !== void 0 && apiService.owner) assetResource.owner = {
type: 'team',
id: apiService === null || apiService === void 0 ? void 0 : (_apiService$owner = apiService.owner) === null || _apiService$owner === void 0 ? void 0 : _apiService$owner.id
};
// 1.1 set autorelease
assetResource.spec = {
type: 'API',
autoRelease: {
releaseType: 'patch',
requiresInitialActivation: true
}
};
// 1.2 add asset icon, if one exists
if (apiService !== null && apiService !== void 0 && (_apiService$spec = apiService.spec) !== null && _apiService$spec !== void 0 && (_apiService$spec$icon = _apiService$spec.icon) !== null && _apiService$spec$icon !== void 0 && _apiService$spec$icon.data) {
var _apiService$spec2, _apiService$spec2$ico;
assetResource.icon = `data:image/png;base64,${apiService === null || apiService === void 0 ? void 0 : (_apiService$spec2 = apiService.spec) === null || _apiService$spec2 === void 0 ? void 0 : (_apiService$spec2$ico = _apiService$spec2.icon) === null || _apiService$spec2$ico === void 0 ? void 0 : _apiService$spec2$ico.data}`;
}
// 1.3 add asset access approval
assetResource.access = {
approval: 'automatic'
};
let assetResources = [];
assetResources.push(assetResource);
const assetResponse = await this.apiServerClient.bulkCreate(assetResources, sortedDefsMap, true);
if (assetResponse && assetResponse.warning && ((_assetResponse$warnin = assetResponse.warning) === null || _assetResponse$warnin === void 0 ? void 0 : _assetResponse$warnin.length) > 0 && assetResponse.error.length === 0) {
var _bulkResult$warning3, _assetResponse$warnin2, _assetResponse$warnin3;
(_bulkResult$warning3 = bulkResult.warning) === null || _bulkResult$warning3 === void 0 ? void 0 : _bulkResult$warning3.push(...assetResponse.warning);
const assetName = (_assetResponse$warnin2 = assetResponse.warning) === null || _assetResponse$warnin2 === void 0 ? void 0 : (_assetResponse$warnin3 = _assetResponse$warnin2.find(res => res.kind === _types.Kind.Asset)) === null || _assetResponse$warnin3 === void 0 ? void 0 : _assetResponse$warnin3.name;
// 1.4 Asset Mapping
const assetMappingResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.AssetMapping, _types.Kind.Asset);
let assetMappingResource = (0, _utils.buildGenericResource)({
resourceDef: assetMappingResourceDef,
scopeName: assetName
});
// 1.5 set inputs
apiServiceInstances.data.forEach(instance => {
var _apiService$metadata, _apiService$metadata$, _instance$metadata;
assetMappingResource.spec = {
inputs: {
apiService: `management/${(_apiService$metadata = apiService.metadata) === null || _apiService$metadata === void 0 ? void 0 : (_apiService$metadata$ = _apiService$metadata.scope) === null || _apiService$metadata$ === void 0 ? void 0 : _apiService$metadata$.name}/${resourceName}`,
apiServiceInstance: `management/${(_instance$metadata = instance.metadata) === null || _instance$metadata === void 0 ? void 0 : _instance$metadata.scope.name}/${instance.name}`
}
};
});
resources.push(assetMappingResource);
// 1.6 Asset Release Tag
const assetReleaseResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.ReleaseTag, _types.Kind.Asset);
let assetReleaseResource = (0, _utils.buildGenericResource)({
resourceDef: assetReleaseResourceDef,
scopeName: assetName
});
assetReleaseResource.spec = {
releaseType: 'major'
};
resources.push(assetReleaseResource);
let assetResourcesResult = await this.apiServerClient.bulkCreate(resources, sortedDefsMap, true);
if (assetResourcesResult && assetResourcesResult.warning && assetResourcesResult.warning.length > 0 && assetResourcesResult.error.length === 0) {
var _bulkResult$warning4;
(_bulkResult$warning4 = bulkResult.warning) === null || _bulkResult$warning4 === void 0 ? void 0 : _bulkResult$warning4.push(...assetResourcesResult.warning);
} else {
bulkResult.error.push(...assetResourcesResult.error);
}
} else {
bulkResult.error.push(...assetResponse.error);
}
return bulkResult;
}
/**
* Create product resources needed for productizing API services.
* @param apiService the apiService resource that needs to be productized
* @param sortedDefsMap sorted resource definition map
* @param transferOwnership transfer ownership from api service to product
*/
async createProductResourcesForAPIServiceProductization(apiService, sortedDefsMap, transferOwnership, assetName) {
var _apiService$owner2, _apiService$spec3, _apiService$spec3$ico;
let bulkResult = {
success: [],
error: [],
warning: []
};
const sortedDefsArray = Array.from(sortedDefsMap.values());
// 1. Product
const productResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.Product);
let productResource = (0, _utils.buildGenericResource)({
resourceDef: productResourceDef
});
// carry over the title of API Service to the product title
productResource.title = apiService === null || apiService === void 0 ? void 0 : apiService.title;
productResource.spec = {
autoRelease: {
releaseType: 'patch',
requiresInitialActivation: true
},
assets: [{
name: assetName
}]
};
// transfer the ownership from api service if asked to
if (transferOwnership && apiService !== null && apiService !== void 0 && apiService.owner) productResource.owner = {
type: 'team',
id: apiService === null || apiService === void 0 ? void 0 : (_apiService$owner2 = apiService.owner) === null || _apiService$owner2 === void 0 ? void 0 : _apiService$owner2.id
};
// 1.1 add product icon, if one exists
if (apiService !== null && apiService !== void 0 && (_apiService$spec3 = apiService.spec) !== null && _apiService$spec3 !== void 0 && (_apiService$spec3$ico = _apiService$spec3.icon) !== null && _apiService$spec3$ico !== void 0 && _apiService$spec3$ico.data) {
var _apiService$spec4, _apiService$spec4$ico;
productResource.icon = `data:image/png;base64,${apiService === null || apiService === void 0 ? void 0 : (_apiService$spec4 = apiService.spec) === null || _apiService$spec4 === void 0 ? void 0 : (_apiService$spec4$ico = _apiService$spec4.icon) === null || _apiService$spec4$ico === void 0 ? void 0 : _apiService$spec4$ico.data}`;
}
let productResources = [];
productResources.push(productResource);
let productResponse = await this.apiServerClient.bulkCreate(productResources, sortedDefsMap, true);
if (productResponse && productResponse.warning && productResponse.warning.length > 0 && productResponse.error.length === 0) {
var _productResponse$warn, _productResponse$warn2, _bulkResult$warning5;
const productName = (_productResponse$warn = productResponse.warning) === null || _productResponse$warn === void 0 ? void 0 : (_productResponse$warn2 = _productResponse$warn.find(res => res.kind === _types.Kind.Product)) === null || _productResponse$warn2 === void 0 ? void 0 : _productResponse$warn2.name;
(_bulkResult$warning5 = bulkResult.warning) === null || _bulkResult$warning5 === void 0 ? void 0 : _bulkResult$warning5.push(...productResponse.warning);
// 1.2 Product Release Tag
const productReleaseResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.ReleaseTag, _types.Kind.Product);
let productReleaseResource = (0, _utils.buildGenericResource)({
resourceDef: productReleaseResourceDef,
scopeName: productName
});
productReleaseResource.spec = {
releaseType: 'major'
};
let productResources = [];
productResources.push(productReleaseResource);
let productReleaseResult = await this.apiServerClient.bulkCreate(productResources, sortedDefsMap, true);
if (productReleaseResult && productReleaseResult.warning && productReleaseResult.warning.length > 0 && productReleaseResult.error.length === 0) {
var _bulkResult$warning6;
(_bulkResult$warning6 = bulkResult.warning) === null || _bulkResult$warning6 === void 0 ? void 0 : _bulkResult$warning6.push(...productReleaseResult.warning);
} else {
bulkResult.error.push(...productReleaseResult.error);
}
} else {
bulkResult.error.push(...productResponse.error);
}
return bulkResult;
}
/**
* Verify if an asset state has been set to active
* @param assetResourceDef asset resource definition
* @param assetName name of the asset
*/
async waitForAssetActivation(assetResourceDef, assetName) {
const endTime = new Date();
endTime.setTime(endTime.getTime() + 5000);
const query = `name==${assetName};state==active`;
while (endTime > new Date()) {
var _parseInt;
const response = await this.apiServerClient.getResourceCount({
resourceDef: assetResourceDef,
query: query
});
if (((_parseInt = parseInt(response)) !== null && _parseInt !== void 0 ? _parseInt : 0) > 0) {
return true;
}
await new Promise(resolve => setTimeout(resolve, 500));
}
return false;
}
/**
* Verify if an asset release tag has been created
* @param sortedDefsArray array of sorted defs
* @param releaseTag name of the asset release tag
* @param assetName name of the asset where the release tag is scoped under
* @param totalAttempts max number of attempts to successfully verify
* @param delay time in ms to wait to restart a new attempt
* @param retried number of retries to make
*/
async checkForAssetReleaseTag(sortedDefsArray, releaseTag, assetName, totalAttempts = 8, delay = 100, retries = 0) {
var _assetReleaseTag$data;
const assetReleaseResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.ReleaseTag, _types.Kind.Asset);
const assetResourceDef = await (0, _utils.getResourceDefinition)(sortedDefsArray, _types.Kind.Asset);
await (0, _utils.wait)(delay);
let assetReleaseTag = await this.apiServerClient.getResourceByName({
resourceDef: assetReleaseResourceDef,
resourceName: releaseTag,
scopeDef: assetResourceDef,
scopeName: assetName
});
if (assetReleaseTag && assetReleaseTag.data && !assetReleaseTag.error && ((_assetReleaseTag$data = assetReleaseTag.data.status) === null || _assetReleaseTag$data === void 0 ? void 0 : _assetReleaseTag$data.level) === 'Success') {
return true;
} else if (retries < totalAttempts) {
// Try again after delay.
return await this.checkForAssetReleaseTag(sortedDefsArray, releaseTag, assetName, totalAttempts, 2 ** retries * 100, retries + 1);
} else {
// Ran out of attempts
return false;
}
}
/**
* Cleanup Asset/Product resources on Productization Failures
* @param resource the asset/product to be cleaned up
* @param resourceDef corresponding resource definition
*/
async cleanupResourcesOnFailure(resource, resourceDef) {
// update the state of asset/product before deleting it and all the resources scoped under it
resource.state = 'archived';
const version = resource.apiVersion === undefined ? (0, _utils.getLatestServedAPIVersion)(resourceDef) : resource.apiVersion;
const subResourceReq = await this.apiServerClient.generateSubResourcesRequests({
resource: resource,
resourceName: resource.name,
resourceDef: resourceDef,
subResourceName: 'state',
version: version
});
const subResourceResult = await this.apiServerClient.resolveSubResourcesRequests(resource, subResourceReq);
if (subResourceResult.data && !subResourceResult.error) {
// delete the asset/product and all resources scoped under it if any
await this.apiServerClient.deleteResourceByName({
resourceDef: resourceDef,
resourceName: resource.name,
wait: true,
forceDelete: true
});
}
}
}
exports.ProductizationHelper = ProductizationHelper;