@kinvolk/headlamp-plugin
Version:
The needed infrastructure for building Headlamp plugins.
77 lines (76 loc) • 3.74 kB
JavaScript
/*
* 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);
}
});
}