1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Update CRD api to use preferred version and implement v1 differences

Signed-off-by: Trevor Nichols <trevor@nichols.id.au>
This commit is contained in:
Trevor Nichols 2020-08-20 09:32:20 +10:00 committed by Trevor Nichols
parent 5788c44303
commit b1d15d44fe
5 changed files with 73 additions and 29 deletions

View File

@ -1,13 +1,29 @@
import { KubeObject } from "../kube-object";
import { KubeApi } from "../kube-api";
import { VersionedKubeApi } from "../kube-api-versioned";
import { crdResourcesURL } from "../../components/+custom-resources/crd.route";
type AdditionalPrinterColumnsCommon = {
name: string;
type: "integer" | "number" | "string" | "boolean" | "date";
priority: number;
description: string;
}
type AdditionalPrinterColumnsV1 = AdditionalPrinterColumnsCommon & {
jsonPath: string;
}
type AdditionalPrinterColumnsV1Beta = AdditionalPrinterColumnsCommon & {
JSONPath: string;
}
export class CustomResourceDefinition extends KubeObject {
static kind = "CustomResourceDefinition";
spec: {
group: string;
version: string;
version?: string;
names: {
plural: string;
singular: string;
@ -20,18 +36,13 @@ export class CustomResourceDefinition extends KubeObject {
name: string;
served: boolean;
storage: boolean;
additionalPrinterColumns?: AdditionalPrinterColumnsV1[]
}[];
conversion: {
strategy?: string;
webhook?: any;
};
additionalPrinterColumns?: {
name: string;
type: "integer" | "number" | "string" | "boolean" | "date";
priority: number;
description: string;
JSONPath: string;
}[];
additionalPrinterColumns?: AdditionalPrinterColumnsV1Beta[];
}
status: {
conditions: {
@ -61,8 +72,8 @@ export class CustomResourceDefinition extends KubeObject {
}
getResourceApiBase() {
const { version, group } = this.spec;
return `/apis/${group}/${version}/${this.getPluralName()}`
const { group } = this.spec;
return `/apis/${group}/${this.getVersion()}/${this.getPluralName()}`
}
getPluralName() {
@ -87,7 +98,7 @@ export class CustomResourceDefinition extends KubeObject {
}
getVersion() {
return this.spec.version;
return this.spec.version ?? this.spec.versions.find(a => a.storage)?.name;
}
isNamespaced() {
@ -107,7 +118,9 @@ export class CustomResourceDefinition extends KubeObject {
}
getPrinterColumns(ignorePriority = true) {
const columns = this.spec.additionalPrinterColumns || [];
const columns = this.spec.versions.find(a => this.getVersion() == a.name)?.additionalPrinterColumns
?? this.spec.additionalPrinterColumns?.map(({JSONPath, ...rest}) => ({ ...rest, jsonPath: JSONPath })) // map to V1 shape
?? [];
return columns
.filter(column => column.name != "Age")
.filter(column => ignorePriority ? true : !column.priority);
@ -130,16 +143,10 @@ export class CustomResourceDefinition extends KubeObject {
}
}
export const crdBetaApi = new KubeApi<CustomResourceDefinition>({
kind: CustomResourceDefinition.kind,
apiBase: "/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions",
isNamespaced: false,
objectConstructor: CustomResourceDefinition,
});
export const crdApi = new KubeApi<CustomResourceDefinition>({
export const crdApi = new VersionedKubeApi<CustomResourceDefinition>({
kind: CustomResourceDefinition.kind,
apiBase: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions",
isNamespaced: false,
objectConstructor: CustomResourceDefinition,
objectConstructor: CustomResourceDefinition
});

View File

@ -0,0 +1,37 @@
import { stringify } from "querystring";
import { KubeObject } from "./kube-object";
import { createKubeApiURL } from "./kube-api-parse";
import { KubeApi, IKubeApiQueryParams } from "./kube-api";
export class VersionedKubeApi<T extends KubeObject = any> extends KubeApi<T> {
private preferredVersion?: string;
async getPreferredVersion() {
if (this.preferredVersion) return;
const apiGroupVersion = await this.request.get<{ preferredVersion: { version: string; }; }>(`${this.apiPrefix}/${this.apiGroup}`);
this.preferredVersion = apiGroupVersion.preferredVersion.version;
}
async list({ namespace = "" } = {}, query?: IKubeApiQueryParams): Promise<T[]> {
await this.getPreferredVersion();
return await super.list({namespace}, query);
}
async get({ name = "", namespace = "default" } = {}, query?: IKubeApiQueryParams): Promise<T> {
await this.getPreferredVersion();
return super.get({ name, namespace }, query);
}
getUrl({ name = "", namespace = "" } = {}, query?: Partial<IKubeApiQueryParams>) {
const { apiPrefix, apiGroup, apiVersion, apiResource, preferredVersion, isNamespaced } = this;
const resourcePath = createKubeApiURL({
apiPrefix: apiPrefix,
apiVersion: `${apiGroup}/${preferredVersion ?? apiVersion}`,
resource: apiResource,
namespace: isNamespaced ? namespace : undefined,
name: name,
});
return resourcePath + (query ? `?` + stringify(query) : "");
}
}

View File

@ -102,13 +102,13 @@ export class CRDDetails extends React.Component<Props> {
</TableHead>
{
printerColumns.map((column, index) => {
const { name, type, JSONPath } = column;
const { name, type, jsonPath } = column;
return (
<TableRow key={index}>
<TableCell className="name">{name}</TableCell>
<TableCell className="type">{type}</TableCell>
<TableCell className="json-path">
<Badge label={JSONPath}/>
<Badge label={jsonPath}/>
</TableCell>
</TableRow>
)

View File

@ -57,7 +57,7 @@ export class CrdResourceDetails extends React.Component<Props> {
<KubeObjectMeta object={object}/>
{extraColumns.map(column => {
const { name } = column;
const value = jsonPath.query(object, column.JSONPath.slice(1));
const value = jsonPath.query(object, (column.jsonPath).slice(1));
return (
<DrawerItem key={name} name={name}>
<CrdColumnValue value={value} />

View File

@ -57,7 +57,7 @@ export class CrdResources extends React.Component<Props> {
[sortBy.age]: (item: KubeObject) => item.metadata.creationTimestamp,
}
extraColumns.forEach(column => {
sortingCallbacks[column.name] = (item: KubeObject) => jsonPath.query(item, column.JSONPath.slice(1))
sortingCallbacks[column.name] = (item: KubeObject) => jsonPath.query(item, column.jsonPath.slice(1))
})
// todo: merge extra columns and other params to predefined view
const { List } = apiManager.getViews(crd.getResourceApiBase());
@ -88,9 +88,9 @@ export class CrdResources extends React.Component<Props> {
renderTableContents={(crdInstance: KubeObject) => [
crdInstance.getName(),
isNamespaced && crdInstance.getNs(),
...extraColumns.map(column =>
jsonPath.query(crdInstance, column.JSONPath.slice(1))
),
...extraColumns.map(column => {
return jsonPath.query(crdInstance, (column.jsonPath).slice(1))
}),
crdInstance.getAge(),
]}
renderItemMenu={(item: KubeObject) => {