github.com/aminovpavel/nomad@v0.11.8/ui/app/templates/allocations/allocation/index.hbs (about) 1 {{title "Allocation " model.name}} 2 {{allocation-subnav allocation=model}} 3 <section class="section"> 4 {{#if error}} 5 <div data-test-inline-error class="notification is-danger"> 6 <div class="columns"> 7 <div class="column"> 8 <h3 data-test-inline-error-title class="title is-4">{{error.title}}</h3> 9 <p data-test-inline-error-body>{{error.description}}</p> 10 </div> 11 <div class="column is-centered is-minimum"> 12 <button data-test-inline-error-close class="button is-danger" onclick={{action onDismiss}}>Okay</button> 13 </div> 14 </div> 15 </div> 16 {{/if}} 17 18 <h1 data-test-title class="title with-headroom with-flex"> 19 <div> 20 Allocation {{model.name}} 21 <span class="bumper-left tag {{model.statusClass}}">{{model.clientStatus}}</span> 22 </div> 23 <div> 24 {{#if model.isRunning}} 25 <div class="two-step-button"> 26 {{exec/open-button job=model.job allocation=model}} 27 </div> 28 {{two-step-button 29 data-test-stop 30 alignRight=true 31 idleText="Stop" 32 cancelText="Cancel" 33 confirmText="Yes, Stop" 34 confirmationMessage="Are you sure? This will reschedule the allocation on a different client." 35 awaitingConfirmation=stopAllocation.isRunning 36 disabled=(or stopAllocation.isRunning restartAllocation.isRunning) 37 onConfirm=(perform stopAllocation)}} 38 {{two-step-button 39 data-test-restart 40 alignRight=true 41 idleText="Restart" 42 cancelText="Cancel" 43 confirmText="Yes, Restart" 44 confirmationMessage="Are you sure? This will restart the allocation in-place." 45 awaitingConfirmation=restartAllocation.isRunning 46 disabled=(or stopAllocation.isRunning restartAllocation.isRunning) 47 onConfirm=(perform restartAllocation)}} 48 {{/if}} 49 </div> 50 </h1> 51 52 <span class="tag is-hollow is-small is-alone no-text-transform"> 53 {{model.id}} 54 {{copy-button clipboardText=model.id}} 55 </span> 56 57 <div class="boxed-section is-small"> 58 <div data-test-allocation-details class="boxed-section-body inline-definitions"> 59 <span class="label">Allocation Details</span> 60 <span class="pair job-link"><span class="term">Job</span> 61 {{#link-to "jobs.job" model.job (query-params jobNamespace=model.job.namespace.id) data-test-job-link}}{{model.job.name}}{{/link-to}} 62 </span> 63 <span class="pair node-link"><span class="term">Client</span> 64 {{#link-to "clients.client" model.node data-test-client-link}}{{model.node.shortId}}{{/link-to}} 65 </span> 66 </div> 67 </div> 68 69 <div class="boxed-section"> 70 <div class="boxed-section-head is-hollow"> 71 Resource Utilization 72 </div> 73 <div class="boxed-section-body"> 74 {{#if model.isRunning}} 75 <div class="columns"> 76 <div class="column"> 77 {{primary-metric resource=model metric="cpu"}} 78 </div> 79 <div class="column"> 80 {{primary-metric resource=model metric="memory"}} 81 </div> 82 </div> 83 {{else}} 84 <div data-test-resource-error class="empty-message"> 85 <h3 data-test-resource-error-headline class="empty-message-headline">Allocation isn't running</h3> 86 <p class="empty-message-body">Only running allocations utilize resources.</p> 87 </div> 88 {{/if}} 89 </div> 90 </div> 91 92 {{lifecycle-chart taskStates=model.states}} 93 94 <div class="boxed-section"> 95 <div class="boxed-section-head"> 96 Tasks 97 </div> 98 <div class="boxed-section-body {{if sortedStates.length "is-full-bleed"}}"> 99 {{#if sortedStates.length}} 100 {{#list-table 101 source=sortedStates 102 sortProperty=sortProperty 103 sortDescending=sortDescending 104 class="is-striped" as |t|}} 105 {{#t.head}} 106 <th class="is-narrow"></th> 107 {{#t.sort-by prop="name"}}Name{{/t.sort-by}} 108 {{#t.sort-by prop="state"}}State{{/t.sort-by}} 109 <th>Last Event</th> 110 {{#t.sort-by prop="events.lastObject.time"}}Time{{/t.sort-by}} 111 <th>Volumes</th> 112 <th>Addresses</th> 113 <th>CPU</th> 114 <th>Memory</th> 115 {{/t.head}} 116 {{#t.body as |row|}} 117 {{task-row 118 data-test-task-row=row.model.name 119 task=row.model 120 onClick=(action "taskClick" row.model.allocation row.model)}} 121 {{/t.body}} 122 {{/list-table}} 123 {{else}} 124 <div data-test-empty-tasks-list class="empty-message"> 125 <h3 data-test-empty-tasks-list-headline class="empty-message-headline">No Tasks</h3> 126 <p data-test-empty-tasks-list-body class="empty-message-body">Allocations will not have tasks until they are in a running state.</p> 127 </div> 128 {{/if}} 129 </div> 130 </div> 131 132 {{#if network.ports.length}} 133 <div class="boxed-section" data-test-allocation-ports> 134 <div class="boxed-section-head"> 135 Ports 136 </div> 137 <div class="boxed-section-body is-full-bleed"> 138 {{#list-table source=network.ports as |t|}} 139 {{#t.head}} 140 <th class="is-2">Name</th> 141 <th class="is-1">Dynamic?</th> 142 <th>Host Address</th> 143 <th>Mapped Port</th> 144 {{/t.head}} 145 {{#t.body as |row|}} 146 <tr data-test-allocation-port> 147 <td data-test-allocation-port-name>{{row.model.name}}</td> 148 <td data-test-allocation-port-is-dynamic>{{if row.model.isDynamic "Yes" "No"}}</td> 149 <td data-test-allocation-port-address> 150 <a href="http://{{network.ip}}:{{row.model.port}}" target="_blank" rel="noopener noreferrer">{{network.ip}}:{{row.model.port}}</a> 151 </td> 152 <td data-test-allocation-port-to>{{row.model.to}}</td> 153 </tr> 154 {{/t.body}} 155 {{/list-table}} 156 </div> 157 </div> 158 {{/if}} 159 160 {{#if services.length}} 161 <div class="boxed-section"> 162 <div class="boxed-section-head"> 163 Services 164 </div> 165 <div class="boxed-section-body is-full-bleed"> 166 {{#list-table source=services as |t|}} 167 {{#t.head}} 168 <th class="is-2">Name</th> 169 <th class="is-1">Port</th> 170 <td>Tags</td> 171 <td>Connect?</td> 172 <td>Upstreams</td> 173 {{/t.head}} 174 {{#t.body as |row|}} 175 <tr data-test-service> 176 <td data-test-service-name>{{row.model.name}}</td> 177 <td data-test-service-port>{{row.model.portLabel}}</td> 178 <td data-test-service-tags>{{join ", " row.model.tags}}</td> 179 <td data-test-service-connect>{{if row.model.connect "Yes" "No"}}</td> 180 <td data-test-service-upstreams> 181 {{#each row.model.connect.sidecarService.proxy.upstreams as |upstream|}} 182 {{upstream.destinationName}}:{{upstream.localBindPort}} 183 {{/each}} 184 </td> 185 </tr> 186 {{/t.body}} 187 {{/list-table}} 188 </div> 189 </div> 190 {{/if}} 191 192 {{#if model.hasRescheduleEvents}} 193 <div class="boxed-section" data-test-reschedule-events> 194 <div class="boxed-section-head is-hollow"> 195 Reschedule Events 196 </div> 197 <div class="boxed-section-body"> 198 {{reschedule-event-timeline allocation=model}} 199 </div> 200 </div> 201 {{/if}} 202 203 {{#if model.wasPreempted}} 204 <div class="boxed-section is-warning" data-test-was-preempted> 205 <div class="boxed-section-head">Preempted By</div> 206 <div class="boxed-section-body"> 207 {{#if (not preempter)}} 208 <div class="empty-message"> 209 <h3 class="empty-message-headline">Allocation is gone</h3> 210 <p class="empty-message-body">This allocation has been stopped and garbage collected.</p> 211 </div> 212 {{else}} 213 <div class="boxed-section is-small"> 214 <div class="boxed-section-body inline-definitions"> 215 <span class="pair"> 216 <span data-test-allocation-status class="tag {{preempter.statusClass}}"> 217 {{preempter.clientStatus}} 218 </span> 219 </span> 220 <span class="pair"> 221 <span class="term" data-test-allocation-name>{{preempter.name}}</span> 222 {{#link-to "allocations.allocation" preempter data-test-allocation-id}}{{preempter.shortId}}{{/link-to}} 223 </span> 224 <span class="pair job-link"><span class="term">Job</span> 225 {{#link-to "jobs.job" preempter.job (query-params jobNamespace=preempter.job.namespace.id) data-test-job-link}}{{preempter.job.name}}{{/link-to}} 226 </span> 227 <span class="pair job-priority"><span class="term">Priority</span> 228 <span data-test-job-priority>{{preempter.job.priority}}</span> 229 </span> 230 <span class="pair node-link"><span class="term">Client</span> 231 {{#link-to "clients.client" preempter.node data-test-client-link}}{{preempter.node.shortId}}{{/link-to}} 232 </span> 233 <span class="pair"><span class="term">Reserved CPU</span> 234 <span data-test-allocation-cpu>{{preempter.resources.cpu}} MHz</span> 235 </span> 236 <span class="pair"><span class="term">Reserved Memory</span> 237 <span data-test-allocation-memory>{{preempter.resources.memory}} MiB</span> 238 </span> 239 </div> 240 </div> 241 {{/if}} 242 </div> 243 </div> 244 {{/if}} 245 246 {{#if (and model.preemptedAllocations.isFulfilled model.preemptedAllocations.length)}} 247 <div class="boxed-section" data-test-preemptions> 248 <div class="boxed-section-head">Preempted Allocations</div> 249 <div class="boxed-section-body"> 250 {{#list-table 251 source=model.preemptedAllocations 252 class="allocations is-isolated" as |t|}} 253 {{#t.head}} 254 <th class="is-narrow"></th> 255 <th>ID</th> 256 <th>Task Group</th> 257 <th>Created</th> 258 <th>Modified</th> 259 <th>Status</th> 260 <th>Version</th> 261 <th>Node</th> 262 <th>CPU</th> 263 <th>Memory</th> 264 {{/t.head}} 265 {{#t.body as |row|}} 266 {{allocation-row allocation=row.model context="job" data-test-allocation=row.model.id}} 267 {{/t.body}} 268 {{/list-table}} 269 </div> 270 </div> 271 {{/if}} 272 </section>