Skip to content

Commit

Permalink
migrate k8s utilities to dynamic-plugin-sdk
Browse files Browse the repository at this point in the history
  • Loading branch information
invincibleJai committed Oct 26, 2021
1 parent e93692e commit 7f52d27
Show file tree
Hide file tree
Showing 42 changed files with 764 additions and 383 deletions.
15 changes: 8 additions & 7 deletions frontend/__tests__/actions/k8s.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import { Map as ImmutableMap } from 'immutable';
import * as _ from 'lodash-es';

import * as k8sActions from '../../public/actions/k8s';
import * as k8sResource from '../../public/module/k8s/resource';
import * as k8sResource from '../../public/module/k8s';
import { K8sResourceKind, K8sKind } from '../../public/module/k8s';
import { PodModel, APIServiceModel } from '../../public/models';
import { testResourceInstance } from '../../__mocks__/k8sResourcesMocks';
import * as coFetch from '../../public/co-fetch';
import * as coFetch from '@console/dynamic-plugin-sdk/src/utils/fetch';

describe('watchAPIServices', () => {
const { watchAPIServices } = k8sActions;
Expand Down Expand Up @@ -62,11 +62,12 @@ describe('watchAPIServices', () => {
const getState = jasmine.createSpy('getState').and.returnValue({ k8s: ImmutableMap() });
const dispatch = jasmine.createSpy('dispatch');
spyOn(k8sResource, 'k8sList').and.returnValue(Promise.reject());

spyAndExpect(spyOn(coFetch, 'coFetchJSON'))(Promise.resolve({ groups: [] })).then(([path]) => {
expect(path).toEqual('api/kubernetes/apis');
done();
});
spyAndExpect(spyOn(coFetch, 'consoleFetchJSON'))(Promise.resolve({ groups: [] })).then(
([path]) => {
expect(path).toEqual('api/kubernetes/apis');
done();
},
);

watchAPIServices()(dispatch, getState);
});
Expand Down
70 changes: 1 addition & 69 deletions frontend/__tests__/selector-requirement.spec.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
createEquals,
requirementFromString,
requirementToString,
} from '../public/module/k8s/selector-requirement';
import { requirementFromString } from '../public/module/k8s/selector-requirement';

describe('k8sSelectorRequirement', () => {
describe('#requirementFromString', () => {
Expand Down Expand Up @@ -80,68 +76,4 @@ describe('k8sSelectorRequirement', () => {
expect(requirementFromString(s)).toBeFalsy());
});
});

describe('#requirementToString', () => {
[
{
requirement: { key: 'key1', operator: 'Equals', values: ['value1', 'value2'] },
string: 'key1=value1',
},

{
requirement: { key: 'key1', operator: 'NotEquals', values: ['value1', 'value2'] },
string: 'key1!=value1',
},

{
requirement: { key: 'key1', operator: 'Exists', values: ['value1'] },
string: 'key1',
},

{
requirement: { key: 'key1', operator: 'DoesNotExist', values: ['value1'] },
string: '!key1',
},

{
requirement: { key: 'key1', operator: 'In', values: ['value1', 'value2'] },
string: 'key1 in (value1,value2)',
},

{
requirement: { key: 'key1', operator: 'NotIn', values: ['value1', 'value2'] },
string: 'key1 notin (value1,value2)',
},

{
requirement: { key: 'key1', operator: 'GreaterThan', values: ['666.999'] },
string: 'key1 > 666.999',
},

{
requirement: { key: 'key1', operator: 'LessThan', values: ['666.999'] },
string: 'key1 < 666.999',
},
].forEach((t) => {
it(`returns string for ${JSON.stringify(t.requirement)} requirement`, () => {
expect(requirementToString(t.requirement)).toEqual(t.string);
});
});

it('returns falsy for unknown requirement', () => {
expect(
requirementToString({ key: 'key1', operator: 'Oops!', values: ['value1'] }),
).toBeFalsy();
});
});

describe('#createEquals', () => {
it('returns "Equals" requirement object', () => {
expect(createEquals('Key', 'Value')).toEqual({
key: 'Key',
operator: 'Equals',
values: ['Value'],
});
});
});
});
8 changes: 2 additions & 6 deletions frontend/__tests__/selector.spec.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
import {
fromRequirements,
selectorFromString,
toRequirements,
selectorToString,
} from '../public/module/k8s/selector';
import { fromRequirements, selectorFromString } from '../public/module/k8s/selector';
import { selectorToString, toRequirements } from '@console/dynamic-plugin-sdk/src/utils/k8s';

