Merge ~lloydwaltersj/maas:add-machine-count into maas:master

Proposed by Jack Lloyd-Walters
Status: Merged
Approved by: Jack Lloyd-Walters
Approved revision: 539c8f98deea3870b92f461b548c42964a4b54cb
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~lloydwaltersj/maas:add-machine-count
Merge into: maas:master
Diff against target: 181 lines (+116/-1)
2 files modified
src/maasserver/websockets/handlers/bootresource.py (+59/-1)
src/maasserver/websockets/handlers/tests/test_bootresource.py (+57/-0)
Reviewer Review Type Date Requested Status
Anton Troyanov Approve
Christian Grabowski Approve
MAAS Lander Approve
Review via email: mp+436064@code.launchpad.net

Commit message

Introduce machineCount to the UI

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

UNIT TESTS
-b add-machine-count lp:~lloydwaltersj/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas-tester/1839/consoleText
COMMIT: 6e835aca9d485a73a05282422ac86ebf59bf07b5

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

UNIT TESTS
-b add-machine-count lp:~lloydwaltersj/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 8eb01a9d5667ef6d74d3d55c31ca130ed5f336ed

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

UNIT TESTS
-b add-machine-count lp:~lloydwaltersj/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 539c8f98deea3870b92f461b548c42964a4b54cb

review: Approve
Revision history for this message
Christian Grabowski (cgrabowski) wrote :

+1

review: Approve
Revision history for this message
Anton Troyanov (troyanov) wrote :

LGTM!

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

UNABLE TO START LANDING

STATUS: MISSING COMMIT MESSAGE

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

UNABLE TO START LANDING

STATUS: MISSING COMMIT MESSAGE

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
diff --git a/src/maasserver/websockets/handlers/bootresource.py b/src/maasserver/websockets/handlers/bootresource.py
index fa4b17c..66d45b9 100644
--- a/src/maasserver/websockets/handlers/bootresource.py
+++ b/src/maasserver/websockets/handlers/bootresource.py
@@ -26,7 +26,7 @@ from maasserver.clusterrpc.boot_images import (
26 get_common_available_boot_images,26 get_common_available_boot_images,
27 is_import_boot_images_running,27 is_import_boot_images_running,
28)28)
29from maasserver.enum import BOOT_RESOURCE_TYPE, NODE_STATUS29from maasserver.enum import BOOT_RESOURCE_TYPE, NODE_STATUS, NODE_TYPE
30from maasserver.models import (30from maasserver.models import (
31 BootResource,31 BootResource,
32 BootSource,32 BootSource,
@@ -252,6 +252,11 @@ class BootResourceHandler(Handler):
252 resource.number_of_nodes = self.get_number_of_nodes_deployed_for(252 resource.number_of_nodes = self.get_number_of_nodes_deployed_for(
253 resource253 resource
254 )254 )
255 resource.machine_count = (
256 self.get_number_of_nodes_of_node_type_deployed_for(
257 resource, NODE_TYPE.MACHINE
258 )
259 )
255 resource_set = resource.get_latest_set()260 resource_set = resource.get_latest_set()
256 if resource_set is None:261 if resource_set is None:
257 resource.size = human_readable_bytes(0)262 resource.size = human_readable_bytes(0)
@@ -378,6 +383,43 @@ class BootResourceHandler(Handler):
378 count += 1383 count += 1
379 return count384 return count
380385
386 def get_number_of_nodes_of_node_type_deployed_for(
387 self, resource, node_type=NODE_TYPE.MACHINE
388 ):
389 """Return number of nodes of node_type='node_type' that are deploying the given
390 os, series, and architecture."""
391 if resource.rtype == BOOT_RESOURCE_TYPE.UPLOADED:
392 osystem = "custom"
393 distro_series = resource.name
394 else:
395 osystem, distro_series = resource.name.split("/")
396
397 # Count the number of nodes with same os/release and architecture.
398 count = sum(
399 1
400 for node in self.nodes.filter(
401 osystem=osystem,
402 distro_series=distro_series,
403 node_type=node_type,
404 )
405 if self.node_has_architecture_for_resource(node, resource)
406 )
407
408 # Any node that is deployed without osystem and distro_series,
409 # will be using the defaults.
410 if (
411 self.default_osystem == osystem
412 and self.default_distro_series == distro_series
413 ):
414 count += sum(
415 1
416 for node in self.nodes.filter(
417 osystem="", distro_series="", node_type=node_type
418 )
419 if self.node_has_architecture_for_resource(node, resource)
420 )
421 return count
422
381 def pick_latest_datetime(423 def pick_latest_datetime(
382 self, time: datetime, other_time: datetime424 self, time: datetime, other_time: datetime
383 ) -> datetime:425 ) -> datetime:
@@ -437,6 +479,17 @@ class BootResourceHandler(Handler):
437 for resource in resources479 for resource in resources
438 )480 )
439481
482 def get_number_of_nodes_of_node_type_for_resources(
483 self, resources, node_type=NODE_TYPE.MACHINE
484 ):
485 """Return the number of nodes of node_type='node_type' used by all resources"""
486 return sum(
487 self.get_number_of_nodes_of_node_type_deployed_for(
488 resource, node_type
489 )
490 for resource in resources
491 )
492
440 def get_last_deployed_for_resources(493 def get_last_deployed_for_resources(
441 self, resources: list[BootResource]494 self, resources: list[BootResource]
442 ) -> Optional[datetime]:495 ) -> Optional[datetime]:
@@ -496,6 +549,9 @@ class BootResourceHandler(Handler):
496 last_update = self.get_last_update_for_resources(group)549 last_update = self.get_last_update_for_resources(group)
497 unique_size = self.calculate_unique_size_for_resources(group)550 unique_size = self.calculate_unique_size_for_resources(group)
498 number_of_nodes = self.get_number_of_nodes_for_resources(group)551 number_of_nodes = self.get_number_of_nodes_for_resources(group)
552 machine_count = self.get_number_of_nodes_of_node_type_for_resources(
553 group, NODE_TYPE.MACHINE
554 )
499 complete = self.are_all_resources_complete(group)555 complete = self.are_all_resources_complete(group)
500 progress = self.get_progress_for_resources(group)556 progress = self.get_progress_for_resources(group)
501 last_deployed = self.get_last_deployed_for_resources(group)557 last_deployed = self.get_last_deployed_for_resources(group)
@@ -509,6 +565,7 @@ class BootResourceHandler(Handler):
509 resource.size = human_readable_bytes(unique_size)565 resource.size = human_readable_bytes(unique_size)
510 resource.last_update = last_update566 resource.last_update = last_update
511 resource.number_of_nodes = number_of_nodes567 resource.number_of_nodes = number_of_nodes
568 resource.machine_count = machine_count
512 resource.last_deployed = last_deployed569 resource.last_deployed = last_deployed
513 resource.complete = complete570 resource.complete = complete
514 if not complete:571 if not complete:
@@ -615,6 +672,7 @@ class BootResourceHandler(Handler):
615 "icon": resource.icon,672 "icon": resource.icon,
616 "downloading": resource.downloading,673 "downloading": resource.downloading,
617 "numberOfNodes": resource.number_of_nodes,674 "numberOfNodes": resource.number_of_nodes,
675 "machineCount": resource.machine_count,
618 "lastUpdate": resource.last_update.strftime(676 "lastUpdate": resource.last_update.strftime(
619 "%a, %d %b. %Y %H:%M:%S"677 "%a, %d %b. %Y %H:%M:%S"
620 ),678 ),
diff --git a/src/maasserver/websockets/handlers/tests/test_bootresource.py b/src/maasserver/websockets/handlers/tests/test_bootresource.py
index 96c773f..01bda2c 100644
--- a/src/maasserver/websockets/handlers/tests/test_bootresource.py
+++ b/src/maasserver/websockets/handlers/tests/test_bootresource.py
@@ -390,6 +390,63 @@ class TestBootResourcePoll(MAASServerTestCase, PatchOSInfoMixin):
390 start_time,390 start_time,
391 )391 )
392392
393 def test_shows_latest_deployment_time(self) -> None:
394 owner = factory.make_admin()
395 handler = BootResourceHandler(owner, {}, None)
396 resource = factory.make_usable_boot_resource(
397 rtype=BOOT_RESOURCE_TYPE.SYNCED
398 )
399 os_name, series = resource.name.split("/")
400 node = factory.make_Node(
401 status=NODE_STATUS.DEPLOYED,
402 osystem=os_name,
403 distro_series=series,
404 architecture=resource.architecture,
405 )
406 node.end_deployment()
407 start_time = datetime.datetime.now().replace(microsecond=0)
408 node = factory.make_Node(
409 status=NODE_STATUS.DEPLOYED,
410 osystem=os_name,
411 distro_series=series,
412 architecture=resource.architecture,
413 )
414 node.end_deployment()
415 response = handler.poll({})
416 resource = response["resources"][0]
417 self.assertGreaterEqual(
418 datetime.datetime.strptime(
419 resource["lastDeployed"], "%a, %d %b. %Y %H:%M:%S"
420 ),
421 start_time,
422 )
423
424 def test_shows_number_of_machines_deployed_at_current(self) -> None:
425 owner = factory.make_admin()
426 handler = BootResourceHandler(owner, {}, None)
427 resource = factory.make_usable_boot_resource(
428 rtype=BOOT_RESOURCE_TYPE.SYNCED
429 )
430 os_name, series = resource.name.split("/")
431 node = factory.make_Machine(
432 status=NODE_STATUS.DEPLOYED,
433 osystem=os_name,
434 distro_series=series,
435 architecture=resource.architecture,
436 )
437 factory.make_Node(
438 status=NODE_STATUS.DEPLOYED, architecture=resource.architecture
439 )
440 factory.make_RegionController(
441 status=NODE_STATUS.DEPLOYED,
442 )
443 response = handler.poll({})
444 self.assertEqual(1, response["resources"][0]["machineCount"])
445 node.delete()
446
447 response = handler.poll({})
448 self.assertEqual(0, response["resources"][0]["machineCount"])
449
393 def test_shows_number_of_nodes_deployed_for_resource(self):450 def test_shows_number_of_nodes_deployed_for_resource(self):
394 owner = factory.make_admin()451 owner = factory.make_admin()
395 handler = BootResourceHandler(owner, {}, None)452 handler = BootResourceHandler(owner, {}, None)

Subscribers

People subscribed via source and target branches