github.com/hernad/nomad@v1.6.112/ui/app/adapters/job.js (about) 1 /** 2 * Copyright (c) HashiCorp, Inc. 3 * SPDX-License-Identifier: MPL-2.0 4 */ 5 6 import WatchableNamespaceIDs from './watchable-namespace-ids'; 7 import addToPath from 'nomad-ui/utils/add-to-path'; 8 import { base64EncodeString } from 'nomad-ui/utils/encode'; 9 import classic from 'ember-classic-decorator'; 10 11 @classic 12 export default class JobAdapter extends WatchableNamespaceIDs { 13 relationshipFallbackLinks = { 14 summary: '/summary', 15 }; 16 17 fetchRawDefinition(job) { 18 const url = this.urlForFindRecord(job.get('id'), 'job'); 19 return this.ajax(url, 'GET'); 20 } 21 22 fetchRawSpecification(job) { 23 const url = addToPath( 24 this.urlForFindRecord(job.get('id'), 'job', null, 'submission'), 25 '', 26 'version=' + job.get('version') 27 ); 28 return this.ajax(url, 'GET'); 29 } 30 31 forcePeriodic(job) { 32 if (job.get('periodic')) { 33 const url = addToPath( 34 this.urlForFindRecord(job.get('id'), 'job'), 35 '/periodic/force' 36 ); 37 return this.ajax(url, 'POST'); 38 } 39 } 40 41 stop(job) { 42 const url = this.urlForFindRecord(job.get('id'), 'job'); 43 return this.ajax(url, 'DELETE'); 44 } 45 46 purge(job) { 47 const url = this.urlForFindRecord(job.get('id'), 'job') + '?purge=true'; 48 return this.ajax(url, 'DELETE'); 49 } 50 51 parse(spec, jobVars) { 52 const url = addToPath(this.urlForFindAll('job'), '/parse?namespace=*'); 53 return this.ajax(url, 'POST', { 54 data: { 55 JobHCL: spec, 56 Variables: jobVars, 57 Canonicalize: true, 58 }, 59 }); 60 } 61 62 plan(job) { 63 const jobId = job.get('id') || job.get('_idBeforeSaving'); 64 const store = this.store; 65 const url = addToPath(this.urlForFindRecord(jobId, 'job'), '/plan'); 66 67 return this.ajax(url, 'POST', { 68 data: { 69 Job: job.get('_newDefinitionJSON'), 70 Diff: true, 71 }, 72 }).then((json) => { 73 json.ID = jobId; 74 store.pushPayload('job-plan', { jobPlans: [json] }); 75 return store.peekRecord('job-plan', jobId); 76 }); 77 } 78 79 // Running a job doesn't follow REST create semantics so it's easier to 80 // treat it as an action. 81 run(job) { 82 let Submission; 83 try { 84 JSON.parse(job.get('_newDefinition')); 85 Submission = { 86 Source: job.get('_newDefinition'), 87 Format: 'json', 88 }; 89 } catch { 90 Submission = { 91 Source: job.get('_newDefinition'), 92 Format: 'hcl2', 93 Variables: job.get('_newDefinitionVariables'), 94 }; 95 } 96 97 return this.ajax(this.urlForCreateRecord('job'), 'POST', { 98 data: { 99 Job: job.get('_newDefinitionJSON'), 100 Submission, 101 }, 102 }); 103 } 104 105 update(job) { 106 const jobId = job.get('id') || job.get('_idBeforeSaving'); 107 108 let Submission; 109 try { 110 JSON.parse(job.get('_newDefinition')); 111 Submission = { 112 Source: job.get('_newDefinition'), 113 Format: 'json', 114 }; 115 } catch { 116 Submission = { 117 Source: job.get('_newDefinition'), 118 Format: 'hcl2', 119 Variables: job.get('_newDefinitionVariables'), 120 }; 121 } 122 123 return this.ajax(this.urlForUpdateRecord(jobId, 'job'), 'POST', { 124 data: { 125 Job: job.get('_newDefinitionJSON'), 126 Submission, 127 }, 128 }); 129 } 130 131 scale(job, group, count, message) { 132 const url = addToPath( 133 this.urlForFindRecord(job.get('id'), 'job'), 134 '/scale' 135 ); 136 return this.ajax(url, 'POST', { 137 data: { 138 Count: count, 139 Message: message, 140 Target: { 141 Group: group, 142 }, 143 Meta: { 144 Source: 'nomad-ui', 145 }, 146 }, 147 }); 148 } 149 150 dispatch(job, meta, payload) { 151 const url = addToPath( 152 this.urlForFindRecord(job.get('id'), 'job'), 153 '/dispatch' 154 ); 155 return this.ajax(url, 'POST', { 156 data: { 157 Payload: base64EncodeString(payload), 158 Meta: meta, 159 }, 160 }); 161 } 162 }