Merge ~d0ugal/maas:super3 into maas:master

Proposed by Dougal Matthews
Status: Merged
Approved by: Dougal Matthews
Approved revision: 7988be8eafe24ae33b384ee460f1d290a8e60e92
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~d0ugal/maas:super3
Merge into: maas:master
Diff against target: 7182 lines (+691/-775)
279 files modified
src/apiclient/maas_client.py (+1/-5)
src/apiclient/testing/django.py (+2/-2)
src/maascli/api.py (+1/-1)
src/maascli/cli.py (+2/-2)
src/maascli/command.py (+1/-1)
src/maascli/parser.py (+1/-1)
src/maascli/snappy.py (+3/-3)
src/maascli/tests/test_snappy.py (+3/-3)
src/maasserver/api/auth.py (+1/-1)
src/maasserver/api/support.py (+4/-8)
src/maasserver/api/tests/test_api.py (+1/-1)
src/maasserver/api/tests/test_boot_source_selections.py (+2/-2)
src/maasserver/api/tests/test_boot_sources.py (+2/-2)
src/maasserver/api/tests/test_doc.py (+2/-2)
src/maasserver/api/tests/test_machine.py (+2/-2)
src/maasserver/api/tests/test_machines.py (+2/-2)
src/maasserver/api/tests/test_node.py (+1/-1)
src/maasserver/bootresources.py (+3/-7)
src/maasserver/clusterrpc/boot_images.py (+1/-1)
src/maasserver/clusterrpc/tests/test_boot_images.py (+5/-5)
src/maasserver/config_forms.py (+1/-1)
src/maasserver/dns/tests/test_config.py (+3/-3)
src/maasserver/dns/tests/test_zonegenerator.py (+1/-1)
src/maasserver/dns/zonegenerator.py (+1/-1)
src/maasserver/eventloop.py (+1/-1)
src/maasserver/exceptions.py (+2/-4)
src/maasserver/fields.py (+17/-19)
src/maasserver/fields_storage.py (+2/-2)
src/maasserver/forms/__init__.py (+70/-78)
src/maasserver/forms/dhcpsnippet.py (+1/-1)
src/maasserver/forms/filesystem.py (+5/-5)
src/maasserver/forms/interface.py (+8/-8)
src/maasserver/forms/interface_link.py (+5/-5)
src/maasserver/forms/packagerepository.py (+1/-1)
src/maasserver/forms/pods.py (+6/-6)
src/maasserver/forms/script.py (+1/-1)
src/maasserver/forms/settings.py (+1/-1)
src/maasserver/forms/staticroute.py (+1/-1)
src/maasserver/forms/subnet.py (+2/-2)
src/maasserver/forms/tests/test_bootsource.py (+1/-1)
src/maasserver/forms/tests/test_bootsourceselection.py (+1/-1)
src/maasserver/forms/tests/test_helpers.py (+1/-1)
src/maasserver/forms/vlan.py (+3/-3)
src/maasserver/ipc.py (+7/-7)
src/maasserver/json.py (+1/-1)
src/maasserver/listener.py (+2/-2)
src/maasserver/macaroon_auth.py (+1/-1)
src/maasserver/management/commands/_config.py (+3/-3)
src/maasserver/management/commands/db_vacuum_lobjects.py (+1/-1)
src/maasserver/management/commands/dbupgrade.py (+1/-1)
src/maasserver/management/commands/edit_named_options.py (+1/-1)
src/maasserver/management/commands/runserver.py (+2/-2)
src/maasserver/management/commands/tests/test_dbupgrade.py (+1/-1)
src/maasserver/models/blockdevice.py (+1/-1)
src/maasserver/models/bmc.py (+3/-3)
src/maasserver/models/bootresource.py (+1/-3)
src/maasserver/models/bootsource.py (+1/-1)
src/maasserver/models/cleansave.py (+10/-10)
src/maasserver/models/config.py (+1/-1)
src/maasserver/models/dhcpsnippet.py (+1/-1)
src/maasserver/models/discovery.py (+1/-1)
src/maasserver/models/dnsresource.py (+2/-2)
src/maasserver/models/domain.py (+4/-4)
src/maasserver/models/fabric.py (+3/-3)
src/maasserver/models/fannetwork.py (+1/-1)
src/maasserver/models/filesystem.py (+2/-2)
src/maasserver/models/filesystemgroup.py (+7/-11)
src/maasserver/models/interface.py (+12/-14)
src/maasserver/models/iprange.py (+1/-1)
src/maasserver/models/iscsiblockdevice.py (+1/-1)
src/maasserver/models/largefile.py (+1/-1)
src/maasserver/models/licensekey.py (+1/-3)
src/maasserver/models/neighbour.py (+1/-1)
src/maasserver/models/node.py (+8/-14)
src/maasserver/models/nodemetadata.py (+1/-1)
src/maasserver/models/notification.py (+1/-1)
src/maasserver/models/packagerepository.py (+1/-1)
src/maasserver/models/partition.py (+3/-3)
src/maasserver/models/partitiontable.py (+1/-1)
src/maasserver/models/physicalblockdevice.py (+1/-1)
src/maasserver/models/resourcepool.py (+1/-1)
src/maasserver/models/signals/testing.py (+2/-2)
src/maasserver/models/signals/tests/test_events.py (+1/-1)
src/maasserver/models/signals/tests/test_nodes.py (+2/-2)
src/maasserver/models/space.py (+2/-2)
src/maasserver/models/sslkey.py (+1/-3)
src/maasserver/models/staticipaddress.py (+1/-1)
src/maasserver/models/subnet.py (+1/-1)
src/maasserver/models/switch.py (+1/-1)
src/maasserver/models/tag.py (+2/-2)
src/maasserver/models/testing.py (+4/-4)
src/maasserver/models/tests/test_bootresource.py (+1/-1)
src/maasserver/models/tests/test_bootsource.py (+1/-1)
src/maasserver/models/tests/test_bootsourcecache.py (+1/-1)
src/maasserver/models/tests/test_bootsourceselection.py (+1/-1)
src/maasserver/models/tests/test_config.py (+1/-1)
src/maasserver/models/tests/test_dnspublication.py (+1/-1)
src/maasserver/models/tests/test_node.py (+4/-4)
src/maasserver/models/tests/test_rbacsync.py (+1/-1)
src/maasserver/models/timestampedmodel.py (+1/-1)
src/maasserver/models/userprofile.py (+1/-1)
src/maasserver/models/virtualblockdevice.py (+2/-2)
src/maasserver/models/vlan.py (+2/-2)
src/maasserver/models/zone.py (+1/-1)
src/maasserver/node_action.py (+2/-2)
src/maasserver/node_constraint_filter_forms.py (+2/-2)
src/maasserver/nonces_cleanup.py (+1/-3)
src/maasserver/preseed.py (+1/-1)
src/maasserver/prometheus/stats.py (+1/-1)
src/maasserver/rack_controller.py (+3/-3)
src/maasserver/region_controller.py (+3/-3)
src/maasserver/regiondservices/service_monitor_service.py (+1/-3)
src/maasserver/regiondservices/tests/test_ntp.py (+1/-1)
src/maasserver/regiondservices/tests/test_syslog.py (+1/-1)
src/maasserver/rpc/regionservice.py (+8/-8)
src/maasserver/rpc/testing/fixtures.py (+6/-6)
src/maasserver/rpc/testing/mixins.py (+1/-1)
src/maasserver/rpc/tests/test_boot.py (+1/-1)
src/maasserver/rpc/tests/test_configuration.py (+1/-1)
src/maasserver/rpc/tests/test_rackcontrollers.py (+1/-1)
src/maasserver/rpc/tests/test_regionservice_calls.py (+4/-4)
src/maasserver/sequence.py (+1/-1)
src/maasserver/stats.py (+1/-1)
src/maasserver/status_monitor.py (+1/-3)
src/maasserver/storage_layouts.py (+7/-13)
src/maasserver/testing/api.py (+2/-2)
src/maasserver/testing/database.py (+2/-2)
src/maasserver/testing/eventloop.py (+3/-3)
src/maasserver/testing/fixtures.py (+1/-1)
src/maasserver/testing/matchers.py (+2/-2)
src/maasserver/testing/orm.py (+2/-2)
src/maasserver/testing/resources.py (+1/-1)
src/maasserver/testing/testcase.py (+12/-12)
src/maasserver/testing/testclient.py (+6/-6)
src/maasserver/tests/test_bootresources.py (+3/-3)
src/maasserver/tests/test_bootsources.py (+5/-5)
src/maasserver/tests/test_commands_edit_named_options.py (+1/-1)
src/maasserver/tests/test_ipc.py (+1/-1)
src/maasserver/tests/test_ntp.py (+3/-3)
src/maasserver/tests/test_plugin.py (+2/-2)
src/maasserver/tests/test_preseed.py (+1/-1)
src/maasserver/tests/test_proxyconfig.py (+1/-1)
src/maasserver/tests/test_start_up.py (+3/-3)
src/maasserver/tests/test_webapp.py (+1/-1)
src/maasserver/triggers/tests/test_websocket_listener.py (+1/-1)
src/maasserver/utils/asynchronous.py (+1/-1)
src/maasserver/utils/dblocks.py (+2/-2)
src/maasserver/utils/dbtasks.py (+3/-3)
src/maasserver/utils/orm.py (+2/-2)
src/maasserver/utils/signals.py (+1/-1)
src/maasserver/utils/tests/test_dblocks.py (+1/-1)
src/maasserver/utils/tests/test_keys.py (+1/-1)
src/maasserver/utils/tests/test_orm.py (+3/-3)
src/maasserver/utils/tests/test_utils.py (+1/-1)
src/maasserver/utils/tests/test_views.py (+1/-1)
src/maasserver/utils/views.py (+4/-6)
src/maasserver/views/tests/test_rpc.py (+1/-1)
src/maasserver/webapp.py (+6/-8)
src/maasserver/websockets/base.py (+1/-3)
src/maasserver/websockets/handlers/device.py (+2/-2)
src/maasserver/websockets/handlers/discovery.py (+1/-1)
src/maasserver/websockets/handlers/event.py (+1/-1)
src/maasserver/websockets/handlers/pod.py (+1/-1)
src/maasserver/websockets/handlers/sshkey.py (+1/-3)
src/maasserver/websockets/handlers/sslkey.py (+1/-3)
src/maasserver/websockets/handlers/staticroute.py (+3/-3)
src/maasserver/websockets/handlers/switch.py (+1/-1)
src/maasserver/websockets/handlers/tests/test_bootresource.py (+3/-3)
src/maasserver/websockets/handlers/timestampedmodel.py (+1/-1)
src/maasserver/websockets/handlers/token.py (+1/-3)
src/maasserver/websockets/handlers/user.py (+1/-1)
src/maasserver/websockets/handlers/vlan.py (+2/-2)
src/maasserver/websockets/tests/test_websockets.py (+3/-3)
src/maasserver/workers.py (+3/-3)
src/maastesting/crochet.py (+1/-1)
src/maastesting/djangoloader.py (+2/-2)
src/maastesting/djangotestcase.py (+2/-2)
src/maastesting/doubles.py (+1/-1)
src/maastesting/fixtures.py (+10/-10)
src/maastesting/httpd.py (+2/-2)
src/maastesting/matchers.py (+7/-7)
src/maastesting/noseplug.py (+11/-11)
src/maastesting/parallel.py (+2/-2)
src/maastesting/runtest.py (+3/-3)
src/maastesting/scenarios.py (+1/-1)
src/maastesting/testcase.py (+6/-6)
src/maastesting/tests/test_fixtures.py (+1/-1)
src/maastesting/tests/test_httpd.py (+1/-1)
src/maastesting/tests/test_parallel.py (+3/-3)
src/maastesting/twisted.py (+2/-2)
src/maastesting/typecheck.py (+2/-2)
src/metadataserver/api_twisted.py (+1/-3)
src/metadataserver/fields.py (+1/-1)
src/metadataserver/migrations/0009_remove_noderesult_schema.py (+1/-1)
src/metadataserver/tests/test_api.py (+5/-5)
src/metadataserver/user_data/templates/snippets/tests/test_maas_wipe.py (+1/-1)
src/provisioningserver/boot/__init__.py (+2/-2)
src/provisioningserver/boot/pxe.py (+1/-1)
src/provisioningserver/boot/tests/test_tftppath.py (+1/-1)
src/provisioningserver/boot/tests/test_windows.py (+1/-1)
src/provisioningserver/config.py (+5/-5)
src/provisioningserver/dhcp/__init__.py (+1/-1)
src/provisioningserver/dns/tests/test_actions.py (+1/-1)
src/provisioningserver/dns/zoneconfig.py (+2/-4)
src/provisioningserver/drivers/hardware/seamicro.py (+1/-1)
src/provisioningserver/drivers/hardware/tests/test_vmware.py (+2/-2)
src/provisioningserver/drivers/hardware/ucsm.py (+1/-1)
src/provisioningserver/drivers/hardware/virsh.py (+1/-1)
src/provisioningserver/drivers/hardware/vmware.py (+1/-1)
src/provisioningserver/drivers/nos/__init__.py (+1/-1)
src/provisioningserver/drivers/nos/tests/test_base.py (+2/-2)
src/provisioningserver/drivers/nos/tests/test_registry.py (+1/-1)
src/provisioningserver/drivers/osystem/tests/test_base.py (+1/-1)
src/provisioningserver/drivers/pod/__init__.py (+1/-1)
src/provisioningserver/drivers/pod/tests/test_base.py (+1/-1)
src/provisioningserver/drivers/pod/tests/test_lxd.py (+2/-2)
src/provisioningserver/drivers/pod/tests/test_registry.py (+1/-1)
src/provisioningserver/drivers/pod/virsh.py (+1/-1)
src/provisioningserver/drivers/power/__init__.py (+1/-1)
src/provisioningserver/drivers/power/tests/test_amt.py (+1/-1)
src/provisioningserver/drivers/power/tests/test_base.py (+3/-3)
src/provisioningserver/drivers/tests/test_base.py (+1/-1)
src/provisioningserver/events.py (+1/-1)
src/provisioningserver/import_images/download_descriptions.py (+2/-2)
src/provisioningserver/import_images/download_resources.py (+1/-1)
src/provisioningserver/import_images/tests/test_boot_resources.py (+1/-1)
src/provisioningserver/logger/_twisted.py (+1/-1)
src/provisioningserver/logger/tests/test__twisted.py (+1/-1)
src/provisioningserver/ntp/tests/test_config.py (+1/-1)
src/provisioningserver/proxy/tests/test_config.py (+1/-1)
src/provisioningserver/rackdservices/dhcp_probe_service.py (+1/-3)
src/provisioningserver/rackdservices/image_download_service.py (+1/-3)
src/provisioningserver/rackdservices/lease_socket_service.py (+2/-2)
src/provisioningserver/rackdservices/networks_monitoring_service.py (+1/-1)
src/provisioningserver/rackdservices/node_power_monitor_service.py (+1/-3)
src/provisioningserver/rackdservices/service_monitor_service.py (+1/-3)
src/provisioningserver/rackdservices/tests/test_service_monitor_service.py (+1/-1)
src/provisioningserver/rackdservices/tests/test_tftp.py (+1/-1)
src/provisioningserver/rackdservices/tftp.py (+3/-5)
src/provisioningserver/rackdservices/tftp_offload.py (+3/-5)
src/provisioningserver/rpc/arguments.py (+12/-12)
src/provisioningserver/rpc/clusterservice.py (+6/-8)
src/provisioningserver/rpc/common.py (+9/-9)
src/provisioningserver/rpc/exceptions.py (+1/-1)
src/provisioningserver/rpc/testing/__init__.py (+5/-5)
src/provisioningserver/rpc/testing/doubles.py (+1/-1)
src/provisioningserver/rpc/tests/test_boot_images.py (+1/-1)
src/provisioningserver/rpc/tests/test_clusterservice.py (+2/-2)
src/provisioningserver/rpc/tests/test_dhcp.py (+2/-2)
src/provisioningserver/rpc/tests/test_power.py (+5/-5)
src/provisioningserver/rpc/tests/test_tags.py (+1/-1)
src/provisioningserver/syslog/tests/test_config.py (+1/-1)
src/provisioningserver/testing/bindfixture.py (+6/-6)
src/provisioningserver/testing/config.py (+5/-5)
src/provisioningserver/testing/events.py (+1/-1)
src/provisioningserver/testing/nginxfixture.py (+6/-6)
src/provisioningserver/tests/test_cluster_config_command.py (+1/-1)
src/provisioningserver/tests/test_monkey.py (+1/-1)
src/provisioningserver/tests/test_plugin.py (+1/-1)
src/provisioningserver/tests/test_register_command.py (+1/-1)
src/provisioningserver/tests/test_support_dump.py (+1/-1)
src/provisioningserver/tests/test_tags.py (+5/-5)
src/provisioningserver/utils/__init__.py (+1/-1)
src/provisioningserver/utils/config.py (+1/-1)
src/provisioningserver/utils/fs.py (+4/-4)
src/provisioningserver/utils/network.py (+1/-1)
src/provisioningserver/utils/script.py (+1/-1)
src/provisioningserver/utils/service_monitor.py (+1/-1)
src/provisioningserver/utils/testing.py (+3/-3)
src/provisioningserver/utils/tests/test_config.py (+1/-1)
src/provisioningserver/utils/tests/test_env.py (+1/-1)
src/provisioningserver/utils/tests/test_fs.py (+2/-2)
src/provisioningserver/utils/tests/test_registry.py (+1/-1)
src/provisioningserver/utils/tests/test_script.py (+1/-1)
src/provisioningserver/utils/tests/test_services.py (+1/-1)
src/provisioningserver/utils/tests/test_twisted.py (+5/-5)
src/provisioningserver/utils/tests/test_version.py (+1/-1)
src/provisioningserver/utils/tests/test_xpath.py (+1/-1)
src/provisioningserver/utils/twisted.py (+8/-8)
Reviewer Review Type Date Requested Status
Adam Collard (community) Approve
MAAS Lander Approve
Review via email: mp+386103@code.launchpad.net

Commit message

Use Python 3 super calls where possible

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

UNIT TESTS
-b super3 lp:~d0ugal/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 7988be8eafe24ae33b384ee460f1d290a8e60e92

review: Approve
Revision history for this message
Adam Collard (adam-collard) wrote :

