<rd-header> <rd-header-title title="Node details"> <a data-toggle="tooltip" title="Refresh" ui-sref="node({id: node.Id})" ui-sref-opts="{reload: true}"> <i class="fa fa-refresh" aria-hidden="true"></i> </a> </rd-header-title> <rd-header-content> <a ui-sref="swarm">Swarm nodes</a> > <a ui-sref="node({id: node.Id})">{{ node.Hostname }}</a> </rd-header-content> </rd-header> <div class="row" ng-if="!node"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <div ng-if="loading"> <i class="fa fa-cog fa-spin"></i> Loading... </div> <rd-widget ng-if="!loading"> <rd-widget-header icon="fa-object-group" title="Node does not exist"></rd-widget-header> <rd-widget-body> <p>It looks like the node you wish to inspect does not exist.</p> </rd-widget-body> </rd-widget> </div> </div> <div class="row" ng-if="node"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <rd-widget> <rd-widget-header icon="fa-object-group" title="Node specification"></rd-widget-header> <rd-widget-body classes="no-padding"> <table class="table"> <tbody> <tr> <td>Name</td> <td> <input type="text" class="input-sm" ng-model="node.Name" placeholder="e.g. my-manager" ng-change="updateNodeAttribute(node, 'Name')"> </td> </tr> <tr> <td>Host name</td> <td>{{ node.Hostname }}</td> </tr> <tr> <td>Role</td> <td>{{ node.Role }}</td> </tr> <tr> <td>Availability</td> <td> <div class="input-group input-group-sm"> <select name="nodeAvailability" class="selectpicker form-control" ng-model="node.Availability" ng-change="updateNodeAttribute(node, 'Availability')"> <option value="active">Active</option> <option value="pause">Pause</option> <option value="drain">Drain</option> </select> </div> </td> </tr> <tr> <td>Status</td> <td><span class="label label-{{ node.Status|nodestatusbadge }}">{{ node.Status }}</span></td> </tr> </tbody> </table> </rd-widget-body> <rd-widget-footer> <p class="small text-muted"> View the Docker Swarm mode Node documentation <a href="https://docs.docker.com/engine/swarm/manage-nodes/" target="self">here</a>. </p> <div class="btn-toolbar" role="toolbar"> <div class="btn-group" role="group"> <button type="button" class="btn btn-primary" ng-disabled="!hasChanges(node, ['Name', 'Availability'])" ng-click="updateNode(node)">Apply changes</button> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a ng-click="cancelChanges(node)">Reset changes</a></li> </ul> </div> </div> </rd-widget-footer> </rd-widget> </div> </div> <div class="row" ng-if="node && node.Role === 'manager'"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <rd-widget> <rd-widget-header icon="fa-object-group" title="Manager status"></rd-widget-header> <rd-widget-body classes="no-padding"> <table class="table"> <tbody> <tr> <td>Leader</td> <td> <span ng-if="node.Leader"><i class="fa fa-check green-icon" aria-hidden="true"></i> Yes</span> <span ng-if="!node.Leader"><i class="fa fa-times red-icon" aria-hidden="true"></i> No</span> </td> </tr> <tr> <td>Reachability</td> <td>{{ node.Reachability }}</td> </tr> <tr> <td>Manager address</td> <td>{{ node.ManagerAddr }}</td> </tr> </tbody> </table> </rd-widget-body> </rd-widget> </div> </div> <div class="row" ng-if="node"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <rd-widget> <rd-widget-header icon="fa-object-group" title="Node description"></rd-widget-header> <rd-widget-body classes="no-padding"> <table class="table"> <tbody> <tr> <td>CPU</td> <td>{{ node.CPUs / 1000000000 }}</td> </tr> <tr> <td>Memory</td> <td>{{ node.Memory|humansize: 2 }}</td> </tr> <tr> <td>Platform</td> <td>{{ node.PlatformOS }} {{ node.PlatformArchitecture }} </td> </tr> <tr> <td>Docker Engine version</td> <td>{{ node.EngineVersion }}</td> </tr> </tbody> </table> </rd-widget-body> </rd-widget> </div> </div> <div class="row" ng-if="node"> <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12"> <rd-widget> <rd-widget-header icon="fa-tasks" title="Node labels"> <div class="nopadding"> <a class="btn btn-default btn-sm pull-right" ng-click="addLabel(node)"> <i class="fa fa-plus-circle" aria-hidden="true"></i> label </a> </div> </rd-widget-header> <rd-widget-body ng-if="!node.Labels || node.Labels.length === 0"> <p>There are no labels for this node.</p> </rd-widget-body> <rd-widget-body classes="no-padding" ng-if="node.Labels && node.Labels.length > 0"> <table class="table"> <thead> <tr> <th>Label</th> <th>Value</th> </tr> </thead> <tbody> <tr ng-repeat="label in node.Labels"> <td> <div class="input-group input-group-sm"> <span class="input-group-addon fit-text-size">name</span> <input type="text" class="form-control" ng-model="label.key" placeholder="e.g. com.example.foo" ng-change="updateLabel(node, label)"> </div> </td> <td> <div class="input-group input-group-sm"> <span class="input-group-addon fit-text-size">value</span> <input type="text" class="form-control" ng-model="label.value" placeholder="e.g. bar" ng-change="updateLabel(node, label)"> <span class="input-group-btn"> <button class="btn btn-sm btn-danger" type="button" ng-click="removeLabel(node, $index)"> <i class="fa fa-trash" aria-hidden="true"></i> </button> </span> </div> </td> </tr> </tbody> </table> </rd-widget-body> <rd-widget-footer> <div class="btn-toolbar" role="toolbar"> <div class="btn-group" role="group"> <button type="button" class="btn btn-primary btn-sm" ng-disabled="!hasChanges(node, ['Labels'])" ng-click="updateNode(node)">Apply changes</button> <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a ng-click="cancelChanges(node)">Reset changes</a></li> </ul> </div> </div> </rd-widget-footer> </rd-widget> </div> </div> <div class="row" ng-if="node && tasks.length > 0"> <div class="col-lg-12 col-md-12 col-xs-12"> <rd-widget> <rd-widget-header icon="fa-tasks" title="Associated tasks"> <div class="pull-right"> Items per page: <select ng-model="state.pagination_count" ng-change="changePaginationCount()"> <option value="0">All</option> <option value="10">10</option> <option value="25">25</option> <option value="50">50</option> <option value="100">100</option> </select> </div> </rd-widget-header> <rd-widget-body classes="no-padding"> <table class="table"> <thead> <tr> <th>Id</th> <th> <a ui-sref="node" ng-click="order('Status')"> Status <span ng-show="sortType == 'Status' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span> <span ng-show="sortType == 'Status' && sortReverse" class="glyphicon glyphicon-chevron-up"></span> </a> </th> <th> <a ui-sref="node" ng-click="order('Slot')"> Slot <span ng-show="sortType == 'Slot' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span> <span ng-show="sortType == 'Slot' && sortReverse" class="glyphicon glyphicon-chevron-up"></span> </a> </th> <th> <a ui-sref="node" ng-click="order('Image')"> Image <span ng-show="sortType == 'Image' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span> <span ng-show="sortType == 'Image' && sortReverse" class="glyphicon glyphicon-chevron-up"></span> </a> </th> <th> <a ui-sref="node" ng-click="order('Updated')"> Last update <span ng-show="sortType == 'Updated' && !sortReverse" class="glyphicon glyphicon-chevron-down"></span> <span ng-show="sortType == 'Updated' && sortReverse" class="glyphicon glyphicon-chevron-up"></span> </a> </th> </tr> </thead> <tbody> <tr dir-paginate="task in (filteredTasks = ( tasks | orderBy:sortType:sortReverse | itemsPerPage: state.pagination_count))"> <td><a ui-sref="task({ id: task.Id })">{{ task.Id }}</a></td> <td><span class="label label-{{ task.Status|taskstatusbadge }}">{{ task.Status }}</span></td> <td>{{ task.Slot }}</td> <td>{{ task.Image }}</td> <td>{{ task.Updated|getisodate }}</td> </tr> </tbody> </table> <div ng-if="tasks" class="pagination-controls"> <dir-pagination-controls></dir-pagination-controls> </div> </rd-widget-body> </rd-widget> </div> </div>