Add auto assign roles

Change-Id: I1930b4759e045c5fa27bbbe1abab1aa31ffddef7
This commit is contained in:
jiahuay 2014-07-16 16:31:42 -07:00
parent 15cf7b3cb5
commit 52d7f8c159
5 changed files with 135 additions and 90 deletions

View File

@ -35,7 +35,9 @@ html {
padding-top: 7px;
}
.role-tag {
background-color: #91b8d0;
background-color: #6fb3e0 !important;
border-color: #6fb3e0 !important;
border-radius: 10px;
color: #fff;
display: inline-block;
font-size: 13px;

View File

@ -102,16 +102,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1", "cluster2"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Controller",
"name": "os-controller"
}, {
"display_name": "Network",
"name": "os-network"
}, {
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Installing"
}, {
@ -124,13 +115,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Network",
"name": "os-network"
}, {
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -143,10 +128,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Network",
"name": "os-network"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -159,13 +141,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Compute",
"name": "os-compute-worker"
}, {
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -178,10 +154,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Compute",
"name": "os-compute-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -194,10 +167,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -210,13 +180,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Network",
"name": "os-network"
}, {
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -229,13 +193,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Network",
"name": "os-network"
}, {
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -248,13 +206,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Network",
"name": "os-network"
}, {
"display_name": "Storage",
"name": "os-block-storage-worker"
}],
"roles": [],
"network": {},
"state": "Successful"
}, {
@ -267,10 +219,7 @@ compassAppDev.run(function($httpBackend, settings, $http) {
"clusters": ["cluster1"],
"os": "CentOS",
"adapter": "OpenStack",
"roles": [{
"display_name": "Compute",
"name": "os-compute-worker"
}, ],
"roles": [],
"network": {},
"state": "Successful"
}];

View File

@ -23,11 +23,18 @@
</li>
</ul>
</div>
<span>
<input type="text" placeholder="HA VIP" ng-model="ha_vip">
</span>
</div>
<div class="pull-right">
<div class="btn-group" dropdown>
<button type="button" class="btn btn-info dropdown-toggle">
Assign Roles
<button class="btn btn-sm btn-info" ng-init="autoAssignRoles.isCollapsed = true;" ng-click="autoAssignRoles.isCollapsed = !autoAssignRoles.isCollapsed">
Auto Assign&nbsp;
<i class="ace-icon fa fa-plus" ng-class="{'fa-minus': !autoAssignRoles.isCollapsed}"></i>
</button>
<button type="button" class="btn btn-sm btn-info dropdown-toggle">
Manually Assign&nbsp;
<span class="ace-icon fa fa-caret-down icon-on-right"></span>
</button>
<ul class="dropdown-menu dropdown-info dropdown-menu-right" role="menu">
@ -36,23 +43,48 @@
{{role.display_name}}
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="row">
<div collapse="autoAssignRoles.isCollapsed">
<div class="well">
<div class="row">
<div class="col-xs-12">
<form name="autoAssignForm" role="form" class="form-horizontal">
<div ng-repeat="role in roles" class="form-group">
<label class="col-sm-4 control-label no-padding-right">{{role.display_name}}</label>
<div class="col-sm-8" ng-init="role.count=1">
<input type="number" min="0" class="col-xs-10 col-sm-5" ng-model="role.count" placeholder="Count">
</div>
</div>
<div class="col-md-offset-4 col-md-8">
<button type="button" class="btn btn-sm btn-info" ng-click="autoAssignRoles()" ng-disabled="autoAssignForm.$invalid">
Assign
</button>
<span>
Total Hosts: {{servers.length}} | Total Roles: {{rolesTotalCount}}
</span>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<table ng-table="tableParams" class="table table-hover table-striped">
<thead>
<tr>
<th>
<input type="checkbox" ng-model="selectall" ng-change="selectAllServers(selectall)">
<label>
<input ng-model="selectall" ng-change="selectAllServers(selectall)" type="checkbox" class="ace">
<span class="lbl"></span>
</label>
</th>
<th ng-repeat="column in server_columns" ng-show="column.visible" class="sortable"
ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'),
'sort-desc': tableParams.isSortBy(column.field, 'desc')}"
ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
<th ng-repeat="column in server_columns" ng-show="column.visible" class="sortable" ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'),
'sort-desc': tableParams.isSortBy(column.field, 'desc')}" ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
{{column.title}}
</th>
<th>Roles</th>
@ -61,7 +93,10 @@
<tbody>
<tr ng-repeat="server in $data | filter: search">
<td>
<input ng-model="server.checked" type="checkbox">
<label>
<input ng-model="server.checked" type="checkbox" class="ace">
<span class="lbl"></span>
</label>
</td>
<td ng-repeat="column in server_columns" ng-show="column.visible" sortable="column.field">
{{server[column.field]}}

