← Back to team overview

sts-sponsors team mailing list archive

[Merge] ~bjornt/maas:move-metadataserver-node-models into maas:master

 

Björn Tillenius has proposed merging ~bjornt/maas:move-metadataserver-node-models into maas:master.

Commit message:
Move Node metadataserver models to maasserver.



Requested reviews:
  MAAS Maintainers (maas-maintainers)

For more details, see:
https://code.launchpad.net/~bjornt/maas/+git/maas/+merge/441919
-- 
Your team MAAS Maintainers is requested to review the proposed merge of ~bjornt/maas:move-metadataserver-node-models into maas:master.
diff --git a/src/maasserver/api/tests/test_machine.py b/src/maasserver/api/tests/test_machine.py
index 0477be6..ca98aae 100644
--- a/src/maasserver/api/tests/test_machine.py
+++ b/src/maasserver/api/tests/test_machine.py
@@ -42,7 +42,7 @@ from maasserver.enum import (
 from maasserver.exceptions import StaticIPAddressExhaustion
 from maasserver.models import Config, Domain, Filesystem, Machine, Node
 from maasserver.models import node as node_module
-from maasserver.models import StaticIPAddress
+from maasserver.models import NodeKey, NodeUserData, StaticIPAddress
 from maasserver.models.bmc import Pod
 from maasserver.models.node import RELEASABLE_STATUSES
 from maasserver.models.signals.testing import SignalsDisabled
@@ -74,7 +74,6 @@ from maastesting.matchers import (
 )
 from metadataserver.builtin_scripts import load_builtin_scripts
 from metadataserver.enum import SCRIPT_TYPE
-from metadataserver.models import NodeKey, NodeUserData
 from metadataserver.nodeinituser import get_node_init_user
 from provisioningserver.refresh.node_info_scripts import NODE_INFO_SCRIPTS
 from provisioningserver.utils.enum import map_enum
diff --git a/src/maasserver/api/tests/test_node.py b/src/maasserver/api/tests/test_node.py
index 32a99cc..519a583 100644
--- a/src/maasserver/api/tests/test_node.py
+++ b/src/maasserver/api/tests/test_node.py
@@ -15,6 +15,7 @@ from maasserver.api import auth
 from maasserver.enum import NODE_STATUS, NODE_STATUS_CHOICES, POWER_STATE
 from maasserver.models import Config, Node
 from maasserver.models import node as node_module
+from maasserver.models import NodeKey
 from maasserver.testing.api import APITestCase
 from maasserver.testing.architecture import make_usable_architecture
 from maasserver.testing.factory import factory
@@ -34,7 +35,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_CHOICES,
     SCRIPT_TYPE,
 )