+1

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/apiclient/maas_client.py b/src/apiclient/maas_client.py
2index 89e2a3b..fd4b2d8 100644
3--- a/src/apiclient/maas_client.py
4+++ b/src/apiclient/maas_client.py
5@@ -75,11 +75,7 @@ class RequestWithMethod(urllib.request.Request):
6 urllib.request.Request.__init__(self, *args, **kwargs)
7
8 def get_method(self):
9- return (
10- self._method
11- if self._method
12- else super(RequestWithMethod, self).get_method()
13- )
14+ return self._method if self._method else super().get_method()
15
16
17 class MAASDispatcher:
18diff --git a/src/apiclient/testing/django.py b/src/apiclient/testing/django.py
19index 41fcdb7..3a7cf9c 100644
20--- a/src/apiclient/testing/django.py
21+++ b/src/apiclient/testing/django.py
22@@ -23,7 +23,7 @@ class APIClientTestCase(MAASTestCase):
23 """
24
25 def setUp(self):
26- super(APIClientTestCase, self).setUp()
27+ super().setUp()
28 # Django 1.8 and 1.11 need to be configured before we can use
29 # WSGIRequest and MultiPartParser.
30 if not django.conf.settings.configured:
31@@ -33,7 +33,7 @@ class APIClientTestCase(MAASTestCase):
32 # Reset django settings after each test since configuring Django breaks
33 # tests for maascli commands which attempt to really load Django.
34 django.conf.settings = django.conf.LazySettings()
35- super(APIClientTestCase, self).tearDown()
36+ super().tearDown()
37
38 @classmethod
39 def parse_headers_and_body_with_django(cls, headers, body):
40diff --git a/src/maascli/api.py b/src/maascli/api.py
41index 6f7ffd2..a0bd96a 100644
42--- a/src/maascli/api.py
43+++ b/src/maascli/api.py
44@@ -92,7 +92,7 @@ class Action(Command):
45 op = property(lambda self: self.action["op"])
46
47 def __init__(self, parser):
48- super(Action, self).__init__(parser)
49+ super().__init__(parser)
50 for param in self.handler["params"]:
51 parser.add_argument(param)
52 parser.add_argument("data", type=self.name_value_pair, nargs="*")
53diff --git a/src/maascli/cli.py b/src/maascli/cli.py
54index 673e93c..44f2c41 100644
55--- a/src/maascli/cli.py
56+++ b/src/maascli/cli.py
57@@ -37,7 +37,7 @@ class cmd_login(Command):
58 """
59
60 def __init__(self, parser):
61- super(cmd_login, self).__init__(parser)
62+ super().__init__(parser)
63 parser.add_argument(
64 "profile_name",
65 metavar="profile-name",
66@@ -150,7 +150,7 @@ class cmd_logout(Command):
67 """
68
69 def __init__(self, parser):
70- super(cmd_logout, self).__init__(parser)
71+ super().__init__(parser)
72 parser.add_argument(
73 "profile_name",
74 metavar="profile-name",
75diff --git a/src/maascli/command.py b/src/maascli/command.py
76index 4c3372f..82c9629 100644
77--- a/src/maascli/command.py
78+++ b/src/maascli/command.py
79@@ -21,7 +21,7 @@ class Command(metaclass=ABCMeta):
80 hidden = False
81
82 def __init__(self, parser):
83- super(Command, self).__init__()
84+ super().__init__()
85 self.parser = parser
86
87 @abstractmethod
88diff --git a/src/maascli/parser.py b/src/maascli/parser.py
89index 36abc16..7eef93b 100644
90--- a/src/maascli/parser.py
91+++ b/src/maascli/parser.py
92@@ -35,7 +35,7 @@ class ArgumentParser(argparse.ArgumentParser):
93 kwargs.setdefault(
94 "formatter_class", argparse.RawDescriptionHelpFormatter
95 )
96- super(ArgumentParser, self).__init__(*args, **kwargs)
97+ super().__init__(*args, **kwargs)
98
99 def add_subparsers(self, title="drill down", metavar="COMMAND", **kwargs):
100 assert (
101diff --git a/src/maascli/snappy.py b/src/maascli/snappy.py
102index 848ad68..fced691 100644
103--- a/src/maascli/snappy.py
104+++ b/src/maascli/snappy.py
105@@ -848,7 +848,7 @@ class cmd_init(SnappyCommand):
106 """
107
108 def __init__(self, parser):
109- super(cmd_init, self).__init__(parser)
110+ super().__init__(parser)
111 monkey_patch_for_all_mode_bw_compatability(parser)
112 subparsers = parser.add_subparsers(
113 metavar=None, title="run modes", dest="run_mode"
114@@ -1116,7 +1116,7 @@ class cmd_config(SnappyCommand):
115 }
116
117 def __init__(self, parser):
118- super(cmd_config, self).__init__(parser)
119+ super().__init__(parser)
120 parser.add_argument(
121 "--show",
122 action="store_true",
123@@ -1298,7 +1298,7 @@ class cmd_migrate(SnappyCommand):
124 """Perform migrations on connected database."""
125
126 def __init__(self, parser):
127- super(cmd_migrate, self).__init__(parser)
128+ super().__init__(parser)
129 # '--configure' is hidden and only called from snap hooks to update the
130 # database when running in "all" mode
131 parser.add_argument(
132diff --git a/src/maascli/tests/test_snappy.py b/src/maascli/tests/test_snappy.py
133index 4e892d2..ed0aaf7 100644
134--- a/src/maascli/tests/test_snappy.py
135+++ b/src/maascli/tests/test_snappy.py
136@@ -26,7 +26,7 @@ from maastesting.testcase import MAASTestCase
137
138 class TestHelpers(MAASTestCase):
139 def setUp(self):
140- super(TestHelpers, self).setUp()
141+ super().setUp()
142 snap_common = self.make_dir()
143 snap_data = self.make_dir()
144 self.environ = {"SNAP_COMMON": snap_common, "SNAP_DATA": snap_data}
145@@ -197,7 +197,7 @@ class TestRenderSupervisord(MAASTestCase):
146 )
147
148 def setUp(self):
149- super(TestRenderSupervisord, self).setUp()
150+ super().setUp()
151 snap = self.make_dir()
152 maas_share = os.path.join(snap, "usr", "share", "maas")
153 os.makedirs(maas_share)
154@@ -304,7 +304,7 @@ class TestSupervisordHelpers(MAASTestCase):
155
156 class TestConfigHelpers(MAASTestCase):
157 def setUp(self):
158- super(TestConfigHelpers, self).setUp()
159+ super().setUp()
160 snap_data = self.make_dir()
161 self.environ = {"SNAP_DATA": snap_data}
162 self.regiond_path = os.path.join(snap_data, "regiond.conf")
163diff --git a/src/maasserver/api/auth.py b/src/maasserver/api/auth.py
164index 5e862e2..5bab847 100644
165--- a/src/maasserver/api/auth.py
166+++ b/src/maasserver/api/auth.py
167@@ -23,7 +23,7 @@ class OAuthUnauthorized(Unauthorized):
168 """Unauthorized error for OAuth signed requests with invalid tokens."""
169
170 def __init__(self, error):
171- super(OAuthUnauthorized, self).__init__()
172+ super().__init__()
173 self.error = error
174 # When the error is an authentication error, use a more
175 # user-friendly error message.
176diff --git a/src/maasserver/api/support.py b/src/maasserver/api/support.py
177index 134298d..ba0729f 100644
178--- a/src/maasserver/api/support.py
179+++ b/src/maasserver/api/support.py
180@@ -53,7 +53,7 @@ class OperationsResource(Resource):
181 return False
182
183 def __call__(self, request, *args, **kwargs):
184- upcall = super(OperationsResource, self).__call__
185+ upcall = super().__call__
186 response = upcall(request, *args, **kwargs)
187 response["X-MAAS-API-Hash"] = get_api_description_hash()
188 return response
189@@ -96,14 +96,12 @@ class RestrictedResource(OperationsResource):
190 handler = RestrictedResource(HandlerClass, authentication=[])
191
192 """
193- super(RestrictedResource, self).__init__(handler, authentication)
194+ super().__init__(handler, authentication)
195 if not self.is_authentication_attempted:
196 raise AssertionError("Authentication must be attempted.")
197
198 def authenticate(self, request, rm):
199- actor, anonymous = super(RestrictedResource, self).authenticate(
200- request, rm
201- )
202+ actor, anonymous = super().authenticate(request, rm)
203 if not anonymous and not request.user.is_active:
204 raise PermissionDenied("User is not allowed access to this API.")
205 else:
206@@ -114,9 +112,7 @@ class AdminRestrictedResource(RestrictedResource):
207 """A resource that's restricted to administrators."""
208
209 def authenticate(self, request, rm):
210- actor, anonymous = super(AdminRestrictedResource, self).authenticate(
211- request, rm
212- )
213+ actor, anonymous = super().authenticate(request, rm)
214 if anonymous or not request.user.is_superuser:
215 raise PermissionDenied("User is not allowed access to this API.")
216 else:
217diff --git a/src/maasserver/api/tests/test_api.py b/src/maasserver/api/tests/test_api.py
218index 3957cc2..50464ec 100644
219--- a/src/maasserver/api/tests/test_api.py
220+++ b/src/maasserver/api/tests/test_api.py
221@@ -148,7 +148,7 @@ class TestStoreNodeParameters(APITestCase.ForUser):
222 """Tests for `store_node_power_parameters`."""
223
224 def setUp(self):
225- super(TestStoreNodeParameters, self).setUp()
226+ super().setUp()
227 self.node = factory.make_Node()
228 self.save = self.patch(self.node, "save")
229 self.request = Mock()
230diff --git a/src/maasserver/api/tests/test_boot_source_selections.py b/src/maasserver/api/tests/test_boot_source_selections.py
231index fd882c8..6a35df6 100644
232--- a/src/maasserver/api/tests/test_boot_source_selections.py
233+++ b/src/maasserver/api/tests/test_boot_source_selections.py
234@@ -32,7 +32,7 @@ def get_boot_source_selection_uri(boot_source_selection):
235
236 class TestBootSourceSelectionAPI(APITestCase.ForUser):
237 def setUp(self):
238- super(TestBootSourceSelectionAPI, self).setUp()
239+ super().setUp()
240 # Disable boot source cache signals.
241 self.addCleanup(bootsources.signals.enable)
242 bootsources.signals.disable()
243@@ -138,7 +138,7 @@ class TestBootSourceSelectionsAPI(APITestCase.ForUser):
244 """Test the the boot source selections API."""
245
246 def setUp(self):
247- super(TestBootSourceSelectionsAPI, self).setUp()
248+ super().setUp()
249 # Disable boot source cache signals.
250 self.addCleanup(bootsources.signals.enable)
251 bootsources.signals.disable()
252diff --git a/src/maasserver/api/tests/test_boot_sources.py b/src/maasserver/api/tests/test_boot_sources.py
253index 1a0bf8e..c16d8ca 100644
254--- a/src/maasserver/api/tests/test_boot_sources.py
255+++ b/src/maasserver/api/tests/test_boot_sources.py
256@@ -27,7 +27,7 @@ def get_boot_source_uri(boot_source):
257
258 class TestBootSourceAPI(APITestCase.ForUser):
259 def setUp(self):
260- super(TestBootSourceAPI, self).setUp()
261+ super().setUp()
262 # Disable boot source cache signals.
263 self.addCleanup(bootsources.signals.enable)
264 bootsources.signals.disable()
265@@ -116,7 +116,7 @@ class TestBootSourcesAPI(APITestCase.ForUser):
266 """Test the the boot source API."""
267
268 def setUp(self):
269- super(TestBootSourcesAPI, self).setUp()
270+ super().setUp()
271 # Disable boot source cache signals.
272 self.addCleanup(bootsources.signals.enable)
273 bootsources.signals.disable()
274diff --git a/src/maasserver/api/tests/test_doc.py b/src/maasserver/api/tests/test_doc.py
275index 8e5bca0..770730b 100644
276--- a/src/maasserver/api/tests/test_doc.py
277+++ b/src/maasserver/api/tests/test_doc.py
278@@ -275,7 +275,7 @@ class TestDescribingAPI(MAASTestCase):
279 """Tests for functions that describe a Piston API."""
280
281 def setUp(self):
282- super(TestDescribingAPI, self).setUp()
283+ super().setUp()
284 # Override config maas url so that it's stable for testing.
285 self.useFixture(
286 RegionConfigurationFixture(maas_url="http://example.com/")
287@@ -625,7 +625,7 @@ class TestGetAPIDescriptionHash(MAASTestCase):
288 """Tests for `get_api_description_hash`."""
289
290 def setUp(self):
291- super(TestGetAPIDescriptionHash, self).setUp()
292+ super().setUp()
293 self.addCleanup(self.clear_hash_cache)
294 self.clear_hash_cache()
295
296diff --git a/src/maasserver/api/tests/test_machine.py b/src/maasserver/api/tests/test_machine.py
297index 242c82c..f95def4 100644
298--- a/src/maasserver/api/tests/test_machine.py
299+++ b/src/maasserver/api/tests/test_machine.py
300@@ -94,7 +94,7 @@ class MachinesAPILoggedInTest(APITestCase.ForUserAndAdmin):
301 """A logged-in user can access the API."""
302
303 def setUp(self):
304- super(MachinesAPILoggedInTest, self).setUp()
305+ super().setUp()
306 self.patch(node_module, "wait_for_power_command")
307 self.patch(node_module.Node, "_start")
308
309@@ -121,7 +121,7 @@ class TestMachineAPI(APITestCase.ForUser):
310 clientfactories = {"oauth": MAASSensibleOAuthClient}
311
312 def setUp(self):
313- super(TestMachineAPI, self).setUp()
314+ super().setUp()
315 self.patch(node_module.Node, "_pc_power_control_node")
316
317 def test_handler_path(self):
318diff --git a/src/maasserver/api/tests/test_machines.py b/src/maasserver/api/tests/test_machines.py
319index f232844..a914b03 100644
320--- a/src/maasserver/api/tests/test_machines.py
321+++ b/src/maasserver/api/tests/test_machines.py
322@@ -815,7 +815,7 @@ class TestMachinesAPI(APITestCase.ForUser):
323
324 def __init__(self, *args, **kwargs):
325 passed_pods.extend(kwargs["pods"])
326- super(FakeComposer, self).__init__(*args, **kwargs)
327+ super().__init__(*args, **kwargs)
328
329 def compose(self):
330 return factory.make_Node(
331@@ -3529,7 +3529,7 @@ class TestMachinesAPI(APITestCase.ForUser):
332
333 class TestPowerState(APITransactionTestCase.ForUser):
334 def setUp(self):
335- super(TestPowerState, self).setUp()
336+ super().setUp()
337 self.useFixture(RegionEventLoopFixture("database-tasks", "rpc"))
338 self.useFixture(RunningEventLoopFixture())
339
340diff --git a/src/maasserver/api/tests/test_node.py b/src/maasserver/api/tests/test_node.py
341index 72b419b..c49b4ab 100644
342--- a/src/maasserver/api/tests/test_node.py
343+++ b/src/maasserver/api/tests/test_node.py
344@@ -69,7 +69,7 @@ class NodesAPILoggedInTest(APITestCase.ForUserAndAdmin):
345 """A logged-in user can access the API."""
346
347 def setUp(self):
348- super(NodesAPILoggedInTest, self).setUp()
349+ super().setUp()
350 self.patch(node_module, "wait_for_power_command")
351
352 def test_nodes_GET_logged_in(self):
353diff --git a/src/maasserver/bootresources.py b/src/maasserver/bootresources.py
354index 3cf6c30..fb4447b 100644
355--- a/src/maasserver/bootresources.py
356+++ b/src/maasserver/bootresources.py
357@@ -1090,7 +1090,7 @@ class BootResourceRepoWriter(BasicMirrorWriter):
358 assert isinstance(store, BootResourceStore)
359 self.store = store
360 self.product_mapping = product_mapping
361- super(BootResourceRepoWriter, self).__init__(
362+ super().__init__(
363 config={
364 # Only download the latest version. Without this all versions
365 # will be downloaded from simplestreams.
366@@ -1507,9 +1507,7 @@ class ImportResourcesService(TimerService, object):
367 """
368
369 def __init__(self, interval=IMPORT_RESOURCES_SERVICE_PERIOD):
370- super(ImportResourcesService, self).__init__(
371- interval.total_seconds(), self.maybe_import_resources
372- )
373+ super().__init__(interval.total_seconds(), self.maybe_import_resources)
374
375 def maybe_import_resources(self):
376 def determine_auto():
377@@ -1543,9 +1541,7 @@ class ImportResourcesProgressService(TimerService, object):
378 """Service to periodically check on the progress of boot imports."""
379
380 def __init__(self, interval=timedelta(minutes=3)):
381- super(ImportResourcesProgressService, self).__init__(
382- interval.total_seconds(), self.try_check_boot_images
383- )
384+ super().__init__(interval.total_seconds(), self.try_check_boot_images)
385
386 def try_check_boot_images(self):
387 return self.check_boot_images().addErrback(
388diff --git a/src/maasserver/clusterrpc/boot_images.py b/src/maasserver/clusterrpc/boot_images.py
389index de7f570..68fe1db 100644
390--- a/src/maasserver/clusterrpc/boot_images.py
391+++ b/src/maasserver/clusterrpc/boot_images.py
392@@ -262,7 +262,7 @@ class RackControllersImporter:
393 :param proxy: The HTTP/HTTPS proxy to use, or `None`
394 :type proxy: :class:`urlparse.ParseResult` or string
395 """
396- super(RackControllersImporter, self).__init__()
397+ super().__init__()
398 self.system_ids = tuple(flatten(system_ids))
399 if isinstance(sources, Sequence):
400 self.sources = sources
401diff --git a/src/maasserver/clusterrpc/tests/test_boot_images.py b/src/maasserver/clusterrpc/tests/test_boot_images.py
402index f557025..399fee4 100644
403--- a/src/maasserver/clusterrpc/tests/test_boot_images.py
404+++ b/src/maasserver/clusterrpc/tests/test_boot_images.py
405@@ -156,7 +156,7 @@ class TestGetBootImages(MAASServerTestCase):
406 """Tests for `get_boot_images`."""
407
408 def setUp(self):
409- super(TestGetBootImages, self).setUp()
410+ super().setUp()
411 prepare_tftp_root(self) # Sets self.tftp_root.
412
413 def test_calls_ListBootImagesV2_before_ListBootImages(self):
414@@ -189,7 +189,7 @@ class TestGetBootImagesTxn(MAASTransactionServerTestCase):
415 """Transactional tests for `get_boot_images`."""
416
417 def setUp(self):
418- super(TestGetBootImagesTxn, self).setUp()
419+ super().setUp()
420 prepare_tftp_root(self) # Sets self.tftp_root.
421
422 def test_returns_boot_images(self):
423@@ -227,7 +227,7 @@ class TestGetAvailableBootImages(MAASTransactionServerTestCase):
424 )
425
426 def setUp(self):
427- super(TestGetAvailableBootImages, self).setUp()
428+ super().setUp()
429 prepare_tftp_root(self) # Sets self.tftp_root.
430
431 def test_returns_boot_images_for_one_cluster(self):
432@@ -337,7 +337,7 @@ class TestGetBootImagesFor(MAASTransactionServerTestCase):
433 """Tests for `get_boot_images_for`."""
434
435 def setUp(self):
436- super(TestGetBootImagesFor, self).setUp()
437+ super().setUp()
438 prepare_tftp_root(self) # Sets self.tftp_root.
439
440 def make_boot_images(self):
441@@ -564,7 +564,7 @@ class TestRackControllersImporterInAction(MAASTransactionServerTestCase):
442 """Live tests for `RackControllersImporter`."""
443
444 def setUp(self):
445- super(TestRackControllersImporterInAction, self).setUp()
446+ super().setUp()
447 # Limit the region's event loop to only the "rpc" service.
448 self.useFixture(RegionEventLoopFixture("rpc"))
449 # Now start the region's event loop.
450diff --git a/src/maasserver/config_forms.py b/src/maasserver/config_forms.py
451index fc2953b..155e4cd 100644
452--- a/src/maasserver/config_forms.py
453+++ b/src/maasserver/config_forms.py
454@@ -275,7 +275,7 @@ class DictCharWidget(forms.widgets.MultiWidget):
455 self.initials = initials
456 self.labels = labels
457 self.skip_check = skip_check
458- super(DictCharWidget, self).__init__(widgets, attrs)
459+ super().__init__(widgets, attrs)
460
461 def render(self, name, value, attrs=None):
462 # value is a list of values, each corresponding to a widget
463diff --git a/src/maasserver/dns/tests/test_config.py b/src/maasserver/dns/tests/test_config.py
464index 3d955c7..2e23102 100644
465--- a/src/maasserver/dns/tests/test_config.py
466+++ b/src/maasserver/dns/tests/test_config.py
467@@ -91,7 +91,7 @@ class TestDNSServer(MAASServerTestCase):
468 """
469
470 def setUp(self):
471- super(TestDNSServer, self).setUp()
472+ super().setUp()
473 # Ensure there's an initial DNS publication. Outside of tests this is
474 # guaranteed by a migration.
475 DNSPublication(source="Initial").save()
476@@ -482,7 +482,7 @@ class TestGetTrustedAcls(MAASServerTestCase):
477 """Test for maasserver/dns/config.py:get_trusted_acls()"""
478
479 def setUp(self):
480- super(TestGetTrustedAcls, self).setUp()
481+ super().setUp()
482 self.useFixture(RegionConfigurationFixture())
483
484 def test_returns_empty_string_if_no_networks(self):
485@@ -511,7 +511,7 @@ class TestGetTrustedNetworks(MAASServerTestCase):
486 """Test for maasserver/dns/config.py:get_trusted_networks()"""
487
488 def setUp(self):
489- super(TestGetTrustedNetworks, self).setUp()
490+ super().setUp()
491 self.useFixture(RegionConfigurationFixture())
492
493 def test_returns_empty_string_if_no_networks(self):
494diff --git a/src/maasserver/dns/tests/test_zonegenerator.py b/src/maasserver/dns/tests/test_zonegenerator.py
495index f47f7d1..0d48710 100644
496--- a/src/maasserver/dns/tests/test_zonegenerator.py
497+++ b/src/maasserver/dns/tests/test_zonegenerator.py
498@@ -329,7 +329,7 @@ class TestZoneGenerator(MAASServerTestCase):
499 """Tests for :class:`ZoneGenerator`."""
500
501 def setUp(self):
502- super(TestZoneGenerator, self).setUp()
503+ super().setUp()
504 self.useFixture(RegionConfigurationFixture())
505
506 def test_empty_yields_nothing(self):
507diff --git a/src/maasserver/dns/zonegenerator.py b/src/maasserver/dns/zonegenerator.py
508index cda8222..7decc8d 100644
509--- a/src/maasserver/dns/zonegenerator.py
510+++ b/src/maasserver/dns/zonegenerator.py
511@@ -39,7 +39,7 @@ class lazydict(dict):
512 __slots__ = ("factory",)
513
514 def __init__(self, factory):
515- super(lazydict, self).__init__()
516+ super().__init__()
517 self.factory = factory
518
519 def __missing__(self, key):
520diff --git a/src/maasserver/eventloop.py b/src/maasserver/eventloop.py
521index fa18ba6..f5b3e4c 100644
522--- a/src/maasserver/eventloop.py
523+++ b/src/maasserver/eventloop.py
524@@ -392,7 +392,7 @@ class RegionEventLoop:
525 }
526
527 def __init__(self):
528- super(RegionEventLoop, self).__init__()
529+ super().__init__()
530 self.services = MAASServices(self)
531 self.handle = None
532 self.master = False
533diff --git a/src/maasserver/exceptions.py b/src/maasserver/exceptions.py
534index 8aceaab..e449790 100644
535--- a/src/maasserver/exceptions.py
536+++ b/src/maasserver/exceptions.py
537@@ -189,11 +189,9 @@ class NodeActionError(MAASException):
538 from maasserver.clusterrpc.utils import get_error_message_for_exception
539
540 if isinstance(error, Exception):
541- super(NodeActionError, self).__init__(
542- get_error_message_for_exception(error)
543- )
544+ super().__init__(get_error_message_for_exception(error))
545 else:
546- super(NodeActionError, self).__init__(error)
547+ super().__init__(error)
548
549
550 class UnresolvableHost(MAASException):
551diff --git a/src/maasserver/fields.py b/src/maasserver/fields.py
552index 8aed123..4623422 100644
553--- a/src/maasserver/fields.py
554+++ b/src/maasserver/fields.py
555@@ -56,7 +56,7 @@ class Field(_BrokenField):
556
557 def __init__(self, *args, validators=None, **kwargs):
558 kwargs["validators"] = [] if validators is None else validators
559- super(Field, self).__init__(*args, **kwargs)
560+ super().__init__(*args, **kwargs)
561
562
563 MAC_RE = re.compile(
564@@ -105,7 +105,7 @@ class StrippedCharField(forms.CharField):
565
566 def clean(self, value):
567 value = self.to_python(value).strip()
568- return super(StrippedCharField, self).clean(value)
569+ return super().clean(value)
570
571
572 class UnstrippedCharField(forms.CharField):
573@@ -119,7 +119,7 @@ class UnstrippedCharField(forms.CharField):
574 def __init__(self, *args, **kwargs):
575 # Instead of relying on a version check, we check for CharField
576 # constructor having a strip kwarg instead.
577- parent_init = super(UnstrippedCharField, self).__init__
578+ parent_init = super().__init__
579 if "strip" in parent_init.__code__.co_varnames:
580 parent_init(*args, strip=False, **kwargs)
581 else:
582@@ -135,7 +135,7 @@ class VerboseRegexField(forms.CharField):
583 :param regex: Either a string or a compiled regular expression object.
584 :param message: Error message to use when the validation fails.
585 """
586- super(VerboseRegexField, self).__init__(*args, **kwargs)
587+ super().__init__(*args, **kwargs)
588 self.validators.append(
589 VerboseRegexValidator(regex=regex, message=message)
590 )
591@@ -145,9 +145,7 @@ class MACAddressFormField(VerboseRegexField):
592 """Form field type: MAC address."""
593
594 def __init__(self, *args, **kwargs):
595- super(MACAddressFormField, self).__init__(
596- regex=MAC_RE, message=MAC_ERROR_MSG, *args, **kwargs
597- )
598+ super().__init__(regex=MAC_RE, message=MAC_ERROR_MSG, *args, **kwargs)
599
600
601 class MACAddressField(Field):
602@@ -167,7 +165,7 @@ class MACAddressField(Field):
603 return MAC(value)
604
605 def get_prep_value(self, value):
606- value = super(MACAddressField, self).get_prep_value(value)
607+ value = super().get_prep_value(value)
608 # Convert empty string to None.
609 if not value:
610 return None
611@@ -188,9 +186,9 @@ class MAC:
612 if value is None:
613 return None
614 elif isinstance(value, (bytes, str)):
615- return None if len(value) == 0 else super(MAC, cls).__new__(cls)
616+ return None if len(value) == 0 else super().__new__(cls)
617 else:
618- return super(MAC, cls).__new__(cls)
619+ return super().__new__(cls)
620
621 def __init__(self, value):
622 """Wrap a MAC address, or None, into a `MAC`.
623@@ -362,7 +360,7 @@ class EditableBinaryField(BinaryField):
624 """
625
626 def __init__(self, *args, **kwargs):
627- super(EditableBinaryField, self).__init__(*args, **kwargs)
628+ super().__init__(*args, **kwargs)
629 self.editable = True
630
631 def deconstruct(self):
632@@ -493,7 +491,7 @@ class LargeObjectField(IntegerField):
633
634 def __init__(self, *args, **kwargs):
635 self.block_size = kwargs.pop("block_size", 1 << 16)
636- super(LargeObjectField, self).__init__(*args, **kwargs)
637+ super().__init__(*args, **kwargs)
638
639 @property
640 def validators(self):
641@@ -508,7 +506,7 @@ class LargeObjectField(IntegerField):
642
643 def contribute_to_class(self, cls, name):
644 """Set the descriptor for the large object."""
645- super(LargeObjectField, self).contribute_to_class(cls, name)
646+ super().contribute_to_class(cls, name)
647 setattr(cls, self.name, LargeObjectDescriptor(self))
648
649 def get_db_prep_value(self, value, connection=None, prepared=False):
650@@ -574,7 +572,7 @@ class CIDRField(Field):
651 def formfield(self, **kwargs):
652 defaults = {"form_class": forms.CharField}
653 defaults.update(kwargs)
654- return super(CIDRField, self).formfield(**defaults)
655+ return super().formfield(**defaults)
656
657
658 class IPv4CIDRField(CIDRField):
659@@ -750,7 +748,7 @@ class CaseInsensitiveChoiceField(forms.ChoiceField):
660 def to_python(self, value):
661 if value not in self.empty_values:
662 value = value.lower()
663- return super(CaseInsensitiveChoiceField, self).to_python(value)
664+ return super().to_python(value)
665
666
667 class SpecifierOrModelChoiceField(forms.ModelChoiceField):
668@@ -760,7 +758,7 @@ class SpecifierOrModelChoiceField(forms.ModelChoiceField):
669
670 def to_python(self, value):
671 try:
672- return super(SpecifierOrModelChoiceField, self).to_python(value)
673+ return super().to_python(value)
674 except ValidationError as e:
675 if isinstance(value, str):
676 object_id = self.queryset.get_object_id(value)
677@@ -794,10 +792,10 @@ class DomainNameField(CharField):
678 validators = kwargs.pop("validators", [])
679 validators.append(validate_domain_name)
680 kwargs["validators"] = validators
681- super(DomainNameField, self).__init__(*args, **kwargs)
682+ super().__init__(*args, **kwargs)
683
684 def deconstruct(self):
685- name, path, args, kwargs = super(DomainNameField, self).deconstruct()
686+ name, path, args, kwargs = super().deconstruct()
687 del kwargs["validators"]
688 return name, path, args, kwargs
689
690@@ -808,7 +806,7 @@ class DomainNameField(CharField):
691 # https://docs.djangoproject.com/en/1.6/ref/forms/validation/
692 # https://code.djangoproject.com/ticket/6362
693 def to_python(self, value):
694- value = super(DomainNameField, self).to_python(value)
695+ value = super().to_python(value)
696 if value is None:
697 return None
698 value = value.strip().rstrip(".")
699diff --git a/src/maasserver/fields_storage.py b/src/maasserver/fields_storage.py
700index f010b9f..65b7875 100644
701--- a/src/maasserver/fields_storage.py
702+++ b/src/maasserver/fields_storage.py
703@@ -38,7 +38,7 @@ class BytesOrPercentageField(forms.RegexField):
704 self.min_value = kwargs.pop("min_value", None)
705 self.max_value = kwargs.pop("max_value", None)
706 regex = r"^(%s|%s)$" % (PERCENTAGE_REGEX, BYTES_REGEX)
707- super(BytesOrPercentageField, self).__init__(regex, *args, **kwargs)
708+ super().__init__(regex, *args, **kwargs)
709
710 def to_python(self, value):
711 if value is not None:
712@@ -47,7 +47,7 @@ class BytesOrPercentageField(forms.RegexField):
713 return value
714
715 def clean(self, value):
716- value = super(BytesOrPercentageField, self).clean(value)
717+ value = super().clean(value)
718 if value is not None:
719 # Exit early if this is percentage value.
720 if is_percentage(value):
721diff --git a/src/maasserver/forms/__init__.py b/src/maasserver/forms/__init__.py
722index 62e1ecd..3a95695 100644
723--- a/src/maasserver/forms/__init__.py
724+++ b/src/maasserver/forms/__init__.py
725@@ -210,7 +210,7 @@ class APIEditMixin:
726 self.data = get_overridden_query_dict(
727 self.initial, self.data, self.fields
728 )
729- super(APIEditMixin, self).full_clean()
730+ super().full_clean()
731
732 def _post_clean(self):
733 """Override Django's private hook _post_save to remove None values
734@@ -221,7 +221,7 @@ class APIEditMixin:
735 before that.
736 """
737 self.cleaned_data = remove_None_values(self.cleaned_data)
738- super(APIEditMixin, self)._post_clean()
739+ super()._post_clean()
740
741
742 class WithPowerTypeMixin:
743@@ -232,7 +232,7 @@ class WithPowerTypeMixin:
744 """
745
746 def __init__(self, *args, **kwargs):
747- super(WithPowerTypeMixin, self).__init__(*args, **kwargs)
748+ super().__init__(*args, **kwargs)
749 self.data = self.data.copy()
750 WithPowerTypeMixin.set_up_power_fields(self, self.data)
751
752@@ -377,12 +377,12 @@ class WithPowerTypeMixin:
753 )
754
755 def clean(self):
756- cleaned_data = super(WithPowerTypeMixin, self).clean()
757+ cleaned_data = super().clean()
758 return WithPowerTypeMixin.check_driver(self, cleaned_data)
759
760 def save(self, *args, **kwargs):
761 """Persist the node into the database."""
762- node = super(WithPowerTypeMixin, self).save()
763+ node = super().save()
764 WithPowerTypeMixin.set_values(self, node)
765 node.save()
766 return node
767@@ -423,7 +423,7 @@ class MAASModelForm(
768 """
769
770 def __init__(self, data=None, files=None, ui_submission=False, **kwargs):
771- super(MAASModelForm, self).__init__(data=data, files=files, **kwargs)
772+ super().__init__(data=data, files=files, **kwargs)
773 self.is_update = bool(kwargs.get("instance", None))
774 if ui_submission:
775 # Add the ui_submission field. Insert it before the other fields,
776@@ -448,7 +448,7 @@ class MAASModelForm(
777 error_dict = errors
778 else:
779 error_dict = ValidationError({NON_FIELD_ERRORS: errors})
780- super(MAASModelForm, self)._update_errors(error_dict)
781+ super()._update_errors(error_dict)
782
783 def use_perms(self):
784 """Return True if the form should use permissions."""
785@@ -607,7 +607,7 @@ class CheckboxInputTrueDefault(CheckboxInput):
786
787 class NodeForm(MAASModelForm):
788 def __init__(self, request=None, *args, **kwargs):
789- super(NodeForm, self).__init__(*args, **kwargs)
790+ super().__init__(*args, **kwargs)
791
792 # Even though it doesn't need it and doesn't use it, this form accepts
793 # a parameter named 'request' because it is used interchangingly
794@@ -711,7 +711,7 @@ class NodeForm(MAASModelForm):
795
796 class MachineForm(NodeForm):
797 def __init__(self, request=None, requires_arch=False, *args, **kwargs):
798- super(MachineForm, self).__init__(*args, **kwargs)
799+ super().__init__(*args, **kwargs)
800
801 # Even though it doesn't need it and doesn't use it, this form accepts
802 # a parameter named 'request' because it is used interchangingly
803@@ -817,7 +817,7 @@ class MachineForm(NodeForm):
804 return validate_min_hwe_kernel(min_hwe_kernel)
805
806 def clean(self):
807- cleaned_data = super(MachineForm, self).clean()
808+ cleaned_data = super().clean()
809
810 if not self.instance.hwe_kernel:
811 osystem = cleaned_data.get("osystem")
812@@ -838,7 +838,7 @@ class MachineForm(NodeForm):
813 return cleaned_data
814
815 def is_valid(self):
816- is_valid = super(MachineForm, self).is_valid()
817+ is_valid = super().is_valid()
818 if not is_valid:
819 return False
820 if len(list_all_usable_architectures()) == 0:
821@@ -922,7 +922,7 @@ class MachineForm(NodeForm):
822 commission = not self.instance.id and self.cleaned_data["commission"]
823 if commission:
824 self.instance.status = NODE_STATUS.COMMISSIONING
825- machine = super(MachineForm, self).save(*args, **kwargs)
826+ machine = super().save(*args, **kwargs)
827 # For a ScriptSet to be created it must be associated with a Node
828 # object in the database.
829 if commission:
830@@ -975,7 +975,7 @@ class DeviceForm(NodeForm):
831 fields = NodeForm.Meta.fields + ("description", "parent", "zone")
832
833 def __init__(self, request=None, *args, **kwargs):
834- super(DeviceForm, self).__init__(*args, **kwargs)
835+ super().__init__(*args, **kwargs)
836 self.request = request
837
838 instance = kwargs.get("instance")
839@@ -988,7 +988,7 @@ class DeviceForm(NodeForm):
840 return user.has_perm(NodePermission.view)
841
842 def save(self, commit=True):
843- device = super(DeviceForm, self).save(commit=False)
844+ device = super().save(commit=False)
845 device.node_type = NODE_TYPE.DEVICE
846 if self.new_node:
847 # Set the owner: devices are owned by their creator.
848@@ -1032,21 +1032,19 @@ class ControllerForm(MAASModelForm, WithPowerTypeMixin):
849 )
850
851 def __init__(self, data=None, instance=None, request=None, **kwargs):
852- super(ControllerForm, self).__init__(
853- data=data, instance=instance, **kwargs
854- )
855+ super().__init__(data=data, instance=instance, **kwargs)
856 WithPowerTypeMixin.set_up_power_fields(self, data, instance)
857 if instance is not None:
858 self.initial["zone"] = instance.zone.name
859 self.initial["domain"] = instance.domain.name
860
861 def clean(self):
862- cleaned_data = super(ControllerForm, self).clean()
863+ cleaned_data = super().clean()
864 return WithPowerTypeMixin.check_driver(self, cleaned_data)
865
866 def save(self, *args, **kwargs):
867 """Persist the node into the database."""
868- controller = super(ControllerForm, self).save(commit=False)
869+ controller = super().save(commit=False)
870 zone = self.cleaned_data.get("zone")
871 if zone:
872 controller.zone = zone
873@@ -1094,9 +1092,7 @@ class AdminNodeForm(NodeForm):
874 fields = NodeForm.Meta.fields + ("cpu_count", "description", "memory")
875
876 def __init__(self, data=None, instance=None, request=None, **kwargs):
877- super(AdminNodeForm, self).__init__(
878- data=data, instance=instance, **kwargs
879- )
880+ super().__init__(data=data, instance=instance, **kwargs)
881 self.request = request
882 self.set_up_initial_zone(instance)
883 # The zone field is not required because we want to be able
884@@ -1119,7 +1115,7 @@ class AdminNodeForm(NodeForm):
885
886 def save(self, *args, **kwargs):
887 """Persist the node into the database."""
888- node = super(AdminNodeForm, self).save(commit=False)
889+ node = super().save(commit=False)
890 zone = self.cleaned_data.get("zone")
891 if zone:
892 node.zone = zone
893@@ -1145,18 +1141,16 @@ class AdminMachineForm(MachineForm, AdminNodeForm, WithPowerTypeMixin):
894 )
895
896 def __init__(self, data=None, instance=None, request=None, **kwargs):
897- super(AdminMachineForm, self).__init__(
898- data=data, instance=instance, **kwargs
899- )
900+ super().__init__(data=data, instance=instance, **kwargs)
901 WithPowerTypeMixin.set_up_power_fields(self, data, instance)
902
903 def clean(self):
904- cleaned_data = super(AdminMachineForm, self).clean()
905+ cleaned_data = super().clean()
906 return WithPowerTypeMixin.check_driver(self, cleaned_data)
907
908 def save(self, *args, **kwargs):
909 """Persist the node into the database."""
910- machine = super(AdminMachineForm, self).save(commit=False)
911+ machine = super().save(commit=False)
912 zone = self.cleaned_data.get("zone")
913 if zone:
914 machine.zone = zone
915@@ -1188,7 +1182,7 @@ class KeyForm(MAASModelForm):
916 """Base class for `SSHKeyForm` and `SSLKeyForm`."""
917
918 def __init__(self, user, *args, **kwargs):
919- super(KeyForm, self).__init__(*args, **kwargs)
920+ super().__init__(*args, **kwargs)
921 self.user = user
922
923 def validate_unique(self):
924@@ -1233,7 +1227,7 @@ class SSHKeyForm(MAASModelForm):
925 self.instance.user = user
926
927 def save(self, endpoint, request):
928- sshkey = super(SSHKeyForm, self).save()
929+ sshkey = super().save()
930 if self.instance.user is request.user:
931 description = "Created SSH key."
932 else:
933@@ -1260,7 +1254,7 @@ class SSLKeyForm(KeyForm):
934 fields = ["key"]
935
936 def save(self, endpoint, request):
937- sslkey = super(SSLKeyForm, self).save()
938+ sslkey = super().save()
939 create_audit_event(
940 EVENT_TYPES.AUTHORISATION,
941 endpoint,
942@@ -1274,7 +1268,7 @@ class SSLKeyForm(KeyForm):
943 class MultipleMACAddressField(forms.MultiValueField):
944 def __init__(self, nb_macs=1, *args, **kwargs):
945 fields = [MACAddressFormField() for _ in range(nb_macs)]
946- super(MultipleMACAddressField, self).__init__(fields, *args, **kwargs)
947+ super().__init__(fields, *args, **kwargs)
948
949 def compress(self, data_list):
950 if data_list:
951@@ -1326,7 +1320,7 @@ class WithMACAddressesMixin:
952 """
953
954 def __init__(self, *args, **kwargs):
955- super(WithMACAddressesMixin, self).__init__(*args, **kwargs)
956+ super().__init__(*args, **kwargs)
957 # This is a workaround for a Django bug in which self.data (which is
958 # supposed to be a QueryDict) ends up being a normal Python dict.
959 # This class requires a QueryDict (which it seems like Django should
960@@ -1344,7 +1338,7 @@ class WithMACAddressesMixin:
961 self.data["mac_addresses"] = macs
962
963 def is_valid(self):
964- valid = super(WithMACAddressesMixin, self).is_valid()
965+ valid = super().is_valid()
966 # If the number of MAC address fields is > 1, provide a unified
967 # error message if the validation has failed.
968 reformat_mac_address_error = (
969@@ -1396,7 +1390,7 @@ class WithMACAddressesMixin:
970
971 This implementation of `save` does not support the `commit` argument.
972 """
973- node = super(WithMACAddressesMixin, self).save()
974+ node = super().save()
975 architecture = self.cleaned_data.get("architecture")
976 power_type = self.cleaned_data.get("power_type")
977 # If a new node with an IPMI BMC is created the user doesn't have
978@@ -1516,7 +1510,7 @@ class NewUserCreationForm(UserCreationForm):
979 self.cleaned_data["password2"] = None
980
981 def save(self, commit=True):
982- user = super(NewUserCreationForm, self).save(commit=False)
983+ user = super().save(commit=False)
984 if self.cleaned_data.get("is_superuser", False):
985 user.is_superuser = True
986 new_last_name = self.cleaned_data.get("last_name", None)
987@@ -1555,7 +1549,7 @@ class EditUserForm(UserChangeForm):
988 fields = ("username", "last_name", "email", "is_superuser")
989
990 def __init__(self, *args, **kwargs):
991- super(EditUserForm, self).__init__(*args, **kwargs)
992+ super().__init__(*args, **kwargs)
993 # Django 1.4 overrides the field 'password' thus adding it
994 # post-facto to the list of the selected fields (Meta.fields).
995 # Here we don't want to use this form to edit the password.
996@@ -1583,7 +1577,7 @@ class ConfigForm(Form):
997 config_fields = None
998
999 def __init__(self, *args, **kwargs):
1000- super(ConfigForm, self).__init__(*args, **kwargs)
1001+ super().__init__(*args, **kwargs)
1002 if "initial" not in kwargs:
1003 self._load_initials()
1004
1005@@ -1757,7 +1751,7 @@ class DeployForm(ConfigForm):
1006 return field
1007
1008 def _load_initials(self):
1009- super(DeployForm, self)._load_initials()
1010+ super()._load_initials()
1011 initial_os = self.fields["default_osystem"].initial
1012 initial_series = self.fields["default_distro_series"].initial
1013 self.initial["default_distro_series"] = "%s/%s" % (
1014@@ -1792,7 +1786,7 @@ class UbuntuForm(Form):
1015 )
1016
1017 def __init__(self, *args, **kwargs):
1018- super(UbuntuForm, self).__init__(*args, **kwargs)
1019+ super().__init__(*args, **kwargs)
1020 self._load_initials()
1021
1022 def _load_initials(self):
1023@@ -1912,7 +1906,7 @@ class ValidatorMultipleChoiceField(MultipleChoiceField):
1024 """A MultipleChoiceField validating each given choice with a validator."""
1025
1026 def __init__(self, validator, **kwargs):
1027- super(ValidatorMultipleChoiceField, self).__init__(**kwargs)
1028+ super().__init__(**kwargs)
1029 self.validator = validator
1030
1031 def validate(self, values):
1032@@ -1950,7 +1944,7 @@ class InstanceListField(UnconstrainedMultipleChoiceField):
1033 the names that didn't correspond to a valid instance
1034 respectively.
1035 """
1036- super(InstanceListField, self).__init__(*args, **kwargs)
1037+ super().__init__(*args, **kwargs)
1038 self.model_class = model_class
1039 self.field_name = field_name
1040 if text_for_invalid_object is None:
1041@@ -1989,7 +1983,7 @@ class BulkNodeSetZoneForm(Form):
1042 system_id = UnconstrainedMultipleChoiceField()
1043
1044 def __init__(self, user, request=None, *args, **kwargs):
1045- super(BulkNodeSetZoneForm, self).__init__(*args, **kwargs)
1046+ super().__init__(*args, **kwargs)
1047 self.user = user
1048 self.request = request
1049 self.fields["zone"] = forms.ModelChoiceField(
1050@@ -2114,7 +2108,7 @@ class BootSourceForm(MAASModelForm):
1051 )
1052
1053 def __init__(self, **kwargs):
1054- super(BootSourceForm, self).__init__(**kwargs)
1055+ super().__init__(**kwargs)
1056
1057 def clean_keyring_data(self):
1058 """Process 'keyring_data' field.
1059@@ -2144,14 +2138,14 @@ class BootSourceSelectionForm(MAASModelForm):
1060 labels = UnconstrainedMultipleChoiceField(label="Label list")
1061
1062 def __init__(self, boot_source=None, **kwargs):
1063- super(BootSourceSelectionForm, self).__init__(**kwargs)
1064+ super().__init__(**kwargs)
1065 if "instance" in kwargs:
1066 self.boot_source = kwargs["instance"].boot_source
1067 else:
1068 self.boot_source = boot_source
1069
1070 def clean(self):
1071- cleaned_data = super(BootSourceSelectionForm, self).clean()
1072+ cleaned_data = super().clean()
1073
1074 # Don't filter on OS if not provided. This is to maintain
1075 # backwards compatibility for when OS didn't exist in the API.
1076@@ -2216,9 +2210,7 @@ class BootSourceSelectionForm(MAASModelForm):
1077 return cleaned_data
1078
1079 def save(self, *args, **kwargs):
1080- boot_source_selection = super(BootSourceSelectionForm, self).save(
1081- commit=False
1082- )
1083+ boot_source_selection = super().save(commit=False)
1084 boot_source_selection.boot_source = self.boot_source
1085 if kwargs.get("commit", True):
1086 boot_source_selection.save()
1087@@ -2233,7 +2225,7 @@ class LicenseKeyForm(MAASModelForm):
1088 fields = ("osystem", "distro_series", "license_key")
1089
1090 def __init__(self, *args, **kwargs):
1091- super(LicenseKeyForm, self).__init__(*args, **kwargs)
1092+ super().__init__(*args, **kwargs)
1093 self.set_up_osystem_and_distro_series_fields(kwargs.get("instance"))
1094
1095 def set_up_osystem_and_distro_series_fields(self, instance):
1096@@ -2286,7 +2278,7 @@ class LicenseKeyForm(MAASModelForm):
1097 for selected operating system and series."""
1098 # Get the clean_data, check that all of the fields we need are
1099 # present. If not then the form will error, so no reason to continue.
1100- cleaned_data = super(LicenseKeyForm, self).clean()
1101+ cleaned_data = super().clean()
1102 required_fields = ["license_key", "osystem", "distro_series"]
1103 for field in required_fields:
1104 if field not in cleaned_data:
1105@@ -2357,7 +2349,7 @@ class BootResourceForm(MAASModelForm):
1106 keep_old = forms.BooleanField(required=False)
1107
1108 def __init__(self, *args, **kwargs):
1109- super(BootResourceForm, self).__init__(*args, **kwargs)
1110+ super().__init__(*args, **kwargs)
1111 self.set_up_architecture_field()
1112
1113 def set_up_architecture_field(self):
1114@@ -2502,7 +2494,7 @@ class BootResourceForm(MAASModelForm):
1115
1116 This implementation of `save` does not support the `commit` argument.
1117 """
1118- resource = super(BootResourceForm, self).save(commit=False)
1119+ resource = super().save(commit=False)
1120 resource.rtype = BOOT_RESOURCE_TYPE.UPLOADED
1121 resource = self.get_existing_resource(resource)
1122 resource.extra = {"subarches": resource.architecture.split("/")[1]}
1123@@ -2546,7 +2538,7 @@ class BootResourceNoContentForm(BootResourceForm):
1124 size = forms.IntegerField(label="Size", required=True)
1125
1126 def __init__(self, *args, **kwargs):
1127- super(BootResourceNoContentForm, self).__init__(*args, **kwargs)
1128+ super().__init__(*args, **kwargs)
1129 # Remove content field, as this form does not use it
1130 del self.fields["content"]
1131
1132@@ -2609,7 +2601,7 @@ class UUID4Field(forms.RegexField):
1133 )
1134 kwargs["min_length"] = 32
1135 kwargs["max_length"] = 36
1136- super(UUID4Field, self).__init__(regex, *args, **kwargs)
1137+ super().__init__(regex, *args, **kwargs)
1138
1139
1140 class AbsolutePathField(forms.RegexField):
1141@@ -2632,7 +2624,7 @@ class AbsolutePathField(forms.RegexField):
1142 # large.
1143 #
1144 kwargs["max_length"] = 4095
1145- super(AbsolutePathField, self).__init__(regex, *args, **kwargs)
1146+ super().__init__(regex, *args, **kwargs)
1147
1148
1149 class BytesField(forms.RegexField):
1150@@ -2648,7 +2640,7 @@ class BytesField(forms.RegexField):
1151 else:
1152 self.max_value = None
1153 regex = r"^-?[0-9]+([KkMmGgTtPpEe]{1})?$"
1154- super(BytesField, self).__init__(regex, *args, **kwargs)
1155+ super().__init__(regex, *args, **kwargs)
1156
1157 def to_python(self, value):
1158 if value is not None:
1159@@ -2657,7 +2649,7 @@ class BytesField(forms.RegexField):
1160 return value
1161
1162 def clean(self, value):
1163- value = super(BytesField, self).clean(value)
1164+ value = super().clean(value)
1165 if value is not None:
1166 value = machine_readable_bytes(value)
1167
1168@@ -2683,7 +2675,7 @@ class FormatBlockDeviceForm(Form):
1169 label = forms.CharField(required=False)
1170
1171 def __init__(self, block_device, *args, **kwargs):
1172- super(FormatBlockDeviceForm, self).__init__(*args, **kwargs)
1173+ super().__init__(*args, **kwargs)
1174 self.block_device = block_device
1175 self.node = block_device.get_node()
1176
1177@@ -2691,7 +2683,7 @@ class FormatBlockDeviceForm(Form):
1178 """Validate block device doesn't have a partition table."""
1179 # Get the clean_data, check that all of the fields we need are
1180 # present. If not then the form will error, so no reason to continue.
1181- cleaned_data = super(FormatBlockDeviceForm, self).clean()
1182+ cleaned_data = super().clean()
1183 if "fstype" not in cleaned_data:
1184 return cleaned_data
1185 partition_table = PartitionTable.objects.filter(
1186@@ -2743,7 +2735,7 @@ class AddPartitionForm(Form):
1187 uuid = UUID4Field(required=False)
1188
1189 def __init__(self, block_device, *args, **kwargs):
1190- super(AddPartitionForm, self).__init__(*args, **kwargs)
1191+ super().__init__(*args, **kwargs)
1192 self.block_device = block_device
1193 self.set_up_fields()
1194
1195@@ -2779,7 +2771,7 @@ class FormatPartitionForm(Form):
1196 label = forms.CharField(required=False)
1197
1198 def __init__(self, partition, *args, **kwargs):
1199- super(FormatPartitionForm, self).__init__(*args, **kwargs)
1200+ super().__init__(*args, **kwargs)
1201 self.partition = partition
1202 self.node = partition.get_node()
1203
1204@@ -3001,7 +2993,7 @@ class UpdateVirtualBlockDeviceForm(
1205 fields = ["name", "uuid", "size"]
1206
1207 def clean(self):
1208- cleaned_data = super(UpdateVirtualBlockDeviceForm, self).clean()
1209+ cleaned_data = super().clean()
1210 is_logical_volume = self.instance.filesystem_group.is_lvm()
1211 size_has_changed = (
1212 "size" in self.cleaned_data
1213@@ -3158,12 +3150,12 @@ class CreateCacheSetForm(Form):
1214 clean_cache_partition = clean_partition_name_to_id("cache_partition")
1215
1216 def __init__(self, node, *args, **kwargs):
1217- super(CreateCacheSetForm, self).__init__(*args, **kwargs)
1218+ super().__init__(*args, **kwargs)
1219 self.node = node
1220 self._set_up_field_choices()
1221
1222 def clean(self):
1223- cleaned_data = super(CreateCacheSetForm, self).clean()
1224+ cleaned_data = super().clean()
1225 cache_device = self.cleaned_data.get("cache_device")
1226 cache_partition = self.cleaned_data.get("cache_partition")
1227 if cache_device and cache_partition:
1228@@ -3234,13 +3226,13 @@ class UpdateCacheSetForm(Form):
1229 clean_cache_partition = clean_partition_name_to_id("cache_partition")
1230
1231 def __init__(self, cache_set, *args, **kwargs):
1232- super(UpdateCacheSetForm, self).__init__(*args, **kwargs)
1233+ super().__init__(*args, **kwargs)
1234 self.cache_set = cache_set
1235 self.node = cache_set.get_node()
1236 self._set_up_field_choices()
1237
1238 def clean(self):
1239- cleaned_data = super(UpdateCacheSetForm, self).clean()
1240+ cleaned_data = super().clean()
1241 if self.cleaned_data.get("cache_device") and self.cleaned_data.get(
1242 "cache_partition"
1243 ):
1244@@ -3321,13 +3313,13 @@ class CreateBcacheForm(Form):
1245 clean_cache_set = clean_cache_set_name_to_id("cache_set")
1246
1247 def __init__(self, node, *args, **kwargs):
1248- super(CreateBcacheForm, self).__init__(*args, **kwargs)
1249+ super().__init__(*args, **kwargs)
1250 self.node = node
1251 self._set_up_field_choices()
1252
1253 def clean(self):
1254 """Makes sure the Bcache is sensible."""
1255- cleaned_data = super(CreateBcacheForm, self).clean()
1256+ cleaned_data = super().clean()
1257 Bcache.objects.validate_bcache_creation_parameters(
1258 cache_set=self.cleaned_data.get("cache_set"),
1259 cache_mode=self.cleaned_data.get("cache_mode"),
1260@@ -3407,7 +3399,7 @@ class UpdateBcacheForm(Form):
1261 clean_cache_set = clean_cache_set_name_to_id("cache_set")
1262
1263 def __init__(self, bcache, *args, **kwargs):
1264- super(UpdateBcacheForm, self).__init__(*args, **kwargs)
1265+ super().__init__(*args, **kwargs)
1266 self.bcache = bcache
1267 self.node = bcache.get_node()
1268 self._set_up_field_choices()
1269@@ -3572,12 +3564,12 @@ class CreateRaidForm(Form):
1270 self.fields["spare_partitions"].choices = partition_choices
1271
1272 def __init__(self, node, *args, **kwargs):
1273- super(CreateRaidForm, self).__init__(*args, **kwargs)
1274+ super().__init__(*args, **kwargs)
1275 self.node = node
1276 self._set_up_field_choices()
1277
1278 def clean(self):
1279- cleaned_data = super(CreateRaidForm, self).clean()
1280+ cleaned_data = super().clean()
1281 # It is not possible to create a RAID without any devices or
1282 # partitions, but we catch this situation here in order to provide a
1283 # clearer error message.
1284@@ -3678,7 +3670,7 @@ class UpdateRaidForm(Form):
1285 )
1286
1287 def __init__(self, raid, *args, **kwargs):
1288- super(UpdateRaidForm, self).__init__(*args, **kwargs)
1289+ super().__init__(*args, **kwargs)
1290 self.raid = raid
1291 self.set_up_field_choices()
1292
1293@@ -3858,7 +3850,7 @@ class CreateVolumeGroupForm(Form):
1294 clean_partitions = clean_partition_names_to_ids("partitions")
1295
1296 def __init__(self, node, *args, **kwargs):
1297- super(CreateVolumeGroupForm, self).__init__(*args, **kwargs)
1298+ super().__init__(*args, **kwargs)
1299 self.node = node
1300 self.set_up_choice_fields()
1301
1302@@ -3885,7 +3877,7 @@ class CreateVolumeGroupForm(Form):
1303
1304 def clean(self):
1305 """Validate that at least one block device or partition is given."""
1306- cleaned_data = super(CreateVolumeGroupForm, self).clean()
1307+ cleaned_data = super().clean()
1308 if "name" not in cleaned_data:
1309 return cleaned_data
1310 has_block_devices = (
1311@@ -3951,7 +3943,7 @@ class UpdateVolumeGroupForm(Form):
1312 clean_remove_partitions = clean_partition_names_to_ids("remove_partitions")
1313
1314 def __init__(self, volume_group, *args, **kwargs):
1315- super(UpdateVolumeGroupForm, self).__init__(*args, **kwargs)
1316+ super().__init__(*args, **kwargs)
1317 self.volume_group = volume_group
1318 self.set_up_choice_fields()
1319
1320@@ -4047,7 +4039,7 @@ class CreateLogicalVolumeForm(Form):
1321 uuid = UUID4Field(required=False)
1322
1323 def __init__(self, volume_group, *args, **kwargs):
1324- super(CreateLogicalVolumeForm, self).__init__(*args, **kwargs)
1325+ super().__init__(*args, **kwargs)
1326 self.volume_group = volume_group
1327 self.set_up_fields()
1328
1329@@ -4064,7 +4056,7 @@ class CreateLogicalVolumeForm(Form):
1330
1331 def clean(self):
1332 """Validate that at least one block device or partition is given."""
1333- cleaned_data = super(CreateLogicalVolumeForm, self).clean()
1334+ cleaned_data = super().clean()
1335 if self.volume_group.get_lvm_free_space() < MIN_BLOCK_DEVICE_SIZE:
1336 # Remove the size errors. They are confusing because the
1337 # minimum is larger than the maximum.
1338diff --git a/src/maasserver/forms/dhcpsnippet.py b/src/maasserver/forms/dhcpsnippet.py
1339index 725af9f..b5e3cd0 100644
1340--- a/src/maasserver/forms/dhcpsnippet.py
1341+++ b/src/maasserver/forms/dhcpsnippet.py
1342@@ -134,7 +134,7 @@ class DHCPSnippetForm(MAASModelForm):
1343 return valid
1344
1345 def save(self, endpoint, request):
1346- dhcp_snippet = super(DHCPSnippetForm, self).save()
1347+ dhcp_snippet = super().save()
1348 create_audit_event(
1349 EVENT_TYPES.SETTINGS,
1350 endpoint,
1351diff --git a/src/maasserver/forms/filesystem.py b/src/maasserver/forms/filesystem.py
1352index c347e2e..b91eca6 100644
1353--- a/src/maasserver/forms/filesystem.py
1354+++ b/src/maasserver/forms/filesystem.py
1355@@ -25,7 +25,7 @@ class MountFilesystemForm(Form):
1356
1357 @typed
1358 def __init__(self, filesystem: Optional[Filesystem], *args, **kwargs):
1359- super(MountFilesystemForm, self).__init__(*args, **kwargs)
1360+ super().__init__(*args, **kwargs)
1361 self.filesystem = filesystem
1362 self.setup()
1363
1364@@ -36,7 +36,7 @@ class MountFilesystemForm(Form):
1365 self.fields["mount_options"] = StrippedCharField(required=False)
1366
1367 def clean(self):
1368- cleaned_data = super(MountFilesystemForm, self).clean()
1369+ cleaned_data = super().clean()
1370 if self.filesystem is None:
1371 self.add_error(
1372 None,
1373@@ -76,7 +76,7 @@ class MountNonStorageFilesystemForm(Form):
1374
1375 @typed
1376 def __init__(self, node: Node, *args, **kwargs):
1377- super(MountNonStorageFilesystemForm, self).__init__(*args, **kwargs)
1378+ super().__init__(*args, **kwargs)
1379 self.node = node
1380
1381 @typed
1382@@ -99,11 +99,11 @@ class UnmountNonStorageFilesystemForm(Form):
1383
1384 @typed
1385 def __init__(self, node: Node, *args, **kwargs):
1386- super(UnmountNonStorageFilesystemForm, self).__init__(*args, **kwargs)
1387+ super().__init__(*args, **kwargs)
1388 self.node = node
1389
1390 def clean(self):
1391- cleaned_data = super(UnmountNonStorageFilesystemForm, self).clean()
1392+ cleaned_data = super().clean()
1393 if "mount_point" in cleaned_data:
1394 try:
1395 self.filesystem = Filesystem.objects.get(
1396diff --git a/src/maasserver/forms/interface.py b/src/maasserver/forms/interface.py
1397index 4397a18..c29b041 100644
1398--- a/src/maasserver/forms/interface.py
1399+++ b/src/maasserver/forms/interface.py
1400@@ -92,7 +92,7 @@ class InterfaceForm(MAASModelForm):
1401
1402 def __init__(self, *args, **kwargs):
1403 self.node = kwargs.pop("node", None)
1404- super(InterfaceForm, self).__init__(*args, **kwargs)
1405+ super().__init__(*args, **kwargs)
1406 instance = kwargs.get("instance")
1407 if instance is not None:
1408 self.node = instance.get_node()
1409@@ -109,12 +109,12 @@ class InterfaceForm(MAASModelForm):
1410 # get the validation to pass on a newly created interface is to set the
1411 # node in the interface here.
1412 self.instance.node = self.node
1413- return super(InterfaceForm, self)._get_validation_exclusions()
1414+ return super()._get_validation_exclusions()
1415
1416 def save(self, *args, **kwargs):
1417 """Persist the interface into the database."""
1418 created = self.instance.id is None
1419- interface = super(InterfaceForm, self).save(commit=True)
1420+ interface = super().save(commit=True)
1421 if "parents" in self.data:
1422 parents = self.cleaned_data.get("parents")
1423 existing_parents = set(interface.parents.all())
1424@@ -194,7 +194,7 @@ class InterfaceForm(MAASModelForm):
1425 )
1426
1427 def clean(self):
1428- cleaned_data = super(InterfaceForm, self).clean()
1429+ cleaned_data = super().clean()
1430 self.clean_parents_all_same_node(cleaned_data.get("parents"))
1431 if self.node.node_type == NODE_TYPE.DEVICE:
1432 cleaned_data = self.clean_device(cleaned_data)
1433@@ -235,14 +235,14 @@ class ControllerInterfaceForm(MAASModelForm):
1434 fields = ("vlan", "link_connected", "interface_speed", "link_speed")
1435
1436 def __init__(self, *args, **kwargs):
1437- super(ControllerInterfaceForm, self).__init__(*args, **kwargs)
1438+ super().__init__(*args, **kwargs)
1439 instance = kwargs.get("instance")
1440 if instance is not None:
1441 self.link_connected = instance.link_connected
1442
1443 def save(self, *args, **kwargs):
1444 """Persist the interface into the database."""
1445- interface = super(ControllerInterfaceForm, self).save(commit=False)
1446+ interface = super().save(commit=False)
1447 # Allow setting the VLAN to None.
1448 new_vlan = self.cleaned_data.get("vlan")
1449 vlan_was_set = "vlan" in self.data
1450@@ -285,7 +285,7 @@ class DeployedInterfaceForm(MAASModelForm):
1451 )
1452
1453 def __init__(self, *args, **kwargs):
1454- super(DeployedInterfaceForm, self).__init__(*args, **kwargs)
1455+ super().__init__(*args, **kwargs)
1456 instance = kwargs.get("instance")
1457 if instance is not None:
1458 self.link_connected = instance.link_connected
1459@@ -400,7 +400,7 @@ class VLANInterfaceForm(InterfaceForm):
1460 return new_vlan
1461
1462 def clean(self):
1463- cleaned_data = super(VLANInterfaceForm, self).clean()
1464+ cleaned_data = super().clean()
1465 if self.fields_ok(["vlan", "parents"]):
1466 new_vlan = self.cleaned_data.get("vlan")
1467 if new_vlan:
1468diff --git a/src/maasserver/forms/interface_link.py b/src/maasserver/forms/interface_link.py
1469index 71365ce..e6042b1 100644
1470--- a/src/maasserver/forms/interface_link.py
1471+++ b/src/maasserver/forms/interface_link.py
1472@@ -57,7 +57,7 @@ class InterfaceLinkForm(forms.Form):
1473 ]
1474
1475 self.instance = kwargs.pop("instance")
1476- super(InterfaceLinkForm, self).__init__(*args, **kwargs)
1477+ super().__init__(*args, **kwargs)
1478
1479 # Create the mode field and setup the queryset on the subnet.
1480 self.fields["mode"] = CaseInsensitiveChoiceField(
1481@@ -87,7 +87,7 @@ class InterfaceLinkForm(forms.Form):
1482 "bond(%s)." % (self.instance.name, interface_set.name)
1483 ),
1484 )
1485- cleaned_data = super(InterfaceLinkForm, self).clean()
1486+ cleaned_data = super().clean()
1487 mode = cleaned_data.get("mode", None)
1488 if mode is None:
1489 return cleaned_data
1490@@ -240,7 +240,7 @@ class InterfaceUnlinkForm(forms.Form):
1491
1492 def __init__(self, *args, **kwargs):
1493 self.instance = kwargs.pop("instance")
1494- super(InterfaceUnlinkForm, self).__init__(*args, **kwargs)
1495+ super().__init__(*args, **kwargs)
1496 self.set_up_id_field()
1497
1498 def set_up_id_field(self):
1499@@ -266,7 +266,7 @@ class InterfaceSetDefaultGatwayForm(forms.Form):
1500
1501 def __init__(self, *args, **kwargs):
1502 self.instance = kwargs.pop("instance")
1503- super(InterfaceSetDefaultGatwayForm, self).__init__(*args, **kwargs)
1504+ super().__init__(*args, **kwargs)
1505 self.links = self.get_valid_links()
1506 self.set_up_link_id_field()
1507
1508@@ -327,7 +327,7 @@ class InterfaceSetDefaultGatwayForm(forms.Form):
1509
1510 def clean(self):
1511 self._clean_has_gateways()
1512- cleaned_data = super(InterfaceSetDefaultGatwayForm, self).clean()
1513+ cleaned_data = super().clean()
1514 link_id = cleaned_data.get("link_id", None)
1515 if not link_id:
1516 self._clean_ipv4_and_ipv6_gateways()
1517diff --git a/src/maasserver/forms/packagerepository.py b/src/maasserver/forms/packagerepository.py
1518index 795726f..20ad1f7 100644
1519--- a/src/maasserver/forms/packagerepository.py
1520+++ b/src/maasserver/forms/packagerepository.py
1521@@ -176,7 +176,7 @@ class PackageRepositoryForm(MAASModelForm):
1522 return values
1523
1524 def save(self, endpoint, request):
1525- package_repository = super(PackageRepositoryForm, self).save()
1526+ package_repository = super().save()
1527 create_audit_event(
1528 EVENT_TYPES.SETTINGS,
1529 endpoint,
1530diff --git a/src/maasserver/forms/pods.py b/src/maasserver/forms/pods.py
1531index 03a62e3..a9ad673 100644
1532--- a/src/maasserver/forms/pods.py
1533+++ b/src/maasserver/forms/pods.py
1534@@ -211,7 +211,7 @@ class PodForm(MAASModelForm):
1535 self.is_new = instance is None
1536 self.request = request
1537 self.user = user
1538- super(PodForm, self).__init__(data=data, instance=instance, **kwargs)
1539+ super().__init__(data=data, instance=instance, **kwargs)
1540 if data is None:
1541 data = {}
1542 type_value = data.get("type", self.initial.get("type"))
1543@@ -253,7 +253,7 @@ class PodForm(MAASModelForm):
1544 """Override to dynamically add fields based on the value of `type`
1545 field."""
1546 # Process the built-in fields first.
1547- super(PodForm, self)._clean_fields()
1548+ super()._clean_fields()
1549 # If no errors then we re-process with the fields required by the
1550 # selected type for the pod.
1551 if len(self.errors) == 0:
1552@@ -268,10 +268,10 @@ class PodForm(MAASModelForm):
1553 for key, value in self.instance.power_parameters.items():
1554 if key not in self.data:
1555 self.data[key] = value
1556- super(PodForm, self)._clean_fields()
1557+ super()._clean_fields()
1558
1559 def clean(self):
1560- cleaned_data = super(PodForm, self).clean()
1561+ cleaned_data = super().clean()
1562 if len(self.drivers) == 0:
1563 set_form_error(
1564 self,
1565@@ -508,7 +508,7 @@ class ComposeMachineForm(forms.Form):
1566 self.pod = kwargs.pop("pod", None)
1567 if self.pod is None:
1568 raise ValueError("'pod' kwargs is required.")
1569- super(ComposeMachineForm, self).__init__(*args, **kwargs)
1570+ super().__init__(*args, **kwargs)
1571
1572 # Build the fields based on the pod and current pod hints.
1573 self.fields["cores"] = IntegerField(
1574@@ -858,7 +858,7 @@ class ComposeMachineForPodsForm(forms.Form):
1575 self.pods = kwargs.pop("pods", None)
1576 if self.pods is None:
1577 raise ValueError("'pods' kwargs is required.")
1578- super(ComposeMachineForPodsForm, self).__init__(*args, **kwargs)
1579+ super().__init__(*args, **kwargs)
1580 self.pod_forms = [
1581 ComposeMachineForm(request=self.request, data=self.data, pod=pod)
1582 for pod in self.pods
1583diff --git a/src/maasserver/forms/script.py b/src/maasserver/forms/script.py
1584index e8f3504..a01cc7b 100644
1585--- a/src/maasserver/forms/script.py
1586+++ b/src/maasserver/forms/script.py
1587@@ -536,7 +536,7 @@ class ScriptForm(ModelForm):
1588 def save(self, *args, **kwargs):
1589 request = kwargs.pop("request", None)
1590 endpoint = kwargs.pop("endpoint", None)
1591- script = super(ScriptForm, self).save(*args, **kwargs)
1592+ script = super().save(*args, **kwargs)
1593
1594 # Create audit event log if endpoint and request supplied.
1595 if request is not None and endpoint is not None:
1596diff --git a/src/maasserver/forms/settings.py b/src/maasserver/forms/settings.py
1597index 49d47c6..f03eb04 100644
1598--- a/src/maasserver/forms/settings.py
1599+++ b/src/maasserver/forms/settings.py
1600@@ -267,7 +267,7 @@ class RemoteSyslogField(forms.CharField):
1601 """
1602
1603 def clean(self, value):
1604- value = super(RemoteSyslogField, self).clean(value)
1605+ value = super().clean(value)
1606 if not value:
1607 return None
1608 host, port = splithost(value)
1609diff --git a/src/maasserver/forms/staticroute.py b/src/maasserver/forms/staticroute.py
1610index fa95a9b..10d45ec 100644
1611--- a/src/maasserver/forms/staticroute.py
1612+++ b/src/maasserver/forms/staticroute.py
1613@@ -36,7 +36,7 @@ class StaticRouteForm(MAASModelForm):
1614 fields = ("source", "destination", "gateway_ip", "metric")
1615
1616 def __init__(self, *args, **kwargs):
1617- super(StaticRouteForm, self).__init__(*args, **kwargs)
1618+ super().__init__(*args, **kwargs)
1619 # Metric field is not a required field, but is required in the model.
1620 self.fields["metric"].required = False
1621
1622diff --git a/src/maasserver/forms/subnet.py b/src/maasserver/forms/subnet.py
1623index 7fd8f57..6c8a941 100644
1624--- a/src/maasserver/forms/subnet.py
1625+++ b/src/maasserver/forms/subnet.py
1626@@ -57,11 +57,11 @@ class SubnetForm(MAASModelForm):
1627 )
1628
1629 def __init__(self, *args, **kwargs):
1630- super(SubnetForm, self).__init__(*args, **kwargs)
1631+ super().__init__(*args, **kwargs)
1632 self.fields["name"].required = False
1633
1634 def clean(self):
1635- cleaned_data = super(SubnetForm, self).clean()
1636+ cleaned_data = super().clean()
1637 if "space" in self.data:
1638 set_form_error(
1639 self,
1640diff --git a/src/maasserver/forms/tests/test_bootsource.py b/src/maasserver/forms/tests/test_bootsource.py
1641index c739c06..2a1d683 100644
1642--- a/src/maasserver/forms/tests/test_bootsource.py
1643+++ b/src/maasserver/forms/tests/test_bootsource.py
1644@@ -21,7 +21,7 @@ class TestBootSourceForm(MAASServerTestCase):
1645 """Tests for `BootSourceForm`."""
1646
1647 def setUp(self):
1648- super(TestBootSourceForm, self).setUp()
1649+ super().setUp()
1650 # Disable boot source cache signals.
1651 self.addCleanup(bootsources.signals.enable)
1652 bootsources.signals.disable()
1653diff --git a/src/maasserver/forms/tests/test_bootsourceselection.py b/src/maasserver/forms/tests/test_bootsourceselection.py
1654index ca6a0c2..e77bf44 100644
1655--- a/src/maasserver/forms/tests/test_bootsourceselection.py
1656+++ b/src/maasserver/forms/tests/test_bootsourceselection.py
1657@@ -18,7 +18,7 @@ class TestBootSourceSelectionForm(MAASServerTestCase):
1658 """Tests for `BootSourceSelectionForm`."""
1659
1660 def setUp(self):
1661- super(TestBootSourceSelectionForm, self).setUp()
1662+ super().setUp()
1663 # Disable boot source cache signals.
1664 self.addCleanup(bootsources.signals.enable)
1665 bootsources.signals.disable()
1666diff --git a/src/maasserver/forms/tests/test_helpers.py b/src/maasserver/forms/tests/test_helpers.py
1667index 92347b6..33ee0ab 100644
1668--- a/src/maasserver/forms/tests/test_helpers.py
1669+++ b/src/maasserver/forms/tests/test_helpers.py
1670@@ -170,7 +170,7 @@ class TestMAASModelForm(MAASLegacyTransactionServerTestCase):
1671 """
1672
1673 def __init__(self, *args, **kwargs):
1674- super(EarlyFieldMixin, self).__init__(*args, **kwargs)
1675+ super().__init__(*args, **kwargs)
1676 self.fields["early_field"] = CharField(required=False)
1677
1678 class TestForm(EarlyFieldMixin, MAASModelForm):
1679diff --git a/src/maasserver/forms/vlan.py b/src/maasserver/forms/vlan.py
1680index 5c1f67e..80c49b5 100644
1681--- a/src/maasserver/forms/vlan.py
1682+++ b/src/maasserver/forms/vlan.py
1683@@ -46,7 +46,7 @@ class VLANForm(MAASModelForm):
1684
1685 def __init__(self, *args, **kwargs):
1686 self.fabric = kwargs.pop("fabric", None)
1687- super(VLANForm, self).__init__(*args, **kwargs)
1688+ super().__init__(*args, **kwargs)
1689 instance = kwargs.get("instance")
1690 if instance is None and self.fabric is None:
1691 raise ValueError("Form requires either a instance or a fabric.")
1692@@ -99,7 +99,7 @@ class VLANForm(MAASModelForm):
1693 )
1694
1695 def clean(self):
1696- cleaned_data = super(VLANForm, self).clean()
1697+ cleaned_data = super().clean()
1698 # Automatically promote the secondary rack controller to the primary
1699 # if the primary is removed.
1700 if (
1701@@ -199,7 +199,7 @@ class VLANForm(MAASModelForm):
1702
1703 def save(self):
1704 """Persist the VLAN into the database."""
1705- vlan = super(VLANForm, self).save(commit=False)
1706+ vlan = super().save(commit=False)
1707 if self.fabric is not None:
1708 vlan.fabric = self.fabric
1709 if "space" in self.data and not self.cleaned_data.get("space"):
1710diff --git a/src/maasserver/ipc.py b/src/maasserver/ipc.py
1711index 6f1ae13..7e59a97 100644
1712--- a/src/maasserver/ipc.py
1713+++ b/src/maasserver/ipc.py
1714@@ -146,7 +146,7 @@ class IPCMasterService(service.Service, object):
1715 connections = None
1716
1717 def __init__(self, reactor, workers=None, socket_path=None):
1718- super(IPCMasterService, self).__init__()
1719+ super().__init__()
1720 self.reactor = reactor
1721 self.workers = workers
1722 self.socket_path = socket_path
1723@@ -164,7 +164,7 @@ class IPCMasterService(service.Service, object):
1724 @asynchronous
1725 def startService(self):
1726 """Start listening on UNIX socket and create the region controller."""
1727- super(IPCMasterService, self).startService()
1728+ super().startService()
1729 self.starting = self.endpoint.listen(self.factory)
1730
1731 def save_port(port):
1732@@ -221,7 +221,7 @@ class IPCMasterService(service.Service, object):
1733
1734 yield deferToDatabase(delete_all_processes)
1735 yield stop_update_loop()
1736- yield super(IPCMasterService, self).stopService()
1737+ yield super().stopService()
1738
1739 @asynchronous
1740 def registerWorker(self, pid, conn):
1741@@ -612,7 +612,7 @@ class IPCWorker(RPCProtocol):
1742 """The IPC client side of the protocol."""
1743
1744 def connectionMade(self):
1745- super(IPCWorker, self).connectionMade()
1746+ super().connectionMade()
1747
1748 # Identify with the master process.
1749 d = self.callRemote(WorkerIdentify, pid=os.getpid())
1750@@ -635,7 +635,7 @@ class IPCWorkerService(service.Service, object):
1751 """
1752
1753 def __init__(self, reactor, socket_path=None):
1754- super(IPCWorkerService, self).__init__()
1755+ super().__init__()
1756 self.reactor = reactor
1757 self.socket_path = socket_path
1758 if self.socket_path is None:
1759@@ -648,7 +648,7 @@ class IPCWorkerService(service.Service, object):
1760 @asynchronous
1761 def startService(self):
1762 """Connect to UNIX socket."""
1763- super(IPCWorkerService, self).startService()
1764+ super().startService()
1765 protocol = IPCWorker()
1766 protocol.service = self
1767 self.starting = connectProtocol(self.endpoint, protocol)
1768@@ -681,7 +681,7 @@ class IPCWorkerService(service.Service, object):
1769 self._protocol, protocol = None, self._protocol
1770 if protocol.transport:
1771 protocol.transport.loseConnection()
1772- return super(IPCWorkerService, self).stopService()
1773+ return super().stopService()
1774
1775 @asynchronous
1776 def rpcPublish(self, port):
1777diff --git a/src/maasserver/json.py b/src/maasserver/json.py
1778index 671faa7..e6ba065 100644
1779--- a/src/maasserver/json.py
1780+++ b/src/maasserver/json.py
1781@@ -27,7 +27,7 @@ class MAASJSONEncoder(django.core.serializers.json.DjangoJSONEncoder):
1782 if isinstance(value, MAC):
1783 return value.get_raw()
1784 else:
1785- return super(MAASJSONEncoder, self).default(value)
1786+ return super().default(value)
1787
1788
1789 class Serializer(django.core.serializers.json.Serializer):
1790diff --git a/src/maasserver/listener.py b/src/maasserver/listener.py
1791index 2797fc8..4bd0116 100644
1792--- a/src/maasserver/listener.py
1793+++ b/src/maasserver/listener.py
1794@@ -97,13 +97,13 @@ class PostgresListenerService(Service, object):
1795
1796 def startService(self):
1797 """Start the listener."""
1798- super(PostgresListenerService, self).startService()
1799+ super().startService()
1800 self.autoReconnect = True
1801 return self.tryConnection()
1802
1803 def stopService(self):
1804 """Stop the listener."""
1805- super(PostgresListenerService, self).stopService()
1806+ super().stopService()
1807 self.autoReconnect = False
1808 return self.loseConnection()
1809
1810diff --git a/src/maasserver/macaroon_auth.py b/src/maasserver/macaroon_auth.py
1811index 90e8c64..069a2a0 100644
1812--- a/src/maasserver/macaroon_auth.py
1813+++ b/src/maasserver/macaroon_auth.py
1814@@ -301,7 +301,7 @@ class CandidClient(MacaroonClient):
1815 if auth_info is None:
1816 auth_info = get_auth_info()
1817 url = auth_info.agents[0].url
1818- super(CandidClient, self).__init__(url, auth_info)
1819+ super().__init__(url, auth_info)
1820
1821 def get_user_details(self, username: str) -> UserDetails:
1822 """Return details about a user."""
1823diff --git a/src/maasserver/management/commands/_config.py b/src/maasserver/management/commands/_config.py
1824index df4ce51..e4933e1 100644
1825--- a/src/maasserver/management/commands/_config.py
1826+++ b/src/maasserver/management/commands/_config.py
1827@@ -153,7 +153,7 @@ class GetCommand(LocalConfigCommand):
1828 # output.
1829
1830 def add_arguments(self, parser):
1831- super(GetCommand, self).add_arguments(parser)
1832+ super().add_arguments(parser)
1833
1834 for option_name, kwargs in gen_configuration_options_for_getting():
1835 parser.add_argument(option_name, **kwargs)
1836@@ -203,7 +203,7 @@ class GetCommand(LocalConfigCommand):
1837
1838 class ResetCommand(LocalConfigCommand):
1839 def add_arguments(self, parser):
1840- super(ResetCommand, self).add_arguments(parser)
1841+ super().add_arguments(parser)
1842
1843 for option_name, kwargs in gen_configuration_options_for_resetting():
1844 parser.add_argument(option_name, **kwargs)
1845@@ -222,7 +222,7 @@ class SetCommand(LocalConfigCommand):
1846 help = "Set local configuration for the MAAS region controller."
1847
1848 def add_arguments(self, parser):
1849- super(SetCommand, self).add_arguments(parser)
1850+ super().add_arguments(parser)
1851
1852 for option_name, kwargs in gen_configuration_options_for_setting():
1853 parser.add_argument(option_name, **kwargs)
1854diff --git a/src/maasserver/management/commands/db_vacuum_lobjects.py b/src/maasserver/management/commands/db_vacuum_lobjects.py
1855index e52b6c6..86d9e1e 100644
1856--- a/src/maasserver/management/commands/db_vacuum_lobjects.py
1857+++ b/src/maasserver/management/commands/db_vacuum_lobjects.py
1858@@ -57,7 +57,7 @@ class Command(BaseCommand):
1859 )
1860
1861 def add_arguments(self, parser):
1862- super(Command, self).add_arguments(parser)
1863+ super().add_arguments(parser)
1864
1865 parser.add_argument(
1866 "--database",
1867diff --git a/src/maasserver/management/commands/dbupgrade.py b/src/maasserver/management/commands/dbupgrade.py
1868index 8f6c438..1c8860d 100644
1869--- a/src/maasserver/management/commands/dbupgrade.py
1870+++ b/src/maasserver/management/commands/dbupgrade.py
1871@@ -19,7 +19,7 @@ class Command(BaseCommand):
1872 help = "Upgrades database schema for MAAS regiond."
1873
1874 def add_arguments(self, parser):
1875- super(Command, self).add_arguments(parser)
1876+ super().add_arguments(parser)
1877 parser.add_argument(
1878 "--database",
1879 action="store",
1880diff --git a/src/maasserver/management/commands/edit_named_options.py b/src/maasserver/management/commands/edit_named_options.py
1881index 977e81c..0c5423c 100644
1882--- a/src/maasserver/management/commands/edit_named_options.py
1883+++ b/src/maasserver/management/commands/edit_named_options.py
1884@@ -37,7 +37,7 @@ class Command(BaseCommand):
1885 )
1886
1887 def add_arguments(self, parser):
1888- super(Command, self).add_arguments(parser)
1889+ super().add_arguments(parser)
1890 add_arguments(parser)
1891 parser.add_argument(
1892 "--migrate-conflicting-options",
1893diff --git a/src/maasserver/management/commands/runserver.py b/src/maasserver/management/commands/runserver.py
1894index f41488f..a3cf0a3 100644
1895--- a/src/maasserver/management/commands/runserver.py
1896+++ b/src/maasserver/management/commands/runserver.py
1897@@ -18,7 +18,7 @@ class Command(BaseRunserverCommand):
1898 """Customized "runserver" command that wraps the WSGI handler."""
1899
1900 def add_arguments(self, parser):
1901- super(Command, self).add_arguments(parser)
1902+ super().add_arguments(parser)
1903
1904 parser.add_argument(
1905 "--threading",
1906@@ -40,4 +40,4 @@ class Command(BaseRunserverCommand):
1907 setattr(basehttp, "WSGIServer", ThreadedWSGIServer)
1908
1909 start_up()
1910- return super(Command, self).run(*args, **options)
1911+ return super().run(*args, **options)
1912diff --git a/src/maasserver/management/commands/tests/test_dbupgrade.py b/src/maasserver/management/commands/tests/test_dbupgrade.py
1913index 3b58fa1..fb23b7c 100644
1914--- a/src/maasserver/management/commands/tests/test_dbupgrade.py
1915+++ b/src/maasserver/management/commands/tests/test_dbupgrade.py
1916@@ -66,7 +66,7 @@ class TestDBUpgrade(MAASTestCase):
1917
1918 def setUp(self):
1919 """Setup a special database cluster to perform the tests."""
1920- super(TestDBUpgrade, self).setUp()
1921+ super().setUp()
1922 self.datadir = self.useFixture(TempDirectory()).path
1923 self.cluster = self.useFixture(ClusterFixture(self.datadir))
1924 self.useFixture(
1925diff --git a/src/maasserver/models/blockdevice.py b/src/maasserver/models/blockdevice.py
1926index f219b44..7b642e6 100644
1927--- a/src/maasserver/models/blockdevice.py
1928+++ b/src/maasserver/models/blockdevice.py
1929@@ -320,7 +320,7 @@ class BlockDevice(CleanSave, TimestampedModel):
1930 "Cannot delete block device because its part of "
1931 "a %s." % filesystem_group.get_nice_name()
1932 )
1933- super(BlockDevice, self).delete()
1934+ super().delete()
1935
1936 @staticmethod
1937 def _get_block_name_from_idx(idx, prefix="sd"):
1938diff --git a/src/maasserver/models/bmc.py b/src/maasserver/models/bmc.py
1939index 0951875..aa8981c 100644
1940--- a/src/maasserver/models/bmc.py
1941+++ b/src/maasserver/models/bmc.py
1942@@ -298,11 +298,11 @@ class BMC(CleanSave, TimestampedModel):
1943 def delete(self):
1944 """Delete this BMC."""
1945 maaslog.info("%s: Deleting BMC", self)
1946- super(BMC, self).delete()
1947+ super().delete()
1948
1949 def save(self, *args, **kwargs):
1950 """Save this BMC."""
1951- super(BMC, self).save(*args, **kwargs)
1952+ super().save(*args, **kwargs)
1953 # We let name be blank for the initial save, but fix it before the
1954 # save completes. This is because set_random_name() operates by
1955 # trying to re-save the BMC with a random hostname, and retrying until
1956@@ -635,7 +635,7 @@ class Pod(BMC):
1957 def __init__(self, *args, **kwargs):
1958 if "pool" not in kwargs:
1959 kwargs["pool"] = ResourcePool.objects.get_default_resource_pool()
1960- super(Pod, self).__init__(bmc_type=BMC_TYPE.POD, *args, **kwargs)
1961+ super().__init__(bmc_type=BMC_TYPE.POD, *args, **kwargs)
1962
1963 def clean(self):
1964 super().clean()
1965diff --git a/src/maasserver/models/bootresource.py b/src/maasserver/models/bootresource.py
1966index 6dcc65e..592861d 100644
1967--- a/src/maasserver/models/bootresource.py
1968+++ b/src/maasserver/models/bootresource.py
1969@@ -530,9 +530,7 @@ class BootResource(CleanSave, TimestampedModel):
1970 def unique_error_message(self, model_class, unique_check):
1971 if unique_check == ("name", "architecture"):
1972 return "Boot resource of name, and architecture already " "exists."
1973- return super(BootResource, self).unique_error_message(
1974- model_class, unique_check
1975- )
1976+ return super().unique_error_message(model_class, unique_check)
1977
1978 def get_latest_set(self):
1979 """Return latest `BootResourceSet`."""
1980diff --git a/src/maasserver/models/bootsource.py b/src/maasserver/models/bootsource.py
1981index 1a2717c..358b98b 100644
1982--- a/src/maasserver/models/bootsource.py
1983+++ b/src/maasserver/models/bootsource.py
1984@@ -37,7 +37,7 @@ class BootSource(CleanSave, TimestampedModel):
1985 )
1986
1987 def clean(self, *args, **kwargs):
1988- super(BootSource, self).clean(*args, **kwargs)
1989+ super().clean(*args, **kwargs)
1990
1991 # You have to specify one of {keyring_data, keyring_filename}.
1992 if len(self.keyring_filename) == 0 and len(self.keyring_data) == 0:
1993diff --git a/src/maasserver/models/cleansave.py b/src/maasserver/models/cleansave.py
1994index ab7a4c3..1f92a2f 100644
1995--- a/src/maasserver/models/cleansave.py
1996+++ b/src/maasserver/models/cleansave.py
1997@@ -18,7 +18,7 @@ class CleanSaveModelState(ModelState):
1998 """Provides helpers on `_state` attribute on a model."""
1999
2000 def __init__(self, db=None):
2001- super(CleanSaveModelState, self).__init__(db=db)
2002+ super().__init__(db=db)
2003 self._changed_fields = {}
2004
2005 def get_changed(self):
2006@@ -64,7 +64,7 @@ class CleanSave:
2007
2008 @classmethod
2009 def from_db(cls, db, field_names, values):
2010- new = super(CleanSave, cls).from_db(db, field_names, values)
2011+ new = super().from_db(db, field_names, values)
2012 new._state._changed_fields = {}
2013 return new
2014
2015@@ -104,9 +104,9 @@ class CleanSave:
2016 # if a field has changed.
2017 value.__class__ = CleanSaveModelState
2018 value._changed_fields = {}
2019- return super(CleanSave, self).__setattr__(name, value)
2020+ return super().__setattr__(name, value)
2021 if not hasattr(self, "_state"):
2022- return super(CleanSave, self).__setattr__(name, value)
2023+ return super().__setattr__(name, value)
2024
2025 try:
2026 field = self._meta.get_field(name)
2027@@ -117,7 +117,7 @@ class CleanSave:
2028 raise AttributeError("can't set attribute")
2029 prop_obj.fset(self, value)
2030 else:
2031- super(CleanSave, self).__setattr__(name, value)
2032+ super().__setattr__(name, value)
2033 else:
2034
2035 def _wrap_setattr():
2036@@ -149,13 +149,13 @@ class CleanSave:
2037 # Field that holds the actual referenced objects. Ignore
2038 # tracking because the related descriptor will set the
2039 # related primary key for the field.
2040- super(CleanSave, self).__setattr__(name, value)
2041+ super().__setattr__(name, value)
2042 else:
2043 raise AttributeError(
2044 "Unknown field(%s) for: %s" % (name, field)
2045 )
2046 else:
2047- super(CleanSave, self).__setattr__(name, value)
2048+ super().__setattr__(name, value)
2049
2050 def save(self, *args, **kwargs):
2051 """Perform `full_clean` before save and only save changed fields."""
2052@@ -185,7 +185,7 @@ class CleanSave:
2053 exclude=exclude_clean_fields, validate_unique=False
2054 )
2055 self.validate_unique(exclude=[self._meta.pk.name])
2056- return super(CleanSave, self).save(*args, **kwargs)
2057+ return super().save(*args, **kwargs)
2058 elif self._state._changed_fields:
2059 # This is the new path where saving only updates the fields
2060 # that have actually changed.
2061@@ -223,7 +223,7 @@ class CleanSave:
2062 for key, value in self._state._changed_fields.items()
2063 if value is not FieldUnset
2064 }
2065- return super(CleanSave, self).save(*args, **kwargs)
2066+ return super().save(*args, **kwargs)
2067 else:
2068 # Nothing changed so nothing needs to be saved.
2069 return self
2070@@ -254,7 +254,7 @@ class CleanSave:
2071 }
2072 )
2073 update_fields = frozenset(update_fields)
2074- res = super(CleanSave, self)._save_table(
2075+ res = super()._save_table(
2076 raw=raw,
2077 cls=cls,
2078 force_insert=force_insert,
2079diff --git a/src/maasserver/models/config.py b/src/maasserver/models/config.py
2080index b83e34d..2aa381d 100644
2081--- a/src/maasserver/models/config.py
2082+++ b/src/maasserver/models/config.py
2083@@ -147,7 +147,7 @@ class ConfigManager(Manager):
2084 """
2085
2086 def __init__(self):
2087- super(ConfigManager, self).__init__()
2088+ super().__init__()
2089 self._config_changed_connections = defaultdict(set)
2090
2091 def get_config(self, name, default=None):
2092diff --git a/src/maasserver/models/dhcpsnippet.py b/src/maasserver/models/dhcpsnippet.py
2093index a904637..417a640 100644
2094--- a/src/maasserver/models/dhcpsnippet.py
2095+++ b/src/maasserver/models/dhcpsnippet.py
2096@@ -32,7 +32,7 @@ class DHCPSnippetQueriesMixin(MAASQueriesMixin):
2097 "id": "__id",
2098 "name": "__name",
2099 }
2100- return super(DHCPSnippetQueriesMixin, self).get_specifiers_q(
2101+ return super().get_specifiers_q(
2102 specifiers,
2103 specifier_types=specifier_types,
2104 separator=separator,
2105diff --git a/src/maasserver/models/discovery.py b/src/maasserver/models/discovery.py
2106index f8a5b2a..91c59aa 100644
2107--- a/src/maasserver/models/discovery.py
2108+++ b/src/maasserver/models/discovery.py
2109@@ -42,7 +42,7 @@ class DiscoveryQueriesMixin(MAASQueriesMixin):
2110 "ip": "__ip",
2111 "mac": "__mac_address",
2112 }
2113- return super(DiscoveryQueriesMixin, self).get_specifiers_q(
2114+ return super().get_specifiers_q(
2115 specifiers,
2116 specifier_types=specifier_types,
2117 separator=separator,
2118diff --git a/src/maasserver/models/dnsresource.py b/src/maasserver/models/dnsresource.py
2119index 835d68b..fef9712 100644
2120--- a/src/maasserver/models/dnsresource.py
2121+++ b/src/maasserver/models/dnsresource.py
2122@@ -112,7 +112,7 @@ class DNSResourceQueriesMixin(MAASQueriesMixin):
2123 "name": "__name",
2124 "domain": (Domain.objects, "domain"),
2125 }
2126- return super(DNSResourceQueriesMixin, self).get_specifiers_q(
2127+ return super().get_specifiers_q(
2128 specifiers,
2129 specifier_types=specifier_types,
2130 separator=separator,
2131@@ -340,7 +340,7 @@ class DNSResource(CleanSave, TimestampedModel):
2132 ).count()
2133 if num_cname > 0:
2134 raise ValidationError("Cannot add address: CNAME present.")
2135- super(DNSResource, self).clean(*args, **kwargs)
2136+ super().clean(*args, **kwargs)
2137
2138 def render_json(self, system_id):
2139 """Render json. System_id is the system_id for the node, if one
2140diff --git a/src/maasserver/models/domain.py b/src/maasserver/models/domain.py
2141index b1082a1..a131a5b 100644
2142--- a/src/maasserver/models/domain.py
2143+++ b/src/maasserver/models/domain.py
2144@@ -68,7 +68,7 @@ class DomainQueriesMixin(MAASQueriesMixin):
2145 "name": "__name",
2146 "id": "__id",
2147 }
2148- return super(DomainQueriesMixin, self).get_specifiers_q(
2149+ return super().get_specifiers_q(
2150 specifiers,
2151 specifier_types=specifier_types,
2152 separator=separator,
2153@@ -344,11 +344,11 @@ class Domain(CleanSave, TimestampedModel):
2154 raise ValidationError(
2155 "This domain is the default domain, it cannot be deleted."
2156 )
2157- super(Domain, self).delete()
2158+ super().delete()
2159
2160 def save(self, *args, **kwargs):
2161 created = self.id is None
2162- super(Domain, self).save(*args, **kwargs)
2163+ super().save(*args, **kwargs)
2164 if created:
2165 self.update_kms_srv()
2166 # If there is a DNSResource in our parent domain that matches this
2167@@ -367,7 +367,7 @@ class Domain(CleanSave, TimestampedModel):
2168 self.name = self.name[:-1]
2169
2170 def clean(self, *args, **kwargs):
2171- super(Domain, self).clean(*args, **kwargs)
2172+ super().clean(*args, **kwargs)
2173 self.clean_name()
2174
2175 def render_json_for_related_rrdata(
2176diff --git a/src/maasserver/models/fabric.py b/src/maasserver/models/fabric.py
2177index 9e2b212..87dafab 100644
2178--- a/src/maasserver/models/fabric.py
2179+++ b/src/maasserver/models/fabric.py
2180@@ -45,7 +45,7 @@ class FabricQueriesMixin(MAASQueriesMixin):
2181 "name": "__name",
2182 "class": "__class_type",
2183 }
2184- return super(FabricQueriesMixin, self).get_specifiers_q(
2185+ return super().get_specifiers_q(
2186 specifiers,
2187 specifier_types=specifier_types,
2188 separator=separator,
2189@@ -208,7 +208,7 @@ class Fabric(CleanSave, TimestampedModel):
2190 "Can't delete fabric; the following interfaces are "
2191 "still connected: %s" % (", ".join(descriptions))
2192 )
2193- super(Fabric, self).delete()
2194+ super().delete()
2195
2196 def _create_default_vlan(self):
2197 # Circular imports.
2198@@ -222,7 +222,7 @@ class Fabric(CleanSave, TimestampedModel):
2199 # Name will get set by clean_name() if None or empty, and there is an
2200 # id. We just need to handle names here for creation.
2201 created = self.id is None
2202- super(Fabric, self).save(*args, **kwargs)
2203+ super().save(*args, **kwargs)
2204 if self.name is None or self.name == "":
2205 # If we got here, then we have a newly created fabric that needs a
2206 # default name.
2207diff --git a/src/maasserver/models/fannetwork.py b/src/maasserver/models/fannetwork.py
2208index be6941a..3227676 100644
2209--- a/src/maasserver/models/fannetwork.py
2210+++ b/src/maasserver/models/fannetwork.py
2211@@ -160,6 +160,6 @@ class FanNetwork(CleanSave, TimestampedModel):
2212 )
2213
2214 def clean(self, *args, **kwargs):
2215- super(FanNetwork, self).clean(*args, **kwargs)
2216+ super().clean(*args, **kwargs)
2217 self.clean_overlay()
2218 self.clean_host_reserve()
2219diff --git a/src/maasserver/models/filesystem.py b/src/maasserver/models/filesystem.py
2220index e868197..86feef5 100644
2221--- a/src/maasserver/models/filesystem.py
2222+++ b/src/maasserver/models/filesystem.py
2223@@ -248,7 +248,7 @@ class Filesystem(CleanSave, TimestampedModel):
2224 return self.fstype in self.TYPES_REQUIRING_STORAGE
2225
2226 def clean(self, *args, **kwargs):
2227- super(Filesystem, self).clean(*args, **kwargs)
2228+ super().clean(*args, **kwargs)
2229 parents = self.partition, self.block_device, self.node
2230
2231 # You have to specify either a partition, block device, or node.
2232@@ -337,4 +337,4 @@ class Filesystem(CleanSave, TimestampedModel):
2233 def save(self, *args, **kwargs):
2234 if not self.uuid:
2235 self.uuid = uuid4()
2236- super(Filesystem, self).save(*args, **kwargs)
2237+ super().save(*args, **kwargs)
2238diff --git a/src/maasserver/models/filesystemgroup.py b/src/maasserver/models/filesystemgroup.py
2239index c3b9bb3..c8afb6e 100644
2240--- a/src/maasserver/models/filesystemgroup.py
2241+++ b/src/maasserver/models/filesystemgroup.py
2242@@ -42,11 +42,7 @@ class BaseFilesystemGroupManager(Manager):
2243 extra_filters = {}
2244
2245 def get_queryset(self):
2246- return (
2247- super(BaseFilesystemGroupManager, self)
2248- .get_queryset()
2249- .filter(**self.extra_filters)
2250- )
2251+ return super().get_queryset().filter(**self.extra_filters)
2252
2253 def get_object_or_404(self, system_id, filesystem_group_id, user, perm):
2254 """Fetch a `FilesystemGroup` by its `Node`'s system_id and its id.
2255@@ -559,7 +555,7 @@ class FilesystemGroup(CleanSave, TimestampedModel):
2256 )
2257
2258 def clean(self, *args, **kwargs):
2259- super(FilesystemGroup, self).clean(*args, **kwargs)
2260+ super().clean(*args, **kwargs)
2261
2262 # We allow the initial save to skip model validation, any
2263 # additional saves required filesystems linked. This is because the
2264@@ -751,7 +747,7 @@ class FilesystemGroup(CleanSave, TimestampedModel):
2265 self.name = FilesystemGroup.objects.get_available_name_for(self)
2266 if not self.uuid:
2267 self.uuid = uuid4()
2268- super(FilesystemGroup, self).save(*args, **kwargs)
2269+ super().save(*args, **kwargs)
2270
2271 # Update or create the virtual block device when the filesystem group
2272 # is saved. Does nothing if group_type is LVM_VG. Virtual block device
2273@@ -791,7 +787,7 @@ class FilesystemGroup(CleanSave, TimestampedModel):
2274 # Possible that the virtual block device has already deleted the
2275 # filesystem group. Skip the call if no id is set.
2276 if self.id is not None:
2277- super(FilesystemGroup, self).delete()
2278+ super().delete()
2279
2280 def get_nice_name(self):
2281 """Return the nice name for the filesystem group.
2282@@ -856,7 +852,7 @@ class VolumeGroup(FilesystemGroup):
2283 proxy = True
2284
2285 def __init__(self, *args, **kwargs):
2286- super(VolumeGroup, self).__init__(
2287+ super().__init__(
2288 group_type=FILESYSTEM_GROUP_TYPE.LVM_VG, *args, **kwargs
2289 )
2290
2291@@ -934,7 +930,7 @@ class RAID(FilesystemGroup):
2292 proxy = True
2293
2294 def __init__(self, *args, **kwargs):
2295- super(RAID, self).__init__(*args, **kwargs)
2296+ super().__init__(*args, **kwargs)
2297 if self.group_type not in FILESYSTEM_GROUP_RAID_TYPES:
2298 raise ValueError("group_type must be a valid RAID type.")
2299
2300@@ -1039,7 +1035,7 @@ class Bcache(FilesystemGroup):
2301 proxy = True
2302
2303 def __init__(self, *args, **kwargs):
2304- super(Bcache, self).__init__(
2305+ super().__init__(
2306 group_type=FILESYSTEM_GROUP_TYPE.BCACHE, *args, **kwargs
2307 )
2308
2309diff --git a/src/maasserver/models/interface.py b/src/maasserver/models/interface.py
2310index 14a2b62..471ad4d 100644
2311--- a/src/maasserver/models/interface.py
2312+++ b/src/maasserver/models/interface.py
2313@@ -107,7 +107,7 @@ class InterfaceQueriesMixin(MAASQueriesMixin):
2314 "tag": self._add_tag_query,
2315 "link_speed": "__link_speed__gte",
2316 }
2317- return super(InterfaceQueriesMixin, self).get_specifiers_q(
2318+ return super().get_specifiers_q(
2319 specifiers,
2320 specifier_types=specifier_types,
2321 separator=separator,
2322@@ -202,7 +202,7 @@ class InterfaceQueriesMixin(MAASQueriesMixin):
2323 :returns: tuple (set, dict)
2324
2325 """
2326- return super(InterfaceQueriesMixin, self).get_matching_object_map(
2327+ return super().get_matching_object_map(
2328 specifiers, "node__id", include_filter=include_filter
2329 )
2330
2331@@ -428,9 +428,7 @@ class InterfaceManager(Manager, InterfaceQueriesMixin):
2332 if matches(rel.child):
2333 return rel.child, False
2334
2335- interface, created = super(InterfaceManager, self).get_or_create(
2336- *args, **kwargs
2337- )
2338+ interface, created = super().get_or_create(*args, **kwargs)
2339
2340 if created:
2341 for parent in parents:
2342@@ -627,7 +625,7 @@ class Interface(CleanSave, TimestampedModel):
2343 type = kwargs.get("type", self.get_type())
2344 kwargs["type"] = type
2345 # Derive the concrete class from the interface's type.
2346- super(Interface, self).__init__(*args, **kwargs)
2347+ super().__init__(*args, **kwargs)
2348 klass = INTERFACE_TYPE_MAPPING.get(self.type)
2349 if klass:
2350 self.__class__ = klass
2351@@ -1462,7 +1460,7 @@ class Interface(CleanSave, TimestampedModel):
2352 return all_related
2353
2354 def clean(self):
2355- super(Interface, self).clean()
2356+ super().clean()
2357
2358 # Verify that the MAC address is legal if it is not empty.
2359 if self.mac_address:
2360@@ -1483,7 +1481,7 @@ class Interface(CleanSave, TimestampedModel):
2361 # lease then.
2362 if not remove_ip_address:
2363 self._skip_ip_address_removal = True
2364- super(Interface, self).delete()
2365+ super().delete()
2366
2367 def add_tag(self, tag):
2368 """Add tag to interface."""
2369@@ -1658,7 +1656,7 @@ class PhysicalInterface(Interface):
2370 return INTERFACE_TYPE.PHYSICAL
2371
2372 def clean(self):
2373- super(PhysicalInterface, self).clean()
2374+ super().clean()
2375 # Node and MAC address is always required for a physical interface.
2376 validation_errors = {}
2377 if self.node is None:
2378@@ -1845,7 +1843,7 @@ class BondInterface(ChildInterface):
2379 return INTERFACE_TYPE.BOND
2380
2381 def clean(self):
2382- super(BondInterface, self).clean()
2383+ super().clean()
2384 # Validate that the MAC address is not None.
2385 if not self.mac_address:
2386 raise ValidationError(
2387@@ -1867,7 +1865,7 @@ class BondInterface(ChildInterface):
2388 self.node = self.get_node()
2389 # Set the enabled status based on its parents.
2390 self.enabled = self.is_enabled()
2391- super(BondInterface, self).save(*args, **kwargs)
2392+ super().save(*args, **kwargs)
2393
2394
2395 def build_vlan_interface_name(parent, vlan):
2396@@ -1933,7 +1931,7 @@ class VLANInterface(ChildInterface):
2397 return "vlan%s" % vid
2398
2399 def clean(self):
2400- super(VLANInterface, self).clean()
2401+ super().clean()
2402 if self.id is not None:
2403 # Use the precache here instead of the count() method.
2404 parents = self.parents.all()
2405@@ -2002,7 +2000,7 @@ class VLANInterface(ChildInterface):
2406 new_name = self.get_name()
2407 if self.name != new_name:
2408 self.name = new_name
2409- return super(VLANInterface, self).save(*args, **kwargs)
2410+ return super().save(*args, **kwargs)
2411
2412
2413 class UnknownInterface(Interface):
2414@@ -2019,7 +2017,7 @@ class UnknownInterface(Interface):
2415 return None
2416
2417 def clean(self):
2418- super(UnknownInterface, self).clean()
2419+ super().clean()
2420 if self.node is not None:
2421 raise ValidationError({"node": ["This field must be blank."]})
2422
2423diff --git a/src/maasserver/models/iprange.py b/src/maasserver/models/iprange.py
2424index 2f4ec90..e8d1777 100644
2425--- a/src/maasserver/models/iprange.py
2426+++ b/src/maasserver/models/iprange.py
2427@@ -45,7 +45,7 @@ class IPRangeQueriesMixin(MAASQueriesMixin):
2428 "start_ip": "__start_ip",
2429 "end_ip": "__end_ip",
2430 }
2431- return super(IPRangeQueriesMixin, self).get_specifiers_q(
2432+ return super().get_specifiers_q(
2433 specifiers,
2434 specifier_types=specifier_types,
2435 separator=separator,
2436diff --git a/src/maasserver/models/iscsiblockdevice.py b/src/maasserver/models/iscsiblockdevice.py
2437index 8aaf6e9..ccb01a6 100644
2438--- a/src/maasserver/models/iscsiblockdevice.py
2439+++ b/src/maasserver/models/iscsiblockdevice.py
2440@@ -66,4 +66,4 @@ class ISCSIBlockDevice(BlockDevice):
2441 def save(self, *args, **kwargs):
2442 # Normilize the target to always include a 'iscsi:' at the start.
2443 self.target = get_iscsi_target(self.target)
2444- return super(ISCSIBlockDevice, self).save(*args, **kwargs)
2445+ return super().save(*args, **kwargs)
2446diff --git a/src/maasserver/models/largefile.py b/src/maasserver/models/largefile.py
2447index 5d0a24d..90b2c78 100644
2448--- a/src/maasserver/models/largefile.py
2449+++ b/src/maasserver/models/largefile.py
2450@@ -146,7 +146,7 @@ class LargeFile(CleanSave, TimestampedModel):
2451 for link in links:
2452 if getattr(self, link).exists():
2453 return
2454- super(LargeFile, self).delete(*args, **kwargs)
2455+ super().delete(*args, **kwargs)
2456
2457
2458 @asynchronous(timeout=FOREVER)
2459diff --git a/src/maasserver/models/licensekey.py b/src/maasserver/models/licensekey.py
2460index 54559bf..83da5ef 100644
2461--- a/src/maasserver/models/licensekey.py
2462+++ b/src/maasserver/models/licensekey.py
2463@@ -76,6 +76,4 @@ class LicenseKey(TimestampedModel):
2464 "License key with this operating system and distro series",
2465 "already exists.",
2466 )
2467- return super(LicenseKey, self).unique_error_message(
2468- model_class, unique_check
2469- )
2470+ return super().unique_error_message(model_class, unique_check)
2471diff --git a/src/maasserver/models/neighbour.py b/src/maasserver/models/neighbour.py
2472index fef3e18..3065c3e 100644
2473--- a/src/maasserver/models/neighbour.py
2474+++ b/src/maasserver/models/neighbour.py
2475@@ -30,7 +30,7 @@ class NeighbourQueriesMixin(MAASQueriesMixin):
2476 "ip": "__ip",
2477 "mac": "__mac_address",
2478 }
2479- return super(NeighbourQueriesMixin, self).get_specifiers_q(
2480+ return super().get_specifiers_q(
2481 specifiers,
2482 specifier_types=specifier_types,
2483 separator=separator,
2484diff --git a/src/maasserver/models/node.py b/src/maasserver/models/node.py
2485index 7e867cd..c226dae 100644
2486--- a/src/maasserver/models/node.py
2487+++ b/src/maasserver/models/node.py
2488@@ -1898,7 +1898,7 @@ class Node(CleanSave, TimestampedModel):
2489 )
2490
2491 def clean(self, *args, **kwargs):
2492- super(Node, self).clean(*args, **kwargs)
2493+ super().clean(*args, **kwargs)
2494 self.prev_bmc_id = self._state.get_old_value("bmc_id")
2495 if self._state.has_changed("hostname"):
2496 self.clean_hostname_domain()
2497@@ -1951,7 +1951,7 @@ class Node(CleanSave, TimestampedModel):
2498 ):
2499 kwargs["update_fields"].append("status_expires")
2500
2501- super(Node, self).save(*args, **kwargs)
2502+ super().save(*args, **kwargs)
2503
2504 # We let hostname be blank for the initial save, but fix it before the
2505 # save completes. This is because set_random_hostname() operates by
2506@@ -2949,7 +2949,7 @@ class Node(CleanSave, TimestampedModel):
2507 )
2508 self.bmc.delete()
2509
2510- super(Node, self).delete(*args, **kwargs)
2511+ super().delete(*args, **kwargs)
2512
2513 def set_random_hostname(self):
2514 """Set a random `hostname`."""
2515@@ -6082,9 +6082,7 @@ class Machine(Node):
2516 proxy = True
2517
2518 def __init__(self, *args, **kwargs):
2519- super(Machine, self).__init__(
2520- node_type=NODE_TYPE.MACHINE, *args, **kwargs
2521- )
2522+ super().__init__(node_type=NODE_TYPE.MACHINE, *args, **kwargs)
2523
2524 def delete(self, force=False):
2525 """Deletes this Machine.
2526@@ -6107,7 +6105,7 @@ class Controller(Node):
2527 proxy = True
2528
2529 def __init__(self, *args, **kwargs):
2530- super(Controller, self).__init__(*args, **kwargs)
2531+ super().__init__(*args, **kwargs)
2532
2533 def _was_probably_machine(self):
2534 """Best guess if a rack was a machine.
2535@@ -6941,9 +6939,7 @@ class RackController(Controller):
2536 proxy = True
2537
2538 def __init__(self, *args, **kwargs):
2539- super(RackController, self).__init__(
2540- node_type=NODE_TYPE.RACK_CONTROLLER, *args, **kwargs
2541- )
2542+ super().__init__(node_type=NODE_TYPE.RACK_CONTROLLER, *args, **kwargs)
2543
2544 @inlineCallbacks
2545 def refresh(self):
2546@@ -7307,7 +7303,7 @@ class RegionController(Controller):
2547 proxy = True
2548
2549 def __init__(self, *args, **kwargs):
2550- super(RegionController, self).__init__(
2551+ super().__init__(
2552 node_type=NODE_TYPE.REGION_CONTROLLER, *args, **kwargs
2553 )
2554
2555@@ -7378,9 +7374,7 @@ class Device(Node):
2556 proxy = True
2557
2558 def __init__(self, *args, **kwargs):
2559- super(Device, self).__init__(
2560- node_type=NODE_TYPE.DEVICE, *args, **kwargs
2561- )
2562+ super().__init__(node_type=NODE_TYPE.DEVICE, *args, **kwargs)
2563
2564
2565 class NodeGroupToRackController(CleanSave, Model):
2566diff --git a/src/maasserver/models/nodemetadata.py b/src/maasserver/models/nodemetadata.py
2567index 7b13926..fdc3ccd 100644
2568--- a/src/maasserver/models/nodemetadata.py
2569+++ b/src/maasserver/models/nodemetadata.py
2570@@ -64,4 +64,4 @@ class NodeMetadata(CleanSave, TimestampedModel):
2571 def delete(self):
2572 """Delete this node metadata entry."""
2573 maaslog.info("%s: deleting key '%s'.", self, self.key)
2574- super(NodeMetadata, self).delete()
2575+ super().delete()
2576diff --git a/src/maasserver/models/notification.py b/src/maasserver/models/notification.py
2577index dba7383..ad862ba 100644
2578--- a/src/maasserver/models/notification.py
2579+++ b/src/maasserver/models/notification.py
2580@@ -236,7 +236,7 @@ class Notification(CleanSave, TimestampedModel):
2581 )
2582
2583 def clean(self):
2584- super(Notification, self).clean()
2585+ super().clean()
2586 # Elementary cleaning that Django can't seem to do for us, mainly
2587 # because setting blank=False causes any number of problems.
2588 if self.ident == "":
2589diff --git a/src/maasserver/models/packagerepository.py b/src/maasserver/models/packagerepository.py
2590index 446e231..4c45787 100644
2591--- a/src/maasserver/models/packagerepository.py
2592+++ b/src/maasserver/models/packagerepository.py
2593@@ -32,7 +32,7 @@ class PackageRepositoryQueriesMixin(MAASQueriesMixin):
2594 "id": "__id",
2595 "name": "__name",
2596 }
2597- return super(PackageRepositoryQueriesMixin, self).get_specifiers_q(
2598+ return super().get_specifiers_q(
2599 specifiers,
2600 specifier_types=specifier_types,
2601 separator=separator,
2602diff --git a/src/maasserver/models/partition.py b/src/maasserver/models/partition.py
2603index 021b471..109c7bb 100644
2604--- a/src/maasserver/models/partition.py
2605+++ b/src/maasserver/models/partition.py
2606@@ -261,12 +261,12 @@ class Partition(CleanSave, TimestampedModel):
2607 """Save partition."""
2608 if not self.uuid:
2609 self.uuid = uuid4()
2610- return super(Partition, self).save(*args, **kwargs)
2611+ return super().save(*args, **kwargs)
2612
2613 def clean(self, *args, **kwargs):
2614 self._round_size()
2615 self._validate_enough_space()
2616- super(Partition, self).clean(*args, **kwargs)
2617+ super().clean(*args, **kwargs)
2618
2619 def __str__(self):
2620 return "{size} partition on {bd}".format(
2621@@ -379,7 +379,7 @@ class Partition(CleanSave, TimestampedModel):
2622 "VMware ESXi partitions may not be removed. To remove select "
2623 "a different storage layout."
2624 )
2625- super(Partition, self).delete()
2626+ super().delete()
2627
2628 def add_tag(self, tag):
2629 """Add tag to partition."""
2630diff --git a/src/maasserver/models/partitiontable.py b/src/maasserver/models/partitiontable.py
2631index b238c4b..5c65ee6 100644
2632--- a/src/maasserver/models/partitiontable.py
2633+++ b/src/maasserver/models/partitiontable.py
2634@@ -145,7 +145,7 @@ class PartitionTable(CleanSave, TimestampedModel):
2635 return "Partition table for {bd}".format(bd=self.block_device)
2636
2637 def clean(self, *args, **kwargs):
2638- super(PartitionTable, self).clean(*args, **kwargs)
2639+ super().clean(*args, **kwargs)
2640 # Circular imports.
2641 from maasserver.models.virtualblockdevice import VirtualBlockDevice
2642
2643diff --git a/src/maasserver/models/physicalblockdevice.py b/src/maasserver/models/physicalblockdevice.py
2644index e9d28f9..4a1a841 100644
2645--- a/src/maasserver/models/physicalblockdevice.py
2646+++ b/src/maasserver/models/physicalblockdevice.py
2647@@ -91,7 +91,7 @@ class PhysicalBlockDevice(BlockDevice):
2648 raise ValidationError(
2649 "serial/model are required if id_path is not provided."
2650 )
2651- super(PhysicalBlockDevice, self).clean()
2652+ super().clean()
2653
2654 def __str__(self):
2655 return "{model} S/N {serial} {size} attached to {node}".format(
2656diff --git a/src/maasserver/models/resourcepool.py b/src/maasserver/models/resourcepool.py
2657index 0bc1673..f910a86 100644
2658--- a/src/maasserver/models/resourcepool.py
2659+++ b/src/maasserver/models/resourcepool.py
2660@@ -31,7 +31,7 @@ class ResourcePoolQueriesMixin(MAASQueriesMixin):
2661 "name": "__name",
2662 "id": "__id",
2663 }
2664- return super(ResourcePoolQueriesMixin, self).get_specifiers_q(
2665+ return super().get_specifiers_q(
2666 specifiers,
2667 specifier_types=specifier_types,
2668 separator=separator,
2669diff --git a/src/maasserver/models/signals/testing.py b/src/maasserver/models/signals/testing.py
2670index 0dfaea3..898cdeb 100644
2671--- a/src/maasserver/models/signals/testing.py
2672+++ b/src/maasserver/models/signals/testing.py
2673@@ -29,7 +29,7 @@ class SignalsDisabled(Fixture):
2674 are specified, ALL managers will be disabled. If the manager is
2675 already disabled it will not be enabled at clean-up.
2676 """
2677- super(SignalsDisabled, self).__init__()
2678+ super().__init__()
2679 if len(disable) == 0:
2680 self.disable = self.managers.values()
2681 else:
2682@@ -38,7 +38,7 @@ class SignalsDisabled(Fixture):
2683 }
2684
2685 def setUp(self):
2686- super(SignalsDisabled, self).setUp()
2687+ super().setUp()
2688 for manager in self.disable:
2689 if manager.enabled:
2690 self.addCleanup(manager.enable)
2691diff --git a/src/maasserver/models/signals/tests/test_events.py b/src/maasserver/models/signals/tests/test_events.py
2692index b3a63c2..7e8466e 100644
2693--- a/src/maasserver/models/signals/tests/test_events.py
2694+++ b/src/maasserver/models/signals/tests/test_events.py
2695@@ -17,7 +17,7 @@ from provisioningserver.events import EVENT_DETAILS, EVENT_TYPES
2696
2697 class TestStatusTransitionEvent(MAASServerTestCase):
2698 def setUp(self):
2699- super(TestStatusTransitionEvent, self).setUp()
2700+ super().setUp()
2701 # Circular imports.
2702 from maasserver.models import signals
2703
2704diff --git a/src/maasserver/models/signals/tests/test_nodes.py b/src/maasserver/models/signals/tests/test_nodes.py
2705index 1eb382a..5521afc 100644
2706--- a/src/maasserver/models/signals/tests/test_nodes.py
2707+++ b/src/maasserver/models/signals/tests/test_nodes.py
2708@@ -52,7 +52,7 @@ class TestNodePreviousStatus(MAASServerTestCase):
2709 """Test that `previous_status` is set when the status is changed."""
2710
2711 def setUp(self):
2712- super(TestNodePreviousStatus, self).setUp()
2713+ super().setUp()
2714 # Disable power signals: some status transitions prompt a power check.
2715 self.addCleanup(power.signals.enable)
2716 power.signals.disable()
2717@@ -97,7 +97,7 @@ class TestNodeClearsOwnerNEWOrREADYStatus(MAASServerTestCase):
2718 """
2719
2720 def setUp(self):
2721- super(TestNodeClearsOwnerNEWOrREADYStatus, self).setUp()
2722+ super().setUp()
2723 # Disable power signals: some status transitions prompt a power check.
2724 self.addCleanup(power.signals.enable)
2725 power.signals.disable()
2726diff --git a/src/maasserver/models/space.py b/src/maasserver/models/space.py
2727index 416affb..dee76eb 100644
2728--- a/src/maasserver/models/space.py
2729+++ b/src/maasserver/models/space.py
2730@@ -44,7 +44,7 @@ class SpaceQueriesMixin(MAASQueriesMixin):
2731 "name": "__name",
2732 "subnet": (Subnet.objects, "vlan__space"),
2733 }
2734- return super(SpaceQueriesMixin, self).get_specifiers_q(
2735+ return super().get_specifiers_q(
2736 specifiers,
2737 specifier_types=specifier_types,
2738 separator=separator,
2739@@ -170,7 +170,7 @@ class Space(CleanSave, TimestampedModel):
2740 self.save()
2741
2742 def clean(self, *args, **kwargs):
2743- super(Space, self).clean(*args, **kwargs)
2744+ super().clean(*args, **kwargs)
2745 self.clean_name()
2746
2747 @property
2748diff --git a/src/maasserver/models/sslkey.py b/src/maasserver/models/sslkey.py
2749index 92fe957..384a4d8 100644
2750--- a/src/maasserver/models/sslkey.py
2751+++ b/src/maasserver/models/sslkey.py
2752@@ -91,9 +91,7 @@ class SSLKey(CleanSave, TimestampedModel):
2753 def unique_error_message(self, model_class, unique_check):
2754 if unique_check == ("user", "key"):
2755 return "This key has already been added for this user."
2756- return super(SSLKey, self).unique_error_message(
2757- model_class, unique_check
2758- )
2759+ return super().unique_error_message(model_class, unique_check)
2760
2761 def __str__(self):
2762 return self.key
2763diff --git a/src/maasserver/models/staticipaddress.py b/src/maasserver/models/staticipaddress.py
2764index a2bbc6c..36512c8 100644
2765--- a/src/maasserver/models/staticipaddress.py
2766+++ b/src/maasserver/models/staticipaddress.py
2767@@ -993,7 +993,7 @@ class StaticIPAddress(CleanSave, TimestampedModel):
2768 )
2769
2770 def clean(self, *args, **kwargs):
2771- super(StaticIPAddress, self).clean(*args, **kwargs)
2772+ super().clean(*args, **kwargs)
2773 self.clean_subnet_and_ip_consistent()
2774
2775 def validate_unique(self, exclude=None):
2776diff --git a/src/maasserver/models/subnet.py b/src/maasserver/models/subnet.py
2777index d4d0798..ac10f0f 100644
2778--- a/src/maasserver/models/subnet.py
2779+++ b/src/maasserver/models/subnet.py
2780@@ -197,7 +197,7 @@ class SubnetQueriesMixin(MAASQueriesMixin):
2781 "vid": self._add_vlan_vid_query,
2782 "vlan": (VLAN.objects, "subnet"),
2783 }
2784- return super(SubnetQueriesMixin, self).get_specifiers_q(
2785+ return super().get_specifiers_q(
2786 specifiers,
2787 specifier_types=specifier_types,
2788 separator=separator,
2789diff --git a/src/maasserver/models/switch.py b/src/maasserver/models/switch.py
2790index 73a1684..b415886 100644
2791--- a/src/maasserver/models/switch.py
2792+++ b/src/maasserver/models/switch.py
2793@@ -55,4 +55,4 @@ class Switch(CleanSave, TimestampedModel):
2794 def delete(self):
2795 """Delete this switch."""
2796 maaslog.info("%s: Deleting switch", self)
2797- super(Switch, self).delete()
2798+ super().delete()
2799diff --git a/src/maasserver/models/tag.py b/src/maasserver/models/tag.py
2800index d01d263..9dc5449 100644
2801--- a/src/maasserver/models/tag.py
2802+++ b/src/maasserver/models/tag.py
2803@@ -77,7 +77,7 @@ class Tag(CleanSave, TimestampedModel):
2804 objects = TagManager()
2805
2806 def __init__(self, *args, **kwargs):
2807- super(Tag, self).__init__(*args, **kwargs)
2808+ super().__init__(*args, **kwargs)
2809 # Track what the original definition is, so we can detect when it
2810 # changes and we need to repopulate the node<=>tag mapping.
2811 # We have to check for self.id, otherwise we don't see the creation of
2812@@ -145,7 +145,7 @@ class Tag(CleanSave, TimestampedModel):
2813 :param populate: Whether or not to call `populate_nodes` if the
2814 definition has changed.
2815 """
2816- super(Tag, self).save(*args, **kwargs)
2817+ super().save(*args, **kwargs)
2818 if populate and (self.definition != self._original_definition):
2819 self.populate_nodes()
2820 self._original_definition = self.definition
2821diff --git a/src/maasserver/models/testing.py b/src/maasserver/models/testing.py
2822index 24daf49..9e24e2d 100644
2823--- a/src/maasserver/models/testing.py
2824+++ b/src/maasserver/models/testing.py
2825@@ -17,7 +17,7 @@ class SignalDisconnected(fixtures.Fixture): # DEPRECATED
2826 def __init__(
2827 self, signal, receiver, sender=None, weak=True, dispatch_uid=None
2828 ):
2829- super(SignalDisconnected, self).__init__()
2830+ super().__init__()
2831 self.signal = signal
2832 self.receiver = receiver
2833 self.sender = sender
2834@@ -25,7 +25,7 @@ class SignalDisconnected(fixtures.Fixture): # DEPRECATED
2835 self.dispatch_uid = dispatch_uid
2836
2837 def setUp(self):
2838- super(SignalDisconnected, self).setUp()
2839+ super().setUp()
2840 self.addCleanup(
2841 self.signal.connect,
2842 receiver=self.receiver,
2843@@ -49,11 +49,11 @@ class SignalsDisconnected(fixtures.Fixture): # DEPRECATED
2844 """
2845
2846 def __init__(self, *signals):
2847- super(SignalsDisconnected, self).__init__()
2848+ super().__init__()
2849 self.signals = signals
2850
2851 def setUp(self):
2852- super(SignalsDisconnected, self).setUp()
2853+ super().setUp()
2854
2855 def restore(signal, receivers):
2856 with signal.lock:
2857diff --git a/src/maasserver/models/tests/test_bootresource.py b/src/maasserver/models/tests/test_bootresource.py
2858index c7f747d..825bbec 100644
2859--- a/src/maasserver/models/tests/test_bootresource.py
2860+++ b/src/maasserver/models/tests/test_bootresource.py
2861@@ -348,7 +348,7 @@ class TestBootResourceManager(MAASServerTestCase):
2862
2863 class TestGetAvailableCommissioningResources(MAASServerTestCase):
2864 def setUp(self):
2865- super(TestGetAvailableCommissioningResources, self).setUp()
2866+ super().setUp()
2867 # Disable boot source cache signals.
2868 self.addCleanup(bootsources.signals.enable)
2869 bootsources.signals.disable()
2870diff --git a/src/maasserver/models/tests/test_bootsource.py b/src/maasserver/models/tests/test_bootsource.py
2871index 9b82fd8..12425cd 100644
2872--- a/src/maasserver/models/tests/test_bootsource.py
2873+++ b/src/maasserver/models/tests/test_bootsource.py
2874@@ -24,7 +24,7 @@ class TestBootSource(MAASServerTestCase):
2875 """Tests for the `BootSource` model."""
2876
2877 def setUp(self):
2878- super(TestBootSource, self).setUp()
2879+ super().setUp()
2880 # Disable boot source cache signals.
2881 self.addCleanup(bootsources.signals.enable)
2882 bootsources.signals.disable()
2883diff --git a/src/maasserver/models/tests/test_bootsourcecache.py b/src/maasserver/models/tests/test_bootsourcecache.py
2884index dd61bd9..9e2143a 100644
2885--- a/src/maasserver/models/tests/test_bootsourcecache.py
2886+++ b/src/maasserver/models/tests/test_bootsourcecache.py
2887@@ -13,7 +13,7 @@ from maasserver.testing.testcase import MAASServerTestCase
2888
2889 class TestBootSourceCache(MAASServerTestCase):
2890 def setUp(self):
2891- super(TestBootSourceCache, self).setUp()
2892+ super().setUp()
2893 # Disable boot source cache signals.
2894 self.addCleanup(bootsources.signals.enable)
2895 bootsources.signals.disable()
2896diff --git a/src/maasserver/models/tests/test_bootsourceselection.py b/src/maasserver/models/tests/test_bootsourceselection.py
2897index d5df0c1..7e2995b 100644
2898--- a/src/maasserver/models/tests/test_bootsourceselection.py
2899+++ b/src/maasserver/models/tests/test_bootsourceselection.py
2900@@ -17,7 +17,7 @@ class TestBootSourceSelection(MAASServerTestCase):
2901 """Tests for the `BootSourceSelection` model."""
2902
2903 def setUp(self):
2904- super(TestBootSourceSelection, self).setUp()
2905+ super().setUp()
2906 # Disable boot source cache signals.
2907 self.addCleanup(bootsources.signals.enable)
2908 bootsources.signals.disable()
2909diff --git a/src/maasserver/models/tests/test_config.py b/src/maasserver/models/tests/test_config.py
2910index 11ad067..e33a14e 100644
2911--- a/src/maasserver/models/tests/test_config.py
2912+++ b/src/maasserver/models/tests/test_config.py
2913@@ -236,7 +236,7 @@ class SettingConfigTest(MAASServerTestCase):
2914 scenarios = tuple((name, {"name": name}) for name in get_default_config())
2915
2916 def setUp(self):
2917- super(SettingConfigTest, self).setUp()
2918+ super().setUp()
2919 # Some of these setting we have to be careful about.
2920 if self.name in {"enable_http_proxy", "http_proxy"}:
2921 manager = signals.bootsources.signals
2922diff --git a/src/maasserver/models/tests/test_dnspublication.py b/src/maasserver/models/tests/test_dnspublication.py
2923index 3930196..62d5975 100644
2924--- a/src/maasserver/models/tests/test_dnspublication.py
2925+++ b/src/maasserver/models/tests/test_dnspublication.py
2926@@ -92,7 +92,7 @@ class TestDNSPublicationManager(MAASServerTestCase):
2927 """Test `DNSPublicationManager`."""
2928
2929 def setUp(self):
2930- super(TestDNSPublicationManager, self).setUp()
2931+ super().setUp()
2932 # These tests expect the DNSPublication table to be empty.
2933 DNSPublication.objects.all().delete()
2934
2935diff --git a/src/maasserver/models/tests/test_node.py b/src/maasserver/models/tests/test_node.py
2936index 3b9a6fb..642c5c6 100644
2937--- a/src/maasserver/models/tests/test_node.py
2938+++ b/src/maasserver/models/tests/test_node.py
2939@@ -978,7 +978,7 @@ class TestDeviceManager(MAASServerTestCase):
2940
2941 class TestNode(MAASServerTestCase):
2942 def setUp(self):
2943- super(TestNode, self).setUp()
2944+ super().setUp()
2945 self.patch_autospec(node_module, "power_driver_check")
2946
2947 def disable_node_query(self):
2948@@ -5612,7 +5612,7 @@ class TestNode(MAASServerTestCase):
2949
2950 class TestNodePowerParameters(MAASServerTestCase):
2951 def setUp(self):
2952- super(TestNodePowerParameters, self).setUp()
2953+ super().setUp()
2954 self.patch_autospec(node_module, "power_driver_check")
2955
2956 def test_power_parameters_are_stored(self):
2957@@ -8137,7 +8137,7 @@ class TestNode_Start(MAASTransactionServerTestCase):
2958 """Tests for Node.start()."""
2959
2960 def setUp(self):
2961- super(TestNode_Start, self).setUp()
2962+ super().setUp()
2963 self.patch_autospec(node_module, "power_driver_check")
2964
2965 def make_acquired_node_with_interface(
2966@@ -9051,7 +9051,7 @@ class TestNode_Stop(MAASServerTestCase):
2967 """Tests for Node.stop()."""
2968
2969 def setUp(self):
2970- super(TestNode_Stop, self).setUp()
2971+ super().setUp()
2972 self.patch_autospec(node_module, "power_driver_check")
2973
2974 def make_acquired_node_with_interface(
2975diff --git a/src/maasserver/models/tests/test_rbacsync.py b/src/maasserver/models/tests/test_rbacsync.py
2976index fc4df87..8835a7c 100644
2977--- a/src/maasserver/models/tests/test_rbacsync.py
2978+++ b/src/maasserver/models/tests/test_rbacsync.py
2979@@ -15,7 +15,7 @@ class TestRBACSync(MAASServerTestCase):
2980 """Test `RBACSync`."""
2981
2982 def setUp(self):
2983- super(TestRBACSync, self).setUp()
2984+ super().setUp()
2985 # These tests expect the RBACSync table to be empty.
2986 RBACSync.objects.all().delete()
2987
2988diff --git a/src/maasserver/models/timestampedmodel.py b/src/maasserver/models/timestampedmodel.py
2989index b13ec00..80b96a7 100644
2990--- a/src/maasserver/models/timestampedmodel.py
2991+++ b/src/maasserver/models/timestampedmodel.py
2992@@ -82,4 +82,4 @@ class TimestampedModel(Model, object):
2993 kwargs["update_fields"].add("created")
2994 if update_updated:
2995 kwargs["update_fields"].add("updated")
2996- return super(TimestampedModel, self).save(*args, **kwargs)
2997+ return super().save(*args, **kwargs)
2998diff --git a/src/maasserver/models/userprofile.py b/src/maasserver/models/userprofile.py
2999index 75e2b6f..68c7c00 100644
3000--- a/src/maasserver/models/userprofile.py
3001+++ b/src/maasserver/models/userprofile.py
3002@@ -93,7 +93,7 @@ class UserProfile(CleanSave, Model):
3003 self.user.filestorage_set.all().delete()
3004 self.user.consumers.all().delete()
3005 self.user.delete()
3006- super(UserProfile, self).delete()
3007+ super().delete()
3008
3009 def transfer_resources(self, new_owner):
3010 """Transfer owned resources to another user.
3011diff --git a/src/maasserver/models/virtualblockdevice.py b/src/maasserver/models/virtualblockdevice.py
3012index b59be68..8c49d1d 100644
3013--- a/src/maasserver/models/virtualblockdevice.py
3014+++ b/src/maasserver/models/virtualblockdevice.py
3015@@ -82,7 +82,7 @@ class VirtualBlockDevice(BlockDevice):
3016 return self.name
3017
3018 def clean(self, *args, **kwargs):
3019- super(VirtualBlockDevice, self).clean(*args, **kwargs)
3020+ super().clean(*args, **kwargs)
3021
3022 # First time called the node might not be set, so we handle the
3023 # DoesNotExist exception accordingly.
3024@@ -131,7 +131,7 @@ class VirtualBlockDevice(BlockDevice):
3025 def save(self, *args, **kwargs):
3026 if not self.uuid:
3027 self.uuid = uuid4()
3028- return super(VirtualBlockDevice, self).save(*args, **kwargs)
3029+ return super().save(*args, **kwargs)
3030
3031 def get_parents(self):
3032 """Return the blockdevices and partition which make up this device."""
3033diff --git a/src/maasserver/models/vlan.py b/src/maasserver/models/vlan.py
3034index 0450364..8df99b0 100644
3035--- a/src/maasserver/models/vlan.py
3036+++ b/src/maasserver/models/vlan.py
3037@@ -63,7 +63,7 @@ class VLANQueriesMixin(MAASQueriesMixin):
3038 "space": (Space.objects, "vlan"),
3039 "vid": self._add_vid_query,
3040 }
3041- return super(VLANQueriesMixin, self).get_specifiers_q(
3042+ return super().get_specifiers_q(
3043 specifiers,
3044 specifier_types=specifier_types,
3045 separator=separator,
3046@@ -274,7 +274,7 @@ class VLAN(CleanSave, TimestampedModel):
3047 )
3048 self.manage_connected_interfaces()
3049 self.manage_connected_subnets()
3050- super(VLAN, self).delete()
3051+ super().delete()
3052
3053 def save(self, *args, **kwargs):
3054 # Bug 1555759: Raise a Notification if there are no VLANs with DHCP
3055diff --git a/src/maasserver/models/zone.py b/src/maasserver/models/zone.py
3056index 151e46c..1cf3bf9 100644
3057--- a/src/maasserver/models/zone.py
3058+++ b/src/maasserver/models/zone.py
3059@@ -80,7 +80,7 @@ class Zone(CleanSave, TimestampedModel):
3060 raise ValidationError(
3061 "This zone is the default zone, it cannot be deleted."
3062 )
3063- super(Zone, self).delete()
3064+ super().delete()
3065
3066 @property
3067 def node_only_set(self):
3068diff --git a/src/maasserver/node_action.py b/src/maasserver/node_action.py
3069index a09f42e..417e680 100644
3070--- a/src/maasserver/node_action.py
3071+++ b/src/maasserver/node_action.py
3072@@ -627,7 +627,7 @@ class PowerOff(NodeAction):
3073 raise NodeActionError(exception)
3074
3075 def is_actionable(self):
3076- is_actionable = super(PowerOff, self).is_actionable()
3077+ is_actionable = super().is_actionable()
3078 return is_actionable and (self.node.power_state != POWER_STATE.OFF)
3079
3080
3081@@ -699,7 +699,7 @@ class MarkBroken(NodeAction):
3082
3083 def is_permitted(self):
3084 """Must also be owned to mark it broken."""
3085- permitted = super(MarkBroken, self).is_permitted()
3086+ permitted = super().is_permitted()
3087 return permitted and self.node.owner_id == self.user.id
3088
3089
3090diff --git a/src/maasserver/node_constraint_filter_forms.py b/src/maasserver/node_constraint_filter_forms.py
3091index bf33269..19fe00a 100644
3092--- a/src/maasserver/node_constraint_filter_forms.py
3093+++ b/src/maasserver/node_constraint_filter_forms.py
3094@@ -221,7 +221,7 @@ JUJU_ACQUIRE_FORM_FIELDS_MAPPING = {
3095 # XXX JeroenVermeulen 2014-02-06: Can we document this please?
3096 class RenamableFieldsForm(forms.Form):
3097 def __init__(self, *args, **kwargs):
3098- super(RenamableFieldsForm, self).__init__(*args, **kwargs)
3099+ super().__init__(*args, **kwargs)
3100 self.field_mapping = {name: name for name in self.fields}
3101
3102 def get_field_name(self, name):
3103@@ -599,7 +599,7 @@ def nodes_by_interface(
3104
3105 class LabeledConstraintMapField(Field):
3106 def __init__(self, *args, **kwargs):
3107- super(LabeledConstraintMapField, self).__init__(*args, **kwargs)
3108+ super().__init__(*args, **kwargs)
3109 self.validators.insert(
3110 0,
3111 lambda constraint_map: constraint_map.validate(
3112diff --git a/src/maasserver/nonces_cleanup.py b/src/maasserver/nonces_cleanup.py
3113index 9103314..99af8a7 100644
3114--- a/src/maasserver/nonces_cleanup.py
3115+++ b/src/maasserver/nonces_cleanup.py
3116@@ -102,6 +102,4 @@ class NonceCleanupService(TimerService, object):
3117
3118 def __init__(self, interval=(24 * 60 * 60)):
3119 cleanup = synchronous(transactional(cleanup_old_nonces))
3120- super(NonceCleanupService, self).__init__(
3121- interval, deferToDatabase, cleanup
3122- )
3123+ super().__init__(interval, deferToDatabase, cleanup)
3124diff --git a/src/maasserver/preseed.py b/src/maasserver/preseed.py
3125index 36c6567..b165401 100644
3126--- a/src/maasserver/preseed.py
3127+++ b/src/maasserver/preseed.py
3128@@ -761,7 +761,7 @@ class TemplateNotFoundError(Exception):
3129 """The template has not been found."""
3130
3131 def __init__(self, name):
3132- super(TemplateNotFoundError, self).__init__(name)
3133+ super().__init__(name)
3134 self.name = name
3135
3136
3137diff --git a/src/maasserver/prometheus/stats.py b/src/maasserver/prometheus/stats.py
3138index 3d5a5ea..865241f 100644
3139--- a/src/maasserver/prometheus/stats.py
3140+++ b/src/maasserver/prometheus/stats.py
3141@@ -252,7 +252,7 @@ class PrometheusService(TimerService, object):
3142 """
3143
3144 def __init__(self, interval=PROMETHEUS_SERVICE_PERIOD):
3145- super(PrometheusService, self).__init__(
3146+ super().__init__(
3147 interval.total_seconds(), self.maybe_push_prometheus_stats
3148 )
3149
3150diff --git a/src/maasserver/rack_controller.py b/src/maasserver/rack_controller.py
3151index 453b751..b275e6e 100644
3152--- a/src/maasserver/rack_controller.py
3153+++ b/src/maasserver/rack_controller.py
3154@@ -69,7 +69,7 @@ class RackControllerService(Service):
3155 :param postgresListener: The `PostgresListenerService` that is running
3156 in this regiond process.
3157 """
3158- super(RackControllerService, self).__init__()
3159+ super().__init__()
3160 self.clock = clock
3161 self.starting = None
3162 self.processing = LoopingCall(self.process)
3163@@ -83,7 +83,7 @@ class RackControllerService(Service):
3164 @asynchronous(timeout=FOREVER)
3165 def startService(self):
3166 """Start listening for messages."""
3167- super(RackControllerService, self).startService()
3168+ super().startService()
3169
3170 def cb_registerWithPostgres(processId):
3171 # Register the coreHandler with postgres.
3172@@ -135,7 +135,7 @@ class RackControllerService(Service):
3173 @asynchronous(timeout=FOREVER)
3174 def stopService(self):
3175 """Close the controller."""
3176- super(RackControllerService, self).stopService()
3177+ super().stopService()
3178
3179 def cleanUp():
3180 # Unregister the core handler.
3181diff --git a/src/maasserver/region_controller.py b/src/maasserver/region_controller.py
3182index eb232fb..bd073d6 100644
3183--- a/src/maasserver/region_controller.py
3184+++ b/src/maasserver/region_controller.py
3185@@ -79,7 +79,7 @@ class RegionControllerService(Service):
3186 :param postgresListener: The `PostgresListenerService` that is running
3187 in this regiond process.
3188 """
3189- super(RegionControllerService, self).__init__()
3190+ super().__init__()
3191 self.clock = clock
3192 self.retryOnFailure = retryOnFailure
3193 self.rbacRetryOnFailureDelay = rbacRetryOnFailureDelay
3194@@ -103,7 +103,7 @@ class RegionControllerService(Service):
3195 @asynchronous(timeout=FOREVER)
3196 def startService(self):
3197 """Start listening for messages."""
3198- super(RegionControllerService, self).startService()
3199+ super().startService()
3200 self.postgresListener.register("sys_dns", self.markDNSForUpdate)
3201 self.postgresListener.register("sys_proxy", self.markProxyForUpdate)
3202 self.postgresListener.register("sys_rbac", self.markRBACForUpdate)
3203@@ -114,7 +114,7 @@ class RegionControllerService(Service):
3204 @asynchronous(timeout=FOREVER)
3205 def stopService(self):
3206 """Close the controller."""
3207- super(RegionControllerService, self).stopService()
3208+ super().stopService()
3209 self.postgresListener.events.connected.unregisterHandler(
3210 self.markAllForUpdate
3211 )
3212diff --git a/src/maasserver/regiondservices/service_monitor_service.py b/src/maasserver/regiondservices/service_monitor_service.py
3213index 1424555..fb33692 100644
3214--- a/src/maasserver/regiondservices/service_monitor_service.py
3215+++ b/src/maasserver/regiondservices/service_monitor_service.py
3216@@ -29,9 +29,7 @@ class ServiceMonitorService(TimerService, object):
3217
3218 def __init__(self, clock=reactor):
3219 # Call self.monitorServices() every self.check_interval.
3220- super(ServiceMonitorService, self).__init__(
3221- self.check_interval, self.monitorServices
3222- )
3223+ super().__init__(self.check_interval, self.monitorServices)
3224 self.clock = clock
3225
3226 def monitorServices(self):
3227diff --git a/src/maasserver/regiondservices/tests/test_ntp.py b/src/maasserver/regiondservices/tests/test_ntp.py
3228index 1f15b7f..2e0fdff 100644
3229--- a/src/maasserver/regiondservices/tests/test_ntp.py
3230+++ b/src/maasserver/regiondservices/tests/test_ntp.py
3231@@ -63,7 +63,7 @@ class TestRegionNetworkTimeProtocolService(MAASTransactionServerTestCase):
3232 """Tests for `RegionNetworkTimeProtocolService`."""
3233
3234 def setUp(self):
3235- super(TestRegionNetworkTimeProtocolService, self).setUp()
3236+ super().setUp()
3237 self.useFixture(MAASRootFixture())
3238
3239 @transactional
3240diff --git a/src/maasserver/regiondservices/tests/test_syslog.py b/src/maasserver/regiondservices/tests/test_syslog.py
3241index 5cc46a9..2fe3bcd 100644
3242--- a/src/maasserver/regiondservices/tests/test_syslog.py
3243+++ b/src/maasserver/regiondservices/tests/test_syslog.py
3244@@ -69,7 +69,7 @@ class TestRegionSyslogService(MAASTransactionServerTestCase):
3245 """Tests for `RegionSyslogService`."""
3246
3247 def setUp(self):
3248- super(TestRegionSyslogService, self).setUp()
3249+ super().setUp()
3250 self.useFixture(MAASRootFixture())
3251
3252 @transactional
3253diff --git a/src/maasserver/rpc/regionservice.py b/src/maasserver/rpc/regionservice.py
3254index dde6640..552efe6 100644
3255--- a/src/maasserver/rpc/regionservice.py
3256+++ b/src/maasserver/rpc/regionservice.py
3257@@ -807,7 +807,7 @@ class RegionServer(Region):
3258 return
3259
3260 def connectionMade(self):
3261- super(RegionServer, self).connectionMade()
3262+ super().connectionMade()
3263 self.connid = str(uuid.uuid4())
3264 if self.factory.service.running:
3265 return self.performHandshake().addErrback(self.handshakeFailed)
3266@@ -824,7 +824,7 @@ class RegionServer(Region):
3267 )
3268 self.factory.service._removeConnectionFor(self.ident, self)
3269 log.msg("Rack controller '%s' disconnected." % self.ident)
3270- super(RegionServer, self).connectionLost(reason)
3271+ super().connectionLost(reason)
3272
3273
3274 def _get_call_latency_metric_labels(client, cmd, *args, **kwargs):
3275@@ -841,7 +841,7 @@ class RackClient(common.Client):
3276 cache_calls = [cluster.DescribePowerTypes, cluster.DescribeNOSTypes]
3277
3278 def __init__(self, connection, cache):
3279- super(RackClient, self).__init__(connection)
3280+ super().__init__(connection)
3281 self.cache = cache
3282
3283 def _getCallCache(self):
3284@@ -866,7 +866,7 @@ class RackClient(common.Client):
3285 """
3286 call_cache = self._getCallCache()
3287 if cmd not in self.cache_calls:
3288- return super(RackClient, self).__call__(cmd, *args, **kwargs)
3289+ return super().__call__(cmd, *args, **kwargs)
3290 if cmd in call_cache:
3291 # Call has already been made over this connection, just return
3292 # the original result.
3293@@ -880,7 +880,7 @@ class RackClient(common.Client):
3294 call_cache[cmd] = result
3295 return result
3296
3297- d = super(RackClient, self).__call__(cmd, *args, **kwargs)
3298+ d = super().__call__(cmd, *args, **kwargs)
3299 d.addCallback(cb_cache)
3300 return d
3301
3302@@ -907,7 +907,7 @@ class RegionService(service.Service, object):
3303 starting = None
3304
3305 def __init__(self, ipcWorker):
3306- super(RegionService, self).__init__()
3307+ super().__init__()
3308 self.ipcWorker = ipcWorker
3309 self.endpoints = [
3310 [TCP6ServerEndpoint(reactor, port) for port in range(5250, 5260)]
3311@@ -1031,7 +1031,7 @@ class RegionService(service.Service, object):
3312 @asynchronous
3313 def startService(self):
3314 """Start listening on an ephemeral port."""
3315- super(RegionService, self).startService()
3316+ super().startService()
3317 self.starting = defer.DeferredList(
3318 (
3319 self._bindFirst(endpoint_options, self.factory)
3320@@ -1076,7 +1076,7 @@ class RegionService(service.Service, object):
3321 yield conn.transport.loseConnection()
3322 except Exception:
3323 log.err(None, "Failure when closing RPC connection.")
3324- yield super(RegionService, self).stopService()
3325+ yield super().stopService()
3326
3327 @asynchronous(timeout=FOREVER)
3328 def getPort(self):
3329diff --git a/src/maasserver/rpc/testing/fixtures.py b/src/maasserver/rpc/testing/fixtures.py
3330index 4f33771..49fcfe6 100644
3331--- a/src/maasserver/rpc/testing/fixtures.py
3332+++ b/src/maasserver/rpc/testing/fixtures.py
3333@@ -50,7 +50,7 @@ def get_service_in_eventloop(name):
3334 @implementer(IConnection)
3335 class FakeConnection:
3336 def __init__(self, ident):
3337- super(FakeConnection, self).__init__()
3338+ super().__init__()
3339 self.protocol = clusterservice.Cluster()
3340 self.ident = ident
3341
3342@@ -72,7 +72,7 @@ class ClusterRPCFixture(fixtures.Fixture):
3343 """
3344
3345 def __init__(self):
3346- super(ClusterRPCFixture, self).__init__()
3347+ super().__init__()
3348 warn(
3349 (
3350 "ClusterRPCFixture is deprecated; use "
3351@@ -82,7 +82,7 @@ class ClusterRPCFixture(fixtures.Fixture):
3352 )
3353
3354 def setUp(self):
3355- super(ClusterRPCFixture, self).setUp()
3356+ super().setUp()
3357 # We need the event-loop up and running.
3358 if not eventloop.loop.running:
3359 raise RuntimeError(
3360@@ -110,7 +110,7 @@ class RunningClusterRPCFixture(fixtures.Fixture):
3361 """
3362
3363 def setUp(self):
3364- super(RunningClusterRPCFixture, self).setUp()
3365+ super().setUp()
3366 self.useFixture(RegionEventLoopFixture("rpc"))
3367 self.useFixture(RunningEventLoopFixture())
3368 self.useFixture(ClusterRPCFixture())
3369@@ -148,7 +148,7 @@ class MockRegionToClusterRPCFixture(fixtures.Fixture):
3370 """
3371
3372 def setUp(self):
3373- super(MockRegionToClusterRPCFixture, self).setUp()
3374+ super().setUp()
3375 # Ensure there's a shared-secret.
3376 self.secret = security.get_shared_secret()
3377 # We need the event-loop up and running.
3378@@ -277,7 +277,7 @@ class MockLiveRegionToClusterRPCFixture(fixtures.Fixture):
3379 self.rpc.startService().wait(10)
3380
3381 def setUp(self):
3382- super(MockLiveRegionToClusterRPCFixture, self).setUp()
3383+ super().setUp()
3384 self.monkey = MonkeyPatcher()
3385 # We need the event-loop up and running.
3386 if not eventloop.loop.running:
3387diff --git a/src/maasserver/rpc/testing/mixins.py b/src/maasserver/rpc/testing/mixins.py
3388index e2bc881..baa5797 100644
3389--- a/src/maasserver/rpc/testing/mixins.py
3390+++ b/src/maasserver/rpc/testing/mixins.py
3391@@ -28,7 +28,7 @@ class PreseedRPCMixin:
3392 """
3393
3394 def setUp(self):
3395- super(PreseedRPCMixin, self).setUp()
3396+ super().setUp()
3397 self.useFixture(RegionEventLoopFixture("rpc"))
3398 self.useFixture(RunningEventLoopFixture())
3399 self.rpc_fixture = MockLiveRegionToClusterRPCFixture()
3400diff --git a/src/maasserver/rpc/tests/test_boot.py b/src/maasserver/rpc/tests/test_boot.py
3401index 1c91b7a..8795f1d 100644
3402--- a/src/maasserver/rpc/tests/test_boot.py
3403+++ b/src/maasserver/rpc/tests/test_boot.py
3404@@ -82,7 +82,7 @@ class TestKparamsMerge(MAASServerTestCase):
3405
3406 class TestGetConfig(MAASServerTestCase):
3407 def setUp(self):
3408- super(TestGetConfig, self).setUp()
3409+ super().setUp()
3410 self.useFixture(RegionConfigurationFixture())
3411
3412 def tearDown(self):
3413diff --git a/src/maasserver/rpc/tests/test_configuration.py b/src/maasserver/rpc/tests/test_configuration.py
3414index a6fb19d..7788fdd 100644
3415--- a/src/maasserver/rpc/tests/test_configuration.py
3416+++ b/src/maasserver/rpc/tests/test_configuration.py
3417@@ -16,7 +16,7 @@ from maastesting.factory import factory
3418
3419 class TestGetProxies(MAASServerTestCase):
3420 def setUp(self):
3421- super(TestGetProxies, self).setUp()
3422+ super().setUp()
3423 # Disable boot source cache signals.
3424 self.addCleanup(bootsources.signals.enable)
3425 bootsources.signals.disable()
3426diff --git a/src/maasserver/rpc/tests/test_rackcontrollers.py b/src/maasserver/rpc/tests/test_rackcontrollers.py
3427index 482013d..429f04d 100644
3428--- a/src/maasserver/rpc/tests/test_rackcontrollers.py
3429+++ b/src/maasserver/rpc/tests/test_rackcontrollers.py
3430@@ -107,7 +107,7 @@ class TestHandleUpgrade(MAASServerTestCase):
3431
3432 class TestRegisterRackController(MAASServerTestCase):
3433 def setUp(self):
3434- super(TestRegisterRackController, self).setUp()
3435+ super().setUp()
3436 self.this_region = factory.make_RegionController()
3437 mock_running = self.patch(
3438 RegionController.objects, "get_running_controller"
3439diff --git a/src/maasserver/rpc/tests/test_regionservice_calls.py b/src/maasserver/rpc/tests/test_regionservice_calls.py
3440index 01ce0ff..72cddd1 100644
3441--- a/src/maasserver/rpc/tests/test_regionservice_calls.py
3442+++ b/src/maasserver/rpc/tests/test_regionservice_calls.py
3443@@ -239,7 +239,7 @@ class TestRegionProtocol_ReportBootImages(MAASTestCase):
3444
3445 class TestRegionProtocol_UpdateLease(MAASTransactionServerTestCase):
3446 def setUp(self):
3447- super(TestRegionProtocol_UpdateLease, self).setUp()
3448+ super().setUp()
3449 self.useFixture(RegionEventLoopFixture("database-tasks"))
3450
3451 def test_update_lease_is_registered(self):
3452@@ -714,7 +714,7 @@ class TestRegionProtocol_RegisterEventType(MAASTransactionServerTestCase):
3453
3454 class TestRegionProtocol_SendEvent(MAASTransactionServerTestCase):
3455 def setUp(self):
3456- super(TestRegionProtocol_SendEvent, self).setUp()
3457+ super().setUp()
3458 self.useFixture(RegionEventLoopFixture("database-tasks"))
3459
3460 def test_send_event_is_registered(self):
3461@@ -881,7 +881,7 @@ class TestRegionProtocol_SendEvent(MAASTransactionServerTestCase):
3462
3463 class TestRegionProtocol_SendEventMACAddress(MAASTransactionServerTestCase):
3464 def setUp(self):
3465- super(TestRegionProtocol_SendEventMACAddress, self).setUp()
3466+ super().setUp()
3467 self.useFixture(RegionEventLoopFixture("database-tasks"))
3468
3469 def test_send_event_mac_address_is_registered(self):
3470@@ -1050,7 +1050,7 @@ class TestRegionProtocol_SendEventMACAddress(MAASTransactionServerTestCase):
3471
3472 class TestRegionProtocol_UpdateServices(MAASTransactionServerTestCase):
3473 def setUp(self):
3474- super(TestRegionProtocol_UpdateServices, self).setUp()
3475+ super().setUp()
3476 self.useFixture(RegionEventLoopFixture("database-tasks"))
3477
3478 def test_update_services_is_registered(self):
3479diff --git a/src/maasserver/sequence.py b/src/maasserver/sequence.py
3480index 9777065..a9f8b59 100644
3481--- a/src/maasserver/sequence.py
3482+++ b/src/maasserver/sequence.py
3483@@ -55,7 +55,7 @@ class Sequence:
3484 :param cycle: If this sequence should cycle or not.
3485 :param owner: The table.column that owns this sequence.
3486 """
3487- super(Sequence, self).__init__()
3488+ super().__init__()
3489 self.name = name
3490 self.increment = increment
3491 self.minvalue = minvalue
3492diff --git a/src/maasserver/stats.py b/src/maasserver/stats.py
3493index 0466d13..3c8eb4e 100644
3494--- a/src/maasserver/stats.py
3495+++ b/src/maasserver/stats.py
3496@@ -266,7 +266,7 @@ class StatsService(TimerService, object):
3497 """
3498
3499 def __init__(self, interval=STATS_SERVICE_PERIOD):
3500- super(StatsService, self).__init__(
3501+ super().__init__(
3502 interval.total_seconds(), self.maybe_make_stats_request
3503 )
3504
3505diff --git a/src/maasserver/status_monitor.py b/src/maasserver/status_monitor.py
3506index 11c77e5..a599621 100644
3507--- a/src/maasserver/status_monitor.py
3508+++ b/src/maasserver/status_monitor.py
3509@@ -220,6 +220,4 @@ class StatusMonitorService(TimerService, object):
3510 """
3511
3512 def __init__(self, interval=60):
3513- super(StatusMonitorService, self).__init__(
3514- interval, deferToDatabase, check_status
3515- )
3516+ super().__init__(interval, deferToDatabase, check_status)
3517diff --git a/src/maasserver/storage_layouts.py b/src/maasserver/storage_layouts.py
3518index 98d86bd..8bb191d 100644
3519--- a/src/maasserver/storage_layouts.py
3520+++ b/src/maasserver/storage_layouts.py
3521@@ -54,9 +54,7 @@ class StorageLayoutBase(Form):
3522 root_size = BytesOrPercentageField(required=False)
3523
3524 def __init__(self, node, params: dict = None):
3525- super(StorageLayoutBase, self).__init__(
3526- data=({} if params is None else params)
3527- )
3528+ super().__init__(data=({} if params is None else params))
3529 self.node = node
3530 self.block_devices = self._load_physical_block_devices()
3531 self.boot_disk = node.get_boot_disk()
3532@@ -141,7 +139,7 @@ class StorageLayoutBase(Form):
3533
3534 def clean(self):
3535 """Validate the data."""
3536- cleaned_data = super(StorageLayoutBase, self).clean()
3537+ cleaned_data = super().clean()
3538 if len(self.block_devices) == 0:
3539 raise StorageLayoutMissingBootDiskError(
3540 "Node doesn't have any storage devices to configure."
3541@@ -425,7 +423,7 @@ class LVMStorageLayout(StorageLayoutBase):
3542
3543 def clean(self):
3544 """Validate the lv_size."""
3545- cleaned_data = super(LVMStorageLayout, self).clean()
3546+ cleaned_data = super().clean()
3547 lv_size = self.get_lv_size()
3548 if lv_size is not None:
3549 root_size = self.get_root_size()
3550@@ -634,7 +632,7 @@ class BcacheStorageLayoutBase(StorageLayoutBase):
3551 # Circular imports.
3552 from maasserver.models.blockdevice import MIN_BLOCK_DEVICE_SIZE
3553
3554- cleaned_data = super(BcacheStorageLayoutBase, self).clean()
3555+ cleaned_data = super().clean()
3556 cache_device = self.get_cache_device()
3557 cache_size = self.get_cache_size()
3558 cache_no_part = self.get_cache_no_part()
3559@@ -680,9 +678,7 @@ class BcacheStorageLayout(FlatStorageLayout, BcacheStorageLayoutBase):
3560 """
3561
3562 def __init__(self, node, params: dict = None):
3563- super(BcacheStorageLayout, self).__init__(
3564- node, params=({} if params is None else params)
3565- )
3566+ super().__init__(node, params=({} if params is None else params))
3567 self.setup_cache_device_field()
3568
3569 def configure_storage(self, allow_fallback):
3570@@ -695,9 +691,7 @@ class BcacheStorageLayout(FlatStorageLayout, BcacheStorageLayoutBase):
3571 if cache_block_device is None:
3572 if allow_fallback:
3573 # No cache device so just configure using the flat layout.
3574- return super(BcacheStorageLayout, self).configure_storage(
3575- allow_fallback
3576- )
3577+ return super().configure_storage(allow_fallback)
3578 else:
3579 raise StorageLayoutError(
3580 "Node doesn't have an available cache device to "
3581@@ -958,7 +952,7 @@ class StorageLayoutForm(Form):
3582
3583 def __init__(self, *args, **kwargs):
3584 required = kwargs.pop("required", False)
3585- super(StorageLayoutForm, self).__init__(*args, **kwargs)
3586+ super().__init__(*args, **kwargs)
3587 self.setup_field(required=required)
3588
3589 def setup_field(self, required=False):
3590diff --git a/src/maasserver/testing/api.py b/src/maasserver/testing/api.py
3591index c09cd3f..9cd5f39 100644
3592--- a/src/maasserver/testing/api.py
3593+++ b/src/maasserver/testing/api.py
3594@@ -136,7 +136,7 @@ class APITestCaseBase(MAASTestCase, metaclass=APITestType):
3595 client = None
3596
3597 def __init__(self, *args, **kwargs):
3598- super(APITestCaseBase, self).__init__(*args, **kwargs)
3599+ super().__init__(*args, **kwargs)
3600 # Create scenarios for userfactories and clientfactories.
3601 scenarios_users = tuple(
3602 ("user=%s" % name, {"userfactory": self.userfactories[name]})
3603@@ -172,7 +172,7 @@ class APITestCaseBase(MAASTestCase, metaclass=APITestType):
3604 raise AssertionError(
3605 "Do not set client; set clientfactory instead."
3606 )
3607- super(APITestCaseBase, self).setUp()
3608+ super().setUp()
3609 self.user = self.userfactory()
3610 self.client = self.clientfactory()
3611 self.client.login(user=self.user)
3612diff --git a/src/maasserver/testing/database.py b/src/maasserver/testing/database.py
3613index 582de9b..6e54002 100644
3614--- a/src/maasserver/testing/database.py
3615+++ b/src/maasserver/testing/database.py
3616@@ -19,7 +19,7 @@ class MAASClusterFixture(ClusterFixture):
3617 self.connection = connections[
3618 DEFAULT_DB_ALIAS if database is None else database
3619 ]
3620- super(MAASClusterFixture, self).__init__(
3621+ super().__init__(
3622 datadir=self.connection.settings_dict["HOST"], preserve=True
3623 )
3624
3625@@ -28,5 +28,5 @@ class MAASClusterFixture(ClusterFixture):
3626 return self.connection.settings_dict["NAME"]
3627
3628 def setUp(self):
3629- super(MAASClusterFixture, self).setUp()
3630+ super().setUp()
3631 self.createdb(self.dbname)
3632diff --git a/src/maasserver/testing/eventloop.py b/src/maasserver/testing/eventloop.py
3633index 7355d35..ef8278d 100644
3634--- a/src/maasserver/testing/eventloop.py
3635+++ b/src/maasserver/testing/eventloop.py
3636@@ -27,7 +27,7 @@ class RegionEventLoopFixture(Fixture):
3637 """
3638
3639 def __init__(self, *services):
3640- super(RegionEventLoopFixture, self).__init__()
3641+ super().__init__()
3642 self.services = services
3643
3644 def checkEventLoopClean(self):
3645@@ -52,7 +52,7 @@ class RegionEventLoopFixture(Fixture):
3646 eventloop.loop.services._set_globals = self.original_set_globals
3647
3648 def setUp(self):
3649- super(RegionEventLoopFixture, self).setUp()
3650+ super().setUp()
3651 # Patch start_up in the eventloop.
3652 self.original_prepare = eventloop.loop.prepare
3653 self.original_set_globals = eventloop.loop.services._set_globals
3654@@ -108,7 +108,7 @@ class RunningEventLoopFixture(Fixture):
3655 eventloop.loop.services._set_globals = self.original_set_globals
3656
3657 def setUp(self):
3658- super(RunningEventLoopFixture, self).setUp()
3659+ super().setUp()
3660 # Patch start_up in the eventloop.
3661 self.original_prepare = eventloop.loop.prepare
3662 self.original_set_globals = eventloop.loop.services._set_globals
3663diff --git a/src/maasserver/testing/fixtures.py b/src/maasserver/testing/fixtures.py
3664index e8a720a..1350fd8 100644
3665--- a/src/maasserver/testing/fixtures.py
3666+++ b/src/maasserver/testing/fixtures.py
3667@@ -55,7 +55,7 @@ class LogSQL(fixtures.Fixture):
3668 """
3669
3670 def __init__(self, include_stacktrace=False):
3671- super(LogSQL, self).__init__()
3672+ super().__init__()
3673 self.include_stacktrace = include_stacktrace
3674
3675 def _setUp(self):
3676diff --git a/src/maasserver/testing/matchers.py b/src/maasserver/testing/matchers.py
3677index f92d40d..27725d3 100644
3678--- a/src/maasserver/testing/matchers.py
3679+++ b/src/maasserver/testing/matchers.py
3680@@ -33,7 +33,7 @@ class HasStatusCode(Matcher):
3681 """
3682
3683 def __init__(self, status_code):
3684- super(HasStatusCode, self).__init__()
3685+ super().__init__()
3686 self.status_code = status_code
3687
3688 def match(self, response):
3689@@ -70,4 +70,4 @@ class MatchesSetwiseWithAll(MatchesSetwise):
3690 """
3691
3692 def match(self, observed):
3693- return super(MatchesSetwiseWithAll, self).match(observed.all())
3694+ return super().match(observed.all())
3695diff --git a/src/maasserver/testing/orm.py b/src/maasserver/testing/orm.py
3696index 077bc63..74f4fde 100644
3697--- a/src/maasserver/testing/orm.py
3698+++ b/src/maasserver/testing/orm.py
3699@@ -44,7 +44,7 @@ class PostCommitHooksTestMixin(testtools.TestCase):
3700
3701 def setUp(self):
3702 try:
3703- super(PostCommitHooksTestMixin, self).setUp()
3704+ super().setUp()
3705 description_of_hooks = "\n".join(
3706 gen_description_of_hooks(post_commit_hooks.hooks)
3707 )
3708@@ -71,7 +71,7 @@ class PostCommitHooksTestMixin(testtools.TestCase):
3709 "One or more post-commit tasks were present at the end of "
3710 "this test.\n" + description_of_hooks,
3711 )
3712- super(PostCommitHooksTestMixin, self).tearDown()
3713+ super().tearDown()
3714 finally:
3715 # By this point we will have reported the leaked post-commit
3716 # tasks, so always reset them; we don't want to report them again,
3717diff --git a/src/maasserver/testing/resources.py b/src/maasserver/testing/resources.py
3718index ad15d71..550f4b7 100644
3719--- a/src/maasserver/testing/resources.py
3720+++ b/src/maasserver/testing/resources.py
3721@@ -186,7 +186,7 @@ class DjangoDatabasesManager(TestResourceManager):
3722 resources = (("templates", DjangoPristineDatabaseManager()),)
3723
3724 def __init__(self, assume_dirty=True):
3725- super(DjangoDatabasesManager, self).__init__()
3726+ super().__init__()
3727 self._count = count(1)
3728 self.dirty = assume_dirty
3729
3730diff --git a/src/maasserver/testing/testcase.py b/src/maasserver/testing/testcase.py
3731index bde2559..6931d44 100644
3732--- a/src/maasserver/testing/testcase.py
3733+++ b/src/maasserver/testing/testcase.py
3734@@ -70,12 +70,12 @@ class MAASRegionTestCaseBase(PostCommitHooksTestMixin):
3735
3736 @classmethod
3737 def setUpClass(cls):
3738- super(MAASRegionTestCaseBase, cls).setUpClass()
3739+ super().setUpClass()
3740 register_mac_type(connection.cursor())
3741
3742 def setUp(self):
3743 reset_queries() # Formerly this was handled by... Django?
3744- super(MAASRegionTestCaseBase, self).setUp()
3745+ super().setUp()
3746
3747 def setUpFixtures(self):
3748 """This should be called by a subclass once other set-up is done."""
3749@@ -106,11 +106,11 @@ class MAASLegacyServerTestCase(MAASRegionTestCaseBase, DjangoTestCase):
3750 """
3751
3752 def setUp(self):
3753- super(MAASLegacyServerTestCase, self).setUp()
3754+ super().setUp()
3755 self.setUpFixtures()
3756
3757 def setUpFixtures(self):
3758- super(MAASLegacyServerTestCase, self).setUpFixtures()
3759+ super().setUpFixtures()
3760 # XXX: allenap bug=1427628 2015-03-03: This should not be here.
3761 self.useFixture(PackageRepositoryFixture())
3762
3763@@ -124,11 +124,11 @@ class MAASLegacyTransactionServerTestCase(
3764 """
3765
3766 def setUp(self):
3767- super(MAASLegacyTransactionServerTestCase, self).setUp()
3768+ super().setUp()
3769 self.setUpFixtures()
3770
3771 def setUpFixtures(self):
3772- super(MAASLegacyTransactionServerTestCase, self).setUpFixtures()
3773+ super().setUpFixtures()
3774 # XXX: allenap bug=1427628 2015-03-03: This should not be here.
3775 self.useFixture(PackageRepositoryFixture())
3776
3777@@ -142,7 +142,7 @@ class MAASServerTestCase(MAASRegionTestCaseBase, MAASTestCase):
3778 database_use_permitted = True
3779
3780 def setUp(self):
3781- super(MAASServerTestCase, self).setUp()
3782+ super().setUp()
3783 self.beginTransaction()
3784 self.addCleanup(self.endTransaction)
3785 self.setUpFixtures()
3786@@ -179,7 +179,7 @@ class MAASTransactionServerTestCase(MAASRegionTestCaseBase, MAASTestCase):
3787 database_use_permitted = True
3788
3789 def setUp(self):
3790- super(MAASTransactionServerTestCase, self).setUp()
3791+ super().setUp()
3792 self.assertNotInTransaction()
3793 self.addCleanup(self.assertNotInTransaction)
3794 self.setUpFixtures()
3795@@ -197,7 +197,7 @@ class SerializationFailureTestCase(
3796 cursor.execute("DROP TABLE IF EXISTS stest")
3797
3798 def setUp(self):
3799- super(SerializationFailureTestCase, self).setUp()
3800+ super().setUp()
3801 self.create_stest_table()
3802 # Put something into the stest table upon which to trigger a
3803 # serialization failure.
3804@@ -206,7 +206,7 @@ class SerializationFailureTestCase(
3805 cursor.execute("INSERT INTO stest VALUES (1)")
3806
3807 def tearDown(self):
3808- super(SerializationFailureTestCase, self).tearDown()
3809+ super().tearDown()
3810 self.drop_stest_table()
3811
3812 def cause_serialization_failure(self):
3813@@ -282,12 +282,12 @@ class UniqueViolationTestCase(
3814 cursor.execute("DROP TABLE IF EXISTS uvtest")
3815
3816 def setUp(self):
3817- super(UniqueViolationTestCase, self).setUp()
3818+ super().setUp()
3819 self.conflicting_values = count(1)
3820 self.create_uvtest_table()
3821
3822 def tearDown(self):
3823- super(UniqueViolationTestCase, self).tearDown()
3824+ super().tearDown()
3825 self.drop_uvtest_table()
3826
3827 def cause_unique_violation(self):
3828diff --git a/src/maasserver/testing/testclient.py b/src/maasserver/testing/testclient.py
3829index 5fa4e8f..3905430 100644
3830--- a/src/maasserver/testing/testclient.py
3831+++ b/src/maasserver/testing/testclient.py
3832@@ -39,7 +39,7 @@ class MAASSensibleGetPathMixin:
3833 script_path = settings.FORCE_SCRIPT_NAME.rstrip("/")
3834 if parsed.path.startswith(script_path):
3835 parsed = parsed._replace(path=parsed.path[len(script_path) :])
3836- return super(MAASSensibleGetPathMixin, self)._get_path(parsed)
3837+ return super()._get_path(parsed)
3838
3839
3840 class MAASSensibleRequestFactory(MAASSensibleGetPathMixin, RequestFactory):
3841@@ -60,7 +60,7 @@ class MAASSensibleClient(MAASSensibleGetPathMixin, SensibleClient):
3842 # Make sure that requests are done within a transaction. Some kinds of
3843 # tests will already have a transaction in progress, in which case
3844 # this will act like a sub-transaction, but that's fine.
3845- upcall = transactional(super(MAASSensibleClient, self).request)
3846+ upcall = transactional(super().request)
3847 # If we're outside of a transaction right now then the transactional()
3848 # wrapper above will ensure that post-commit hooks are run or reset on
3849 # return from the request. However, we want to ensure that post-commit
3850@@ -71,7 +71,7 @@ class MAASSensibleClient(MAASSensibleGetPathMixin, SensibleClient):
3851 @transactional
3852 def login(self, *, user=None, **credentials):
3853 if user is None:
3854- return super(MAASSensibleClient, self).login(**credentials)
3855+ return super().login(**credentials)
3856 elif user.is_anonymous:
3857 self.logout()
3858 return False
3859@@ -80,7 +80,7 @@ class MAASSensibleClient(MAASSensibleGetPathMixin, SensibleClient):
3860 credentials["username"] = user.username
3861 user.set_password(password)
3862 user.save()
3863- return super(MAASSensibleClient, self).login(**credentials)
3864+ return super().login(**credentials)
3865
3866
3867 class MAASSensibleOAuthClient(MAASSensibleClient):
3868@@ -95,7 +95,7 @@ class MAASSensibleOAuthClient(MAASSensibleClient):
3869 no `token` is given, the user's first token will be used.
3870 :type token: oauth.oauth.OAuthToken
3871 """
3872- super(MAASSensibleOAuthClient, self).__init__()
3873+ super().__init__()
3874 if user is not None or token is not None:
3875 self.login(user=user, token=token)
3876 else:
3877@@ -158,4 +158,4 @@ class MAASSensibleOAuthClient(MAASSensibleClient):
3878 url = self._compose_url(kwargs["PATH_INFO"])
3879 if self.consumer is not None:
3880 kwargs.update(self._compose_auth_header(url))
3881- return super(MAASSensibleOAuthClient, self).request(**kwargs)
3882+ return super().request(**kwargs)
3883diff --git a/src/maasserver/tests/test_bootresources.py b/src/maasserver/tests/test_bootresources.py
3884index 10d6e1f..c0129c5 100644
3885--- a/src/maasserver/tests/test_bootresources.py
3886+++ b/src/maasserver/tests/test_bootresources.py
3887@@ -133,7 +133,7 @@ class SimplestreamsEnvFixture(Fixture):
3888 simplestreams."""
3889
3890 def setUp(self):
3891- super(SimplestreamsEnvFixture, self).setUp()
3892+ super().setUp()
3893 prior_env = {}
3894 for key in ["GNUPGHOME", "http_proxy", "https_proxy"]:
3895 prior_env[key] = os.environ.get(key, "")
3896@@ -565,7 +565,7 @@ class TestConnectionWrapper(MAASTransactionServerTestCase):
3897
3898 class AssertConnectionWrapper(bootresources.ConnectionWrapper):
3899 def _set_up(self):
3900- super(AssertConnectionWrapper, self)._set_up()
3901+ super()._set_up()
3902 # Capture the created connection
3903 AssertConnectionWrapper.connection = self._connection
3904
3905@@ -1603,7 +1603,7 @@ class TestSetGlobalDefaultReleases(MAASServerTestCase):
3906
3907 class TestImportImages(MAASTransactionServerTestCase):
3908 def setUp(self):
3909- super(TestImportImages, self).setUp()
3910+ super().setUp()
3911 self.useFixture(SimplestreamsEnvFixture())
3912 # Don't create the gnupg home directory.
3913 self.patch_autospec(bootresources, "create_gnupg_home")
3914diff --git a/src/maasserver/tests/test_bootsources.py b/src/maasserver/tests/test_bootsources.py
3915index 69e3fe3..797efeb 100644
3916--- a/src/maasserver/tests/test_bootsources.py
3917+++ b/src/maasserver/tests/test_bootsources.py
3918@@ -99,7 +99,7 @@ def make_boot_image_mapping(image_specs=None):
3919
3920 class TestHelpers(MAASServerTestCase):
3921 def setUp(self):
3922- super(TestHelpers, self).setUp()
3923+ super().setUp()
3924 # Disable boot source cache signals.
3925 self.addCleanup(bootsources_signals.enable)
3926 bootsources_signals.disable()
3927@@ -224,7 +224,7 @@ class TestHelpers(MAASServerTestCase):
3928
3929 class TestGetOSInfoFromBootSources(MAASServerTestCase):
3930 def setUp(self):
3931- super(TestGetOSInfoFromBootSources, self).setUp()
3932+ super().setUp()
3933 # Disable boot source cache signals.
3934 self.addCleanup(bootsources_signals.enable)
3935 bootsources_signals.disable()
3936@@ -265,7 +265,7 @@ class TestGetOSInfoFromBootSources(MAASServerTestCase):
3937
3938 class TestPrivateUpdateCache(MAASServerTestCase):
3939 def setUp(self):
3940- super(TestPrivateUpdateCache, self).setUp()
3941+ super().setUp()
3942 self.useFixture(SimplestreamsEnvFixture())
3943 # Disable boot source cache signals.
3944 self.addCleanup(bootsources_signals.enable)
3945@@ -344,7 +344,7 @@ class TestPrivateUpdateCache(MAASServerTestCase):
3946
3947 class TestPrivateCacheBootSources(MAASTransactionServerTestCase):
3948 def setUp(self):
3949- super(TestPrivateCacheBootSources, self).setUp()
3950+ super().setUp()
3951 self.useFixture(SimplestreamsEnvFixture())
3952 # Disable boot source cache signals.
3953 self.addCleanup(bootsources_signals.enable)
3954@@ -553,7 +553,7 @@ class TestPrivateCacheBootSources(MAASTransactionServerTestCase):
3955
3956 class TestBadConnectionHandling(MAASTransactionServerTestCase):
3957 def setUp(self):
3958- super(TestBadConnectionHandling, self).setUp()
3959+ super().setUp()
3960 self.useFixture(SimplestreamsEnvFixture())
3961 # Disable boot source cache signals.
3962 self.addCleanup(bootsources_signals.enable)
3963diff --git a/src/maasserver/tests/test_commands_edit_named_options.py b/src/maasserver/tests/test_commands_edit_named_options.py
3964index 20e2c41..23c256f 100644
3965--- a/src/maasserver/tests/test_commands_edit_named_options.py
3966+++ b/src/maasserver/tests/test_commands_edit_named_options.py
3967@@ -86,7 +86,7 @@ OPTIONS_FILE_WITH_EXTRA_AND_DUP_FORWARDER = textwrap.dedent(
3968
3969 class TestEditNamedOptionsCommand(MAASServerTestCase):
3970 def setUp(self):
3971- super(TestEditNamedOptionsCommand, self).setUp()
3972+ super().setUp()
3973 self.stdout = StringIO()
3974
3975 def assertFailsWithMessage(self, config_path, message):
3976diff --git a/src/maasserver/tests/test_ipc.py b/src/maasserver/tests/test_ipc.py
3977index 568b4f2..f46cf67 100644
3978--- a/src/maasserver/tests/test_ipc.py
3979+++ b/src/maasserver/tests/test_ipc.py
3980@@ -75,7 +75,7 @@ class TestIPCCommunication(MAASTransactionServerTestCase):
3981 run_tests_with = MAASCrochetRunTest
3982
3983 def setUp(self):
3984- super(TestIPCCommunication, self).setUp()
3985+ super().setUp()
3986 self.ipc_path = os.path.join(
3987 self.useFixture(TempDirectory()).path, "maas-regiond.sock"
3988 )
3989diff --git a/src/maasserver/tests/test_ntp.py b/src/maasserver/tests/test_ntp.py
3990index 9bd20ca..8670bbf 100644
3991--- a/src/maasserver/tests/test_ntp.py
3992+++ b/src/maasserver/tests/test_ntp.py
3993@@ -57,7 +57,7 @@ class TestGetServersFor_ExternalOnly(MAASServerTestCase):
3994 )
3995
3996 def setUp(self):
3997- super(TestGetServersFor_ExternalOnly, self).setUp()
3998+ super().setUp()
3999 Config.objects.set_config("ntp_external_only", True)
4000
4001 def test_yields_nothing_when_no_ntp_servers_defined(self):
4002@@ -79,7 +79,7 @@ class TestGetServersFor_Common(MAASServerTestCase):
4003 """
4004
4005 def setUp(self):
4006- super(TestGetServersFor_Common, self).setUp()
4007+ super().setUp()
4008 Config.objects.set_config("ntp_external_only", False)
4009
4010
4011@@ -259,7 +259,7 @@ class TestGetServersFor_Selection(MAASServerTestCase):
4012 )
4013
4014 def setUp(self):
4015- super(TestGetServersFor_Selection, self).setUp()
4016+ super().setUp()
4017 Config.objects.set_config("ntp_external_only", False)
4018
4019 def test_prefers_closest_addresses(self):
4020diff --git a/src/maasserver/tests/test_plugin.py b/src/maasserver/tests/test_plugin.py
4021index c39017d..cfe7225 100644
4022--- a/src/maasserver/tests/test_plugin.py
4023+++ b/src/maasserver/tests/test_plugin.py
4024@@ -64,7 +64,7 @@ class TestServiceMaker(MAASTestCase):
4025 """Mixin with helpers for all the service marker tests."""
4026
4027 def setUp(self):
4028- super(TestServiceMaker, self).setUp()
4029+ super().setUp()
4030 self.patch(eventloop.loop, "services", MultiService())
4031 # Prevent setting the pdeathsig in tests.
4032 self.patch_autospec(RegionWorkerServiceMaker, "_set_pdeathsig")
4033@@ -75,7 +75,7 @@ class TestServiceMaker(MAASTestCase):
4034 import_websocket_handlers()
4035
4036 def tearDown(self):
4037- super(TestServiceMaker, self).tearDown()
4038+ super().tearDown()
4039 # Disable database access in the reactor again.
4040 asynchronous(disable_all_database_connections, timeout=5)()
4041
4042diff --git a/src/maasserver/tests/test_preseed.py b/src/maasserver/tests/test_preseed.py
4043index b2708ed..3bd1ccd 100644
4044--- a/src/maasserver/tests/test_preseed.py
4045+++ b/src/maasserver/tests/test_preseed.py
4046@@ -334,7 +334,7 @@ class TestLoadPreseedTemplate(MAASServerTestCase):
4047 """Tests for `load_preseed_template`."""
4048
4049 def setUp(self):
4050- super(TestLoadPreseedTemplate, self).setUp()
4051+ super().setUp()
4052 self.location = self.make_dir()
4053 self.patch(settings, "PRESEED_TEMPLATE_LOCATIONS", [self.location])
4054
4055diff --git a/src/maasserver/tests/test_proxyconfig.py b/src/maasserver/tests/test_proxyconfig.py
4056index ed834b6..7528e53 100644
4057--- a/src/maasserver/tests/test_proxyconfig.py
4058+++ b/src/maasserver/tests/test_proxyconfig.py
4059@@ -32,7 +32,7 @@ class TestProxyUpdateConfig(MAASTransactionServerTestCase):
4060 """Tests for `maasserver.proxyconfig`."""
4061
4062 def setUp(self):
4063- super(TestProxyUpdateConfig, self).setUp()
4064+ super().setUp()
4065 self.tmpdir = self.make_dir()
4066 self.proxy_path = Path(self.tmpdir) / config.MAAS_PROXY_CONF_NAME
4067 self.service_monitor = self.patch(proxyconfig, "service_monitor")
4068diff --git a/src/maasserver/tests/test_start_up.py b/src/maasserver/tests/test_start_up.py
4069index 9c28f3c..ea173df 100644
4070--- a/src/maasserver/tests/test_start_up.py
4071+++ b/src/maasserver/tests/test_start_up.py
4072@@ -47,11 +47,11 @@ class TestStartUp(MAASTransactionServerTestCase):
4073 """
4074
4075 def setUp(self):
4076- super(TestStartUp, self).setUp()
4077+ super().setUp()
4078 self.useFixture(RegionEventLoopFixture())
4079
4080 def tearDown(self):
4081- super(TestStartUp, self).tearDown()
4082+ super().tearDown()
4083 # start_up starts the Twisted event loop, so we need to stop it.
4084 eventloop.reset().wait(5)
4085
4086@@ -93,7 +93,7 @@ class TestInnerStartUp(MAASServerTestCase):
4087 """Tests for the actual work done in `inner_start_up`."""
4088
4089 def setUp(self):
4090- super(TestInnerStartUp, self).setUp()
4091+ super().setUp()
4092 self.useFixture(MAASIDFixture(None))
4093 self.patch_autospec(start_up, "dns_kms_setting_changed")
4094 self.patch_autospec(start_up, "load_builtin_scripts")
4095diff --git a/src/maasserver/tests/test_webapp.py b/src/maasserver/tests/test_webapp.py
4096index 1e7b959..04121d2 100644
4097--- a/src/maasserver/tests/test_webapp.py
4098+++ b/src/maasserver/tests/test_webapp.py
4099@@ -175,7 +175,7 @@ class TestResourceOverlay(MAASTestCase):
4100
4101 class TestWebApplicationService(MAASTestCase):
4102 def setUp(self):
4103- super(TestWebApplicationService, self).setUp()
4104+ super().setUp()
4105 # Patch the getServiceNamed so the WebSocketFactory does not
4106 # error trying to register for events from the RPC service. In this
4107 # test the RPC service is not started.
4108diff --git a/src/maasserver/triggers/tests/test_websocket_listener.py b/src/maasserver/triggers/tests/test_websocket_listener.py
4109index 42d50bd..c9a981f 100644
4110--- a/src/maasserver/triggers/tests/test_websocket_listener.py
4111+++ b/src/maasserver/triggers/tests/test_websocket_listener.py
4112@@ -3610,7 +3610,7 @@ class TestMachineFilesystemListener(
4113 )
4114
4115 def setUp(self):
4116- super(TestMachineFilesystemListener, self).setUp()
4117+ super().setUp()
4118 register_websocket_triggers()
4119
4120 def test_calls_handler_with_update_on_create_fs_on_partition(self):
4121diff --git a/src/maasserver/utils/asynchronous.py b/src/maasserver/utils/asynchronous.py
4122index 455a1f0..b4dde3e 100644
4123--- a/src/maasserver/utils/asynchronous.py
4124+++ b/src/maasserver/utils/asynchronous.py
4125@@ -165,7 +165,7 @@ class DeferredHooks(threading.local):
4126 """
4127
4128 def __init__(self):
4129- super(DeferredHooks, self).__init__()
4130+ super().__init__()
4131 self.hooks = deque()
4132
4133 @synchronous
4134diff --git a/src/maasserver/utils/dblocks.py b/src/maasserver/utils/dblocks.py
4135index 965e9ca..ad5e683 100644
4136--- a/src/maasserver/utils/dblocks.py
4137+++ b/src/maasserver/utils/dblocks.py
4138@@ -121,10 +121,10 @@ class DatabaseLockBase(tuple):
4139 objid = property(itemgetter(1))
4140
4141 def __new__(cls, objid, mode=None):
4142- return super(DatabaseLockBase, cls).__new__(cls, (classid, objid))
4143+ return super().__new__(cls, (classid, objid))
4144
4145 def __init__(self, objid, mode=None):
4146- super(DatabaseLockBase, self).__init__()
4147+ super().__init__()
4148 if mode is None:
4149 self.lock, self.unlock = self.MODE_DEFAULT
4150 elif mode in self.MODE_CHOICES:
4151diff --git a/src/maasserver/utils/dbtasks.py b/src/maasserver/utils/dbtasks.py
4152index 164d08d..089a3a3 100644
4153--- a/src/maasserver/utils/dbtasks.py
4154+++ b/src/maasserver/utils/dbtasks.py
4155@@ -47,7 +47,7 @@ class DatabaseTasksService(Service, object):
4156
4157 def __init__(self):
4158 """Initialise a new `DatabaseTasksService`."""
4159- super(DatabaseTasksService, self).__init__()
4160+ super().__init__()
4161 # Start with a queue that rejects puts.
4162 self.queue = DeferredQueue(size=0, backlog=1)
4163
4164@@ -122,7 +122,7 @@ class DatabaseTasksService(Service, object):
4165
4166 :return: `None`
4167 """
4168- super(DatabaseTasksService, self).startService()
4169+ super().startService()
4170 self.queue.size = None # Open queue to puts.
4171 self.coop = cooperate(self._generateTasks())
4172
4173@@ -132,7 +132,7 @@ class DatabaseTasksService(Service, object):
4174
4175 :return: :class:`Deferred` which fires once all tasks have been run.
4176 """
4177- super(DatabaseTasksService, self).stopService()
4178+ super().stopService()
4179 # Feed the cooperative task so that it can shutdown.
4180 self.queue.put(self.sentinel) # See _generateTasks.
4181 self.queue.size = 0 # Now close queue to puts.
4182diff --git a/src/maasserver/utils/orm.py b/src/maasserver/utils/orm.py
4183index 582cc49..2f7c442 100644
4184--- a/src/maasserver/utils/orm.py
4185+++ b/src/maasserver/utils/orm.py
4186@@ -378,7 +378,7 @@ class RetryStack(ExitStack):
4187 """An exit stack specialised to the retry machinery."""
4188
4189 def __init__(self):
4190- super(RetryStack, self).__init__()
4191+ super().__init__()
4192 self._cm_pending = deque()
4193 self._cm_seen = set()
4194
4195@@ -414,7 +414,7 @@ class RetryContext(threading.local):
4196 """
4197
4198 def __init__(self):
4199- super(RetryContext, self).__init__()
4200+ super().__init__()
4201 self.stack = None
4202
4203 @property
4204diff --git a/src/maasserver/utils/signals.py b/src/maasserver/utils/signals.py
4205index 8606008..6e99f66 100644
4206--- a/src/maasserver/utils/signals.py
4207+++ b/src/maasserver/utils/signals.py
4208@@ -132,7 +132,7 @@ class SignalsManager:
4209 """
4210
4211 def __init__(self):
4212- super(SignalsManager, self).__init__()
4213+ super().__init__()
4214 self._signals = set()
4215 self._signals_connected = set()
4216 self._signals_disconnected = set()
4217diff --git a/src/maasserver/utils/tests/test_dblocks.py b/src/maasserver/utils/tests/test_dblocks.py
4218index 482cdfd..48afa2c 100644
4219--- a/src/maasserver/utils/tests/test_dblocks.py
4220+++ b/src/maasserver/utils/tests/test_dblocks.py
4221@@ -81,7 +81,7 @@ class TestDatabaseLock(MAASTransactionServerTestCase):
4222 return dblocks.DatabaseLock(objid, mode=self.mode)
4223
4224 def tearDown(self):
4225- super(TestDatabaseLock, self).tearDown()
4226+ super().tearDown()
4227 with closing(connection.cursor()) as cursor:
4228 cursor.execute("SELECT pg_advisory_unlock_all()")
4229
4230diff --git a/src/maasserver/utils/tests/test_keys.py b/src/maasserver/utils/tests/test_keys.py
4231index 482176f..2560c5e 100644
4232--- a/src/maasserver/utils/tests/test_keys.py
4233+++ b/src/maasserver/utils/tests/test_keys.py
4234@@ -33,7 +33,7 @@ from maastesting.matchers import MockCalledOnceWith
4235
4236 class TestKeys(MAASServerTestCase):
4237 def setUp(self):
4238- super(TestKeys, self).setUp()
4239+ super().setUp()
4240 # Disable boot source cache signals.
4241 self.addCleanup(bootsources_signals.enable)
4242 bootsources_signals.disable()
4243diff --git a/src/maasserver/utils/tests/test_orm.py b/src/maasserver/utils/tests/test_orm.py
4244index b76d709..a15d139 100644
4245--- a/src/maasserver/utils/tests/test_orm.py
4246+++ b/src/maasserver/utils/tests/test_orm.py
4247@@ -94,7 +94,7 @@ class NoSleepMixin(unittest.TestCase):
4248 """Test case mix-in to prevent real sleeps in the `orm` module."""
4249
4250 def setUp(self):
4251- super(NoSleepMixin, self).setUp()
4252+ super().setUp()
4253 self.patch(orm, "sleep", lambda _: None)
4254
4255
4256@@ -973,7 +973,7 @@ class TestPostCommit(MAASTestCase):
4257 """Tests for the `post_commit` function."""
4258
4259 def setUp(self):
4260- super(TestPostCommit, self).setUp()
4261+ super().setUp()
4262 self.addCleanup(post_commit_hooks.reset)
4263
4264 def test_adds_Deferred_as_hook(self):
4265@@ -1048,7 +1048,7 @@ class TestPostCommitDo(MAASTestCase):
4266 """Tests for the `post_commit_do` function."""
4267
4268 def setUp(self):
4269- super(TestPostCommitDo, self).setUp()
4270+ super().setUp()
4271 self.addCleanup(post_commit_hooks.reset)
4272
4273 def test_adds_callable_as_hook(self):
4274diff --git a/src/maasserver/utils/tests/test_utils.py b/src/maasserver/utils/tests/test_utils.py
4275index b62baef..b474360 100644
4276--- a/src/maasserver/utils/tests/test_utils.py
4277+++ b/src/maasserver/utils/tests/test_utils.py
4278@@ -114,7 +114,7 @@ class TestBuildAbsoluteURI(MAASTestCase):
4279 """Tests for `build_absolute_uri`."""
4280
4281 def setUp(self):
4282- super(TestBuildAbsoluteURI, self).setUp()
4283+ super().setUp()
4284 self.useFixture(RegionConfigurationFixture())
4285
4286 def make_request(
4287diff --git a/src/maasserver/utils/tests/test_views.py b/src/maasserver/utils/tests/test_views.py
4288index 30a9f0f..dd6a5e8 100644
4289--- a/src/maasserver/utils/tests/test_views.py
4290+++ b/src/maasserver/utils/tests/test_views.py
4291@@ -177,7 +177,7 @@ class TestDeleteOAuthNonce(MAASServerTestCase):
4292
4293 class TestWebApplicationHandler(SerializationFailureTestCase):
4294 def setUp(self):
4295- super(TestWebApplicationHandler, self).setUp()
4296+ super().setUp()
4297 # Wire time.sleep() directly up to clock.advance() to avoid needless
4298 # sleeps, and to simulate the march of time without intervention.
4299 clock = self.patch(views, "clock", Clock())
4300diff --git a/src/maasserver/utils/views.py b/src/maasserver/utils/views.py
4301index b35baff..ebc9df8 100644
4302--- a/src/maasserver/utils/views.py
4303+++ b/src/maasserver/utils/views.py
4304@@ -133,9 +133,7 @@ def request_headers(request):
4305
4306 class MAASDjangoTemplateResponse(SimpleTemplateResponse):
4307 def __init__(self, response=None):
4308- super(MAASDjangoTemplateResponse, self).__init__(
4309- "%d.html" % self.status_code
4310- )
4311+ super().__init__("%d.html" % self.status_code)
4312
4313 # If we are passed an original response object 'response',
4314 # transfer over the content from the original response
4315@@ -167,7 +165,7 @@ class WebApplicationHandler(WSGIHandler):
4316 """
4317
4318 def __init__(self, attempts=10, timeout=90.0):
4319- super(WebApplicationHandler, self).__init__()
4320+ super().__init__()
4321 assert attempts >= 1, "The minimum attempts is 1, not %d" % attempts
4322 self.__retry_attempts = attempts
4323 self.__retry_timeout = timeout
4324@@ -284,7 +282,7 @@ class WebApplicationHandler(WSGIHandler):
4325 with this savepoint will be discarded.
4326
4327 """
4328- view_atomic = super(WebApplicationHandler, self).make_view_atomic(view)
4329+ view_atomic = super().make_view_atomic(view)
4330
4331 def view_atomic_with_post_commit_savepoint(*args, **kwargs):
4332 with post_commit_hooks.savepoint():
4333@@ -300,7 +298,7 @@ class WebApplicationHandler(WSGIHandler):
4334 will *not* run within the same transaction, or any transaction at all
4335 by default.
4336 """
4337- django_get_response = super(WebApplicationHandler, self).get_response
4338+ django_get_response = super().get_response
4339
4340 def get_response(request):
4341 # Up-call to Django's get_response() in a transaction. This
4342diff --git a/src/maasserver/views/tests/test_rpc.py b/src/maasserver/views/tests/test_rpc.py
4343index 87b5ab1..aee3d4b 100644
4344--- a/src/maasserver/views/tests/test_rpc.py
4345+++ b/src/maasserver/views/tests/test_rpc.py
4346@@ -34,7 +34,7 @@ is_valid_port = MatchesAll(IsInstance(int), GreaterThan(0), LessThan(2 ** 16))
4347
4348 class RPCViewTest(MAASTransactionServerTestCase):
4349 def setUp(self):
4350- super(RPCViewTest, self).setUp()
4351+ super().setUp()
4352 self.maas_id = None
4353
4354 def set_maas_id(maas_id):
4355diff --git a/src/maasserver/webapp.py b/src/maasserver/webapp.py
4356index ad791ef..53bcaff 100644
4357--- a/src/maasserver/webapp.py
4358+++ b/src/maasserver/webapp.py
4359@@ -52,9 +52,7 @@ class CleanPathRequest(Request, object):
4360 path, sep, args = path.partition(b"?")
4361 path = re.sub(rb"/+", b"/", path)
4362 path = b"".join([path, sep, args])
4363- return super(CleanPathRequest, self).requestReceived(
4364- command, path, version
4365- )
4366+ return super().requestReceived(command, path, version)
4367
4368
4369 class OverlaySite(Site):
4370@@ -93,7 +91,7 @@ class OverlaySite(Site):
4371 raise
4372
4373 postpath = copy.copy(request.postpath)
4374- result = super(OverlaySite, self).getResourceFor(request)
4375+ result = super().getResourceFor(request)
4376 if isinstance(result, NoResource) and self.underlay is not None:
4377 return call_underlay(request)
4378 else:
4379@@ -123,7 +121,7 @@ class ResourceOverlay(Resource, object):
4380 """
4381
4382 def __init__(self, basis):
4383- super(ResourceOverlay, self).__init__()
4384+ super().__init__()
4385 self.basis = basis
4386
4387 def getChild(self, path, request):
4388@@ -197,7 +195,7 @@ class WebApplicationService(StreamServerEndpointService):
4389 self.site.requestFactory = CleanPathRequest
4390 # `endpoint` is set in `privilegedStartService`, at this point the
4391 # `endpoint` is None.
4392- super(WebApplicationService, self).__init__(None, self.site)
4393+ super().__init__(None, self.site)
4394 self.websocket = WebSocketFactory(listener)
4395 self.threadpool = ThreadPoolLimiter(
4396 reactor.threadpoolForDatabase, concurrency.webapp
4397@@ -319,14 +317,14 @@ class WebApplicationService(StreamServerEndpointService):
4398 self.endpoint = self._makeEndpoint()
4399
4400 # Start the service now that the endpoint has been created.
4401- super(WebApplicationService, self).privilegedStartService()
4402+ super().privilegedStartService()
4403
4404 @asynchronous(timeout=30)
4405 def stopService(self):
4406 def _cleanup(_):
4407 self.starting = False
4408
4409- d = super(WebApplicationService, self).stopService()
4410+ d = super().stopService()
4411 d.addCallback(lambda _: self.websocket.stopFactory())
4412 d.addCallback(_cleanup)
4413 return d
4414diff --git a/src/maasserver/websockets/base.py b/src/maasserver/websockets/base.py
4415index f7b0cc6..ef842e6 100644
4416--- a/src/maasserver/websockets/base.py
4417+++ b/src/maasserver/websockets/base.py
4418@@ -122,9 +122,7 @@ class HandlerMetaclass(type):
4419
4420 def __new__(cls, name, bases, attrs):
4421 # Construct the class with the _meta field.
4422- new_class = super(HandlerMetaclass, cls).__new__(
4423- cls, name, bases, attrs
4424- )
4425+ new_class = super().__new__(cls, name, bases, attrs)
4426 new_class._meta = HandlerOptions(getattr(new_class, "Meta", None))
4427
4428 # Setup the handlers name based on the naming of the class.
4429diff --git a/src/maasserver/websockets/handlers/device.py b/src/maasserver/websockets/handlers/device.py
4430index 0901eee..c94fba1 100644
4431--- a/src/maasserver/websockets/handlers/device.py
4432+++ b/src/maasserver/websockets/handlers/device.py
4433@@ -257,7 +257,7 @@ class DeviceHandler(NodeHandler):
4434 for key, value in new_params.items()
4435 if value is not None
4436 }
4437- return super(DeviceHandler, self).preprocess_form(action, new_params)
4438+ return super().preprocess_form(action, new_params)
4439
4440 def _configure_interface(self, interface, params):
4441 """Configure the interface based on the selection."""
4442@@ -299,7 +299,7 @@ class DeviceHandler(NodeHandler):
4443
4444 # Create the object with the form and then create all of the interfaces
4445 # based on the users choices.
4446- data = super(DeviceHandler, self).create(params)
4447+ data = super().create(params)
4448 device_obj = Device.objects.get(system_id=data["system_id"])
4449 interfaces = list(device_obj.interface_set.all())
4450
4451diff --git a/src/maasserver/websockets/handlers/discovery.py b/src/maasserver/websockets/handlers/discovery.py
4452index 89a09f4..0a78b15 100644
4453--- a/src/maasserver/websockets/handlers/discovery.py
4454+++ b/src/maasserver/websockets/handlers/discovery.py
4455@@ -38,7 +38,7 @@ class DiscoveryHandler(ViewModelHandler):
4456 """
4457 if "start" in params:
4458 params["start"] = datetime.fromtimestamp(float(params["start"]))
4459- return super(DiscoveryHandler, self).list(params)
4460+ return super().list(params)
4461
4462 def dehydrate(self, obj, data, for_list=False):
4463 """Add extra fields to `data`."""
4464diff --git a/src/maasserver/websockets/handlers/event.py b/src/maasserver/websockets/handlers/event.py
4465index c8fd197..4cbc815 100644
4466--- a/src/maasserver/websockets/handlers/event.py
4467+++ b/src/maasserver/websockets/handlers/event.py
4468@@ -30,7 +30,7 @@ class EventHandler(TimestampedModelHandler):
4469 listen_channels = ["event"]
4470
4471 def __init__(self, *args, **kwargs):
4472- super(EventHandler, self).__init__(*args, **kwargs)
4473+ super().__init__(*args, **kwargs)
4474 if "node_ids" not in self.cache:
4475 self.cache["node_ids"] = []
4476
4477diff --git a/src/maasserver/websockets/handlers/pod.py b/src/maasserver/websockets/handlers/pod.py
4478index bb18a58..eb6fb07 100644
4479--- a/src/maasserver/websockets/handlers/pod.py
4480+++ b/src/maasserver/websockets/handlers/pod.py
4481@@ -90,7 +90,7 @@ class PodHandler(TimestampedModelHandler):
4482 for key, value in new_params.items()
4483 if value is not None
4484 }
4485- return super(PodHandler, self).preprocess_form(action, new_params)
4486+ return super().preprocess_form(action, new_params)
4487
4488 def dehydrate(self, obj, data, for_list=False):
4489 """Add extra fields to `data`."""
4490diff --git a/src/maasserver/websockets/handlers/sshkey.py b/src/maasserver/websockets/handlers/sshkey.py
4491index 741189f..038159b 100644
4492--- a/src/maasserver/websockets/handlers/sshkey.py
4493+++ b/src/maasserver/websockets/handlers/sshkey.py
4494@@ -37,9 +37,7 @@ class SSHKeyHandler(TimestampedModelHandler):
4495
4496 def get_object(self, params, permission=None):
4497 """Only allow getting keys owned by the user."""
4498- obj = super(SSHKeyHandler, self).get_object(
4499- params, permission=permission
4500- )
4501+ obj = super().get_object(params, permission=permission)
4502 if obj.user != self.user:
4503 raise HandlerDoesNotExistError(params[self._meta.pk])
4504 else:
4505diff --git a/src/maasserver/websockets/handlers/sslkey.py b/src/maasserver/websockets/handlers/sslkey.py
4506index 9152c57..95d0bdc 100644
4507--- a/src/maasserver/websockets/handlers/sslkey.py
4508+++ b/src/maasserver/websockets/handlers/sslkey.py
4509@@ -32,9 +32,7 @@ class SSLKeyHandler(TimestampedModelHandler):
4510
4511 def get_object(self, params, permission=None):
4512 """Only allow getting keys owned by the user."""
4513- obj = super(SSLKeyHandler, self).get_object(
4514- params, permission=permission
4515- )
4516+ obj = super().get_object(params, permission=permission)
4517 if obj.user != self.user:
4518 raise HandlerDoesNotExistError(params[self._meta.pk])
4519 else:
4520diff --git a/src/maasserver/websockets/handlers/staticroute.py b/src/maasserver/websockets/handlers/staticroute.py
4521index 307a3f6..23fd22f 100644
4522--- a/src/maasserver/websockets/handlers/staticroute.py
4523+++ b/src/maasserver/websockets/handlers/staticroute.py
4524@@ -27,16 +27,16 @@ class StaticRouteHandler(TimestampedModelHandler):
4525 """Create a static route."""
4526 if not self.user.is_superuser:
4527 raise PermissionDenied()
4528- return super(StaticRouteHandler, self).create(params)
4529+ return super().create(params)
4530
4531 def update(self, params):
4532 """Update this static route."""
4533 if not self.user.is_superuser:
4534 raise PermissionDenied()
4535- return super(StaticRouteHandler, self).update(params)
4536+ return super().update(params)
4537
4538 def delete(self, params):
4539 """Delete this static route."""
4540 if not self.user.is_superuser:
4541 raise PermissionDenied()
4542- return super(StaticRouteHandler, self).delete(params)
4543+ return super().delete(params)
4544diff --git a/src/maasserver/websockets/handlers/switch.py b/src/maasserver/websockets/handlers/switch.py
4545index 56e6ba2..b05cb29 100644
4546--- a/src/maasserver/websockets/handlers/switch.py
4547+++ b/src/maasserver/websockets/handlers/switch.py
4548@@ -43,7 +43,7 @@ class SwitchHandler(NodeHandler):
4549
4550 def get_object(self, params):
4551 """Get object by using the `pk` in `params`."""
4552- obj = super(SwitchHandler, self).get_object(params)
4553+ obj = super().get_object(params)
4554 if self.user.is_superuser or obj.owner == self.user:
4555 return obj
4556 raise HandlerDoesNotExistError(params[self._meta.pk])
4557diff --git a/src/maasserver/websockets/handlers/tests/test_bootresource.py b/src/maasserver/websockets/handlers/tests/test_bootresource.py
4558index b1659fa..ced9594 100644
4559--- a/src/maasserver/websockets/handlers/tests/test_bootresource.py
4560+++ b/src/maasserver/websockets/handlers/tests/test_bootresource.py
4561@@ -58,7 +58,7 @@ class PatchOSInfoMixin:
4562
4563 class TestBootResourcePoll(MAASServerTestCase, PatchOSInfoMixin):
4564 def setUp(self):
4565- super(TestBootResourcePoll, self).setUp()
4566+ super().setUp()
4567 # Disable boot source cache signals.
4568 self.addCleanup(bootsources.signals.enable)
4569 bootsources.signals.disable()
4570@@ -837,7 +837,7 @@ class TestBootResourceSaveUbuntu(
4571 MAASTransactionServerTestCase, PatchOSInfoMixin
4572 ):
4573 def setUp(self):
4574- super(TestBootResourceSaveUbuntu, self).setUp()
4575+ super().setUp()
4576 # Disable boot source cache signals.
4577 self.addCleanup(bootsources.signals.enable)
4578 bootsources.signals.disable()
4579@@ -1044,7 +1044,7 @@ class TestBootResourceSaveUbuntuCore(MAASTransactionServerTestCase):
4580
4581 class TestBootResourceSaveOther(MAASTransactionServerTestCase):
4582 def setUp(self):
4583- super(TestBootResourceSaveOther, self).setUp()
4584+ super().setUp()
4585 # Disable boot source cache signals.
4586 self.addCleanup(bootsources.signals.enable)
4587 bootsources.signals.disable()
4588diff --git a/src/maasserver/websockets/handlers/timestampedmodel.py b/src/maasserver/websockets/handlers/timestampedmodel.py
4589index f0ac07d..f7132c2 100644
4590--- a/src/maasserver/websockets/handlers/timestampedmodel.py
4591+++ b/src/maasserver/websockets/handlers/timestampedmodel.py
4592@@ -13,7 +13,7 @@ class TimestampedModelHandler(Handler):
4593 abstract = True
4594
4595 def __new__(cls, *args, **kwargs):
4596- cls = super(TimestampedModelHandler, cls).__new__(cls)
4597+ cls = super().__new__(cls)
4598 if cls._meta.non_changeable is None:
4599 cls._meta.non_changeable = []
4600 for field in ["created", "updated"]:
4601diff --git a/src/maasserver/websockets/handlers/token.py b/src/maasserver/websockets/handlers/token.py
4602index 970b147..fc003b8 100644
4603--- a/src/maasserver/websockets/handlers/token.py
4604+++ b/src/maasserver/websockets/handlers/token.py
4605@@ -27,9 +27,7 @@ class TokenHandler(Handler):
4606
4607 def get_object(self, params, permission=None):
4608 """Only allow getting keys owned by the user."""
4609- obj = super(TokenHandler, self).get_object(
4610- params, permission=permission
4611- )
4612+ obj = super().get_object(params, permission=permission)
4613 if obj.user != self.user:
4614 raise HandlerDoesNotExistError(params[self._meta.pk])
4615 else:
4616diff --git a/src/maasserver/websockets/handlers/user.py b/src/maasserver/websockets/handlers/user.py
4617index 97f14fd..269d334 100644
4618--- a/src/maasserver/websockets/handlers/user.py
4619+++ b/src/maasserver/websockets/handlers/user.py
4620@@ -67,7 +67,7 @@ class UserHandler(Handler):
4621
4622 def get_queryset(self, for_list=False):
4623 """Return `QuerySet` for users only viewable by `user`."""
4624- users = super(UserHandler, self).get_queryset(for_list=for_list)
4625+ users = super().get_queryset(for_list=for_list)
4626 if self.user.is_superuser:
4627 # Super users can view all users, except for the built-in users
4628 return users.exclude(username__in=SYSTEM_USERS)
4629diff --git a/src/maasserver/websockets/handlers/vlan.py b/src/maasserver/websockets/handlers/vlan.py
4630index 3269325..0e75a12 100644
4631--- a/src/maasserver/websockets/handlers/vlan.py
4632+++ b/src/maasserver/websockets/handlers/vlan.py
4633@@ -87,7 +87,7 @@ class VLANHandler(TimestampedModelHandler):
4634
4635 return create_vlan_form
4636 else:
4637- return super(VLANHandler, self).get_form_class(action)
4638+ return super().get_form_class(action)
4639
4640 def delete(self, parameters):
4641 """Delete this VLAN."""
4642@@ -98,7 +98,7 @@ class VLANHandler(TimestampedModelHandler):
4643
4644 def update(self, parameters):
4645 """Delete this VLAN."""
4646- return super(VLANHandler, self).update(parameters)
4647+ return super().update(parameters)
4648
4649 def _configure_iprange_and_gateway(self, parameters):
4650 if "subnet" in parameters and parameters["subnet"] is not None:
4651diff --git a/src/maasserver/websockets/tests/test_websockets.py b/src/maasserver/websockets/tests/test_websockets.py
4652index 08f89f7..b627209 100644
4653--- a/src/maasserver/websockets/tests/test_websockets.py
4654+++ b/src/maasserver/websockets/tests/test_websockets.py
4655@@ -357,7 +357,7 @@ class WebSocketsProtocolTest(MAASTestCase):
4656 """
4657
4658 def setUp(self):
4659- super(WebSocketsProtocolTest, self).setUp()
4660+ super().setUp()
4661 self.receiver = SavingEchoReceiver()
4662 self.protocol = WebSocketsProtocol(self.receiver)
4663 self.factory = Factory.forProtocol(lambda: self.protocol)
4664@@ -451,7 +451,7 @@ class WebSocketsProtocolWrapperTest(MAASTestCase):
4665 """
4666
4667 def setUp(self):
4668- super(WebSocketsProtocolWrapperTest, self).setUp()
4669+ super().setUp()
4670 self.accumulatingProtocol = AccumulatingProtocol()
4671 self.protocol = WebSocketsProtocolWrapper(self.accumulatingProtocol)
4672 self.transport = StringTransportWithDisconnection()
4673@@ -542,7 +542,7 @@ class WebSocketsResourceTest(MAASTestCase):
4674 """
4675
4676 def setUp(self):
4677- super(WebSocketsResourceTest, self).setUp()
4678+ super().setUp()
4679
4680 class SavingEchoFactory(Factory):
4681 def buildProtocol(oself, addr):
4682diff --git a/src/maasserver/workers.py b/src/maasserver/workers.py
4683index fc6cd5e..6b3b771 100644
4684--- a/src/maasserver/workers.py
4685+++ b/src/maasserver/workers.py
4686@@ -27,7 +27,7 @@ def set_max_workers_count(worker_count):
4687
4688 class WorkerProcess(protocol.ProcessProtocol):
4689 def __init__(self, service, runningImport=False):
4690- super(WorkerProcess, self).__init__()
4691+ super().__init__()
4692 self.service = service
4693 self.runningImport = runningImport
4694
4695@@ -55,7 +55,7 @@ class WorkersService(service.Service, object):
4696 """
4697
4698 def __init__(self, reactor, *, worker_count=None, worker_cmd=None):
4699- super(WorkersService, self).__init__()
4700+ super().__init__()
4701 self.reactor = reactor
4702 self.stopping = False
4703 self.worker_count = worker_count
4704@@ -68,7 +68,7 @@ class WorkersService(service.Service, object):
4705
4706 def startService(self):
4707 """Start the workers."""
4708- super(WorkersService, self).startService()
4709+ super().startService()
4710 self.spawnWorkers()
4711
4712 def stopService(self):
4713diff --git a/src/maastesting/crochet.py b/src/maastesting/crochet.py
4714index 40f1dc3..6746e98 100644
4715--- a/src/maastesting/crochet.py
4716+++ b/src/maastesting/crochet.py
4717@@ -19,7 +19,7 @@ class EventualResultCatchingMixin:
4718 """
4719
4720 def setUp(self):
4721- super(EventualResultCatchingMixin, self).setUp()
4722+ super().setUp()
4723 try:
4724 # Every EventualResult that crochet creates is registered into
4725 # this registry. We'll check it after the test has finished.
4726diff --git a/src/maastesting/djangoloader.py b/src/maastesting/djangoloader.py
4727index 035ad46..52b2b0d 100755
4728--- a/src/maastesting/djangoloader.py
4729+++ b/src/maastesting/djangoloader.py
4730@@ -26,7 +26,7 @@ class MAASDjangoTestRunner(NoseTestSuiteRunner):
4731 if database["HOST"] == self.cluster.datadir:
4732 self.cluster.createdb(database["NAME"])
4733 # Call-up to super-classes.
4734- up = super(MAASDjangoTestRunner, self)
4735+ up = super()
4736 return up.setup_databases(*args, **kwargs)
4737 except Exception:
4738 # Clean-up the cluster now, or it'll be left running; django-nose
4739@@ -43,5 +43,5 @@ class MAASDjangoTestRunner(NoseTestSuiteRunner):
4740 the test databases, hence there is also tear-down code embedded in
4741 `setup_databases`.
4742 """
4743- super(MAASDjangoTestRunner, self).teardown_databases(*args, **kwargs)
4744+ super().teardown_databases(*args, **kwargs)
4745 self.cluster.cleanUp()
4746diff --git a/src/maastesting/djangotestcase.py b/src/maastesting/djangotestcase.py
4747index b75ea79..97ce245 100644
4748--- a/src/maastesting/djangotestcase.py
4749+++ b/src/maastesting/djangotestcase.py
4750@@ -197,7 +197,7 @@ class DjangoTestCase(django.test.TestCase, MAASTestCase):
4751 legacy = True
4752
4753 def _fixture_teardown(self):
4754- super(DjangoTestCase, self)._fixture_teardown()
4755+ super()._fixture_teardown()
4756 # TODO blake_r: Fix so this is not disabled. Currently not
4757 # working with Django 1.8.
4758 # Don't let unfinished database activity get away with it.
4759@@ -232,7 +232,7 @@ class DjangoTransactionTestCase(django.test.TransactionTestCase, MAASTestCase):
4760 legacy = True
4761
4762 def _fixture_teardown(self):
4763- super(DjangoTransactionTestCase, self)._fixture_teardown()
4764+ super()._fixture_teardown()
4765 # TODO blake_r: Fix so this is not disabled. Currently not
4766 # working with Django 1.8.
4767 # Don't let unfinished database activity get away with it.
4768diff --git a/src/maastesting/doubles.py b/src/maastesting/doubles.py
4769index fbd3701..cb84e05 100644
4770--- a/src/maastesting/doubles.py
4771+++ b/src/maastesting/doubles.py
4772@@ -25,7 +25,7 @@ class StubContext:
4773 """
4774
4775 def __init__(self):
4776- super(StubContext, self).__init__()
4777+ super().__init__()
4778 self.entered = False
4779 self.exited = False
4780
4781diff --git a/src/maastesting/fixtures.py b/src/maastesting/fixtures.py
4782index b311fb1..d1d00d8 100644
4783--- a/src/maastesting/fixtures.py
4784+++ b/src/maastesting/fixtures.py
4785@@ -42,12 +42,12 @@ class ImportErrorFixture(fixtures.Fixture):
4786 """
4787
4788 def __init__(self, module_name, sub_name):
4789- super(ImportErrorFixture, self).__init__()
4790+ super().__init__()
4791 self.module_name = module_name
4792 self.sub_name = sub_name
4793
4794 def setUp(self):
4795- super(ImportErrorFixture, self).setUp()
4796+ super().setUp()
4797
4798 def mock_import(name, *import_args, **kwargs):
4799 if name == self.module_name:
4800@@ -75,12 +75,12 @@ class LoggerSilencerFixture(fixtures.Fixture):
4801 """
4802
4803 def __init__(self, names, level=logging.ERROR):
4804- super(LoggerSilencerFixture, self).__init__()
4805+ super().__init__()
4806 self.names = names
4807 self.level = level
4808
4809 def setUp(self):
4810- super(LoggerSilencerFixture, self).setUp()
4811+ super().setUp()
4812 for name in self.names:
4813 logger = logging.getLogger(name)
4814 self.addCleanup(logger.setLevel, logger.level)
4815@@ -91,7 +91,7 @@ class ProxiesDisabledFixture(fixtures.Fixture):
4816 """Disables all HTTP/HTTPS proxies set in the environment."""
4817
4818 def setUp(self):
4819- super(ProxiesDisabledFixture, self).setUp()
4820+ super().setUp()
4821 self.useFixture(EnvironmentVariable("http_proxy"))
4822 self.useFixture(EnvironmentVariable("https_proxy"))
4823
4824@@ -100,7 +100,7 @@ class TempDirectory(fixtures.TempDir):
4825 """Create a temporary directory, ensuring Unicode paths."""
4826
4827 def setUp(self):
4828- super(TempDirectory, self).setUp()
4829+ super().setUp()
4830 if isinstance(self.path, bytes):
4831 encoding = sys.getfilesystemencoding()
4832 self.path = self.path.decode(encoding)
4833@@ -114,7 +114,7 @@ class TempWDFixture(TempDirectory):
4834
4835 def setUp(self):
4836 cwd = os.getcwd()
4837- super(TempWDFixture, self).setUp()
4838+ super().setUp()
4839 self.addCleanup(os.chdir, cwd)
4840 os.chdir(self.path)
4841
4842@@ -148,7 +148,7 @@ class CaptureStandardIO(fixtures.Fixture):
4843 stderr = None
4844
4845 def __init__(self, encoding="utf-8"):
4846- super(CaptureStandardIO, self).__init__()
4847+ super().__init__()
4848 self.codec = codecs.lookup(encoding)
4849 self.encoding = encoding
4850 # Create new buffers.
4851@@ -157,7 +157,7 @@ class CaptureStandardIO(fixtures.Fixture):
4852 self._buf_err = BytesIO()
4853
4854 def setUp(self):
4855- super(CaptureStandardIO, self).setUp()
4856+ super().setUp()
4857 self.patcher = MonkeyPatcher()
4858 self.addCleanup(self.patcher.restore)
4859 # Patch sys.std* and self.std*. Use TextIOWrapper to provide an
4860@@ -254,7 +254,7 @@ class DetectLeakedFileDescriptors(fixtures.Fixture):
4861 """
4862
4863 def setUp(self):
4864- super(DetectLeakedFileDescriptors, self).setUp()
4865+ super().setUp()
4866 self.fdpath = "/proc/%d/fd" % os.getpid()
4867 self.addCleanup(self.check, os.listdir(self.fdpath))
4868
4869diff --git a/src/maastesting/httpd.py b/src/maastesting/httpd.py
4870index 99c99c7..79aba61 100644
4871--- a/src/maastesting/httpd.py
4872+++ b/src/maastesting/httpd.py
4873@@ -144,7 +144,7 @@ class HTTPServerFixture(Fixture):
4874 """
4875
4876 def __init__(self, host="localhost", port=0):
4877- super(HTTPServerFixture, self).__init__()
4878+ super().__init__()
4879 self.server = ThreadingHTTPServer(
4880 (host, port), SilentHTTPRequestHandler
4881 )
4882@@ -154,6 +154,6 @@ class HTTPServerFixture(Fixture):
4883 return "http://%s:%d/" % self.server.server_address
4884
4885 def setUp(self):
4886- super(HTTPServerFixture, self).setUp()
4887+ super().setUp()
4888 threading.Thread(target=self.server.serve_forever).start()
4889 self.addCleanup(self.server.shutdown)
4890diff --git a/src/maastesting/matchers.py b/src/maastesting/matchers.py
4891index 7855fef..297535e 100644
4892--- a/src/maastesting/matchers.py
4893+++ b/src/maastesting/matchers.py
4894@@ -82,7 +82,7 @@ class Matches:
4895 """
4896
4897 def __init__(self, matcher):
4898- super(Matches, self).__init__()
4899+ super().__init__()
4900 self.matcher = matcher
4901
4902 def __eq__(self, other):
4903@@ -110,7 +110,7 @@ class Provides(MatchesPredicate):
4904 """Match if the given interface is provided."""
4905
4906 def __init__(self, iface):
4907- super(Provides, self).__init__(
4908+ super().__init__(
4909 iface.providedBy, "%%r does not provide %s" % iface.getName()
4910 )
4911
4912@@ -119,7 +119,7 @@ class HasAttribute(Matcher):
4913 """Match if the given attribute is available."""
4914
4915 def __init__(self, attribute):
4916- super(HasAttribute, self).__init__()
4917+ super().__init__()
4918 self.attribute = attribute
4919
4920 def match(self, something):
4921@@ -332,7 +332,7 @@ class IsUnfiredDeferred(Matcher):
4922
4923 class MatchesPartialCall(Matcher):
4924 def __init__(self, func, *args, **keywords):
4925- super(MatchesPartialCall, self).__init__()
4926+ super().__init__()
4927 if len(keywords) > 0:
4928 self.expected = partial(func, *args, **keywords)
4929 else:
4930@@ -367,7 +367,7 @@ class DocTestMatches(matchers.DocTestMatches):
4931 DEFAULT_FLAGS = doctest.ELLIPSIS | doctest.NORMALIZE_WHITESPACE
4932
4933 def __init__(self, example, flags=DEFAULT_FLAGS):
4934- super(DocTestMatches, self).__init__(example, flags)
4935+ super().__init__(example, flags)
4936
4937
4938 class FileContains(Matcher):
4939@@ -446,7 +446,7 @@ class TextEquals(Matcher):
4940 """
4941
4942 def __init__(self, expected):
4943- super(TextEquals, self).__init__()
4944+ super().__init__()
4945 self.expected = expected
4946
4947 def match(self, observed):
4948@@ -488,7 +488,7 @@ class ContainedBy(Matcher):
4949 """Test if the matchee is in the given container."""
4950
4951 def __init__(self, haystack):
4952- super(ContainedBy, self).__init__()
4953+ super().__init__()
4954 self.haystack = haystack
4955
4956 def __str__(self):
4957diff --git a/src/maastesting/noseplug.py b/src/maastesting/noseplug.py
4958index f002ef7..b1cd3ab 100644
4959--- a/src/maastesting/noseplug.py
4960+++ b/src/maastesting/noseplug.py
4961@@ -47,7 +47,7 @@ class Crochet(Plugin):
4962
4963 :attention: This is part of the Nose plugin contract.
4964 """
4965- super(Crochet, self).options(parser, env)
4966+ super().options(parser, env)
4967 parser.add_option(
4968 "--%s-no-setup" % self.name,
4969 dest=self.option_no_setup,
4970@@ -61,7 +61,7 @@ class Crochet(Plugin):
4971
4972 :attention: This is part of the Nose plugin contract.
4973 """
4974- super(Crochet, self).configure(options, conf)
4975+ super().configure(options, conf)
4976 if self.enabled:
4977 import crochet
4978
4979@@ -79,7 +79,7 @@ class Crochet(Plugin):
4980 if timeout is None:
4981 raise AssertionError("A time-out must be specified.")
4982 else:
4983- return super(EventualResult, self)._result(timeout)
4984+ return super()._result(timeout)
4985
4986 # Patch it back into crochet.
4987 crochet._eventloop.EventualResult = EventualResult
4988@@ -197,7 +197,7 @@ class Select(Plugin):
4989 log = logging.getLogger("nose.plugins.%s" % name)
4990
4991 def __init__(self):
4992- super(Select, self).__init__()
4993+ super().__init__()
4994 self.dirs = frozenset()
4995
4996 def options(self, parser, env):
4997@@ -205,7 +205,7 @@ class Select(Plugin):
4998
4999 :attention: This is part of the Nose plugin contract.
5000 """
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches