diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts index 96891ec66f..6e986816f7 100644 --- a/src/main/cluster-manager.ts +++ b/src/main/cluster-manager.ts @@ -90,7 +90,7 @@ export class ClusterManager { reject("No cluster contexts defined") } configs.forEach(c => { - k8s.valideConfig(c) + k8s.validateConfig(c) const cluster = new Cluster({ id: uuid(), port: this.port, diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 363a9aca43..4e938c5f83 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -3,7 +3,7 @@ import { FeatureStatusMap } from "./feature" import * as k8s from "./k8s" import { clusterStore } from "../common/cluster-store" import logger from "./logger" -import { KubeConfig, CoreV1Api, AuthorizationV1Api, V1ResourceAttributes } from "@kubernetes/client-node" +import { AuthorizationV1Api, CoreV1Api, KubeConfig, V1ResourceAttributes } from "@kubernetes/client-node" import * as fm from "./feature-manager"; import { Kubectl } from "./kubectl"; import { PromiseIpc } from "electron-promise-ipc" @@ -123,16 +123,9 @@ export class Cluster implements ClusterInfo { this.contextHandler.setClusterPreferences(this.preferences) const connectionStatus = await this.getConnectionStatus() - if (connectionStatus == ClusterStatus.AccessGranted) { - this.accessible = true - } else { - this.accessible = false - } - if (connectionStatus > ClusterStatus.Offline) { - this.online = true - } else { - this.online = false - } + this.accessible = connectionStatus == ClusterStatus.AccessGranted; + this.online = connectionStatus > ClusterStatus.Offline; + if (this.accessible) { this.distribution = this.detectKubernetesDistribution(this.version) this.features = await fm.getFeatures(this.contextHandler) @@ -146,7 +139,9 @@ export class Cluster implements ClusterInfo { public updateKubeconfig(kubeconfig: string) { const storedCluster = clusterStore.getCluster(this.id) - if (!storedCluster) { return } + if (!storedCluster) { + return + } this.kubeConfig = kubeconfig this.save() @@ -164,7 +159,7 @@ export class Cluster implements ClusterInfo { } public toClusterInfo(): ClusterInfo { - const clusterInfo: ClusterInfo = { + return { id: this.id, workspace: this.workspace, url: this.url, @@ -179,17 +174,18 @@ export class Cluster implements ClusterInfo { isAdmin: this.isAdmin, features: this.features, kubeCtl: this.kubeCtl, - kubeConfig: this.kubeConfig, + kubeConfig: this.kubeConfig, preferences: this.preferences } - return clusterInfo; } protected async k8sRequest(path: string, opts?: request.RequestPromiseOptions) { const options = Object.assign({ json: true, timeout: 10000 }, (opts || {})) - if (!options.headers) { options.headers = {} } + if (!options.headers) { + options.headers = {} + } options.headers.host = `${this.id}.localhost:${this.port}` return request(`http://127.0.0.1:${this.port}/api-kube${path}`, options) @@ -201,21 +197,24 @@ export class Cluster implements ClusterInfo { this.version = response.gitVersion this.failureReason = null return ClusterStatus.AccessGranted; - } catch(error) { + } catch (error) { logger.error(`Failed to connect to cluster ${this.contextName}: ${JSON.stringify(error)}`) if (error.statusCode) { if (error.statusCode >= 400 && error.statusCode < 500) { this.failureReason = "Invalid credentials"; return ClusterStatus.AccessDenied; - } else { + } + else { this.failureReason = error.error || error.message; return ClusterStatus.Offline; } - } else if (error.failed === true) { + } + else if (error.failed === true) { if (error.timedOut === true) { this.failureReason = "Connection timed out"; return ClusterStatus.Offline; - } else { + } + else { this.failureReason = "Failed to fetch credentials"; return ClusterStatus.AccessDenied; } @@ -234,7 +233,7 @@ export class Cluster implements ClusterInfo { spec: { resourceAttributes } }) return accessReview.body.status.allowed === true - } catch(error) { + } catch (error) { logger.error(`failed to request selfSubjectAccessReview: ${error.message}`) return false } @@ -258,10 +257,10 @@ export class Cluster implements ClusterInfo { else if (kubernetesVersion.includes("IKS")) { return "iks" } - else if(this.apiUrl.endsWith("azmk8s.io")) { + else if (this.apiUrl.endsWith("azmk8s.io")) { return "aks" } - else if(this.apiUrl.endsWith("k8s.ondigitalocean.com")) { + else if (this.apiUrl.endsWith("k8s.ondigitalocean.com")) { return "digitalocean" } else if (this.contextHandler.contextName.startsWith("minikube")) { @@ -274,11 +273,11 @@ export class Cluster implements ClusterInfo { return "vanilla" } - protected async getNodeCount() { + protected async getNodeCount() { try { const response = await this.k8sRequest("/api/v1/nodes") return response.items.length - } catch(error) { + } catch (error) { logger.debug(`failed to request node list: ${error.message}`) return null } @@ -294,18 +293,19 @@ export class Cluster implements ClusterInfo { const uniqEventSources = new Set(); const warnings = response.body.items.filter(e => e.type !== 'Normal'); for (const w of warnings) { - if(w.involvedObject.kind === 'Pod') { + if (w.involvedObject.kind === 'Pod') { try { const pod = (await client.readNamespacedPod(w.involvedObject.name, w.involvedObject.namespace)).body; logger.debug(`checking pod ${w.involvedObject.namespace}/${w.involvedObject.name}`) - if(k8s.podHasIssues(pod)) { + if (k8s.podHasIssues(pod)) { uniqEventSources.add(w.involvedObject.uid); } - continue; + continue; // TODO: refactor } catch (error) { continue; } - } else { + } + else { uniqEventSources.add(w.involvedObject.uid); } } diff --git a/src/main/k8s.ts b/src/main/k8s.ts index 3e16734949..5d96df07d0 100644 --- a/src/main/k8s.ts +++ b/src/main/k8s.ts @@ -29,7 +29,7 @@ export function loadConfig(kubeconfig: string): k8s.KubeConfig { * * @param config KubeConfig to check */ -export function valideConfig(config: k8s.KubeConfig): boolean { +export function validateConfig(config: k8s.KubeConfig): boolean { logger.debug(`validating kube config: ${JSON.stringify(config)}`) if(!config.users || config.users.length == 0) { throw new Error("No users provided in config") diff --git a/src/main/port.ts b/src/main/port.ts index f419f4e78c..bd8b49b94a 100644 --- a/src/main/port.ts +++ b/src/main/port.ts @@ -1,6 +1,5 @@ import logger from "./logger" -import { createServer } from "net" -import { AddressInfo } from "net" +import { createServer, AddressInfo } from "net" const getNextAvailablePort = () => { logger.debug("getNextAvailablePort() start") diff --git a/src/renderer/_vue/index.js b/src/renderer/_vue/index.js index 521ca281a2..be69e0795c 100644 --- a/src/renderer/_vue/index.js +++ b/src/renderer/_vue/index.js @@ -1,4 +1,3 @@ -import "../../common/system-ca" import "./assets/css/app.scss" import "prismjs"; import "prismjs/components/prism-yaml" diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 52c037785d..dcc6c6e61d 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -37,7 +37,7 @@ export interface IKubeObjectMetadata { }[]; } -export type IKubeMetaField = keyof KubeObject["metadata"]; +export type IKubeMetaField = keyof IKubeObjectMetadata; @autobind() export class KubeObject implements ItemObject { @@ -71,6 +71,7 @@ export class KubeObject implements ItemObject { apiVersion: string kind: string metadata: IKubeObjectMetadata; + status?: any; // todo: type-safety support get selfLink() { return this.metadata.selfLink diff --git a/src/renderer/config.store.ts b/src/renderer/config.store.ts index 306c9bf7fc..f27127a6d3 100755 --- a/src/renderer/config.store.ts +++ b/src/renderer/config.store.ts @@ -1,8 +1,8 @@ import { observable, when } from "mobx"; import type { IConfigRoutePayload } from "../main/routes/config"; -import { autobind, interval } from "./utils"; -import { apiBase } from "./api"; import { apiPrefix, buildVersion, isDevelopment } from "../common/vars"; +import { autobind, interval } from "./utils"; +import { configApi } from "./api/endpoints"; @autobind() export class ConfigStore { @@ -21,7 +21,7 @@ export class ConfigStore { } load() { - return apiBase.get("/config").then((config: any) => { + return configApi.getConfig().then((config: any) => { this.config = config; this.isLoaded = true; });