github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/ui/app/controllers/clients/client/index.js (about) 1 /* eslint-disable ember/no-observers */ 2 import { alias } from '@ember/object/computed'; 3 import Controller from '@ember/controller'; 4 import { action, computed } from '@ember/object'; 5 import { observes } from '@ember-decorators/object'; 6 import { task } from 'ember-concurrency'; 7 import Sortable from 'nomad-ui/mixins/sortable'; 8 import Searchable from 'nomad-ui/mixins/searchable'; 9 import messageFromAdapterError from 'nomad-ui/utils/message-from-adapter-error'; 10 import classic from 'ember-classic-decorator'; 11 12 @classic 13 export default class ClientController extends Controller.extend(Sortable, Searchable) { 14 queryParams = [ 15 { 16 currentPage: 'page', 17 }, 18 { 19 searchTerm: 'search', 20 }, 21 { 22 sortProperty: 'sort', 23 }, 24 { 25 sortDescending: 'desc', 26 }, 27 { 28 onlyPreemptions: 'preemptions', 29 }, 30 ]; 31 32 // Set in the route 33 flagAsDraining = false; 34 35 currentPage = 1; 36 pageSize = 8; 37 38 sortProperty = 'modifyIndex'; 39 sortDescending = true; 40 41 @computed() 42 get searchProps() { 43 return ['shortId', 'name']; 44 } 45 46 onlyPreemptions = false; 47 48 @computed('model.allocations.[]', 'preemptions.[]', 'onlyPreemptions') 49 get visibleAllocations() { 50 return this.onlyPreemptions ? this.preemptions : this.model.allocations; 51 } 52 53 @alias('visibleAllocations') listToSort; 54 @alias('listSorted') listToSearch; 55 @alias('listSearched') sortedAllocations; 56 57 eligibilityError = null; 58 stopDrainError = null; 59 drainError = null; 60 showDrainNotification = false; 61 showDrainUpdateNotification = false; 62 showDrainStoppedNotification = false; 63 64 @computed('model.allocations.@each.wasPreempted') 65 get preemptions() { 66 return this.model.allocations.filterBy('wasPreempted'); 67 } 68 69 @computed('model.events.@each.time') 70 get sortedEvents() { 71 return this.get('model.events') 72 .sortBy('time') 73 .reverse(); 74 } 75 76 @computed('model.drivers.@each.name') 77 get sortedDrivers() { 78 return this.get('model.drivers').sortBy('name'); 79 } 80 81 @computed('model.hostVolumes.@each.name') 82 get sortedHostVolumes() { 83 return this.model.hostVolumes.sortBy('name'); 84 } 85 86 @(task(function*(value) { 87 try { 88 yield value ? this.model.setEligible() : this.model.setIneligible(); 89 } catch (err) { 90 const error = messageFromAdapterError(err) || 'Could not set eligibility'; 91 this.set('eligibilityError', error); 92 } 93 }).drop()) 94 setEligibility; 95 96 @(task(function*() { 97 try { 98 this.set('flagAsDraining', false); 99 yield this.model.cancelDrain(); 100 this.set('showDrainStoppedNotification', true); 101 } catch (err) { 102 this.set('flagAsDraining', true); 103 const error = messageFromAdapterError(err) || 'Could not stop drain'; 104 this.set('stopDrainError', error); 105 } 106 }).drop()) 107 stopDrain; 108 109 @(task(function*() { 110 try { 111 yield this.model.forceDrain({ 112 IgnoreSystemJobs: this.model.drainStrategy.ignoreSystemJobs, 113 }); 114 } catch (err) { 115 const error = messageFromAdapterError(err) || 'Could not force drain'; 116 this.set('drainError', error); 117 } 118 }).drop()) 119 forceDrain; 120 121 @observes('model.isDraining') 122 triggerDrainNotification() { 123 if (!this.model.isDraining && this.flagAsDraining) { 124 this.set('showDrainNotification', true); 125 } 126 127 this.set('flagAsDraining', this.model.isDraining); 128 } 129 130 @action 131 gotoAllocation(allocation) { 132 this.transitionToRoute('allocations.allocation', allocation); 133 } 134 135 @action 136 setPreemptionFilter(value) { 137 this.set('onlyPreemptions', value); 138 } 139 140 @action 141 drainNotify(isUpdating) { 142 this.set('showDrainUpdateNotification', isUpdating); 143 } 144 145 @action 146 setDrainError(err) { 147 const error = messageFromAdapterError(err) || 'Could not run drain'; 148 this.set('drainError', error); 149 } 150 }