Skip to content

Commit

Permalink
Migrate workload resource actions to new extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
rohitkrai03 committed Aug 4, 2021
1 parent e12eb74 commit 1e27dfb
Show file tree
Hide file tree
Showing 23 changed files with 563 additions and 129 deletions.
65 changes: 65 additions & 0 deletions frontend/packages/console-app/console-extensions.json
Expand Up @@ -76,5 +76,70 @@
},
"provider": { "$codeRef": "actions.useDeploymentActionsProvider" }
}
},
{
"type": "console.action/resource-provider",
"properties": {
"model": {
"group": "apps.openshift.io",
"version": "v1",
"kind": "DeploymentConfig"
},
"provider": { "$codeRef": "actions.useDeploymentConfigActionsProvider" }
}
},
{
"type": "console.action/resource-provider",
"properties": {
"model": {
"group": "apps",
"version": "v1",
"kind": "StatefulSet"
},
"provider": { "$codeRef": "actions.useStatefulSetActionsProvider" }
}
},
{
"type": "console.action/resource-provider",
"properties": {
"model": {
"group": "apps",
"version": "v1",
"kind": "DaemonSet"
},
"provider": { "$codeRef": "actions.useDaemonSetActionsProvider" }
}
},
{
"type": "console.action/resource-provider",
"properties": {
"model": {
"group": "batch",
"version": "v1",
"kind": "Job"
},
"provider": { "$codeRef": "actions.useJobActionsProvider" }
}
},
{
"type": "console.action/resource-provider",
"properties": {
"model": {
"group": "batch",
"version": "v1beta1",
"kind": "CronJob"
},
"provider": { "$codeRef": "actions.useCronJobActionsProvider" }
}
},
{
"type": "console.action/resource-provider",
"properties": {
"model": {
"version": "v1",
"kind": "Pod"
},
"provider": { "$codeRef": "actions.useCronJobActionsProvider" }
}
}
]
Expand Up @@ -2,10 +2,27 @@ import i18next from 'i18next';
import { Action } from '@console/dynamic-plugin-sdk';
import { configureUpdateStrategyModal, errorModal } from '@console/internal/components/modals';
import { togglePaused, asAccessReview } from '@console/internal/components/utils';
import { K8sResourceKind, K8sKind } from '@console/internal/module/k8s';
import { DeploymentConfigModel } from '@console/internal/models';
import { K8sResourceKind, K8sKind, k8sCreate } from '@console/internal/module/k8s';
import { resourceLimitsModal } from '../../components/modals/resource-limits';
import { ResourceActionFactory } from './common-factory';

const deploymentConfigRollout = (dc: K8sResourceKind): Promise<K8sResourceKind> => {
const req = {
kind: 'DeploymentRequest',
apiVersion: 'apps.openshift.io/v1',
name: dc.metadata.name,
latest: true,
force: true,
};
const opts = {
name: dc.metadata.name,
ns: dc.metadata.namespace,
path: 'instantiate',
};
return k8sCreate(DeploymentConfigModel, req, opts);
};

