mirror of
https://github.com/Azure/k8s-deploy.git
synced 2026-06-22 03:09:27 +08:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ff21bd2d58 | |||
| 172f1e16bd | |||
| 5782616d03 | |||
| c7b34876bb | |||
| d89c89ba4e | |||
| a2de818915 | |||
| 2ee6236ebc | |||
| bba74ad3b5 | |||
| 4e60e959ea | |||
| 497ce6351c | |||
| 6ecb006985 | |||
| d7506e9702 |
@@ -1,15 +1,14 @@
|
|||||||
name: release Project
|
name: Create release PR
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- CHANGELOG.md
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
release:
|
||||||
|
description: 'Define release version (ex: v1, v2, v3)'
|
||||||
|
required: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release-pr:
|
||||||
uses: Azure/action-release-workflows/.github/workflows/release_js_project.yaml@81e6a8ed41ced9d131dea884ecae7b8c6dc4f799
|
uses: OliverMKing/javascript-release-workflow/.github/workflows/release-pr.yml@main
|
||||||
with:
|
with:
|
||||||
changelogPath: ./CHANGELOG.md
|
release: ${{ github.event.inputs.release }}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@latest
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.31.2
|
minikube-version: 1.24.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.22.3
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
name: Setup Minikube
|
name: Setup Minikube
|
||||||
uses: medyagh/setup-minikube@latest
|
uses: medyagh/setup-minikube@latest
|
||||||
with:
|
with:
|
||||||
minikube-version: 1.31.2
|
minikube-version: 1.24.0
|
||||||
kubernetes-version: 1.22.3
|
kubernetes-version: 1.22.3
|
||||||
driver: 'none'
|
driver: 'none'
|
||||||
timeout-minutes: 3
|
timeout-minutes: 3
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
run-integration-test:
|
run-integration-test:
|
||||||
name: Run Minikube Integration Tests
|
name: Run Minikube Integration Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
KUBECONFIG: /home/runner/.kube/config
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
NAMESPACE: test-${{ github.run_id }}
|
||||||
|
|||||||
@@ -1,89 +0,0 @@
|
|||||||
name: Minikube Integration Tests - resource annotation
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- 'releases/*'
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- 'releases/*'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
run-integration-test:
|
|
||||||
name: Run Minikube Integration Tests
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
KUBECONFIG: /home/runner/.kube/config
|
|
||||||
NAMESPACE: test-${{ github.run_id }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
rm -rf node_modules/
|
|
||||||
npm install
|
|
||||||
- name: Install ncc
|
|
||||||
run: npm i -g @vercel/ncc
|
|
||||||
- name: Install conntrack
|
|
||||||
run: sudo apt-get install -y conntrack
|
|
||||||
- name: Build
|
|
||||||
run: ncc build src/run.ts -o lib
|
|
||||||
|
|
||||||
- uses: Azure/setup-kubectl@v3
|
|
||||||
name: Install Kubectl
|
|
||||||
|
|
||||||
- id: setup-minikube
|
|
||||||
name: Setup Minikube
|
|
||||||
uses: medyagh/setup-minikube@latest
|
|
||||||
with:
|
|
||||||
minikube-version: 1.24.0
|
|
||||||
kubernetes-version: 1.22.3
|
|
||||||
driver: 'none'
|
|
||||||
timeout-minutes: 3
|
|
||||||
|
|
||||||
- name: Create namespace to run tests
|
|
||||||
run: kubectl create ns ${{ env.NAMESPACE }}
|
|
||||||
|
|
||||||
- uses: actions/setup-python@v2
|
|
||||||
name: Install Python
|
|
||||||
with:
|
|
||||||
python-version: '3.x'
|
|
||||||
|
|
||||||
- name: Cleaning any previously created items
|
|
||||||
run: |
|
|
||||||
python test/integration/k8s-deploy-delete.py 'Service' 'all' ${{ env.NAMESPACE }}
|
|
||||||
python test/integration/k8s-deploy-delete.py 'Deployment' 'all' ${{ env.NAMESPACE }}
|
|
||||||
python test/integration/k8s-deploy-delete.py 'Ingress' 'all' ${{ env.NAMESPACE }}
|
|
||||||
|
|
||||||
- name: Executing deploy action for pod with resource annotation enabled by default
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
namespace: ${{ env.NAMESPACE }}
|
|
||||||
images: nginx:1.14.2
|
|
||||||
manifests: |
|
|
||||||
test/integration/manifests/test.yml
|
|
||||||
action: deploy
|
|
||||||
|
|
||||||
- name: Checking if deployments is created with additional resource annotation
|
|
||||||
run: |
|
|
||||||
python test/integration/k8s-deploy-test.py namespace=${{ env.NAMESPACE }} kind=Deployment name=nginx-deployment containerName=nginx:1.14.2 labels=app:nginx,workflow:actions.github.com-k8s-deploy,workflowFriendlyName:Minikube_Integration_Tests_-_resource_annotation selectorLabels=app:nginx annotations=actions.github.com/k8s-deploy,deployment.kubernetes.io/revision,kubectl.kubernetes.io/last-applied-configuration
|
|
||||||
|
|
||||||
- name: Cleaning previously created deployment
|
|
||||||
run: |
|
|
||||||
python test/integration/k8s-deploy-delete.py 'Deployment' 'all' ${{ env.NAMESPACE }}
|
|
||||||
|
|
||||||
- name: Executing deploy action for pod with resource annotation disabled
|
|
||||||
uses: ./
|
|
||||||
with:
|
|
||||||
namespace: ${{ env.NAMESPACE }}
|
|
||||||
images: nginx:1.14.2
|
|
||||||
manifests: |
|
|
||||||
test/integration/manifests/test.yml
|
|
||||||
action: deploy
|
|
||||||
annotate-resources: false
|
|
||||||
|
|
||||||
- name: Checking if deployment is created without additional resource annotation
|
|
||||||
run: |
|
|
||||||
python test/integration/k8s-deploy-test.py namespace=${{ env.NAMESPACE }} kind=Deployment name=nginx-deployment containerName=nginx:1.14.2 selectorLabels=app:nginx annotations=deployment.kubernetes.io/revision,kubectl.kubernetes.io/last-applied-configuration
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## [v4.10.0] - 2023-10-30
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- #287 Make annotating resources optional
|
|
||||||
- #283 Fix “Service” route-method of the Blue-Green strategy with some manifest files
|
|
||||||
- #281 bump codeql to node 16
|
|
||||||
- #279 upgrade codeql
|
|
||||||
- #276 Fixes multiple namespaces bug
|
|
||||||
@@ -113,13 +113,9 @@ Following are the key capabilities of this action:
|
|||||||
<td>force </br></br>(Optional)</td>
|
<td>force </br></br>(Optional)</td>
|
||||||
<td>Deploy when a previous deployment already exists. If true then '--force' argument is added to the apply command. Using '--force' argument is not recommended in production.</td>
|
<td>Deploy when a previous deployment already exists. If true then '--force' argument is added to the apply command. Using '--force' argument is not recommended in production.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td>annotate-resources</br></br>(Optional)</td>
|
|
||||||
<td>Acceptable values: true/false</br>Default value: true</br>Switch whether to annotate the resources or not. If set to false all annotations are skipped completely.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>annotate-namespace</br></br>(Optional)</td>
|
<td>annotate-namespace</br></br>(Optional)</td>
|
||||||
<td>Acceptable values: true/false</br>Default value: true</br>Switch whether to annotate the namespace resources object or not. Ignored when annotate-resources is set to false.</td>
|
<td>Acceptable values: true/false</br>Default value: true</br>Switch whether to annotate the namespace resources object or not</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>skip-tls-verify</br></br>(Optional)</td>
|
<td>skip-tls-verify</br></br>(Optional)</td>
|
||||||
|
|||||||
+1
-5
@@ -59,12 +59,8 @@ inputs:
|
|||||||
description: 'Github token'
|
description: 'Github token'
|
||||||
default: ${{ github.token }}
|
default: ${{ github.token }}
|
||||||
required: true
|
required: true
|
||||||
annotate-resources:
|
|
||||||
description: 'Annotate the resources. If set to false all annotations are skipped completely.'
|
|
||||||
required: false
|
|
||||||
default: true
|
|
||||||
annotate-namespace:
|
annotate-namespace:
|
||||||
description: 'Annotate the target namespace. Ignored when annotate-resources is set to false.'
|
description: 'Annotate the target namespace'
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
private-cluster:
|
private-cluster:
|
||||||
|
|||||||
+542
-578
File diff suppressed because it is too large
Load Diff
Generated
+222
-584
File diff suppressed because it is too large
Load Diff
+2
-3
@@ -4,7 +4,7 @@
|
|||||||
"author": "Deepak Sattiraju",
|
"author": "Deepak Sattiraju",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "npm i ncc && npx ncc build src/run.ts -o lib",
|
"build": "npx ncc build src/run.ts -o lib",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"coverage": "jest --coverage=true",
|
"coverage": "jest --coverage=true",
|
||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
@@ -18,8 +18,7 @@
|
|||||||
"@octokit/core": "^3.5.1",
|
"@octokit/core": "^3.5.1",
|
||||||
"@octokit/plugin-retry": "^3.0.9",
|
"@octokit/plugin-retry": "^3.0.9",
|
||||||
"@types/minipass": "^3.1.2",
|
"@types/minipass": "^3.1.2",
|
||||||
"js-yaml": "3.13.1",
|
"js-yaml": "3.13.1"
|
||||||
"ncc": "^0.3.6"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^26.0.0",
|
"@types/jest": "^26.0.0",
|
||||||
|
|||||||
@@ -65,10 +65,17 @@ export async function deploy(
|
|||||||
|
|
||||||
// annotate resources
|
// annotate resources
|
||||||
core.startGroup('Annotating resources')
|
core.startGroup('Annotating resources')
|
||||||
|
let allPods
|
||||||
|
try {
|
||||||
|
allPods = JSON.parse((await kubectl.getAllPods()).stdout)
|
||||||
|
} catch (e) {
|
||||||
|
core.debug(`Unable to parse pods: ${e}`)
|
||||||
|
}
|
||||||
await annotateAndLabelResources(
|
await annotateAndLabelResources(
|
||||||
deployedManifestFiles,
|
deployedManifestFiles,
|
||||||
kubectl,
|
kubectl,
|
||||||
resourceTypes
|
resourceTypes,
|
||||||
|
allPods
|
||||||
)
|
)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-2
@@ -129,13 +129,19 @@ async function promoteCanary(kubectl: Kubectl, manifests: string[]) {
|
|||||||
|
|
||||||
// annotate resources
|
// annotate resources
|
||||||
core.startGroup('Annotating resources')
|
core.startGroup('Annotating resources')
|
||||||
|
let allPods
|
||||||
|
try {
|
||||||
|
allPods = JSON.parse((await kubectl.getAllPods()).stdout)
|
||||||
|
} catch (e) {
|
||||||
|
core.debug(`Unable to parse pods: ${e}`)
|
||||||
|
}
|
||||||
const resources: Resource[] = getResources(
|
const resources: Resource[] = getResources(
|
||||||
filesToAnnotate,
|
filesToAnnotate,
|
||||||
models.DEPLOYMENT_TYPES.concat([
|
models.DEPLOYMENT_TYPES.concat([
|
||||||
models.DiscoveryAndLoadBalancerResource.SERVICE
|
models.DiscoveryAndLoadBalancerResource.SERVICE
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
await annotateAndLabelResources(filesToAnnotate, kubectl, resources)
|
await annotateAndLabelResources(filesToAnnotate, kubectl, resources, allPods)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,6 +219,17 @@ async function promoteBlueGreen(kubectl: Kubectl, manifests: string[]) {
|
|||||||
|
|
||||||
// annotate resources
|
// annotate resources
|
||||||
core.startGroup('Annotating resources')
|
core.startGroup('Annotating resources')
|
||||||
await annotateAndLabelResources(deployedManifestFiles, kubectl, resources)
|
let allPods
|
||||||
|
try {
|
||||||
|
allPods = JSON.parse((await kubectl.getAllPods()).stdout)
|
||||||
|
} catch (e) {
|
||||||
|
core.debug(`Unable to parse pods: ${e}`)
|
||||||
|
}
|
||||||
|
await annotateAndLabelResources(
|
||||||
|
deployedManifestFiles,
|
||||||
|
kubectl,
|
||||||
|
resources,
|
||||||
|
allPods
|
||||||
|
)
|
||||||
core.endGroup()
|
core.endGroup()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,7 +147,8 @@ export async function checkManifestStability(
|
|||||||
export async function annotateAndLabelResources(
|
export async function annotateAndLabelResources(
|
||||||
files: string[],
|
files: string[],
|
||||||
kubectl: Kubectl,
|
kubectl: Kubectl,
|
||||||
resourceTypes: Resource[]
|
resourceTypes: Resource[],
|
||||||
|
allPods: any
|
||||||
) {
|
) {
|
||||||
const defaultWorkflowFileName = 'k8s-deploy-failed-workflow-annotation'
|
const defaultWorkflowFileName = 'k8s-deploy-failed-workflow-annotation'
|
||||||
const githubToken = core.getInput('token')
|
const githubToken = core.getInput('token')
|
||||||
@@ -162,20 +163,15 @@ export async function annotateAndLabelResources(
|
|||||||
const deploymentConfig = await getDeploymentConfig()
|
const deploymentConfig = await getDeploymentConfig()
|
||||||
const annotationKeyLabel = getWorkflowAnnotationKeyLabel()
|
const annotationKeyLabel = getWorkflowAnnotationKeyLabel()
|
||||||
|
|
||||||
const shouldAnnotateResources = !(
|
await annotateResources(
|
||||||
core.getInput('annotate-resources').toLowerCase() === 'false'
|
files,
|
||||||
)
|
kubectl,
|
||||||
|
resourceTypes,
|
||||||
if (shouldAnnotateResources) {
|
allPods,
|
||||||
await annotateResources(
|
annotationKeyLabel,
|
||||||
files,
|
workflowFilePath,
|
||||||
kubectl,
|
deploymentConfig
|
||||||
resourceTypes,
|
).catch((err) => core.warning(`Failed to annotate resources: ${err} `))
|
||||||
annotationKeyLabel,
|
|
||||||
workflowFilePath,
|
|
||||||
deploymentConfig
|
|
||||||
).catch((err) => core.warning(`Failed to annotate resources: ${err} `))
|
|
||||||
}
|
|
||||||
|
|
||||||
await labelResources(files, kubectl, annotationKeyLabel).catch((err) =>
|
await labelResources(files, kubectl, annotationKeyLabel).catch((err) =>
|
||||||
core.warning(`Failed to label resources: ${err}`)
|
core.warning(`Failed to label resources: ${err}`)
|
||||||
@@ -186,6 +182,7 @@ async function annotateResources(
|
|||||||
files: string[],
|
files: string[],
|
||||||
kubectl: Kubectl,
|
kubectl: Kubectl,
|
||||||
resourceTypes: Resource[],
|
resourceTypes: Resource[],
|
||||||
|
allPods: any,
|
||||||
annotationKey: string,
|
annotationKey: string,
|
||||||
workflowFilePath: string,
|
workflowFilePath: string,
|
||||||
deploymentConfig: DeploymentConfig
|
deploymentConfig: DeploymentConfig
|
||||||
@@ -229,13 +226,11 @@ async function annotateResources(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
try {
|
try {
|
||||||
const annotateResult = await kubectl.annotateFiles(
|
const annotateResult = await kubectl.annotateFiles(
|
||||||
file,
|
file,
|
||||||
annotationKeyValStr,
|
annotationKeyValStr
|
||||||
namespace
|
|
||||||
)
|
)
|
||||||
annotateResults.push(annotateResult)
|
annotateResults.push(annotateResult)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -254,7 +249,8 @@ async function annotateResources(
|
|||||||
resource.type,
|
resource.type,
|
||||||
resource.name,
|
resource.name,
|
||||||
resource.namespace,
|
resource.namespace,
|
||||||
annotationKeyValStr
|
annotationKeyValStr,
|
||||||
|
allPods
|
||||||
)
|
)
|
||||||
).forEach((execResult) => annotateResults.push(execResult))
|
).forEach((execResult) => annotateResults.push(execResult))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,8 @@ export async function annotateChildPods(
|
|||||||
resourceType: string,
|
resourceType: string,
|
||||||
resourceName: string,
|
resourceName: string,
|
||||||
namespace: string | undefined,
|
namespace: string | undefined,
|
||||||
annotationKeyValStr: string
|
annotationKeyValStr: string,
|
||||||
|
allPods
|
||||||
): Promise<ExecOutput[]> {
|
): Promise<ExecOutput[]> {
|
||||||
let owner = resourceName
|
let owner = resourceName
|
||||||
if (resourceType.toLowerCase().indexOf('deployment') > -1) {
|
if (resourceType.toLowerCase().indexOf('deployment') > -1) {
|
||||||
@@ -69,14 +70,6 @@ export async function annotateChildPods(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const commandExecutionResults = []
|
const commandExecutionResults = []
|
||||||
|
|
||||||
let allPods
|
|
||||||
try {
|
|
||||||
allPods = JSON.parse((await kubectl.getAllPods()).stdout)
|
|
||||||
} catch (e) {
|
|
||||||
core.debug(`Unable to parse pods: ${e}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (allPods?.items && allPods.items?.length > 0) {
|
if (allPods?.items && allPods.items?.length > 0) {
|
||||||
allPods.items.forEach((pod) => {
|
allPods.items.forEach((pod) => {
|
||||||
const owners = pod?.metadata?.ownerReferences
|
const owners = pod?.metadata?.ownerReferences
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ def delete(kind, name, namespace):
|
|||||||
if (name == "all"):
|
if (name == "all"):
|
||||||
print('kubectl delete --all' + kind + ' -n ' + namespace)
|
print('kubectl delete --all' + kind + ' -n ' + namespace)
|
||||||
deletion = subprocess.Popen(
|
deletion = subprocess.Popen(
|
||||||
['kubectl', 'delete', kind, '--all', '--namespace', namespace])
|
['kubectl', 'delete', kind, name, '--namespace', namespace])
|
||||||
result, err = deletion.communicate()
|
result, err = deletion.communicate()
|
||||||
else:
|
else:
|
||||||
print('kubectl delete ' + kind + ' ' + name + ' -n ' + namespace)
|
print('kubectl delete ' + kind + ' ' + name + ' -n ' + namespace)
|
||||||
@@ -21,7 +21,7 @@ def delete(kind, name, namespace):
|
|||||||
def main():
|
def main():
|
||||||
kind = sys.argv[1]
|
kind = sys.argv[1]
|
||||||
name = sys.argv[2]
|
name = sys.argv[2]
|
||||||
namespace = sys.argv[3]
|
namespace = 'test-' + sys.argv[3]
|
||||||
delete(kind, name, namespace)
|
delete(kind, name, namespace)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,10 @@ def parseArgs(sysArgs):
|
|||||||
argsDict[labelsKey] = stringListToDict(
|
argsDict[labelsKey] = stringListToDict(
|
||||||
argsDict[labelsKey].split(","), ":")
|
argsDict[labelsKey].split(","), ":")
|
||||||
|
|
||||||
|
if annotationsKey in argsDict:
|
||||||
|
argsDict[annotationsKey] = stringListToDict(
|
||||||
|
argsDict[annotationsKey].split(","), ":")
|
||||||
|
|
||||||
if selectorLabelsKey in argsDict:
|
if selectorLabelsKey in argsDict:
|
||||||
argsDict[selectorLabelsKey] = stringListToDict(
|
argsDict[selectorLabelsKey] = stringListToDict(
|
||||||
argsDict[selectorLabelsKey].split(","), ":")
|
argsDict[selectorLabelsKey].split(","), ":")
|
||||||
@@ -56,9 +60,6 @@ def parseArgs(sysArgs):
|
|||||||
if ingressServicesKey in argsDict:
|
if ingressServicesKey in argsDict:
|
||||||
argsDict[ingressServicesKey] = argsDict[ingressServicesKey].split(",")
|
argsDict[ingressServicesKey] = argsDict[ingressServicesKey].split(",")
|
||||||
|
|
||||||
if annotationsKey in argsDict:
|
|
||||||
argsDict[annotationsKey] = argsDict[annotationsKey].split(",")
|
|
||||||
|
|
||||||
return argsDict
|
return argsDict
|
||||||
|
|
||||||
|
|
||||||
@@ -97,14 +98,14 @@ def verifyDeployment(deployment, parsedArgs):
|
|||||||
return dictMatch, msg
|
return dictMatch, msg
|
||||||
|
|
||||||
if annotationsKey in parsedArgs:
|
if annotationsKey in parsedArgs:
|
||||||
if len(parsedArgs[annotationsKey]) != len(deployment['metadata']['annotations']):
|
dictMatch, msg = compareDicts(
|
||||||
return False, f"expected {len(parsedArgs[annotationsKey])} annotations but found {len(deployment['metadata']['annotations'])}"
|
deployment['metadata']['annotations'], parsedArgs[annotationsKey], annotationsKey)
|
||||||
keysPresent, msg = validateKeyPresence(
|
if not dictMatch:
|
||||||
deployment['metadata']['annotations'], parsedArgs[annotationsKey])
|
return dictMatch, msg
|
||||||
if not keysPresent:
|
|
||||||
return keysPresent, msg
|
|
||||||
return True, ""
|
return True, ""
|
||||||
|
|
||||||
|
|
||||||
def verifyService(service, parsedArgs):
|
def verifyService(service, parsedArgs):
|
||||||
# test selector labels, labels, annotations
|
# test selector labels, labels, annotations
|
||||||
if not selectorLabelsKey in parsedArgs:
|
if not selectorLabelsKey in parsedArgs:
|
||||||
@@ -123,10 +124,10 @@ def verifyService(service, parsedArgs):
|
|||||||
return dictMatch, msg
|
return dictMatch, msg
|
||||||
|
|
||||||
if annotationsKey in parsedArgs:
|
if annotationsKey in parsedArgs:
|
||||||
keysPresent, msg = validateKeyPresence(
|
dictMatch, msg = compareDicts(
|
||||||
service['metadata']['annotations'], parsedArgs[annotationsKey])
|
service['metadata']['annotations'], parsedArgs[annotationsKey], annotationsKey)
|
||||||
if not keysPresent:
|
if not dictMatch:
|
||||||
return keysPresent, msg
|
return dictMatch, msg
|
||||||
|
|
||||||
return True, ""
|
return True, ""
|
||||||
|
|
||||||
@@ -187,13 +188,6 @@ def compareDicts(actual: dict, expected: dict, paramName=""):
|
|||||||
|
|
||||||
return True, ""
|
return True, ""
|
||||||
|
|
||||||
def validateKeyPresence(actualDict: dict, expectedKeys: list):
|
|
||||||
actualKeys = actualDict.keys()
|
|
||||||
for key in expectedKeys:
|
|
||||||
if key not in actualKeys:
|
|
||||||
return False, f"expected key {key} not found in actual dict. \n actual dict keys {','.join(actualKeys)}"
|
|
||||||
|
|
||||||
return True, ""
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parsedArgs: dict = parseArgs(sys.argv[1:])
|
parsedArgs: dict = parseArgs(sys.argv[1:])
|
||||||
@@ -226,7 +220,7 @@ def main():
|
|||||||
|
|
||||||
if k8_object == None:
|
if k8_object == None:
|
||||||
raise ValueError(f"{kind} {name} was not found")
|
raise ValueError(f"{kind} {name} was not found")
|
||||||
|
|
||||||
except:
|
except:
|
||||||
msg = kind+' '+name+' not created or not found'
|
msg = kind+' '+name+' not created or not found'
|
||||||
getAllObjectsCmd = azPrefix + 'kubectl get '+kind+' -n '+namespace
|
getAllObjectsCmd = azPrefix + 'kubectl get '+kind+' -n '+namespace
|
||||||
|
|||||||
Reference in New Issue
Block a user