Fixes multiple namespaces bug (#276)

* fix ns bug

* add tests

* rename some variables

* rename ns to namespace

* fix delete + correctly type

* add typing to input obj parser
This commit is contained in:
Oliver King
2023-02-06 13:42:55 -05:00
committed by GitHub
parent 756cc0a511
commit ecb488266d
14 changed files with 326 additions and 81 deletions
+51 -33
View File
@@ -3,11 +3,11 @@ import {createInlineArray} from '../utilities/arrayUtils'
import * as core from '@actions/core'
import * as toolCache from '@actions/tool-cache'
import * as io from '@actions/io'
import {exec} from 'child_process'
export interface Resource {
name: string
type: string
namespace?: string
}
export class Kubectl {
@@ -20,7 +20,7 @@ export class Kubectl {
constructor(
kubectlPath: string,
namespace: string = 'default',
namespace: string = '',
ignoreSSLErrors: boolean = false,
resourceGroup: string = '',
name: string = ''
@@ -47,7 +47,7 @@ export class Kubectl {
]
if (force) applyArgs.push('--force')
return await this.execute(applyArgs)
return await this.execute(applyArgs.concat(this.getFlags()))
} catch (err) {
core.debug('Kubectl apply failed:' + err)
}
@@ -56,16 +56,24 @@ export class Kubectl {
public async describe(
resourceType: string,
resourceName: string,
silent: boolean = false
silent: boolean = false,
namespace?: string
): Promise<ExecOutput> {
return await this.execute(
['describe', resourceType, resourceName],
['describe', resourceType, resourceName].concat(
this.getFlags(namespace)
),
silent
)
}
public async getNewReplicaSet(deployment: string) {
const result = await this.describe('deployment', deployment, true)
public async getNewReplicaSet(deployment: string, namespace?: string) {
const result = await this.describe(
'deployment',
deployment,
true,
namespace
)
let newReplicaSet = ''
if (result?.stdout) {
@@ -94,7 +102,8 @@ export class Kubectl {
public async annotate(
resourceType: string,
resourceName: string,
annotation: string
annotation: string,
namespace?: string
): Promise<ExecOutput> {
const args = [
'annotate',
@@ -102,13 +111,14 @@ export class Kubectl {
resourceName,
annotation,
'--overwrite'
]
].concat(this.getFlags(namespace))
return await this.execute(args)
}
public async annotateFiles(
files: string | string[],
annotation: string
annotation: string,
namespace?: string
): Promise<ExecOutput> {
const filesToAnnotate = createInlineArray(files)
core.debug(`annotating ${filesToAnnotate} with annotation ${annotation}`)
@@ -118,16 +128,14 @@ export class Kubectl {
filesToAnnotate,
annotation,
'--overwrite'
]
core.debug(
`sending args from annotate to execute: ${JSON.stringify(args)}`
)
].concat(this.getFlags(namespace))
return await this.execute(args)
}
public async labelFiles(
files: string | string[],
labels: string[]
labels: string[],
namespace?: string
): Promise<ExecOutput> {
const args = [
'label',
@@ -135,51 +143,59 @@ export class Kubectl {
createInlineArray(files),
...labels,
'--overwrite'
]
].concat(this.getFlags(namespace))
return await this.execute(args)
}
public async getAllPods(): Promise<ExecOutput> {
return await this.execute(['get', 'pods', '-o', 'json'], true)
return await this.execute(
['get', 'pods', '-o', 'json'].concat(this.getFlags()),
true
)
}
public async checkRolloutStatus(
resourceType: string,
name: string
name: string,
namespace?: string
): Promise<ExecOutput> {
return await this.execute([
'rollout',
'status',
`${resourceType}/${name}`
])
return await this.execute(
['rollout', 'status', `${resourceType}/${name}`].concat(
this.getFlags(namespace)
)
)
}
public async getResource(
resourceType: string,
name: string,
silentFailure: boolean = false
silentFailure: boolean = false,
namespace?: string
): Promise<ExecOutput> {
core.debug(
'fetching resource of type ' + resourceType + ' and name ' + name
)
return await this.execute(
['get', `${resourceType}/${name}`, '-o', 'json'],
['get', `${resourceType}/${name}`, '-o', 'json'].concat(
this.getFlags(namespace)
),
silentFailure
)
}
public executeCommand(command: string, args?: string) {
if (!command) throw new Error('Command must be defined')
return args ? this.execute([command, args]) : this.execute([command])
const a = args ? [args] : []
return this.execute([command, ...a.concat(this.getFlags())])
}
public delete(args: string | string[]) {
if (typeof args === 'string') return this.execute(['delete', args])
return this.execute(['delete', ...args])
public delete(args: string | string[], namespace?: string) {
if (typeof args === 'string')
return this.execute(['delete', args].concat(this.getFlags(namespace)))
return this.execute(['delete', ...args.concat(this.getFlags(namespace))])
}
protected async execute(args: string[], silent: boolean = false) {
args = args.concat(this.getExecuteFlags())
core.debug(`Kubectl run with command: ${this.kubectlPath} ${args}`)
return await getExecOutput(this.kubectlPath, args, {
@@ -187,13 +203,15 @@ export class Kubectl {
})
}
protected getExecuteFlags(): string[] {
protected getFlags(namespaceOverride?: string): string[] {
const flags = []
if (this.ignoreSSLErrors) {
flags.push('--insecure-skip-tls-verify')
}
if (this.namespace) {
flags.push('--namespace', this.namespace)
const ns = namespaceOverride || this.namespace
if (ns) {
flags.push('--namespace', ns)
}
return flags