diff --git a/packages/probot-kubernetes/README.md b/packages/probot-kubernetes/README.md index 131fbbff..6e359055 100644 --- a/packages/probot-kubernetes/README.md +++ b/packages/probot-kubernetes/README.md @@ -19,6 +19,7 @@ Additionally this library offers CRUD methods for the secret management allowing - `createTokenSecret(context)`: Promise which creates the token secret. - `getTokenSecretName(context)`: Returns secret name relevant to current context. +- `readTokenSecret(context)`: Promise which resolves to the token secret content. - `updateTokenSecret(context)`: Promise which updates the token secret. - `deleteTokenSecret(context)`: Promise which deletes the token secret. @@ -109,3 +110,28 @@ module.exports = app => { }); }; ``` + +### Store additional data per installation + +This extension allows you to store additional data for each installation into the token `Secret` object. + +```js + +const kubernetes = require('@operate-first/probot-kubernetes'); + +module.exports = app => { + app.on('installation.created', async (context) => { + await kubernetes.createTokenSecret( + context, + { + installationDetails: Json.stringify(context.payload), + } + ); + }); + + app.on('push', (context) => { + const secret = await kubernetes.readTokenSecret(context); + app.log.info(secret.spec.stringData?.installationDetails) + }); +}; +``` diff --git a/packages/probot-kubernetes/index.ts b/packages/probot-kubernetes/index.ts index c912ee9a..f67d8635 100644 --- a/packages/probot-kubernetes/index.ts +++ b/packages/probot-kubernetes/index.ts @@ -28,6 +28,7 @@ const k8sNamespace = (() => { })(); type ApiConstructor = new (server: string) => T; + export const useApi = ( apiClientType: ApiConstructor ): T => kc.makeApiClient(apiClientType); @@ -56,7 +57,10 @@ const unpackExceptionMessage = (err: any) => { throw err?.body?.message || err; }; -const createSecretPayload = async (context: any) => { +const createSecretPayload = async ( + context: any, + extraData?: Record +) => { const appAuth = (await context.octokit.auth({ type: 'installation', })) as InstallationAccessTokenAuthentication; @@ -77,18 +81,32 @@ const createSecretPayload = async (context: any) => { }, }, stringData: { + ...extraData, token: appAuth.token, orgName: orgName, }, } as k8s.V1Secret; }; -export const createTokenSecret = async (context: any) => { +export const createTokenSecret = async ( + context: any, + extraData?: Record +) => { return useApi(k8s.CoreV1Api) - .createNamespacedSecret(getNamespace(), await createSecretPayload(context)) + .createNamespacedSecret( + getNamespace(), + await createSecretPayload(context, extraData) + ) .catch(unpackExceptionMessage); }; +export const readTokenSecret = (context: any) => { + return useApi(k8s.CoreV1Api) + .readNamespacedSecret(getTokenSecretName(context), getNamespace()) + .catch(unpackExceptionMessage) + .then((r) => r.body); +}; + export const deleteTokenSecret = async (context: any) => { return useApi(k8s.CoreV1Api) .deleteNamespacedSecret( @@ -98,7 +116,10 @@ export const deleteTokenSecret = async (context: any) => { .catch(unpackExceptionMessage); }; -export const updateTokenSecret = async (context: any) => { +export const updateTokenSecret = async ( + context: any, + extraData?: Record +) => { const appSecret = await useApi(k8s.CoreV1Api) .readNamespacedSecret( SECRET_NAME_PREFIX + context.payload.installation.id, @@ -119,7 +140,7 @@ export const updateTokenSecret = async (context: any) => { .patchNamespacedSecret( SECRET_NAME_PREFIX + context.payload.installation.id, getNamespace(), - await createSecretPayload(context), + await createSecretPayload(context, extraData), undefined, undefined, undefined,