diff --git a/app/extensions/storidge/__module.js b/app/extensions/storidge/__module.js index 6c2c3a6e6..97f20ddee 100644 --- a/app/extensions/storidge/__module.js +++ b/app/extensions/storidge/__module.js @@ -79,6 +79,17 @@ angular.module('extension.storidge', []) } }; + var node = { + name: 'storidge.cluster.node', + url: '/:name', + views: { + 'content@': { + templateUrl: 'app/extensions/storidge/views/nodes/inspect/node.html', + controller: 'StoridgeNodeController' + } + } + }; + var monitor = { name: 'storidge.monitor', url: '/events', @@ -97,5 +108,6 @@ angular.module('extension.storidge', []) $stateRegistryProvider.register(profile); $stateRegistryProvider.register(profileCreation); $stateRegistryProvider.register(cluster); + $stateRegistryProvider.register(node); $stateRegistryProvider.register(monitor); }]); diff --git a/app/extensions/storidge/components/nodes-datatable/storidgeNodesDatatable.html b/app/extensions/storidge/components/nodes-datatable/storidgeNodesDatatable.html index 2a0e35f97..e9f3cef61 100644 --- a/app/extensions/storidge/components/nodes-datatable/storidgeNodesDatatable.html +++ b/app/extensions/storidge/components/nodes-datatable/storidgeNodesDatatable.html @@ -6,6 +6,20 @@ {{ $ctrl.titleText }} +
+ + + +
diff --git a/app/extensions/storidge/views/cluster/clusterController.js b/app/extensions/storidge/views/cluster/clusterController.js index 6cf3d9f84..84c320e83 100644 --- a/app/extensions/storidge/views/cluster/clusterController.js +++ b/app/extensions/storidge/views/cluster/clusterController.js @@ -1,12 +1,126 @@ angular.module('extension.storidge') -.controller('StoridgeClusterController', ['$q', '$scope', '$state', 'Notifications', 'StoridgeClusterService', 'StoridgeNodeService', 'ModalService', -function ($q, $scope, $state, Notifications, StoridgeClusterService, StoridgeNodeService, ModalService) { +.controller('StoridgeClusterController', ['$q', '$scope', '$state', 'clipboard', 'Notifications', 'StoridgeClusterService', 'StoridgeNodeService', 'ModalService', +function ($q, $scope, $state, clipboard, Notifications, StoridgeClusterService, StoridgeNodeService, ModalService) { $scope.state = { shutdownInProgress: false, rebootInProgress: false }; + $scope.copyAddNodeCommand = function() { + clipboard.copyText($scope.addInfo); + $('#copyNotification').show(); + $('#copyNotification').fadeOut(2000); + }; + + $scope.removeAction = function(selectedItems) { + ModalService.confirm({ + title: 'Are you sure?', + message: 'Do you want really want to remove the nodes from the cluster?', + buttons: { + confirm: { + label: 'Remove', + className: 'btn-danger' + } + }, + callback: function onConfirm(confirmed) { + if(!confirmed) { return; } + remove(selectedItems); + } + }); + }; + + function remove(selectedItems) { + var actionCount = selectedItems.length; + angular.forEach(selectedItems, function (node) { + StoridgeNodeService.remove(node.Name) + .then(function success() { + Notifications.success('Node successfully removed', node.Name); + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to remove node'); + }) + .finally(function final() { + --actionCount; + if (actionCount === 0) { + $state.reload(); + } + }); + }); + } + + $scope.cordonNodeAction = function(selectedItems) { + ModalService.confirm({ + title: 'Are you sure?', + message: 'Do you want really want to put the nodes in maintenance mode?', + buttons: { + confirm: { + label: 'Cordon', + className: 'btn-danger' + } + }, + callback: function onConfirm(confirmed) { + if(!confirmed) { return; } + cordonNode(selectedItems); + } + }); + }; + + function cordonNode(selectedItems) { + var actionCount = selectedItems.length; + angular.forEach(selectedItems, function (node) { + StoridgeNodeService.cordon(node.Name) + .then(function success() { + Notifications.success('Node successfully put in maintenance', node.Name); + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to put node in maintenance mode'); + }) + .finally(function final() { + --actionCount; + if (actionCount === 0) { + $state.reload(); + } + }); + }); + } + + $scope.uncordonNodeAction = function(selectedItems) { + ModalService.confirm({ + title: 'Are you sure?', + message: 'Do you want really want to bring the nodes out of maintenance mode?', + buttons: { + confirm: { + label: 'Uncordon', + className: 'btn-danger' + } + }, + callback: function onConfirm(confirmed) { + if(!confirmed) { return; } + uncordonNode(selectedItems); + } + }); + }; + + function uncordonNode(selectedItems) { + var actionCount = selectedItems.length; + angular.forEach(selectedItems, function (node) { + StoridgeNodeService.uncordon(node.Name) + .then(function success() { + Notifications.success('Node successfully bringed back', node.Name); + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to put node out of maintenance mode'); + }) + .finally(function final() { + --actionCount; + if (actionCount === 0) { + $state.reload(); + } + }); + }); + } + $scope.rebootCluster = function() { ModalService.confirm({ title: 'Are you sure?', @@ -24,6 +138,16 @@ function ($q, $scope, $state, Notifications, StoridgeClusterService, StoridgeNod }); }; + function rebootCluster() { + $scope.state.rebootInProgress = true; + StoridgeClusterService.reboot() + .finally(function final() { + $scope.state.rebootInProgress = false; + Notifications.success('Cluster successfully rebooted'); + $state.reload(); + }); + } + $scope.shutdownCluster = function() { ModalService.confirm({ title: 'Are you sure?', @@ -51,26 +175,18 @@ function ($q, $scope, $state, Notifications, StoridgeClusterService, StoridgeNod }); } - function rebootCluster() { - $scope.state.rebootInProgress = true; - StoridgeClusterService.reboot() - .finally(function final() { - $scope.state.rebootInProgress = false; - Notifications.success('Cluster successfully rebooted'); - $state.reload(); - }); - } - function initView() { $q.all({ info: StoridgeClusterService.info(), version: StoridgeClusterService.version(), - nodes: StoridgeNodeService.nodes() + nodes: StoridgeNodeService.nodes(), + addInfo: StoridgeNodeService.add() }) .then(function success(data) { $scope.clusterInfo = data.info; $scope.clusterVersion = data.version; $scope.clusterNodes = data.nodes; + $scope.addInfo = data.addInfo.content; }) .catch(function error(err) { Notifications.error('Failure', err, 'Unable to retrieve cluster information'); diff --git a/app/extensions/storidge/views/drives/drivesController.js b/app/extensions/storidge/views/drives/drivesController.js index b41538068..ec71d0d0d 100644 --- a/app/extensions/storidge/views/drives/drivesController.js +++ b/app/extensions/storidge/views/drives/drivesController.js @@ -5,7 +5,7 @@ function ($q, $scope, $state, Notifications, ModalService, StoridgeDriveService) $scope.removeAction = function(selectedItems) { ModalService.confirm({ title: 'Are you sure?', - message: 'Do you want really want to remove this drive from the storage pool?', + message: 'Do you want really want to remove the drives from the storage pool?', buttons: { confirm: { label: 'Remove', diff --git a/app/extensions/storidge/views/nodes/inspect/node.html b/app/extensions/storidge/views/nodes/inspect/node.html new file mode 100644 index 000000000..900c8e673 --- /dev/null +++ b/app/extensions/storidge/views/nodes/inspect/node.html @@ -0,0 +1,147 @@ + + + + Storidge > {{ node.Name }} + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name{{ node.Name }}
Domain{{ node.Domain }}
Domain ID{{ node.DomainID }}
Status{{ node.Status }}
Metadata version{{ node.MetadataVersion }}
Nodes{{ node.Nodes }}
HDDs{{ node.Hdds }}
SSDs{{ node.Ssds }}
VDisks{{ node.Vdisks }}
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
Free{{ node.FreeBandwidth }}
Used{{ node.UsedBandwidth }}
Provisioned{{ node.ProvisionedBandwidth }}
Total{{ node.TotalBandwidth }}
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
Free{{ node.FreeCapacity }}
Used{{ node.UsedCapacity }}
Provisioned{{ node.ProvisionedCapacity }}
Total{{ node.TotalCapacity }}
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + +
Free{{ node.FreeIOPS }}
Used{{ node.UsedIOPS }}
Provisioned{{ node.ProvisionedIOPS }}
Total{{ node.TotalIOPS }}
+
+
+
+
\ No newline at end of file diff --git a/app/extensions/storidge/views/nodes/inspect/nodeController.js b/app/extensions/storidge/views/nodes/inspect/nodeController.js new file mode 100644 index 000000000..453f7f9b7 --- /dev/null +++ b/app/extensions/storidge/views/nodes/inspect/nodeController.js @@ -0,0 +1,20 @@ +angular.module('extension.storidge') +.controller('StoridgeNodeController', ['$scope', '$state', '$transition$', 'Notifications', 'StoridgeNodeService', +function ($scope, $state, $transition$, Notifications, StoridgeNodeService) { + + + function initView() { + $scope.name = $transition$.params().name; + + StoridgeNodeService.node($scope.name) + .then(function success(data) { + $scope.node = data; + }) + .catch(function error(err) { + Notifications.error('Failure', err, 'Unable to retrieve node details'); + }); + } + + initView(); + +}]);