Revert "Updating replacement logic (#25)" (#27)

This reverts commit 1cae8dfe8b6485cf29c5699565ba557165b600b0.
This commit is contained in:
Deepak Sattiraju 2020-03-05 23:28:57 +05:30 committed by GitHub
parent 1cae8dfe8b
commit cafbab6665
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 183 additions and 267 deletions

View File

@ -1,10 +1,9 @@
'use strict'; 'use strict';
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };

View File

@ -1,10 +1,9 @@
'use strict'; 'use strict';
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };

View File

@ -2,7 +2,6 @@
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
class KubernetesWorkload { class KubernetesWorkload {
} }
exports.KubernetesWorkload = KubernetesWorkload;
KubernetesWorkload.pod = 'Pod'; KubernetesWorkload.pod = 'Pod';
KubernetesWorkload.replicaset = 'Replicaset'; KubernetesWorkload.replicaset = 'Replicaset';
KubernetesWorkload.deployment = 'Deployment'; KubernetesWorkload.deployment = 'Deployment';
@ -10,17 +9,18 @@ KubernetesWorkload.statefulSet = 'StatefulSet';
KubernetesWorkload.daemonSet = 'DaemonSet'; KubernetesWorkload.daemonSet = 'DaemonSet';
KubernetesWorkload.job = 'job'; KubernetesWorkload.job = 'job';
KubernetesWorkload.cronjob = 'cronjob'; KubernetesWorkload.cronjob = 'cronjob';
exports.KubernetesWorkload = KubernetesWorkload;
class DiscoveryAndLoadBalancerResource { class DiscoveryAndLoadBalancerResource {
} }
exports.DiscoveryAndLoadBalancerResource = DiscoveryAndLoadBalancerResource;
DiscoveryAndLoadBalancerResource.service = 'service'; DiscoveryAndLoadBalancerResource.service = 'service';
DiscoveryAndLoadBalancerResource.ingress = 'ingress'; DiscoveryAndLoadBalancerResource.ingress = 'ingress';
exports.DiscoveryAndLoadBalancerResource = DiscoveryAndLoadBalancerResource;
class ServiceTypes { class ServiceTypes {
} }
exports.ServiceTypes = ServiceTypes;
ServiceTypes.loadBalancer = 'LoadBalancer'; ServiceTypes.loadBalancer = 'LoadBalancer';
ServiceTypes.nodePort = 'NodePort'; ServiceTypes.nodePort = 'NodePort';
ServiceTypes.clusterIP = 'ClusterIP'; ServiceTypes.clusterIP = 'ClusterIP';
exports.ServiceTypes = ServiceTypes;
exports.deploymentTypes = ['deployment', 'replicaset', 'daemonset', 'pod', 'statefulset']; exports.deploymentTypes = ['deployment', 'replicaset', 'daemonset', 'pod', 'statefulset'];
exports.workloadTypes = ['deployment', 'replicaset', 'daemonset', 'pod', 'statefulset', 'job', 'cronjob']; exports.workloadTypes = ['deployment', 'replicaset', 'daemonset', 'pod', 'statefulset', 'job', 'cronjob'];
exports.workloadTypesWithRolloutStatus = ['deployment', 'daemonset', 'statefulset']; exports.workloadTypesWithRolloutStatus = ['deployment', 'daemonset', 'statefulset'];

View File