export const DeploymentActionFactory: ResourceActionFactory = {
EditDeployment: (kind: K8sKind, obj: K8sResourceKind): Action => ({
id: `edit-deployment`,
Expand All @@ -28,7 +45,7 @@ export const DeploymentActionFactory: ResourceActionFactory = {
verb: 'patch',
},
}),
PauseAction: (kind: K8sKind, obj: K8sResourceKind): Action => ({
PauseRollout: (kind: K8sKind, obj: K8sResourceKind): Action => ({
id: 'pause-rollout',
label: obj.spec.paused
? i18next.t('console-app~Resume rollouts')
Expand All @@ -42,6 +59,23 @@ export const DeploymentActionFactory: ResourceActionFactory = {
verb: 'patch',
},
}),
StartDCRollout: (kind: K8sKind, obj: K8sResourceKind): Action => ({
id: 'start-rollout',
label: i18next.t('console-app~Start rollout'),
cta: () =>
deploymentConfigRollout(obj).catch((err) => {
const error = err.message;
errorModal({ error });
}),
accessReview: {
group: kind.apiGroup,
resource: kind.plural,
subresource: 'instantiate',
name: obj.metadata.name,
namespace: obj.metadata.namespace,
verb: 'create',
},
}),
EditResourceLimits: (kind: K8sKind, obj: K8sResourceKind): Action => ({
id: 'edit-resource-limits',
label: i18next.t('console-app~Edit resource limits'),
Expand Down
@@ -1,5 +1,7 @@
import * as React from 'react';
import i18next from 'i18next';
import { Action } from '@console/dynamic-plugin-sdk';
import { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';
import { HorizontalPodAutoscalerModel } from '@console/internal/models';
import {
K8sResourceKind,
Expand All @@ -8,7 +10,17 @@ import {
K8sResourceCommon,
HorizontalPodAutoscalerKind,
} from '@console/internal/module/k8s';
import { deleteHPAModal } from '@console/shared';
import {
ClusterServiceVersionModel,
ClusterServiceVersionKind,
} from '@console/operator-lifecycle-manager';
import {
deleteHPAModal,
isHelmResource,
isOperatorBackedService,
useActiveNamespace,
} from '@console/shared';
import { doesHpaMatch } from '@console/shared/src/utils/hpa-utils';
import { ResourceActionFactory } from './common-factory';

const hpaRoute = ({ metadata: { name, namespace } }: K8sResourceCommon, kind: K8sKind) =>
Expand Down Expand Up @@ -74,3 +86,46 @@ export const getHpaActions = (
HpaActionFactory.DeleteHorizontalPodAutoScaler(kind, obj, relatedHPAs[0]),
];
};

type DeploymentActionExtraResources = {
hpas: HorizontalPodAutoscalerKind[];
csvs: ClusterServiceVersionKind[];
};

export const useHPAActions = (kindObj: K8sKind, resource: K8sResourceKind) => {
const [namespace] = useActiveNamespace();
const watchedResources = React.useMemo(
() => ({
hpas: {
isList: true,
kind: HorizontalPodAutoscalerModel.kind,
namespace,
optional: true,
},
csvs: {
isList: true,
kind: referenceForModel(ClusterServiceVersionModel),
namespace,
optional: true,
},
}),
[namespace],
);
const extraResources = useK8sWatchResources<DeploymentActionExtraResources>(watchedResources);
const relatedHPAs = React.useMemo(() => extraResources.hpas.data.filter(doesHpaMatch(resource)), [
extraResources.hpas.data,
resource,
]);

const supportsHPA = React.useMemo(
() =>
!(isHelmResource(resource) || isOperatorBackedService(resource, extraResources.csvs.data)),
[extraResources.csvs.data, resource],
);

const result = React.useMemo(() => {
return [supportsHPA ? getHpaActions(kindObj, resource, relatedHPAs) : [], relatedHPAs];
}, [kindObj, relatedHPAs, resource, supportsHPA]);

return result;
};
23 changes: 23 additions & 0 deletions frontend/packages/console-app/src/actions/creators/job-factory.ts
@@ -0,0 +1,23 @@
import i18next from 'i18next';
import { configureJobParallelismModal } from '@console/internal/components/modals';
import { JobKind, K8sKind } from '@console/internal/module/k8s';
import { ResourceActionFactory } from './common-factory';

export const JobActionFactory: ResourceActionFactory = {
ModifyJobParallelism: (kind: K8sKind, obj: JobKind) => ({
id: 'edit-parallelism',
label: i18next.t('console-app~Edit parallelism'),
cta: () =>
configureJobParallelismModal({
resourceKind: kind,
resource: obj,
}),
accessReview: {
group: kind.apiGroup,
resource: kind.plural,
name: obj.metadata.name,
namespace: obj.metadata.namespace,
verb: 'patch',
},
}),
};
@@ -0,0 +1,20 @@
import * as React from 'react';
import { K8sResourceKind, referenceFor } from '@console/internal/module/k8s';
import { useK8sModel } from '@console/shared/src/hooks/useK8sModel';
import { CommonActionFactory, getCommonResourceActions } from '../creators/common-factory';
import { getHealthChecksAction } from '../creators/health-checks-factory';

export const useDaemonSetActionsProvider = (resource: K8sResourceKind) => {
const [kindObj, inFlight] = useK8sModel(referenceFor(resource));

const actions = React.useMemo(
() => [
getHealthChecksAction(kindObj, resource),
CommonActionFactory.AddStorage(kindObj, resource),
...getCommonResourceActions(kindObj, resource),
],
[kindObj, resource],
);

return [actions, !inFlight, undefined];
};
@@ -1,62 +1,21 @@
import * as React from 'react';
import { useK8sWatchResources } from '@console/internal/components/utils/k8s-watch-hook';
import { HorizontalPodAutoscalerModel } from '@console/internal/models';
import { K8sResourceKind, referenceFor, referenceForModel } from '@console/internal/module/k8s';
import {
ClusterServiceVersionModel,
ClusterServiceVersionKind,
} from '@console/operator-lifecycle-manager';
import { isHelmResource, isOperatorBackedService, useActiveNamespace } from '@console/shared';
import { K8sResourceKind, referenceFor } from '@console/internal/module/k8s';
import { useK8sModel } from '@console/shared/src/hooks/useK8sModel';
import { doesHpaMatch } from '@console/shared/src/utils/hpa-utils';
import { HorizontalPodAutoscalerKind } from '../../../../../public/module/k8s/types';
import { CommonActionFactory } from '../creators/common-factory';
import { DeploymentActionFactory } from '../creators/deployment-factory';
import { getHealthChecksAction } from '../creators/health-checks-factory';
import { getHpaActions } from '../creators/hpa-factory';

type DeploymentActionExtraResources = {
hpas: HorizontalPodAutoscalerKind[];
csvs: ClusterServiceVersionKind[];
};
import { useHPAActions } from '../creators/hpa-factory';

export const useDeploymentActionsProvider = (resource: K8sResourceKind) => {
const [kindObj, inFlight] = useK8sModel(referenceFor(resource));
const [namespace] = useActiveNamespace();
const watchedResources = React.useMemo(
() => ({
hpas: {
isList: true,
kind: HorizontalPodAutoscalerModel.kind,
namespace,
optional: true,
},
csvs: {
isList: true,
kind: referenceForModel(ClusterServiceVersionModel),
namespace,
optional: true,
},
}),
[namespace],
);
const extraResources = useK8sWatchResources<DeploymentActionExtraResources>(watchedResources);
const relatedHPAs = React.useMemo(() => extraResources.hpas.data.filter(doesHpaMatch(resource)), [
extraResources,
resource,
]);
const supportsHPA = React.useMemo(
() =>
!(isHelmResource(resource) || isOperatorBackedService(resource, extraResources.csvs.data)),
[extraResources.csvs.data, resource],
);
const [hpaActions, relatedHPAs] = useHPAActions(kindObj, resource);

const deploymentActions = React.useMemo(
() => [
getHealthChecksAction(kindObj, resource),
...(relatedHPAs?.length === 0 ? [CommonActionFactory.ModifyCount(kindObj, resource)] : []),
...(supportsHPA ? getHpaActions(kindObj, resource, relatedHPAs) : []),
DeploymentActionFactory.PauseAction(kindObj, resource),
...hpaActions,
getHealthChecksAction(kindObj, resource),
DeploymentActionFactory.PauseRollout(kindObj, resource),
CommonActionFactory.AddStorage(kindObj, resource),
DeploymentActionFactory.UpdateStrategy(kindObj, resource),
DeploymentActionFactory.EditResourceLimits(kindObj, resource),
Expand All @@ -65,8 +24,32 @@ export const useDeploymentActionsProvider = (resource: K8sResourceKind) => {
DeploymentActionFactory.EditDeployment(kindObj, resource),
CommonActionFactory.Delete(kindObj, resource),
],
[kindObj, relatedHPAs, resource, supportsHPA],
[hpaActions, kindObj, relatedHPAs, resource],
);

return [deploymentActions, !inFlight, undefined];
};

export const useDeploymentConfigActionsProvider = (resource: K8sResourceKind) => {
const [kindObj, inFlight] = useK8sModel(referenceFor(resource));
const [hpaActions, relatedHPAs] = useHPAActions(kindObj, resource);

const deploymentConfigActions = React.useMemo(
() => [
...(relatedHPAs?.length === 0 ? [CommonActionFactory.ModifyCount(kindObj, resource)] : []),
...hpaActions,
getHealthChecksAction(kindObj, resource),
DeploymentActionFactory.StartDCRollout(kindObj, resource),
DeploymentActionFactory.PauseRollout(kindObj, resource),
CommonActionFactory.AddStorage(kindObj, resource),
DeploymentActionFactory.EditResourceLimits(kindObj, resource),
CommonActionFactory.ModifyLabels(kindObj, resource),
CommonActionFactory.ModifyAnnotations(kindObj, resource),
DeploymentActionFactory.EditDeployment(kindObj, resource),
CommonActionFactory.Delete(kindObj, resource),
],
[hpaActions, kindObj, relatedHPAs, resource],
);

return [deploymentConfigActions, !inFlight, undefined];
};
3 changes: 3 additions & 0 deletions frontend/packages/console-app/src/actions/providers/index.ts
@@ -1 +1,4 @@
export * from './deployment-provider';
export * from './stateful-set-provider';
export * from './daemon-set-provider';
export * from './job-provider';
@@ -0,0 +1,30 @@
import * as React from 'react';
import { K8sResourceKind, referenceFor } from '@console/internal/module/k8s';
import { useK8sModel } from '@console/shared/src/hooks/useK8sModel';
import { getCommonResourceActions } from '../creators/common-factory';
import { JobActionFactory } from '../creators/job-factory';

export const useJobActionsProvider = (resource: K8sResourceKind) => {
const [kindObj, inFlight] = useK8sModel(referenceFor(resource));

const actions = React.useMemo(
() => [
JobActionFactory.ModifyJobParallelism(kindObj, resource),
...getCommonResourceActions(kindObj, resource),
],
[kindObj, resource],
);

return [actions, !inFlight, undefined];
};

export const useCronJobActionsProvider = (resource: K8sResourceKind) => {
const [kindObj, inFlight] = useK8sModel(referenceFor(resource));

const actions = React.useMemo(() => getCommonResourceActions(kindObj, resource), [
kindObj,
resource,
]);

return [actions, !inFlight, undefined];
};

0 comments on commit 1e27dfb

Please sign in to comment.