From 0fc754ad67b9c67b578c8b4ecb1618cf3f21a380 Mon Sep 17 00:00:00 2001 From: Betsy George <144842468+betsygeo@users.noreply.github.com> Date: Thu, 17 Jul 2025 14:27:04 -0400 Subject: [PATCH] #146 Adding optional kubeconfig encoding variable (#164) * encoding input variable added * encoding input variable added * encoding input variable added * corrected unit tests * corrected unit tests * prettier edits * working on tests * working on tests * working on tests * minor edits * minor edits * better logic structure * added tests for edge cases * edited to enum --- action.yml | 4 ++++ src/kubeconfigs/default.test.ts | 42 +++++++++++++++++++++++++++++++++ src/kubeconfigs/default.ts | 22 ++++++++++++++++- 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/action.yml b/action.yml index a4e773d..62ddedb 100644 --- a/action.yml +++ b/action.yml @@ -13,6 +13,10 @@ inputs: kubeconfig: description: 'Contents of kubeconfig file' required: false + kubeconfig-encoding: + description: 'Encoding of the kubeconfig input. Accepts "plaintext" (default) or "base64".' + required: false + default: 'plaintext' context: description: 'If your kubeconfig has multiple contexts, use this field to use a specific context, otherwise the default one would be chosen' required: false diff --git a/src/kubeconfigs/default.test.ts b/src/kubeconfigs/default.test.ts index 2cb80a5..e1bf4db 100644 --- a/src/kubeconfigs/default.test.ts +++ b/src/kubeconfigs/default.test.ts @@ -1,4 +1,5 @@ import * as fs from 'fs' +import * as core from '@actions/core' import {getRequiredInputError} from '../../tests/util' import {createKubeconfig, getDefaultKubeconfig} from './default' @@ -62,6 +63,47 @@ describe('Default kubeconfig', () => { expect(getDefaultKubeconfig()).toBe(kc) }) + + test('returns kubeconfig as plaintext when encoding is plaintext', () => { + const kc = 'example kc' + jest.spyOn(core, 'getInput').mockImplementation((name: string) => { + if (name === 'method') return 'default' + if (name === 'kubeconfig-encoding') return 'plaintext' + if (name === 'kubeconfig') return kc + return '' + }) + expect(getDefaultKubeconfig()).toBe(kc) + }) + + test('it gets default config through base64 kubeconfig input', () => { + const kc = 'example kc' + const base64Kc = Buffer.from(kc, 'utf-8').toString('base64') + + jest.spyOn(core, 'getInput').mockImplementation((name: string) => { + if (name === 'method') return 'default' + if (name === 'kubeconfig-encoding') return 'base64' + if (name === 'kubeconfig') return base64Kc + return '' + }) + + expect(getDefaultKubeconfig()).toBe(kc) + }) + + test('it throws error for unknown kubeconfig-encoding', () => { + const kc = 'example kc' + const unknownEncoding = 'foobar' + + jest.spyOn(core, 'getInput').mockImplementation((name: string) => { + if (name === 'method') return 'default' + if (name === 'kubeconfig-encoding') return unknownEncoding + if (name === 'kubeconfig') return kc + return '' + }) + + expect(() => getDefaultKubeconfig()).toThrow( + "Invalid kubeconfig-encoding: 'foobar'. Must be 'plaintext' or 'base64'." + ) + }) }) test('it defaults to default method', () => { diff --git a/src/kubeconfigs/default.ts b/src/kubeconfigs/default.ts index c98278e..9c19a93 100644 --- a/src/kubeconfigs/default.ts +++ b/src/kubeconfigs/default.ts @@ -44,7 +44,27 @@ export function getDefaultKubeconfig(): string { } default: { core.debug('Setting context using kubeconfig') - return core.getInput('kubeconfig', {required: true}) + enum Encoding { + Base64 = 'base64', + Plaintext = 'plaintext' + } + + const rawKubeconfig = core.getInput('kubeconfig', {required: true}) + const encoding = + core.getInput('kubeconfig-encoding')?.toLowerCase() || + Encoding.Plaintext + + if (encoding !== Encoding.Base64 && encoding !== Encoding.Plaintext) { + throw new Error( + `Invalid kubeconfig-encoding: '${encoding}'. Must be 'plaintext' or 'base64'.` + ) + } + const kubeconfig = + encoding === Encoding.Base64 + ? Buffer.from(rawKubeconfig, 'base64').toString('utf-8') + : rawKubeconfig + + return kubeconfig } } }