Unverified Commit 3262b139 authored by Jari Kolehmainen's avatar Jari Kolehmainen Committed by GitHub
Browse files

Allow KubeApi connect directly to remote k8s (#3766)


* allow KubeApi to connect directly to remote k8s
Signed-off-by: default avatarJari Kolehmainen <jari.kolehmainen@gmail.com>

* backward compat
Signed-off-by: default avatarJari Kolehmainen <jari.kolehmainen@gmail.com>

* backward compat
Signed-off-by: default avatarJari Kolehmainen <jari.kolehmainen@gmail.com>
parent 7bd0fed9
master asdasd better-release-script bug/port-forward-missing bundled-extensions-update catalog-entity-detail-registry cleanup-pod-details-container consolidate-running-of-setups-on-application-start dependabot/npm_and_yarn/react-select-5.3.2 dependabot/npm_and_yarn/react-window-1.8.7 dependabot/npm_and_yarn/types/node-14.18.16 dependabot/npm_and_yarn/types/webpack-env-1.16.4 di-stores docs/api-all-exported enhancement-node-vertical-metric-bars enhancement/group-app-preferences-by-extension entity-settings extension-auto-update extension-dir extension-discovery-changes extension-startup extensions/lens-version-check feat/add-tests-for-main-extension-api-and-catalog-entity-registry feat/new-api feature/auto-update feature/context-providers feature/kube-api-manager fix-change-os-theme-crash fix-lint-error fix-linter-errors fix-optimise-update-events-from-buffer fix-reload-list-items-on-mount fix-remove-watch-flush-headers fix-reseting-select-value fix-resource-applier fix/allown-entity-id fix/consistent-inputs fix/log-store-loading fix/ns-selector-performance-issue fix/pod-logs-storage fix/rewatch-if-resume fix/search_input_autofocus front-end-routes-ocp front-end-routes-ocp-2 front-end-routes-ocp-3 helm-repo-manager helm-repo-manager-removal helm-routes issue-1909 issue-3276 issue-3374 issue-3498 issue-3797 issue-3896 issue-4633 issue-4766 issue-4829 issue-4997 issue-5141 issue-5165 issue-5173 issue-5177 issue-5238 more-places-to-check-for-updates port-forward-pod-deleted prometheus/victoria-metrics-single refactor-settings-layout-styles release/v5.3 release/v5.4 remove-unused-telemetry show-extension-preferences-in-separate-page single-logger squashed-update-injectable test/remove-sentry testing/issue-4314 testing/virtual-select top-bar-registry turn-on-strict ui-table-empty-state-lines update-bundled-extensions update-electon-builder-to-3-0-8 validate-cluster-model verify-quit-events websocket-catalog-sync welcome-banners-rounded-corners welcome-menu-registry v5.5.0-beta.0 v5.4.6 v5.4.5 v5.4.4 v5.4.3 v5.4.2 v5.4.1 v5.4.0 v5.4.0-beta.5 v5.4.0-beta.4 v5.4.0-beta.3 v5.4.0-beta.2 v5.4.0-beta.1 v5.4.0-beta.0 v5.4.0-alpha.1 v5.4.0-alpha.0 v5.3.4 v5.3.3 v5.3.2 v5.3.1 v5.3.0 v5.3.0-beta.4 v5.3.0-beta.3 v5.3.0-beta.2 v5.3.0-beta.1 v5.3.0-beta.0 v5.3.0-alpha.11 v5.3.0-alpha.10 v5.3.0-alpha.9 v5.3.0-alpha.8 v5.3.0-alpha.7 v5.3.0-alpha.6 v5.3.0-alpha.5 v5.3.0-alpha.4 v5.3.0-alpha.3 v5.3.0-alpha.2 v5.3.0-alpha.1 v5.3.0-alpha.0
No related merge requests found
Showing with 93 additions and 5 deletions
+93 -5
......@@ -19,10 +19,36 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import { KubeApi } from "../kube-api";
import { Pod } from "../endpoints/pods.api";
import { forRemoteCluster, KubeApi } from "../kube-api";
import { KubeJsonApi } from "../kube-json-api";
import { KubeObject } from "../kube-object";
describe("forRemoteCluster", () => {
it("builds api client", async (done) => {
const api = forRemoteCluster({
cluster: {
server: "https://127.0.0.1:6443"
},
user: {
token: "daa"
}
}, Pod);
(fetch as any).mockResponse(async (request: any) => {
expect(request.url).toEqual("https://127.0.0.1:6443/api/v1/pods");
done();
return {
body: ""
};
});
await api.list();
});
});
describe("KubeApi", () => {
let request: KubeJsonApi;
......
......@@ -35,6 +35,7 @@ import { KubeJsonApi, KubeJsonApiData } from "./kube-json-api";
import { noop } from "../utils";
import type { RequestInit } from "node-fetch";
import AbortController from "abort-controller";
import { Agent, AgentOptions } from "https";
export interface IKubeApiOptions<T extends KubeObject> {
/**
......@@ -89,13 +90,31 @@ export interface IKubeResourceList {
}[];
}
export interface IKubeApiCluster {
export interface ILocalKubeApiConfig {
metadata: {
uid: string;
}
}
export function forCluster<T extends KubeObject>(cluster: IKubeApiCluster, kubeClass: KubeObjectConstructor<T>): KubeApi<T> {
/**
* @deprecated
*/
export interface IKubeApiCluster extends ILocalKubeApiConfig {}
export interface IRemoteKubeApiConfig {
cluster: {
server: string;
caData?: string;
skipTLSVerify?: boolean;
}
user: {
token?: string;
clientCertificateData?: string;
clientKeyData?: string;
}
}
export function forCluster<T extends KubeObject>(cluster: ILocalKubeApiConfig, kubeClass: KubeObjectConstructor<T>): KubeApi<T> {
const url = new URL(apiBase.config.serverAddress);
const request = new KubeJsonApi({
serverAddress: apiBase.config.serverAddress,
......@@ -113,6 +132,49 @@ export function forCluster<T extends KubeObject>(cluster: IKubeApiCluster, kubeC
});
}
export function forRemoteCluster<T extends KubeObject>(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor<T>): KubeApi<T> {
const reqInit: RequestInit = {};
if (config.user.token) {
reqInit.headers = {
"Authorization": `Bearer ${config.user.token}`
};
}
const agentOptions: AgentOptions = {};
if (config.cluster.skipTLSVerify === true) {
agentOptions.rejectUnauthorized = false;
}
if (config.user.clientCertificateData) {
agentOptions.cert = config.user.clientCertificateData;
}
if (config.user.clientKeyData) {
agentOptions.key = config.user.clientKeyData;
}
if (config.cluster.caData) {
agentOptions.ca = config.cluster.caData;
}
if (Object.keys(agentOptions).length > 0) {
reqInit.agent = new Agent(agentOptions);
}
const request = new KubeJsonApi({
serverAddress: config.cluster.server,
apiBase: "",
debug: isDevelopment,
}, reqInit);
return new KubeApi({
objectConstructor: kubeClass,
request
});
}
export function ensureObjectSelfLink(api: KubeApi<KubeObject>, object: KubeJsonApiData) {
if (!object.metadata.selfLink) {
object.metadata.selfLink = createKubeApiURL({
......
......@@ -56,6 +56,6 @@ export { ClusterRoleBinding, clusterRoleBindingApi } from "../../common/k8s-api/
export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints/crd.api";
// types
export type { IKubeApiCluster } from "../../common/k8s-api/kube-api";
export type { ILocalKubeApiConfig, IRemoteKubeApiConfig, IKubeApiCluster } from "../../common/k8s-api/kube-api";
export type { IPodContainer, IPodContainerStatus } from "../../common/k8s-api/endpoints/pods.api";
export type { ISecretRef } from "../../common/k8s-api/endpoints/secret.api";
......@@ -57,7 +57,7 @@ export { CustomResourceDefinition, crdApi } from "../../common/k8s-api/endpoints
export { KubeObjectStatusLevel } from "./kube-object-status";
// types
export type { IKubeApiCluster } from "../../common/k8s-api/kube-api";
export type { ILocalKubeApiConfig, IRemoteKubeApiConfig, IKubeApiCluster } from "../../common/k8s-api/kube-api";
export type { IPodContainer, IPodContainerStatus } from "../../common/k8s-api/endpoints";
export type { ISecretRef } from "../../common/k8s-api/endpoints";
export type { KubeObjectStatus } from "./kube-object-status";
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment