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

Commit message:
Move Script metadataserver models to maasserver.



Requested reviews:
  MAAS Maintainers (maas-maintainers)

For more details, see:
https://code.launchpad.net/~bjornt/maas/+git/maas/+merge/441920
-- 
Your team MAAS Committers is subscribed to branch maas:master.
diff --git a/src/maasserver/api/commissioning_scripts.py b/src/maasserver/api/commissioning_scripts.py
index 477b688..bf1e6e6 100644
--- a/src/maasserver/api/commissioning_scripts.py
+++ b/src/maasserver/api/commissioning_scripts.py
@@ -18,9 +18,9 @@ from maasserver.audit import create_audit_event
 from maasserver.enum import ENDPOINT
 from maasserver.exceptions import MAASAPIValidationError
 from maasserver.forms.script import ScriptForm
+from maasserver.models import Script
 from metadataserver.enum import SCRIPT_TYPE
 from metadataserver.fields import Bin
-from metadataserver.models import Script
 from provisioningserver.events import EVENT_TYPES
 
 
diff --git a/src/maasserver/api/nodedevices.py b/src/maasserver/api/nodedevices.py
index 354150a..f3243f7 100644
--- a/src/maasserver/api/nodedevices.py
+++ b/src/maasserver/api/nodedevices.py
@@ -11,8 +11,8 @@ from maasserver.api.utils import get_optional_param
 from maasserver.exceptions import MAASAPIValidationError
 from maasserver.models import Node, NodeDevice
 from maasserver.models.nodedevice import translate_bus
+from maasserver.models.script import translate_hardware_type
 from maasserver.permissions import NodePermission
-from metadataserver.models.script import translate_hardware_type
 
 
 class NodeDevicesHandler(OperationsHandler):
diff --git a/src/maasserver/api/nodes.py b/src/maasserver/api/nodes.py
index 41eeeab..4294776 100644
--- a/src/maasserver/api/nodes.py
+++ b/src/maasserver/api/nodes.py
@@ -46,6 +46,7 @@ from maasserver.forms import BulkNodeSetZoneForm
 from maasserver.forms.ephemeral import TestForm
 from maasserver.models import Filesystem, Interface, Node, OwnerData
 from maasserver.models.nodeprobeddetails import get_single_probed_details
+from maasserver.models.scriptset import get_status_from_qs
 from maasserver.node_constraint_filter_forms import ReadNodesForm
 from maasserver.permissions import NodePermission
 from maasserver.utils.forms import compose_invalid_choice_text
@@ -56,7 +57,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS,
     SCRIPT_STATUS_CHOICES,
 )