View File

@ -40,12 +40,13 @@
<thead>
<tr>
<th>
<input type="checkbox" ng-model="selectall" ng-change="selectAllServers(selectall)">
<label>
<input ng-model="selectall" ng-change="selectAllServers(selectall)" type="checkbox" class="ace">
<span class="lbl"></span>
</label>
</th>
<th ng-repeat="column in server_columns" ng-show="column.visible" class="sortable"
ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'),
'sort-desc': tableParams.isSortBy(column.field, 'desc')}"
ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
<th ng-repeat="column in server_columns" ng-show="column.visible" class="sortable" ng-class="{'sort-asc': tableParams.isSortBy(column.field, 'asc'),
'sort-desc': tableParams.isSortBy(column.field, 'desc')}" ng-click="tableParams.sorting(column.field, tableParams.isSortBy(column.field, 'asc') ? 'desc' : 'asc')">
{{column.title}}
</th>
</tr>
@ -54,13 +55,18 @@
<tbody>
<tr ng-repeat="server in $data | filter:search">
<td>
<input ng-model="server.selected" type="checkbox">
<label>
<input ng-model="server.selected" type="checkbox" class="ace">
<span class="lbl"></span>
</label>
</td>
<td ng-repeat="column in server_columns" ng-show="column.visible" sortable="column.field">
<span ng-if="column.field=='os_installed'">
<span ng-if="server['os']">
<input type="checkbox" ng-model="server.reinstallos">
<span class="lbl"></span>
<label>
<input ng-model="server.reinstallos" type="checkbox" class="ace">
<span class="lbl"></span>
</label>
</span>
<span ng-if="!server['os']">
-

View File

@ -675,8 +675,10 @@ angular.module('compass.wizard', [
$scope.commit = function() {
var securityData = {
"os_config": {
"username": $scope.server_credentials.username,
"password": $scope.server_credentials.password
"server_credentials": {
"username": $scope.server_credentials.username,
"password": $scope.server_credentials.password
}
},
"package_config": {
"security": {
@ -738,24 +740,59 @@ angular.module('compass.wizard', [
alert("Please select at least one server");
} else {
// get selected servers and assign role to them
var roleExist = false;
for (var i = 0; i < $scope.servers.length; i++) {
if ($scope.servers[i].checked) {
for (var j = 0; j < $scope.servers[i].roles.length; j++) {
if (role.name == $scope.servers[i].roles[j].name) {
roleExist = true;
}
}
var roleExist = $scope.checkRoleExist($scope.servers[i].roles, role);
if (!roleExist) {
$scope.servers[i].roles.push(role);
} else {
roleExist = false;
}
}
}
}
};
// Assume all servers have not been assigned any roles before calling this function
$scope.autoAssignRoles = function() {
var roles = angular.copy($scope.roles);
var svIndex = 0;
angular.forEach(roles, function(newrole) {
var i = 0;
var loopStep = 0;
while (i < newrole.count && loopStep < $scope.servers.length) {
if (svIndex >= $scope.servers.length) {
svIndex = 0;
}
var roleExist = $scope.checkRoleExist($scope.servers[svIndex].roles, newrole);
if (!roleExist) {
$scope.servers[svIndex].roles.push(newrole);
i++;
loopStep = 0;
} else {
loopStep++;
}
svIndex++;
}
})
};
$scope.checkRoleExist = function(existingRoles, newRole) {
var roleExist = false;
angular.forEach(existingRoles, function(existingRole) {
if (existingRole.name == newRole.name) {
roleExist = true;
}
})
return roleExist;
};
$scope.$watch('roles', function(roles) {
var count = 0;
angular.forEach(roles, function(role) {
count += role.count;
})
$scope.rolesTotalCount = count;
}, true);
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: $scope.servers.length + 1 // count per page
@ -799,8 +836,24 @@ angular.module('compass.wizard', [
// error callback
return $q.reject(response);
});
promises.push(updateRoles);
});
if ($scope.ha_vip) {
var config = {
"package_config": {
"ha_vip": $scope.ha_vip
}
}
var updateHAVIP = dataService.updateClusterConfig(cluster.id, config).then(function(configData) {
// success callback
}, function(response) {
// error callback
return $q.reject(response);
});
promises.push(updateHAVIP);
}
$q.all(promises).then(function() {
wizardFactory.setServers($scope.servers);
var commitState = {