diff --git a/src/renderer/api/endpoints/cluster.api.ts b/src/renderer/api/endpoints/cluster.api.ts index 309f936ac7..5c3f05ce91 100644 --- a/src/renderer/api/endpoints/cluster.api.ts +++ b/src/renderer/api/endpoints/cluster.api.ts @@ -71,10 +71,7 @@ export interface IClusterMetrics { fsUsage: T; } -export class Cluster extends KubeObject { - static kind = "Cluster"; - static apiBase = "/apis/cluster.k8s.io/v1alpha1/clusters"; - +export interface Cluster { spec: { clusterNetwork?: { serviceDomain?: string; @@ -106,6 +103,11 @@ export class Cluster extends KubeObject { errorMessage?: string; errorReason?: string; }; +} + +export class Cluster extends KubeObject { + static kind = "Cluster"; + static apiBase = "/apis/cluster.k8s.io/v1alpha1/clusters"; getStatus() { if (this.metadata.deletionTimestamp) return ClusterStatus.REMOVING; diff --git a/src/renderer/api/endpoints/component-status.api.ts b/src/renderer/api/endpoints/component-status.api.ts index f9c8444f0b..5b1632bf57 100644 --- a/src/renderer/api/endpoints/component-status.api.ts +++ b/src/renderer/api/endpoints/component-status.api.ts @@ -28,13 +28,15 @@ export interface IComponentStatusCondition { message: string; } +export interface ComponentStatus { + conditions: IComponentStatusCondition[]; +} + export class ComponentStatus extends KubeObject { static kind = "ComponentStatus"; static namespaced = false; static apiBase = "/api/v1/componentstatuses"; - conditions: IComponentStatusCondition[]; - getTruthyConditions() { return this.conditions.filter(c => c.status === "True"); } diff --git a/src/renderer/api/endpoints/configmap.api.ts b/src/renderer/api/endpoints/configmap.api.ts index 976f98f0e9..c5b16665f7 100644 --- a/src/renderer/api/endpoints/configmap.api.ts +++ b/src/renderer/api/endpoints/configmap.api.ts @@ -22,6 +22,13 @@ import { KubeObject } from "../kube-object"; import { KubeJsonApiData } from "../kube-json-api"; import { KubeApi } from "../kube-api"; +import { autoBind } from "../../../common/utils"; + +export interface ConfigMap { + data: { + [param: string]: string; + }; +} export class ConfigMap extends KubeObject { static kind = "ConfigMap"; @@ -30,12 +37,10 @@ export class ConfigMap extends KubeObject { constructor(data: KubeJsonApiData) { super(data); - this.data = this.data || {}; - } + autoBind(this); - data: { - [param: string]: string; - }; + this.data ??= {}; + } getKeys(): string[] { return Object.keys(this.data); diff --git a/src/renderer/api/endpoints/crd.api.ts b/src/renderer/api/endpoints/crd.api.ts index 5d2b657ce4..1d1d337d9c 100644 --- a/src/renderer/api/endpoints/crd.api.ts +++ b/src/renderer/api/endpoints/crd.api.ts @@ -38,11 +38,7 @@ type AdditionalPrinterColumnsV1Beta = AdditionalPrinterColumnsCommon & { JSONPath: string; }; -export class CustomResourceDefinition extends KubeObject { - static kind = "CustomResourceDefinition"; - static namespaced = false; - static apiBase = "/apis/apiextensions.k8s.io/v1/customresourcedefinitions"; - +export interface CustomResourceDefinition { spec: { group: string; version?: string; // deprecated in v1 api @@ -84,6 +80,12 @@ export class CustomResourceDefinition extends KubeObject { }; storedVersions: string[]; }; +} + +export class CustomResourceDefinition extends KubeObject { + static kind = "CustomResourceDefinition"; + static namespaced = false; + static apiBase = "/apis/apiextensions.k8s.io/v1/customresourcedefinitions"; getResourceUrl() { return crdResourcesURL({ diff --git a/src/renderer/api/endpoints/cron-job.api.ts b/src/renderer/api/endpoints/cron-job.api.ts index 671ab1cd0e..e9b0b5893f 100644 --- a/src/renderer/api/endpoints/cron-job.api.ts +++ b/src/renderer/api/endpoints/cron-job.api.ts @@ -59,16 +59,7 @@ export class CronJobApi extends KubeApi { } } -export class CronJob extends KubeObject { - static kind = "CronJob"; - static namespaced = true; - static apiBase = "/apis/batch/v1beta1/cronjobs"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface CronJob { spec: { schedule: string; concurrencyPolicy: string; @@ -105,6 +96,17 @@ export class CronJob extends KubeObject { status: { lastScheduleTime?: string; }; +} + +export class CronJob extends KubeObject { + static kind = "CronJob"; + static namespaced = true; + static apiBase = "/apis/batch/v1beta1/cronjobs"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getSuspendFlag() { return this.spec.suspend.toString(); diff --git a/src/renderer/api/endpoints/daemon-set.api.ts b/src/renderer/api/endpoints/daemon-set.api.ts index 24812e20dd..4a8d58b202 100644 --- a/src/renderer/api/endpoints/daemon-set.api.ts +++ b/src/renderer/api/endpoints/daemon-set.api.ts @@ -36,7 +36,7 @@ export class DaemonSet extends WorkloadKubeObject { autoBind(this); } - spec: { + declare spec: { selector: { matchLabels: { [name: string]: string; @@ -78,7 +78,7 @@ export class DaemonSet extends WorkloadKubeObject { }; revisionHistoryLimit: number; }; - status: { + declare status: { currentNumberScheduled: number; numberMisscheduled: number; desiredNumberScheduled: number; diff --git a/src/renderer/api/endpoints/deployment.api.ts b/src/renderer/api/endpoints/deployment.api.ts index 12c19f9e61..332de12552 100644 --- a/src/renderer/api/endpoints/deployment.api.ts +++ b/src/renderer/api/endpoints/deployment.api.ts @@ -98,7 +98,7 @@ export class Deployment extends WorkloadKubeObject { autoBind(this); } - spec: { + declare spec: { replicas: number; selector: { matchLabels: { [app: string]: string } }; template: { @@ -177,7 +177,7 @@ export class Deployment extends WorkloadKubeObject { }; }; }; - status: { + declare status: { observedGeneration: number; replicas: number; updatedReplicas: number; diff --git a/src/renderer/api/endpoints/endpoint.api.ts b/src/renderer/api/endpoints/endpoint.api.ts index 9726a6a5b5..897e357b7d 100644 --- a/src/renderer/api/endpoints/endpoint.api.ts +++ b/src/renderer/api/endpoints/endpoint.api.ts @@ -122,13 +122,15 @@ export class EndpointSubset implements IEndpointSubset { } } +export interface Endpoint { + subsets: IEndpointSubset[]; +} + export class Endpoint extends KubeObject { static kind = "Endpoints"; static namespaced = true; static apiBase = "/api/v1/endpoints"; - subsets: IEndpointSubset[]; - constructor(data: KubeJsonApiData) { super(data); autoBind(this); diff --git a/src/renderer/api/endpoints/events.api.ts b/src/renderer/api/endpoints/events.api.ts index 78806777de..ad194a532a 100644 --- a/src/renderer/api/endpoints/events.api.ts +++ b/src/renderer/api/endpoints/events.api.ts @@ -24,11 +24,7 @@ import { KubeObject } from "../kube-object"; import { formatDuration } from "../../utils/formatDuration"; import { KubeApi } from "../kube-api"; -export class KubeEvent extends KubeObject { - static kind = "Event"; - static namespaced = true; - static apiBase = "/api/v1/events"; - +export interface KubeEvent { involvedObject: { kind: string; namespace: string; @@ -51,6 +47,12 @@ export class KubeEvent extends KubeObject { eventTime: null; reportingComponent: string; reportingInstance: string; +} + +export class KubeEvent extends KubeObject { + static kind = "Event"; + static namespaced = true; + static apiBase = "/api/v1/events"; isWarning() { return this.type === "Warning"; diff --git a/src/renderer/api/endpoints/helm-charts.api.ts b/src/renderer/api/endpoints/helm-charts.api.ts index 75afc8ee5b..2244bca1f2 100644 --- a/src/renderer/api/endpoints/helm-charts.api.ts +++ b/src/renderer/api/endpoints/helm-charts.api.ts @@ -83,16 +83,7 @@ export async function getChartValues(repo: string, name: string, version: string return apiBase.get(`/v2/charts/${repo}/${name}/values?${stringify({ version })}`); } -export class HelmChart { - constructor(data: any) { - Object.assign(this, data); - autoBind(this); - } - - static create(data: any) { - return new HelmChart(data); - } - +export interface HelmChart { apiVersion: string; name: string; version: string; @@ -114,6 +105,17 @@ export class HelmChart { appVersion?: string; deprecated?: boolean; tillerVersion?: string; +} + +export class HelmChart { + constructor(data: HelmChart) { + Object.assign(this, data); + autoBind(this); + } + + static create(data: any) { + return new HelmChart(data); + } getId() { return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}+${this.digest}`; diff --git a/src/renderer/api/endpoints/helm-releases.api.ts b/src/renderer/api/endpoints/helm-releases.api.ts index 7ea24334cb..24c37cea8f 100644 --- a/src/renderer/api/endpoints/helm-releases.api.ts +++ b/src/renderer/api/endpoints/helm-releases.api.ts @@ -155,6 +155,16 @@ export async function rollbackRelease(name: string, namespace: string, revision: }); } +export interface HelmRelease { + appVersion: string; + name: string; + namespace: string; + chart: string; + status: string; + updated: string; + revision: string; +} + export class HelmRelease implements ItemObject { constructor(data: any) { Object.assign(this, data); @@ -165,14 +175,6 @@ export class HelmRelease implements ItemObject { return new HelmRelease(data); } - appVersion: string; - name: string; - namespace: string; - chart: string; - status: string; - updated: string; - revision: string; - getId() { return this.namespace + this.name; } diff --git a/src/renderer/api/endpoints/hpa.api.ts b/src/renderer/api/endpoints/hpa.api.ts index 5d1105acc3..dba89d4111 100644 --- a/src/renderer/api/endpoints/hpa.api.ts +++ b/src/renderer/api/endpoints/hpa.api.ts @@ -59,11 +59,7 @@ export interface IHpaMetric { }>; } -export class HorizontalPodAutoscaler extends KubeObject { - static kind = "HorizontalPodAutoscaler"; - static namespaced = true; - static apiBase = "/apis/autoscaling/v2beta1/horizontalpodautoscalers"; - +export interface HorizontalPodAutoscaler { spec: { scaleTargetRef: { kind: string; @@ -86,6 +82,12 @@ export class HorizontalPodAutoscaler extends KubeObject { type: string; }[]; }; +} + +export class HorizontalPodAutoscaler extends KubeObject { + static kind = "HorizontalPodAutoscaler"; + static namespaced = true; + static apiBase = "/apis/autoscaling/v2beta1/horizontalpodautoscalers"; getMaxPods() { return this.spec.maxReplicas || 0; diff --git a/src/renderer/api/endpoints/ingress.api.ts b/src/renderer/api/endpoints/ingress.api.ts index 2fa0512735..be1f30af8c 100644 --- a/src/renderer/api/endpoints/ingress.api.ts +++ b/src/renderer/api/endpoints/ingress.api.ts @@ -83,16 +83,7 @@ export const getBackendServiceNamePort = (backend: IIngressBackend) => { return { serviceName, servicePort }; }; -export class Ingress extends KubeObject { - static kind = "Ingress"; - static namespaced = true; - static apiBase = "/apis/networking.k8s.io/v1/ingresses"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface Ingress { spec: { tls: { secretName: string; @@ -122,6 +113,17 @@ export class Ingress extends KubeObject { ingress: ILoadBalancerIngress[]; }; }; +} + +export class Ingress extends KubeObject { + static kind = "Ingress"; + static namespaced = true; + static apiBase = "/apis/networking.k8s.io/v1/ingresses"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getRoutes() { const { spec: { tls, rules } } = this; @@ -193,7 +195,7 @@ export class Ingress extends KubeObject { getLoadBalancers() { const { status: { loadBalancer = { ingress: [] } } } = this; - + return (loadBalancer.ingress ?? []).map(address => ( address.hostname || address.ip )); diff --git a/src/renderer/api/endpoints/job.api.ts b/src/renderer/api/endpoints/job.api.ts index cb18abc6a9..9c0dc59caa 100644 --- a/src/renderer/api/endpoints/job.api.ts +++ b/src/renderer/api/endpoints/job.api.ts @@ -37,7 +37,7 @@ export class Job extends WorkloadKubeObject { autoBind(this); } - spec: { + declare spec: { parallelism?: number; completions?: number; backoffLimit?: number; @@ -83,7 +83,7 @@ export class Job extends WorkloadKubeObject { serviceAccount?: string; schedulerName?: string; }; - status: { + declare status: { conditions: { type: string; status: string; diff --git a/src/renderer/api/endpoints/limit-range.api.ts b/src/renderer/api/endpoints/limit-range.api.ts index 61ce5903c3..9f712af36c 100644 --- a/src/renderer/api/endpoints/limit-range.api.ts +++ b/src/renderer/api/endpoints/limit-range.api.ts @@ -51,6 +51,12 @@ export interface LimitRangeItem extends LimitRangeParts { type: string } +export interface LimitRange { + spec: { + limits: LimitRangeItem[]; + }; +} + export class LimitRange extends KubeObject { static kind = "LimitRange"; static namespaced = true; @@ -61,10 +67,6 @@ export class LimitRange extends KubeObject { autoBind(this); } - spec: { - limits: LimitRangeItem[]; - }; - getContainerLimits() { return this.spec.limits.filter(limit => limit.type === LimitType.CONTAINER); } diff --git a/src/renderer/api/endpoints/namespaces.api.ts b/src/renderer/api/endpoints/namespaces.api.ts index 3e9187bb9a..14aa243c7c 100644 --- a/src/renderer/api/endpoints/namespaces.api.ts +++ b/src/renderer/api/endpoints/namespaces.api.ts @@ -29,6 +29,12 @@ export enum NamespaceStatus { TERMINATING = "Terminating", } +export interface Namespace { + status?: { + phase: string; + }; +} + export class Namespace extends KubeObject { static kind = "Namespace"; static namespaced = false; @@ -39,12 +45,8 @@ export class Namespace extends KubeObject { autoBind(this); } - status?: { - phase: string; - }; - getStatus() { - return this.status ? this.status.phase : "-"; + return this.status?.phase ?? "-"; } } diff --git a/src/renderer/api/endpoints/network-policy.api.ts b/src/renderer/api/endpoints/network-policy.api.ts index 375bc4b3d3..8034a3b210 100644 --- a/src/renderer/api/endpoints/network-policy.api.ts +++ b/src/renderer/api/endpoints/network-policy.api.ts @@ -57,16 +57,7 @@ export interface IPolicyEgress { }[]; } -export class NetworkPolicy extends KubeObject { - static kind = "NetworkPolicy"; - static namespaced = true; - static apiBase = "/apis/networking.k8s.io/v1/networkpolicies"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface NetworkPolicy { spec: { podSelector: { matchLabels: { @@ -78,6 +69,17 @@ export class NetworkPolicy extends KubeObject { ingress: IPolicyIngress[]; egress: IPolicyEgress[]; }; +} + +export class NetworkPolicy extends KubeObject { + static kind = "NetworkPolicy"; + static namespaced = true; + static apiBase = "/apis/networking.k8s.io/v1/networkpolicies"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getMatchLabels(): string[] { if (!this.spec.podSelector || !this.spec.podSelector.matchLabels) return []; diff --git a/src/renderer/api/endpoints/nodes.api.ts b/src/renderer/api/endpoints/nodes.api.ts index 73752897e0..2e8ffedb64 100644 --- a/src/renderer/api/endpoints/nodes.api.ts +++ b/src/renderer/api/endpoints/nodes.api.ts @@ -27,7 +27,7 @@ import { KubeJsonApiData } from "../kube-json-api"; export class NodesApi extends KubeApi { getMetrics(): Promise { - const opts = { category: "nodes"}; + const opts = { category: "nodes" }; return metricsApi.getMetrics({ memoryUsage: opts, @@ -50,16 +50,7 @@ export interface INodeMetrics { fsSize: T; } -export class Node extends KubeObject { - static kind = "Node"; - static namespaced = false; - static apiBase = "/api/v1/nodes"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface Node { spec: { podCIDR: string; externalID: string; @@ -110,6 +101,17 @@ export class Node extends KubeObject { sizeBytes: number; }[]; }; +} + +export class Node extends KubeObject { + static kind = "Node"; + static namespaced = false; + static apiBase = "/api/v1/nodes"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getNodeConditionText() { const { conditions } = this.status; diff --git a/src/renderer/api/endpoints/persistent-volume-claims.api.ts b/src/renderer/api/endpoints/persistent-volume-claims.api.ts index 32e9f5ccba..70b5ba5847 100644 --- a/src/renderer/api/endpoints/persistent-volume-claims.api.ts +++ b/src/renderer/api/endpoints/persistent-volume-claims.api.ts @@ -43,16 +43,7 @@ export interface IPvcMetrics { diskCapacity: T; } -export class PersistentVolumeClaim extends KubeObject { - static kind = "PersistentVolumeClaim"; - static namespaced = true; - static apiBase = "/api/v1/persistentvolumeclaims"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface PersistentVolumeClaim { spec: { accessModes: string[]; storageClassName: string; @@ -75,6 +66,17 @@ export class PersistentVolumeClaim extends KubeObject { status: { phase: string; // Pending }; +} + +export class PersistentVolumeClaim extends KubeObject { + static kind = "PersistentVolumeClaim"; + static namespaced = true; + static apiBase = "/api/v1/persistentvolumeclaims"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getPods(allPods: Pod[]): Pod[] { const pods = allPods.filter(pod => pod.getNs() === this.getNs()); diff --git a/src/renderer/api/endpoints/persistent-volume.api.ts b/src/renderer/api/endpoints/persistent-volume.api.ts index 00aa13f3dd..c678bde930 100644 --- a/src/renderer/api/endpoints/persistent-volume.api.ts +++ b/src/renderer/api/endpoints/persistent-volume.api.ts @@ -25,16 +25,7 @@ import { autoBind } from "../../utils"; import { KubeApi } from "../kube-api"; import { KubeJsonApiData } from "../kube-json-api"; -export class PersistentVolume extends KubeObject { - static kind = "PersistentVolume"; - static namespaced = false; - static apiBase = "/api/v1/persistentvolumes"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface PersistentVolume { spec: { capacity: { storage: string; // 8Gi @@ -70,6 +61,17 @@ export class PersistentVolume extends KubeObject { phase: string; reason?: string; }; +} + +export class PersistentVolume extends KubeObject { + static kind = "PersistentVolume"; + static namespaced = false; + static apiBase = "/api/v1/persistentvolumes"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getCapacity(inBytes = false) { const capacity = this.spec.capacity; diff --git a/src/renderer/api/endpoints/pod-metrics.api.ts b/src/renderer/api/endpoints/pod-metrics.api.ts index d39c578fc1..191a128267 100644 --- a/src/renderer/api/endpoints/pod-metrics.api.ts +++ b/src/renderer/api/endpoints/pod-metrics.api.ts @@ -22,11 +22,7 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -export class PodMetrics extends KubeObject { - static kind = "PodMetrics"; - static namespaced = true; - static apiBase = "/apis/metrics.k8s.io/v1beta1/pods"; - +export interface PodMetrics { timestamp: string; window: string; containers: { @@ -38,6 +34,12 @@ export class PodMetrics extends KubeObject { }[]; } +export class PodMetrics extends KubeObject { + static kind = "PodMetrics"; + static namespaced = true; + static apiBase = "/apis/metrics.k8s.io/v1beta1/pods"; +} + export const podMetricsApi = new KubeApi({ objectConstructor: PodMetrics, }); diff --git a/src/renderer/api/endpoints/poddisruptionbudget.api.ts b/src/renderer/api/endpoints/poddisruptionbudget.api.ts index 1cc9779e06..026e8d9bff 100644 --- a/src/renderer/api/endpoints/poddisruptionbudget.api.ts +++ b/src/renderer/api/endpoints/poddisruptionbudget.api.ts @@ -24,16 +24,7 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; import { KubeJsonApiData } from "../kube-json-api"; -export class PodDisruptionBudget extends KubeObject { - static kind = "PodDisruptionBudget"; - static namespaced = true; - static apiBase = "/apis/policy/v1beta1/poddisruptionbudgets"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface PodDisruptionBudget { spec: { minAvailable: string; maxUnavailable: string; @@ -45,6 +36,17 @@ export class PodDisruptionBudget extends KubeObject { disruptionsAllowed: number expectedPods: number }; +} + +export class PodDisruptionBudget extends KubeObject { + static kind = "PodDisruptionBudget"; + static namespaced = true; + static apiBase = "/apis/policy/v1beta1/poddisruptionbudgets"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getSelectors() { const selector = this.spec.selector; diff --git a/src/renderer/api/endpoints/pods.api.ts b/src/renderer/api/endpoints/pods.api.ts index eb2436bb22..4ca9c75fcd 100644 --- a/src/renderer/api/endpoints/pods.api.ts +++ b/src/renderer/api/endpoints/pods.api.ts @@ -213,7 +213,7 @@ export class Pod extends WorkloadKubeObject { autoBind(this); } - spec: { + declare spec: { volumes?: { name: string; persistentVolumeClaim: { @@ -270,7 +270,7 @@ export class Pod extends WorkloadKubeObject { }; affinity?: IAffinity; }; - status?: { + declare status?: { phase: string; conditions: { type: string; diff --git a/src/renderer/api/endpoints/podsecuritypolicy.api.ts b/src/renderer/api/endpoints/podsecuritypolicy.api.ts index 4a9a9d34ac..68b8c1d8ed 100644 --- a/src/renderer/api/endpoints/podsecuritypolicy.api.ts +++ b/src/renderer/api/endpoints/podsecuritypolicy.api.ts @@ -24,16 +24,7 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; import { KubeJsonApiData } from "../kube-json-api"; -export class PodSecurityPolicy extends KubeObject { - static kind = "PodSecurityPolicy"; - static namespaced = false; - static apiBase = "/apis/policy/v1beta1/podsecuritypolicies"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface PodSecurityPolicy { spec: { allowPrivilegeEscalation?: boolean; allowedCSIDrivers?: { @@ -93,6 +84,17 @@ export class PodSecurityPolicy extends KubeObject { }; volumes?: string[]; }; +} + +export class PodSecurityPolicy extends KubeObject { + static kind = "PodSecurityPolicy"; + static namespaced = false; + static apiBase = "/apis/policy/v1beta1/podsecuritypolicies"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } isPrivileged() { return !!this.spec.privileged; diff --git a/src/renderer/api/endpoints/replica-set.api.ts b/src/renderer/api/endpoints/replica-set.api.ts index 5dc06b3973..5adac478dd 100644 --- a/src/renderer/api/endpoints/replica-set.api.ts +++ b/src/renderer/api/endpoints/replica-set.api.ts @@ -59,7 +59,7 @@ export class ReplicaSet extends WorkloadKubeObject { autoBind(this); } - spec: { + declare spec: { replicas?: number; selector: { matchLabels: { [app: string]: string } }; template?: { @@ -72,7 +72,7 @@ export class ReplicaSet extends WorkloadKubeObject { }; minReadySeconds?: number; }; - status: { + declare status: { replicas: number; fullyLabeledReplicas?: number; readyReplicas?: number; diff --git a/src/renderer/api/endpoints/resource-quota.api.ts b/src/renderer/api/endpoints/resource-quota.api.ts index 173d019350..762c6682e1 100644 --- a/src/renderer/api/endpoints/resource-quota.api.ts +++ b/src/renderer/api/endpoints/resource-quota.api.ts @@ -21,7 +21,6 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -import { KubeJsonApiData } from "../kube-json-api"; export interface IResourceQuotaValues { [quota: string]: string; @@ -51,16 +50,7 @@ export interface IResourceQuotaValues { "count/deployments.extensions"?: string; } -export class ResourceQuota extends KubeObject { - static kind = "ResourceQuota"; - static namespaced = true; - static apiBase = "/api/v1/resourcequotas"; - - constructor(data: KubeJsonApiData) { - super(data); - this.spec = this.spec || {} as any; - } - +export interface ResourceQuota { spec: { hard: IResourceQuotaValues; scopeSelector?: { @@ -76,6 +66,12 @@ export class ResourceQuota extends KubeObject { hard: IResourceQuotaValues; used: IResourceQuotaValues; }; +} + +export class ResourceQuota extends KubeObject { + static kind = "ResourceQuota"; + static namespaced = true; + static apiBase = "/api/v1/resourcequotas"; getScopeSelector() { const { matchExpressions = [] } = this.spec.scopeSelector || {}; diff --git a/src/renderer/api/endpoints/role-binding.api.ts b/src/renderer/api/endpoints/role-binding.api.ts index 19e6e520d2..f83d71f5d3 100644 --- a/src/renderer/api/endpoints/role-binding.api.ts +++ b/src/renderer/api/endpoints/role-binding.api.ts @@ -31,6 +31,15 @@ export interface IRoleBindingSubject { apiGroup?: string; } +export interface RoleBinding { + subjects?: IRoleBindingSubject[]; + roleRef: { + kind: string; + name: string; + apiGroup?: string; + }; +} + export class RoleBinding extends KubeObject { static kind = "RoleBinding"; static namespaced = true; @@ -41,13 +50,6 @@ export class RoleBinding extends KubeObject { autoBind(this); } - subjects?: IRoleBindingSubject[]; - roleRef: { - kind: string; - name: string; - apiGroup?: string; - }; - getSubjects() { return this.subjects || []; } diff --git a/src/renderer/api/endpoints/role.api.ts b/src/renderer/api/endpoints/role.api.ts index 55c3bbe648..b504c7fc8b 100644 --- a/src/renderer/api/endpoints/role.api.ts +++ b/src/renderer/api/endpoints/role.api.ts @@ -22,17 +22,19 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; -export class Role extends KubeObject { - static kind = "Role"; - static namespaced = true; - static apiBase = "/apis/rbac.authorization.k8s.io/v1/roles"; - +export interface Role { rules: { verbs: string[]; apiGroups: string[]; resources: string[]; resourceNames?: string[]; }[]; +} + +export class Role extends KubeObject { + static kind = "Role"; + static namespaced = true; + static apiBase = "/apis/rbac.authorization.k8s.io/v1/roles"; getRules() { return this.rules || []; diff --git a/src/renderer/api/endpoints/secret.api.ts b/src/renderer/api/endpoints/secret.api.ts index 899c873ac7..d59bfc093e 100644 --- a/src/renderer/api/endpoints/secret.api.ts +++ b/src/renderer/api/endpoints/secret.api.ts @@ -40,6 +40,14 @@ export interface ISecretRef { name: string; } +export interface Secret { + type: SecretType; + data: { + [prop: string]: string; + token?: string; + }; +} + export class Secret extends KubeObject { static kind = "Secret"; static namespaced = true; @@ -48,13 +56,9 @@ export class Secret extends KubeObject { constructor(data: KubeJsonApiData) { super(data); autoBind(this); - } - type: SecretType; - data: { - [prop: string]: string; - token?: string; - } = {}; + this.data ??= {}; + } getKeys(): string[] { return Object.keys(this.data); diff --git a/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts b/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts index d008250f9d..84c27f21cb 100644 --- a/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts +++ b/src/renderer/api/endpoints/selfsubjectrulesreviews.api.ts @@ -28,8 +28,7 @@ export class SelfSubjectRulesReviewApi extends KubeApi { spec: { namespace }, - } - ); + }); } } @@ -41,21 +40,21 @@ export interface ISelfSubjectReviewRule { nonResourceURLs?: string[]; } -export class SelfSubjectRulesReview extends KubeObject { - static kind = "SelfSubjectRulesReview"; - static namespaced = false; - static apiBase = "/apis/authorization.k8s.io/v1/selfsubjectrulesreviews"; - +export interface SelfSubjectRulesReview { spec: { - // todo: add more types from api docs namespace?: string; }; - status: { resourceRules: ISelfSubjectReviewRule[]; nonResourceRules: ISelfSubjectReviewRule[]; incomplete: boolean; }; +} + +export class SelfSubjectRulesReview extends KubeObject { + static kind = "SelfSubjectRulesReview"; + static namespaced = false; + static apiBase = "/apis/authorization.k8s.io/v1/selfsubjectrulesreviews"; getResourceRules() { const rules = this.status && this.status.resourceRules || []; diff --git a/src/renderer/api/endpoints/service-accounts.api.ts b/src/renderer/api/endpoints/service-accounts.api.ts index f48e403141..0859e32351 100644 --- a/src/renderer/api/endpoints/service-accounts.api.ts +++ b/src/renderer/api/endpoints/service-accounts.api.ts @@ -24,6 +24,15 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; import { KubeJsonApiData } from "../kube-json-api"; +export interface ServiceAccount { + secrets?: { + name: string; + }[]; + imagePullSecrets?: { + name: string; + }[]; +} + export class ServiceAccount extends KubeObject { static kind = "ServiceAccount"; static namespaced = true; @@ -34,13 +43,6 @@ export class ServiceAccount extends KubeObject { autoBind(this); } - secrets?: { - name: string; - }[]; - imagePullSecrets?: { - name: string; - }[]; - getSecrets() { return this.secrets || []; } diff --git a/src/renderer/api/endpoints/service.api.ts b/src/renderer/api/endpoints/service.api.ts index ea7fdb6397..847d4ee04c 100644 --- a/src/renderer/api/endpoints/service.api.ts +++ b/src/renderer/api/endpoints/service.api.ts @@ -24,21 +24,16 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; import { KubeJsonApiData } from "../kube-json-api"; -export interface IServicePort { - name?: string; - protocol: string; - port: number; - targetPort: number; -} - -export class ServicePort implements IServicePort { +export interface ServicePort { name?: string; protocol: string; port: number; targetPort: number; nodePort?: number; +} - constructor(data: IServicePort) { +export class ServicePort { + constructor(data: ServicePort) { Object.assign(this, data); } @@ -51,16 +46,7 @@ export class ServicePort implements IServicePort { } } -export class Service extends KubeObject { - static kind = "Service"; - static namespaced = true; - static apiBase = "/api/v1/services"; - - constructor(data: KubeJsonApiData) { - super(data); - autoBind(this); - } - +export interface Service { spec: { type: string; clusterIP: string; @@ -80,6 +66,17 @@ export class Service extends KubeObject { }[]; }; }; +} + +export class Service extends KubeObject { + static kind = "Service"; + static namespaced = true; + static apiBase = "/api/v1/services"; + + constructor(data: KubeJsonApiData) { + super(data); + autoBind(this); + } getClusterIp() { return this.spec.clusterIP; diff --git a/src/renderer/api/endpoints/stateful-set.api.ts b/src/renderer/api/endpoints/stateful-set.api.ts index 9ec7523476..16431b701b 100644 --- a/src/renderer/api/endpoints/stateful-set.api.ts +++ b/src/renderer/api/endpoints/stateful-set.api.ts @@ -59,7 +59,7 @@ export class StatefulSet extends WorkloadKubeObject { autoBind(this); } - spec: { + declare spec: { serviceName: string; replicas: number; selector: { @@ -112,7 +112,7 @@ export class StatefulSet extends WorkloadKubeObject { }; }[]; }; - status: { + declare status: { observedGeneration: number; replicas: number; currentReplicas: number; diff --git a/src/renderer/api/endpoints/storage-class.api.ts b/src/renderer/api/endpoints/storage-class.api.ts index c33a68100d..231e89cf75 100644 --- a/src/renderer/api/endpoints/storage-class.api.ts +++ b/src/renderer/api/endpoints/storage-class.api.ts @@ -24,6 +24,16 @@ import { KubeObject } from "../kube-object"; import { KubeApi } from "../kube-api"; import { KubeJsonApiData } from "../kube-json-api"; +export interface StorageClass { + provisioner: string; // e.g. "storage.k8s.io/v1" + mountOptions?: string[]; + volumeBindingMode: string; + reclaimPolicy: string; + parameters: { + [param: string]: string; // every provisioner has own set of these parameters + }; +} + export class StorageClass extends KubeObject { static kind = "StorageClass"; static namespaced = false; @@ -34,14 +44,6 @@ export class StorageClass extends KubeObject { autoBind(this); } - provisioner: string; // e.g. "storage.k8s.io/v1" - mountOptions?: string[]; - volumeBindingMode: string; - reclaimPolicy: string; - parameters: { - [param: string]: string; // every provisioner has own set of these parameters - }; - isDefault() { const annotations = this.metadata.annotations || {}; diff --git a/src/renderer/api/kube-object.ts b/src/renderer/api/kube-object.ts index 3da972bc6e..85fe45d9dc 100644 --- a/src/renderer/api/kube-object.ts +++ b/src/renderer/api/kube-object.ts @@ -91,6 +91,12 @@ export class KubeObject implements ItemObject { static readonly kind: string; static readonly namespaced: boolean; + apiVersion: string; + kind: string; + metadata: IKubeObjectMetadata; + status?: any; + spec?: any = {}; + static create(data: any) { return new KubeObject(data); } @@ -178,12 +184,6 @@ export class KubeObject implements ItemObject { autoBind(this); } - apiVersion: string; - kind: string; - metadata: IKubeObjectMetadata; - status?: any; - spec?: any; - get selfLink() { return this.metadata.selfLink; } diff --git a/src/renderer/components/command-palette/command-container.tsx b/src/renderer/components/command-palette/command-container.tsx index 441dbb0e95..50e79bde12 100644 --- a/src/renderer/components/command-palette/command-container.tsx +++ b/src/renderer/components/command-palette/command-container.tsx @@ -53,7 +53,7 @@ export interface CommandContainerProps { @observer export class CommandContainer extends React.Component { - @observable.ref commandComponent: React.ReactNode = null; + @observable.ref commandComponent: React.ReactNode; constructor(props: CommandContainerProps) { super(props); diff --git a/src/renderer/components/menu/menu.tsx b/src/renderer/components/menu/menu.tsx index 3c30f2a403..228db7ceb4 100644 --- a/src/renderer/components/menu/menu.tsx +++ b/src/renderer/components/menu/menu.tsx @@ -347,7 +347,7 @@ export class MenuItem extends React.Component { static defaultProps = defaultPropsMenuItem as object; static contextType = MenuContext; - public context: MenuContextValue; + declare context: MenuContextValue; public elem: HTMLElement; constructor(props: MenuItemProps) { diff --git a/src/renderer/components/tabs/tabs.tsx b/src/renderer/components/tabs/tabs.tsx index 90a018dd81..fb3fb5e58c 100644 --- a/src/renderer/components/tabs/tabs.tsx +++ b/src/renderer/components/tabs/tabs.tsx @@ -83,7 +83,7 @@ export interface TabProps extends DOMAttributes { export class Tab extends React.PureComponent { static contextType = TabsContext; - public context: TabsContextValue; + declare context: TabsContextValue; public elem: HTMLElement; get isActive() { diff --git a/tsconfig.json b/tsconfig.json index b23c764f2b..c4c63baf88 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,7 @@ "allowSyntheticDefaultImports": true, "traceResolution": false, "resolveJsonModule": true, - "useDefineForClassFields": false, + "useDefineForClassFields": true, "paths": { "*": [ "node_modules/*",