523 lines
26 KiB
Plaintext
523 lines
26 KiB
Plaintext
.grid
|
||
.panel.panel-default
|
||
p.page-title
|
||
i.xo-icon-host(class="xo-color-{{host.power_state | lowercase}}")
|
||
| {{host.name_label}}
|
||
small(ng-if="pool.name_label")
|
||
| (
|
||
a(ui-sref="pools_view({id: pool.id})") {{pool.name_label}}
|
||
| )
|
||
p.center {{host.bios_strings["system-manufacturer"]}} {{host.bios_strings["system-product-name"]}}
|
||
.grid
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.fa.fa-cogs(style="color: #e25440;")
|
||
| General
|
||
span.quick-edit(tooltip="Edit General settings", ng-click="hostSettings.$show()")
|
||
i.fa.fa-edit.fa-fw
|
||
.panel-body
|
||
form(editable-form="", name="hostSettings", onbeforesave="saveHost($data)")
|
||
dl.dl-horizontal
|
||
dt Name
|
||
dd
|
||
span(editable-text="host.name_label", e-name="name_label", e-form="hostSettings")
|
||
| {{host.name_label}}
|
||
dt Description
|
||
dd
|
||
span(editable-text="host.name_description", e-name="name_description", e-form="hostSettings")
|
||
| {{host.name_description}}
|
||
dt Enabled
|
||
dd
|
||
span(editable-select="host.enabled", e-ng-options="ap.v as ap.t for ap in [{v: true, t:'Yes'}, {v: false, t:'No'}]", e-name="enabled", e-form="hostSettings")
|
||
| {{host.enabled ? 'Yes' : 'No'}}
|
||
dt Tags
|
||
dd(ng-if="host.tags.length")
|
||
span(ng-repeat="tag in host.tags")
|
||
span.label.label-primary {{tag}}
|
||
dd(ng-if="!host.tags.length")
|
||
em No tags.
|
||
dt CPUs
|
||
dd {{host.CPUs["cpu_count"]}}x {{host.CPUs["modelname"]}}
|
||
dt Hostname
|
||
dd
|
||
| {{host.hostname}}
|
||
dt UUID
|
||
dd {{host.UUID}}
|
||
dt iQN
|
||
dd {{host.iSCSI_name}}
|
||
dt(ng-if="refreshStatControl.running && stats") vCPUs/CPUs:
|
||
dd(ng-if="refreshStatControl.running && stats") {{vCPUs}}/{{host.CPUs['cpu_count']}}
|
||
dt(ng-if="refreshStatControl.running && stats") Running VMs:
|
||
dd(ng-if="refreshStatControl.running && stats") {{vms | count}}
|
||
dt(ng-if="refreshStatControl.running && stats") RAM (used/free):
|
||
dd(ng-if="refreshStatControl.running && stats") {{host.memory.usage | bytesToSize}}/{{host.memory.size | bytesToSize}}
|
||
.btn-form(ng-show="hostSettings.$visible")
|
||
p.center
|
||
button.btn.btn-default(type="button", ng-disabled="hostSettings.$waiting", ng-click="hostSettings.$cancel()")
|
||
i.fa.fa-times
|
||
| Cancel
|
||
|
|
||
button.btn.btn-primary(type="submit", ng-disabled="hostSettings.$waiting")
|
||
i.fa.fa-save
|
||
| Save
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.xo-icon-stats(style="color: #e25440;")
|
||
| Stats
|
||
.panel-body(ng-if="refreshStatControl.running && stats")
|
||
div(ng-if="statView.cpuOnly", ng-click="statView.cpuOnly = false")
|
||
p.stat-name
|
||
i.fa.fa-tachometer
|
||
| CPU usage
|
||
canvas.chart.chart-line.chart-stat-full(
|
||
id="bigCpu"
|
||
data="stats.cpus"
|
||
labels="stats.date"
|
||
series="stats.cpuSeries"
|
||
colours="['#0000ff', '#9999ff', '#000099', '#5555ff', '#000055']"
|
||
legend="true"
|
||
options='{responsive: true, maintainAspectRatio: false, tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= Math.round(10*value)/10 %>", multiTooltipTemplate:"<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= Math.round(10*value)/10 %>", pointDot: false, showScale: false, animation: false, datasetStrokeWidth: 0.8, scaleOverride: true, scaleSteps: 100, scaleStartValue: 0, scaleStepWidth: 1, pointHitDetectionRadius: 0}'
|
||
)
|
||
div(ng-if="statView.ramOnly", ng-click="statView.ramOnly = false")
|
||
p.stat-name
|
||
//- i.fa.fa-bar-chart
|
||
i.fa.fa-tasks
|
||
//- i.fa.fa-server
|
||
| RAM usage
|
||
canvas.chart.chart-line.chart-stat-full(
|
||
id="bigRam"
|
||
data="[stats.memoryUsed,stats.memory]"
|
||
labels="stats.date"
|
||
series="['Used RAM', 'Total RAM']"
|
||
colours="['#ff0000', '#ffbbbb']"
|
||
legend="true"
|
||
options=' {responsive: true, maintainAspectRatio: false, tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= bytesToSize(value) %>", multiTooltipTemplate:"<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= bytesToSize(value) %>", datasetStrokeWidth: 0.8, pointDot: false, showScale: false, scaleBeginAtZero: true, animation: false, pointHitDetectionRadius: 0}'
|
||
)
|
||
div(ng-if="statView.netOnly", ng-click="statView.netOnly = false")
|
||
p.stat-name
|
||
i.fa.fa-sitemap
|
||
| Network I/O
|
||
canvas.chart.chart-line.chart-stat-full(
|
||
id="bigNet"
|
||
data="stats.pifs"
|
||
labels="stats.date"
|
||
series="stats.pifSeries"
|
||
colours="['#dddd00', '#dddd77', '#777700', '#dddd55', '#555500', '#ffdd00']"
|
||
legend="true"
|
||
options=' {responsive: true, maintainAspectRatio: false, tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= bytesToSize(value) %>", multiTooltipTemplate:"<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= bytesToSize(value) %>", datasetStrokeWidth: 0.8, pointDot: false, showScale: false, scaleBeginAtZero: true, animation: false, pointHitDetectionRadius: 0}'
|
||
)
|
||
div(ng-if="statView.loadOnly", ng-click="statView.loadOnly = false")
|
||
p.stat-name
|
||
i.fa.fa-cogs
|
||
| Load Average
|
||
canvas.chart.chart-line.chart-stat-full(
|
||
id="bigLoad"
|
||
data="[stats.load]"
|
||
labels="stats.date"
|
||
series="['Load']"
|
||
colours="['#960094']"
|
||
legend="true"
|
||
options=' {responsive: true, maintainAspectRatio: false, multiTooltipTemplate:"<%if (datasetLabel){%><%=datasetLabel%>: <%}%><%= bytesToSize(value) %>", datasetStrokeWidth: 0.8, pointDot: false, showScale: false, scaleBeginAtZero: true, animation: false, pointHitDetectionRadius: 0}'
|
||
)
|
||
div(ng-if="!statView.netOnly && !statView.loadOnly && !statView.cpuOnly && !statView.ramOnly")
|
||
.row
|
||
.col-sm-6(ng-click="statView.cpuOnly=true")
|
||
p.stat-name
|
||
i.fa.fa-tachometer
|
||
| CPU usage
|
||
canvas.chart.chart-line.chart-stat-preview(
|
||
id="smallCpu"
|
||
data="stats.cpus"
|
||
labels="stats.date"
|
||
series="stats.cpuSeries"
|
||
colours="['#0000ff', '#9999ff', '#000099', '#5555ff', '#000055']"
|
||
options='{responsive: true, maintainAspectRatio: false, showTooltips: false, pointDot: false, showScale: false, animation: false, datasetStrokeWidth: 0.8, scaleOverride: true, scaleSteps: 100, scaleStartValue: 0, scaleStepWidth: 1}'
|
||
)
|
||
.col-sm-6(ng-click="statView.ramOnly=true")
|
||
p.stat-name
|
||
//- i.fa.fa-bar-chart
|
||
i.fa.fa-tasks
|
||
//- i.fa.fa-server
|
||
| RAM usage
|
||
canvas.chart.chart-line.chart-stat-preview(
|
||
id="smallRam"
|
||
data="[stats.memoryUsed,stats.memory]"
|
||
labels="stats.date"
|
||
series="['Used RAM', 'Total RAM']"
|
||
colours="['#ff0000', '#ffbbbb']"
|
||
options="{responsive: true, maintainAspectRatio: false, showTooltips: false, datasetStrokeWidth: 0.8, pointDot: false, showScale: false, scaleBeginAtZero: true, animation: false}"
|
||
)
|
||
.row
|
||
.col-sm-6(ng-click="statView.netOnly=true")
|
||
p.stat-name
|
||
i.fa.fa-sitemap
|
||
| Network I/O
|
||
canvas.chart.chart-line.chart-stat-preview(
|
||
id="smallNet"
|
||
data="stats.pifs"
|
||
labels="stats.date"
|
||
series="stats.pifSeries"
|
||
colours="['#dddd00', '#dddd77', '#777700', '#dddd55', '#555500', '#ffdd00']"
|
||
options="{responsive: true, maintainAspectRatio: false, showTooltips: false, datasetStrokeWidth: 0.8, pointDot: false, showScale: false, scaleBeginAtZero: true, animation: false}"
|
||
)
|
||
.col-sm-6(ng-click="statView.loadOnly=true")
|
||
p.stat-name
|
||
i.fa.fa-cogs
|
||
| Load Average
|
||
canvas.chart.chart-line.chart-stat-preview(
|
||
id="smallDisk"
|
||
data="[stats.load]"
|
||
labels="stats.date"
|
||
series="['Load']"
|
||
colours="['#960094']"
|
||
options="{responsive: true, maintainAspectRatio: false, showTooltips: false, datasetStrokeWidth: 0.8, pointDot: false, showScale: false, scaleBeginAtZero: true, animation: false}"
|
||
)
|
||
.panel-body(ng-if="!refreshStatControl.running || !stats")
|
||
.row
|
||
.col-sm-6.col-lg-4
|
||
p.stat-name CPU usage:
|
||
p.center.mid-stat {{vCPUs}}/{{host.CPUs['cpu_count']}}
|
||
.col-sm-6.col-lg-4
|
||
p.stat-name RAM used:
|
||
p.center.mid-stat {{host.memory.usage | bytesToSize}}
|
||
.col-sm-4.visible-lg
|
||
p.stat-name Running VMs:
|
||
p.center.mid-stat {{vms | count}}
|
||
.row
|
||
p.center(ng-if="refreshStatControl.running")
|
||
i.fa.fa-circle-o-notch.fa-spin.fa-2x
|
||
| Fetching stats...
|
||
.row.hidden-lg
|
||
.col-sm-12
|
||
br
|
||
p.stat-name {{vms | count}} running VMs
|
||
//- Action panel
|
||
.grid
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.fa.fa-flash(style="color: #e25440;")
|
||
| Actions
|
||
.panel-body.text-center
|
||
.grid
|
||
.grid-cell.btn-group
|
||
button.btn(tooltip="Add SR", type="button", style="width: 90%", xo-sref="SRs_new({container: host.id})")
|
||
i.xo-icon-sr.fa-2x.fa-fw
|
||
.grid-cell.btn-group
|
||
button.btn(tooltip="Add VM", type="button", style="width: 90%", xo-sref="VMs_new({container: host.id})")
|
||
i.xo-icon-vm.fa-2x.fa-fw
|
||
.grid-cell.btn-group
|
||
button.btn(tooltip="Reboot host", type="button", style="width: 90%", xo-click="rebootHost(host.id)")
|
||
i.fa.fa-refresh.fa-2x.fa-fw
|
||
.grid-cell.btn-group
|
||
button.btn(tooltip="Shutdown host", type="button", style="width: 90%", xo-click="shutdownHost(host.id)")
|
||
i.fa.fa-power-off.fa-2x.fa-fw
|
||
.grid-cell.btn-group(ng-if="host.enabled")
|
||
button.btn(tooltip="Disable host", type="button", style="width: 90%", xo-click="disableHost(host.id)")
|
||
i.fa.fa-times-circle.fa-2x.fa-fw
|
||
.grid-cell.btn-group(ng-if="!host.enabled")
|
||
button.btn(tooltip="Enable host", type="button", style="width: 90%", xo-click="enableHost(host.id)")
|
||
i.fa.fa-check-circle.fa-2x.fa-fw
|
||
.grid-cell.btn-group
|
||
button.btn(tooltip="Restart toolstack", type="button", style="width: 90%", xo-click="restartToolStack(host.id)")
|
||
i.fa.fa-retweet.fa-2x.fa-fw
|
||
.grid-cell.btn-group(ng-if="pool.name_label")
|
||
button.btn(tooltip="Remove from pool", style="width: 90%", type="button", xo-click="pool_removeHost(host.id)")
|
||
i.fa.fa-cloud-upload.fa-2x.fa-fw
|
||
.grid-cell.btn-group(ng-if="!pool.name_label")
|
||
button.btn(tooltip="Add to pool", style="width: 90%", type="button", xo-click="pool_addHost(host.id)")
|
||
i.fa.fa-cloud-download.fa-2x.fa-fw
|
||
.grid-cell.btn-group(style="margin-bottom: 0.5em")
|
||
button.btn(
|
||
tooltip="Import VM"
|
||
type="button"
|
||
style="width: 90%"
|
||
ng-file-select = 'importVm($files, host.id)'
|
||
)
|
||
i.fa.fa-upload.fa-2x.fa-fw
|
||
.grid-cell.btn-group(style="margin-bottom: 0.5em")
|
||
button.btn(
|
||
tooltip="Host console"
|
||
type="button"
|
||
style="width: 90%"
|
||
xo-sref="consoles_view({id: controller.id})"
|
||
)
|
||
i.xo-icon-console.fa-2x.fa-fw
|
||
|
||
//- TODO: Memory panel
|
||
.grid
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.xo-icon-memory(style="color: #e25440;")
|
||
| Memory
|
||
.panel-body.text-center
|
||
.progress
|
||
.progress-bar-host(role="progressbar", aria-valuemin="0", aria-valuenow="{{controller.memory.size}}", aria-valuemax="{{host.memory.size}}", style="width: {{[controller.memory.size, host.memory.size] | percentage}}", tooltip="{{host.name_label}}: {{[controller.memory.size, host.memory.size] | percentage}}")
|
||
small {{host.name_label}}
|
||
.progress-bar.progress-bar-vm(ng-repeat="VM in vms | map | orderBy:natural('name_label') track by VM.id", role="progressbar", aria-valuemin="0", aria-valuenow="{{VM.memory.size}}", aria-valuemax="{{host.memory.size}}", style="width: {{[VM.memory.size, host.memory.size] | percentage}}", xo-sref="VMs_view({id: VM.id})", tooltip="{{VM.name_label}}: {{[VM.memory.size, host.memory.size] | percentage}}")
|
||
small {{VM.name_label}}
|
||
ul.list-inline.text-center
|
||
li Total: {{host.memory.size | bytesToSize}}
|
||
li Currently used: {{host.memory.usage | bytesToSize}}
|
||
li Available: {{host.memory.size-host.memory.usage | bytesToSize}}
|
||
//- SR panel
|
||
.grid
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.xo-icon-sr(style="color: #e25440;")
|
||
| Storage
|
||
.panel-body
|
||
table.table.table-hover
|
||
tr
|
||
th Name
|
||
th Format
|
||
th Size
|
||
th Physical/Allocated usage
|
||
th Type
|
||
th Status
|
||
//- TODO: display PBD status for each SR of this host (connected or not)
|
||
//- Shared SR
|
||
tr(xo-sref="SRs_view({id: SR.id})", ng-repeat="SR in sharedSrs | map | orderBy:natural('name_label') track by SR.id")
|
||
td.oneliner
|
||
| {{SR.name_label}}
|
||
td {{SR.SR_type}}
|
||
td {{SR.size | bytesToSize}}
|
||
td
|
||
.progress-condensed
|
||
.progress-bar(role="progressbar", aria-valuemin="0", aria-valuenow="{{SR.usage}}", aria-valuemax="{{SR.size}}", style="width: {{[SR.physical_usage, SR.size] | percentage}}", tooltip="Physical usage: {{[SR.physical_usage, SR.size] | percentage}}")
|
||
.progress-bar.progress-bar-info(role="progressbar", aria-valuemin="0", aria-valuenow="{{SR.physical_usage}}", aria-valuemax="{{SR.size}}", style="width: {{[(SR.usage-SR.physical_usage), SR.size] | percentage}}", tooltip="Allocated: {{[(SR.usage), SR.size] | percentage}}")
|
||
td
|
||
span.label.label-primary Shared
|
||
td(ng-if="SRsToPBDs[SR.id].attached")
|
||
span.label.label-success Connected
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(tooltip="Disconnect this SR", xo-click="disconnectPBD(SRsToPBDs[SR.id].id)")
|
||
i.fa.fa-unlink.fa-lg
|
||
td(ng-if="!SRsToPBDs[SR.id].attached")
|
||
span.label.label-default Disconnected
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(tooltip="Reconnect this SR", xo-click="connectPBD(SRsToPBDs[SR.id].id)")
|
||
i.fa.fa-link.fa-lg
|
||
a(tooltip="Forget this SR", xo-click="removePBD(SRsToPBDs[SR.id].id)")
|
||
i.fa.fa-ban.fa-lg
|
||
//- Local SR
|
||
//- TODO: migrate to SRs and not PBDs when implemented in xo-server spec
|
||
tr(xo-sref="SRs_view({id: SR.id})", ng-repeat="SR in srs | map | orderBy:natural('name_label') track by SR.id")
|
||
td
|
||
| {{SR.name_label}}
|
||
td {{SR.SR_type}}
|
||
td {{SR.size | bytesToSize}}
|
||
td
|
||
.progress-condensed
|
||
.progress-bar(role="progressbar", aria-valuemin="0", aria-valuenow="{{SR.usage}}", aria-valuemax="{{SR.size}}", style="width: {{[SR.physical_usage, SR.size] | percentage}}", tooltip="Physical usage: {{[SR.physical_usage, SR.size] | percentage}}")
|
||
.progress-bar.progress-bar-info(role="progressbar", aria-valuemin="0", aria-valuenow="{{SR.physical_usage}}", aria-valuemax="{{SR.size}}", style="width: {{[(SR.usage-SR.physical_usage), SR.size] | percentage}}", tooltip="Allocated: {{[(SR.usage), SR.size] | percentage}}")
|
||
td
|
||
span.label.label-info Local
|
||
td(ng-if="SRsToPBDs[SR.id].attached")
|
||
span.label.label-success Connected
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(tooltip="Disconnect this SR", xo-click="disconnectPBD(SRsToPBDs[SR.id].id)")
|
||
i.fa.fa-unlink.fa-lg
|
||
td(ng-if="!SRsToPBDs[SR.id].attached")
|
||
span.label.label-default Disconnected
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(tooltip="Reconnect this SR", xo-click="connectPBD(SRsToPBDs[SR.id].id)")
|
||
i.fa.fa-link.fa-lg
|
||
a(tooltip="Forget this SR", xo-click="removePBD(SRsToPBDs[SR.id].id)")
|
||
i.fa.fa-ban.fa-lg
|
||
//- Networks/Interfaces panel
|
||
.grid
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.xo-icon-network(style="color: #e25440;")
|
||
| Interfaces
|
||
.panel-body
|
||
table.table.table-hover
|
||
th.col-md-1 Device
|
||
th.col-md-1 VLAN
|
||
th.col-md-1 Address
|
||
th.col-md-2 MAC
|
||
th.col-md-1 MTU
|
||
th.col-md-1 Link status
|
||
tr(ng-repeat="PIF in host.$PIFs | resolve | orderBy:natural('name_label') track by PIF.id")
|
||
td
|
||
| {{PIF.device}}
|
||
span.label.label-primary(ng-if="PIF.management") XAPI
|
||
td
|
||
span(ng-if="PIF.vlan > -1")
|
||
| {{PIF.vlan}}
|
||
span(ng-if="PIF.vlan == -1")
|
||
| -
|
||
td.oneliner {{PIF.IP}} ({{PIF.mode}})
|
||
td.oneliner {{PIF.MAC}}
|
||
td {{PIF.MTU}}
|
||
td(ng-if="PIF.attached")
|
||
span.label.label-success Connected
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(tooltip="Disconnect this interface", xo-click="disconnectPIF(PIF.id)")
|
||
i.fa.fa-unlink.fa-lg
|
||
td(ng-if="!PIF.attached")
|
||
span.label.label-default Disconnected
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(tooltip="Connect this interface", xo-click="connectPIF(PIF.id)")
|
||
i.fa.fa-link.fa-lg
|
||
a(tooltip="Remove this interface", xo-click="removePIF(PIF.id)")
|
||
i.fa.fa-trash-o.fa-lg
|
||
.text-right
|
||
button.btn(type="button", ng-class = '{"btn-success": creatingNetwork, "btn-primary": !creatingNetwork}', ng-click="creatingNetwork = !creatingNetwork")
|
||
i.fa.fa-plus(ng-if = '!creatingNetwork')
|
||
i.fa.fa-minus(ng-if = 'creatingNetwork')
|
||
| Create Network
|
||
br
|
||
form.form-inline.text-right#createNetworkForm(ng-if = 'creatingNetwork', name = 'createNetworkForm', ng-submit = 'createNetwork(newNetworkName, newNetworkDescription, newNetworkPIF, newNetworkMTU, newNetworkVlan)')
|
||
fieldset(ng-attr-disabled = '{{ createNetworkWaiting ? true : undefined }}')
|
||
.form-group
|
||
label(for = 'newNetworkPIF') Interface
|
||
select.form-control(ng-model = 'newNetworkPIF', ng-change = 'updateMTU(newNetworkPIF)', ng-options='(PIF | resolve).device for PIF in host.$PIFs')
|
||
option(value = '', disabled) None
|
||
|
|
||
.form-group
|
||
label.control-label(for = 'newNetworkName') Name
|
||
input#newNetworkName.form-control(type = 'text', ng-model = 'newNetworkName', required)
|
||
|
|
||
.form-group
|
||
label.control-label(for = 'newNetworkDescription') Description
|
||
input#newNetworkDescription.form-control(type = 'text', ng-model = 'newNetworkDescription', placeholder= 'Network created with Xen Orchestra')
|
||
|
|
||
.form-group
|
||
label.control-label(for = 'newNetworkVlan') VLAN
|
||
input#newNetworkVlan.form-control(type = 'text', ng-model = 'newNetworkVlan', placeholder = 'Defaut: no VLAN')
|
||
|
|
||
.form-group
|
||
label(for = 'newNetworkMTU') MTU
|
||
input#newNetworkMTU.form-control(type = 'text', ng-model = 'newNetworkMTU', placeholder = 'Default: 1500')
|
||
|
|
||
.form-group
|
||
button.btn.btn-primary(type = 'submit')
|
||
i.fa.fa-plus-square
|
||
| Create
|
||
span(ng-if = 'createNetworkWaiting')
|
||
|
|
||
i.fa.fa-spin.fa-circle-o-notch
|
||
br
|
||
//- CPU and Logs panels
|
||
.grid
|
||
//- Task panel
|
||
.panel.panel-default
|
||
.panel-heading.panel-title(ng-if="tasks | isNotEmpty")
|
||
i.fa.fa-spinner.fa-pulse(style="color: #e25440;")
|
||
| Pending tasks
|
||
.panel-heading.panel-title(ng-if="tasks | isEmpty")
|
||
i.fa.fa-spinner(style="color: #e25440;")
|
||
| Pending tasks
|
||
.panel-body
|
||
p.center(ng-if="tasks | isEmpty") No recent tasks
|
||
table.table.table-hover(ng-if="tasks | isNotEmpty")
|
||
th Date
|
||
th Progress
|
||
th Name
|
||
//- TODO: working reverse order, from recent to oldest
|
||
tr(ng-repeat="task in tasks | map | orderBy:'created':true track by task.id")
|
||
td.oneliner {{task.created * 1e3 | date:'medium'}}
|
||
td
|
||
.progress-condensed
|
||
.progress-bar.progress-bar-success.progress-bar-striped.active.progress-bar-black(role="progressbar", aria-valuemin="0", aria-valuenow="{{task.progress*100}}", aria-valuemax="100", style="width: {{task.progress*100}}%", tooltip="Progress: {{task.progress*100 | number:1}}%")
|
||
| {{task.progress*100 | number:1}}%
|
||
td.oneliner
|
||
| {{task.name_label}}
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(xo-click="cancelTask(task.id)")
|
||
i.fa.fa-times.fa-lg(tooltip="Cancel this task")
|
||
a(xo-click="destroyTask(task.id)")
|
||
i.fa.fa-trash-o.fa-lg(tooltip="Destroy this task")
|
||
|
||
|
||
//- Logs panel
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.fa.fa-comments(style="color: #e25440;")
|
||
| Logs
|
||
span.quick-edit(ng-if="host.messages | isNotEmpty", tooltip="Remove all logs", ng-click="deleteAllLog()")
|
||
i.fa.fa-trash-o.fa-fw
|
||
.panel-body
|
||
p.center(ng-if="host.messages | isEmpty") No recent logs
|
||
table.table.table-hover(ng-if="host.messages | isNotEmpty")
|
||
th Date
|
||
th Name
|
||
tr(ng-repeat="message in host.messages | map | orderBy:'-time' | slice:(5*(currentLogPage-1)):(5*currentLogPage) track by message.id")
|
||
td {{message.time*1e3 | date:"medium"}}
|
||
td
|
||
| {{message.name}}
|
||
span.pull-right.btn-group.quick-buttons
|
||
a(xo-click="deleteLog(message.id)")
|
||
i.fa.fa-trash-o.fa-lg(tooltip="Remove this log entry")
|
||
.center(ng-if = '(host.messages | count) > 5')
|
||
pagination(boundary-links="true", total-items="host.messages | count", ng-model="$parent.currentLogPage", items-per-page="5", max-size="5", class="pagination-sm", previous-text="<", next-text=">", first-text="<<", last-text=">>")
|
||
.grid
|
||
//- Patches panel
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.fa.fa-file-code-o(style="color: #e25440;")
|
||
| Patches
|
||
span.quick-edit(ng-click="listMissingPatches(host.id)", tooltip="Check for updates")
|
||
i.fa.fa-question-circle
|
||
.panel-body
|
||
table.table.table-hover(ng-if="poolPatches || updates")
|
||
th.col-sm-2 Name
|
||
th.col-sm-5 Description
|
||
th.col-sm-3 Applied/Released date
|
||
th.col-sm-1 Size
|
||
th.col-sm-1 Status
|
||
tr(ng-repeat="patch in updates")
|
||
td.oneliner {{patch.name}}
|
||
td.oneliner
|
||
a(href="{{patch.documentationUrl}}", target="_blank") {{patch.description}}
|
||
td.oneliner {{patch.date | date:"medium"}}
|
||
td -
|
||
td
|
||
span(ng-click="installPatch(host.id, patch.uuid)", tooltip="Click to install the patch on this host")
|
||
span.label.label-danger Missing
|
||
tr(ng-repeat="patch in poolPatches | map | slice:(5*(currentPatchPage-1)):(5*currentPatchPage)")
|
||
td.oneliner {{patch.name_label}}
|
||
td.oneliner {{patch.name_description}}
|
||
//- TODO: use a proper function for patch date, like poolPatchToHostPatch
|
||
td.oneliner {{((patch.$host_patches[0]) | resolve).time*1e3 | date:"medium"}}
|
||
td {{patch.size | bytesToSize}}
|
||
td
|
||
span(ng-if="isPoolPatchApplied(patch)")
|
||
span.label.label-success Applied
|
||
span(ng-click="installPatch(host.id, patch.id)", ng-if="!isPoolPatchApplied(patch)", tooltip="Click to apply the patch on this host")
|
||
span.label.label-warning Not applied
|
||
//- span.pull-right.btn-group.quick-buttons
|
||
//- a(xo-click="deletePatch(patch.id)")
|
||
//- i.fa.fa-trash-o.fa-lg(tooltip="Remove this patch")
|
||
.center(ng-if = '(poolPatches | count) > 5')
|
||
pagination(boundary-links="true", total-items="poolPatches | count", ng-model="$parent.currentPatchPage", items-per-page="5", max-size="5", class="pagination-sm", previous-text="<", next-text=">", first-text="<<", last-text=">>")
|
||
|
||
.grid
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.fa.fa-plug(style="color: #e25440;")
|
||
| PCI Devices
|
||
.panel-body
|
||
p.center(ng-if="!host.$PCIs") No PCI devices available
|
||
table.table.table-hover(ng-if="host.$PCIs")
|
||
th PCI Info
|
||
th Device Name
|
||
tr(ng-repeat="pci in host.$PCIs | resolve | orderBy:'pci_id' | slice:(5*(currentPCIPage-1)):(5*currentPCIPage) track by pci.id")
|
||
td.oneliner {{pci.pci_id}} ({{pci.class_name}})
|
||
td.oneliner {{pci.device_name}}
|
||
.center(ng-if = '(host.$PCIs | resolve).length > 5')
|
||
pagination(boundary-links="true", total-items="(host.$PCIs | resolve).length", ng-model="$parent.currentPCIPage", items-per-page="5", max-size="5", class="pagination-sm", previous-text="<", next-text=">", first-text="<<", last-text=">>")
|
||
.panel.panel-default
|
||
.panel-heading.panel-title
|
||
i.fa.fa-desktop(style="color: #e25440;")
|
||
| GPUs
|
||
.panel-body
|
||
p.center(ng-if="host.$PGPUs.length === 0") No GPUs available
|
||
table.table.table-hover(ng-if="host.$PGPUs.length !== 0")
|
||
th Device
|
||
tr(ng-repeat="pgpu in host.$PGPUs | resolve | orderBy:'device' | slice:(5*(currentGPUPage-1)):(5*currentGPUPage) track by pgpu.id")
|
||
td.oneliner {{pgpu.device}}
|
||
.center(ng-if = '(host.$PGPUs | resolve).length > 5')
|
||
pagination(boundary-links="true", total-items="(host.$PGPUs | resolve).length", ng-model="$parent.currentGPUPage", items-per-page="5", max-size="5", class="pagination-sm", previous-text="<", next-text=">", first-text="<<", last-text=">>")
|