UNPKG

@axway/axway-central-cli

Version:

Manage APIs, services and publish to the Amplify Marketplace

408 lines (401 loc) 28.3 kB
"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;