Merge ~ack/maas:machine-filter-by-pod into maas:master

Proposed by Alberto Donato
Status: Merged
Approved by: Alberto Donato
Approved revision: b417cc2eaed09280f4aacf822e95bc4f9d7ae83c
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:machine-filter-by-pod
Merge into: maas:master
Diff against target: 158 lines (+59/-4)
8 files modified
src/maasserver/static/js/angular/factories/machines.js (+3/-0)
src/maasserver/static/js/angular/factories/tests/test_machines.js (+2/-2)
src/maasserver/static/js/angular/filters/nodes.js (+3/-0)
src/maasserver/static/js/angular/filters/tests/test_nodes.js (+15/-0)
src/maasserver/static/partials/nodes-list.html (+10/-0)
src/maasserver/websockets/handlers/machine.py (+1/-1)
src/maasserver/websockets/handlers/node.py (+6/-0)
src/maasserver/websockets/handlers/tests/test_machine.py (+19/-1)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Blake Rouse (community) Approve
Review via email: mp+334821@code.launchpad.net

Commit message

LP: #1729555 - add filter by pod in the node listing page

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Nicely done! Looks good.

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

UNIT TESTS
-b machine-filter-by-pod lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci-jenkins.internal:8080/job/maas/job/branch-tester/901/console
COMMIT: 2901dd2aedc5dedb4742883bad6ffd7bc372b474

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

UNIT TESTS
-b machine-filter-by-pod lp:~ack/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: b417cc2eaed09280f4aacf822e95bc4f9d7ae83c

review: Approve

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
diff --git a/src/maasserver/static/js/angular/factories/machines.js b/src/maasserver/static/js/angular/factories/machines.js
index cad4b33..1d56532 100644
--- a/src/maasserver/static/js/angular/factories/machines.js
+++ b/src/maasserver/static/js/angular/factories/machines.js
@@ -23,6 +23,9 @@ angular.module('MAAS').factory(
23 "status": null,23 "status": null,
24 "owner": null,24 "owner": null,
25 "tags": null,25 "tags": null,
26 "pod": function(machine) {
27 return (machine.pod === undefined) ? '' :machine.pod.name;
28 },
26 "zone": function(machine) {29 "zone": function(machine) {
27 return machine.zone.name;30 return machine.zone.name;
28 },31 },
diff --git a/src/maasserver/static/js/angular/factories/tests/test_machines.js b/src/maasserver/static/js/angular/factories/tests/test_machines.js
index 9c0d05f..c4d709b 100644
--- a/src/maasserver/static/js/angular/factories/tests/test_machines.js
+++ b/src/maasserver/static/js/angular/factories/tests/test_machines.js
@@ -34,8 +34,8 @@ describe("MachinesManager", function() {
3434
35 it("set requires attributes", function() {35 it("set requires attributes", function() {
36 expect(Object.keys(MachinesManager._metadataAttributes)).toEqual(36 expect(Object.keys(MachinesManager._metadataAttributes)).toEqual(
37 ["architecture", "status", "owner", "tags", "zone", "subnets",37 ["architecture", "status", "owner", "tags", "pod", "zone",
38 "fabrics", "spaces", "storage_tags", "release"]);38 "subnets", "fabrics", "spaces", "storage_tags", "release"]);
39 });39 });
4040
41 describe("mountSpecialFilesystem", function() {41 describe("mountSpecialFilesystem", function() {
diff --git a/src/maasserver/static/js/angular/filters/nodes.js b/src/maasserver/static/js/angular/filters/nodes.js
index c7a5b12..1d3087c 100644
--- a/src/maasserver/static/js/angular/filters/nodes.js
+++ b/src/maasserver/static/js/angular/filters/nodes.js
@@ -32,6 +32,9 @@ angular.module('MAAS').filter('nodesFilter', ['$filter', 'SearchService',
32 zone: function(node) {32 zone: function(node) {
33 return node.zone.name;33 return node.zone.name;
34 },34 },
35 pod: function(node) {
36 return (node.pod === undefined) ? undefined : node.pod.name;
37 },
35 power: function(node) {38 power: function(node) {
36 return node.power_state;39 return node.power_state;
37 },40 },
diff --git a/src/maasserver/static/js/angular/filters/tests/test_nodes.js b/src/maasserver/static/js/angular/filters/tests/test_nodes.js
index 9c2789c..c5c030a 100644
--- a/src/maasserver/static/js/angular/filters/tests/test_nodes.js
+++ b/src/maasserver/static/js/angular/filters/tests/test_nodes.js
@@ -231,6 +231,21 @@ describe("nodesFilter", function() {
231 expect(nodesFilter(nodes, "zone:first")).toEqual([matchingNode]);231 expect(nodesFilter(nodes, "zone:first")).toEqual([matchingNode]);
232 });232 });
233233
234 it("matches using pod mapping function", function() {
235 var matchingNode = {
236 pod: {
237 name: "pod1"
238 }
239 };
240 var otherNode = {
241 pod: {
242 name: "pod2"
243 }
244 };
245 var nodes = [matchingNode, otherNode];
246 expect(nodesFilter(nodes, "pod:pod1")).toEqual([matchingNode]);
247 });
248
234 it("matches using power mapping function", function() {249 it("matches using power mapping function", function() {
235 var matchingNode = {250 var matchingNode = {
236 power_state: 'on'251 power_state: 'on'
diff --git a/src/maasserver/static/partials/nodes-list.html b/src/maasserver/static/partials/nodes-list.html
index 004d153..de99b7f 100644
--- a/src/maasserver/static/partials/nodes-list.html
+++ b/src/maasserver/static/partials/nodes-list.html
@@ -751,6 +751,16 @@ sudo maas-rack register --url {$ tabs.controllers.registerUrl $} --secret {$ tab
751 </ul>751 </ul>
752 </div>752 </div>
753 </div>753 </div>
754 <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.pod.length">
755 <button class="accordion__tab-title maas-accordion-tab">Pods</button>
756 <div class="accordion__tab-content">
757 <ul class="accordion__tab-list">
758 <li class="accordion__tab-item" data-ng-repeat="pod in tabs.nodes.metadata.pod | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('pod', pod.name, 'nodes') }">
759 <button class="accordion__tab-link" data-ng-click="toggleFilter('pod', pod.name, 'nodes')">{$ pod.name $} ({$ pod.count $})</button>
760 </li>
761 </ul>
762 </div>
763 </div>
754 <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.subnets.length">764 <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.subnets.length">
755 <button class="accordion__tab-title maas-accordion-tab">Subnets</button>765 <button class="accordion__tab-title maas-accordion-tab">Subnets</button>
756 <div class="accordion__tab-content">766 <div class="accordion__tab-content">
diff --git a/src/maasserver/websockets/handlers/machine.py b/src/maasserver/websockets/handlers/machine.py
index 0e46de6..539ecfd 100644
--- a/src/maasserver/websockets/handlers/machine.py
+++ b/src/maasserver/websockets/handlers/machine.py
@@ -210,7 +210,7 @@ class MachineHandler(NodeHandler):
210 data["locked"] = obj.locked210 data["locked"] = obj.locked
211 bmc = obj.bmc211 bmc = obj.bmc
212 if bmc is not None and bmc.bmc_type == BMC_TYPE.POD:212 if bmc is not None and bmc.bmc_type == BMC_TYPE.POD:
213 data['pod'] = bmc.id213 data['pod'] = self.dehydrate_pod(bmc)
214214
215 if not for_list:215 if not for_list:
216 # Add info specific to a machine.216 # Add info specific to a machine.
diff --git a/src/maasserver/websockets/handlers/node.py b/src/maasserver/websockets/handlers/node.py
index 112d602..2c06762 100644
--- a/src/maasserver/websockets/handlers/node.py
+++ b/src/maasserver/websockets/handlers/node.py
@@ -112,6 +112,12 @@ class NodeHandler(TimestampedModelHandler):
112 "name": zone.name,112 "name": zone.name,
113 }113 }
114114
115 def dehydrate_pod(self, pod):
116 return {
117 "id": pod.id,
118 "name": pod.name,
119 }
120
115 def dehydrate_last_image_sync(self, last_image_sync):121 def dehydrate_last_image_sync(self, last_image_sync):
116 """Return formatted datetime."""122 """Return formatted datetime."""
117 return dehydrate_datetime(123 return dehydrate_datetime(
diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
index 5619371..a50cff7 100644
--- a/src/maasserver/websockets/handlers/tests/test_machine.py
+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
@@ -288,7 +288,7 @@ class TestMachineHandler(MAASServerTestCase):
288 }288 }
289 bmc = node.bmc289 bmc = node.bmc
290 if bmc is not None and bmc.bmc_type == BMC_TYPE.POD:290 if bmc is not None and bmc.bmc_type == BMC_TYPE.POD:
291 data['pod'] = bmc.id291 data['pod'] = {'id': bmc.id, 'name': bmc.name}
292 if for_list:292 if for_list:
293 allowed_fields = MachineHandler.Meta.list_fields + [293 allowed_fields = MachineHandler.Meta.list_fields + [
294 "actions",294 "actions",
@@ -479,6 +479,24 @@ class TestMachineHandler(MAASServerTestCase):
479 "name": zone.name,479 "name": zone.name,
480 }, handler.dehydrate_zone(zone))480 }, handler.dehydrate_zone(zone))
481481
482 def test_dehydrate_pod(self):
483 owner = factory.make_User()
484 handler = MachineHandler(owner, {})
485 pod = factory.make_Pod()
486 self.assertEqual(
487 handler.dehydrate_pod(pod),
488 {'id': pod.id, 'name': pod.name})
489
490 def test_dehydrate_node_with_pod(self):
491 owner = factory.make_User()
492 handler = MachineHandler(owner, {})
493 pod = factory.make_Pod()
494 node = factory.make_Node()
495 node.bmc = pod
496 data = {}
497 handler.dehydrate(node, data)
498 self.assertEqual(data['pod'], {'id': pod.id, 'name': pod.name})
499
482 def test_dehydrate_power_parameters_returns_None_when_empty(self):500 def test_dehydrate_power_parameters_returns_None_when_empty(self):
483 owner = factory.make_User()501 owner = factory.make_User()
484 handler = MachineHandler(owner, {})502 handler = MachineHandler(owner, {})

Subscribers

People subscribed via source and target branches