← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~troyanov/maas:create-pod into maas:master

 

Anton Troyanov has proposed merging ~troyanov/maas:create-pod into maas:master.

Commit message:
feat(vault): add create_pod method to create Pods

Requested reviews:
  MAAS Maintainers (maas-maintainers)

For more details, see:
https://code.launchpad.net/~troyanov/maas/+git/maas/+merge/433361
-- 
Your team MAAS Maintainers is requested to review the proposed merge of ~troyanov/maas:create-pod into maas:master.
diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
index a01fbb9..ada0eeb 100644
--- a/src/maasserver/models/bmc.py
+++ b/src/maasserver/models/bmc.py
@@ -729,6 +729,26 @@ class PodManager(BaseBMCManager):
             raise PermissionDenied()
 
 
+def create_pod(**kwargs):
+    power_type = kwargs.get("power_type", None)
+    power_parameters = kwargs.get("power_parameters", {})
+
+    power_parameters, secrets = sanitise_power_parameters(
+        power_type, power_parameters
+    )
+    kwargs["power_parameters"] = power_parameters
+
+    pod = Pod.objects.create(**kwargs)
+
+    if secrets:
+        from maasserver.secrets import SecretManager
+
+        SecretManager().set_composite_secret(
+            "power-parameters", secrets, obj=pod.as_bmc()
+        )
+    return pod
+
+
 class Pod(BMC):
     """A `Pod` represents a `BMC` that controls multiple machines."""
 
@@ -1599,8 +1619,9 @@ class Pod(BMC):
         if not self.default_storage_pool and possible_default:
             self.default_storage_pool = possible_default
             if upgrade_default_pool is not None:
-                self.power_parameters = self.get_power_parameters().copy()
-                self.power_parameters.pop("default_storage_pool", None)
+                power_parameters = self.get_power_parameters().copy()
+                power_parameters.pop("default_storage_pool", None)
+                self.set_power_parameters(power_parameters)
             self.save()
         elif self.default_storage_pool in storage_pools_by_id.values():
             self.default_storage_pool = possible_default
@@ -1629,7 +1650,7 @@ class Pod(BMC):
             # so changing the value of the dict doesn't cause it to be updated.
             power_params = pod_power_parameters.copy()
             del power_params["password"]
-            self.power_parameters = power_params
+            self.set_power_parameters(power_params)
         self.version = discovered_pod.version
         self.architectures = discovered_pod.architectures
         if not self.name or cluster is not None and discovered_pod.name:
diff --git a/src/maasserver/models/tests/test_bmc.py b/src/maasserver/models/tests/test_bmc.py
index b766810..47300fd 100644
--- a/src/maasserver/models/tests/test_bmc.py
+++ b/src/maasserver/models/tests/test_bmc.py
@@ -917,7 +917,7 @@ class TestPod(MAASServerTestCase, PodTestMixin):
         pod2 = Pod(
             power_type="lxd",
             name=pod1.name,
-            power_parameters={"project": pod1.power_parameters["project"]},
+            power_parameters={"project": pod1.get_power_parameters()["project"]},
         )
         self.assertRaises(IntegrityError, pod2.sync, discovered_pod, user)
 
diff --git a/src/maasserver/vmhost.py b/src/maasserver/vmhost.py
index 05af032..9ab7d9d 100644
--- a/src/maasserver/vmhost.py
+++ b/src/maasserver/vmhost.py
@@ -18,6 +18,7 @@ from maasserver.models import (
     Tag,
     VMCluster,
 )
+from maasserver.models.bmc import create_pod
 from maasserver.rpc import getClientFromIdentifiers
 from maasserver.utils import absolute_reverse
 from maasserver.utils.orm import post_commit_do, transactional
@@ -194,7 +195,7 @@ def _get_or_create_clustered_host(
             hints__cluster=cluster,
         )
     except Pod.DoesNotExist:
-        host = Pod.objects.create(
+        host = create_pod(
             name=discovered_vmhost.name,
             architectures=discovered_vmhost.architectures,
             capabilities=discovered_vmhost.capabilities,

Follow ups