Merge ~andreserl/maas:ui_arch_filter into maas:master

Proposed by Andres Rodriguez
Status: Merged
Approved by: Andres Rodriguez
Approved revision: dfbb06b27881771eb4b253103aa5bc26581025e6
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~andreserl/maas:ui_arch_filter
Merge into: maas:master
Diff against target: 111 lines (+17/-6)
8 files modified
src/maasserver/static/js/angular/factories/machines.js (+1/-0)
src/maasserver/static/js/angular/factories/tests/test_machines.js (+2/-2)
src/maasserver/static/partials/nodes-list.html (+10/-0)
src/maasserver/websockets/handlers/node.py (+1/-0)
src/maasserver/websockets/handlers/node_result.py (+0/-2)
src/maasserver/websockets/handlers/tests/test_machine.py (+1/-0)
src/metadataserver/models/scriptresult.py (+1/-1)
src/metadataserver/models/tests/test_scriptresult.py (+1/-1)
Reviewer Review Type Date Requested Status
Björn Tillenius Approve
Review via email: mp+329755@code.launchpad.net

Commit message

LP: #1659379 - Add architecture filter.

To post a comment you must log in.
Revision history for this message
Björn Tillenius (bjornt) wrote :

The changes look good, but I'm missing tests for the changes you did (or justification why tests can't be added).

review: Needs Fixing
Revision history for this message
Andres Rodriguez (andreserl) wrote :

09:30 < blake_r> roaksoax: no unit tests on the page since its done in the HTML
09:31 < blake_r> roaksoax: but all the logic that performs the searching is already unit tested
09:32 < blake_r> roaksoax: so adding another filter should just be strait forward with no tests really

Revision history for this message
Björn Tillenius (bjornt) wrote :

Well, I don't agree with Blake here. I think HTML should be unit tested, since there's quite a lot of logic in there.

That said, I can understand that we don't have a framework for testing that HTML yet, so I guess I'll approve this branch without those tests in place.

As Blake also mentioned on IRC, there should be a test for the Python changes you made. That one should be trivial to add.

review: Approve
Revision history for this message
MAAS Lander (maas-lander) wrote :
Revision history for this message
MAAS Lander (maas-lander) wrote :
~andreserl/maas:ui_arch_filter updated
dfbb06b... by Andres Rodriguez

