open-consul/ui/javascripts/app/models.js

214 lines
5.9 KiB
JavaScript
Raw Normal View History

2014-04-25 17:49:36 +00:00
//
// A Consul service.
//
App.Service = Ember.Object.extend({
//
// The number of failing checks within the service.
//
failingChecks: function() {
// If the service was returned from `/v1/internal/ui/services`
// then we have a aggregated value which we can just grab
2014-04-30 18:02:20 +00:00
if (this.get('ChecksCritical') != undefined) {
return (this.get('ChecksCritical') + this.get('ChecksWarning'))
// Otherwise, we need to filter the child checks by both failing
// states
2014-04-30 18:02:20 +00:00
} else {
return (checks.filterBy('Status', 'critical').get('length') +
checks.filterBy('Status', 'warning').get('length'))
2014-04-30 18:02:20 +00:00
}
2014-04-29 19:24:32 +00:00
}.property('Checks'),
2014-04-25 17:49:36 +00:00
//
// The number of passing checks within the service.
//
passingChecks: function() {
// If the service was returned from `/v1/internal/ui/services`
// then we have a aggregated value which we can just grab
2014-04-30 18:02:20 +00:00
if (this.get('ChecksPassing') != undefined) {
return this.get('ChecksPassing')
// Otherwise, we need to filter the child checks by both failing
// states
2014-04-30 18:02:20 +00:00
} else {
return this.get('Checks').filterBy('Status', 'passing').get('length');
}
2014-04-29 19:24:32 +00:00
}.property('Checks'),
2014-04-25 17:49:36 +00:00
//
// The formatted message returned for the user which represents the
// number of checks failing or passing. Returns `1 passing` or `2 failing`
//
checkMessage: function() {
if (this.get('hasFailingChecks') === false) {
return this.get('passingChecks') + ' passing';
} else {
return this.get('failingChecks') + ' failing';
}
2014-04-29 19:24:32 +00:00
}.property('Checks'),
2014-04-25 17:49:36 +00:00
//
// Boolean of whether or not there are failing checks in the service.
// This is used to set color backgrounds and so on.
//
hasFailingChecks: function() {
return (this.get('failingChecks') > 0);
2014-04-29 19:24:32 +00:00
}.property('Checks')
2014-04-25 17:49:36 +00:00
});
//
// A Consul Node
//
App.Node = Ember.Object.extend({
//
// The number of failing checks within the service.
//
failingChecks: function() {
var checks = this.get('Checks');
// We view both warning and critical as failing
return (checks.filterBy('Status', 'critical').get('length') +
checks.filterBy('Status', 'warning').get('length'))
}.property('Checks'),
2014-04-25 17:49:36 +00:00
//
// The number of passing checks within the service.
//
passingChecks: function() {
return this.get('Checks').filterBy('Status', 'passing').get('length');
2014-04-29 19:24:32 +00:00
}.property('Checks'),
2014-04-25 17:49:36 +00:00
//
// The formatted message returned for the user which represents the
// number of checks failing or passing. Returns `1 passing` or `2 failing`
//
checkMessage: function() {
if (this.get('hasFailingChecks') === false) {
return this.get('passingChecks') + ' passing';
} else {
return this.get('failingChecks') + ' failing';
}
2014-04-29 19:24:32 +00:00
}.property('Checks'),
2014-04-25 17:49:36 +00:00
//
// Boolean of whether or not there are failing checks in the service.
// This is used to set color backgrounds and so on.
//
hasFailingChecks: function() {
return (this.get('failingChecks') > 0);
2014-04-29 19:24:32 +00:00
}.property('Checks')
2014-04-25 17:49:36 +00:00
});
2014-04-29 17:06:26 +00:00
//
// A key/value object
//
App.Key = Ember.Object.extend(Ember.Validations.Mixin, {
// Validates using the Ember.Valdiations library
validations: {
2014-04-30 19:02:31 +00:00
Key: { presence: true },
Value: { presence: true }
},
// Boolean if the key is valid
2014-04-30 19:02:31 +00:00
keyValid: Ember.computed.empty('errors.Key'),
// Boolean if the value is valid
2014-04-30 19:02:31 +00:00
valueValid: Ember.computed.empty('errors.Value'),
// The key with the parent removed.
// This is only for display purposes, and used for
// showing the key name inside of a nested key.
2014-04-30 19:02:31 +00:00
keyWithoutParent: function() {
return (this.get('Key').replace(this.get('parentKey'), ''));
}.property('Key'),
2014-04-30 16:15:54 +00:00
// Boolean if the key is a "folder" or not, i.e is a nested key
// that feels like a folder. Used for UI
2014-04-29 17:06:26 +00:00
isFolder: function() {
2014-04-30 19:02:31 +00:00
return (this.get('Key').slice(-1) == "/")
}.property('Key'),
2014-04-29 17:06:26 +00:00
// The dasherized URL safe version of the key for routing
2014-04-29 20:32:38 +00:00
urlSafeKey: function() {
2014-04-30 19:02:31 +00:00
return this.get('Key').replace(/\//g, "-")
}.property('Key'),
2014-04-29 20:32:38 +00:00
// The dasherized URL safe version of the parent key for routing
2014-04-30 20:30:14 +00:00
urlSafeParentKey: function() {
return this.get('parentKey').replace(/\//g, "-")
}.property('Key'),
// Determines what route to link to. If it's a folder,
// it will link to kv.show. Otherwise, kv.edit
2014-04-29 20:32:38 +00:00
linkToRoute: function() {
var key = this.get('urlSafeKey')
// If the key ends in - it's a folder
2014-04-29 20:32:38 +00:00
if (key.slice(-1) === "-") {
return 'kv.show'
} else {
return 'kv.edit'
}
2014-04-30 19:02:31 +00:00
}.property('Key'),
2014-04-29 20:32:38 +00:00
// The base64 decoded value of the key.
// if you set on this key, it will update
// the key.Value
2014-04-30 20:30:14 +00:00
valueDecoded: function(key, value) {
// setter
2014-04-30 20:30:14 +00:00
if (arguments.length > 1) {
this.set('Value', value);
2014-04-30 22:31:45 +00:00
return value;
2014-04-30 20:30:14 +00:00
}
// getter
// If the value is null, we don't
// want to try and base64 decode it, so just return
2014-04-30 20:30:14 +00:00
if (this.get('Value') === null) {
return "";
}
// base64 decode the value
2014-04-30 20:30:14 +00:00
return window.atob(this.get('Value'));
}.property('Value'),
// An array of the key broken up by the /
2014-04-29 18:49:07 +00:00
keyParts: function() {
2014-04-30 19:02:31 +00:00
var key = this.get('Key');
2014-04-29 17:34:13 +00:00
// If the key is a folder, remove the last
// slash to split properly
2014-04-29 18:49:07 +00:00
if (key.slice(-1) == "/") {
key = key.substring(0, key.length - 1);
}
2014-04-29 18:49:07 +00:00
return key.split('/');
2014-04-30 19:02:31 +00:00
}.property('Key'),
2014-04-29 18:49:07 +00:00
// The parent Key is the key one level above this.Key
// key: baz/bar/foobar/
// grandParent: baz/bar/
2014-04-29 18:49:07 +00:00
parentKey: function() {
2014-04-29 19:24:32 +00:00
var parts = this.get('keyParts').toArray();
2014-04-29 18:49:07 +00:00
// Remove the last item, essentially going up a level
// in hiearchy
2014-04-29 18:49:07 +00:00
parts.pop();
return parts.join("/") + "/";
2014-04-30 19:02:31 +00:00
}.property('Key'),
2014-04-29 18:49:07 +00:00
// The grandParent Key is the key two levels above this.Key
// key: baz/bar/foobar/
// grandParent: baz/
2014-04-29 18:49:07 +00:00
grandParentKey: function() {
2014-04-29 19:24:32 +00:00
var parts = this.get('keyParts').toArray();
2014-04-29 17:34:13 +00:00
// Remove the last two items, jumping two levels back
2014-04-29 18:49:07 +00:00
parts.pop();
parts.pop();
2014-04-29 17:06:26 +00:00
2014-04-29 18:49:07 +00:00
return parts.join("/") + "/";
2014-04-30 19:02:31 +00:00
}.property('Key')
2014-04-29 17:06:26 +00:00
});