@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
360 lines (358 loc) • 17.1 kB
HTML
<div class="details-panel" ng-class="{ disabled: ctrl.serverGroup.isDisabled }">
<div class="header" ng-if="ctrl.state.loading">
<div class="close-button">
<a class="btn btn-link" ui-sref="^">
<span class="glyphicon glyphicon-remove"></span>
</a>
</div>
<div class="horizontal center middle">
<loading-spinner size="'small'"></loading-spinner>
</div>
</div>
<div class="header" ng-if="!ctrl.state.loading">
<div class="close-button">
<a class="btn btn-link" ui-sref="^">
<span class="glyphicon glyphicon-remove"></span>
</a>
</div>
<div class="header-text horizontal middle">
<cloud-provider-logo provider="ctrl.serverGroup.type" height="'36px'" width="'36px'"></cloud-provider-logo>
<h3 class="horizontal middle space-between flex-1" select-on-dbl-click>
{{ctrl.serverGroup.name}}
<render-if-feature feature="entityTags">
<entity-notifications
entity="ctrl.serverGroup"
application="ctrl.application"
placement="bottom"
h-offset-percent="90%"
entity-type="serverGroup"
page-location="details"
on-update="ctrl.application.serverGroups.refresh()"
></entity-notifications>
</render-if-feature>
</h3>
</div>
<div>
<div class="actions" ng-class="{ insights: ctrl.serverGroup.insightActions.length > 0 }">
<div class="dropdown" uib-dropdown dropdown-append-to-body>
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" uib-dropdown-toggle>
Server Group Actions <span class="caret"></span>
</button>
<ul class="dropdown-menu" uib-dropdown-menu role="menu">
<li><a href ng-if="!ctrl.serverGroup.isDisabled" ng-click="ctrl.rollbackServerGroup()">Rollback</a></li>
<li role="presentation" class="divider" ng-if="!ctrl.serverGroup.isDisabled"></li>
<li><a href ng-click="ctrl.resizeServerGroup()">Resize</a></li>
<li><a href ng-if="!ctrl.serverGroup.isDisabled" ng-click="ctrl.disableServerGroup()">Disable</a></li>
<li>
<a
href
ng-if="ctrl.serverGroup.isDisabled && (ctrl.serverGroup.loadBalancers.length || ctrl.serverGroup.discovery)"
ng-click="ctrl.enableServerGroup()"
>Enable</a
>
</li>
<li><a href ng-click="ctrl.destroyServerGroup()">Destroy</a></li>
<li><a href ng-click="ctrl.cloneServerGroup(ctrl.serverGroup)">Clone</a></li>
<render-if-feature feature="entityTags">
<add-entity-tag-links
component="ctrl.serverGroup"
application="ctrl.application"
entity-type="serverGroup"
owner-options="ctrl.entityTagTargets"
on-update="ctrl.application.serverGroups.refresh()"
></add-entity-tag-links>
</render-if-feature>
</ul>
</div>
<div class="dropdown" ng-if="ctrl.serverGroup.insightActions.length > 0" uib-dropdown dropdown-append-to-body>
<button type="button" class="btn btn-sm btn-default dropdown-toggle" uib-dropdown-toggle>
Insight <span class="caret"></span>
</button>
<ul class="dropdown-menu" uib-dropdown-menu role="menu">
<li ng-repeat="action in ctrl.serverGroup.insightActions">
<a target="_blank" href="{{action.url}}">{{action.label}}</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="content" ng-if="!ctrl.state.loading">
<h4 class="text-center" ng-if="ctrl.serverGroup.isDisabled">[SERVER GROUP IS DISABLED]</h4>
<server-group-running-tasks-details
server-group="ctrl.serverGroup"
application="ctrl.application"
></server-group-running-tasks-details>
<collapsible-section heading="Server Group Information" expanded="true">
<dl class="dl-horizontal dl-narrow">
<dt>Created</dt>
<dd>{{ctrl.serverGroup.launchConfig.createdTime | timestamp}}</dd>
<render-if-feature feature="entityTags">
<entity-source metadata="ctrl.serverGroup.entityTags.creationMetadata"></entity-source>
</render-if-feature>
<dt>In</dt>
<dd>
<account-tag account="ctrl.serverGroup.account" pad="right"></account-tag>
{{ctrl.serverGroup.region}}
</dd>
<dt>Network</dt>
<dd>{{ctrl.serverGroup.network}}</dd>
<dt ng-if="ctrl.serverGroup.subnet">Subnet</dt>
<dd ng-if="ctrl.serverGroup.subnet">{{ctrl.serverGroup.subnet}}</dd>
<dt>Zone{{ctrl.serverGroup.regional ? 's' : ''}}</dt>
<dd>
<ul>
<li ng-repeat="zone in ctrl.serverGroup.zones">{{zone}}</li>
</ul>
</dd>
<dt ng-if="ctrl.serverGroup.regional">Target Shape</dt>
<dd ng-if="ctrl.serverGroup.regional">{{ctrl.serverGroup.distributionPolicy.targetShape}}</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Size" expanded="true">
<dl class="dl-horizontal dl-narrow" ng-if="ctrl.serverGroup.asg.minSize === ctrl.serverGroup.asg.maxSize">
<dt>Min/Max</dt>
<dd>{{ctrl.serverGroup.asg.desiredCapacity}}</dd>
<dt>Current</dt>
<dd>{{ctrl.serverGroup.instances.length}}</dd>
</dl>
<dl class="dl-horizontal dl-narrow" ng-if="ctrl.serverGroup.asg.minSize !== ctrl.serverGroup.asg.maxSize">
<dt>Min</dt>
<dd>{{ctrl.serverGroup.asg.minSize}}</dd>
<dt>Desired</dt>
<dd>{{ctrl.serverGroup.asg.desiredCapacity}}</dd>
<dt>Max</dt>
<dd>{{ctrl.serverGroup.asg.maxSize}}</dd>
<dt>Current</dt>
<dd>{{ctrl.serverGroup.instances.length}}</dd>
</dl>
<a href ng-click="ctrl.resizeServerGroup()">Resize Server Group</a>
</collapsible-section>
<collapsible-section heading="Current Actions" ng-if="ctrl.serverGroup.currentActionsSummary">
<dl class="dl-horizontal dl-narrow">
<dt ng-repeat-start="currentAction in ctrl.serverGroup.currentActionsSummary">{{currentAction.action}}</dt>
<dd ng-repeat-end>{{currentAction.count}}</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Health" expanded="true">
<dl class="dl-horizontal dl-narrow" ng-if="ctrl.serverGroup">
<dt>Instances</dt>
<dd>
<health-counts container="ctrl.serverGroup.instanceCounts" class="pull-left"></health-counts>
</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Launch Configuration">
<dl class="horizontal-when-filters-collapsed">
<dt>Name</dt>
<dd>{{ctrl.serverGroup.launchConfig.launchConfigurationName}}</dd>
<dt>Image</dt>
<dd>{{ctrl.serverGroup.launchConfig.imageId}}</dd>
<dt>Instance Type</dt>
<dd>{{ctrl.serverGroup.launchConfig.instanceType | customInstanceFilter }}</dd>
<dt>Minimum CPU Platform</dt>
<dd>{{ctrl.serverGroup.launchConfig.minCpuPlatform || '(Automatic)'}}</dd>
<gce-server-group-disk-descriptions application="ctrl.application" server-group="ctrl.serverGroup">
</gce-server-group-disk-descriptions>
<dt ng-if="ctrl.serverGroup.serviceAccountEmail">Service Account</dt>
<dd ng-if="ctrl.serverGroup.serviceAccountEmail">{{ctrl.serverGroup.serviceAccountEmail}}</dd>
<dt ng-if="ctrl.serverGroup.authScopes">Auth Scopes</dt>
<dd ng-repeat="authScope in ctrl.serverGroup.authScopes">
{{authScope}}
<help-field key="gce.instance.authScopes.{{authScope}}"></help-field>
</dd>
<dt>Network</dt>
<dd>{{ctrl.serverGroup.network}}</dd>
<dt ng-if="ctrl.serverGroup.subnet">Subnet</dt>
<dd ng-if="ctrl.serverGroup.subnet">{{ctrl.serverGroup.subnet}}</dd>
<dt>Associate Public IP Address</dt>
<dd>{{ctrl.serverGroup.associatePublicIPAddress}}</dd>
<dt>Can IP Forward</dt>
<dd>{{ctrl.serverGroup.canIpForward}}</dd>
<dt>Startup Script</dt>
<dd ng-if="ctrl.serverGroup.startupScript">
<a href ng-click="ctrl.showStartupScript()">Show Startup Script</a>
</dd>
<dd ng-if="!ctrl.serverGroup.startupScript">[none]</dd>
</dl>
</collapsible-section>
<collapsible-section heading="{{ctrl.firewallsLabel}}">
<ul>
<li ng-repeat="securityGroup in ctrl.securityGroups | orderBy:'name'">
<a
ui-sref="^.firewallDetails({name: securityGroup.name, accountId: securityGroup.accountName, region: 'global', provider: ctrl.serverGroup.type})"
>
{{securityGroup.name}}
</a>
</li>
</ul>
</collapsible-section>
<collapsible-section heading="Autoscaling">
<gce-add-autoscaling-policy-button
ng-if="!ctrl.serverGroup.autoscalingPolicy"
server-group="ctrl.serverGroup"
application="ctrl.application"
>
</gce-add-autoscaling-policy-button>
<gce-autoscaling-policy
ng-repeat="policy in [ctrl.serverGroup.autoscalingPolicy]"
ng-if="ctrl.serverGroup.autoscalingPolicy"
application="ctrl.application"
server-group="ctrl.serverGroup"
policy="policy"
>
</gce-autoscaling-policy>
</collapsible-section>
<collapsible-section heading="AutoHealing">
<gce-add-auto-healing-policy-button
ng-if="!ctrl.serverGroup.autoHealingPolicyHealthCheck"
application="ctrl.application"
server-group="ctrl.serverGroup"
></gce-add-auto-healing-policy-button>
<gce-auto-healing-policy-details
ng-if="ctrl.serverGroup.autoHealingPolicyHealthCheck"
application="ctrl.application"
server-group="ctrl.serverGroup"
></gce-auto-healing-policy-details>
</collapsible-section>
<collapsible-section heading="Custom Metadata">
<div ng-if="!ctrl.serverGroup.launchConfig.instanceTemplate.properties.metadata.items.length">
No custom metadata associated with this server group
</div>
<dl ng-if="ctrl.serverGroup.launchConfig.instanceTemplate.properties.metadata.items.length">
<dt ng-repeat-start="metadata in ctrl.serverGroup.launchConfig.instanceTemplate.properties.metadata.items">
{{metadata.key}}
<help-field key="gce.serverGroup.customMetadata.{{metadata.key}}"></help-field>
</dt>
<dd ng-repeat-end>{{metadata.value.length > 90 ? metadata.value.substring(0, 90) + "..." : metadata.value}}</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Tags">
<div ng-if="!ctrl.serverGroup.launchConfig.instanceTemplate.properties.tags.items.length">
No tags associated with this server group
</div>
<dl ng-if="ctrl.serverGroup.launchConfig.instanceTemplate.properties.tags.items.length">
<dd ng-repeat="tag in ctrl.serverGroup.launchConfig.instanceTemplate.properties.tags.items">
{{tag}}
<help-field
content="{{ctrl.serverGroup.launchConfig.instanceTemplate.properties.tags.helpMap[tag]}}"
></help-field>
</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Labels">
<div ng-if="!ctrl.serverGroup.instanceTemplateLabels">No labels associated with this server group</div>
<dl ng-if="ctrl.serverGroup.instanceTemplateLabels">
<dt ng-repeat-start="(key, value) in ctrl.serverGroup.instanceTemplateLabels">
{{key}}
<help-field key="gce.serverGroup.labels.{{key}}"></help-field>
</dt>
<dd ng-repeat-end>{{value}}</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Shielded VM Policies">
<div ng-if="!ctrl.serverGroup.shieldedVmConfig">No Shielded VM policies associated with this server group</div>
<dl ng-if="ctrl.serverGroup.shieldedVmConfig" class="horizontal-when-filters-collapsed">
<dt>
Secure Boot
<help-field key="gce.serverGroup.shieldedVmSecureBoot"></help-field>
</dt>
<dd>{{ctrl.serverGroup.shieldedVmConfig.enableSecureBoot}}</dd>
<dt>
vTPM
<help-field key="gce.serverGroup.shieldedVmVtpm"></help-field>
</dt>
<dd>{{ctrl.serverGroup.shieldedVmConfig.enableVtpm}}</dd>
<dt>
Integrity Monitoring
<help-field key="gce.serverGroup.shieldedVmIntegrityMonitoring"></help-field>
</dt>
<dd>{{ctrl.serverGroup.shieldedVmConfig.enableIntegrityMonitoring}}</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Availability Policies">
<div ng-if="!ctrl.serverGroup.availabilityPolicies">
No availability policies associated with this server group
</div>
<div ng-if="ctrl.serverGroup.availabilityPolicies">
<dl class="horizontal-when-filters-collapsed">
<dt>
Preemptibility
<help-field key="gce.serverGroup.preemptibility"></help-field>
</dt>
<dd>{{ctrl.serverGroup.availabilityPolicies.preemptibility}}</dd>
<dt>
Automatic Restart
<help-field key="gce.serverGroup.automaticRestart"></help-field>
</dt>
<dd>{{ctrl.serverGroup.availabilityPolicies.automaticRestart}}</dd>
<dt>
On Host Maintenance
<help-field key="gce.serverGroup.onHostMaintenance"></help-field>
</dt>
<dd>{{ctrl.serverGroup.availabilityPolicies.onHostMaintenance}}</dd>
</dl>
</div>
</collapsible-section>
<collapsible-section heading="Package" ng-if="ctrl.serverGroup.buildInfo">
<dl class="horizontal-when-filters-collapsed">
<dt ng-if="ctrl.serverGroup.buildInfo.jenkins">Job</dt>
<dd ng-if="ctrl.serverGroup.buildInfo.jenkins">{{ctrl.serverGroup.buildInfo.jenkins.name}}</dd>
<dt>Package</dt>
<dd>{{ctrl.serverGroup.buildInfo.package_name}}</dd>
<dt ng-if="ctrl.serverGroup.buildInfo.jenkins">Build</dt>
<dd ng-if="ctrl.serverGroup.buildInfo.jenkins">{{ctrl.serverGroup.buildInfo.jenkins.number}}</dd>
<dt>Commit</dt>
<dd>{{ctrl.truncateCommitHash()}}</dd>
<dt>Version</dt>
<dd>{{ctrl.serverGroup.buildInfo.version}}</dd>
<dt ng-if="ctrl.serverGroup.buildInfo.jenkins">Build Link</dt>
<dd ng-if="ctrl.serverGroup.buildInfo.jenkins">
<a target="_blank" href="{{ctrl.buildJenkinsLink()}}">{{ctrl.buildJenkinsLink()}}</a>
</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Port Name Mapping" ng-if="ctrl.serverGroup.loadBalancingPolicy">
<dl class="horizontal-when-filters-collapsed" ng-if="ctrl.serverGroup.loadBalancingPolicy.namedPorts.length">
<dd ng-repeat="namedPort in ctrl.serverGroup.loadBalancingPolicy.namedPorts">
{{ namedPort.name }} → {{ namedPort.port }}
</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Capacity Metrics" ng-if="ctrl.serverGroup.loadBalancingPolicy">
<dl class="horizontal-when-filters-collapsed" ng-if="ctrl.serverGroup.loadBalancingPolicy.listeningPort">
<dt>Balancing Mode</dt>
<dd>{{ctrl.serverGroup.loadBalancingPolicy.balancingMode}}</dd>
<dt ng-if="ctrl.serverGroup.loadBalancingPolicy.maxRatePerInstance">Max RPS per instance</dt>
<dd ng-if="ctrl.serverGroup.loadBalancingPolicy.maxRatePerInstance">
{{ctrl.serverGroup.loadBalancingPolicy.maxRatePerInstance}}
</dd>
<dt ng-if="ctrl.serverGroup.loadBalancingPolicy.maxUtilization">Max CPU Utilization</dt>
<dd ng-if="ctrl.serverGroup.loadBalancingPolicy.maxUtilization">
{{ctrl.serverGroup.loadBalancingPolicy.maxUtilization | decimalToPercent}}
</dd>
<dt ng-if="ctrl.serverGroup.loadBalancingPolicy.maxConnectionsPerInstance">Max connections per instance</dt>
<dd ng-if="ctrl.serverGroup.loadBalancingPolicy.maxConnectionsPerInstance">
{{ctrl.serverGroup.loadBalancingPolicy.maxConnectionsPerInstance}}
</dd>
<dt ng-if="ctrl.serverGroup.loadBalancingPolicy.capacityScaler">Capacity</dt>
<dd ng-if="ctrl.serverGroup.loadBalancingPolicy.capacityScaler">
{{ctrl.serverGroup.loadBalancingPolicy.capacityScaler | decimalToPercent}}
</dd>
</dl>
</collapsible-section>
<collapsible-section heading="Logs">
<ul>
<li ng-if="ctrl.serverGroup.logsLink">
<a href="{{ctrl.serverGroup.logsLink}}" target="_blank">Cloud Console Logs</a>
<copy-to-clipboard
class="copy-to-clipboard copy-to-clipboard-sm"
text="ctrl.serverGroup.logsLink"
tool-tip="'Copy to clipboard'"
>
</copy-to-clipboard>
</li>
</ul>
</collapsible-section>
</div>
</div>