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  }