diff --git a/src/common/k8s-api/json-api.ts b/src/common/k8s-api/json-api.ts index dde8f5f5a2..15bad9864a 100644 --- a/src/common/k8s-api/json-api.ts +++ b/src/common/k8s-api/json-api.ts @@ -52,6 +52,7 @@ export interface JsonApiConfig { apiBase: string; serverAddress: string; debug?: boolean; + getRequestOptions?: () => Promise; } export class JsonApi { static reqInitDefault: RequestInit = { @@ -68,18 +69,26 @@ export class JsonApi { this.config = Object.assign({}, JsonApi.configDefault, config); this.reqInit = merge({}, JsonApi.reqInitDefault, reqInit); this.parseResponse = this.parseResponse.bind(this); + this.getRequestOptions = config.getRequestOptions ?? (() => Promise.resolve({})); } public onData = new EventEmitter<[D, Response]>(); public onError = new EventEmitter<[JsonApiErrorParsed, Response]>(); + + private getRequestOptions: JsonApiConfig["getRequestOptions"]; get(path: string, params?: P, reqInit: RequestInit = {}) { return this.request(path, params, { ...reqInit, method: "get" }); } - getResponse(path: string, params?: P, init: RequestInit = {}): Promise { + async getResponse(path: string, params?: P, init: RequestInit = {}): Promise { let reqUrl = `${this.config.serverAddress}${this.config.apiBase}${path}`; - const reqInit: RequestInit = merge({}, this.reqInit, init); + const reqInit: RequestInit = merge( + {}, + this.reqInit, + await this.getRequestOptions(), + init + ); const { query } = params || {} as P; if (!reqInit.method) { @@ -113,7 +122,12 @@ export class JsonApi { protected async request(path: string, params?: P, init: RequestInit = {}) { let reqUrl = `${this.config.serverAddress}${this.config.apiBase}${path}`; - const reqInit: RequestInit = merge({}, this.reqInit, init); + const reqInit: RequestInit = merge( + {}, + this.reqInit, + await this.getRequestOptions(), + init + ); const { data, query } = params || {} as P; if (data && !reqInit.body) { diff --git a/src/common/k8s-api/kube-api.ts b/src/common/k8s-api/kube-api.ts index 54b0e5726f..7e29500689 100644 --- a/src/common/k8s-api/kube-api.ts +++ b/src/common/k8s-api/kube-api.ts @@ -22,6 +22,7 @@ // Base class for building all kubernetes apis import merge from "lodash/merge"; +import { isFunction } from "lodash"; import { stringify } from "querystring"; import { apiKubePrefix, isDevelopment } from "../../common/vars"; import logger from "../../main/logger"; @@ -108,7 +109,7 @@ export interface IRemoteKubeApiConfig { skipTLSVerify?: boolean; } user: { - token?: string; + token?: string | (() => Promise); clientCertificateData?: string; clientKeyData?: string; } @@ -135,12 +136,6 @@ export function forCluster(cluster: ILocalKubeApiConfig, k export function forRemoteCluster(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor): KubeApi { const reqInit: RequestInit = {}; - if (config.user.token) { - reqInit.headers = { - "Authorization": `Bearer ${config.user.token}` - }; - } - const agentOptions: AgentOptions = {}; if (config.cluster.skipTLSVerify === true) { @@ -163,10 +158,18 @@ export function forRemoteCluster(config: IRemoteKubeApiCon reqInit.agent = new Agent(agentOptions); } + const token = config.user.token; const request = new KubeJsonApi({ serverAddress: config.cluster.server, apiBase: "", debug: isDevelopment, + ...(token ? { + getRequestOptions: async () => ({ + headers: { + "Authorization": `Bearer ${isFunction(token) ? await token() : token}` + } + }) + } : {}) }, reqInit); return new KubeApi({