-
{{format-ip model.displayIp}}
+ {{#if model.displayIp}}
+
{{format-ip model.displayIp}}
+ {{/if}}
+
{{#if model.dockerBlurb}}
{{model.dockerBlurb}}
{{/if}}
diff --git a/app/components/machine/driver-digitalocean/component.js b/app/components/machine/driver-digitalocean/component.js
index a1943dad7..ad7d8862d 100644
--- a/app/components/machine/driver-digitalocean/component.js
+++ b/app/components/machine/driver-digitalocean/component.js
@@ -6,7 +6,7 @@ import Util from 'ui/utils/util';
const DIGITALOCEAN_API = 'api.digitalocean.com/v2';
const VALID_IMAGES = [
// 'centos-6-x64',
-// 'centos-7-0-x64',
+ 'centos-7-0-x64',
// 'coreos-alpha',
// 'coreos-beta',
// 'coreos-stable',
@@ -17,7 +17,8 @@ const VALID_IMAGES = [
// 'freebsd-10-1-x64',
// 'freebsd-10-2-x64',
'ubuntu-14-04-x64',
-// 'ubuntu-16-04-x64'
+ 'ubuntu-16-04-x64'
+// 'ubuntu-16-10-x64'
];
export default Ember.Component.extend(Driver, {
@@ -61,6 +62,7 @@ export default Ember.Component.extend(Driver, {
});
let filteredImages = hash.images.images.filter(function(image) {
+ // 64-bit only
return !((image.name||'').match(/x32$/));
}).map(function(image) {
image.disabled = VALID_IMAGES.indexOf(image.slug) === -1;
@@ -99,7 +101,7 @@ export default Ember.Component.extend(Driver, {
accessToken : '',
size : '1gb',
region : 'nyc3',
- image : 'ubuntu-14-04-x64'
+ image : 'ubuntu-16-04-x64'
});
this.set('model', this.get('store').createRecord({
diff --git a/app/components/upgrade-btn/template.hbs b/app/components/upgrade-btn/template.hbs
index 7d6fd9a51..c3d1b6df2 100644
--- a/app/components/upgrade-btn/template.hbs
+++ b/app/components/upgrade-btn/template.hbs
@@ -1 +1,3 @@
-{{t (concat-str 'upgradeBtn.status.' upgradeStatus character='')}}
+{{#tooltip-element type="tooltip-basic" model=currentVersion tooltipTemplate='tooltip-static' aria-describedby="tooltip-base"}}
+ {{t (concat-str 'upgradeBtn.status.' upgradeStatus character='')}}
+{{/tooltip-element}}
diff --git a/app/mixins/subscribe.js b/app/mixins/subscribe.js
index cfa65351b..ae4f9b369 100644
--- a/app/mixins/subscribe.js
+++ b/app/mixins/subscribe.js
@@ -5,6 +5,12 @@ import C from 'ui/utils/constants';
let DEADTOME = ['removed','purging','purged'];
+const ORCHESTRATION_STACKS = [
+ 'infra*k8s',
+ 'infra*swarm',
+ 'infra*mesos'
+];
+
export default Ember.Mixin.create({
k8s : Ember.inject.service(),
projects : Ember.inject.service(),
@@ -156,32 +162,16 @@ export default Ember.Mixin.create({
console.log('Subscribe ping ' + this.forStr());
},
- loadBalancerTargetChanged: function(change) {
- this._includeChanged('loadBalancer', 'loadBalancerTargets', 'loadBalancerId', change.data.resource);
- },
+ stackChanged: function(change) {
+ let stack = change.data.resource;
- loadBalancerChanged: function(change) {
- var balancer = change.data.resource;
- var config = balancer.get('loadBalancerConfig');
- var balancers = config.get('loadBalancers');
- if ( !balancers )
- {
- balancers = [];
- config.set('loadBalancers',balancers);
+ if ( ORCHESTRATION_STACKS.indexOf(stack.get('externalIdInfo.name')) >= 0 ) {
+ Ember.run.once(this, function() {
+ this.get('projects.current').reload().then(() => {
+ this.get('projects').updateOrchestrationState();
+ });
+ });
}
-
- if ( config.get('state') === 'removed' )
- {
- balancers.removeObject(balancer);
- }
- else
- {
- balancers.addObject(balancer);
- }
- },
-
- registryCredentialChanged: function(change) {
- this._includeChanged('registry', 'credentials', 'registryId', change.data.resource);
},
k8sResourceChanged: function(changeType, obj) {
@@ -200,96 +190,4 @@ export default Ember.Mixin.create({
this.get('store')._remove(resource.get('type'), resource);
}
},
-
- // Update the `?include=`-ed arrays of a host,
- // e.g. when an instance changes:
- // Update the destProperty='instances' array on all models of type resourceName='hosts'.
- // to match the list in the the 'changed' resource's expectedProperty='hosts'
- // _includeChanged( 'host', 'hosts', 'instances', 'hosts', instance)
- _includeChanged: function(resourceName, destProperty, expectedProperty, changed) {
- if (!changed)
- {
- return;
- }
-
- let start = (new Date().getTime());
-
- var changedId = changed.get('id');
- var store = this.get('store');
-
- //console.log('Include changed',resourceName,destProperty,expectedProperty,changedId);
-
- // All the resources
- var all = store.all(resourceName);
-
- // IDs the resource should be on
- var expectedIds = [];
- var expected = changed.get(expectedProperty)||[];
- if ( !Ember.isArray(expected) )
- {
- expected = [expected];
- }
-
- if ( changed.get('state') !== 'purged' )
- {
- expectedIds = expected.map(function(item) {
- if ( typeof item === 'object' )
- {
- return item.get('id');
- }
- else
- {
- return item;
- }
- });
- }
-
- // IDs it is currently on
- var curIds = [];
- all.forEach(function(item) {
- var existing = (item.get(destProperty)||[]).filterBy('id', changedId);
- if ( existing.length )
- {
- curIds.push(item.get('id'));
- }
- });
-
- // Remove from resources the changed shouldn't be on
- var remove = Util.arrayDiff(curIds, expectedIds);
- remove.forEach((id) => {
- //console.log('Remove',id);
- store.find(resourceName, id).then((item) => {
- var list = item.get(destProperty);
- if ( list )
- {
- //console.log('Removing',changedId,'from',item.get('id'));
- list.removeObjects(list.filterBy('id', changedId));
- }
- }).catch(() => {});
- });
-
- // Add or update resources the changed should be on
- expectedIds.forEach((id) => {
- //console.log('Expect',id);
- store.find(resourceName, id).then((item) => {
- var list = item.get(destProperty);
- if ( !list )
- {
- list = [];
- //console.log('Adding empty to',item.get('id'), destProperty);
- item.set(destProperty, list);
- }
-
- var existing = list.filterBy('id', changedId);
- if ( existing.length === 0)
- {
- //console.log('Adding',changedId,'to',item.get('id'), destProperty);
- list.pushObject(changed);
- }
- }).catch(() => {});
- });
-
- let diff = ((new Date()).getTime())-start;
- console.log('includechanged:', resourceName, destProperty, expectedProperty, diff);
- },
});
diff --git a/app/models/stack.js b/app/models/stack.js
index ae6175e55..3f6b21341 100644
--- a/app/models/stack.js
+++ b/app/models/stack.js
@@ -5,12 +5,6 @@ import C from 'ui/utils/constants';
import Util from 'ui/utils/util';
import { denormalizeServiceArray } from 'ui/utils/denormalize-snowflakes';
-const ORCHESTRATION_STACKS = [
- 'infra*k8s',
- 'infra*swarm',
- 'infra*mesos'
-];
-
export function activeIcon(stack)
{
if ( stack.get('system') )
@@ -253,17 +247,6 @@ var Stack = Resource.extend({
return true;
},
-
- updateOrchestrationState: function() {
- if ( ORCHESTRATION_STACKS.indexOf(this.get('externalIdInfo.name')) >= 0 ) {
- Ember.run.once(this, function() {
- this.get('projectsService').updateOrchestrationState();
- if ( ['updating-active','activating','active'].indexOf(this.get('state')) >= 0 ) {
- this.get('projectsService.current').reload();
- }
- });
- }
- }.observes('combinedState'),
});
Stack.reopenClass({
diff --git a/app/stacks/index/controller.js b/app/stacks/index/controller.js
index f726bacee..cd2dcb1bf 100644
--- a/app/stacks/index/controller.js
+++ b/app/stacks/index/controller.js
@@ -118,8 +118,8 @@ export default Ember.Controller.extend(Sortable, {
return out;
- // stateSort isn't really a dependency here, but sortable won't recompute when it changes otherwise
- }.property('model.[]','model.@each.{stateSort,grouping}','which','tags'),
+ // state isn't really a dependency here, but sortable won't recompute when it changes otherwise
+ }.property('model.stacks.[]','model.stacks.@each.{state,grouping}','which','tags'),
sortableContent: Ember.computed.alias('filteredStacks'),
sortBy: 'name',
diff --git a/package.json b/package.json
index 4010657f9..f2eea3464 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ui",
- "version": "1.2.15",
+ "version": "1.2.17",
"private": true,
"directories": {
"doc": "doc",