describe('k8sSelector', () => {
describe('#selectorFromString', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { useDeepCompareMemoize } from '@console/shared';
import { StatusBox } from '@console/internal/components/utils/status-box';
import { BreadCrumbs, history } from '@console/internal/components/utils';
import { Button } from '@patternfly/react-core';
import { k8sCreate } from '@console/internal/module/k8s/resource';
import { k8sCreate } from '@console/internal/module/k8s';
import { Modal } from '@console/shared/src/components/modal';

import { BlockPoolBody } from './body';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { useK8sGet } from '@console/internal/components/utils/k8s-get-hook';
import { apiVersionForModel, ListKind, PodKind } from '@console/internal/module/k8s';
import { PodModel, SecretModel } from '@console/internal/models';
import { getAnnotations } from '@console/shared/src/selectors/common';
import { K8sKind } from 'packages/console-dynamic-plugin-sdk/src';
import { K8sKind } from '@console/dynamic-plugin-sdk/src';
import { RHCSState, CanGoToNextStep, CreatePayload, ExternalComponentProps } from '../types';
import { CEPH_STORAGE_NAMESPACE, IP_FAMILY, OCS_OPERATOR } from '../../../../constants';
import {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
K8sResourceKind,
} from '@console/internal/module/k8s';
import { NodeModel, SecretModel } from '@console/internal/models';
import { K8sKind } from 'packages/console-dynamic-plugin-sdk/src';
import { K8sModel } from '@console/dynamic-plugin-sdk/src';
import { WizardNodeState, WizardState } from './reducer';
import { Payload } from './external-storage/types';
import {
Expand Down Expand Up @@ -116,7 +116,7 @@ export const labelNodes = async (nodes: WizardNodeState[]) => {
value: '',
},
];
const requests: Promise<K8sKind>[] = [];
const requests: Promise<K8sModel>[] = [];
nodes.forEach((node) => {
if (!node.labels?.[cephStorageLabel])
requests.push(k8sPatchByName(NodeModel, node.name, null, patch));
Expand All @@ -132,7 +132,7 @@ export const createExternalSubSystem = async (subSystemPayloads: Payload[]) => {
try {
await Promise.all(
subSystemPayloads.map(async (payload) =>
k8sCreate(payload.model as K8sKind, payload.payload),
k8sCreate(payload.model as K8sModel, payload.payload),
),
);
} catch (err) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as React from 'react';
import * as _ from 'lodash';
import { K8sResourceKind, ConfigMapKind, SecretKind } from '@console/internal/module/k8s/types';
import { k8sCreate, k8sPatch } from '@console/internal/module/k8s/resource';
import { k8sCreate, k8sPatch } from '@console/internal/module/k8s';
import { ConfigMapModel, SecretModel } from '@console/internal/models';
import {
CEPH_STORAGE_NAMESPACE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import {
HandlePromiseProps,
withHandlePromise,
} from '@console/internal/components/utils/promise-component';
import { k8sCreate } from '@console/internal/module/k8s/resource';
import { referenceForModel } from '@console/internal/module/k8s';
import { k8sCreate, referenceForModel } from '@console/internal/module/k8s';
import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';
import { WatchK8sResource } from '@console/dynamic-plugin-sdk';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { TFunction } from 'i18next';
import { K8sKind } from '@console/dynamic-plugin-sdk';
import { K8sModel } from '@console/dynamic-plugin-sdk';
import { referenceForModel } from '@console/internal/module/k8s';
import { Kebab } from '@console/internal/components/utils';
import { addSSCapacityModal } from '../modals/add-capacity-modal/add-capacity-modal';
import { OCSServiceModel } from '../../models';
import { StorageSystemKind } from '../../types';

const addStorage = (kind: K8sKind, resource: StorageSystemKind, _, customData) => {
const addStorage = (kind: K8sModel, resource: StorageSystemKind, _, customData) => {
const t: TFunction = customData?.tFunction;
return {
labelKey: t('ceph-storage-plugin~Add Capacity'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { act } from 'react-dom/test-utils';
// @ts-ignore: FIXME missing exports due to out-of-sync @types/react-redux version
import { useDispatch } from 'react-redux';
import { useLocation } from 'react-router-dom';
import { k8sGet } from '@console/internal/module/k8s';
import { k8sGet } from '@console/dynamic-plugin-sdk/src/utils/k8s';
import { ALL_NAMESPACES_KEY } from '@console/shared/src/constants';
import { useFlag } from '@console/shared/src/hooks/flag';
import { testHook } from '../../../../../../__tests__/utils/hooks-utils';
Expand All @@ -26,7 +26,7 @@ jest.mock('@console/shared/src/hooks/flag', () => ({
useFlag: jest.fn(),
}));

jest.mock('@console/internal/module/k8s/resource', () => ({
jest.mock('@console/dynamic-plugin-sdk/src/utils/k8s', () => ({
k8sGet: jest.fn(),
}));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export type ExtensionK8sKindVersionModel = {
kind: string;
};

export type K8sKind = {
export type K8sModel = {
abbr: string;
kind: string;
label: string;
Expand Down Expand Up @@ -59,18 +59,35 @@ export type K8sKind = {
legacyPluralURL?: boolean;
};

type MatchExpression = {
/**
* @deprecated migrated to new type K8sModel, use K8sModel over K8sKind
*/
export type K8sKind = K8sModel;

export enum Operator {
Exists = 'Exists',
DoesNotExist = 'DoesNotExist',
In = 'In',
NotIn = 'NotIn',
Equals = 'Equals',
NotEqual = 'NotEqual',
GreaterThan = 'GreaterThan',
LessThan = 'LessThan',
NotEquals = 'NotEquals',
}

export type MatchExpression = {
key: string;
operator: 'Exists' | 'DoesNotExist' | 'In' | 'NotIn' | 'Equals' | 'NotEqual';
operator: Operator | string;
values?: string[];
value?: string;
};

type MatchLabels = {
export type MatchLabels = {
[key: string]: string;
};

type Selector = {
export type Selector = {
matchLabels?: MatchLabels;
matchExpressions?: MatchExpression[];
};
Expand Down
13 changes: 13 additions & 0 deletions frontend/packages/console-dynamic-plugin-sdk/src/api/core-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {
UseK8sModels,
UseActivePerspective,
} from '../extensions/console-types';
import { K8sGet, K8sCreate, K8sUpdate, K8sPatch, K8sDelete, K8sList } from './k8s-types';

export const useK8sWatchResource: UseK8sWatchResource = require('@console/internal/components/utils/k8s-watch-hook')
.useK8sWatchResource;
Expand Down Expand Up @@ -87,3 +88,15 @@ export const useK8sModel: UseK8sModel = require('@console/shared/src/hooks/useK8
.useK8sModel;
export const useK8sModels: UseK8sModels = require('@console/shared/src/hooks/useK8sModels')
.useK8sModels;

// Expose K8s CRUD utilities as below
export const k8sGet: K8sGet = require('@console/dynamic-plugin-sdk/src/utils/k8s').k8sGetResource;
export const k8sCreate: K8sCreate = require('@console/dynamic-plugin-sdk/src/utils/k8s')
.k8sCreateResource;
export const k8sUpdate: K8sUpdate = require('@console/dynamic-plugin-sdk/src/utils/k8s')
.k8sUpdateResource;
export const k8sPatch: K8sPatch = require('@console/dynamic-plugin-sdk/src/utils/k8s').k8sPatch;
export const k8sDelete: K8sDelete = require('@console/dynamic-plugin-sdk/src/utils/k8s')
.k8sDeleteResource;
export const k8sList: K8sList = require('@console/dynamic-plugin-sdk/src/utils/k8s')
.k8sListResource;
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import {
PrometheusResponse,
HealthState,
StatusGroupMapper,
QueryParams,
} from '../extensions/console-types';
import { K8sKind, Alert } from './common-types';
import { K8sModel, Alert } from './common-types';

type WithClassNameProps<R = {}> = R & {
className?: string;
Expand Down Expand Up @@ -83,7 +84,7 @@ export type ResourceInventoryItemProps = {
resources: K8sResourceCommon[];
additionalResources?: { [key: string]: [] };
mapper?: StatusGroupMapper;
kind: K8sKind;
kind: K8sModel;
isLoading: boolean;
namespace?: string;
error: boolean;
Expand Down Expand Up @@ -224,3 +225,10 @@ type PrometheusPollProps = {
};

export type UsePrometheusPoll = (props: PrometheusPollProps) => [PrometheusResponse, any, boolean];

export type Options = {
ns?: string;
name?: string;
path?: string;
queryParams?: QueryParams;
};
52 changes: 52 additions & 0 deletions frontend/packages/console-dynamic-plugin-sdk/src/api/k8s-types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { K8sResourceCommon, Patch, QueryParams, Status } from '../extensions/console-types';
import { K8sModel } from './common-types';
import { Options } from './internal-types';

// K8s CRUD utility types to be exposed by dynamic plugin SDK.
export type K8sGet = <R extends K8sResourceCommon>(options: {
model: K8sModel;
name: string;
ns?: string;
path?: string;
queryParams?: QueryParams;
requestInit?: RequestInit;
}) => Promise<R>;

export type K8sCreate = <R extends K8sResourceCommon>(options: {
model: K8sModel;
data: R;
path?: string;
queryParams?: QueryParams;
}) => Promise<R>;

export type K8sUpdate = <R extends K8sResourceCommon>(options: {
model: K8sModel;
data: R;
path?: string;
queryParams?: QueryParams;
}) => Promise<R>;

export type K8sPatch = <R extends K8sResourceCommon>(options: {
model: K8sModel;
resource: R;
data: Patch[];
path?: string;
queryParams?: QueryParams;
}) => Promise<R>;

export type K8sDelete = <R extends K8sResourceCommon>(options: {
model: K8sModel;
resource: R;
path?: string;
queryParams?: QueryParams;
requestInit: RequestInit;
json: Record<string, any>;
}) => Promise<Status>;

export type K8sList = <R extends K8sResourceCommon>(options: {
model: K8sModel;
queryParams: { [key: string]: any };
requestInit: RequestInit;
}) => Promise<R[]>;

export type GetK8sResourcePath = (model: K8sModel, options: Options) => string;
Loading

0 comments on commit 7f52d27

Please sign in to comment.