/** * Copyright (c) 2021 OpenLens Authors * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ export enum ClusterStatus { AccessGranted = 2, AccessDenied = 1, Offline = 0 } export enum ClusterMetadataKey { VERSION = "version", CLUSTER_ID = "id", DISTRIBUTION = "distribution", NODES_COUNT = "nodes", LAST_SEEN = "lastSeen", PROMETHEUS = "prometheus" } export type ClusterRefreshOptions = { refreshMetadata?: boolean }; export interface ClusterState { apiUrl: string; online: boolean; disconnected: boolean; accessible: boolean; ready: boolean; failureReason: string; isAdmin: boolean; allowedNamespaces: string[] allowedResources: string[] isGlobalWatchEnabled: boolean; } export interface ClusterIconUpload { clusterId: string; name: string; path: string; } export interface ClusterMetadata { [key: string]: string | number | boolean | object; } export type ClusterPrometheusMetadata = { success?: boolean; provider?: string; autoDetected?: boolean; }; export interface ClusterStoreModel { activeCluster?: ClusterId; // last opened cluster clusters?: ClusterModel[]; } export type ClusterId = string; export interface UpdateClusterModel extends Omit { id?: ClusterId; } export interface ClusterModel { /** Unique id for a cluster */ id: ClusterId; /** Path to cluster kubeconfig */ kubeConfigPath: string; /** * Workspace id * * @deprecated */ workspace?: string; /** User context in kubeconfig */ contextName?: string; /** Preferences */ preferences?: ClusterPreferences; /** Metadata */ metadata?: ClusterMetadata; /** List of accessible namespaces */ accessibleNamespaces?: string[]; /** @deprecated */ kubeConfig?: string; // yaml } export interface ClusterPreferences extends ClusterPrometheusPreferences { terminalCWD?: string; clusterName?: string; iconOrder?: number; icon?: string; httpsProxy?: string; hiddenMetrics?: string[]; } export interface ClusterPrometheusPreferences { prometheus?: { namespace: string; service: string; port: number; prefix: string; }; prometheusProvider?: { type: string; }; } export function getClusterIdFromHost(host: string): ClusterId | undefined { // e.g host == "%clusterId.localhost:45345" const subDomains = host.split(":")[0].split("."); return subDomains.slice(-2, -1)[0]; // ClusterId or undefined } export function getClusterFrameUrl(clusterId: ClusterId) { return `//${clusterId}.${location.host}`; } export function getHostedClusterId() { return getClusterIdFromHost(location.host); }