Add boot option override and TPM enable toggle
- Adds ability to set a bootsource override to allowable target value
- Adds ability to enable or disable TPM required policy
- Replaces power operations confirm directive with bootstrap modal
Tested: Confirmed override settings saved to redfish but unable to verify
if settings are automatically set to disabled by petitboot after a
one time boot. Passes DAP.
Resolves openbmc/phosphor-webui#82
Resolves openbmc/phosphor-webui#90
Signed-off-by: Dixsie Wolmers <dixsiew@gmail.com>
Change-Id: If0ffd6f9328939d70c7958ee11fb90bd20a1e685
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
diff --git a/app/server-control/controllers/power-operations-controller.html b/app/server-control/controllers/power-operations-controller.html
index ddf8bda..2ef5323 100644
--- a/app/server-control/controllers/power-operations-controller.html
+++ b/app/server-control/controllers/power-operations-controller.html
@@ -1,58 +1,172 @@
<loader loading="dataService.loading || loading"></loader>
-<div id="power-operations">
- <div class="row column">
- <h1>Server power operations</h1>
- <div class="power__current-status page-header">
- <h2 class="inline">Current status</h2>
- <div class="power__status-log inline float-right">Last power operation at <span class="courier-bold">{{powerTime | localeDate}}</span></div>
- </div>
+<div id="power-operations" class="power-operations">
+ <div class="row column">
+ <h1>Server power operations</h1>
+ <div class="power__current-status page-header">
+ <h2 class="inline">Current status</h2>
+ <div class="power__status-log inline float-right">
+ Last power operation at
+ <span class="courier-bold">{{ powerTime | localeDate }}</span>
+ </div>
</div>
- <div class="row column">
- <div id="power-indicator-bar" class="power__indicator-bar" ng-class="{'power__state-on': dataService.server_state == 'Running', 'power__state-off': dataService.server_state == 'Off', 'power__state-indet': dataService.server_state == 'Standby', 'power__state-error': dataService.server_state == 'Quiesced'}">
- <p class="inline">{{dataService.hostname}} - {{dataService.server_id}}</p>
- <h3 class="power__state inline no-margin h3"><span>{{dataService.server_state | quiescedToError}}</span></h3>
- </div>
+ </div>
+ <!-- Power Indicator Bar -->
+ <div class="row column">
+ <div id="power-indicator-bar" class="power__indicator-bar"
+ ng-class="{'power__state-on': dataService.server_state == 'Running', 'power__state-off': dataService.server_state == 'Off', 'power__state-indet': dataService.server_state == 'Standby', 'power__state-error': dataService.server_state == 'Quiesced'}">
+ <p class="inline">
+ {{ dataService.hostname }} - {{ dataService.server_id }}
+ </p>
+ <h3 class="power__state inline no-margin h3">
+ <span>{{ dataService.server_state | quiescedToError }}</span>
+ </h3>
</div>
- <div class="row column">
- <div class="row column">
- <h3 class="subhead">Select a power operation</h3>
+ </div>
+ <div class="row column">
+ <!-- Boot Settings Column -->
+ <div class="large-4 columns boot-options-wrapper">
+ <form id="host-boot-settings" name="hostBootSettings" class="host-boot-settings" novalidate>
+ <h2 class="subhead boot-options">Host OS boot settings</h2>
+ <div class="boot-settings-form">
+ <div class="boot-options">
+ <label for="boot-selected">
+ Boot setting override</label>
+ <select id="boot-selected" name="bootSelected" id="boot-selected" ng-disabled="dataService.server_unreachable || bootOverrideError"
+ ng-model="boot.BootSourceOverrideTarget">
+ <option class="courier-bold" value="{{bootSource}}" ng-repeat="bootSource in bootSources">
+ {{ bootSource }}
+ </option>
+ </select>
+ <div class="boot-options one-time-boot-setting">
+ <div class="align-self-center">
+ <label class="control-check" id="one-time-label"> <span class="inline boot-checkbox">Enable one time boot</span>
+ <input type="checkbox" name="oneTime"
+ ng-disabled="dataService.server_unreachable || bootOverrideError || boot.BootSourceOverrideTarget =='None' " ng-model="boot.oneTimeBootEnabled"
+ ng-change="oneTimeBootEnabled" />
+ <span class="control__indicator"> </span>
+ </label>
+ </div>
+ </div>
</div>
- <div ng-if="operationPending">
- <span class="inactive-message">There are no power operations to display while a power operation is in progress. When complete, any new power operations will be displayed here.</span>
- </div>
- <div ng-if="!operationPending">
- <!-- Power on displays only when server is shutdown -->
- <div class="row column power-option" ng-hide="dataService.server_state == 'Running' || dataService.server_state == 'Quiesced' || dataService.server_state == 'Unreachable'" ng-class="{disabled: dataService.server_unreachable || confirm || dataService.loading, transitionAll: confirm}">
- <button id="power__power-on" class="btn btn-secondary" ng-click="powerOn()" role="button" ng-disabled="dataService.server_unreachable">
- <icon file="icon-power.svg"></icon>Power on
+ <!-- TPM Required -->
+ <div class="boot-options one-time-boot-setting">
+ <div class="boot-options">
+ <h3 class="content-label">
+ TPM required policy</h3>
+ <p> Enable to ensure the system only boots when the TPM is functional. </p>
+ <!-- Toggle component -->
+ <div class="toggle-container">
+ <div class="toggle">
+ <input
+ id="toggle__switch-round"
+ class="toggle-switch toggle-switch__round-flat"
+ name="toggle"
+ type="checkbox"
+ tabindex="0"
+ ng-model="TPMToggle.TPMEnable"
+ ng-disabled="dataService.server_unreachable"
+ />
+ <label for="toggle__switch-round" tabindex="0"
+ >TPM required policy is {{ TPMToggle.TPMEnable ? "On" : "Off" }}</label
+ >
+ </div>
+ <span>
+ {{ TPMToggle.TPMEnable ? "On" : "Off" }}
+ </span>
+ </div>
+ </div>
+ </div>
+ <!-- form actions -->
+ <div class="boot-form-actions">
+ <button type="submit" class="btn btn-primary" ng-click="saveBootSettings();saveTPMPolicy();hostBootSettings.$setPristine()" ng-disabled="dataService.server_unreachable || hostBootSettings.$pristine;">
+ Save
+ </button>
+ <button type="reset" class="btn btn-secondary" ng-disabled="dataService.server_unreachable || hostBootSettings.$pristine" ng-click="resetForm();hostBootSettings.$setPristine()">
+ Cancel
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+ <!-- Power Operations Column -->
+ <div class="large-8 columns operations-wrapper">
+ <h2 class="subhead boot-operations">Operations</h2>
+ <!-- Pending one time boot alert -->
+ <div class="alert-warning"
+ ng-if="boot.oneTimeBootEnabled" ng-hide="dataService.server_state == 'Unreachable'">
+ <div class="pending-icon">
+ <icon file="icon-pending.svg"></icon>
+ </div>
+ <p class="alert-pending">
+ Pending one time boot. Next boot will be performed with the
+ specified one time boot settings. Subsequent boots will be performed
+ with the default settings.
+ </p>
+ </div>
+ <!-- Pending reboot warning -->
+ <p ng-show="operationPending">
+ There are no power operations to display while power operation is in
+ progress. When complete, any new power operations will be displayed
+ here.
+ </p>
+ <div ng-show="!operationPending">
+ <!-- Power on displays only when server is off -->
+ <div class="row column" ng-show="dataService.server_state == 'Off'"
+ ng-class="{disabled: dataService.server_unreachable}">
+ <button id="power__power-on" class="btn btn-primary inline" ng-click="powerOn()" role="button"
+ ng-disabled="dataService.server_unreachable">
+ Power on
+ </button>
+ </div>
+ <!-- Reboot/shutdown column -->
+ <div
+ ng-show="dataService.server_state !== 'Off'">
+ <div class="reboot__operations">
+ <form id="reboot-form" name="rebootForm" class="reboot-form">
+ <fieldset>
+ <legend class="boot-operations">Reboot server</legend>
+ <label class="control-radio">Orderly - OS shuts down, then server reboots
+ <input type="radio" name="radioReboot"
+ ng-model="defaultRebootSetting" value="warm-reboot" />
+ <span class="control__indicator control__indicator-on"></span>
+ </label>
+ <label class="control-radio">Immediate - Server reboots without OS shutting down; may cause data corruption
+ <input type="radio" name="radioReboot"
+ ng-model="defaultRebootSetting" value="cold-reboot" />
+ <span class="control__indicator control__indicator-on"></span>
+ </label>
+ </fieldset>
+ <div>
+ <button class="btn-primary" ng-click="rebootConfirmModal()" type="submit" ng-disabled="dataService.server_unreachable">
+ Reboot
</button>
- <p class="inline">Attempts to power on the server</p>
+ </div>
+ </form>
+ </div>
+ <!-- Shutdown Field Row -->
+ <div class="shutdown__operations">
+ <form id="shutdown-form" name="shutdownForm" class="shutdown-form">
+ <fieldset>
+ <legend class="boot-operations">Shutdown server</legend>
+ <label class="control-radio">Orderly - OS shuts down, then server shuts down
+ <input type="radio" name="radioShutdown" ng-model="defaultShutdownSetting"
+ value='warm-shutdown' />
+ <span class="control__indicator control__indicator-on"></span>
+ </label>
+ <label class="control-radio">Immediate - Server shuts down without OS shutting down; may cause data corruption
+ <input type="radio" name="radioShutdown" ng-model="defaultShutdownSetting"
+ value='cold-shutdown' />
+ <span class="control__indicator control__indicator-on"></span>
+ </label>
+ </fieldset>
+ <div>
+ <button class="btn-primary" ng-click="shutdownConfirmModal()" type="submit" ng-disabled="dataService.server_unreachable">
+ Shut down
+ </button>
</div>
- <!-- Power reboot/shutdown options : when server is off all of these are hidden. When one option is selected, the others are disabled. -->
- <div class="column power-option" ng-hide="dataService.server_state == 'Off' || dataService.server_state == 'Unreachable'" ng-class="{disabled: dataService.server_unreachable || (confirm && !confirmWarmReboot) || dataService.loading, transitionAll: confirm && confirmWarmReboot}">
- <button id="power__warm-boot" class="btn btn-secondary" ng-click="warmRebootConfirm()" role="button" ng-disabled="dataService.server_unreachable">
- <icon file="icon-restart.svg"></icon>Warm reboot</button>
- <p class="inline">Attempts to perform an orderly shutdown before restarting the server</p>
- <confirm title="warm reboot" confirm="confirmWarmReboot" ng-show="confirmWarmReboot" callback="warmReboot"></confirm>
- </div>
- <div class="column power-option" ng-hide="dataService.server_state == 'Off' || dataService.server_state == 'Unreachable'" ng-class="{disabled: dataService.server_unreachable || (confirm && !confirmColdReboot) || dataService.loading, transitionAll: confirm && confirmColdReboot}">
- <button id="power__cold-boot" class="btn btn-secondary" ng-click="coldRebootConfirm()" role="button" ng-disabled="dataService.server_unreachable">
- <icon file="icon-restart.svg"></icon>Cold reboot</button>
- <p class="inline">Shuts down the server immediately, then restarts it</p>
- <confirm title="cold reboot" confirm="confirmColdReboot" ng-show="confirmColdReboot" cancel="coldbootCancel" callback="coldReboot"></confirm>
- </div>
- <div class="column power-option" ng-hide="dataService.server_state == 'Off' || dataService.server_state == 'Unreachable'" ng-class="{disabled: dataService.server_unreachable || (confirm && !confirmOrderlyShutdown) || dataService.loading, transitionAll: confirm && confirmOrderlyShutdown}">
- <button id="power__soft-shutdown" class="btn btn-secondary" ng-click="orderlyShutdownConfirm()" role="button" ng-disabled="dataService.server_unreachable">
- <icon file="icon-power.svg"></icon>Orderly shutdown</button>
- <p class="inline">Attempts to stop all software on the server before removing power</p>
- <confirm title="orderly shutdown" confirm="confirmOrderlyShutdown" ng-show="confirmOrderlyShutdown" cancel="orderlyShutdownCancel" callback="orderlyShutdown"></confirm>
- </div>
- <div class="column power-option" ng-hide="dataService.server_state == 'Off' || dataService.server_state == 'Unreachable'" ng-class="{disabled: dataService.server_unreachable || (confirm && !confirmImmediateShutdown) || dataService.loading, transitionAll: confirm && confirmImmediateShutdown}">
- <button id="power__hard-shutdown" class="btn btn-secondary" ng-click="immediateShutdownConfirm()" role="button" ng-disabled="dataService.server_unreachable">
- <icon file="icon-power.svg"></icon>Immediate shutdown</button>
- <p class="inline">Removes power from the server without waiting for software to stop</p>
- <confirm title="immediate shutdown" confirm="confirmImmediateShutdown" ng-show="confirmImmediateShutdown" cancel="immediatelyShutdownCancel" callback="immediateShutdown"></confirm>
- </div>
- </div>
+ </form>
+ </div>
</div>
-</div>
+ </div>
+ </div>
+</div>
\ No newline at end of file