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
1diff --git a/src/maasserver/static/js/angular/factories/machines.js b/src/maasserver/static/js/angular/factories/machines.js
2index cad4b33..1d56532 100644
3--- a/src/maasserver/static/js/angular/factories/machines.js
4+++ b/src/maasserver/static/js/angular/factories/machines.js
5@@ -23,6 +23,9 @@ angular.module('MAAS').factory(
6 "status": null,
7 "owner": null,
8 "tags": null,
9+ "pod": function(machine) {
10+ return (machine.pod === undefined) ? '' :machine.pod.name;
11+ },
12 "zone": function(machine) {
13 return machine.zone.name;
14 },
15diff --git a/src/maasserver/static/js/angular/factories/tests/test_machines.js b/src/maasserver/static/js/angular/factories/tests/test_machines.js
16index 9c0d05f..c4d709b 100644
17--- a/src/maasserver/static/js/angular/factories/tests/test_machines.js
18+++ b/src/maasserver/static/js/angular/factories/tests/test_machines.js
19@@ -34,8 +34,8 @@ describe("MachinesManager", function() {
20
21 it("set requires attributes", function() {
22 expect(Object.keys(MachinesManager._metadataAttributes)).toEqual(
23- ["architecture", "status", "owner", "tags", "zone", "subnets",
24- "fabrics", "spaces", "storage_tags", "release"]);
25+ ["architecture", "status", "owner", "tags", "pod", "zone",
26+ "subnets", "fabrics", "spaces", "storage_tags", "release"]);
27 });
28
29 describe("mountSpecialFilesystem", function() {
30diff --git a/src/maasserver/static/js/angular/filters/nodes.js b/src/maasserver/static/js/angular/filters/nodes.js
31index c7a5b12..1d3087c 100644
32--- a/src/maasserver/static/js/angular/filters/nodes.js
33+++ b/src/maasserver/static/js/angular/filters/nodes.js
34@@ -32,6 +32,9 @@ angular.module('MAAS').filter('nodesFilter', ['$filter', 'SearchService',
35 zone: function(node) {
36 return node.zone.name;
37 },
38+ pod: function(node) {
39+ return (node.pod === undefined) ? undefined : node.pod.name;
40+ },
41 power: function(node) {
42 return node.power_state;
43 },
44diff --git a/src/maasserver/static/js/angular/filters/tests/test_nodes.js b/src/maasserver/static/js/angular/filters/tests/test_nodes.js
45index 9c2789c..c5c030a 100644
46--- a/src/maasserver/static/js/angular/filters/tests/test_nodes.js
47+++ b/src/maasserver/static/js/angular/filters/tests/test_nodes.js
48@@ -231,6 +231,21 @@ describe("nodesFilter", function() {
49 expect(nodesFilter(nodes, "zone:first")).toEqual([matchingNode]);
50 });
51
52+ it("matches using pod mapping function", function() {
53+ var matchingNode = {
54+ pod: {
55+ name: "pod1"
56+ }
57+ };
58+ var otherNode = {
59+ pod: {
60+ name: "pod2"
61+ }
62+ };
63+ var nodes = [matchingNode, otherNode];
64+ expect(nodesFilter(nodes, "pod:pod1")).toEqual([matchingNode]);
65+ });
66+
67 it("matches using power mapping function", function() {
68 var matchingNode = {
69 power_state: 'on'
70diff --git a/src/maasserver/static/partials/nodes-list.html b/src/maasserver/static/partials/nodes-list.html
71index 004d153..de99b7f 100644
72--- a/src/maasserver/static/partials/nodes-list.html
73+++ b/src/maasserver/static/partials/nodes-list.html
74@@ -751,6 +751,16 @@ sudo maas-rack register --url {$ tabs.controllers.registerUrl $} --secret {$ tab
75 </ul>
76 </div>
77 </div>
78+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.pod.length">
79+ <button class="accordion__tab-title maas-accordion-tab">Pods</button>
80+ <div class="accordion__tab-content">
81+ <ul class="accordion__tab-list">
82+ <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') }">
83+ <button class="accordion__tab-link" data-ng-click="toggleFilter('pod', pod.name, 'nodes')">{$ pod.name $} ({$ pod.count $})</button>
84+ </li>
85+ </ul>
86+ </div>
87+ </div>
88 <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.subnets.length">
89 <button class="accordion__tab-title maas-accordion-tab">Subnets</button>
90 <div class="accordion__tab-content">
91diff --git a/src/maasserver/websockets/handlers/machine.py b/src/maasserver/websockets/handlers/machine.py
92index 0e46de6..539ecfd 100644
93--- a/src/maasserver/websockets/handlers/machine.py
94+++ b/src/maasserver/websockets/handlers/machine.py
95@@ -210,7 +210,7 @@ class MachineHandler(NodeHandler):
96 data["locked"] = obj.locked
97 bmc = obj.bmc
98 if bmc is not None and bmc.bmc_type == BMC_TYPE.POD:
99- data['pod'] = bmc.id
100+ data['pod'] = self.dehydrate_pod(bmc)
101
102 if not for_list:
103 # Add info specific to a machine.
104diff --git a/src/maasserver/websockets/handlers/node.py b/src/maasserver/websockets/handlers/node.py
105index 112d602..2c06762 100644
106--- a/src/maasserver/websockets/handlers/node.py
107+++ b/src/maasserver/websockets/handlers/node.py
108@@ -112,6 +112,12 @@ class NodeHandler(TimestampedModelHandler):
109 "name": zone.name,
110 }
111
112+ def dehydrate_pod(self, pod):
113+ return {
114+ "id": pod.id,
115+ "name": pod.name,
116+ }
117+
118 def dehydrate_last_image_sync(self, last_image_sync):
119 """Return formatted datetime."""
120 return dehydrate_datetime(
121diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
122index 5619371..a50cff7 100644
123--- a/src/maasserver/websockets/handlers/tests/test_machine.py
124+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
125@@ -288,7 +288,7 @@ class TestMachineHandler(MAASServerTestCase):
126 }
127 bmc = node.bmc
128 if bmc is not None and bmc.bmc_type == BMC_TYPE.POD:
129- data['pod'] = bmc.id
130+ data['pod'] = {'id': bmc.id, 'name': bmc.name}
131 if for_list:
132 allowed_fields = MachineHandler.Meta.list_fields + [
133 "actions",
134@@ -479,6 +479,24 @@ class TestMachineHandler(MAASServerTestCase):
135 "name": zone.name,
136 }, handler.dehydrate_zone(zone))
137
138+ def test_dehydrate_pod(self):
139+ owner = factory.make_User()
140+ handler = MachineHandler(owner, {})
141+ pod = factory.make_Pod()
142+ self.assertEqual(
143+ handler.dehydrate_pod(pod),
144+ {'id': pod.id, 'name': pod.name})
145+
146+ def test_dehydrate_node_with_pod(self):
147+ owner = factory.make_User()
148+ handler = MachineHandler(owner, {})
149+ pod = factory.make_Pod()
150+ node = factory.make_Node()
151+ node.bmc = pod
152+ data = {}
153+ handler.dehydrate(node, data)
154+ self.assertEqual(data['pod'], {'id': pod.id, 'name': pod.name})
155+
156 def test_dehydrate_power_parameters_returns_None_when_empty(self):
157 owner = factory.make_User()
158 handler = MachineHandler(owner, {})

Subscribers

People subscribed via source and target branches