Fix tests

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 c5e50a0..cad4b33 100644
3--- a/src/maasserver/static/js/angular/factories/machines.js
4+++ b/src/maasserver/static/js/angular/factories/machines.js
5@@ -19,6 +19,7 @@ angular.module('MAAS').factory(
6 this._handler = "machine";
7
8 this._metadataAttributes = {
9+ "architecture": null,
10 "status": null,
11 "owner": null,
12 "tags": null,
13diff --git a/src/maasserver/static/js/angular/factories/tests/test_machines.js b/src/maasserver/static/js/angular/factories/tests/test_machines.js
14index 3539b61..9c0d05f 100644
15--- a/src/maasserver/static/js/angular/factories/tests/test_machines.js
16+++ b/src/maasserver/static/js/angular/factories/tests/test_machines.js
17@@ -34,8 +34,8 @@ describe("MachinesManager", function() {
18
19 it("set requires attributes", function() {
20 expect(Object.keys(MachinesManager._metadataAttributes)).toEqual(
21- ["status", "owner", "tags", "zone", "subnets", "fabrics",
22- "spaces", "storage_tags", "release"]);
23+ ["architecture", "status", "owner", "tags", "zone", "subnets",
24+ "fabrics", "spaces", "storage_tags", "release"]);
25 });
26
27 describe("mountSpecialFilesystem", function() {
28diff --git a/src/maasserver/static/partials/nodes-list.html b/src/maasserver/static/partials/nodes-list.html
29index 85b43f6..e8076f3 100644
30--- a/src/maasserver/static/partials/nodes-list.html
31+++ b/src/maasserver/static/partials/nodes-list.html
32@@ -702,6 +702,16 @@ sudo maas-rack register --url {$ tabs.controllers.registerUrl $} --secret {$ tab
33 </ul>
34 </div>
35 </div>
36+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.architecture.length">
37+ <button class="accordion__tab-title maas-accordion-tab">Architectures</button>
38+ <div class="accordion__tab-content">
39+ <ul class="accordion__tab-list">
40+ <li class="accordion__tab-item" data-ng-repeat="architecture in tabs.nodes.metadata.architecture | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('architecture', architecture.name, 'nodes') }">
41+ <button class="accordion__tab-link" data-ng-click="toggleFilter('architecture', architecture.name, 'nodes')"><span data-maas-release-name="architecture.name"></span> ({$ architecture.count $})</button>
42+ </li>
43+ </ul>
44+ </div>
45+ </div>
46 <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.release.length">
47 <button class="accordion__tab-title maas-accordion-tab">OS/Release</button>
48 <div class="accordion__tab-content">
49diff --git a/src/maasserver/websockets/handlers/node.py b/src/maasserver/websockets/handlers/node.py
50index 5014fa8..4883ebf 100644
51--- a/src/maasserver/websockets/handlers/node.py
52+++ b/src/maasserver/websockets/handlers/node.py
53@@ -120,6 +120,7 @@ class NodeHandler(TimestampedModelHandler):
54 for tag in obj.tags.all()
55 ]
56 if obj.node_type != NODE_TYPE.DEVICE:
57+ data["architecture"] = obj.architecture
58 data["memory"] = obj.display_memory()
59 data["status"] = obj.display_status()
60 data["status_code"] = obj.status
61diff --git a/src/maasserver/websockets/handlers/node_result.py b/src/maasserver/websockets/handlers/node_result.py
62index f9c8e76..181c568 100644
63--- a/src/maasserver/websockets/handlers/node_result.py
64+++ b/src/maasserver/websockets/handlers/node_result.py
65@@ -95,8 +95,6 @@ class NodeResultHandler(TimestampedModelHandler):
66 }]
67 else:
68 data["results"] = []
69- if results is None:
70- results = {}
71 for key, value in results.get("results", {}).items():
72 if obj.script is not None:
73 if isinstance(obj.script.results, dict):
74diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
75index 34918d4..2e06070 100644
76--- a/src/maasserver/websockets/handlers/tests/test_machine.py
77+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
78@@ -268,6 +268,7 @@ class TestMachineHandler(MAASServerTestCase):
79 if for_list:
80 allowed_fields = MachineHandler.Meta.list_fields + [
81 "actions",
82+ "architecture",
83 "fqdn",
84 "status",
85 "status_code",
86diff --git a/src/metadataserver/models/scriptresult.py b/src/metadataserver/models/scriptresult.py
87index ac3add2..d48de40 100644
88--- a/src/metadataserver/models/scriptresult.py
89+++ b/src/metadataserver/models/scriptresult.py
90@@ -128,7 +128,7 @@ class ScriptResult(CleanSave, TimestampedModel):
91
92 if parsed_yaml is None:
93 # No results were given.
94- return None
95+ return {}
96 elif not isinstance(parsed_yaml, dict):
97 raise ValidationError('YAML must be a dictionary.')
98
99diff --git a/src/metadataserver/models/tests/test_scriptresult.py b/src/metadataserver/models/tests/test_scriptresult.py
100index 9d21978..1125163 100644
101--- a/src/metadataserver/models/tests/test_scriptresult.py
102+++ b/src/metadataserver/models/tests/test_scriptresult.py
103@@ -413,7 +413,7 @@ class TestScriptResult(MAASServerTestCase):
104
105 def test_read_results_ignores_empty(self):
106 script_result = factory.make_ScriptResult(result=b'')
107- self.assertIsNone(script_result.read_results())
108+ self.assertDictEqual({}, script_result.read_results())
109
110 def test_read_results_does_not_require_results(self):
111 result = {'status': random.choice(

Subscribers

People subscribed via source and target branches