mirror of https://github.com/rancher/ui.git
Merge pull request #3382 from codyrancher/template-revision
Include Template/Revision Upgrade Notifications
This commit is contained in:
commit
60b53de5db
|
|
@ -2,7 +2,7 @@ import { get, set, computed, observer } from '@ember/object';
|
||||||
import { on } from '@ember/object/evented';
|
import { on } from '@ember/object/evented';
|
||||||
import { inject as service } from '@ember/service';
|
import { inject as service } from '@ember/service';
|
||||||
import Resource from '@rancher/ember-api-store/models/resource';
|
import Resource from '@rancher/ember-api-store/models/resource';
|
||||||
import { hasMany } from '@rancher/ember-api-store/utils/denormalize';
|
import { hasMany, reference } from '@rancher/ember-api-store/utils/denormalize';
|
||||||
import ResourceUsage from 'shared/mixins/resource-usage';
|
import ResourceUsage from 'shared/mixins/resource-usage';
|
||||||
import Grafana from 'shared/mixins/grafana';
|
import Grafana from 'shared/mixins/grafana';
|
||||||
import { equal, alias } from '@ember/object/computed';
|
import { equal, alias } from '@ember/object/computed';
|
||||||
|
|
@ -11,6 +11,7 @@ import C from 'ui/utils/constants';
|
||||||
import { isEmpty } from '@ember/utils';
|
import { isEmpty } from '@ember/utils';
|
||||||
import moment from 'moment';
|
import moment from 'moment';
|
||||||
const TRUE = 'True';
|
const TRUE = 'True';
|
||||||
|
const CLUSTER_TEMPLATE_ID_PREFIX = 'cattle-global-data:';
|
||||||
|
|
||||||
export default Resource.extend(Grafana, ResourceUsage, {
|
export default Resource.extend(Grafana, ResourceUsage, {
|
||||||
globalStore: service(),
|
globalStore: service(),
|
||||||
|
|
@ -29,6 +30,8 @@ export default Resource.extend(Grafana, ResourceUsage, {
|
||||||
grafanaDashboardName: 'Cluster',
|
grafanaDashboardName: 'Cluster',
|
||||||
isMonitoringReady: false,
|
isMonitoringReady: false,
|
||||||
_cachedConfig: null,
|
_cachedConfig: null,
|
||||||
|
clusterTemplate: reference('clusterTemplateId'),
|
||||||
|
clusterTemplateRevision: reference('clusterTemplateRevisionId'),
|
||||||
machines: alias('nodes'),
|
machines: alias('nodes'),
|
||||||
roleTemplateBindings: alias('clusterRoleTemplateBindings'),
|
roleTemplateBindings: alias('clusterRoleTemplateBindings'),
|
||||||
isAKS: equal('driver', 'azureKubernetesService'),
|
isAKS: equal('driver', 'azureKubernetesService'),
|
||||||
|
|
@ -49,6 +52,25 @@ export default Resource.extend(Grafana, ResourceUsage, {
|
||||||
}
|
}
|
||||||
})),
|
})),
|
||||||
|
|
||||||
|
clusterTemplateDisplayName: computed('clusterTemplate.name', 'clusterTemplateId', function() {
|
||||||
|
return get(this, 'clusterTemplate.displayName')
|
||||||
|
|| get(this, 'clusterTemplateId').replace(CLUSTER_TEMPLATE_ID_PREFIX, '');
|
||||||
|
}),
|
||||||
|
|
||||||
|
clusterTemplateRevisionDisplayName: computed('clusterTemplateRevision.name', 'clusterTemplateRevisionId', function() {
|
||||||
|
return get(this, 'clusterTemplateRevision.displayName')
|
||||||
|
|| get(this, 'clusterTemplateRevisionId').replace(CLUSTER_TEMPLATE_ID_PREFIX, '');
|
||||||
|
}),
|
||||||
|
|
||||||
|
isClusterTemplateUpgradeAvailable: computed('clusterTemplate.latestRevision.id', 'clusterTemplateRevision.id', function() {
|
||||||
|
const latestClusterTemplateRevisionId = get(this, 'clusterTemplate.latestRevision.id');
|
||||||
|
const currentClusterTemplateRevisionId = get(this, 'clusterTemplateRevision.id');
|
||||||
|
|
||||||
|
return latestClusterTemplateRevisionId
|
||||||
|
&& currentClusterTemplateRevisionId
|
||||||
|
&& currentClusterTemplateRevisionId !== latestClusterTemplateRevisionId;
|
||||||
|
}),
|
||||||
|
|
||||||
getAltActionDelete: computed('action.remove', function() { // eslint-disable-line
|
getAltActionDelete: computed('action.remove', function() { // eslint-disable-line
|
||||||
return get(this, 'canBulkRemove') ? 'delete' : null;
|
return get(this, 'canBulkRemove') ? 'delete' : null;
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,12 @@ const ClusterTemplate = Resource.extend({
|
||||||
return isNaN(get(this, 'revisions.length')) ? 0 : get(this, 'revisions.length');
|
return isNaN(get(this, 'revisions.length')) ? 0 : get(this, 'revisions.length');
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
latestRevision: computed('revisions.[]', function() {
|
||||||
|
return isNaN(get(this, 'revisions.length'))
|
||||||
|
? null
|
||||||
|
: get(this, 'revisions').sortBy('createdTS').get('lastObject');
|
||||||
|
}),
|
||||||
|
|
||||||
displayDefaultRevisionId: computed('revisionsCount', 'revisions.[]', function() {
|
displayDefaultRevisionId: computed('revisionsCount', 'revisions.[]', function() {
|
||||||
return get(this, 'defaultRevisionId').split(':')[1];
|
return get(this, 'defaultRevisionId').split(':')[1];
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@
|
||||||
@import "app/styles/components/logging";
|
@import "app/styles/components/logging";
|
||||||
@import "app/styles/components/identity-block";
|
@import "app/styles/components/identity-block";
|
||||||
@import "app/styles/components/istio-graph";
|
@import "app/styles/components/istio-graph";
|
||||||
|
@import "app/styles/components/cluster-template-revision-upgrade-notification";
|
||||||
|
|
||||||
// Vendor
|
// Vendor
|
||||||
// Pretty much what it says. Vendor specific changes/overrides or includes.
|
// Pretty much what it says. Vendor specific changes/overrides or includes.
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ $icon-inverse: #fff !default;
|
||||||
.icon-stack {
|
.icon-stack {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
// width: 2em;
|
width: 2em;
|
||||||
height: 2em;
|
height: 2em;
|
||||||
line-height: 2em;
|
line-height: 2em;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
|
|
|
||||||
|
|
@ -190,5 +190,12 @@
|
||||||
.block .text-small {
|
.block .text-small {
|
||||||
font-size: 0.7em;
|
font-size: 0.7em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
span.cluster-template-revision-upgrade-notification {
|
||||||
|
height: 0px;
|
||||||
|
display: inline-block;
|
||||||
|
margin-top: -1.5%;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
.cluster-template-revision-upgrade-notification {
|
||||||
|
.icon-stack {
|
||||||
|
color: $banner-warning;
|
||||||
|
|
||||||
|
.icon-notification, .icon-circle-o {
|
||||||
|
color: lighten($warning, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-circle, .icon-circle-o {
|
||||||
|
font-size: 1.45em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-notification {
|
||||||
|
font-size: 0.85em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -98,11 +98,17 @@ TABLE {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.sortable.text-right A {
|
&.sortable {
|
||||||
|
&.text-right A {
|
||||||
position: relative;
|
position: relative;
|
||||||
left: -15px;
|
left: -15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.icon-stack .icon-stack-1x {
|
||||||
|
width: initial;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,21 @@
|
||||||
import { next } from '@ember/runloop';
|
import { next } from '@ember/runloop';
|
||||||
|
import { hash } from 'rsvp';
|
||||||
|
import { inject as service } from '@ember/service';
|
||||||
|
import { get } from '@ember/object';
|
||||||
import Route from '@ember/routing/route';
|
import Route from '@ember/routing/route';
|
||||||
|
|
||||||
export default Route.extend({
|
export default Route.extend({
|
||||||
|
globalStore: service(),
|
||||||
|
|
||||||
shortcuts: { 'g': 'toggleGrouping', },
|
shortcuts: { 'g': 'toggleGrouping', },
|
||||||
|
|
||||||
|
afterModel() {
|
||||||
|
return hash(
|
||||||
|
get(this, 'globalStore').findAll('clusterTemplateRevision'),
|
||||||
|
get(this, 'globalStore').findAll('clusterTemplate'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
toggleGrouping() {
|
toggleGrouping() {
|
||||||
let choices = ['list', 'grouped'];
|
let choices = ['list', 'grouped'];
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,8 @@
|
||||||
<i class="icon icon-alert text-warning" />
|
<i class="icon icon-alert text-warning" />
|
||||||
{{/tooltip-element}}
|
{{/tooltip-element}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
|
{{cluster-template-revision-upgrade-notification cluster=model}}
|
||||||
</td>
|
</td>
|
||||||
<td data-title="{{dt.provider}}">
|
<td data-title="{{dt.provider}}">
|
||||||
{{#if model.version.gitVersion}}
|
{{#if model.version.gitVersion}}
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,16 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="vertical-middle">
|
<div class="vertical-middle">
|
||||||
<label class="acc-label vertical-middle p-0">{{t 'clustersPage.version.label'}}:</label>
|
<label class="acc-label vertical-middle p-0">{{t 'clustersPage.kubernetesVersion.label'}}:</label>
|
||||||
<span>{{cluster.version.gitVersion}}</span>
|
<span>{{cluster.version.gitVersion}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="vertical-middle">
|
||||||
|
<label class="acc-label vertical-middle p-0">{{t 'clustersPage.rkeTemplate.label'}}:</label>
|
||||||
|
<span>{{cluster.clusterTemplateDisplayName}}/{{cluster.clusterTemplateRevisionDisplayName}}</span>
|
||||||
|
{{cluster-template-revision-upgrade-notification cluster=cluster}}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="vertical-middle">
|
<div class="vertical-middle">
|
||||||
<label class="acc-label vertical-middle p-0">{{t 'generic.created'}}:</label>
|
<label class="acc-label vertical-middle p-0">{{t 'generic.created'}}:</label>
|
||||||
<span>{{date-calendar cluster.created}}</span>
|
<span>{{date-calendar cluster.created}}</span>
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,13 @@ export default Route.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
afterModel() {
|
||||||
|
return hash(
|
||||||
|
get(this, 'globalStore').findAll('clusterTemplateRevision'),
|
||||||
|
get(this, 'globalStore').findAll('clusterTemplate'),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
setDefaultRoute: on('activate', function() {
|
setDefaultRoute: on('activate', function() {
|
||||||
set(this, `session.${ C.SESSION.CLUSTER_ROUTE }`, 'authenticated.cluster.monitoring.index');
|
set(this, `session.${ C.SESSION.CLUSTER_ROUTE }`, 'authenticated.cluster.monitoring.index');
|
||||||
}),
|
}),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
import Component from '@ember/component';
|
||||||
|
import layout from './template';
|
||||||
|
|
||||||
|
export default Component.extend({
|
||||||
|
layout,
|
||||||
|
tagName: 'span',
|
||||||
|
classNames: ['cluster-template-revision-upgrade-notification'],
|
||||||
|
|
||||||
|
cluster: null,
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
{{#if cluster.isClusterTemplateUpgradeAvailable}}
|
||||||
|
{{#tooltip-element
|
||||||
|
type="tooltip-basic"
|
||||||
|
model=(t 'clusterTemplateRevisionUpgradeNotification.tooltip' revision=cluster.clusterTemplate.latestRevision.displayName)
|
||||||
|
tooltipTemplate="tooltip-static"
|
||||||
|
inlineBlock=true
|
||||||
|
}}
|
||||||
|
<span class="icon-stack rke-template-revision-upgrade-notification">
|
||||||
|
<i class="icon icon-circle icon-stack-1x"/>
|
||||||
|
<i class="icon icon-circle-o icon-stack-1x"/>
|
||||||
|
<i class="icon icon-notification icon-stack-1x"/>
|
||||||
|
</span>
|
||||||
|
{{/tooltip-element}}
|
||||||
|
{{/if}}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
export { default } from 'shared/components/cluster-template-revision-upgrade-notification/component';
|
||||||
|
|
@ -892,6 +892,9 @@ projectsPage:
|
||||||
memberNameReq: Name is required for a member
|
memberNameReq: Name is required for a member
|
||||||
memberRoleReq: Role is required for a member
|
memberRoleReq: Role is required for a member
|
||||||
|
|
||||||
|
clusterTemplateRevisionUpgradeNotification:
|
||||||
|
tooltip: Revision {revision} available for upgrade.
|
||||||
|
|
||||||
clustersPage:
|
clustersPage:
|
||||||
header: Clusters
|
header: Clusters
|
||||||
newCluster: Add Cluster
|
newCluster: Add Cluster
|
||||||
|
|
@ -903,10 +906,14 @@ clustersPage:
|
||||||
new: Add Cluster
|
new: Add Cluster
|
||||||
cluster:
|
cluster:
|
||||||
label: Cluster Name
|
label: Cluster Name
|
||||||
|
templateRevision:
|
||||||
|
label: Template/Revision
|
||||||
provider:
|
provider:
|
||||||
label: Provider
|
label: Provider
|
||||||
version:
|
kubernetesVersion:
|
||||||
label: Version
|
label: Kubernetes Version
|
||||||
|
rkeTemplate:
|
||||||
|
label: RKE Template
|
||||||
nodes:
|
nodes:
|
||||||
label: Nodes
|
label: Nodes
|
||||||
cpu:
|
cpu:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue