Merge ~steverydz/maas:clear-all-discovered-devices into maas:master

Proposed by Steve Rydz
Status: Merged
Approved by: Steve Rydz
Approved revision: d9795a4dadc53f53c55ad3f2075bc176a307ddad
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~steverydz/maas:clear-all-discovered-devices
Merge into: maas:master
Diff against target: 275 lines (+166/-6)
7 files modified
src/maasserver/static/js/angular/controllers/dashboard.js (+47/-1)
src/maasserver/static/js/angular/controllers/tests/test_dashboard.js (+33/-0)
src/maasserver/static/js/angular/directives/maas_obj_form.js (+4/-2)
src/maasserver/static/js/angular/factories/discoveries.js (+10/-0)
src/maasserver/static/partials/dashboard.html (+57/-3)
src/maasserver/static/scss/_base_forms.scss (+4/-0)
src/maasserver/static/scss/_patterns_page-header.scss (+11/-0)
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
MAAS Lander Approve
Anthony Dillon Approve
Review via email: mp+363852@code.launchpad.net

Commit message

LP: #1815934 - Add ability in UI to clear all discovered devices

Description of the change

Enable ability to clear all discovered devices in the UI.

QA steps:
- Go to /dashboard
- See their is a 'Clear discoveries' button in the header and that it opens a panel
- See that the message in the open panel changes when you toggle 'Discovery enabled'
- See that when you click the red 'Clear discoveries' button, the list of discovered devices is cleared

Screenshots:
https://user-images.githubusercontent.com/501889/53639053-19bdcd00-3c20-11e9-8ebc-a55419e5f798.png

https://user-images.githubusercontent.com/501889/53639054-19bdcd00-3c20-11e9-9c1a-8d60fb589730.png

https://user-images.githubusercontent.com/501889/53639056-1a566380-3c20-11e9-8548-390f59527acb.png

Default view design: https://app.zeplin.io/project/5c70010892623b407fb908e2/screen/5c700123c6b2001bbc3f3a3c

Expanded view with discovery enabled design: https://app.zeplin.io/project/5c70010892623b407fb908e2/screen/5c700124d2f685409d5e8079

Expanded view with discovery disabled design: https://app.zeplin.io/project/5c70010892623b407fb908e2/screen/5c70012423c3bb4079adb113

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 23c60e5b961542f49dbe54cfb7f72f0770e5fca1

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 5c05a3e9ab2f61dc62f32c8d6033d7404a568a83

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: ac72c90fc63f38526c63417cc212845cf7e089fe

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 624e025fa440fc0ebe246aaf1d4f4bff9be204e0

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/5244/console
COMMIT: 3234f9b668ca89e811cc36453e1d9d8841c47c59

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/5245/console
COMMIT: fe8e9c4058c4a6317eac966d97a47a614ba8d4c7

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 91dc75e35b8ee58388a02fa790effa7449e8a551

review: Approve
Revision history for this message
Anthony Dillon (ya-bo-ng) wrote :

LGTM with a comment in the code to maybe reduce the custom styling.

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/5250/console
COMMIT: f0e30f94b7fbc80cf4a240cbb6c438776bcdec2d

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/5252/console
COMMIT: e975a45328477997da2ffd8aae83b8e9b3546b63

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 5e50ceabd388d30a57fc570d35c892d778c26085

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 602c67b2b91a3692ecac6fb6d6a263e8eb5a7ca3

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 353fa50b7fe509ba312fca4e0a21c6e9cbb493fb

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/5274/console
COMMIT: 2ac87ce567fec3500dd056f02c08787cc409c333

review: Needs Fixing
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b clear-all-discovered-devices lp:~steverydz/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: cba4f992d0663477ddfb8a840c31c433f7e53d12

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

LGTM, +1

one comment inline

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/static/js/angular/controllers/dashboard.js b/src/maasserver/static/js/angular/controllers/dashboard.js
2index ba8490d..b81214f 100644
3--- a/src/maasserver/static/js/angular/controllers/dashboard.js
4+++ b/src/maasserver/static/js/angular/controllers/dashboard.js
5@@ -36,10 +36,40 @@ angular.module('MAAS').controller('DashboardController', [
6 $scope.column = 'mac';
7 $scope.selectedDevice = null;
8 $scope.convertTo = null;
9+ $scope.showClearDiscoveriesPanel = false;
10+ $scope.removingDevices = false;
11+
12+ $scope.formatMAASVersionNumber = function() {
13+ if (MAAS_config.version) {
14+ var versionWithPoint = MAAS_config.version.split(" ")[0];
15+
16+ if (versionWithPoint) {
17+ if (versionWithPoint.split(".")[2] === "0") {
18+ return versionWithPoint.split(".")[0]
19+ + "."
20+ + versionWithPoint.split(".")[1];
21+ } else {
22+ return versionWithPoint;
23+ }
24+ }
25+ }
26+ };
27+
28+ $scope.MAAS_VERSION_NUMBER = $scope.formatMAASVersionNumber();
29
30 // Set default predicate to last_seen.
31 $scope.predicate = $scope.last_seen;
32
33+ // Open clear devices panel
34+ $scope.openClearDiscoveriesPanel = function() {
35+ $scope.showClearDiscoveriesPanel = true;
36+ };
37+
38+ // Close clear devices panel
39+ $scope.closeClearDiscoveriesPanel = function() {
40+ $scope.showClearDiscoveriesPanel = false;
41+ };
42+
43 // Sorts the table by predicate.
44 $scope.sortTable = function(predicate) {
45 $scope.predicate = predicate;
46@@ -85,7 +115,18 @@ angular.module('MAAS').controller('DashboardController', [
47 // Remove device
48 $scope.removeDevice = function (device) {
49 device.isBeingRemoved = true;
50- DiscoveriesManager.removeDevice(device);
51+ DiscoveriesManager
52+ .removeDevice(device);
53+ };
54+
55+ // Remove all devices
56+ $scope.removeAllDevices = function() {
57+ $scope.removingDevices = true;
58+ DiscoveriesManager
59+ .removeDevices($scope.discoveredDevices)
60+ .then(function() {
61+ $scope.discoveredDevices = DiscoveriesManager.getItems();
62+ });
63 };
64
65 // Sets selected device
66@@ -186,6 +227,11 @@ angular.module('MAAS').controller('DashboardController', [
67 var date = new Date(device.last_seen);
68 device.last_seen_timestamp = date.getTime();
69 });
70+
71+ $scope.$watchCollection('discoveredDevices', function() {
72+ $scope.removingDevices = false;
73+ $scope.closeClearDiscoveriesPanel();
74+ });
75 });
76 }
77 ]);
78diff --git a/src/maasserver/static/js/angular/controllers/tests/test_dashboard.js b/src/maasserver/static/js/angular/controllers/tests/test_dashboard.js
79index 7b6b619..97f0e16 100644
80--- a/src/maasserver/static/js/angular/controllers/tests/test_dashboard.js
81+++ b/src/maasserver/static/js/angular/controllers/tests/test_dashboard.js
82@@ -463,4 +463,37 @@ describe("DashboardController", function() {
83 .toHaveBeenCalledWith(device);
84 });
85 });
86+
87+ describe("removeAllDevices", function () {
88+ it("calls `removeDevices` in `DiscoveriesManager`", function () {
89+ var controller = makeController();
90+ var device = {
91+ ip: "127.0.0.1",
92+ mac_address: "00:25:96:FF:FE:12:34:56"
93+ };
94+ $scope.discoveredDevices.push(device);
95+ spyOn(DiscoveriesManager, "removeDevices").and.callFake(function() {
96+ var deferred = $q.defer();
97+ return deferred.promise;
98+ });
99+ $scope.removeAllDevices();
100+ expect(DiscoveriesManager.removeDevices).toHaveBeenCalled();
101+ });
102+ });
103+
104+ describe("openClearDiscoveriesPanel", function() {
105+ it("sets `showClearDiscoveriesPanel` to `true`", function() {
106+ var controller = makeController();
107+ $scope.openClearDiscoveriesPanel();
108+ expect($scope.showClearDiscoveriesPanel).toBe(true);
109+ });
110+ });
111+
112+ describe("closeClearDiscoveriesPanel", function() {
113+ it("sets `showClearDiscoveriesPanel` to `false`", function() {
114+ var controller = makeController();
115+ $scope.closeClearDiscoveriesPanel();
116+ expect($scope.showClearDiscoveriesPanel).toBe(false);
117+ });
118+ });
119 });
120diff --git a/src/maasserver/static/js/angular/directives/maas_obj_form.js b/src/maasserver/static/js/angular/directives/maas_obj_form.js
121index ba806c8..4712f5e 100644
122--- a/src/maasserver/static/js/angular/directives/maas_obj_form.js
123+++ b/src/maasserver/static/js/angular/directives/maas_obj_form.js
124@@ -1060,7 +1060,7 @@ angular.module('MAAS').directive('maasObjField', ['$compile',
125 if(value) {
126 inputWrapper.children(
127 ':first').addClass('u-border--information');
128- inputWrapper.append(
129+ labelElement.prepend(
130 '<i class="obj-saving icon ' +
131 'p-icon--spinner u-animation--spin"></i>');
132 inputWrapper.addClass('p-tooltip');
133@@ -1070,7 +1070,9 @@ angular.module('MAAS').directive('maasObjField', ['$compile',
134 } else {
135 inputWrapper.children(
136 ':first').removeClass('u-border--information');
137- inputWrapper.find('i.obj-saving').remove();
138+ if (labelElement) {
139+ labelElement.find('i.obj-saving').remove();
140+ }
141 inputWrapper.removeClass('p-tooltip');
142 inputWrapper.removeClass('p-tooltip--right');
143 inputWrapper.addClass('u-no-margin--top');
144diff --git a/src/maasserver/static/js/angular/factories/discoveries.js b/src/maasserver/static/js/angular/factories/discoveries.js
145index ea4a6ce..da0ec2f 100644
146--- a/src/maasserver/static/js/angular/factories/discoveries.js
147+++ b/src/maasserver/static/js/angular/factories/discoveries.js
148@@ -40,5 +40,15 @@ angular.module('MAAS').factory(
149 });
150 };
151
152+ DiscoveriesManager.prototype.removeDevices = function(devices) {
153+ return $q.all(devices.map(function(device) {
154+ return RegionConnection
155+ .callMethod("discovery.delete_by_mac_and_ip", {
156+ ip: device.ip,
157+ mac: device.mac_address
158+ });
159+ }));
160+ };
161+
162 return new DiscoveriesManager();
163 }]);
164diff --git a/src/maasserver/static/partials/dashboard.html b/src/maasserver/static/partials/dashboard.html
165index 2354538..e9dcd55 100644
166--- a/src/maasserver/static/partials/dashboard.html
167+++ b/src/maasserver/static/partials/dashboard.html
168@@ -1,17 +1,71 @@
169 <header class="p-strip--light is-shallow u-no-padding--bottom page-header" media-query="min-width: 769px" window-width>
170 <div class="row">
171- <div class="tablet-col-4 col-8">
172+ <div class="tablet-col-3 col-6">
173 <h1 class="page-header__title">Network discovery</h1>
174 <ul class="p-inline-list page-header__status">
175 <li class="p-inline-list__item">{$ discoveredDevices.length $} items discovered</li>
176 <li class="p-inline-list__item" data-ng-if="!loaded"><i class="p-icon--spinner u-animation--spin"></i> Loading...</li>
177 </ul>
178 </div>
179- <div class="tablet-col-2 col-4">
180- <div class="page-header__controls p-form--inline u-align--right">
181+ <div class="tablet-col-3 col-6">
182+ <div class="page-header__controls page-header__controls--discoveries p-form--inline u-align--right">
183 <maas-obj-form obj="networkDiscovery" manager="configManager" inline="true">
184 <maas-obj-field type="onoffswitch" key="value" label="Discovery enabled" on-value="enabled" off-value="disabled" subtle="true" label-info="When enabled, MAAS will use passive techniques, such as listening to&#xa; ARP requests and DNS advertisements, to observe networks attached&#xa; to rack controllers. Active subnet mapping can also be enabled in the&#xa; Network Discovery section of the Settings page."></maas-obj-field>
185 </maas-obj-form>
186+ <button class="p-button--neutral" data-ng-click="openClearDiscoveriesPanel()" data-ng-if="discoveredDevices.length">
187+ Clear all discoveries
188+ </button>
189+ <button class="p-button--neutral p-tooltip p-tooltip--btm-right" aria-describedby="clear-discoveries" disabled data-ng-if="!discoveredDevices.length">
190+ Clear all discoveries
191+ <span class="p-tooltip__message" role="tooltip" id="clear-discoveries">No items discovered</span>
192+ </button>
193+ </div>
194+ </div>
195+ </div>
196+
197+ <div data-ng-if="showClearDiscoveriesPanel">
198+ <hr>
199+ <div class="p-strip is-shallow is-bordered">
200+ <div class="row">
201+ <div class="col-10">
202+ <div class="p-media-object">
203+ <div class="p-media-object__image">
204+ <i class="p-icon p-icon--warning"></i>
205+ </div>
206+ <div class="p-media-object__details">
207+ <div data-ng-if="networkDiscovery.value === 'enabled'">
208+ <p class="u-remove-max-width u-no-padding--top">Clearing all discoveries will remove all items from the list below.</p>
209+ <p class="u-remove-max-width">
210+ MAAS will use passive techniques (such as listening to ARP requests and mDNS advertisements) to observe networks attached to rack controllers.
211+ <br>
212+ If active subnet mapping is enabled on the configured subnets, MAAS will actively scan them and ensure discovery information is accurate and complete.
213+ </p>
214+ <p class="u-remove-max-width u-no-margin--bottom">Learn more about <a class="p-link--external" href="https://docs.maas.io/{$ MAAS_VERSION_NUMBER $}/en/installconfig-networking">active mapping</a>.</p>
215+ </div>
216+ <div data-ng-if="networkDiscovery.value === 'disabled'">
217+ <p class="u-remove-max-width u-no-padding--top">Clearing all discoveries will remove all items from the list.</p>
218+ <p class="u-remove-max-width u-no-margin--bottom">Network discovery is disabled. The list of discovered items will not be repopulated.</p>
219+ </div>
220+ </div>
221+ </div>
222+ </div>
223+ </div>
224+ </div>
225+ <div class="p-strip is-shallow">
226+ <div class="row">
227+ <div class="u-align--right">
228+ <button class="p-button--base u-no-margin--bottom" data-ng-click="closeClearDiscoveriesPanel()">
229+ Cancel
230+ </button>
231+ <button class="p-button--negative u-no-margin--bottom" data-ng-click="removeAllDevices()" data-ng-if="!removingDevices">
232+ Clear all discoveries
233+ </button>
234+ <button class="p-button--negative u-no-margin--bottom" data-ng-if="removingDevices">
235+ <i class="p-icon--spinner is-light u-animation--spin"></i>
236+ &nbsp;
237+ Deleting all network discoveries
238+ </button>
239+ </div>
240 </div>
241 </div>
242 </div>
243diff --git a/src/maasserver/static/scss/_base_forms.scss b/src/maasserver/static/scss/_base_forms.scss
244index de971de..79be0e7 100644
245--- a/src/maasserver/static/scss/_base_forms.scss
246+++ b/src/maasserver/static/scss/_base_forms.scss
247@@ -81,4 +81,8 @@
248 .u-full-width-input .p-form__control {
249 width: 100%;
250 }
251+
252+ .obj-saving {
253+ margin-right: .5rem;
254+ }
255 }
256diff --git a/src/maasserver/static/scss/_patterns_page-header.scss b/src/maasserver/static/scss/_patterns_page-header.scss
257index 3f63f45..8ca20d8 100644
258--- a/src/maasserver/static/scss/_patterns_page-header.scss
259+++ b/src/maasserver/static/scss/_patterns_page-header.scss
260@@ -39,4 +39,15 @@
261 position: absolute;
262 }
263 }
264+
265+ .page-header__controls--discoveries {
266+ button:last-child {
267+ margin-left: 1.5rem;
268+ }
269+
270+ .maas-p-switch {
271+ position: relative;
272+ top: .4rem;
273+ }
274+ }
275 }

Subscribers

People subscribed via source and target branches