-from metadataserver.models import NodeKey
 from metadataserver.models.scriptset import get_status_from_qs
 from metadataserver.nodeinituser import get_node_init_user
 from provisioningserver.refresh.node_info_scripts import (
diff --git a/src/maasserver/clusterrpc/tests/test_osystems.py b/src/maasserver/clusterrpc/tests/test_osystems.py
index 7e8abb9..f98334b 100644
--- a/src/maasserver/clusterrpc/tests/test_osystems.py
+++ b/src/maasserver/clusterrpc/tests/test_osystems.py
@@ -23,12 +23,12 @@ from maasserver.clusterrpc.osystems import (
     validate_license_key,
 )
 from maasserver.enum import BOOT_RESOURCE_TYPE, PRESEED_TYPE
+from maasserver.models import NodeKey
 from maasserver.rpc import getAllClients
 from maasserver.rpc.testing.fixtures import RunningClusterRPCFixture
 from maasserver.testing.architecture import make_usable_architecture
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
-from metadataserver.models import NodeKey
 from provisioningserver.rpc.exceptions import NoSuchOperatingSystem
 
 
diff --git a/src/maasserver/clusterrpc/tests/test_pods.py b/src/maasserver/clusterrpc/tests/test_pods.py
index 36badc6..45a3075 100644
--- a/src/maasserver/clusterrpc/tests/test_pods.py
+++ b/src/maasserver/clusterrpc/tests/test_pods.py
@@ -27,6 +27,7 @@ from maasserver.clusterrpc.pods import (
     send_pod_commissioning_results,
 )
 from maasserver.exceptions import PodProblem
+from maasserver.models import NodeKey
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import (
     MAASServerTestCase,
@@ -35,7 +36,6 @@ from maasserver.testing.testcase import (
 from maastesting.crochet import wait_for
 from maastesting.matchers import MockCalledOnceWith
 from maastesting.testcase import MAASTestCase
-from metadataserver.models import NodeKey
 from provisioningserver.drivers.pod import (
     DiscoveredCluster,
     DiscoveredPod,
diff --git a/src/maasserver/compose_preseed.py b/src/maasserver/compose_preseed.py
index 97974b6..2ccc0a0 100644
--- a/src/maasserver/compose_preseed.py
+++ b/src/maasserver/compose_preseed.py
@@ -620,8 +620,7 @@ def compose_preseed(request, preseed_type, node):
     :return: Preseed data containing the information the node needs in order
         to access the metadata service: its URL and auth token.
     """
-    # Circular import.
-    from metadataserver.models import NodeKey
+    from maasserver.models import NodeKey
 
     token = NodeKey.objects.get_token_for_node(node)
     if preseed_type == PRESEED_TYPE.COMMISSIONING:
diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
index 3838d7c..e87279e 100644
--- a/src/maasserver/forms/__init__.py
+++ b/src/maasserver/forms/__init__.py
@@ -1207,7 +1207,7 @@ class AdminMachineForm(MachineForm, AdminNodeForm, WithPowerTypeMixin):
 
     def _setup_deployed_machine(self, machine):
         """Configure the Machine before it has been saved."""
-        from metadataserver.models import NodeKey
+        from maasserver.models import NodeKey
         from metadataserver.models.scriptset import ScriptSet
 
         machine.update_status(NODE_STATUS.DEPLOYED, validate_transition=False)
diff --git a/src/maasserver/forms/tests/test_machine.py b/src/maasserver/forms/tests/test_machine.py
index 463e2db..a53d5be 100644
--- a/src/maasserver/forms/tests/test_machine.py
+++ b/src/maasserver/forms/tests/test_machine.py
@@ -14,6 +14,7 @@ from maasserver.forms import (
     MachineForm,
     pick_default_architecture,
 )
+from maasserver.models import NodeKey
 from maasserver.testing.architecture import (
     make_usable_architecture,
     patch_usable_architectures,
@@ -25,7 +26,6 @@ from maasserver.testing.osystems import (
     patch_usable_osystems,
 )
 from maasserver.testing.testcase import MAASServerTestCase
-from metadataserver.models import NodeKey
 from provisioningserver.certificates import Certificate
 from provisioningserver.rpc.exceptions import (
     NoConnectionsAvailable,
diff --git a/src/maasserver/migrations/maasserver/0296_move_metadata_node_models.py b/src/maasserver/migrations/maasserver/0296_move_metadata_node_models.py
new file mode 100644
index 0000000..a195447
--- /dev/null
+++ b/src/maasserver/migrations/maasserver/0296_move_metadata_node_models.py
@@ -0,0 +1,84 @@
+# Generated by Django 3.2.12 on 2022-11-17 15:29
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+import maasserver.models.cleansave
+import metadataserver.fields
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("piston3", "0003_piston_nonce_index"),
+        ("maasserver", "0295_macaddress_text_field"),
+        ("metadataserver", "0035_move_metadata_node_models"),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            state_operations=[
+                migrations.CreateModel(
+                    name="NodeKey",
+                    fields=[
+                        (
+                            "id",
+                            models.AutoField(
+                                auto_created=True,
+                                primary_key=True,
+                                serialize=False,
+                                verbose_name="ID",
+                            ),
+                        ),
+                        (
+                            "node",
+                            models.OneToOneField(
+                                editable=False,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.node",
+                            ),
+                        ),
+                        (
+                            "token",
+                            models.OneToOneField(
+                                editable=False,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="piston3.token",
+                            ),
+                        ),
+                    ],
+                    bases=(
+                        maasserver.models.cleansave.CleanSave,
+                        models.Model,
+                    ),
+                ),
+                migrations.CreateModel(
+                    name="NodeUserData",
+                    fields=[
+                        (
+                            "id",
+                            models.AutoField(
+                                auto_created=True,
+                                primary_key=True,
+                                serialize=False,
+                                verbose_name="ID",
+                            ),
+                        ),
+                        ("data", metadataserver.fields.BinaryField()),
+                        (
+                            "node",
+                            models.OneToOneField(
+                                editable=False,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.node",
+                            ),
+                        ),
+                    ],
+                    bases=(
+                        maasserver.models.cleansave.CleanSave,
+                        models.Model,
+                    ),
+                ),
+            ],
+            database_operations=[],
+        ),
+    ]
diff --git a/src/maasserver/models/__init__.py b/src/maasserver/models/__init__.py
index 72f3ef5..1327639 100644
--- a/src/maasserver/models/__init__.py
+++ b/src/maasserver/models/__init__.py
@@ -48,7 +48,9 @@ __all__ = [
     "NodeConfig",
     "NodeDevice",
     "NodeDeviceVPD",
+    "NodeKey",
     "NodeMetadata",
+    "NodeUserData",
     "NodeGroupToRackController",
     "Notification",
     "NUMANode",
@@ -166,7 +168,9 @@ from maasserver.models.node import (
 from maasserver.models.nodeconfig import NodeConfig
 from maasserver.models.nodedevice import NodeDevice
 from maasserver.models.nodedevicevpd import NodeDeviceVPD
+from maasserver.models.nodekey import NodeKey
 from maasserver.models.nodemetadata import NodeMetadata
+from maasserver.models.nodeuserdata import NodeUserData
 from maasserver.models.notification import Notification
 from maasserver.models.numa import NUMANode, NUMANodeHugepages
 from maasserver.models.ownerdata import OwnerData
diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
index f8ea9a4..ea6b233 100644
--- a/src/maasserver/models/node.py
+++ b/src/maasserver/models/node.py
@@ -5716,7 +5716,7 @@ class Node(CleanSave, TimestampedModel):
         from maasserver.clusterrpc.boot_images import (
             get_common_available_boot_images,
         )
-        from metadataserver.models import NodeUserData
+        from maasserver.models import NodeUserData
 
         if not user.has_perm(NodePermission.edit, self):
             # You can't start a node you don't own unless you're an admin.
@@ -6108,7 +6108,7 @@ class Node(CleanSave, TimestampedModel):
         """Start rescue mode."""
         # Avoid circular imports.
         from maasserver.models.event import Event
-        from metadataserver.models import NodeUserData
+        from maasserver.models.nodeuserdata import NodeUserData
 
         if not user.has_perm(NodePermission.edit, self):
             # You can't enter rescue mode on a node you don't own,
@@ -6487,8 +6487,7 @@ class Controller(Node):
 
     @transactional
     def _get_token_for_controller(self):
-        # Avoid circular imports.
-        from metadataserver.models import NodeKey
+        from maasserver.models import NodeKey
 
         token = NodeKey.objects.get_token_for_node(self)
         # Pull consumer into memory so it can be accessed outside a
diff --git a/src/metadataserver/models/nodekey.py b/src/maasserver/models/nodekey.py
similarity index 100%
rename from src/metadataserver/models/nodekey.py
rename to src/maasserver/models/nodekey.py
diff --git a/src/metadataserver/models/nodeuserdata.py b/src/maasserver/models/nodeuserdata.py
similarity index 100%
rename from src/metadataserver/models/nodeuserdata.py
rename to src/maasserver/models/nodeuserdata.py
diff --git a/src/maasserver/models/signals/nodes.py b/src/maasserver/models/signals/nodes.py
index ad12f89..ac846c7 100644
--- a/src/maasserver/models/signals/nodes.py
+++ b/src/maasserver/models/signals/nodes.py
@@ -17,9 +17,9 @@ from maasserver.models import (
     Service,
 )
 from maasserver.models.nodeconfig import create_default_nodeconfig
+from maasserver.models.nodekey import NodeKey
 from maasserver.models.numa import create_default_numanode
 from maasserver.utils.signals import SignalsManager
-from metadataserver.models.nodekey import NodeKey
 
 NODE_CLASSES = [
     Node,
diff --git a/src/maasserver/models/signals/tests/test_nodes.py b/src/maasserver/models/signals/tests/test_nodes.py
index f006a33..e52d932 100644
--- a/src/maasserver/models/signals/tests/test_nodes.py
+++ b/src/maasserver/models/signals/tests/test_nodes.py
@@ -16,13 +16,13 @@ from maasserver.enum import (
     POWER_STATE_CHOICES,
 )
 from maasserver.models import Node, RackController, StaticIPAddress
+from maasserver.models.nodekey import NodeKey
 from maasserver.models.service import RACK_SERVICES, REGION_SERVICES, Service
 from maasserver.models.signals import power
 from maasserver.node_status import NODE_TRANSITIONS
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
 from maasserver.utils.orm import reload_object
-from metadataserver.models.nodekey import NodeKey
 
 
 class TestNodeDeletion(MAASServerTestCase):
diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
index 6e20681..04890bf 100644
--- a/src/maasserver/models/tests/test_node.py
+++ b/src/maasserver/models/tests/test_node.py
@@ -93,6 +93,7 @@ from maasserver.models import (
 )
 from maasserver.models import (
     NodeDevice,
+    NodeUserData,
     OwnerData,
     PhysicalInterface,
     RackController,
@@ -182,7 +183,7 @@ from metadataserver.enum import (
     SCRIPT_STATUS_RUNNING_OR_PENDING,
     SCRIPT_TYPE,
 )
-from metadataserver.models import NodeUserData, ScriptResult, ScriptSet
+from metadataserver.models import ScriptResult, ScriptSet
 from provisioningserver.drivers.pod import Capabilities, DiscoveredPodHints
 from provisioningserver.drivers.power.ipmi import IPMI_BOOT_TYPE
 from provisioningserver.drivers.power.registry import PowerDriverRegistry
diff --git a/src/metadataserver/models/tests/test_nodekey.py b/src/maasserver/models/tests/test_nodekey.py
similarity index 98%
rename from src/metadataserver/models/tests/test_nodekey.py
rename to src/maasserver/models/tests/test_nodekey.py
index c7f74eb..9f2e728 100644
--- a/src/metadataserver/models/tests/test_nodekey.py
+++ b/src/maasserver/models/tests/test_nodekey.py
@@ -6,10 +6,10 @@
 
 from testtools.matchers import HasLength
 
+from maasserver.models import NodeKey
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
 from maastesting.djangotestcase import CountQueries
-from metadataserver.models import NodeKey
 
 
 class TestNodeKeyManager(MAASServerTestCase):
diff --git a/src/metadataserver/models/tests/test_nodeuserdata.py b/src/maasserver/models/tests/test_nodeuserdata.py
similarity index 98%
rename from src/metadataserver/models/tests/test_nodeuserdata.py
rename to src/maasserver/models/tests/test_nodeuserdata.py
index 1be190d..f1430fc 100644
--- a/src/metadataserver/models/tests/test_nodeuserdata.py
+++ b/src/maasserver/models/tests/test_nodeuserdata.py
@@ -4,9 +4,9 @@
 """Tests for :class:`NodeUserData` and manager."""
 
 
+from maasserver.models import NodeUserData
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
-from metadataserver.models import NodeUserData
 
 
 class TestNodeUserDataManager(MAASServerTestCase):
diff --git a/src/maasserver/preseed.py b/src/maasserver/preseed.py
index 35713f8..8e9a8ed 100644
--- a/src/maasserver/preseed.py
+++ b/src/maasserver/preseed.py
@@ -33,7 +33,7 @@ from maasserver.compose_preseed import (
 )
 from maasserver.enum import FILESYSTEM_TYPE, PRESEED_TYPE
 from maasserver.exceptions import ClusterUnavailable, MissingBootImage
-from maasserver.models import BootResource, Config, PackageRepository
+from maasserver.models import BootResource, Config, NodeKey, PackageRepository
 from maasserver.models.filesystem import Filesystem
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
 from maasserver.preseed_network import compose_curtin_network_config
@@ -48,7 +48,6 @@ from maasserver.utils.curtin import (
     curtin_supports_webhook_events,
 )
 from maasserver.utils.osystems import get_release_version_from_string
-from metadataserver.models import NodeKey
 from metadataserver.user_data.snippets import get_snippet_context
 from provisioningserver.drivers.osystem.ubuntu import UbuntuOS
 from provisioningserver.logger import get_maas_logger, LegacyLogger
diff --git a/src/maasserver/tests/test_compose_preseed.py b/src/maasserver/tests/test_compose_preseed.py
index eecd7a7..c3189c1 100644
--- a/src/maasserver/tests/test_compose_preseed.py
+++ b/src/maasserver/tests/test_compose_preseed.py
@@ -28,7 +28,7 @@ from maasserver.enum import (
     POWER_STATE,
     PRESEED_TYPE,
 )
-from maasserver.models import PackageRepository
+from maasserver.models import NodeKey, PackageRepository
 from maasserver.models.config import Config
 from maasserver.rpc.testing.fixtures import RunningClusterRPCFixture
 from maasserver.testing.factory import factory
@@ -36,7 +36,6 @@ from maasserver.testing.osystems import make_usable_osystem
 from maasserver.testing.testcase import MAASServerTestCase
 from maastesting.http import make_HttpRequest
 from maastesting.matchers import MockCalledOnceWith
-from metadataserver.models import NodeKey
 from provisioningserver.drivers.osystem import BOOT_IMAGE_PURPOSE
 from provisioningserver.rpc.exceptions import (
     NoConnectionsAvailable,
diff --git a/src/maasserver/tests/test_preseed.py b/src/maasserver/tests/test_preseed.py
index 4649eac..369e893 100644
--- a/src/maasserver/tests/test_preseed.py
+++ b/src/maasserver/tests/test_preseed.py
@@ -37,7 +37,7 @@ from maasserver.clusterrpc.testing.boot_images import make_rpc_boot_image
 from maasserver.compose_preseed import get_archive_config, make_clean_repo_name
 from maasserver.enum import FILESYSTEM_TYPE, NODE_STATUS, PRESEED_TYPE
 from maasserver.exceptions import ClusterUnavailable, MissingBootImage
-from maasserver.models import BootResource, Config, PackageRepository
+from maasserver.models import BootResource, Config, NodeKey, PackageRepository
 from maasserver.models.bootresource import LINUX_OSYSTEMS
 from maasserver.preseed import (
     compose_curtin_archive_config,
@@ -88,7 +88,6 @@ from maasserver.utils.curtin import curtin_supports_webhook_events
 from maastesting.http import make_HttpRequest
 from maastesting.matchers import MockCalledOnceWith, MockNotCalled
 from maastesting.testcase import MAASTestCase
-from metadataserver.models import NodeKey
 from provisioningserver.drivers.osystem.ubuntu import UbuntuOS
 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
 from provisioningserver.utils.enum import map_enum
diff --git a/src/maasserver/tests/test_vmhost.py b/src/maasserver/tests/test_vmhost.py
index ac4abb9..d8fbc43 100644
--- a/src/maasserver/tests/test_vmhost.py
+++ b/src/maasserver/tests/test_vmhost.py
@@ -11,7 +11,7 @@ from twisted.internet.defer import succeed
 from maasserver import vmhost as vmhost_module
 from maasserver.enum import BMC_TYPE
 from maasserver.exceptions import PodProblem
-from maasserver.models import Pod, PodHints, VMCluster
+from maasserver.models import NodeKey, Pod, PodHints, VMCluster
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import (
     MAASServerTestCase,
@@ -21,7 +21,6 @@ from maasserver.utils.orm import reload_object
 from maasserver.utils.threads import deferToDatabase
 from maastesting.crochet import wait_for
 from maastesting.matchers import MockCalledOnceWith
-from metadataserver.models.nodekey import NodeKey
 from provisioningserver.drivers.pod import (
     DiscoveredCluster,
     DiscoveredPod,
diff --git a/src/maasserver/vmhost.py b/src/maasserver/vmhost.py
index 6b98824..3f70ddd 100644
--- a/src/maasserver/vmhost.py
+++ b/src/maasserver/vmhost.py
@@ -13,6 +13,7 @@ from maasserver.exceptions import PodProblem
 from maasserver.models import (
     BMCRoutableRackControllerRelationship,
     Event,
+    NodeKey,
     Pod,
     RackController,
     Tag,
@@ -23,7 +24,6 @@ from maasserver.rpc import getClientFromIdentifiers
 from maasserver.utils import absolute_reverse
 from maasserver.utils.orm import post_commit_do, transactional
 from maasserver.utils.threads import deferToDatabase
-from metadataserver.models import NodeKey
 from provisioningserver.drivers.pod import DiscoveredCluster, DiscoveredPod
 from provisioningserver.events import EVENT_TYPES
 
diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
index b3d2327..5ea2e31 100644
--- a/src/maasserver/websockets/handlers/tests/test_machine.py
+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
@@ -67,6 +67,7 @@ from maasserver.models import (
     VolumeGroup,
 )
 from maasserver.models.blockdevice import MIN_BLOCK_DEVICE_SIZE
+from maasserver.models.nodekey import NodeKey
 from maasserver.models.nodeprobeddetails import (
     get_single_probed_details,
     script_output_nsmap,
@@ -132,7 +133,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_FAILED,
     SCRIPT_TYPE,
 )
-from metadataserver.models.nodekey import NodeKey
 from metadataserver.models.scriptset import get_status_from_qs
 from provisioningserver.refresh.node_info_scripts import (
     LIST_MODALIASES_OUTPUT_NAME,
diff --git a/src/metadataserver/api.py b/src/metadataserver/api.py
index c42a5fb..faf237c 100644
--- a/src/metadataserver/api.py
+++ b/src/metadataserver/api.py
@@ -59,7 +59,9 @@ from maasserver.models import (
     Config,
     Interface,
     Node,
+    NodeKey,
     NodeMetadata,
+    NodeUserData,
     SSHKey,
     SSLKey,
 )
@@ -88,13 +90,7 @@ from metadataserver.enum import (
     SIGNAL_STATUS,
     SIGNAL_STATUS_CHOICES,
 )
-from metadataserver.models import (
-    NodeKey,
-    NodeUserData,
-    Script,
-    ScriptResult,
-    ScriptSet,
-)
+from metadataserver.models import Script, ScriptResult, ScriptSet
 from metadataserver.user_data import (
     generate_user_data_for_poweroff,
     generate_user_data_for_status,
diff --git a/src/metadataserver/api_twisted.py b/src/metadataserver/api_twisted.py
index 1ba61bc..ca432fa 100644
--- a/src/metadataserver/api_twisted.py
+++ b/src/metadataserver/api_twisted.py
@@ -18,7 +18,7 @@ from twisted.web.server import NOT_DONE_YET
 from maasserver.api.utils import extract_oauth_key_from_auth_header
 from maasserver.enum import NODE_STATUS, NODE_TYPE
 from maasserver.forms.pods import PodForm
-from maasserver.models import Interface, Node
+from maasserver.models import Interface, Node, NodeKey
 from maasserver.preseed import CURTIN_INSTALL_LOG
 from maasserver.secrets import SecretManager
 from maasserver.utils.orm import (
@@ -31,7 +31,6 @@ from maasserver.vmhost import discover_and_sync_vmhost
 from metadataserver import logger
 from metadataserver.api import add_event_to_node_event_log, process_file
 from metadataserver.enum import SCRIPT_STATUS
-from metadataserver.models import NodeKey
 from metadataserver.vendor_data import (
     DEPLOY_SECRETS_LXD_KEY,
     DEPLOY_SECRETS_VIRSH_KEY,
diff --git a/src/metadataserver/migrations/0035_move_metadata_node_models.py b/src/metadataserver/migrations/0035_move_metadata_node_models.py
new file mode 100644
index 0000000..c7be185
--- /dev/null
+++ b/src/metadataserver/migrations/0035_move_metadata_node_models.py
@@ -0,0 +1,33 @@
+# Generated by Django 3.2.12 on 2022-11-17 15:29
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("metadataserver", "0034_use_builtin_json_field"),
+        ("maasserver", "0295_macaddress_text_field"),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            state_operations=[
+                migrations.DeleteModel(
+                    name="NodeKey",
+                ),
+                migrations.DeleteModel(
+                    name="NodeUserData",
+                ),
+            ],
+            database_operations=[
+                migrations.AlterModelTable(
+                    name="NodeKey",
+                    table="maasserver_nodekey",
+                ),
+                migrations.AlterModelTable(
+                    name="NodeUserData",
+                    table="maasserver_nodeuserdata",
+                ),
+            ],
+        ),
+    ]
diff --git a/src/metadataserver/models/__init__.py b/src/metadataserver/models/__init__.py
index d3e4f00..7e863ff 100644
--- a/src/metadataserver/models/__init__.py
+++ b/src/metadataserver/models/__init__.py
@@ -4,10 +4,8 @@
 """Model export and helpers for metadataserver.
 """
 
-__all__ = ["NodeKey", "NodeUserData", "Script", "ScriptResult", "ScriptSet"]
+__all__ = ["Script", "ScriptResult", "ScriptSet"]
 
-from metadataserver.models.nodekey import NodeKey
-from metadataserver.models.nodeuserdata import NodeUserData
 from metadataserver.models.script import Script
 from metadataserver.models.scriptresult import ScriptResult
 from metadataserver.models.scriptset import ScriptSet
diff --git a/src/metadataserver/tests/test_api.py b/src/metadataserver/tests/test_api.py
index 4a1fd29..dcff7ac 100644
--- a/src/metadataserver/tests/test_api.py
+++ b/src/metadataserver/tests/test_api.py
@@ -41,7 +41,9 @@ from maasserver.forms.parameters import ParametersForm
 from maasserver.models import (
     Config,
     Event,
+    NodeKey,
     NodeMetadata,
+    NodeUserData,
     SSHKey,
     VersionedTextFile,
 )
@@ -90,7 +92,7 @@ from metadataserver.enum import (
     SIGNAL_STATUS,
     SIGNAL_STATUS_CHOICES,
 )
-from metadataserver.models import NodeKey, NodeUserData, Script, ScriptSet
+from metadataserver.models import Script, ScriptSet
 from metadataserver.nodeinituser import get_node_init_user
 from provisioningserver.events import (
     EVENT_DETAILS,
diff --git a/src/metadataserver/tests/test_api_twisted.py b/src/metadataserver/tests/test_api_twisted.py
index e84c837..e347a72 100644
--- a/src/metadataserver/tests/test_api_twisted.py
+++ b/src/metadataserver/tests/test_api_twisted.py
@@ -19,7 +19,7 @@ from twisted.web.server import NOT_DONE_YET
 from twisted.web.test.requesthelper import DummyRequest
 
 from maasserver.enum import INTERFACE_TYPE, IPADDRESS_TYPE, NODE_STATUS
-from maasserver.models import Event, Pod
+from maasserver.models import Event, NodeKey, Pod
 from maasserver.models.signals.testing import SignalsDisabled
 from maasserver.models.timestampedmodel import now
 from maasserver.node_status import get_node_timeout
@@ -52,7 +52,6 @@ from metadataserver.api_twisted import (
     StatusWorkerService,
 )
 from metadataserver.enum import RESULT_TYPE, SCRIPT_STATUS
-from metadataserver.models import NodeKey
 from provisioningserver.events import EVENT_STATUS_MESSAGES
 from provisioningserver.testing.certificates import get_sample_cert
 
diff --git a/src/metadataserver/tests/test_vendor_data.py b/src/metadataserver/tests/test_vendor_data.py
index 561320d..85b0c90 100644
--- a/src/metadataserver/tests/test_vendor_data.py
+++ b/src/metadataserver/tests/test_vendor_data.py
@@ -10,7 +10,7 @@ from testtools.matchers import ContainsDict, Equals, KeysEqual, MatchesDict
 import yaml
 
 from maasserver.enum import NODE_STATUS
-from maasserver.models import Config, ControllerInfo
+from maasserver.models import Config, ControllerInfo, NodeKey
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
 from maasserver.secrets import SecretManager
 from maasserver.server_address import get_maas_facing_server_host
@@ -20,7 +20,6 @@ from maasserver.testing.testcase import MAASServerTestCase
 from maasserver.utils.converters import systemd_interval_to_calendar
 from maastesting.matchers import MockNotCalled
 from metadataserver import vendor_data
-from metadataserver.models import NodeKey
 from metadataserver.vendor_data import (
     _get_metadataserver_template,
     DEPLOY_SECRETS_LXD_KEY,
diff --git a/src/metadataserver/vendor_data.py b/src/metadataserver/vendor_data.py
index 06cf64b..6fb9b7e 100644
--- a/src/metadataserver/vendor_data.py
+++ b/src/metadataserver/vendor_data.py
@@ -17,7 +17,7 @@ import tempita
 import yaml
 
 from maasserver import ntp
-from maasserver.models import Config, NodeMetadata
+from maasserver.models import Config, NodeKey, NodeMetadata
 from maasserver.models.controllerinfo import get_target_version
 from maasserver.node_status import COMMISSIONING_LIKE_STATUSES
 from maasserver.permissions import NodePermission
@@ -27,7 +27,6 @@ from maasserver.secrets import SecretManager
 from maasserver.server_address import get_maas_facing_server_host
 from maasserver.utils.certificates import generate_certificate
 from maasserver.utils.converters import systemd_interval_to_calendar
-from metadataserver.models import NodeKey
 from provisioningserver.ntp.config import normalise_address
 from provisioningserver.utils.text import make_gecos_field
 

Follow ups