Add auto assign roles
Change-Id: I1930b4759e045c5fa27bbbe1abab1aa31ffddef7
This commit is contained in:
parent
15cf7b3cb5
commit
52d7f8c159
@ -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;
|
||||
|
@ -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"
|
||||
}];
|
||||
|
@ -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
|
||||
<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
|
||||
<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]}}
|
||||
|
@ -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']">
|
||||
-
|
||||
|
@ -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 = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user