-
Notifications
You must be signed in to change notification settings - Fork 607
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
c673aff
commit 2ce71a0
Showing
6 changed files
with
159 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
63 changes: 63 additions & 0 deletions
63
frontend/packages/console-app/src/actions/creators/cronjob-factory.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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', | ||
}, | ||
}), | ||
}; |
22 changes: 22 additions & 0 deletions
22
frontend/packages/console-app/src/actions/providers/cronjob-provider.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
71 changes: 71 additions & 0 deletions
71
frontend/packages/integration-tests-cypress/tests/app/start-job-from-cronjob.cy.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); | ||
}); |