UNPKG

@kinvolk/headlamp-plugin

Version:

The needed infrastructure for building Headlamp plugins.

77 lines (76 loc) 3.74 kB
/* * Copyright 2025 The Kubernetes Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import * as jsyaml from 'js-yaml'; import { findMatchingContexts, handleDataBaseError, handleDatabaseUpgrade, } from '.'; /** * Finds a kubeconfig by cluster name. * @param clusterName The name of the cluster to find. * @param clusterID The ID for a cluster, composed of the kubeconfig path and cluster name * @returns A promise that resolves with the kubeconfig, or null if not found. * @throws Error if IndexedDB is not supported. * @throws Error if the kubeconfig is invalid. */ export function findKubeconfigByClusterName( /** The name of the cluster to find */ clusterName, /** The ID for a cluster, composed of the kubeconfig path and cluster name */ clusterID) { return new Promise(async (resolve, reject) => { try { const request = indexedDB.open('kubeconfigs', 1); // The onupgradeneeded event is fired when the database is created for the first time. request.onupgradeneeded = handleDatabaseUpgrade; // The onsuccess event is fired when the database is opened. // This event is where you specify the actions to take when the database is opened. request.onsuccess = function handleDatabaseSuccess(event) { const db = event.target.result; const transaction = db.transaction(['kubeconfigStore'], 'readonly'); const store = transaction.objectStore('kubeconfigStore'); // The onsuccess event is fired when the request has succeeded. // This is where you handle the results of the request. // The result is the cursor. It is used to iterate through the object store. // The cursor is null when there are no more objects to iterate through. // The cursor is used to find the kubeconfig by cluster name. store.openCursor().onsuccess = function storeSuccess(event) { const successEvent = event; const cursor = successEvent.target.result; if (cursor) { const kubeconfigObject = cursor.value; const kubeconfig = kubeconfigObject.kubeconfig; const parsedKubeconfig = jsyaml.load(atob(kubeconfig)); // Check for "headlamp_info" in extensions const { matchingKubeconfig, matchingContext } = findMatchingContexts(clusterName, parsedKubeconfig, clusterID); if (matchingKubeconfig || matchingContext) { resolve(kubeconfig); } else { cursor.continue(); } } else { resolve(null); // No matching kubeconfig found } }; }; // The onerror event is fired when the database is opened. // This is where you handle errors. request.onerror = handleDataBaseError; } catch (error) { reject(error); } }); }