Skip to content

Commit

Permalink
start job from cronjob
Browse files Browse the repository at this point in the history
  • Loading branch information
Cyril Ajieh authored and cyril-ui-developer committed Oct 18, 2024
1 parent c673aff commit 2ce71a0
Show file tree
Hide file tree
Showing 6 changed files with 159 additions and 13 deletions.
1 change: 1 addition & 0 deletions frontend/packages/console-app/locales/en/console-app.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@
"Edit Pod selector": "Edit Pod selector",
"Edit tolerations": "Edit tolerations",
"Add storage": "Add storage",
"Start Job": "Start Job",
"Edit update strategy": "Edit update strategy",
"Resume rollouts": "Resume rollouts",
"Pause rollouts": "Pause rollouts",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import i18next from 'i18next';
import { history } from '@console/internal/components/utils';
import { JobModel } from '@console/internal/models';
import { K8sKind, k8sCreate, CronJobKind } from '@console/internal/module/k8s';
import { ResourceActionFactory } from './common-factory';

function generateJobName(objName: string) {
const timestamp = Date.now();
return `${objName}-${timestamp}`;
}
const jobDetailsURL = (objNamespace: string, jobName: string) =>
`/k8s/ns/${objNamespace}/jobs/${jobName}`;

const startJob = (obj: CronJobKind, jobName: string) => {
const { name, namespace, uid } = obj.metadata;
const reqPayload = {
apiVersion: 'batch/v1',
kind: 'Job',
metadata: {
name: jobName,
namespace,
ownerReferences: [
{
apiVersion: 'batch/v1',
kind: 'CronJob',
name,
uid,
},
],
},
spec: {
template: obj.spec.jobTemplate.spec.template,
},
};

return k8sCreate(JobModel, reqPayload);
};

export const CronJobActionFactory: ResourceActionFactory = {
StartJob: (kind: K8sKind, obj: CronJobKind) => ({
id: 'start-job',
label: i18next.t('console-app~Start Job'),
cta: () => {
const jobName = generateJobName(obj.metadata.name);
startJob(obj, jobName)
.then(() => {
history.push(jobDetailsURL(obj.metadata.namespace, jobName));
})
.catch((error) => {
// TODO: Show error in notification in the follow on tech-debt.
// eslint-disable-next-line no-console
console.error('Failed to start a Job.', error);
});
},
accessReview: {
group: kind.apiGroup,
resource: kind.plural,
name: obj.metadata.name,
namespace: obj.metadata.namespace,
verb: 'create',
},
}),
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import * as React from 'react';
import { CronJobKind, referenceFor } from '@console/internal/module/k8s';
import { useK8sModel } from '@console/shared/src/hooks/useK8sModel';
import { getCommonResourceActions } from '../creators/common-factory';
import { CronJobActionFactory } from '../creators/cronjob-factory';
import { usePDBActions } from '../creators/pdb-factory';

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

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

return [actions, !inFlight, undefined];
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export * from './deploymentconfig-provider';
export * from './stateful-set-provider';
export * from './daemon-set-provider';
export * from './job-provider';
export * from './cronjob-provider';
export * from './service-binding-provider';
export * from './replicaset-provider';
export * from './replication-controllers-provider';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import { JobKind, CronJobKind, referenceFor } from '@console/internal/module/k8s';
import { JobKind, 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';
Expand All @@ -20,15 +20,3 @@ export const useJobActionsProvider = (resource: JobKind) => {

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

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

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

return [actions, !inFlight, undefined];
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { checkErrors, testName } from '../../support';
import { detailsPage } from '../../views/details-page';
import { listPage } from '../../views/list-page';
import * as yamlEditor from '../../views/yaml-editor';

const CRONJOB_NAME = 'cronjob1';

const cronJobReqPayload = `apiVersion: batch/v1
kind: CronJob
metadata:
name: ${CRONJOB_NAME}
namespace: ${testName}
spec:
schedule: '@daily'
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- '-c'
- date; echo Hello from the Openshift cluster
restartPolicy: OnFailure`;

describe('Start a Job from a CronJob', () => {
before(() => {
cy.login();
cy.createProjectWithCLI(testName);
});

afterEach(() => {
checkErrors();
});

after(() => {
cy.visit('/');
cy.deleteProjectWithCLI(testName);
});

it('verify "Start Job" on the CronJob details page', () => {
cy.visit(`/k8s/ns/${testName}/import`);
yamlEditor.isImportLoaded();
yamlEditor.setEditorContent(cronJobReqPayload).then(() => {
yamlEditor.clickSaveCreateButton();
detailsPage.sectionHeaderShouldExist('CronJob details');
});
detailsPage.clickPageActionFromDropdown('Start Job');
detailsPage.isLoaded();
detailsPage.sectionHeaderShouldExist('Job details');
detailsPage.titleShouldContain(`${CRONJOB_NAME}`);
});

it('verify "Start Job" on the CronJob list page', () => {
cy.visit(`/k8s/ns/${testName}/cronjobs`);
listPage.rows.shouldBeLoaded();
listPage.rows.clickKebabAction(CRONJOB_NAME, 'Start Job');
detailsPage.isLoaded();
detailsPage.sectionHeaderShouldExist('Job details');
detailsPage.titleShouldContain(`${CRONJOB_NAME}`);
});

it('verify the number of Jobs in CronJob > Jobs tab list page', () => {
cy.visit(`/k8s/ns/${testName}/cronjobs`);
listPage.rows.shouldBeLoaded();
cy.visit(`/k8s/ns/${testName}/cronjobs/${CRONJOB_NAME}/jobs`);
listPage.rows.countShouldBe(2);
});
});

0 comments on commit 2ce71a0

Please sign in to comment.