@ -1,82 +1,82 @@
"use strict"; "use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const os = require("os"); const os = require("os");
const path = require("path"); const path = require("path");
const util = require("util"); const util = require("util");
const fs = require("fs"); const fs = require("fs");
const toolCache = require("@actions/tool-cache"); const toolCache = require("@actions/tool-cache");
const core = require("@actions/core"); const core = require("@actions/core");
const kubectlToolName = 'kubectl'; const kubectlToolName = 'kubectl';
const stableKubectlVersion = 'v1.15.0'; const stableKubectlVersion = 'v1.15.0';
const stableVersionUrl = 'https://storage.googleapis.com/kubernetes-release/release/stable.txt'; const stableVersionUrl = 'https://storage.googleapis.com/kubernetes-release/release/stable.txt';
const trafficSplitAPIVersionPrefix = 'split.smi-spec.io'; const trafficSplitAPIVersionPrefix = 'split.smi-spec.io';
function getExecutableExtension() { function getExecutableExtension() {
if (os.type().match(/^Win/)) { if (os.type().match(/^Win/)) {
return '.exe'; return '.exe';
} }
return ''; return '';
} }
function getkubectlDownloadURL(version) { function getkubectlDownloadURL(version) {
switch (os.type()) { switch (os.type()) {
case 'Linux': case 'Linux':
return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/linux/amd64/kubectl', version); return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/linux/amd64/kubectl', version);
case 'Darwin': case 'Darwin':
return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/darwin/amd64/kubectl', version); return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/darwin/amd64/kubectl', version);
case 'Windows_NT': case 'Windows_NT':
default: default:
return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/windows/amd64/kubectl.exe', version); return util.format('https://storage.googleapis.com/kubernetes-release/release/%s/bin/windows/amd64/kubectl.exe', version);
} }
} }
function getStableKubectlVersion() { function getStableKubectlVersion() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
return toolCache.downloadTool(stableVersionUrl).then((downloadPath) => { return toolCache.downloadTool(stableVersionUrl).then((downloadPath) => {
let version = fs.readFileSync(downloadPath, 'utf8').toString().trim(); let version = fs.readFileSync(downloadPath, 'utf8').toString().trim();
if (!version) { if (!version) {
version = stableKubectlVersion; version = stableKubectlVersion;
} }
return version; return version;
}, (error) => { }, (error) => {
core.debug(error); core.debug(error);
core.warning('GetStableVersionFailed'); core.warning('GetStableVersionFailed');
return stableKubectlVersion; return stableKubectlVersion;
}); });
}); });
} }
exports.getStableKubectlVersion = getStableKubectlVersion; exports.getStableKubectlVersion = getStableKubectlVersion;
function downloadKubectl(version) { function downloadKubectl(version) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
let cachedToolpath = toolCache.find(kubectlToolName, version); let cachedToolpath = toolCache.find(kubectlToolName, version);
let kubectlDownloadPath = ''; let kubectlDownloadPath = '';
if (!cachedToolpath) { if (!cachedToolpath) {
try { try {
kubectlDownloadPath = yield toolCache.downloadTool(getkubectlDownloadURL(version)); kubectlDownloadPath = yield toolCache.downloadTool(getkubectlDownloadURL(version));
} }
catch (exception) { catch (exception) {
throw new Error('DownloadKubectlFailed'); throw new Error('DownloadKubectlFailed');
} }
cachedToolpath = yield toolCache.cacheFile(kubectlDownloadPath, kubectlToolName + getExecutableExtension(), kubectlToolName, version); cachedToolpath = yield toolCache.cacheFile(kubectlDownloadPath, kubectlToolName + getExecutableExtension(), kubectlToolName, version);
} }
const kubectlPath = path.join(cachedToolpath, kubectlToolName + getExecutableExtension()); const kubectlPath = path.join(cachedToolpath, kubectlToolName + getExecutableExtension());
fs.chmodSync(kubectlPath, '777'); fs.chmodSync(kubectlPath, '777');
return kubectlPath; return kubectlPath;
}); });
} }
exports.downloadKubectl = downloadKubectl; exports.downloadKubectl = downloadKubectl;
function getTrafficSplitAPIVersion(kubectl) { function getTrafficSplitAPIVersion(kubectl) {
const result = kubectl.executeCommand('api-versions'); const result = kubectl.executeCommand('api-versions');
const trafficSplitAPIVersion = result.stdout.split('\n').find(version => version.startsWith(trafficSplitAPIVersionPrefix)); const trafficSplitAPIVersion = result.stdout.split('\n').find(version => version.startsWith(trafficSplitAPIVersionPrefix));
if (!trafficSplitAPIVersion) { if (!trafficSplitAPIVersion) {
throw new Error('UnableToCreateTrafficSplitManifestFile'); throw new Error('UnableToCreateTrafficSplitManifestFile');
} }
return trafficSplitAPIVersion; return trafficSplitAPIVersion;
} }
exports.getTrafficSplitAPIVersion = getTrafficSplitAPIVersion; exports.getTrafficSplitAPIVersion = getTrafficSplitAPIVersion;

