diff --git a/src/common/k8s-api/endpoints/cluster-role-binding.api.ts b/src/common/k8s-api/endpoints/cluster-role-binding.api.ts index 52449be8a3..d9bc61af49 100644 --- a/src/common/k8s-api/endpoints/cluster-role-binding.api.ts +++ b/src/common/k8s-api/endpoints/cluster-role-binding.api.ts @@ -5,7 +5,7 @@ import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import type { KubeJsonApiData } from "../kube-json-api"; -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { ClusterScopedMetadata, KubeObjectMetadata, KubeObjectScope } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { RoleRef } from "./types/role-ref"; import type { Subject } from "./types/subject"; @@ -15,7 +15,11 @@ export interface ClusterRoleBindingData extends KubeJsonApiData { +export class ClusterRoleBinding extends KubeObject< + ClusterScopedMetadata, + void, + void +> { static kind = "ClusterRoleBinding"; static namespaced = false; static apiBase = "/apis/rbac.authorization.k8s.io/v1/clusterrolebindings"; diff --git a/src/common/k8s-api/endpoints/cluster-role.api.ts b/src/common/k8s-api/endpoints/cluster-role.api.ts index ff9503f231..f99168b395 100644 --- a/src/common/k8s-api/endpoints/cluster-role.api.ts +++ b/src/common/k8s-api/endpoints/cluster-role.api.ts @@ -6,7 +6,7 @@ import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import type { KubeJsonApiData } from "../kube-json-api"; -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { ClusterScopedMetadata, KubeObjectMetadata, KubeObjectScope } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { AggregationRule } from "./types/aggregation-rule"; import type { PolicyRule } from "./types/policy-rule"; @@ -16,7 +16,11 @@ export interface ClusterRoleData extends KubeJsonApiData { +export class ClusterRole extends KubeObject< + ClusterScopedMetadata, + void, + void +> { static kind = "ClusterRole"; static namespaced = false; static apiBase = "/apis/rbac.authorization.k8s.io/v1/clusterroles"; diff --git a/src/common/k8s-api/endpoints/config-map.api.ts b/src/common/k8s-api/endpoints/config-map.api.ts index 5577c690f7..922274d32a 100644 --- a/src/common/k8s-api/endpoints/config-map.api.ts +++ b/src/common/k8s-api/endpoints/config-map.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { KubeJsonApiData } from "../kube-json-api"; import type { DerivedKubeApiOptions } from "../kube-api"; @@ -16,7 +16,11 @@ export interface ConfigMapData extends KubeJsonApiData { +export class ConfigMap extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static kind = "ConfigMap"; static namespaced = true; static apiBase = "/api/v1/configmaps"; diff --git a/src/common/k8s-api/endpoints/cron-job.api.ts b/src/common/k8s-api/endpoints/cron-job.api.ts index 5c3dda4d7d..131b632589 100644 --- a/src/common/k8s-api/endpoints/cron-job.api.ts +++ b/src/common/k8s-api/endpoints/cron-job.api.ts @@ -4,7 +4,7 @@ */ import moment from "moment"; -import type { KubeObjectScope, ObjectReference } from "../kube-object"; +import type { NamespaceScopedMetadata, ObjectReference } from "../kube-object"; import { KubeObject } from "../kube-object"; import { formatDuration } from "../../utils/formatDuration"; import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; @@ -66,7 +66,11 @@ export interface CronJobStatus { active?: ObjectReference[]; } -export class CronJob extends KubeObject { +export class CronJob extends KubeObject< + NamespaceScopedMetadata, + CronJobStatus, + CronJobSpec +> { static readonly kind = "CronJob"; static readonly namespaced = true; static readonly apiBase = "/apis/batch/v1beta1/cronjobs"; diff --git a/src/common/k8s-api/endpoints/custom-resource-definition.api.ts b/src/common/k8s-api/endpoints/custom-resource-definition.api.ts index 90485a5ab8..9235e2c992 100644 --- a/src/common/k8s-api/endpoints/custom-resource-definition.api.ts +++ b/src/common/k8s-api/endpoints/custom-resource-definition.api.ts @@ -6,7 +6,7 @@ import { getLegacyGlobalDiForExtensionApi } from "../../../extensions/as-legacy-globals-for-extension-api/legacy-global-di-for-extension-api"; import customResourcesRouteInjectable from "../../front-end-routing/routes/cluster/custom-resources/custom-resources/custom-resources-route.injectable"; import { buildURL } from "../../utils/buildUrl"; -import type { BaseKubeObjectCondition, KubeObjectScope } from "../kube-object"; +import type { BaseKubeObjectCondition, ClusterScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -107,7 +107,11 @@ export interface CustomResourceDefinitionStatus { storedVersions: string[]; } -export class CustomResourceDefinition extends KubeObject { +export class CustomResourceDefinition extends KubeObject< + ClusterScopedMetadata, + CustomResourceDefinitionStatus, + CustomResourceDefinitionSpec +> { static kind = "CustomResourceDefinition"; static namespaced = false; static apiBase = "/apis/apiextensions.k8s.io/v1/customresourcedefinitions"; diff --git a/src/common/k8s-api/endpoints/daemon-set.api.ts b/src/common/k8s-api/endpoints/daemon-set.api.ts index 449e021495..f023652306 100644 --- a/src/common/k8s-api/endpoints/daemon-set.api.ts +++ b/src/common/k8s-api/endpoints/daemon-set.api.ts @@ -7,7 +7,7 @@ import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import { metricsApi } from "./metrics.api"; import type { PodMetricData } from "./pod.api"; -import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object"; +import type { KubeObjectStatus, LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { PodTemplateSpec } from "./types/pod-template-spec"; @@ -41,7 +41,11 @@ export interface DaemonSetStatus extends KubeObjectStatus { updatedNumberScheduled?: number; } -export class DaemonSet extends KubeObject { +export class DaemonSet extends KubeObject< + NamespaceScopedMetadata, + DaemonSetStatus, + DaemonSetSpec +> { static kind = "DaemonSet"; static namespaced = true; static apiBase = "/apis/apps/v1/daemonsets"; diff --git a/src/common/k8s-api/endpoints/deployment.api.ts b/src/common/k8s-api/endpoints/deployment.api.ts index c877669ba4..f67f26f70f 100644 --- a/src/common/k8s-api/endpoints/deployment.api.ts +++ b/src/common/k8s-api/endpoints/deployment.api.ts @@ -9,7 +9,7 @@ import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import { metricsApi } from "./metrics.api"; import type { PodMetricData, PodSpec } from "./pod.api"; -import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object"; +import type { KubeObjectStatus, LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import { hasTypedProperty, isNumber, isObject } from "../../utils"; @@ -116,7 +116,11 @@ export interface DeploymentStatus extends KubeObjectStatus { unavailableReplicas?: number; } -export class Deployment extends KubeObject { +export class Deployment extends KubeObject< + NamespaceScopedMetadata, + DeploymentStatus, + DeploymentSpec +> { static kind = "Deployment"; static namespaced = true; static apiBase = "/apis/apps/v1/deployments"; diff --git a/src/common/k8s-api/endpoints/endpoint.api.ts b/src/common/k8s-api/endpoints/endpoint.api.ts index 38af0044a5..dd61bc2211 100644 --- a/src/common/k8s-api/endpoints/endpoint.api.ts +++ b/src/common/k8s-api/endpoints/endpoint.api.ts @@ -4,7 +4,7 @@ */ import { autoBind } from "../../utils"; -import type { KubeObjectMetadata, KubeObjectScope, ObjectReference } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, NamespaceScopedMetadata, ObjectReference } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -75,7 +75,11 @@ export interface EndpointsData extends KubeJsonApiData { +export class Endpoints extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static kind = "Endpoints"; static namespaced = true; static apiBase = "/api/v1/endpoints"; diff --git a/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.ts b/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.ts index 06d5669220..9b1fa75955 100644 --- a/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.ts +++ b/src/common/k8s-api/endpoints/horizontal-pod-autoscaler.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { BaseKubeObjectCondition, KubeObjectScope, LabelSelector } from "../kube-object"; +import type { BaseKubeObjectCondition, LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -97,7 +97,11 @@ interface MetricCurrentTarget { target?: string; } -export class HorizontalPodAutoscaler extends KubeObject { +export class HorizontalPodAutoscaler extends KubeObject< + NamespaceScopedMetadata, + HorizontalPodAutoscalerStatus, + HorizontalPodAutoscalerSpec +> { static readonly kind = "HorizontalPodAutoscaler"; static readonly namespaced = true; static readonly apiBase = "/apis/autoscaling/v2beta1/horizontalpodautoscalers"; diff --git a/src/common/k8s-api/endpoints/ingress.api.ts b/src/common/k8s-api/endpoints/ingress.api.ts index 0391171e3a..84910d2783 100644 --- a/src/common/k8s-api/endpoints/ingress.api.ts +++ b/src/common/k8s-api/endpoints/ingress.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope, TypedLocalObjectReference } from "../kube-object"; +import type { NamespaceScopedMetadata, TypedLocalObjectReference } from "../kube-object"; import { KubeObject } from "../kube-object"; import { hasTypedProperty, isString, iter } from "../../utils"; import type { MetricData } from "./metrics.api"; @@ -140,7 +140,11 @@ export interface IngressStatus { }; } -export class Ingress extends KubeObject { +export class Ingress extends KubeObject< + NamespaceScopedMetadata, + IngressStatus, + IngressSpec +> { static readonly kind = "Ingress"; static readonly namespaced = true; static readonly apiBase = "/apis/networking.k8s.io/v1/ingresses"; diff --git a/src/common/k8s-api/endpoints/job.api.ts b/src/common/k8s-api/endpoints/job.api.ts index 252fc13f6e..adc7705af8 100644 --- a/src/common/k8s-api/endpoints/job.api.ts +++ b/src/common/k8s-api/endpoints/job.api.ts @@ -7,7 +7,7 @@ import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import { metricsApi } from "./metrics.api"; import type { PodContainer, PodMetricData, PodSpec } from "./pod.api"; -import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object"; +import type { KubeObjectStatus, LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; export interface JobSpec { @@ -38,7 +38,11 @@ export interface JobStatus extends KubeObjectStatus { succeeded: number; } -export class Job extends KubeObject { +export class Job extends KubeObject< + NamespaceScopedMetadata, + JobStatus, + JobSpec +> { static readonly kind = "Job"; static readonly namespaced = true; static readonly apiBase = "/apis/batch/v1/jobs"; diff --git a/src/common/k8s-api/endpoints/limit-range.api.ts b/src/common/k8s-api/endpoints/limit-range.api.ts index 704ae85b48..5ed0974edc 100644 --- a/src/common/k8s-api/endpoints/limit-range.api.ts +++ b/src/common/k8s-api/endpoints/limit-range.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope } from "../kube-object"; +import type { NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -39,7 +39,11 @@ export interface LimitRangeSpec { limits: LimitRangeItem[]; } -export class LimitRange extends KubeObject { +export class LimitRange extends KubeObject< + NamespaceScopedMetadata, + void, + LimitRangeSpec +> { static readonly kind = "LimitRange"; static readonly namespaced = true; static readonly apiBase = "/api/v1/limitranges"; diff --git a/src/common/k8s-api/endpoints/namespace.api.ts b/src/common/k8s-api/endpoints/namespace.api.ts index b95245f712..6a2c7e2a95 100644 --- a/src/common/k8s-api/endpoints/namespace.api.ts +++ b/src/common/k8s-api/endpoints/namespace.api.ts @@ -5,7 +5,7 @@ import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; -import type { KubeObjectScope, KubeObjectStatus } from "../kube-object"; +import type { ClusterScopedMetadata, KubeObjectStatus } from "../kube-object"; import { KubeObject } from "../kube-object"; import { metricsApi } from "./metrics.api"; import type { PodMetricData } from "./pod.api"; @@ -23,7 +23,11 @@ export interface NamespaceStatus extends KubeObjectStatus { phase?: string; } -export class Namespace extends KubeObject { +export class Namespace extends KubeObject< + ClusterScopedMetadata, + NamespaceStatus, + NamespaceSpec +> { static readonly kind = "Namespace"; static readonly namespaced = false; static readonly apiBase = "/api/v1/namespaces"; diff --git a/src/common/k8s-api/endpoints/network-policy.api.ts b/src/common/k8s-api/endpoints/network-policy.api.ts index 0a369cfb94..518874f7aa 100644 --- a/src/common/k8s-api/endpoints/network-policy.api.ts +++ b/src/common/k8s-api/endpoints/network-policy.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope, LabelSelector } from "../kube-object"; +import type { LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -99,11 +99,11 @@ export interface NetworkPolicySpec { egress?: IPolicyEgress[]; } -export interface NetworkPolicy { - spec: NetworkPolicySpec; -} - -export class NetworkPolicy extends KubeObject { +export class NetworkPolicy extends KubeObject< + NamespaceScopedMetadata, + void, + NetworkPolicySpec +> { static readonly kind = "NetworkPolicy"; static readonly namespaced = true; static readonly apiBase = "/apis/networking.k8s.io/v1/networkpolicies"; diff --git a/src/common/k8s-api/endpoints/node.api.ts b/src/common/k8s-api/endpoints/node.api.ts index a51db59fa7..15da73311b 100644 --- a/src/common/k8s-api/endpoints/node.api.ts +++ b/src/common/k8s-api/endpoints/node.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { BaseKubeObjectCondition, KubeObjectScope } from "../kube-object"; +import type { BaseKubeObjectCondition, ClusterScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import { cpuUnitsToNumber, unitsToBytes, isObject } from "../../../renderer/utils"; import type { MetricData } from "./metrics.api"; @@ -176,7 +176,11 @@ export interface NodeStatus { volumesAttached?: AttachedVolume[]; } -export class Node extends KubeObject { +export class Node extends KubeObject< + ClusterScopedMetadata, + NodeStatus, + NodeSpec +> { static readonly kind = "Node"; static readonly namespaced = false; static readonly apiBase = "/api/v1/nodes"; diff --git a/src/common/k8s-api/endpoints/persistent-volume-claim.api.ts b/src/common/k8s-api/endpoints/persistent-volume-claim.api.ts index 947aeb4e57..733a9768c5 100644 --- a/src/common/k8s-api/endpoints/persistent-volume-claim.api.ts +++ b/src/common/k8s-api/endpoints/persistent-volume-claim.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope, LabelSelector, TypedLocalObjectReference } from "../kube-object"; +import type { LabelSelector, NamespaceScopedMetadata, TypedLocalObjectReference } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { MetricData } from "./metrics.api"; import { metricsApi } from "./metrics.api"; @@ -53,7 +53,11 @@ export interface PersistentVolumeClaimStatus { phase: string; // Pending } -export class PersistentVolumeClaim extends KubeObject { +export class PersistentVolumeClaim extends KubeObject< + NamespaceScopedMetadata, + PersistentVolumeClaimStatus, + PersistentVolumeClaimSpec +> { static readonly kind = "PersistentVolumeClaim"; static readonly namespaced = true; static readonly apiBase = "/api/v1/persistentvolumeclaims"; diff --git a/src/common/k8s-api/endpoints/persistent-volume.api.ts b/src/common/k8s-api/endpoints/persistent-volume.api.ts index 71ec288f85..3524f6a606 100644 --- a/src/common/k8s-api/endpoints/persistent-volume.api.ts +++ b/src/common/k8s-api/endpoints/persistent-volume.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope, LabelSelector, ObjectReference, TypedLocalObjectReference } from "../kube-object"; +import type { ClusterScopedMetadata, LabelSelector, ObjectReference, TypedLocalObjectReference } from "../kube-object"; import { KubeObject } from "../kube-object"; import { unitsToBytes } from "../../utils"; import type { DerivedKubeApiOptions } from "../kube-api"; @@ -64,7 +64,11 @@ export interface PersistentVolumeStatus { reason?: string; } -export class PersistentVolume extends KubeObject { +export class PersistentVolume extends KubeObject< + ClusterScopedMetadata, + PersistentVolumeStatus, + PersistentVolumeSpec +> { static kind = "PersistentVolume"; static namespaced = false; static apiBase = "/api/v1/persistentvolumes"; diff --git a/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts b/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts index 9acd55c71a..169efc9b70 100644 --- a/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts +++ b/src/common/k8s-api/endpoints/pod-disruption-budget.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope, LabelSelector } from "../kube-object"; +import type { LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -21,7 +21,11 @@ export interface PodDisruptionBudgetStatus { expectedPods: number; } -export class PodDisruptionBudget extends KubeObject { +export class PodDisruptionBudget extends KubeObject< + NamespaceScopedMetadata, + PodDisruptionBudgetStatus, + PodDisruptionBudgetSpec +> { static readonly kind = "PodDisruptionBudget"; static readonly namespaced = true; static readonly apiBase = "/apis/policy/v1beta1/poddisruptionbudgets"; diff --git a/src/common/k8s-api/endpoints/pod-metrics.api.ts b/src/common/k8s-api/endpoints/pod-metrics.api.ts index cdbe99417b..6db15dd6b7 100644 --- a/src/common/k8s-api/endpoints/pod-metrics.api.ts +++ b/src/common/k8s-api/endpoints/pod-metrics.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -25,7 +25,11 @@ export interface PodMetricsContainer { usage: PodMetricsContainerUsage; } -export class PodMetrics extends KubeObject { +export class PodMetrics extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static readonly kind = "PodMetrics"; static readonly namespaced = true; static readonly apiBase = "/apis/metrics.k8s.io/v1beta1/pods"; diff --git a/src/common/k8s-api/endpoints/pod-security-policy.api.ts b/src/common/k8s-api/endpoints/pod-security-policy.api.ts index 0430391a01..9655fb70a1 100644 --- a/src/common/k8s-api/endpoints/pod-security-policy.api.ts +++ b/src/common/k8s-api/endpoints/pod-security-policy.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope } from "../kube-object"; +import type { ClusterScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -80,7 +80,11 @@ export interface PodSecurityPolicySpec { volumes?: string[]; } -export class PodSecurityPolicy extends KubeObject { +export class PodSecurityPolicy extends KubeObject< + ClusterScopedMetadata, + void, + PodSecurityPolicySpec +> { static readonly kind = "PodSecurityPolicy"; static readonly namespaced = false; static readonly apiBase = "/apis/policy/v1beta1/podsecuritypolicies"; diff --git a/src/common/k8s-api/endpoints/pod.api.ts b/src/common/k8s-api/endpoints/pod.api.ts index fbacf4fb07..98ea47b270 100644 --- a/src/common/k8s-api/endpoints/pod.api.ts +++ b/src/common/k8s-api/endpoints/pod.api.ts @@ -8,7 +8,7 @@ import { metricsApi } from "./metrics.api"; import type { DerivedKubeApiOptions, IgnoredKubeApiOptions, ResourceDescriptor } from "../kube-api"; import { KubeApi } from "../kube-api"; import type { RequireExactlyOne } from "type-fest"; -import type { KubeObjectMetadata, LocalObjectReference, Affinity, Toleration, LabelSelector, KubeObjectScope } from "../kube-object"; +import type { KubeObjectMetadata, LocalObjectReference, Affinity, Toleration, LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import type { SecretReference } from "./secret.api"; import type { PersistentVolumeClaimSpec } from "./persistent-volume-claim.api"; import { KubeObject } from "../kube-object"; @@ -776,7 +776,11 @@ export interface PodStatus { reason?: string; } -export class Pod extends KubeObject { +export class Pod extends KubeObject< + NamespaceScopedMetadata, + PodStatus, + PodSpec +> { static kind = "Pod"; static namespaced = true; static apiBase = "/api/v1/pods"; diff --git a/src/common/k8s-api/endpoints/replica-set.api.ts b/src/common/k8s-api/endpoints/replica-set.api.ts index 2ad571d4e9..ea3cdc25b9 100644 --- a/src/common/k8s-api/endpoints/replica-set.api.ts +++ b/src/common/k8s-api/endpoints/replica-set.api.ts @@ -7,7 +7,7 @@ import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import { metricsApi } from "./metrics.api"; import type { PodMetricData } from "./pod.api"; -import type { KubeObjectScope, KubeObjectStatus, LabelSelector } from "../kube-object"; +import type { KubeObjectStatus, LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { PodTemplateSpec } from "./types/pod-template-spec"; @@ -73,7 +73,11 @@ export interface ReplicaSetStatus extends KubeObjectStatus { observedGeneration?: number; } -export class ReplicaSet extends KubeObject { +export class ReplicaSet extends KubeObject< + NamespaceScopedMetadata, + ReplicaSetStatus, + ReplicaSetSpec +> { static kind = "ReplicaSet"; static namespaced = true; static apiBase = "/apis/apps/v1/replicasets"; diff --git a/src/common/k8s-api/endpoints/resource-quota.api.ts b/src/common/k8s-api/endpoints/resource-quota.api.ts index b9af4ad8d7..b0ad18fed9 100644 --- a/src/common/k8s-api/endpoints/resource-quota.api.ts +++ b/src/common/k8s-api/endpoints/resource-quota.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope } from "../kube-object"; +import type { NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -50,7 +50,11 @@ export interface ResourceQuotaStatus { used: IResourceQuotaValues; } -export class ResourceQuota extends KubeObject { +export class ResourceQuota extends KubeObject< + NamespaceScopedMetadata, + ResourceQuotaStatus, + ResourceQuotaSpec +> { static readonly kind = "ResourceQuota"; static readonly namespaced = true; static readonly apiBase = "/api/v1/resourcequotas"; diff --git a/src/common/k8s-api/endpoints/role-binding.api.ts b/src/common/k8s-api/endpoints/role-binding.api.ts index acc30fe62e..20620fcf39 100644 --- a/src/common/k8s-api/endpoints/role-binding.api.ts +++ b/src/common/k8s-api/endpoints/role-binding.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -16,7 +16,11 @@ export interface RoleBindingData extends KubeJsonApiData { +export class RoleBinding extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static readonly kind = "RoleBinding"; static readonly namespaced = true; static readonly apiBase = "/apis/rbac.authorization.k8s.io/v1/rolebindings"; diff --git a/src/common/k8s-api/endpoints/role.api.ts b/src/common/k8s-api/endpoints/role.api.ts index a98c580088..23bee908ba 100644 --- a/src/common/k8s-api/endpoints/role.api.ts +++ b/src/common/k8s-api/endpoints/role.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -14,7 +14,11 @@ export interface RoleData extends KubeJsonApiData { +export class Role extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static readonly kind = "Role"; static readonly namespaced = true; static readonly apiBase = "/apis/rbac.authorization.k8s.io/v1/roles"; diff --git a/src/common/k8s-api/endpoints/secret.api.ts b/src/common/k8s-api/endpoints/secret.api.ts index 8a71d914cd..ff6b0ff845 100644 --- a/src/common/k8s-api/endpoints/secret.api.ts +++ b/src/common/k8s-api/endpoints/secret.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { KubeJsonApiData } from "../kube-json-api"; import { autoBind } from "../../utils"; @@ -42,7 +42,11 @@ export interface SecretData extends KubeJsonApiData>; } -export class Secret extends KubeObject { +export class Secret extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static readonly kind = "Secret"; static readonly namespaced = true; static readonly apiBase = "/api/v1/secrets"; diff --git a/src/common/k8s-api/endpoints/service-account.api.ts b/src/common/k8s-api/endpoints/service-account.api.ts index 1f3439d29f..01bc31dc64 100644 --- a/src/common/k8s-api/endpoints/service-account.api.ts +++ b/src/common/k8s-api/endpoints/service-account.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectMetadata, KubeObjectScope, LocalObjectReference, ObjectReference } from "../kube-object"; +import type { KubeObjectMetadata, KubeObjectScope, LocalObjectReference, NamespaceScopedMetadata, ObjectReference } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -15,7 +15,11 @@ export interface ServiceAccountData extends KubeJsonApiData { +export class ServiceAccount extends KubeObject< + NamespaceScopedMetadata, + void, + void +> { static readonly kind = "ServiceAccount"; static readonly namespaced = true; static readonly apiBase = "/api/v1/serviceaccounts"; diff --git a/src/common/k8s-api/endpoints/service.api.ts b/src/common/k8s-api/endpoints/service.api.ts index 47c655e15f..302ad3556d 100644 --- a/src/common/k8s-api/endpoints/service.api.ts +++ b/src/common/k8s-api/endpoints/service.api.ts @@ -3,7 +3,7 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import type { KubeObjectScope } from "../kube-object"; +import type { NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -60,7 +60,11 @@ export interface ServiceStatus { }; } -export class Service extends KubeObject { +export class Service extends KubeObject< + NamespaceScopedMetadata, + ServiceStatus, + ServiceSpec +> { static readonly kind = "Service"; static readonly namespaced = true; static readonly apiBase = "/api/v1/services"; diff --git a/src/common/k8s-api/endpoints/stateful-set.api.ts b/src/common/k8s-api/endpoints/stateful-set.api.ts index 2e263d03bf..f6e36c36fb 100644 --- a/src/common/k8s-api/endpoints/stateful-set.api.ts +++ b/src/common/k8s-api/endpoints/stateful-set.api.ts @@ -7,7 +7,7 @@ import type { DerivedKubeApiOptions, IgnoredKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; import { metricsApi } from "./metrics.api"; import type { PodMetricData } from "./pod.api"; -import type { KubeObjectScope, LabelSelector } from "../kube-object"; +import type { LabelSelector, NamespaceScopedMetadata } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { PodTemplateSpec } from "./types/pod-template-spec"; import type { PersistentVolumeClaimTemplateSpec } from "./types/persistent-volume-claim-template-spec"; @@ -81,7 +81,11 @@ export interface StatefulSetStatus { collisionCount: number; } -export class StatefulSet extends KubeObject { +export class StatefulSet extends KubeObject< + NamespaceScopedMetadata, + StatefulSetStatus, + StatefulSetSpec +> { static readonly kind = "StatefulSet"; static readonly namespaced = true; static readonly apiBase = "/apis/apps/v1/statefulsets"; diff --git a/src/common/k8s-api/endpoints/storage-class.api.ts b/src/common/k8s-api/endpoints/storage-class.api.ts index 2ded77d746..ff3b233ce5 100644 --- a/src/common/k8s-api/endpoints/storage-class.api.ts +++ b/src/common/k8s-api/endpoints/storage-class.api.ts @@ -4,7 +4,7 @@ */ import { autoBind } from "../../utils"; -import type { KubeObjectMetadata, KubeObjectScope } from "../kube-object"; +import type { ClusterScopedMetadata, KubeObjectMetadata, KubeObjectScope } from "../kube-object"; import { KubeObject } from "../kube-object"; import type { DerivedKubeApiOptions } from "../kube-api"; import { KubeApi } from "../kube-api"; @@ -29,7 +29,11 @@ export interface StorageClassData extends KubeJsonApiData { +export class StorageClass extends KubeObject< + ClusterScopedMetadata, + void, + void +> { static readonly kind = "StorageClass"; static readonly namespaced = false; static readonly apiBase = "/apis/storage.k8s.io/v1/storageclasses"; diff --git a/src/common/k8s-api/kube-api.ts b/src/common/k8s-api/kube-api.ts index 4a487b82d3..5427b22159 100644 --- a/src/common/k8s-api/kube-api.ts +++ b/src/common/k8s-api/kube-api.ts @@ -10,7 +10,7 @@ import { stringify } from "querystring"; import { apiKubePrefix, isDevelopment } from "../../common/vars"; import { apiBase, apiKube } from "./index"; import { createKubeApiURL, parseKubeApi } from "./kube-api-parse"; -import type { KubeObjectConstructor, KubeJsonApiDataFor, KubeObjectMetadata, KubeObjectScope } from "./kube-object"; +import type { KubeObjectConstructor, KubeJsonApiDataFor, KubeObjectMetadata } from "./kube-object"; import { KubeObject, KubeStatus, isKubeStatusData } from "./kube-object"; import byline from "byline"; import type { IKubeWatchEvent } from "./kube-watch-event"; @@ -32,7 +32,7 @@ import autoRegistrationEmitterInjectable from "./api-manager/auto-registration-e /** * The options used for creating a `KubeApi` */ -export interface KubeApiOptions, Data extends KubeJsonApiDataFor = KubeJsonApiDataFor> extends DerivedKubeApiOptions { +export interface KubeApiOptions = KubeJsonApiDataFor> extends DerivedKubeApiOptions { /** * base api-path for listing all resources, e.g. "/api/v1/pods" * @@ -171,7 +171,7 @@ export interface IRemoteKubeApiConfig { }; /** * Custom instance of https.agent to use for the requests - * + * * @remarks the custom agent replaced default agent, options skipTLSVerify, * clientCertificateData, clientKeyData and caData are ignored. */ @@ -179,17 +179,17 @@ export interface IRemoteKubeApiConfig { } export function forCluster< - Object extends KubeObject, + Object extends KubeObject, Api extends KubeApi, Data extends KubeJsonApiDataFor, >(cluster: ILocalKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass: new (apiOpts: KubeApiOptions) => Api): Api; export function forCluster< - Object extends KubeObject, + Object extends KubeObject, Data extends KubeJsonApiDataFor, >(cluster: ILocalKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass?: new (apiOpts: KubeApiOptions) => KubeApi): KubeApi; export function forCluster< - Object extends KubeObject, + Object extends KubeObject, Data extends KubeJsonApiDataFor, >(cluster: ILocalKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass: (new (apiOpts: KubeApiOptions) => KubeApi) = KubeApi): KubeApi { const url = new URL(apiBase.config.serverAddress); @@ -210,17 +210,17 @@ export function forCluster< } export function forRemoteCluster< - Object extends KubeObject, + Object extends KubeObject, Api extends KubeApi, Data extends KubeJsonApiDataFor, >(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass: new (apiOpts: KubeApiOptions) => Api): Api; export function forRemoteCluster< - Object extends KubeObject, + Object extends KubeObject, Data extends KubeJsonApiDataFor, >(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass?: new (apiOpts: KubeApiOptions) => KubeApi): KubeApi; export function forRemoteCluster< - Object extends KubeObject, + Object extends KubeObject, Api extends KubeApi, Data extends KubeJsonApiDataFor, >(config: IRemoteKubeApiConfig, kubeClass: KubeObjectConstructor, apiClass: new (apiOpts: KubeApiOptions) => KubeApi = KubeApi): KubeApi { @@ -277,7 +277,7 @@ export function forRemoteCluster< export type KubeApiWatchCallback = (data: IKubeWatchEvent, error: any) => void; -export interface KubeApiWatchOptions, Data extends KubeJsonApiDataFor> { +export interface KubeApiWatchOptions> { namespace: string; callback?: KubeApiWatchCallback; abortController?: AbortController; diff --git a/src/common/k8s-api/kube-object.store.ts b/src/common/k8s-api/kube-object.store.ts index 855e1a1315..8634e222ac 100644 --- a/src/common/k8s-api/kube-object.store.ts +++ b/src/common/k8s-api/kube-object.store.ts @@ -83,6 +83,8 @@ export type KubeApiDataFrom = A extends KubeApi = KubeApi>, @@ -90,7 +92,7 @@ export abstract class KubeObjectStore< > extends ItemStore { static readonly defaultContext = observable.box(); // TODO: support multiple cluster contexts - public readonly api: A; + public readonly api!: A; public readonly limit: number | undefined; public readonly bufferSize: number; @observable private loadedNamespaces: string[] | undefined = undefined; @@ -103,9 +105,18 @@ export abstract class KubeObjectStore< return when(() => Boolean(this.loadedNamespaces)); } - constructor(api: A, opts?: KubeObjectStoreOptions) { + constructor(api: A, opts?: KubeObjectStoreOptions); + /** + * @deprecated Supply API instance through constructor + */ + constructor(); + constructor(api?: A, opts?: KubeObjectStoreOptions) { super(); - this.api = api; + + if (api) { + this.api = api; + } + this.limit = opts?.limit; this.bufferSize = opts?.bufferSize ?? 50_000; @@ -376,7 +387,7 @@ export abstract class KubeObjectStore< return newItem; } - async patch(item: K, patch: Patch): Promise { + async patch(item: K, patch: JsonPatch): Promise { const rawItem = await this.api.patch( { name: item.getName(), namespace: item.getNs(), diff --git a/src/common/k8s-api/kube-object.ts b/src/common/k8s-api/kube-object.ts index 3431c6fcd2..0851729bc7 100644 --- a/src/common/k8s-api/kube-object.ts +++ b/src/common/k8s-api/kube-object.ts @@ -15,8 +15,8 @@ import type { Patch } from "rfc6902"; import assert from "assert"; import type { JsonObject } from "type-fest"; -export type KubeJsonApiDataFor = K extends KubeObject - ? KubeJsonApiData, Status, Spec> +export type KubeJsonApiDataFor = K extends KubeObject + ? KubeJsonApiData : never; export interface KubeObjectConstructorData { @@ -25,7 +25,7 @@ export interface KubeObjectConstructorData { readonly apiBase?: string; } -export type KubeObjectConstructor, Data> = (new (data: Data) => K) & KubeObjectConstructorData; +export type KubeObjectConstructor = (new (data: Data) => K) & KubeObjectConstructorData; export interface OwnerReference { apiVersion: string; @@ -199,9 +199,11 @@ export interface BaseKubeJsonApiObjectMetadata = Namespaced extends KubeObjectScope.Namespace - ? BaseKubeJsonApiObjectMetadata & { readonly namespace: string } - : BaseKubeJsonApiObjectMetadata; +export type KubeJsonApiObjectMetadata = BaseKubeJsonApiObjectMetadata & ( + Namespaced extends KubeObjectScope.Namespace + ? { readonly namespace: string } + : {} +); export type KubeObjectMetadata = KubeJsonApiObjectMetadata & { readonly selfLink: string; @@ -210,6 +212,9 @@ export type KubeObjectMetadata; +export type ClusterScopedMetadata = KubeObjectMetadata; + export interface KubeStatusData { kind: string; apiVersion: string; @@ -371,9 +376,9 @@ export type ScopedNamespace = ( ); export class KubeObject< + Metadata extends KubeObjectMetadata = KubeObjectMetadata, Status = unknown, Spec = unknown, - Namespaced extends KubeObjectScope = KubeObjectScope, > implements ItemObject { static readonly kind?: string; static readonly namespaced?: boolean; @@ -381,7 +386,7 @@ export class KubeObject< apiVersion!: string; kind!: string; - metadata!: KubeObjectMetadata; + metadata!: Metadata; status?: Status; spec!: Spec; @@ -393,7 +398,7 @@ export class KubeObject< return new KubeObject(data); } - static isNonSystem(item: KubeJsonApiData | KubeObject) { + static isNonSystem(item: KubeJsonApiData | KubeObject, unknown, unknown>) { return !item.metadata.name?.startsWith("system:"); } @@ -488,7 +493,7 @@ export class KubeObject< ...KubeObject.nonEditablePathPrefixes, ]); - constructor(data: KubeJsonApiData, Status, Spec>) { + constructor(data: KubeJsonApiData) { if (typeof data !== "object") { throw new TypeError(`Cannot create a KubeObject from ${typeof data}`); } @@ -524,7 +529,7 @@ export class KubeObject< return this.metadata.name; } - getNs(): ScopedNamespace { + getNs(): Metadata["namespace"] { // avoid "null" serialization via JSON.stringify when post data return (this.metadata.namespace || undefined) as never; } diff --git a/src/extensions/common-api/k8s-api.ts b/src/extensions/common-api/k8s-api.ts index b79f4c92f4..31977834a0 100644 --- a/src/extensions/common-api/k8s-api.ts +++ b/src/extensions/common-api/k8s-api.ts @@ -25,14 +25,22 @@ export { export { KubeObject, KubeStatus, + type OwnerReference, type KubeObjectMetadata, + type NamespaceScopedMetadata, + type ClusterScopedMetadata, type BaseKubeJsonApiObjectMetadata, type KubeJsonApiObjectMetadata, type KubeStatusData, } from "../../common/k8s-api/kube-object"; +export { + type KubeJsonApiData, +} from "../../common/k8s-api/kube-json-api"; + export { KubeObjectStore, + type JsonPatch, type KubeObjectStoreLoadAllParams, type KubeObjectStoreLoadingParams, type KubeObjectStoreSubscribeParams, diff --git a/src/renderer/components/+custom-resources/crd-resource-details.tsx b/src/renderer/components/+custom-resources/crd-resource-details.tsx index 48049682e4..a52d60c7ee 100644 --- a/src/renderer/components/+custom-resources/crd-resource-details.tsx +++ b/src/renderer/components/+custom-resources/crd-resource-details.tsx @@ -16,7 +16,7 @@ import { Input } from "../input"; import type { AdditionalPrinterColumnsV1 } from "../../../common/k8s-api/endpoints/custom-resource-definition.api"; import { CustomResourceDefinition } from "../../../common/k8s-api/endpoints/custom-resource-definition.api"; import { convertKubectlJsonPathToNodeJsonPath } from "../../utils/jsonPath"; -import type { KubeObjectStatus } from "../../../common/k8s-api/kube-object"; +import type { KubeObjectMetadata, KubeObjectStatus } from "../../../common/k8s-api/kube-object"; import { KubeObject } from "../../../common/k8s-api/kube-object"; import logger from "../../../common/logger"; import { JSONPath } from "@astronautlabs/jsonpath"; @@ -71,7 +71,8 @@ export class CustomResourceDetails extends React.Component, columns: AdditionalPrinterColumnsV1[]) { + renderStatus(cr: KubeObject, columns: AdditionalPrinterColumnsV1[]) { + const customResource = cr as KubeObject; const showStatus = !columns.find(column => column.name == "Status") && Array.isArray(customResource.status?.conditions); if (!showStatus) { diff --git a/src/renderer/components/+workloads-pods/store.ts b/src/renderer/components/+workloads-pods/store.ts index acff1edbce..54adec7837 100644 --- a/src/renderer/components/+workloads-pods/store.ts +++ b/src/renderer/components/+workloads-pods/store.ts @@ -9,7 +9,7 @@ import type { KubeObjectStoreOptions } from "../../../common/k8s-api/kube-object import { KubeObjectStore } from "../../../common/k8s-api/kube-object.store"; import { cpuUnitsToNumber, unitsToBytes } from "../../utils"; import type { Pod, PodMetrics, PodApi, PodMetricsApi } from "../../../common/k8s-api/endpoints"; -import type { KubeObject, KubeObjectScope } from "../../../common/k8s-api/kube-object"; +import type { KubeObject, NamespaceScopedMetadata } from "../../../common/k8s-api/kube-object"; export interface PodStoreDependencies { readonly podMetricsApi: PodMetricsApi; @@ -36,7 +36,7 @@ export class PodStore extends KubeObjectStore { } } - getPodsByOwner(workload: KubeObject): Pod[] { + getPodsByOwner(workload: KubeObject): Pod[] { return this.items.filter(pod => ( pod.getOwnerRefs() .find(owner => owner.uid === workload.getId())