Skip to content

Commit

Permalink
fix(plugins/plugin-kubectl): kubectl delete does not handle some shel…
Browse files Browse the repository at this point in the history
…l syntax

e.g. `kubectl delete pod mypod || true`
  • Loading branch information
starpit committed Dec 29, 2021
1 parent 0176673 commit 45a9f85
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
26 changes: 15 additions & 11 deletions plugins/plugin-kubectl/src/controller/kubectl/delete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { Arguments, Registrar } from '@kui-shell/core'

import defaultFlags from './flags'
import { KubeOptions } from './options'
import { doExecWithStatus } from './exec'
import { doExecWithStatus, doExecWithPty, reallyNeedsPty } from './exec'

import deleteDirect from '../client/direct/delete'
import { FinalState } from '../../lib/model/states'
Expand All @@ -42,16 +42,20 @@ export const doDelete = (command = 'kubectl') => async (args: Arguments<KubeOpti
if (isUsage(args)) {
return doHelp(command, args, prepareArgsForDelete)
} else {
try {
const directResponse = await deleteDirect(args)
if (directResponse) {
return directResponse
}
} catch (err) {
if (err.code === 404) {
throw err
} else {
console.error('Error in direct delete. Falling back to CLI delete.', err.code, err)
if (reallyNeedsPty(args)) {
return doExecWithPty(args, prepareArgsForDelete)
} else {
try {
const directResponse = await deleteDirect(args)
if (directResponse) {
return directResponse
}
} catch (err) {
if (err.code === 404) {
throw err
} else {
console.error('Error in direct delete. Falling back to CLI delete.', err.code, err)
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion plugins/plugin-kubectl/src/controller/kubectl/exec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export function doExecWithStdout<O extends KubeOptions>(
*/
export function reallyNeedsPty({ argvNoOptions, parsedOptions }: Pick<Arguments, 'argvNoOptions' | 'parsedOptions'>) {
const test1 = (_: string) => /(\$\(|`)/.test(_) // subprocess execution?
const test2 = (_: string) => /^\s*(\||>|>>)\s*$/.test(_) || test1(_)
const test2 = (_: string) => /^\s*(\|\||\||>|>>)\s*$/.test(_) || test1(_)
return !!argvNoOptions.find(test2) || !!Object.values(parsedOptions).find(test1)
}

Expand Down

0 comments on commit 45a9f85

Please sign in to comment.