View File

@ -87,61 +87,6 @@ function updateImagePullSecrets(inputObject, newImagePullSecrets, override) {
setImagePullSecrets(inputObject, existingImagePullSecretObjects); setImagePullSecrets(inputObject, existingImagePullSecretObjects);
} }
exports.updateImagePullSecrets = updateImagePullSecrets; exports.updateImagePullSecrets = updateImagePullSecrets;
function updateImageDetails(inputObject, containers) {
if (!inputObject || !inputObject.spec || !containers) {
return;
}
if (inputObject.spec.template && !!inputObject.spec.template.spec) {
if (inputObject.spec.template.spec.containers) {
updateContainers(inputObject.spec.template.spec.containers, containers);
}
if (inputObject.spec.template.spec.initContainers) {
updateContainers(inputObject.spec.template.spec.initContainers, containers);
}
return;
}
if (inputObject.spec.jobTemplate && inputObject.spec.jobTemplate.spec && inputObject.spec.jobTemplate.spec.template && inputObject.spec.jobTemplate.spec.template.spec) {
if (inputObject.spec.jobTemplate.spec.template.spec.containers) {
updateContainers(inputObject.spec.jobTemplate.spec.template.spec.containers, containers);
}
if (inputObject.spec.jobTemplate.spec.template.spec.initContainers) {
updateContainers(inputObject.spec.jobTemplate.spec.template.spec.initContainers, containers);
}
return;
}
if (inputObject.spec.containers) {
updateContainers(inputObject.spec.containers, containers);
}
if (inputObject.spec.initContainers) {
updateContainers(inputObject.spec.initContainers, containers);
}
}
exports.updateImageDetails = updateImageDetails;
function updateContainers(containers, images) {
if (!containers || containers.length === 0) {
return containers;
}
containers.forEach((container) => {
const imageName = extractImageName(container.image.trim());
images.forEach(image => {
if (extractImageName(image) === imageName) {
container.image = image;
}
});
});
}
function extractImageName(imageName) {
let img = '';
if (imageName.indexOf('/') > 0) {
const registry = imageName.substring(0, imageName.indexOf('/'));
const imgName = imageName.substring(imageName.indexOf('/') + 1).split(':')[0];
img = `${registry}/${imgName}`;
}
else {
img = imageName.split(':')[0];
}
return img;
}
function updateSpecLabels(inputObject, newLabels, override) { function updateSpecLabels(inputObject, newLabels, override) {
if (!inputObject) { if (!inputObject) {
throw ('NullInputObject'); throw ('NullInputObject');

View File

@ -1,15 +1,15 @@
'use strict'; 'use strict';
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs"); const fs = require("fs");
const path = require("path");
const core = require("@actions/core"); const core = require("@actions/core");
const yaml = require("js-yaml"); const yaml = require("js-yaml");
const canaryDeploymentHelper = require("./canary-deployment-helper"); const canaryDeploymentHelper = require("./canary-deployment-helper");
@ -20,7 +20,6 @@ const fileHelper = require("../files-helper");
const utils = require("../manifest-utilities"); const utils = require("../manifest-utilities");
const KubernetesManifestUtility = require("../manifest-stability-utility"); const KubernetesManifestUtility = require("../manifest-stability-utility");
const KubernetesConstants = require("../../constants"); const KubernetesConstants = require("../../constants");
const string_comparison_1 = require("./../string-comparison");
const pod_canary_deployment_helper_1 = require("./pod-canary-deployment-helper"); const pod_canary_deployment_helper_1 = require("./pod-canary-deployment-helper");
const smi_canary_deployment_helper_1 = require("./smi-canary-deployment-helper"); const smi_canary_deployment_helper_1 = require("./smi-canary-deployment-helper");
const utility_1 = require("../utility"); const utility_1 = require("../utility");
@ -29,7 +28,9 @@ function deploy(kubectl, manifestFilePaths, deploymentStrategy) {
// get manifest files // get manifest files
let inputManifestFiles = getManifestFiles(manifestFilePaths); let inputManifestFiles = getManifestFiles(manifestFilePaths);
// artifact substitution // artifact substitution
inputManifestFiles = updateResourceObjects(inputManifestFiles, TaskInputParameters.containers, TaskInputParameters.imagePullSecrets); inputManifestFiles = updateContainerImagesInManifestFiles(inputManifestFiles, TaskInputParameters.containers);
// imagePullSecrets addition
inputManifestFiles = updateImagePullSecretsInManifestFiles(inputManifestFiles, TaskInputParameters.imagePullSecrets);
// deployment // deployment
const deployedManifestFiles = deployManifests(inputManifestFiles, kubectl, isCanaryDeploymentStrategy(deploymentStrategy)); const deployedManifestFiles = deployManifests(inputManifestFiles, kubectl, isCanaryDeploymentStrategy(deploymentStrategy));
// check manifest stability // check manifest stability
@ -100,37 +101,49 @@ function checkManifestStability(kubectl, resources) {
yield KubernetesManifestUtility.checkManifestStability(kubectl, resources); yield KubernetesManifestUtility.checkManifestStability(kubectl, resources);
}); });
} }
function updateResourceObjects(filePaths, imagePullSecrets, containers) { function updateContainerImagesInManifestFiles(filePaths, containers) {
const newObjectsList = []; if (!!containers && containers.length > 0) {
const updateResourceObject = (inputObject) => { const newFilePaths = [];
if (!!imagePullSecrets && imagePullSecrets.length > 0) { const tempDirectory = fileHelper.getTempDirectory();
KubernetesObjectUtility.updateImagePullSecrets(inputObject, imagePullSecrets, false); filePaths.forEach((filePath) => {
} let contents = fs.readFileSync(filePath).toString();
if (!!containers && containers.length > 0) { containers.forEach((container) => {
KubernetesObjectUtility.updateImageDetails(inputObject, containers); let imageName = container.split(':')[0];
} if (imageName.indexOf('@') > 0) {
}; imageName = imageName.split('@')[0];
filePaths.forEach((filePath) => {
const fileContents = fs.readFileSync(filePath).toString();
yaml.safeLoadAll(fileContents, function (inputObject) {
if (inputObject && inputObject.kind) {
const kind = inputObject.kind;
if (KubernetesObjectUtility.isWorkloadEntity(kind)) {
updateResourceObject(inputObject);
} }
else if (string_comparison_1.isEqual(kind, 'list', string_comparison_1.StringComparer.OrdinalIgnoreCase)) { if (contents.indexOf(imageName) > 0) {
let items = inputObject.items; contents = utils.substituteImageNameInSpecFile(contents, imageName, container);
if (items.length > 0) {
items.forEach((item) => updateResourceObject(item));
}
} }
newObjectsList.push(inputObject); });
} const fileName = path.join(tempDirectory, path.basename(filePath));
fs.writeFileSync(path.join(fileName), contents);
newFilePaths.push(fileName);
}); });
}); return newFilePaths;
core.debug('New K8s objects after addin imagePullSecrets are :' + JSON.stringify(newObjectsList)); }
const newFilePaths = fileHelper.writeObjectsToFile(newObjectsList); return filePaths;
return newFilePaths; }
function updateImagePullSecretsInManifestFiles(filePaths, imagePullSecrets) {
if (!!imagePullSecrets && imagePullSecrets.length > 0) {
const newObjectsList = [];
filePaths.forEach((filePath) => {
const fileContents = fs.readFileSync(filePath).toString();
yaml.safeLoadAll(fileContents, function (inputObject) {
if (!!inputObject && !!inputObject.kind) {
const kind = inputObject.kind;
if (KubernetesObjectUtility.isWorkloadEntity(kind)) {
KubernetesObjectUtility.updateImagePullSecrets(inputObject, imagePullSecrets, false);
}
newObjectsList.push(inputObject);
}
});
});
core.debug('New K8s objects after addin imagePullSecrets are :' + JSON.stringify(newObjectsList));
const newFilePaths = fileHelper.writeObjectsToFile(newObjectsList);
return newFilePaths;
}
return filePaths;
} }
function isCanaryDeploymentStrategy(deploymentStrategy) { function isCanaryDeploymentStrategy(deploymentStrategy) {
return deploymentStrategy != null && deploymentStrategy.toUpperCase() === canaryDeploymentHelper.CANARY_DEPLOYMENT_STRATEGY.toUpperCase(); return deploymentStrategy != null && deploymentStrategy.toUpperCase() === canaryDeploymentHelper.CANARY_DEPLOYMENT_STRATEGY.toUpperCase();

View File

@ -102,67 +102,6 @@ export function updateImagePullSecrets(inputObject: any, newImagePullSecrets: st
setImagePullSecrets(inputObject, existingImagePullSecretObjects); setImagePullSecrets(inputObject, existingImagePullSecretObjects);
} }
export function updateImageDetails(inputObject: any, containers: string[]) {
if (!inputObject || !inputObject.spec || !containers) {
return;
}
if (inputObject.spec.template && !!inputObject.spec.template.spec) {
if (inputObject.spec.template.spec.containers) {
updateContainers(inputObject.spec.template.spec.containers, containers);
}
if (inputObject.spec.template.spec.initContainers) {
updateContainers(inputObject.spec.template.spec.initContainers, containers);
}
return;
}
if (inputObject.spec.jobTemplate && inputObject.spec.jobTemplate.spec && inputObject.spec.jobTemplate.spec.template && inputObject.spec.jobTemplate.spec.template.spec) {
if (inputObject.spec.jobTemplate.spec.template.spec.containers) {
updateContainers(inputObject.spec.jobTemplate.spec.template.spec.containers, containers);
}
if (inputObject.spec.jobTemplate.spec.template.spec.initContainers) {
updateContainers(inputObject.spec.jobTemplate.spec.template.spec.initContainers, containers);
}
return;
}
if (inputObject.spec.containers) {
updateContainers(inputObject.spec.containers, containers);
}
if (inputObject.spec.initContainers) {
updateContainers(inputObject.spec.initContainers, containers);
}
}
function updateContainers(containers: any[], images: string[]) {
if (!containers || containers.length === 0) {
return containers;
}
containers.forEach((container) => {
const imageName: string = extractImageName(container.image.trim());
images.forEach(image => {
if (extractImageName(image) === imageName) {
container.image = image;
}
});
});
}
function extractImageName(imageName) {
let img = '';
if (imageName.indexOf('/') > 0) {
const registry = imageName.substring(0, imageName.indexOf('/'));
const imgName = imageName.substring(imageName.indexOf('/') + 1).split(':')[0];
img = `${registry}/${imgName}`;
} else {
img = imageName.split(':')[0];
}
return img;
}
export function updateSpecLabels(inputObject: any, newLabels: Map<string, string>, override: boolean) { export function updateSpecLabels(inputObject: any, newLabels: Map<string, string>, override: boolean) {
if (!inputObject) { if (!inputObject) {
throw ('NullInputObject'); throw ('NullInputObject');

View File

@ -13,7 +13,6 @@ import * as utils from '../manifest-utilities';
import * as KubernetesManifestUtility from '../manifest-stability-utility'; import * as KubernetesManifestUtility from '../manifest-stability-utility';
import * as KubernetesConstants from '../../constants'; import * as KubernetesConstants from '../../constants';
import { Kubectl, Resource } from '../../kubectl-object-model'; import { Kubectl, Resource } from '../../kubectl-object-model';
import { StringComparer, isEqual } from './../string-comparison';
import { deployPodCanary } from './pod-canary-deployment-helper'; import { deployPodCanary } from './pod-canary-deployment-helper';
import { deploySMICanary } from './smi-canary-deployment-helper'; import { deploySMICanary } from './smi-canary-deployment-helper';
@ -26,7 +25,10 @@ export async function deploy(kubectl: Kubectl, manifestFilePaths: string[], depl
let inputManifestFiles: string[] = getManifestFiles(manifestFilePaths); let inputManifestFiles: string[] = getManifestFiles(manifestFilePaths);
// artifact substitution // artifact substitution
inputManifestFiles = updateResourceObjects(inputManifestFiles, TaskInputParameters.containers, TaskInputParameters.imagePullSecrets); inputManifestFiles = updateContainerImagesInManifestFiles(inputManifestFiles, TaskInputParameters.containers);
// imagePullSecrets addition
inputManifestFiles = updateImagePullSecretsInManifestFiles(inputManifestFiles, TaskInputParameters.imagePullSecrets);
// deployment // deployment
const deployedManifestFiles = deployManifests(inputManifestFiles, kubectl, isCanaryDeploymentStrategy(deploymentStrategy)); const deployedManifestFiles = deployManifests(inputManifestFiles, kubectl, isCanaryDeploymentStrategy(deploymentStrategy));
@ -102,37 +104,56 @@ async function checkManifestStability(kubectl: Kubectl, resources: Resource[]):
await KubernetesManifestUtility.checkManifestStability(kubectl, resources); await KubernetesManifestUtility.checkManifestStability(kubectl, resources);
} }
function updateResourceObjects(filePaths: string[], imagePullSecrets: string[], containers: string[]): string[] { function updateContainerImagesInManifestFiles(filePaths: string[], containers: string[]): string[] {
const newObjectsList = []; if (!!containers && containers.length > 0) {
const updateResourceObject = (inputObject) => { const newFilePaths = [];
if (!!imagePullSecrets && imagePullSecrets.length > 0) { const tempDirectory = fileHelper.getTempDirectory();
KubernetesObjectUtility.updateImagePullSecrets(inputObject, imagePullSecrets, false); filePaths.forEach((filePath: string) => {
} let contents = fs.readFileSync(filePath).toString();
if (!!containers && containers.length > 0) { containers.forEach((container: string) => {
KubernetesObjectUtility.updateImageDetails(inputObject, containers); let imageName = container.split(':')[0];
} if (imageName.indexOf('@') > 0) {
} imageName = imageName.split('@')[0];
filePaths.forEach((filePath: string) => {
const fileContents = fs.readFileSync(filePath).toString();
yaml.safeLoadAll(fileContents, function (inputObject: any) {
if (inputObject && inputObject.kind) {
const kind = inputObject.kind;
if (KubernetesObjectUtility.isWorkloadEntity(kind)) {
updateResourceObject(inputObject);
} }
else if (isEqual(kind, 'list', StringComparer.OrdinalIgnoreCase)) { if (contents.indexOf(imageName) > 0) {
let items = inputObject.items; contents = utils.substituteImageNameInSpecFile(contents, imageName, container);
if (items.length > 0) {
items.forEach((item) => updateResourceObject(item));
}
} }
newObjectsList.push(inputObject); });
}
const fileName = path.join(tempDirectory, path.basename(filePath));
fs.writeFileSync(
path.join(fileName),
contents
);
newFilePaths.push(fileName);
}); });
});
core.debug('New K8s objects after addin imagePullSecrets are :' + JSON.stringify(newObjectsList)); return newFilePaths;
const newFilePaths = fileHelper.writeObjectsToFile(newObjectsList); }
return newFilePaths;
return filePaths;
}
function updateImagePullSecretsInManifestFiles(filePaths: string[], imagePullSecrets: string[]): string[] {
if (!!imagePullSecrets && imagePullSecrets.length > 0) {
const newObjectsList = [];
filePaths.forEach((filePath: string) => {
const fileContents = fs.readFileSync(filePath).toString();
yaml.safeLoadAll(fileContents, function (inputObject: any) {
if (!!inputObject && !!inputObject.kind) {
const kind = inputObject.kind;
if (KubernetesObjectUtility.isWorkloadEntity(kind)) {
KubernetesObjectUtility.updateImagePullSecrets(inputObject, imagePullSecrets, false);
}
newObjectsList.push(inputObject);
}
});
});
core.debug('New K8s objects after addin imagePullSecrets are :' + JSON.stringify(newObjectsList));
const newFilePaths = fileHelper.writeObjectsToFile(newObjectsList);
return newFilePaths;
}
return filePaths;
} }
function isCanaryDeploymentStrategy(deploymentStrategy: string): boolean { function isCanaryDeploymentStrategy(deploymentStrategy: string): boolean {