Merge ~newell-jensen/maas:lp1721113 into maas:master

Proposed by Newell Jensen
Status: Merged
Approved by: Andres Rodriguez
Approved revision: 193d2c379e2e45f3dac363abe5456ec451a13a70
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:lp1721113
Merge into: maas:master
Diff against target: 111 lines (+59/-2)
3 files modified
src/maasserver/static/partials/cards/storage.html (+3/-2)
src/maasserver/websockets/handlers/node.py (+25/-0)
src/maasserver/websockets/handlers/tests/test_machine.py (+31/-0)
Reviewer Review Type Date Requested Status
Andres Rodriguez (community) Approve
Review via email: mp+331977@code.launchpad.net

Commit message

LP: #1721113 -- Group physical block devices in the storage card off of their size and type.

To post a comment you must log in.
Revision history for this message
Andres Rodriguez (andreserl) wrote :

overall looks good to me. I'm not going to block you on it, but you need to add at least one more test before landing, see below!

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/static/partials/cards/storage.html b/src/maasserver/static/partials/cards/storage.html
2index 8058eab..2085216 100644
3--- a/src/maasserver/static/partials/cards/storage.html
4+++ b/src/maasserver/static/partials/cards/storage.html
5@@ -4,8 +4,9 @@
6 <h2 class="u-border--bottom u-border--solid u-padding--bottom u-margin--bottom" data-ng-if="node.storage == 0"><strong>Unknown</strong></h2>
7 </header>
8 <div class="u-padding--bottom">
9- <div data-ng-repeat="disk in node.disks">
10- <p>Disk {$ $index+1 $}: {$ (disk.size / 1000 / 1000 / 1000).toFixed(1) $} GB</p>
11+ <div data-ng-repeat="gs in node.grouped_storages">
12+ <p data-ng-if="gs.count === 1">{$ gs.count $}x{$ (gs.size / 1000 / 1000 / 1000).toFixed(0) $}GB ({$ gs.disk_type $}) disk</p>
13+ <p data-ng-if="gs.count > 1">{$ gs.count $}x{$ (gs.size / 1000 / 1000 / 1000).toFixed(0) $}GB ({$ gs.disk_type $}) disks</p>
14 </div>
15 </div>
16 <div class="action-card__position-bottom">
17diff --git a/src/maasserver/websockets/handlers/node.py b/src/maasserver/websockets/handlers/node.py
18index 961bcc6..30a6e21 100644
19--- a/src/maasserver/websockets/handlers/node.py
20+++ b/src/maasserver/websockets/handlers/node.py
21@@ -7,6 +7,7 @@ __all__ = [
22 "NodeHandler",
23 ]
24
25+from collections import Counter
26 from itertools import chain
27 import logging
28 from operator import itemgetter
29@@ -162,6 +163,8 @@ class NodeHandler(TimestampedModelHandler):
30 for blockdevice in physical_blockdevices
31 ) / (1000 ** 3))
32 data["storage_tags"] = self.get_all_storage_tags(blockdevices)
33+ data["grouped_storages"] = self.get_grouped_storages(
34+ physical_blockdevices)
35
36 data["osystem"] = obj.get_osystem(
37 default=self.default_osystem)
38@@ -666,3 +669,25 @@ class NodeHandler(TimestampedModelHandler):
39 "definition." % tag_name)
40 tag_obj.node_set.add(node_obj)
41 tag_obj.save()
42+
43+ def get_grouped_storages(self, blockdevices):
44+ """Group storage based off of the size and type.
45+
46+ This is used by the storage card when displaying the grouped disks.
47+ """
48+ disk_data = [
49+ (blockdevice.size, 'hdd' if disk_type == 'rotary' else disk_type)
50+ for blockdevice in blockdevices
51+ for disk_type in ('ssd', 'hdd', 'rotary', 'iscsi')
52+ if disk_type in blockdevice.tags
53+ ]
54+ grouped_storages = []
55+ for disk_type in ('ssd', 'hdd', 'rotary', 'iscsi'):
56+ c = Counter(elem[0] for elem in disk_data if elem[1] == disk_type)
57+ for size, count in c.items():
58+ grouped_storages.append({
59+ "size": size,
60+ "count": count,
61+ "disk_type": disk_type
62+ })
63+ return grouped_storages
64diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
65index 1b26af5..050472e 100644
66--- a/src/maasserver/websockets/handlers/tests/test_machine.py
67+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
68@@ -349,6 +349,8 @@ class TestMachineHandler(MAASServerTestCase):
69 else:
70 data["status_tooltip"] = ""
71
72+ data["grouped_storages"] = handler.get_grouped_storages(blockdevices)
73+
74 if include_summary:
75 data = handler.dehydrate_summary_output(node, data)
76 return data
77@@ -2759,6 +2761,35 @@ class TestMachineHandler(MAASServerTestCase):
78 })
79 self.assertIsNone(reload_object(link_ip))
80
81+ def test_get_grouped_storages_parses_blockdevices(self):
82+ user = factory.make_User()
83+ node = factory.make_Node(owner=user)
84+ size = random.randint(1000, 1000 ** 3)
85+ ssd = factory.make_PhysicalBlockDevice(node, tags=['ssd'])
86+ hdd = factory.make_PhysicalBlockDevice(node, tags=['hdd'], size=size)
87+ rotary = factory.make_PhysicalBlockDevice(
88+ node, tags=['rotary'], size=size)
89+ iscsi = factory.make_PhysicalBlockDevice(node, tags=['iscsi'])
90+ handler = MachineHandler(user, {})
91+ self.assertThat(
92+ handler.get_grouped_storages([ssd, hdd, rotary, iscsi]),
93+ MatchesListwise([
94+ MatchesDict({
95+ "count": Equals(1),
96+ "size": Equals(ssd.size),
97+ "disk_type": Equals('ssd')
98+ }),
99+ MatchesDict({
100+ "count": Equals(2),
101+ "size": Equals(hdd.size),
102+ "disk_type": Equals('hdd')
103+ }),
104+ MatchesDict({
105+ "count": Equals(1),
106+ "size": Equals(iscsi.size),
107+ "disk_type": Equals('iscsi')
108+ })]))
109+
110
111 class TestMachineHandlerCheckPower(MAASTransactionServerTestCase):
112

Subscribers

People subscribed via source and target branches