-from metadataserver.models.scriptset import get_status_from_qs
 
 NODES_SELECT_RELATED = (
     "bmc",
diff --git a/src/maasserver/api/results.py b/src/maasserver/api/results.py
index 4b16445..424d7a9 100644
--- a/src/maasserver/api/results.py
+++ b/src/maasserver/api/results.py
@@ -11,10 +11,9 @@ from formencode.validators import Int
 
 from maasserver.api.support import OperationsHandler
 from maasserver.api.utils import get_optional_list, get_optional_param
-from maasserver.models import Node
+from maasserver.models import Node, ScriptResult
 from maasserver.permissions import NodePermission
 from metadataserver.enum import SCRIPT_STATUS
-from metadataserver.models import ScriptResult
 
 
 class NodeResultsHandler(OperationsHandler):
diff --git a/src/maasserver/api/scriptresults.py b/src/maasserver/api/scriptresults.py
index 8ca1855..6051a56 100644
--- a/src/maasserver/api/scriptresults.py
+++ b/src/maasserver/api/scriptresults.py
@@ -22,11 +22,10 @@ from piston3.utils import rc
 from maasserver.api.support import admin_method, operation, OperationsHandler
 from maasserver.api.utils import get_optional_param
 from maasserver.exceptions import MAASAPIValidationError
-from maasserver.models import Node
+from maasserver.models import Node, ScriptSet
+from maasserver.models.script import translate_hardware_type
+from maasserver.models.scriptset import translate_result_type
 from maasserver.permissions import NodePermission
-from metadataserver.models import ScriptSet
-from metadataserver.models.script import translate_hardware_type
-from metadataserver.models.scriptset import translate_result_type
 
 
 def fmt_time(dt):
diff --git a/src/maasserver/api/scripts.py b/src/maasserver/api/scripts.py
index 40b2221..6f3f2ea 100644
--- a/src/maasserver/api/scripts.py
+++ b/src/maasserver/api/scripts.py
@@ -19,8 +19,8 @@ from maasserver.audit import create_audit_event
 from maasserver.enum import ENDPOINT
 from maasserver.exceptions import MAASAPIValidationError
 from maasserver.forms.script import ScriptForm
-from metadataserver.models import Script
-from metadataserver.models.script import (
+from maasserver.models import Script
+from maasserver.models.script import (
     translate_hardware_type,
     translate_script_type,
 )
diff --git a/src/maasserver/api/tests/test_commissioning.py b/src/maasserver/api/tests/test_commissioning.py
index d413ddc..6b4903c 100644
--- a/src/maasserver/api/tests/test_commissioning.py
+++ b/src/maasserver/api/tests/test_commissioning.py
@@ -12,7 +12,7 @@ import random
 from django.urls import reverse
 from piston3.utils import rc
 
-from maasserver.models import Event
+from maasserver.models import Event, Script
 from maasserver.testing.api import APITestCase
 from maasserver.testing.factory import factory
 from maasserver.testing.matchers import HasStatusCode
@@ -24,7 +24,6 @@ from metadataserver.enum import (
     SCRIPT_TYPE,
 )
 from metadataserver.fields import Bin
-from metadataserver.models import Script
 from provisioningserver.events import AUDIT
 
 
diff --git a/src/maasserver/api/tests/test_machines.py b/src/maasserver/api/tests/test_machines.py
index 821a2ce..0104f68 100644
--- a/src/maasserver/api/tests/test_machines.py
+++ b/src/maasserver/api/tests/test_machines.py
@@ -26,6 +26,7 @@ import maasserver.forms as forms_module
 from maasserver.forms.pods import ComposeMachineForm, ComposeMachineForPodsForm
 from maasserver.models import Config, Domain, Machine, Node
 from maasserver.models import node as node_module
+from maasserver.models import ScriptSet
 from maasserver.models.node import RELEASABLE_STATUSES
 from maasserver.node_constraint_filter_forms import AcquireNodeForm
 from maasserver.rpc.testing.fixtures import MockLiveRegionToClusterRPCFixture
@@ -50,7 +51,6 @@ from maastesting.matchers import (
 from maastesting.testcase import MAASTestCase
 from maastesting.twisted import always_succeed_with
 from metadataserver.enum import SCRIPT_TYPE
-from metadataserver.models import ScriptSet
 from provisioningserver.rpc import cluster as cluster_module
 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 519a583..652eeec 100644
--- a/src/maasserver/api/tests/test_node.py
+++ b/src/maasserver/api/tests/test_node.py
@@ -16,6 +16,7 @@ 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.models.scriptset import get_status_from_qs
 from maasserver.testing.api import APITestCase
 from maasserver.testing.architecture import make_usable_architecture
 from maasserver.testing.factory import factory
@@ -35,7 +36,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_CHOICES,
     SCRIPT_TYPE,
 )
-from metadataserver.models.scriptset import get_status_from_qs
 from metadataserver.nodeinituser import get_node_init_user
 from provisioningserver.refresh.node_info_scripts import (
     LLDP_OUTPUT_NAME,
diff --git a/src/maasserver/api/tests/test_scripts.py b/src/maasserver/api/tests/test_scripts.py
index 5b39fe3..f381e3c 100644
--- a/src/maasserver/api/tests/test_scripts.py
+++ b/src/maasserver/api/tests/test_scripts.py
@@ -13,7 +13,7 @@ import random
 from django.urls import reverse
 from testtools.matchers import ContainsAll
 
-from maasserver.models import Event, VersionedTextFile
+from maasserver.models import Event, Script, VersionedTextFile
 from maasserver.testing.api import APITestCase
 from maasserver.testing.factory import factory
 from maasserver.testing.matchers import HasStatusCode
@@ -24,7 +24,6 @@ from metadataserver.enum import (
     SCRIPT_PARALLEL_CHOICES,
     SCRIPT_TYPE_CHOICES,
 )
-from metadataserver.models import Script
 from provisioningserver.events import AUDIT
 
 
diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
index e87279e..040ad5b 100644
--- a/src/maasserver/forms/__init__.py
+++ b/src/maasserver/forms/__init__.py
@@ -959,8 +959,7 @@ class MachineForm(NodeForm):
         self.data["enable_hw_sync"] = enable_hw_sync
 
     def save(self, *args, **kwargs):
-        # Prevent circular imports
-        from metadataserver.models import ScriptSet
+        from maasserver.models import ScriptSet
 
         # LP:1807991 - If requested when creating a new Machine, set the status
         # to COMMISSIONING when the object is created.
@@ -1207,8 +1206,7 @@ class AdminMachineForm(MachineForm, AdminNodeForm, WithPowerTypeMixin):
 
     def _setup_deployed_machine(self, machine):
         """Configure the Machine before it has been saved."""
-        from maasserver.models import NodeKey
-        from metadataserver.models.scriptset import ScriptSet
+        from maasserver.models import NodeKey, ScriptSet
 
         machine.update_status(NODE_STATUS.DEPLOYED, validate_transition=False)
         machine.owner = self.request.user
diff --git a/src/maasserver/forms/ephemeral.py b/src/maasserver/forms/ephemeral.py
index 893ef37..16c165a 100644
--- a/src/maasserver/forms/ephemeral.py
+++ b/src/maasserver/forms/ephemeral.py
@@ -19,10 +19,10 @@ from django.forms import (
 from django.http import QueryDict
 
 from maasserver.enum import NODE_STATUS
+from maasserver.models import Script
 from maasserver.node_action import get_node_action
 from maasserver.utils.forms import set_form_error
 from metadataserver.enum import SCRIPT_TYPE
-from metadataserver.models import Script
 
 
 class TestForm(Form):
diff --git a/src/maasserver/forms/script.py b/src/maasserver/forms/script.py
index e23b6ed..4e5d689 100644
--- a/src/maasserver/forms/script.py
+++ b/src/maasserver/forms/script.py
@@ -25,14 +25,14 @@ from maasserver.audit import create_audit_event
 from maasserver.enum import ENDPOINT
 from maasserver.fields import VersionedTextFileField
 from maasserver.forms.parameters import ParametersForm
-from maasserver.utils.forms import set_form_error
-from metadataserver.enum import HARDWARE_TYPE, SCRIPT_PARALLEL, SCRIPT_TYPE
-from metadataserver.models import Script
-from metadataserver.models.script import (
+from maasserver.models import Script
+from maasserver.models.script import (
     translate_hardware_type,
     translate_script_parallel,
     translate_script_type,
 )
+from maasserver.utils.forms import set_form_error
+from metadataserver.enum import HARDWARE_TYPE, SCRIPT_PARALLEL, SCRIPT_TYPE
 from provisioningserver.events import EVENT_TYPES
 
 
diff --git a/src/maasserver/forms/tests/test_script.py b/src/maasserver/forms/tests/test_script.py
index 852a5e8..67cf1e0 100644
--- a/src/maasserver/forms/tests/test_script.py
+++ b/src/maasserver/forms/tests/test_script.py
@@ -17,7 +17,7 @@ from maasserver.forms.script import (
     ScriptForm,
     TestingScriptForm,
 )
-from maasserver.models import Event, VersionedTextFile
+from maasserver.models import Event, Script, VersionedTextFile
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
 from metadataserver.enum import (
@@ -28,7 +28,6 @@ from metadataserver.enum import (
     SCRIPT_TYPE,
     SCRIPT_TYPE_CHOICES,
 )
-from metadataserver.models import Script
 from provisioningserver.events import AUDIT
 
 
diff --git a/src/maasserver/migrations/maasserver/0297_move_metadata_script_models.py b/src/maasserver/migrations/maasserver/0297_move_metadata_script_models.py
new file mode 100644
index 0000000..41a312d
--- /dev/null
+++ b/src/maasserver/migrations/maasserver/0297_move_metadata_script_models.py
@@ -0,0 +1,394 @@
+# Generated by Django 3.2.12 on 2022-11-18 13:05
+
+import datetime
+
+import django.contrib.postgres.fields
+from django.db import migrations, models
+import django.db.models.deletion
+
+import maasserver.fields
+import maasserver.models.cleansave
+import metadataserver.fields
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("maasserver", "0296_move_metadata_node_models"),
+        ("metadataserver", "0036_move_metadata_script_models"),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            state_operations=[
+                migrations.CreateModel(
+                    name="Script",
+                    fields=[
+                        (
+                            "id",
+                            models.AutoField(
+                                auto_created=True,
+                                primary_key=True,
+                                serialize=False,
+                                verbose_name="ID",
+                            ),
+                        ),
+                        ("created", models.DateTimeField(editable=False)),
+                        ("updated", models.DateTimeField(editable=False)),
+                        (
+                            "name",
+                            models.CharField(max_length=255, unique=True),
+                        ),
+                        (
+                            "title",
+                            models.CharField(blank=True, max_length=255),
+                        ),
+                        ("description", models.TextField(blank=True)),
+                        (
+                            "tags",
+                            django.contrib.postgres.fields.ArrayField(
+                                base_field=models.TextField(),
+                                blank=True,
+                                default=list,
+                                null=True,
+                                size=None,
+                            ),
+                        ),
+                        (
+                            "script_type",
+                            models.IntegerField(
+                                choices=[
+                                    (0, "Commissioning script"),
+                                    (2, "Testing script"),
+                                ],
+                                default=2,
+                            ),
+                        ),
+                        (
+                            "hardware_type",
+                            models.IntegerField(
+                                choices=[
+                                    (0, "Node"),
+                                    (1, "CPU"),
+                                    (2, "Memory"),
+                                    (3, "Storage"),
+                                    (4, "Network"),
+                                    (5, "GPU"),
+                                ],
+                                default=0,
+                            ),
+                        ),
+                        (
+                            "parallel",
+                            models.IntegerField(
+                                choices=[
+                                    (0, "Disabled"),
+                                    (
+                                        1,
+                                        "Run along other instances of this script",
+                                    ),
+                                    (2, "Run along any other script."),
+                                ],
+                                default=0,
+                            ),
+                        ),
+                        (
+                            "results",
+                            models.JSONField(blank=True, default=dict),
+                        ),
+                        (
+                            "parameters",
+                            models.JSONField(blank=True, default=dict),
+                        ),
+                        (
+                            "packages",
+                            models.JSONField(blank=True, default=dict),
+                        ),
+                        (
+                            "timeout",
+                            models.DurationField(
+                                default=datetime.timedelta(0)
+                            ),
+                        ),
+                        ("destructive", models.BooleanField(default=False)),
+                        ("default", models.BooleanField(default=False)),
+                        (
+                            "for_hardware",
+                            django.contrib.postgres.fields.ArrayField(
+                                base_field=models.CharField(max_length=255),
+                                blank=True,
+                                default=list,
+                                size=None,
+                            ),
+                        ),
+                        ("may_reboot", models.BooleanField(default=False)),
+                        ("recommission", models.BooleanField(default=False)),
+                        (
+                            "apply_configured_networking",
+                            models.BooleanField(default=False),
+                        ),
+                        (
+                            "script",
+                            models.OneToOneField(
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.versionedtextfile",
+                            ),
+                        ),
+                    ],
+                    options={
+                        "abstract": False,
+                    },
+                    bases=(
+                        maasserver.models.cleansave.CleanSave,
+                        models.Model,
+                    ),
+                ),
+                migrations.CreateModel(
+                    name="ScriptSet",
+                    fields=[
+                        (
+                            "id",
+                            models.AutoField(
+                                auto_created=True,
+                                primary_key=True,
+                                serialize=False,
+                                verbose_name="ID",
+                            ),
+                        ),
+                        (
+                            "last_ping",
+                            models.DateTimeField(blank=True, null=True),
+                        ),
+                        (
+                            "result_type",
+                            models.IntegerField(
+                                choices=[
+                                    (0, "Commissioning"),
+                                    (1, "Installation"),
+                                    (2, "Testing"),
+                                ],
+                                default=0,
+                                editable=False,
+                            ),
+                        ),
+                        (
+                            "power_state_before_transition",
+                            models.CharField(
+                                choices=[
+                                    ("on", "On"),
+                                    ("off", "Off"),
+                                    ("unknown", "Unknown"),
+                                    ("error", "Error"),
+                                ],
+                                default="unknown",
+                                editable=False,
+                                max_length=10,
+                            ),
+                        ),
+                        (
+                            "tags",
+                            django.contrib.postgres.fields.ArrayField(
+                                base_field=models.TextField(),
+                                blank=True,
+                                default=list,
+                                null=True,
+                                size=None,
+                            ),
+                        ),
+                        (
+                            "node",
+                            models.ForeignKey(
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.node",
+                            ),
+                        ),
+                    ],
+                    bases=(
+                        maasserver.models.cleansave.CleanSave,
+                        models.Model,
+                    ),
+                ),
+                migrations.CreateModel(
+                    name="ScriptResult",
+                    fields=[
+                        (
+                            "id",
+                            models.AutoField(
+                                auto_created=True,
+                                primary_key=True,
+                                serialize=False,
+                                verbose_name="ID",
+                            ),
+                        ),
+                        ("created", models.DateTimeField(editable=False)),
+                        ("updated", models.DateTimeField(editable=False)),
+                        (
+                            "parameters",
+                            models.JSONField(blank=True, default=dict),
+                        ),
+                        (
+                            "status",
+                            models.IntegerField(
+                                choices=[
+                                    (0, "Pending"),
+                                    (1, "Running"),
+                                    (2, "Passed"),
+                                    (3, "Failed"),
+                                    (4, "Timed out"),
+                                    (5, "Aborted"),
+                                    (6, "Degraded"),
+                                    (7, "Installing dependencies"),
+                                    (8, "Failed installing dependencies"),
+                                    (9, "Skipped"),
+                                    (
+                                        10,
+                                        "Applying custom network configuration",
+                                    ),
+                                    (
+                                        11,
+                                        "Failed to apply custom network configuration",
+                                    ),
+                                ],
+                                default=0,
+                            ),
+                        ),
+                        (
+                            "exit_status",
+                            models.IntegerField(blank=True, null=True),
+                        ),
+                        (
+                            "script_name",
+                            models.CharField(
+                                editable=False, max_length=255, null=True
+                            ),
+                        ),
+                        (
+                            "output",
+                            metadataserver.fields.BinaryField(
+                                blank=True, default=b"", max_length=1048576
+                            ),
+                        ),
+                        (
+                            "stdout",
+                            metadataserver.fields.BinaryField(
+                                blank=True, default=b"", max_length=1048576
+                            ),
+                        ),
+                        (
+                            "stderr",
+                            metadataserver.fields.BinaryField(
+                                blank=True, default=b"", max_length=1048576
+                            ),
+                        ),
+                        (
+                            "result",
+                            metadataserver.fields.BinaryField(
+                                blank=True, default=b"", max_length=1048576
+                            ),
+                        ),
+                        (
+                            "started",
+                            models.DateTimeField(
+                                blank=True, editable=False, null=True
+                            ),
+                        ),
+                        (
+                            "ended",
+                            models.DateTimeField(
+                                blank=True, editable=False, null=True
+                            ),
+                        ),
+                        ("suppressed", models.BooleanField(default=False)),
+                        (
+                            "interface",
+                            models.ForeignKey(
+                                blank=True,
+                                editable=False,
+                                null=True,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.interface",
+                            ),
+                        ),
+                        (
+                            "physical_blockdevice",
+                            models.ForeignKey(
+                                blank=True,
+                                editable=False,
+                                null=True,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.physicalblockdevice",
+                            ),
+                        ),
+                        (
+                            "script",
+                            models.ForeignKey(
+                                blank=True,
+                                editable=False,
+                                null=True,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.script",
+                            ),
+                        ),
+                        (
+                            "script_set",
+                            models.ForeignKey(
+                                editable=False,
+                                on_delete=django.db.models.deletion.CASCADE,
+                                to="maasserver.scriptset",
+                            ),
+                        ),
+                        (
+                            "script_version",
+                            models.ForeignKey(
+                                blank=True,
+                                editable=False,
+                                null=True,
+                                on_delete=django.db.models.deletion.SET_NULL,
+                                to="maasserver.versionedtextfile",
+                            ),
+                        ),
+                    ],
+                    options={
+                        "abstract": False,
+                    },
+                    bases=(
+                        maasserver.models.cleansave.CleanSave,
+                        models.Model,
+                    ),
+                ),
+                migrations.AlterField(
+                    model_name="node",
+                    name="current_commissioning_script_set",
+                    field=models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="maasserver.scriptset",
+                    ),
+                ),
+                migrations.AlterField(
+                    model_name="node",
+                    name="current_installation_script_set",
+                    field=models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="maasserver.scriptset",
+                    ),
+                ),
+                migrations.AlterField(
+                    model_name="node",
+                    name="current_testing_script_set",
+                    field=models.ForeignKey(
+                        blank=True,
+                        null=True,
+                        on_delete=django.db.models.deletion.SET_NULL,
+                        related_name="+",
+                        to="maasserver.scriptset",
+                    ),
+                ),
+            ],
+            database_operations=[],
+        ),
+    ]
diff --git a/src/maasserver/models/__init__.py b/src/maasserver/models/__init__.py
index 1327639..786d4c7 100644
--- a/src/maasserver/models/__init__.py
+++ b/src/maasserver/models/__init__.py
@@ -76,6 +76,9 @@ __all__ = [
     "RegionRackRPCConnection",
     "ResourcePool",
     "RootKey",
+    "Script",
+    "ScriptResult",
+    "ScriptSet",
     "Service",
     "signals",
     "Space",
@@ -189,6 +192,9 @@ from maasserver.models.regioncontrollerprocessendpoint import (
 from maasserver.models.regionrackrpcconnection import RegionRackRPCConnection
 from maasserver.models.resourcepool import ResourcePool
 from maasserver.models.rootkey import RootKey
+from maasserver.models.script import Script
+from maasserver.models.scriptresult import ScriptResult
+from maasserver.models.scriptset import ScriptSet
 from maasserver.models.secret import Secret, VaultSecret
 from maasserver.models.service import Service
 from maasserver.models.space import Space
diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
index f1c8356..b317f34 100644
--- a/src/maasserver/models/bmc.py
+++ b/src/maasserver/models/bmc.py
@@ -1691,7 +1691,7 @@ class Pod(BMC):
             if node.is_device:
                 update["node_type"] = NODE_TYPE.MACHINE
             if not node.current_commissioning_script_set:
-                from metadataserver.models import ScriptSet
+                from maasserver.models import ScriptSet
 
                 # ScriptResults will be created on upload.
                 update[
diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
index ea6b233..2e5c84a 100644
--- a/src/maasserver/models/node.py
+++ b/src/maasserver/models/node.py
@@ -764,8 +764,7 @@ class RegionControllerManager(ControllerManager):
         # A region needs to have a commissioning_script_set available to
         # allow commissioning data to be sent on start.
         if node.current_commissioning_script_set is None:
-            # Avoid circular dependencies
-            from metadataserver.models import ScriptSet
+            from maasserver.models import ScriptSet
 
             script_set = ScriptSet.objects.create_commissioning_script_set(
                 node
@@ -1221,7 +1220,7 @@ class Node(CleanSave, TimestampedModel):
     # The ScriptSet for the currently running, or last run, commissioning
     # ScriptSet.
     current_commissioning_script_set = ForeignKey(
-        "metadataserver.ScriptSet",
+        "maasserver.ScriptSet",
         blank=True,
         null=True,
         on_delete=SET_NULL,
@@ -1230,7 +1229,7 @@ class Node(CleanSave, TimestampedModel):
 
     # The ScriptSet for the currently running, or last run, installation.
     current_installation_script_set = ForeignKey(
-        "metadataserver.ScriptSet",
+        "maasserver.ScriptSet",
         blank=True,
         null=True,
         on_delete=SET_NULL,
@@ -1239,7 +1238,7 @@ class Node(CleanSave, TimestampedModel):
 
     # The ScriptSet for the currently running, or last run, test ScriptSet.
     current_testing_script_set = ForeignKey(
-        "metadataserver.ScriptSet",
+        "maasserver.ScriptSet",
         blank=True,
         null=True,
         on_delete=SET_NULL,
@@ -1758,9 +1757,8 @@ class Node(CleanSave, TimestampedModel):
 
     def _start_deployment(self):
         """Mark a node as being deployed."""
-        # Avoid circular dependencies
         from maasserver.models.event import Event
-        from metadataserver.models import ScriptSet
+        from maasserver.models.scriptset import ScriptSet
 
         if not self.on_network():
             raise ValidationError(
@@ -2227,8 +2225,7 @@ class Node(CleanSave, TimestampedModel):
     @classmethod
     @transactional
     def _abort_all_tests(self, script_set_id):
-        # Avoid circular imports.
-        from metadataserver.models import ScriptSet
+        from maasserver.models import ScriptSet
 
         try:
             script_set = ScriptSet.objects.get(id=script_set_id)
@@ -2259,9 +2256,8 @@ class Node(CleanSave, TimestampedModel):
             registered as a post-commit hook; it should not be added a second
             time.
         """
-        # Avoid circular imports.
         from maasserver.models.event import Event
-        from metadataserver.models import ScriptSet
+        from maasserver.models.scriptset import ScriptSet
 
         # Only commission if power type is configured.
         if self.power_type == "":
@@ -2468,9 +2464,8 @@ class Node(CleanSave, TimestampedModel):
         self, user, enable_ssh=False, testing_scripts=None, script_input=None
     ):
         """Run tests on a node."""
-        # Avoid circular imports.
         from maasserver.models.event import Event
-        from metadataserver.models import ScriptSet
+        from maasserver.models.scriptset import ScriptSet
 
         if not user.has_perm(NodePermission.edit, self):
             # You can't enter test mode on a node you don't own,
@@ -3884,8 +3879,7 @@ class Node(CleanSave, TimestampedModel):
             user, event_type, action="mark_failed", comment=comment
         )
 
-        # Avoid circular dependencies
-        from metadataserver.models import ScriptResult
+        from maasserver.models import ScriptResult
 
         qs = ScriptResult.objects.filter(
             script_set__in=[
@@ -3974,7 +3968,7 @@ class Node(CleanSave, TimestampedModel):
         self.save()
 
     def get_latest_failed_testing_script_results(self) -> List[int]:
-        from metadataserver.models import ScriptResult
+        from maasserver.models import ScriptResult
 
         script_results = (
             ScriptResult.objects.filter(
@@ -5792,8 +5786,7 @@ class Node(CleanSave, TimestampedModel):
         elif self.status in COMMISSIONING_LIKE_STATUSES:
             if old_status is None:
                 old_status = self.status
-            # Avoid circular dependencies
-            from metadataserver.models import ScriptResult
+            from maasserver.models import ScriptResult
 
             # Claim AUTO IP addresses if a script will be running in the
             # ephemeral environment which needs network configuration applied.
@@ -6311,8 +6304,7 @@ class Node(CleanSave, TimestampedModel):
     @property
     def get_latest_script_results(self):
         """Returns a QuerySet of the latest results from all runs."""
-        # Avoid circular dependencies
-        from metadataserver.models import ScriptResult
+        from maasserver.models import ScriptResult
 
         qs = ScriptResult.objects.filter(script_set__node_id=self.id)
         qs = qs.select_related("script_set", "script")
diff --git a/src/maasserver/models/nodeprobeddetails.py b/src/maasserver/models/nodeprobeddetails.py
index 461faf3..0495d74 100644
--- a/src/maasserver/models/nodeprobeddetails.py
+++ b/src/maasserver/models/nodeprobeddetails.py
@@ -74,8 +74,8 @@ def get_probed_details(nodes):
               script_set.node_id, script_result.script_name,
               script_result.stdout
             FROM
-              metadataserver_scriptresult AS script_result,
-              metadataserver_scriptset AS script_set,
+              maasserver_scriptresult AS script_result,
+              maasserver_scriptset AS script_set,
               maasserver_node AS node
             WHERE
               script_set.node_id IN %s AND
diff --git a/src/metadataserver/models/script.py b/src/maasserver/models/script.py
similarity index 100%
rename from src/metadataserver/models/script.py
rename to src/maasserver/models/script.py
diff --git a/src/metadataserver/models/scriptresult.py b/src/maasserver/models/scriptresult.py
similarity index 99%
rename from src/metadataserver/models/scriptresult.py
rename to src/maasserver/models/scriptresult.py
index 5b1ffa3..cdd89f3 100644
--- a/src/metadataserver/models/scriptresult.py
+++ b/src/maasserver/models/scriptresult.py
@@ -22,6 +22,8 @@ from maasserver.models.cleansave import CleanSave
 from maasserver.models.event import Event
 from maasserver.models.interface import Interface
 from maasserver.models.physicalblockdevice import PhysicalBlockDevice
+from maasserver.models.script import Script
+from maasserver.models.scriptset import ScriptSet
 from maasserver.models.timestampedmodel import now, TimestampedModel
 from maasserver.models.versionedtextfile import VersionedTextFile
 from metadataserver import logger
@@ -34,8 +36,6 @@ from metadataserver.enum import (
     SCRIPT_TYPE,
 )
 from metadataserver.fields import Bin, BinaryField
-from metadataserver.models.script import Script
-from metadataserver.models.scriptset import ScriptSet
 from provisioningserver.events import EVENT_TYPES
 
 
diff --git a/src/metadataserver/models/scriptset.py b/src/maasserver/models/scriptset.py
similarity index 90%
rename from src/metadataserver/models/scriptset.py
rename to src/maasserver/models/scriptset.py
index 590f1f8..3ac3940 100644
--- a/src/metadataserver/models/scriptset.py
+++ b/src/maasserver/models/scriptset.py
@@ -27,7 +27,7 @@ from django.db.models.query import QuerySet
 from maasserver.enum import POWER_STATE, POWER_STATE_CHOICES
 from maasserver.exceptions import NoScriptsFound
 from maasserver.forms.parameters import ParametersForm
-from maasserver.models import Config, Event
+from maasserver.models import Config, Event, Script
 from maasserver.models.cleansave import CleanSave
 from maasserver.preseed import CURTIN_INSTALL_LOG
 from metadataserver import logger
@@ -42,7 +42,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_RUNNING_OR_PENDING,
     SCRIPT_TYPE,
 )
-from metadataserver.models.script import Script
 from provisioningserver.events import EVENT_TYPES
 
 
@@ -210,7 +209,7 @@ class ScriptSetManager(Manager):
     def create_installation_script_set(self, node):
         """Create a new installation ScriptSet with a ScriptResult."""
         # Avoid circular dependencies.
-        from metadataserver.models import ScriptResult
+        from maasserver.models import ScriptResult
 
         script_set = self.create(
             node=node,
@@ -302,8 +301,7 @@ class ScriptSetManager(Manager):
                 raise
 
     def _clean_old(self, node, result_type, new_script_set):
-        # Avoid circular dependencies.
-        from metadataserver.models import ScriptResult
+        from maasserver.models import ScriptResult
 
         config_var = {
             RESULT_TYPE.COMMISSIONING: "max_node_commissioning_results",
@@ -572,8 +570,7 @@ class ScriptSet(CleanSave, Model):
         storage parameter. Used after commissioning has completed when there
         are tests to be run.
         """
-        # Avoid circular dependencies.
-        from metadataserver.models import ScriptResult
+        from maasserver.models import ScriptResult
 
         regenerate_scripts = {}
         for script_result in (
diff --git a/src/maasserver/models/signals/scriptresult.py b/src/maasserver/models/signals/scriptresult.py
index 1e29d7e..24bee48 100644
--- a/src/maasserver/models/signals/scriptresult.py
+++ b/src/maasserver/models/signals/scriptresult.py
@@ -4,7 +4,7 @@
 """Emit ScriptResult status transition event."""
 
 
-from maasserver.models import Event
+from maasserver.models import Event, ScriptResult
 from maasserver.preseed import CURTIN_INSTALL_LOG
 from maasserver.utils.signals import SignalsManager
 from metadataserver.enum import (
@@ -14,7 +14,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_FAILED,
     SCRIPT_STATUS_RUNNING,
 )
-from metadataserver.models.scriptresult import ScriptResult
 from provisioningserver.events import EVENT_TYPES
 
 signals = SignalsManager()
diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
index 04890bf..4eb10d4 100644
--- a/src/maasserver/models/tests/test_node.py
+++ b/src/maasserver/models/tests/test_node.py
@@ -101,6 +101,8 @@ from maasserver.models import (
     RegionController,
     RegionRackRPCConnection,
     ResourcePool,
+    ScriptResult,
+    ScriptSet,
     Service,
     StaticIPAddress,
     Subnet,
@@ -183,7 +185,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_RUNNING_OR_PENDING,
     SCRIPT_TYPE,
 )
-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_script.py b/src/maasserver/models/tests/test_script.py
similarity index 94%
rename from src/metadataserver/models/tests/test_script.py
rename to src/maasserver/models/tests/test_script.py
index a4fa24b..93c5218 100644
--- a/src/metadataserver/models/tests/test_script.py
+++ b/src/maasserver/models/tests/test_script.py
@@ -7,7 +7,12 @@ import random
 
 from django.core.exceptions import ValidationError
 
-from maasserver.models import VersionedTextFile
+from maasserver.models import Script, VersionedTextFile
+from maasserver.models.script import (
+    translate_hardware_type,
+    translate_script_parallel,
+    translate_script_type,
+)
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
 from maasserver.utils.orm import reload_object
@@ -17,12 +22,6 @@ from metadataserver.enum import (
     SCRIPT_PARALLEL,
     SCRIPT_TYPE,
 )
-from metadataserver.models import Script
-from metadataserver.models.script import (
-    translate_hardware_type,
-    translate_script_parallel,
-    translate_script_type,
-)
 
 
 class TestTranslateScriptType(MAASServerTestCase):
diff --git a/src/metadataserver/models/tests/test_scriptresult.py b/src/maasserver/models/tests/test_scriptresult.py
similarity index 95%
rename from src/metadataserver/models/tests/test_scriptresult.py
rename to src/maasserver/models/tests/test_scriptresult.py
index 7675ace..d4d9ef1 100644
--- a/src/metadataserver/models/tests/test_scriptresult.py
+++ b/src/maasserver/models/tests/test_scriptresult.py
@@ -10,7 +10,8 @@ from django.core.exceptions import ValidationError
 import yaml
 
 from maasserver.enum import NODE_STATUS
-from maasserver.models import Event, EventType
+from maasserver.models import Event, EventType, ScriptResult
+from maasserver.models import scriptresult as scriptresult_module
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
 from maasserver.utils.orm import reload_object
@@ -24,8 +25,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_RUNNING_OR_PENDING,
     SCRIPT_TYPE,
 )
-from metadataserver.models import ScriptResult
-from metadataserver.models import scriptresult as scriptresult_module
 from provisioningserver.events import EVENT_TYPES
 
 
diff --git a/src/metadataserver/models/tests/test_scriptset.py b/src/maasserver/models/tests/test_scriptset.py
similarity index 96%
rename from src/metadataserver/models/tests/test_scriptset.py
rename to src/maasserver/models/tests/test_scriptset.py
index 9ca7554..08017d2 100644
--- a/src/metadataserver/models/tests/test_scriptset.py
+++ b/src/maasserver/models/tests/test_scriptset.py
@@ -12,7 +12,17 @@ from django.db.models import Q
 
 from maasserver.enum import NODE_STATUS, NODE_TYPE
 from maasserver.exceptions import NoScriptsFound
-from maasserver.models import Config, Event, EventType, Node
+from maasserver.models import (
+    Config,
+    Event,
+    EventType,
+    Node,
+    Script,
+    ScriptResult,
+    ScriptSet,
+)
+from maasserver.models import scriptset as scriptset_module
+from maasserver.models.scriptset import translate_result_type
 from maasserver.preseed import CURTIN_INSTALL_LOG
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
@@ -25,9 +35,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_RUNNING_OR_PENDING,
     SCRIPT_TYPE,
 )
-from metadataserver.models import Script, ScriptResult, ScriptSet
-from metadataserver.models import scriptset as scriptset_module
-from metadataserver.models.scriptset import translate_result_type
 from provisioningserver.events import EVENT_TYPES
 from provisioningserver.refresh.node_info_scripts import NODE_INFO_SCRIPTS
 
diff --git a/src/maasserver/node_action.py b/src/maasserver/node_action.py
index e35a09b..e9f836d 100644
--- a/src/maasserver/node_action.py
+++ b/src/maasserver/node_action.py
@@ -41,6 +41,7 @@ from maasserver.exceptions import (
 from maasserver.forms.clone import CloneForm
 from maasserver.models import Config, ResourcePool, Zone
 from maasserver.models.bootresource import LINUX_OSYSTEMS
+from maasserver.models.scriptresult import ScriptResult
 from maasserver.node_status import is_failed_status, NON_MONITORED_STATUSES
 from maasserver.permissions import NodePermission
 from maasserver.preseed import get_base_osystem_series, get_curtin_config
@@ -50,7 +51,6 @@ from maasserver.utils.osystems import (
     validate_osystem_and_distro_series,
 )
 from metadataserver.enum import SCRIPT_STATUS
-from metadataserver.models.scriptresult import ScriptResult
 from provisioningserver.events import EVENT_TYPES
 from provisioningserver.rpc.exceptions import (
     NoConnectionsAvailable,
diff --git a/src/maasserver/rpc/rackcontrollers.py b/src/maasserver/rpc/rackcontrollers.py
index 24e4153..bfd12b0 100644
--- a/src/maasserver/rpc/rackcontrollers.py
+++ b/src/maasserver/rpc/rackcontrollers.py
@@ -23,12 +23,12 @@ from maasserver.models import (
     NodeGroupToRackController,
     RackController,
     RegionController,
+    ScriptSet,
     StaticIPAddress,
 )
 from maasserver.models.timestampedmodel import now
 from maasserver.utils import synchronised
 from maasserver.utils.orm import transactional, with_connection
-from metadataserver.models import ScriptSet
 from provisioningserver.logger import get_maas_logger
 from provisioningserver.rpc.exceptions import NoSuchNode, NoSuchScope
 from provisioningserver.utils.deb import DebVersionsInfo
diff --git a/src/maasserver/status_monitor.py b/src/maasserver/status_monitor.py
index 5211991..9a3147d 100644
--- a/src/maasserver/status_monitor.py
+++ b/src/maasserver/status_monitor.py
@@ -10,6 +10,7 @@ from django.db.models import Prefetch
 from twisted.application.internet import TimerService
 
 from maasserver.enum import NODE_STATUS, NODE_STATUS_CHOICES_DICT
+from maasserver.models import Script, ScriptResult, ScriptSet
 from maasserver.models.config import Config
 from maasserver.models.node import Node
 from maasserver.models.timestampedmodel import now
@@ -17,7 +18,6 @@ from maasserver.node_status import get_node_timeout, MONITORED_STATUSES
 from maasserver.utils.orm import transactional
 from maasserver.utils.threads import deferToDatabase
 from metadataserver.enum import SCRIPT_STATUS
-from metadataserver.models import Script, ScriptResult, ScriptSet
 from provisioningserver.logger import get_maas_logger
 from provisioningserver.refresh.node_info_scripts import NODE_INFO_SCRIPTS
 from provisioningserver.utils.twisted import synchronous
diff --git a/src/maasserver/testing/factory.py b/src/maasserver/testing/factory.py
index e78b84b..8446d70 100644
--- a/src/maasserver/testing/factory.py
+++ b/src/maasserver/testing/factory.py
@@ -90,6 +90,9 @@ from maasserver.models import (
     RegionRackRPCConnection,
     ResourcePool,
     RootKey,
+    Script,
+    ScriptResult,
+    ScriptSet,
     Service,
     Space,
     SSHKey,
@@ -139,7 +142,6 @@ from metadataserver.enum import (
     SCRIPT_TYPE_CHOICES,
 )
 from metadataserver.fields import Bin
-from metadataserver.models import Script, ScriptResult, ScriptSet
 from provisioningserver.boot import BootMethodRegistry
 from provisioningserver.drivers.osystem import OperatingSystemRegistry
 from provisioningserver.security import to_hex
diff --git a/src/maasserver/testing/sampledata/script.py b/src/maasserver/testing/sampledata/script.py
index 5b0908f..aa677f6 100644
--- a/src/maasserver/testing/sampledata/script.py
+++ b/src/maasserver/testing/sampledata/script.py
@@ -1,5 +1,5 @@
 from maasserver.enum import NODE_STATUS
-from metadataserver.models import ScriptSet
+from maasserver.models import ScriptSet
 from provisioningserver.refresh.node_info_scripts import (
     COMMISSIONING_OUTPUT_NAME,
 )
diff --git a/src/maasserver/tests/test_node_action.py b/src/maasserver/tests/test_node_action.py
index f0d7a1a..4593e3b 100644
--- a/src/maasserver/tests/test_node_action.py
+++ b/src/maasserver/tests/test_node_action.py
@@ -25,7 +25,13 @@ from maasserver.enum import (
     POWER_STATE,
 )
 from maasserver.exceptions import NodeActionError
-from maasserver.models import Config, Event, signals, StaticIPAddress
+from maasserver.models import (
+    Config,
+    Event,
+    ScriptSet,
+    signals,
+    StaticIPAddress,
+)
 from maasserver.models.signals.testing import SignalsDisabled
 import maasserver.node_action as node_action_module
 from maasserver.node_action import (
@@ -77,7 +83,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_FAILED,
     SCRIPT_TYPE,
 )
-from metadataserver.models import ScriptSet
 from provisioningserver.events import AUDIT
 from provisioningserver.utils.shell import ExternalProcessError
 
diff --git a/src/maasserver/tests/test_stats.py b/src/maasserver/tests/test_stats.py
index 7a33d87..204938f 100644
--- a/src/maasserver/tests/test_stats.py
+++ b/src/maasserver/tests/test_stats.py
@@ -27,6 +27,8 @@ from maasserver.models import (
     Fabric,
     Machine,
     OwnerData,
+    ScriptResult,
+    ScriptSet,
     Space,
     Subnet,
     VLAN,
@@ -61,8 +63,6 @@ from maastesting.testcase import MAASTestCase
 from maastesting.twisted import extract_result
 from metadataserver.builtin_scripts import load_builtin_scripts
 from metadataserver.enum import RESULT_TYPE, SCRIPT_STATUS
-from metadataserver.models.scriptresult import ScriptResult
-from metadataserver.models.scriptset import ScriptSet
 from provisioningserver.drivers.pod import DiscoveredPod
 from provisioningserver.refresh.node_info_scripts import (
     COMMISSIONING_OUTPUT_NAME,
diff --git a/src/maasserver/tests/test_storage_layouts.py b/src/maasserver/tests/test_storage_layouts.py
index a088b49..0fd7a94 100644
--- a/src/maasserver/tests/test_storage_layouts.py
+++ b/src/maasserver/tests/test_storage_layouts.py
@@ -21,6 +21,7 @@ from maasserver.models.partitiontable import (
     PARTITION_TABLE_EXTRA_SPACE,
     PREP_PARTITION_SIZE,
 )
+from maasserver.models.scriptset import ScriptSet
 from maasserver.storage_layouts import (
     BcacheStorageLayout,
     BlankStorageLayout,
@@ -49,7 +50,6 @@ from maasserver.utils.converters import round_size_to_nearest_block
 from maastesting.matchers import MockCalledOnceWith
 from metadataserver.builtin_scripts.tests import test_hooks
 from metadataserver.enum import SCRIPT_TYPE
-from metadataserver.models import ScriptSet
 from provisioningserver.refresh.node_info_scripts import (
     COMMISSIONING_OUTPUT_NAME,
 )
diff --git a/src/maasserver/triggers/testing.py b/src/maasserver/triggers/testing.py
index 3e6fa68..4a89313 100644
--- a/src/maasserver/triggers/testing.py
+++ b/src/maasserver/triggers/testing.py
@@ -11,6 +11,7 @@ from twisted.internet.defer import DeferredQueue, inlineCallbacks, returnValue
 
 from maasserver.enum import INTERFACE_TYPE, NODE_TYPE
 from maasserver.listener import PostgresListenerService
+from maasserver.models import Script, ScriptSet
 from maasserver.models.blockdevice import BlockDevice
 from maasserver.models.bmc import BMC, Pod
 from maasserver.models.cacheset import CacheSet
@@ -56,7 +57,6 @@ from maasserver.triggers import register_trigger
 from maasserver.utils.orm import reload_object, transactional
 from maasserver.utils.threads import deferToDatabase
 from maastesting.crochet import wait_for
-from metadataserver.models import Script, ScriptSet
 
 wait_for_reactor = wait_for()
 
diff --git a/src/maasserver/triggers/tests/test_init.py b/src/maasserver/triggers/tests/test_init.py
index 73bfcde..9e614b5 100644
--- a/src/maasserver/triggers/tests/test_init.py
+++ b/src/maasserver/triggers/tests/test_init.py
@@ -190,17 +190,17 @@ class TestTriggersUsed(MAASServerTestCase):
         "iprange_iprange_subnet_insert_notify",
         "iprange_iprange_subnet_update_notify",
         "iprange_iprange_update_notify",
-        "metadataserver_script_script_create_notify",
-        "metadataserver_script_script_delete_notify",
-        "metadataserver_script_script_update_notify",
-        "metadataserver_scriptresult_nd_scriptresult_link_notify",
-        "metadataserver_scriptresult_nd_scriptresult_unlink_notify",
-        "metadataserver_scriptresult_nd_scriptresult_update_notify",
-        "metadataserver_scriptresult_scriptresult_create_notify",
-        "metadataserver_scriptresult_scriptresult_delete_notify",
-        "metadataserver_scriptresult_scriptresult_update_notify",
-        "metadataserver_scriptset_nd_scriptset_link_notify",
-        "metadataserver_scriptset_nd_scriptset_unlink_notify",
+        "script_script_create_notify",
+        "script_script_delete_notify",
+        "script_script_update_notify",
+        "scriptresult_nd_scriptresult_link_notify",
+        "scriptresult_nd_scriptresult_unlink_notify",
+        "scriptresult_nd_scriptresult_update_notify",
+        "scriptresult_scriptresult_create_notify",
+        "scriptresult_scriptresult_delete_notify",
+        "scriptresult_scriptresult_update_notify",
+        "scriptset_nd_scriptset_link_notify",
+        "scriptset_nd_scriptset_unlink_notify",
         "neighbour_neighbour_create_notify",
         "neighbour_neighbour_delete_notify",
         "neighbour_neighbour_update_notify",
diff --git a/src/maasserver/triggers/tests/test_websocket_listener.py b/src/maasserver/triggers/tests/test_websocket_listener.py
index 90ea0a7..23a8a20 100644
--- a/src/maasserver/triggers/tests/test_websocket_listener.py
+++ b/src/maasserver/triggers/tests/test_websocket_listener.py
@@ -1461,7 +1461,7 @@ class TestScriptSetListener(
     MAASTransactionServerTestCase, TransactionalHelpersMixin
 ):
     """End-to-end test of both the listeners code and the triggers on
-    metadataserver_scriptset table that notifies its node."""
+    maasserver_scriptset table that notifies its node."""
 
     scenarios = (
         (
@@ -1538,7 +1538,7 @@ class TestDeviceWithParentScriptSetListener(
     MAASTransactionServerTestCase, TransactionalHelpersMixin
 ):
     """End-to-end test of both the listeners code and the triggers on
-    metadataserver_scriptset table that notifies its node."""
+    maasserver_scriptset table that notifies its node."""
 
     @wait_for_reactor
     @inlineCallbacks
@@ -1580,7 +1580,7 @@ class TestNDScriptResultListener(
     MAASTransactionServerTestCase, TransactionalHelpersMixin
 ):
     """End-to-end test of both the listeners code and the triggers on
-    metadataserver_scriptresult table that notifies its node."""
+    maasserver_scriptresult table that notifies its node."""
 
     scenarios = (
         (
@@ -1684,7 +1684,7 @@ class TestScriptResultListener(
     MAASTransactionServerTestCase, TransactionalHelpersMixin
 ):
     """End-to-end test of both the listers code and the triggers on
-    the metadataserver_Scriptresult table that notifies the node-results
+    the maasserver_scriptresult table that notifies the node-results
     websocket."""
 
     @wait_for_reactor
diff --git a/src/maasserver/triggers/websocket.py b/src/maasserver/triggers/websocket.py
index 08acb6a..43c6dc2 100644
--- a/src/maasserver/triggers/websocket.py
+++ b/src/maasserver/triggers/websocket.py
@@ -1572,7 +1572,7 @@ def render_script_result_notify(proc_name, script_set_id):
             system_id, node_type INTO node
           FROM
             maasserver_node AS nodet,
-            metadataserver_scriptset AS scriptset
+            maasserver_scriptset AS scriptset
           WHERE
             scriptset.id = {script_set_id} AND
             scriptset.node_id = nodet.id;
@@ -2384,10 +2384,10 @@ def register_websocket_triggers():
         )
     )
     register_trigger(
-        "metadataserver_scriptset", "nd_scriptset_link_notify", "insert"
+        "maasserver_scriptset", "nd_scriptset_link_notify", "insert"
     )
     register_trigger(
-        "metadataserver_scriptset", "nd_scriptset_unlink_notify", "delete"
+        "maasserver_scriptset", "nd_scriptset_unlink_notify", "delete"
     )
 
     # ScriptResult triggers to the node for the nodes-listing page.
@@ -2407,15 +2407,15 @@ def register_websocket_triggers():
         )
     )
     register_trigger(
-        "metadataserver_scriptresult", "nd_scriptresult_link_notify", "insert"
+        "maasserver_scriptresult", "nd_scriptresult_link_notify", "insert"
     )
     register_trigger(
-        "metadataserver_scriptresult",
+        "maasserver_scriptresult",
         "nd_scriptresult_update_notify",
         "update",
     )
     register_trigger(
-        "metadataserver_scriptresult",
+        "maasserver_scriptresult",
         "nd_scriptresult_unlink_notify",
         "delete",
     )
@@ -2436,7 +2436,7 @@ def register_websocket_triggers():
             "scriptresult_delete_notify", "scriptresult_delete", "OLD.id"
         )
     )
-    register_triggers("metadataserver_scriptresult", "scriptresult")
+    register_triggers("maasserver_scriptresult", "scriptresult")
 
     # Interface address table, update to linked node.
     register_procedure(
@@ -2886,7 +2886,7 @@ def register_websocket_triggers():
             "script_delete_notify", "script_delete", "OLD.id"
         )
     )
-    register_triggers("metadataserver_script", "script")
+    register_triggers("maasserver_script", "script")
 
     # NodeDevice table
     register_procedure(
diff --git a/src/maasserver/websockets/handlers/node.py b/src/maasserver/websockets/handlers/node.py
index 5fa038d..486c497 100644
--- a/src/maasserver/websockets/handlers/node.py
+++ b/src/maasserver/websockets/handlers/node.py
@@ -52,6 +52,7 @@ from maasserver.models import (
     Partition,
     PhysicalBlockDevice,
     ResourcePool,
+    ScriptResult,
     Space,
     StaticIPAddress,
     Subnet,
@@ -63,6 +64,7 @@ from maasserver.models import (
     Zone,
 )
 from maasserver.models.nodeprobeddetails import script_output_nsmap
+from maasserver.models.scriptset import get_status_from_qs
 from maasserver.node_action import compile_node_actions
 from maasserver.node_constraint_filter_forms import (
     FreeTextFilterNodeForm,
@@ -92,8 +94,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS,
     SCRIPT_STATUS_FAILED,
 )
-from metadataserver.models.scriptresult import ScriptResult
-from metadataserver.models.scriptset import get_status_from_qs
 from provisioningserver.refresh.node_info_scripts import (
     LIST_MODALIASES_OUTPUT_NAME,
 )
diff --git a/src/maasserver/websockets/handlers/node_result.py b/src/maasserver/websockets/handlers/node_result.py
index 86b2dcc..2d76811 100644
--- a/src/maasserver/websockets/handlers/node_result.py
+++ b/src/maasserver/websockets/handlers/node_result.py
@@ -8,7 +8,7 @@ from operator import attrgetter
 
 from django.core.exceptions import ValidationError
 
-from maasserver.models.node import Node
+from maasserver.models import Node, ScriptResult
 from maasserver.websockets.base import (
     dehydrate_datetime,
     HandlerDoesNotExistError,
@@ -18,7 +18,6 @@ from maasserver.websockets.handlers.timestampedmodel import (
     TimestampedModelHandler,
 )
 from metadataserver.enum import HARDWARE_TYPE
-from metadataserver.models import ScriptResult
 
 
 class NodeResultHandler(TimestampedModelHandler):
diff --git a/src/maasserver/websockets/handlers/script.py b/src/maasserver/websockets/handlers/script.py
index c46a4f9..219c4b1 100644
--- a/src/maasserver/websockets/handlers/script.py
+++ b/src/maasserver/websockets/handlers/script.py
@@ -4,6 +4,7 @@
 """The Script handler for the WebSocket connection."""
 
 
+from maasserver.models import Script
 from maasserver.permissions import NodePermission
 from maasserver.websockets.base import (
     HandlerDoesNotExistError,
@@ -12,7 +13,6 @@ from maasserver.websockets.base import (
 from maasserver.websockets.handlers.timestampedmodel import (
     TimestampedModelHandler,
 )
-from metadataserver.models import Script
 
 
 class ScriptHandler(TimestampedModelHandler):
diff --git a/src/maasserver/websockets/handlers/tests/test_machine.py b/src/maasserver/websockets/handlers/tests/test_machine.py
index 5ea2e31..b5ab34c 100644
--- a/src/maasserver/websockets/handlers/tests/test_machine.py
+++ b/src/maasserver/websockets/handlers/tests/test_machine.py
@@ -76,6 +76,7 @@ from maasserver.models.partition import (
     MIN_PARTITION_SIZE,
     PARTITION_ALIGNMENT_SIZE,
 )
+from maasserver.models.scriptset import get_status_from_qs
 import maasserver.node_action as node_action_module
 from maasserver.node_action import compile_node_actions
 from maasserver.permissions import NodePermission
@@ -133,7 +134,6 @@ from metadataserver.enum import (
     SCRIPT_STATUS_FAILED,
     SCRIPT_TYPE,
 )
-from metadataserver.models.scriptset import get_status_from_qs
 from provisioningserver.refresh.node_info_scripts import (
     LIST_MODALIASES_OUTPUT_NAME,
     LLDP_OUTPUT_NAME,
diff --git a/src/metadataserver/api.py b/src/metadataserver/api.py
index faf237c..2ba1601 100644
--- a/src/metadataserver/api.py
+++ b/src/metadataserver/api.py
@@ -62,6 +62,9 @@ from maasserver.models import (
     NodeKey,
     NodeMetadata,
     NodeUserData,
+    Script,
+    ScriptResult,
+    ScriptSet,
     SSHKey,
     SSLKey,
 )
@@ -90,7 +93,6 @@ from metadataserver.enum import (
     SIGNAL_STATUS,
     SIGNAL_STATUS_CHOICES,
 )
-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/builtin_scripts/__init__.py b/src/metadataserver/builtin_scripts/__init__.py
index 32e302a..57ab6d1 100644
--- a/src/metadataserver/builtin_scripts/__init__.py
+++ b/src/metadataserver/builtin_scripts/__init__.py
@@ -14,7 +14,7 @@ from zope.interface.verify import verifyObject
 
 from maasserver.forms.script import ScriptForm
 from maasserver.models.controllerinfo import get_maas_version
-from metadataserver.models import Script
+from maasserver.models.script import Script
 from provisioningserver.refresh.node_info_scripts import (
     BMC_DETECTION,
     COMMISSIONING_OUTPUT_NAME,
diff --git a/src/metadataserver/builtin_scripts/tests/test_builtin_scripts.py b/src/metadataserver/builtin_scripts/tests/test_builtin_scripts.py
index f32b21f..9490c3d 100644
--- a/src/metadataserver/builtin_scripts/tests/test_builtin_scripts.py
+++ b/src/metadataserver/builtin_scripts/tests/test_builtin_scripts.py
@@ -8,7 +8,7 @@ import random
 
 from testtools.matchers import ContainsAll
 
-from maasserver.models import ControllerInfo, VersionedTextFile
+from maasserver.models import ControllerInfo, Script, VersionedTextFile
 from maasserver.testing.factory import factory
 from maasserver.testing.testcase import MAASServerTestCase
 from maasserver.utils.orm import reload_object
@@ -17,7 +17,6 @@ from metadataserver.builtin_scripts import (
     load_builtin_scripts,
 )
 from metadataserver.enum import SCRIPT_TYPE_CHOICES
-from metadataserver.models import Script
 from provisioningserver.refresh.node_info_scripts import NODE_INFO_SCRIPTS
 
 
diff --git a/src/metadataserver/builtin_scripts/tests/test_hooks.py b/src/metadataserver/builtin_scripts/tests/test_hooks.py
index 0b77357..d790987 100644
--- a/src/metadataserver/builtin_scripts/tests/test_hooks.py
+++ b/src/metadataserver/builtin_scripts/tests/test_hooks.py
@@ -25,6 +25,7 @@ from maasserver.models import (
     NodeMetadata,
     NUMANode,
     PhysicalInterface,
+    ScriptSet,
     Tag,
     VLAN,
 )
@@ -69,7 +70,6 @@ from metadataserver.enum import (
     HARDWARE_TYPE,
     SCRIPT_TYPE,
 )
-from metadataserver.models import ScriptSet
 from provisioningserver.events import EVENT_DETAILS, EVENT_TYPES
 from provisioningserver.refresh.node_info_scripts import (
     KERNEL_CMDLINE_OUTPUT_NAME,
diff --git a/src/metadataserver/migrations/0036_move_metadata_script_models.py b/src/metadataserver/migrations/0036_move_metadata_script_models.py
new file mode 100644
index 0000000..0cb1abb
--- /dev/null
+++ b/src/metadataserver/migrations/0036_move_metadata_script_models.py
@@ -0,0 +1,60 @@
+# Generated by Django 3.2.12 on 2022-11-18 13:05
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("metadataserver", "0035_move_metadata_node_models"),
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(
+            state_operations=[
+                migrations.RemoveField(
+                    model_name="scriptresult",
+                    name="interface",
+                ),
+                migrations.RemoveField(
+                    model_name="scriptresult",
+                    name="physical_blockdevice",
+                ),
+                migrations.RemoveField(
+                    model_name="scriptresult",
+                    name="script",
+                ),
+                migrations.RemoveField(
+                    model_name="scriptresult",
+                    name="script_set",
+                ),
+                migrations.RemoveField(
+                    model_name="scriptresult",
+                    name="script_version",
+                ),
+                migrations.RemoveField(
+                    model_name="scriptset",
+                    name="node",
+                ),
+                migrations.DeleteModel(
+                    name="Script",
+                ),
+                migrations.DeleteModel(
+                    name="ScriptResult",
+                ),
+                migrations.DeleteModel(
+                    name="ScriptSet",
+                ),
+            ],
+            database_operations=[
+                migrations.AlterModelTable(
+                    name="Script", table="maasserver_script"
+                ),
+                migrations.AlterModelTable(
+                    name="ScriptResult", table="maasserver_scriptresult"
+                ),
+                migrations.AlterModelTable(
+                    name="ScriptSet", table="maasserver_scriptset"
+                ),
+            ],
+        ),
+    ]
diff --git a/src/metadataserver/models/__init__.py b/src/metadataserver/models/__init__.py
index 7e863ff..0a22a92 100644
--- a/src/metadataserver/models/__init__.py
+++ b/src/metadataserver/models/__init__.py
@@ -4,8 +4,4 @@
 """Model export and helpers for metadataserver.
 """
 
-__all__ = ["Script", "ScriptResult", "ScriptSet"]
-
-from metadataserver.models.script import Script
-from metadataserver.models.scriptresult import ScriptResult
-from metadataserver.models.scriptset import ScriptSet
+__all__ = []
diff --git a/src/metadataserver/tests/test_api.py b/src/metadataserver/tests/test_api.py
index dcff7ac..fea95f5 100644
--- a/src/metadataserver/tests/test_api.py
+++ b/src/metadataserver/tests/test_api.py
@@ -44,6 +44,8 @@ from maasserver.models import (
     NodeKey,
     NodeMetadata,
     NodeUserData,
+    Script,
+    ScriptSet,
     SSHKey,
     VersionedTextFile,
 )
@@ -92,7 +94,6 @@ from metadataserver.enum import (
     SIGNAL_STATUS,
     SIGNAL_STATUS_CHOICES,
 )
-from metadataserver.models import Script, ScriptSet
 from metadataserver.nodeinituser import get_node_init_user
 from provisioningserver.events import (
     EVENT_DETAILS,
-- 
Mailing list: https://launchpad.net/~sts-sponsors
Post to     : sts-sponsors@lists.launchpad.net
Unsubscribe : https://launchpad.net/~sts-sponsors
More help   : https://help.launchpad.net/ListHelp

Reply via email to