/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
/**
* Represents a configuration-group on the cluster.
* A configuration-group is a collection of hosts
* on which a collection of configurations are applied.
*
* Configuration group hierarchy is at 2 levels. For
* each service there is a 'Default' configuration group
* containing all hosts not belonging to any group of that
* service.
*
* A default configuration group has child configuration
* groups which contain configuration overrides (deltas)
* for a bunch of hosts. This allows different configurations
* for different hosts in a heterogeneous cluster environment.
*/
App.ConfigGroup = Ember.Object.extend({
id: null,
name: null,
description: null,
isDefault: null,
serviceName: null,
/**
* Parent configuration group for this group.
* When {@link #isDefault} is true, this value is null
* When {@link #isDefault} is false, this represents the configuration
* deltas that are applied on the default.
*/
parentConfigGroup: null,
/**
* all hosts that belong to cluster
*/
clusterHostsBinding: 'App.router.manageConfigGroupsController.clusterHosts',
/**
* Children configuration groups for this group.
* When {@link #isDefault} is false, this value is null
* When {@link #isDefault} is true, this represents the various
* configuration groups that override the default.
*/
childConfigGroups: [],
/**
* Service for which this configuration-group
* is applicable.
*/
service: null,
/**
* Hosts on which this configuration-group
* is to be applied. For a service, a host can
* belong to only one non-default configuration-group.
*
* When {#isDefault} is false, this contains hosts
* for which the overrides will apply.
*
* When {#isDefault} is true, this value is empty, as
* it dynamically reflects hosts not belonging to other
* non-default groups.
*
*/
hosts: [],
/**
* Public host names related by host_name.
*/
publicHosts: [],
/**
* this flag is used for installed services' config groups
* if user make changes to them - mark this flag to true
*/
isForUpdate: false,
/**
* mark config groups for installed services
*/
isForInstalledService: false,
/**
* Provides a display friendly name. This includes trimming
* names to a certain length.
*/
displayName: function () {
var name = this.get('name');
if (name && name.length>App.config.CONFIG_GROUP_NAME_MAX_LENGTH) {
var middle = Math.floor(App.config.CONFIG_GROUP_NAME_MAX_LENGTH / 2);
name = name.substring(0, middle) + "..." + name.substring(name.length-middle);
}
return name;
}.property('name'),
displayNameHosts: function () {
return this.get('displayName') + ' (' + this.get('hosts.length') + ')';
}.property('displayName', 'hosts.length'),
apiResponse: null,
/**
* Provides hosts which are available for inclusion in
* non-default configuration groups.
*/
availableHosts: function () {
if (this.get('isDefault')) return [];
var unusedHostsMap = {};
var availableHosts = [];
var sharedHosts = this.get('clusterHosts');
// parentConfigGroup.hosts(hosts from default group) - are available hosts, which don't belong to any group
this.get('parentConfigGroup.hosts').forEach(function (hostName) {
unusedHostsMap[hostName] = true;
});
sharedHosts.forEach(function (host) {
if (unusedHostsMap[host.get('id')]) {
availableHosts.pushObject(Ember.Object.create({
selected: false,
host: host,
hostComponentNames: host.get('hostComponents').mapProperty('componentName')
}));
}
});
return availableHosts;
}.property('isDefault', 'parentConfigGroup', 'childConfigGroups', 'parentConfigGroup.hosts.@each'),
isAddHostsDisabled: function () {
return (this.get('isDefault') || this.get('availableHosts.length') === 0);
}.property('availableHosts.length'),
/**
* Collection of (site, tag) pairs representing properties.
*
* When {#isDefault} is true, this represents the
* default cluster configurations for that service.
*
* When {#isDefault} is false, this represents the
* configuration overrides on top of the cluster default for the
* hosts identified by 'hosts'.
*/
configSiteTags: [],
properties: [],
propertiesList: function () {
var result = '';
this.get('properties').forEach(function (item) {
result += item.name + " : " + item.value + '
';
}, this);
return result;
}.property('properties.length'),
hash: null
});