mirror of https://github.com/rancher/ui.git
Move machine into host
This commit is contained in:
parent
67dbd04fc7
commit
4666d3d422
|
|
@ -12,7 +12,7 @@ export default Ember.Route.extend({
|
||||||
// Check for waiting only if cattle, because other orchestrations have system services menus that link here
|
// Check for waiting only if cattle, because other orchestrations have system services menus that link here
|
||||||
if ( !project.get('kubernetes') && !project.get('swarm') && !project.get('mesos') )
|
if ( !project.get('kubernetes') && !project.get('swarm') && !project.get('mesos') )
|
||||||
{
|
{
|
||||||
return this.get('projects').checkForWaiting(auth.get('hosts'),auth.get('machines'));
|
return this.get('projects').checkForWaiting(auth.get('hosts'));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ export default Ember.Controller.extend({
|
||||||
}.property('model.stacks.@each.externalId'),
|
}.property('model.stacks.@each.externalId'),
|
||||||
|
|
||||||
hasHosts: function() {
|
hasHosts: function() {
|
||||||
return (this.get('model.hosts.length') > 0) || (this.get('model.machines.length') > 0);
|
return (this.get('model.hosts.length') > 0);
|
||||||
}.property('model.{hosts,machines}'),
|
}.property('model.hosts.length'),
|
||||||
|
|
||||||
isReady: function() {
|
isReady: function() {
|
||||||
return this.get('projects.isReady') && this.get('hasHosts');
|
return this.get('projects.isReady') && this.get('hasHosts');
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,8 @@ export default Ember.Controller.extend({
|
||||||
}.property('projects.current.mesos'),
|
}.property('projects.current.mesos'),
|
||||||
|
|
||||||
hasHosts: function() {
|
hasHosts: function() {
|
||||||
return (this.get('model.hosts.length') + this.get('model.machines.length')) >= this.get('expectHosts');
|
return this.get('model.hosts.length') >= this.get('expectHosts');
|
||||||
}.property('model.hosts.length','model.machines.length'),
|
}.property('model.hosts.length'),
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
kubernetesReady() {
|
kubernetesReady() {
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ export default Ember.Route.extend({
|
||||||
this.replaceWith('authenticated.project.index');
|
this.replaceWith('authenticated.project.index');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( (model.get('hosts.length') + model.get('machines.length')) > 0 && this.get('projects.isReady') )
|
else if ( model.get('hosts.length') > 0 && this.get('projects.isReady') )
|
||||||
{
|
{
|
||||||
this.replaceWith('authenticated.project.index');
|
this.replaceWith('authenticated.project.index');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,6 @@ export default Ember.Route.extend(Subscribe, {
|
||||||
projectSchemas: ['project', this.toCb('loadProjectSchemas')],
|
projectSchemas: ['project', this.toCb('loadProjectSchemas')],
|
||||||
orchestrationState: ['projectSchemas', this.toCb('updateOrchestration')],
|
orchestrationState: ['projectSchemas', this.toCb('updateOrchestration')],
|
||||||
instances: ['projectSchemas', this.cbFind('instance')],
|
instances: ['projectSchemas', this.cbFind('instance')],
|
||||||
machines: ['projectSchemas', this.cbFind('machine')],
|
|
||||||
services: ['projectSchemas', this.cbFind('service')],
|
services: ['projectSchemas', this.cbFind('service')],
|
||||||
hosts: ['projectSchemas', this.cbFind('host')],
|
hosts: ['projectSchemas', this.cbFind('host')],
|
||||||
stacks: ['projectSchemas', this.cbFind('stack')],
|
stacks: ['projectSchemas', this.cbFind('stack')],
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
<section class="horizontal-form container-fluid">
|
<section class="horizontal-form container-fluid">
|
||||||
<h2>{{t 'editHost.title'}}</h2>
|
<h2>{{t 'editHost.title'}}</h2>
|
||||||
{{top-errors errors=errors}}
|
|
||||||
|
|
||||||
<div class="row form-group">
|
<div class="row form-group">
|
||||||
<div class="col-sm-12 col-md-2 form-label">
|
<div class="col-sm-12 col-md-2 form-label">
|
||||||
|
|
@ -44,4 +43,5 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{{top-errors errors=errors}}
|
||||||
{{save-cancel editing=editing save="save" cancel="cancel"}}
|
{{save-cancel editing=editing save="save" cancel="cancel"}}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,6 @@ export default Ember.Component.extend(ManageLabels, GroupedInstances, {
|
||||||
show : null,
|
show : null,
|
||||||
|
|
||||||
classNames : ['pod','host'],
|
classNames : ['pod','host'],
|
||||||
classNameBindings : ['isMachine:machine-host'],
|
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
|
|
@ -40,12 +39,9 @@ export default Ember.Component.extend(ManageLabels, GroupedInstances, {
|
||||||
return this.get('filteredInstances').sortBy('name','id');
|
return this.get('filteredInstances').sortBy('name','id');
|
||||||
}.property('filteredInstances.@each.{name,id}'),
|
}.property('filteredInstances.@each.{name,id}'),
|
||||||
|
|
||||||
isMachine: Ember.computed.equal('model.type','machine'),
|
|
||||||
isActive: Ember.computed.equal('model.state','active'),
|
isActive: Ember.computed.equal('model.state','active'),
|
||||||
|
isProvisioning: Ember.computed.equal('model.state','provisioning'),
|
||||||
showAdd: function() {
|
showAdd: Ember.computed.alias('isActive'),
|
||||||
return this.get('isActive') && !this.get('isMachine');
|
|
||||||
}.property('isActive','isMachine'),
|
|
||||||
|
|
||||||
stateBackground: function() {
|
stateBackground: function() {
|
||||||
return this.get('model.stateColor').replace("text-","bg-");
|
return this.get('model.stateColor').replace("text-","bg-");
|
||||||
|
|
|
||||||
|
|
@ -4,33 +4,25 @@
|
||||||
<div class="pull-right">{{action-menu model=model}}</div>
|
<div class="pull-right">{{action-menu model=model}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pod-name">
|
<div class="pod-name">
|
||||||
{{#if isMachine}}
|
<a href="{{href-to 'host' model.id}}">{{model.displayName}}</a>
|
||||||
{{model.displayName}}
|
{{#if model.showTransitioningMessage}}
|
||||||
{{else}}
|
<div class="pod-message {{if model.isError 'text-danger' 'text-muted'}}">
|
||||||
<a href="{{href-to 'host' model.id}}">{{model.displayName}}</a>
|
{{model.transitioningMessage}}
|
||||||
{{#if model.showTransitioningMessage}}
|
</div>
|
||||||
<div class="pod-message {{if model.isError 'text-danger' 'text-muted'}}">
|
|
||||||
{{model.transitioningMessage}}
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{#if isMachine}}
|
{{#if isProvisioning}}
|
||||||
<div class="machine-info force-wrap">
|
<div class="machine-info force-wrap">
|
||||||
{{#if isActive}}
|
{{#if model.isError}}
|
||||||
{{format-html-message 'hostPod.machineInfo.active.activating'}}
|
{{#if model.transitioningMessage}}
|
||||||
{{else}}
|
<span class="text-danger">{{model.transitioningMessage}}</span>
|
||||||
{{#if model.isError}}
|
|
||||||
{{#if model.transitioningMessage}}
|
|
||||||
<span class="text-danger">{{model.transitioningMessage}}</span>
|
|
||||||
{{else}}
|
|
||||||
<span class="text-danger">{{t 'hostPod.machineInfo.deactivated.error'}}</span>
|
|
||||||
{{/if}}
|
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="color:black;">{{t 'hostPod.machineInfo.deactivated.setup'}}</div>
|
<span class="text-danger">{{t 'hostPod.machineInfo.deactivated.error'}}</span>
|
||||||
{{model.transitioningMessage}}
|
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
{{else}}
|
||||||
|
<div class="color:black;">{{t 'hostPod.machineInfo.deactivated.setup'}}</div>
|
||||||
|
{{model.transitioningMessage}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
|
|
@ -58,8 +50,8 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="pod-info-container">
|
<div class="pod-info-container">
|
||||||
{{#if model.machine}}
|
{{#if model.driver}}
|
||||||
<div class="pod-info-item"><i class="icon icon-cloud"></i> {{model.machine.driver}}</div>
|
<div class="pod-info-item"><i class="icon icon-cloud"></i> {{model.driver}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
aliyunecsConfig: config,
|
aliyunecsConfig: config,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type : 'machine',
|
type : 'host',
|
||||||
amazonec2Config : config,
|
amazonec2Config : config,
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
azureConfig: config,
|
azureConfig: config,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import Ember from 'ember';
|
import Ember from 'ember';
|
||||||
import Driver from 'ui/mixins/driver';
|
import Driver from 'ui/mixins/driver';
|
||||||
import fetch from 'ember-api-store/utils/fetch';
|
import fetch from 'ember-api-store/utils/fetch';
|
||||||
|
import Util from 'ui/utils/util';
|
||||||
|
|
||||||
const DIGITALOCEAN_API = 'api.digitalocean.com/v2';
|
const DIGITALOCEAN_API = 'api.digitalocean.com/v2';
|
||||||
const VALID_IMAGES = [
|
const VALID_IMAGES = [
|
||||||
|
|
@ -81,7 +82,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
}, (err) => {
|
}, (err) => {
|
||||||
|
|
||||||
let errors = this.get('errors') || [];
|
let errors = this.get('errors') || [];
|
||||||
errors.push(`${err.xhr.status}: ${err.err}`);
|
errors.push(`${err.statusText}: ${err.body.message}`);
|
||||||
|
|
||||||
this.setProperties({
|
this.setProperties({
|
||||||
errors: errors,
|
errors: errors,
|
||||||
|
|
@ -102,7 +103,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
digitaloceanConfig: config,
|
digitaloceanConfig: config,
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
@ -135,19 +136,19 @@ export default Ember.Component.extend(Driver, {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
apiRequest: function(command, params, method='GET') {
|
apiRequest: function(command, params) {
|
||||||
let proxyEndpoint = this.get('app.proxyEndpoint');
|
let proxyEndpoint = this.get('app.proxyEndpoint');
|
||||||
let url = `${proxyEndpoint}/${DIGITALOCEAN_API}/${command}?per_page=100`;
|
let url = `${proxyEndpoint}/${DIGITALOCEAN_API}/${command}?per_page=100`;
|
||||||
|
url = Util.addQueryParams(url,params);
|
||||||
let accessToken = this.get('model.digitaloceanConfig.accessToken');
|
let accessToken = this.get('model.digitaloceanConfig.accessToken');
|
||||||
|
|
||||||
return fetch({
|
return fetch(url, {
|
||||||
url: url,
|
headers: {
|
||||||
method: method,
|
|
||||||
header: {
|
|
||||||
'Accept': 'application/json',
|
'Accept': 'application/json',
|
||||||
'X-Api-Auth-Header': 'Bearer ' + accessToken
|
'X-Api-Auth-Header': 'Bearer ' + accessToken
|
||||||
},
|
},
|
||||||
data: params,
|
}).then((res) => {
|
||||||
}, true);
|
return res.body;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
exoscaleConfig: config
|
exoscaleConfig: config
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
|
|
||||||
bootstrap() {
|
bootstrap() {
|
||||||
let model = this.get('store').createRecord({
|
let model = this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
});
|
});
|
||||||
|
|
||||||
this.setProperties({
|
this.setProperties({
|
||||||
|
|
@ -47,14 +47,14 @@ export default Ember.Component.extend(Driver, {
|
||||||
|
|
||||||
driverChanged: function() {
|
driverChanged: function() {
|
||||||
let driver = this.get('otherDriver');
|
let driver = this.get('otherDriver');
|
||||||
let machine = this.get('model');
|
let host = this.get('model');
|
||||||
|
|
||||||
if ( driver && machine) {
|
if ( driver && host) {
|
||||||
if ( !machine.get(driver) ) {
|
if ( !host.get(driver) ) {
|
||||||
machine.set(driver, this.get('store').createRecord({ type: driver }));
|
host.set(driver, this.get('store').createRecord({ type: driver }));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.set('driverOpts', machine.get(driver));
|
this.set('driverOpts', host.get(driver));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.set('otherDriver', this.get('otherChoices.firstObject.value'));
|
this.set('otherDriver', this.get('otherChoices.firstObject.value'));
|
||||||
|
|
@ -73,11 +73,11 @@ export default Ember.Component.extend(Driver, {
|
||||||
willSave() {
|
willSave() {
|
||||||
// Null out all the drivers that aren't the active one, because the API only accepts one.
|
// Null out all the drivers that aren't the active one, because the API only accepts one.
|
||||||
let activeDriver = this.get('otherDriver');
|
let activeDriver = this.get('otherDriver');
|
||||||
let machine = this.get('model');
|
let host = this.get('model');
|
||||||
this.get('otherChoices').forEach((choice) => {
|
this.get('otherChoices').forEach((choice) => {
|
||||||
let cur = choice.value;
|
let cur = choice.value;
|
||||||
if ( choice.value !== activeDriver ) {
|
if ( choice.value !== activeDriver ) {
|
||||||
machine.set(cur, null);
|
host.set(cur, null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', store.createRecord({
|
this.set('model', store.createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
packetConfig: config,
|
packetConfig: config,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
rackspaceConfig: config,
|
rackspaceConfig: config,
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', store.createRecord({
|
this.set('model', store.createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
ubiquityConfig: config,
|
ubiquityConfig: config,
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ export default Ember.Component.extend(Driver, {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.set('model', this.get('store').createRecord({
|
this.set('model', this.get('store').createRecord({
|
||||||
type: 'machine',
|
type: 'host',
|
||||||
vmwarevsphereConfig: config,
|
vmwarevsphereConfig: config,
|
||||||
engineInstallUrl: '',
|
engineInstallUrl: '',
|
||||||
}));
|
}));
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ export default Ember.Component.extend({
|
||||||
this.set('subStep', 0);
|
this.set('subStep', 0);
|
||||||
this.set('subCount', 0);
|
this.set('subCount', 0);
|
||||||
|
|
||||||
if ( (this.get('model.hosts.length') + this.get('model.machines.length')) === 0 )
|
if ( this.get('model.hosts.length') === 0 )
|
||||||
{
|
{
|
||||||
this.set('currentStep', 0);
|
this.set('currentStep', 0);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ export default Ember.Component.extend({
|
||||||
this.set('subStep', 0);
|
this.set('subStep', 0);
|
||||||
this.set('subCount', 0);
|
this.set('subCount', 0);
|
||||||
|
|
||||||
if ( (this.get('model.hosts.length') + this.get('model.machines.length')) < 3 )
|
if ( this.get('model.hosts.length') < 3 )
|
||||||
{
|
{
|
||||||
this.set('currentStep', 0);
|
this.set('currentStep', 0);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ export default Ember.Component.extend({
|
||||||
this.set('subStep', 0);
|
this.set('subStep', 0);
|
||||||
this.set('subCount', 0);
|
this.set('subCount', 0);
|
||||||
|
|
||||||
if ( (this.get('model.hosts.length') + this.get('model.machines.length')) === 0 )
|
if ( this.get('model.hosts.length') === 0 )
|
||||||
{
|
{
|
||||||
this.set('currentStep', 0);
|
this.set('currentStep', 0);
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,8 @@
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label>{{t 'hostsPage.hostPage.infoMultiStats.provider.labelText'}}</label>
|
<label>{{t 'hostsPage.hostPage.infoMultiStats.provider.labelText'}}</label>
|
||||||
{{#if host.machine}}
|
{{#if host.driver}}
|
||||||
<div>{{host.machine.driver}}</div>
|
<div>{{host.driver}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
<div class="text-muted">{{t 'hostsPage.hostPage.infoMultiStats.provider.noHost'}}</div>
|
<div class="text-muted">{{t 'hostsPage.hostPage.infoMultiStats.provider.noHost'}}</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
||||||
|
|
@ -23,31 +23,6 @@ export default Ember.Controller.extend({
|
||||||
this.set('show', (this.get('showSystem') ? 'all' : 'standard'));
|
this.set('show', (this.get('showSystem') ? 'all' : 'standard'));
|
||||||
}.observes('showSystem'),
|
}.observes('showSystem'),
|
||||||
|
|
||||||
pods: function() {
|
|
||||||
var out = [];
|
|
||||||
var hosts = this.get('model.hosts');
|
|
||||||
var machines = this.get('model.machines');
|
|
||||||
|
|
||||||
var knownMachines = hosts.map((host) => { return host.get('physicalHostId'); }).uniq();
|
|
||||||
|
|
||||||
out.pushObjects(hosts.toArray());
|
|
||||||
|
|
||||||
// Copy in the pending machines
|
|
||||||
machines.forEach((machine) => {
|
|
||||||
if ( machine.get('isPending') && knownMachines.indexOf(machine.get('id')) === -1 )
|
|
||||||
{
|
|
||||||
out.pushObject(Ember.Object.create({
|
|
||||||
isPendingMachine: true,
|
|
||||||
machine: machine,
|
|
||||||
name: machine.get('name'),
|
|
||||||
displayName: machine.get('name')
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return out.sortBy('displayName','id');
|
|
||||||
}.property('model.hosts.@each.{name,id,physicalHostId}','model.machines.@each.{name,id,isPending}'),
|
|
||||||
|
|
||||||
listLinkOptions: {
|
listLinkOptions: {
|
||||||
route: 'hosts',
|
route: 'hosts',
|
||||||
options: {
|
options: {
|
||||||
|
|
|
||||||
|
|
@ -2,16 +2,9 @@ import Ember from 'ember';
|
||||||
|
|
||||||
export default Ember.Route.extend({
|
export default Ember.Route.extend({
|
||||||
model: function() {
|
model: function() {
|
||||||
var store = this.get('store');
|
return this.get('store').findAll('host').then((hosts) => {
|
||||||
var promises = [
|
|
||||||
store.find('machine'),
|
|
||||||
store.find('host'),
|
|
||||||
];
|
|
||||||
|
|
||||||
return Ember.RSVP.all(promises).then((results) => {
|
|
||||||
return {
|
return {
|
||||||
machines: results[0],
|
hosts: hosts,
|
||||||
hosts: results[1],
|
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,6 @@
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{{#columns-section pods=pods emptyMessage=(t 'hostsPage.index.columns.emptyMessage') as |item| }}
|
{{#columns-section pods=model.hosts emptyMessage=(t 'hostsPage.index.columns.emptyMessage') as |item| }}
|
||||||
{{#if item.isPendingMachine}}
|
{{host-pod model=item mode=mode newContainer="newContainer" show=show}}
|
||||||
{{host-pod model=item.machine mode=mode newContainer="newContainer"}}
|
|
||||||
{{else}}
|
|
||||||
{{host-pod model=item mode=mode newContainer="newContainer" show=show}}
|
|
||||||
{{/if}}
|
|
||||||
{{/columns-section}}
|
{{/columns-section}}
|
||||||
|
|
|
||||||
|
|
@ -3,18 +3,18 @@ import Ember from 'ember';
|
||||||
export default Ember.Controller.extend({
|
export default Ember.Controller.extend({
|
||||||
access: Ember.inject.service(),
|
access: Ember.inject.service(),
|
||||||
|
|
||||||
queryParams : ['backTo', 'driver', 'machineId'],
|
queryParams : ['backTo', 'driver', 'hostId'],
|
||||||
backTo : null,
|
backTo : null,
|
||||||
driver : null,
|
driver : null,
|
||||||
machineId : null,
|
hostId : null,
|
||||||
|
|
||||||
allowCustom : true,
|
allowCustom : true,
|
||||||
allowOther : true,
|
allowOther : true,
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
switchDriver(name) {
|
switchDriver(name) {
|
||||||
if (this.get('machineId')) {
|
if (this.get('hostId')) {
|
||||||
this.set('machineId', null);
|
this.set('hostId', null);
|
||||||
this.set('model.clonedModel', null);
|
this.set('model.clonedModel', null);
|
||||||
}
|
}
|
||||||
this.set('driver', name);
|
this.set('driver', name);
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ export default Ember.Route.extend({
|
||||||
driver: {
|
driver: {
|
||||||
refreshModel: true
|
refreshModel: true
|
||||||
},
|
},
|
||||||
machineId: {
|
hostId: {
|
||||||
refreshModel: false,
|
refreshModel: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -65,7 +65,7 @@ export default Ember.Route.extend({
|
||||||
resetController(controller, isExisting /*, transition*/) {
|
resetController(controller, isExisting /*, transition*/) {
|
||||||
if ( isExisting )
|
if ( isExisting )
|
||||||
{
|
{
|
||||||
controller.set('machineId', null);
|
controller.set('hostId', null);
|
||||||
controller.set('backTo', null);
|
controller.set('backTo', null);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ export default Ember.Route.extend({
|
||||||
model: function() {
|
model: function() {
|
||||||
var store = this.get('store');
|
var store = this.get('store');
|
||||||
return Ember.RSVP.hash({
|
return Ember.RSVP.hash({
|
||||||
machines: store.findAll('machine'),
|
|
||||||
hosts: store.findAll('host'),
|
hosts: store.findAll('host'),
|
||||||
instances: store.findAll('instance'),
|
instances: store.findAll('instance'),
|
||||||
}).then((hash) => {
|
}).then((hash) => {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ export default Ember.Route.extend({
|
||||||
beforeModel() {
|
beforeModel() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
var auth = this.modelFor('authenticated');
|
var auth = this.modelFor('authenticated');
|
||||||
return this.get('projects').checkForWaiting(auth.get('hosts'),auth.get('machines'));
|
return this.get('projects').checkForWaiting(auth.get('hosts'));
|
||||||
},
|
},
|
||||||
|
|
||||||
model() {
|
model() {
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,6 @@ export default Ember.Route.extend({
|
||||||
beforeModel() {
|
beforeModel() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
var auth = this.modelFor('authenticated');
|
var auth = this.modelFor('authenticated');
|
||||||
return this.get('projects').checkForWaiting(auth.get('hosts'),auth.get('machines'));
|
return this.get('projects').checkForWaiting(auth.get('hosts'));
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -177,7 +177,7 @@ export default Ember.Mixin.create({
|
||||||
var icon = '';
|
var icon = '';
|
||||||
if ( trans === 'yes' )
|
if ( trans === 'yes' )
|
||||||
{
|
{
|
||||||
icon = 'icon icon-spinner';
|
icon = 'icon icon-spinner icon-spin';
|
||||||
}
|
}
|
||||||
else if ( trans === 'error' )
|
else if ( trans === 'error' )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -292,7 +292,7 @@ export default Ember.Mixin.create({
|
||||||
labelsChanged: debouncedObserver('labelArray.@each.{type,key,value}', function() {
|
labelsChanged: debouncedObserver('labelArray.@each.{type,key,value}', function() {
|
||||||
// Make a map of the keys we care about, and combine multiple values together
|
// Make a map of the keys we care about, and combine multiple values together
|
||||||
let map = {};
|
let map = {};
|
||||||
this.get('labelArray').forEach(function(row) {
|
(this.get('labelArray')||[]).forEach(function(row) {
|
||||||
let key = row.get('key') || '';
|
let key = row.get('key') || '';
|
||||||
let type = row.get('type') || '';
|
let type = row.get('type') || '';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,8 +30,7 @@ var Host = Resource.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
clone: function() {
|
clone: function() {
|
||||||
var machine = this.get('machine');
|
this.get('application').transitionToRoute('hosts.new', {queryParams: {hostId: this.get('id'), driver: this.get('driver')}});
|
||||||
this.get('application').transitionToRoute('hosts.new', {queryParams: {machineId: machine.get('id'), driver: machine.get('driver')}});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
edit: function() {
|
edit: function() {
|
||||||
|
|
@ -39,15 +38,11 @@ var Host = Resource.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
machineConfig: function() {
|
machineConfig: function() {
|
||||||
var machine = this.get('machine');
|
var url = this.linkFor('config');
|
||||||
if ( machine )
|
if ( url )
|
||||||
{
|
{
|
||||||
var url = machine.linkFor('config');
|
url = this.get('endpointSvc').addAuthParams(url);
|
||||||
if ( url )
|
Util.download(url);
|
||||||
{
|
|
||||||
url = this.get('endpointSvc').addAuthParams(url);
|
|
||||||
Util.download(url);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -64,34 +59,16 @@ var Host = Resource.extend({
|
||||||
{ label: 'action.viewInApi', icon: 'icon icon-external-link',action: 'goToApi', enabled: true},
|
{ label: 'action.viewInApi', icon: 'icon icon-external-link',action: 'goToApi', enabled: true},
|
||||||
];
|
];
|
||||||
|
|
||||||
if ( this.get('machine') )
|
if ( this.get('links.config') )
|
||||||
{
|
{
|
||||||
if ( this.get('machine.links.config') )
|
out.push({ label: 'action.machineConfig', icon: 'icon icon-download', action: 'machineConfig', enabled: true});
|
||||||
{
|
|
||||||
out.push({ label: 'action.machineConfig', icon: 'icon icon-download', action: 'machineConfig', enabled: true});
|
|
||||||
}
|
|
||||||
|
|
||||||
out.push({ label: 'action.clone', icon: 'icon icon-copy', action: 'clone', enabled: true });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out.push({ label: 'action.clone', icon: 'icon icon-copy', action: 'clone', enabled: true });
|
||||||
out.push({ label: 'action.edit', icon: 'icon icon-edit', action: 'edit', enabled: !!a.update });
|
out.push({ label: 'action.edit', icon: 'icon icon-edit', action: 'edit', enabled: !!a.update });
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}.property('actionLinks.{activate,deactivate,remove,purge,update}','machine','machine.links.config'),
|
}.property('actionLinks.{activate,deactivate,remove,purge,update}','links.config'),
|
||||||
|
|
||||||
|
|
||||||
state: function() {
|
|
||||||
var host = this.get('hostState');
|
|
||||||
var agent = this.get('agentState');
|
|
||||||
if ( host === 'active' && agent )
|
|
||||||
{
|
|
||||||
return agent;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return host;
|
|
||||||
}
|
|
||||||
}.property('hostState','agentState'),
|
|
||||||
|
|
||||||
displayIp: Ember.computed.alias('agentIpAddress'),
|
displayIp: Ember.computed.alias('agentIpAddress'),
|
||||||
|
|
||||||
|
|
@ -99,19 +76,6 @@ var Host = Resource.extend({
|
||||||
return this.get('name') || this.get('hostname') || '('+this.get('id')+')';
|
return this.get('name') || this.get('hostname') || '('+this.get('id')+')';
|
||||||
}.property('name','hostname','id'),
|
}.property('name','hostname','id'),
|
||||||
|
|
||||||
//@TODO PERF
|
|
||||||
machine: function() {
|
|
||||||
var phid = this.get('physicalHostId');
|
|
||||||
if ( !phid )
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var machine = this.get('store').getById('machine', phid);
|
|
||||||
return machine;
|
|
||||||
}.property('physicalHostId'),
|
|
||||||
//@TODO PERF
|
|
||||||
|
|
||||||
osBlurb: function() {
|
osBlurb: function() {
|
||||||
var out = this.get('info.osInfo.operatingSystem')||'';
|
var out = this.get('info.osInfo.operatingSystem')||'';
|
||||||
|
|
||||||
|
|
@ -225,15 +189,10 @@ var Host = Resource.extend({
|
||||||
});
|
});
|
||||||
|
|
||||||
Host.reopenClass({
|
Host.reopenClass({
|
||||||
// Remap the host state to hostState so the regular state can be a computed combination of host+agent state.
|
defaultSortBy: 'name,hostname',
|
||||||
mangleIn: function(data) {
|
|
||||||
data['hostState'] = data['state'];
|
|
||||||
delete data['state'];
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
|
|
||||||
stateMap: {
|
stateMap: {
|
||||||
'active': {icon: 'icon icon-host', color: 'text-success'},
|
'active': {icon: 'icon icon-host', color: 'text-success'},
|
||||||
|
'provisioning': {icon: 'icon icon-host', color: 'text-info'},
|
||||||
'reconnecting': {icon: 'icon icon-help', color: 'text-danger'},
|
'reconnecting': {icon: 'icon icon-help', color: 'text-danger'},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,79 +0,0 @@
|
||||||
import Resource from 'ember-api-store/models/resource';
|
|
||||||
import PolledResource from 'ui/mixins/cattle-polled-resource';
|
|
||||||
|
|
||||||
var pendingStates = [
|
|
||||||
'requested',
|
|
||||||
'bootstrapping',
|
|
||||||
'creating',
|
|
||||||
'created',
|
|
||||||
'erroring',
|
|
||||||
'error',
|
|
||||||
'updating'
|
|
||||||
];
|
|
||||||
|
|
||||||
var Machine = Resource.extend(PolledResource, {
|
|
||||||
type: 'machine',
|
|
||||||
reservedKeys: ['hostsUpdated','hosts','isPending'],
|
|
||||||
actions: {
|
|
||||||
|
|
||||||
clone: function() {
|
|
||||||
this.get('router').transitionTo('hosts.new', {queryParams: {machineId: this.get('id'), driver: this.get('driver')}});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
availableActions: function() {
|
|
||||||
var a = this.get('actionLinks')||{};
|
|
||||||
|
|
||||||
var out = [
|
|
||||||
{ label: 'action.remove', icon: 'icon icon-trash', action: 'promptDelete', enabled: !!a.remove, altAction: 'delete'},
|
|
||||||
{ divider: true },
|
|
||||||
{ label: 'action.clone', icon: 'icon icon-copy', action: 'clone', enabled: true },
|
|
||||||
];
|
|
||||||
|
|
||||||
if ( this.hasLink('config') )
|
|
||||||
{
|
|
||||||
out.push({ label: 'action.machineConfig', icon: 'icon icon-download', action: 'machineConfig', enabled: true});
|
|
||||||
}
|
|
||||||
|
|
||||||
out.push({ label: 'action.viewInApi', icon: 'icon icon-external-link',action: 'goToApi', enabled: true});
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}.property('actionLinks.remove', 'links.config'),
|
|
||||||
|
|
||||||
hostsUpdated: 0,
|
|
||||||
onHostChanged: function() {
|
|
||||||
this.incrementProperty('hostsUpdated');
|
|
||||||
}.observes('hosts.@each.{id,name,state}'),
|
|
||||||
|
|
||||||
isPending: function() {
|
|
||||||
if ( pendingStates.indexOf(this.get('state')) >= 0 )
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return this.get('state') === 'active' && this.get('hosts.length') === 0;
|
|
||||||
}
|
|
||||||
}.property('state','hosts.[]','hostsUpdated'),
|
|
||||||
|
|
||||||
combinedState: function() {
|
|
||||||
let state = this.get('state');
|
|
||||||
if (state === 'active' )
|
|
||||||
{
|
|
||||||
return 'waiting';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
}.property('state'),
|
|
||||||
});
|
|
||||||
|
|
||||||
Machine.reopenClass({
|
|
||||||
stateMap: {
|
|
||||||
'bootstrapping': {icon: 'icon icon-tag', color: 'text-info'},
|
|
||||||
'active': {icon: 'icon icon-tag', color: 'text-info'},
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
export default Machine;
|
|
||||||
|
|
@ -459,7 +459,7 @@ Service.reopenClass({
|
||||||
return _allMaps.filterBy('serviceId', serviceId).map((map) => {
|
return _allMaps.filterBy('serviceId', serviceId).map((map) => {
|
||||||
return Ember.Object.create({
|
return Ember.Object.create({
|
||||||
name: map.get('name'),
|
name: map.get('name'),
|
||||||
service: getByServiceId(l('service:store'), map.get('consumedServiceId')), // @TODO
|
service: getByServiceId(window.l('service:store'), map.get('consumedServiceId')), // @TODO boooo
|
||||||
ports: map.get('ports')||[],
|
ports: map.get('ports')||[],
|
||||||
});
|
});
|
||||||
}).filter((obj) => {
|
}).filter((obj) => {
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ export default Ember.Service.extend(CatalogResource, {
|
||||||
fetchCatalogs(auth) {
|
fetchCatalogs(auth) {
|
||||||
const store = this.get('store');
|
const store = this.get('store');
|
||||||
|
|
||||||
return this.get('projects').checkForWaiting(auth.get('hosts'),auth.get('machines')).then(() => {
|
return this.get('projects').checkForWaiting(auth.get('hosts')).then(() => {
|
||||||
return store.request({url: `${this.get('app.catalogEndpoint')}/catalogs`});
|
return store.request({url: `${this.get('app.catalogEndpoint')}/catalogs`});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -213,7 +213,7 @@ export default Ember.Service.extend({
|
||||||
);
|
);
|
||||||
}.property('orchestrationState'), // The state object is always completely replaced, so this is ok
|
}.property('orchestrationState'), // The state object is always completely replaced, so this is ok
|
||||||
|
|
||||||
checkForWaiting(hosts,machines) {
|
checkForWaiting(hosts) {
|
||||||
let router = getOwner(this).get('router');
|
let router = getOwner(this).get('router');
|
||||||
|
|
||||||
let hasHosts = false;
|
let hasHosts = false;
|
||||||
|
|
@ -223,7 +223,7 @@ export default Ember.Service.extend({
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hasHosts = (hosts && hosts.get('length') > 0) || (machines && machines.get('length') > 0);
|
hasHosts = (hosts && hosts.get('length') > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !hasHosts )
|
if ( !hasHosts )
|
||||||
|
|
|
||||||
|
|
@ -29,34 +29,34 @@
|
||||||
// Animated Icons
|
// Animated Icons
|
||||||
// --------------------------
|
// --------------------------
|
||||||
.icon-spin {
|
.icon-spin {
|
||||||
-webkit-animation: icon-spin 2s infinite linear;
|
-webkit-animation: icon-spin 2s infinite steps(8);
|
||||||
animation: icon-spin 2s infinite linear;
|
animation: icon-spin 2s infinite steps(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-pulse {
|
//.icon-pulse {
|
||||||
-webkit-animation: icon-spin 1s infinite steps(8);
|
// -webkit-animation: icon-spin 1s infinite steps(8);
|
||||||
animation: icon-spin 1s infinite steps(8);
|
// animation: icon-spin 1s infinite steps(8);
|
||||||
}
|
//}
|
||||||
|
|
||||||
@-webkit-keyframes icon-spin {
|
@-webkit-keyframes icon-spin {
|
||||||
0% {
|
0% {
|
||||||
-webkit-transform: rotate(0deg);
|
-webkit-transform: rotateZ(0deg);
|
||||||
transform: rotate(0deg);
|
transform: rotateZ(0deg);
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(359deg);
|
-webkit-transform: rotateZ(360deg);
|
||||||
transform: rotate(359deg);
|
transform: rotateZ(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes icon-spin {
|
@keyframes icon-spin {
|
||||||
0% {
|
0% {
|
||||||
-webkit-transform: rotate(0deg);
|
-webkit-transform: rotateZ(0deg);
|
||||||
transform: rotate(0deg);
|
transform: rotateZ(0deg);
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(359deg);
|
-webkit-transform: rotateZ(360deg);
|
||||||
transform: rotate(359deg);
|
transform: rotateZ(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -172,15 +172,15 @@
|
||||||
|
|
||||||
@-webkit-keyframes orbit {
|
@-webkit-keyframes orbit {
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(360deg);
|
-webkit-transform: rotateZ(360deg);
|
||||||
transform: rotate(360deg);
|
transform: rotateZ(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes orbit {
|
@keyframes orbit {
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(360deg);
|
-webkit-transform: rotateZ(360deg);
|
||||||
transform: rotate(360deg);
|
transform: rotateZ(360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -282,31 +282,31 @@
|
||||||
|
|
||||||
@-webkit-keyframes rotate {
|
@-webkit-keyframes rotate {
|
||||||
0% {
|
0% {
|
||||||
-webkit-transform: rotate(0deg) scale(1);
|
-webkit-transform: rotateZ(0deg) scale(1);
|
||||||
transform: rotate(0deg) scale(1);
|
transform: rotateZ(0deg) scale(1);
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
-webkit-transform: rotate(180deg) scale(0.6);
|
-webkit-transform: rotateZ(180deg) scale(0.6);
|
||||||
transform: rotate(180deg) scale(0.6);
|
transform: rotateZ(180deg) scale(0.6);
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(360deg) scale(1);
|
-webkit-transform: rotateZ(360deg) scale(1);
|
||||||
transform: rotate(360deg) scale(1);
|
transform: rotateZ(360deg) scale(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes rotate {
|
@keyframes rotate {
|
||||||
0% {
|
0% {
|
||||||
-webkit-transform: rotate(0deg) scale(1);
|
-webkit-transform: rotateZ(0deg) scale(1);
|
||||||
transform: rotate(0deg) scale(1);
|
transform: rotateZ(0deg) scale(1);
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
-webkit-transform: rotate(180deg) scale(0.6);
|
-webkit-transform: rotateZ(180deg) scale(0.6);
|
||||||
transform: rotate(180deg) scale(0.6);
|
transform: rotateZ(180deg) scale(0.6);
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
-webkit-transform: rotate(360deg) scale(1);
|
-webkit-transform: rotateZ(360deg) scale(1);
|
||||||
transform: rotate(360deg) scale(1);
|
transform: rotateZ(360deg) scale(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,6 @@ export default ApplicationsTabRoute.extend({
|
||||||
beforeModel() {
|
beforeModel() {
|
||||||
this._super(...arguments);
|
this._super(...arguments);
|
||||||
var auth = this.modelFor('authenticated');
|
var auth = this.modelFor('authenticated');
|
||||||
return this.get('projects').checkForWaiting(auth.get('hosts'),auth.get('machines'));
|
return this.get('projects').checkForWaiting(auth.get('hosts'));
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,11 @@ export function addQueryParam(url, key, val) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addQueryParams(url, params) {
|
export function addQueryParams(url, params) {
|
||||||
Object.keys(params).forEach(function(key) {
|
if ( params && typeof params === 'object' ) {
|
||||||
url = addQueryParam(url, key, params[key]);
|
Object.keys(params).forEach(function(key) {
|
||||||
});
|
url = addQueryParam(url, key, params[key]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"ansi_up": "^1.3.0",
|
"ansi_up": "^1.3.0",
|
||||||
"broccoli-asset-rev": "^2.4.2",
|
"broccoli-asset-rev": "^2.4.2",
|
||||||
"ember-api-store": "^2.0.0-dev7",
|
"ember-api-store": "^2.0.0-dev9",
|
||||||
"ember-browserify": "^1.0.1",
|
"ember-browserify": "^1.0.1",
|
||||||
"ember-cli": "^2.8.0",
|
"ember-cli": "^2.8.0",
|
||||||
"ember-cli-app-version": "^1.0.0",
|
"ember-cli-app-version": "^1.0.0",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue