import get from "lodash/get"; import { autobind } from "../../utils"; import { WorkloadKubeObject } from "../workload-kube-object"; import { IPodContainer, IPodMetrics, Pod } from "./pods.api"; import { KubeApi } from "../kube-api"; import { metricsApi } from "./metrics.api"; export class ReplicaSetApi extends KubeApi { protected getScaleApiUrl(params: { namespace: string; name: string }) { return `${this.getUrl(params)}/scale`; } getReplicas(params: { namespace: string; name: string }): Promise { return this.request .get(this.getScaleApiUrl(params)) .then(({ status }: any) => status?.replicas); } scale(params: { namespace: string; name: string }, replicas: number) { return this.request.put(this.getScaleApiUrl(params), { data: { metadata: params, spec: { replicas } } }); } } export function getMetricsForReplicaSets(replicasets: ReplicaSet[], namespace: string, selector = ""): Promise { const podSelector = replicasets.map(replicaset => `${replicaset.getName()}-[[:alnum:]]{5}`).join("|"); const opts = { category: "pods", pods: podSelector, namespace, selector }; return metricsApi.getMetrics({ cpuUsage: opts, memoryUsage: opts, fsUsage: opts, networkReceive: opts, networkTransmit: opts, }, { namespace, }); } @autobind() export class ReplicaSet extends WorkloadKubeObject { static kind = "ReplicaSet"; static namespaced = true; static apiBase = "/apis/apps/v1/replicasets"; spec: { replicas?: number; selector: { matchLabels: { [app: string]: string } }; template?: { metadata: { labels: { app: string; }; }; spec?: Pod["spec"]; }; minReadySeconds?: number; }; status: { replicas: number; fullyLabeledReplicas?: number; readyReplicas?: number; availableReplicas?: number; observedGeneration?: number; conditions?: { type: string; status: string; lastUpdateTime: string; lastTransitionTime: string; reason: string; message: string; }[]; }; getDesired() { return this.spec.replicas || 0; } getCurrent() { return this.status.availableReplicas || 0; } getReady() { return this.status.readyReplicas || 0; } getImages() { const containers: IPodContainer[] = get(this, "spec.template.spec.containers", []); return [...containers].map(container => container.image); } } export const replicaSetApi = new ReplicaSetApi({ objectConstructor: ReplicaSet, });