Merge ~cgrabowski/maas:add_hardware_sync_systemd_timer into maas:master

Proposed by Christian Grabowski
Status: Merged
Approved by: Christian Grabowski
Approved revision: 1091ac180b95c85665a822947e0ad91cac29ca77
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~cgrabowski/maas:add_hardware_sync_systemd_timer
Merge into: maas:master
Diff against target: 232 lines (+133/-0)
6 files modified
src/maasserver/forms/settings.py (+12/-0)
src/maasserver/models/config.py (+2/-0)
src/metadataserver/templates/hardware_sync_service.template (+9/-0)
src/metadataserver/templates/hardware_sync_timer.template (+11/-0)
src/metadataserver/tests/test_vendor_data.py (+52/-0)
src/metadataserver/vendor_data.py (+47/-0)
Reviewer Review Type Date Requested Status
MAAS Lander Approve
Adam Collard (community) Approve
Review via email: mp+414892@code.launchpad.net

Commit message

add systemd configuration for hardware sync

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

UNIT TESTS
-b add_hardware_sync_systemd_timer lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11796/console
COMMIT: 3f9a48b344b3767f46e5a4b3cc9ff429df705f80

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

UNIT TESTS
-b add_hardware_sync_systemd_timer lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: FAILED
LOG: http://maas-ci.internal:8080/job/maas/job/branch-tester/11798/console
COMMIT: e815777466ffe91b109727286c609b67e6d2bdd3

review: Needs Fixing
81d409e... by Christian Grabowski

add hardware sync interval to settings form

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

UNIT TESTS
-b add_hardware_sync_systemd_timer lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 81d409ed12d50ed64d9e579dd8354d62bd764f67

review: Approve
Revision history for this message
Adam Collard (adam-collard) :
Revision history for this message
Christian Grabowski (cgrabowski) :
f7aa2b0... by Christian Grabowski

simplify generate_hardware_sync_systemd_configuration

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

UNIT TESTS
-b add_hardware_sync_systemd_timer lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: f7aa2b0e383ad7cd743a4652fcc37402e8414a05

review: Approve
641ea45... by Christian Grabowski

use pkgutil to fetch templates

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

UNIT TESTS
-b add_hardware_sync_systemd_timer lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 641ea45963dd8b3b6d05434b71c5d25bf3130af5

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

nitpik

review: Approve
Revision history for this message
Christian Grabowski (cgrabowski) :
1091ac1... by Christian Grabowski

update doc string

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

UNIT TESTS
-b add_hardware_sync_systemd_timer lp:~cgrabowski/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 1091ac180b95c85665a822947e0ad91cac29ca77

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/src/maasserver/forms/settings.py b/src/maasserver/forms/settings.py
index df6a13b..0061e09 100644
--- a/src/maasserver/forms/settings.py
+++ b/src/maasserver/forms/settings.py
@@ -1006,6 +1006,18 @@ CONFIG_ITEMS = {
1006 ),1006 ),
1007 },1007 },
1008 },1008 },
1009 "hardware_sync_interval": {
1010 "default": "15m",
1011 "form": forms.CharField,
1012 "form_kwargs": {
1013 "label": "Hardware Sync Interval",
1014 "required": False,
1015 "help_text": (
1016 "The interval to send hardware info to MAAS from"
1017 "hardware sync enabled machines, in systemd time span syntax."
1018 ),
1019 },
1020 },
1009}1021}
10101022
10111023
diff --git a/src/maasserver/models/config.py b/src/maasserver/models/config.py
index b39974c..d87c7b5 100644
--- a/src/maasserver/models/config.py
+++ b/src/maasserver/models/config.py
@@ -134,6 +134,8 @@ def get_default_config():
134 "vcenter_username": "",134 "vcenter_username": "",
135 "vcenter_password": "",135 "vcenter_password": "",
136 "vcenter_datacenter": "",136 "vcenter_datacenter": "",
137 # Hardware Sync options
138 "hardware_sync_interval": "15m",
137 }139 }
138140
139141
diff --git a/src/metadataserver/templates/hardware_sync_service.template b/src/metadataserver/templates/hardware_sync_service.template
140new file mode 100644142new file mode 100644
index 0000000..a649777
--- /dev/null
+++ b/src/metadataserver/templates/hardware_sync_service.template
@@ -0,0 +1,9 @@
1[Unit]
2Description=MAAS Hardware Sync Service
3Documentation=https://maas.io
4Want=network.target
5After=network.target
6
7[Service]
8type=oneshot
9ExecStart=/bin/echo "TODO add hardware sync executable"
diff --git a/src/metadataserver/templates/hardware_sync_timer.template b/src/metadataserver/templates/hardware_sync_timer.template
0new file mode 10064410new file mode 100644
index 0000000..a0c175e
--- /dev/null
+++ b/src/metadataserver/templates/hardware_sync_timer.template
@@ -0,0 +1,11 @@
1[Unit]
2Description=Timer for periodically running MAAS hardware sync
3Documentation=https://maas.io
4Want=network.target
5After=network.target
6
7[Install]
8WantedBy=timers.target
9
10[Timer]
11OnActiveSec={{ hardware_sync_interval }}
diff --git a/src/metadataserver/tests/test_vendor_data.py b/src/metadataserver/tests/test_vendor_data.py
index 1d9f131..0432a9a 100644
--- a/src/metadataserver/tests/test_vendor_data.py
+++ b/src/metadataserver/tests/test_vendor_data.py
@@ -5,6 +5,7 @@ import random
5from textwrap import dedent5from textwrap import dedent
66
7from netaddr import IPAddress7from netaddr import IPAddress
8import tempita
8from testtools.matchers import (9from testtools.matchers import (
9 Contains,10 Contains,
10 ContainsDict,11 ContainsDict,
@@ -27,14 +28,18 @@ from maasserver.testing.testcase import MAASServerTestCase
27from maastesting.matchers import MockNotCalled28from maastesting.matchers import MockNotCalled
28from metadataserver import vendor_data29from metadataserver import vendor_data
29from metadataserver.vendor_data import (30from metadataserver.vendor_data import (
31 _get_metadataserver_template,
30 generate_ephemeral_deployment_network_configuration,32 generate_ephemeral_deployment_network_configuration,
31 generate_ephemeral_netplan_lock_removal,33 generate_ephemeral_netplan_lock_removal,
34 generate_hardware_sync_systemd_configuration,
32 generate_kvm_pod_configuration,35 generate_kvm_pod_configuration,
33 generate_ntp_configuration,36 generate_ntp_configuration,
34 generate_rack_controller_configuration,37 generate_rack_controller_configuration,
35 generate_snap_configuration,38 generate_snap_configuration,
36 generate_system_info,39 generate_system_info,
37 get_vendor_data,40 get_vendor_data,
41 HARDWARE_SYNC_SERVICE_TEMPLATE,
42 HARDWARE_SYNC_TIMER_TEMPLATE,
38)43)
39from provisioningserver.drivers.pod.lxd import LXD_MAAS_PROJECT_CONFIG44from provisioningserver.drivers.pod.lxd import LXD_MAAS_PROJECT_CONFIG
4045
@@ -683,3 +688,50 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
683 Config.objects.set_config(key, factory.make_name(key))688 Config.objects.set_config(key, factory.make_name(key))
684 config = get_vendor_data(node, None)689 config = get_vendor_data(node, None)
685 self.assertNotIn("write_files", config)690 self.assertNotIn("write_files", config)
691
692
693class TestGenerateHardwareSyncSystemdConfiguration(MAASServerTestCase):
694 def _get_timer_template(self):
695 return tempita.Template(
696 _get_metadataserver_template(HARDWARE_SYNC_TIMER_TEMPLATE),
697 )
698
699 def _get_service_template(self):
700 return tempita.Template(
701 _get_metadataserver_template(HARDWARE_SYNC_SERVICE_TEMPLATE),
702 )
703
704 def test_returns_nothing_if_node_enable_hw_sync_is_False(self):
705 node = factory.make_Node(
706 status=NODE_STATUS.DEPLOYING,
707 )
708 config = generate_hardware_sync_systemd_configuration(node)
709 self.assertRaises(StopIteration, next, config)
710
711 def test_returns_timer_and_service_when_node_enable_hw_sync_is_True(self):
712 node = factory.make_Node(
713 status=NODE_STATUS.DEPLOYING,
714 enable_hw_sync=True,
715 )
716 config = generate_hardware_sync_systemd_configuration(node)
717 expected_interval = Config.objects.get_configs(
718 ["hardware_sync_interval"]
719 )
720
721 expected = (
722 "write_files",
723 [
724 {
725 "content": self._get_timer_template().substitute(
726 hardware_sync_interval=expected_interval
727 ),
728 "path": "/lib/systemd/system/maas_hardware_sync.timer",
729 },
730 {
731 "content": self._get_service_template().substitute(),
732 "path": "/lib/systemd/system/maas_hardware_sync.service",
733 },
734 ],
735 )
736
737 self.assertCountEqual(next(config), expected)
diff --git a/src/metadataserver/vendor_data.py b/src/metadataserver/vendor_data.py
index 7e92c68..2826009 100644
--- a/src/metadataserver/vendor_data.py
+++ b/src/metadataserver/vendor_data.py
@@ -8,9 +8,11 @@ from base64 import b64encode
8from crypt import crypt8from crypt import crypt
9from itertools import chain9from itertools import chain
10from os import urandom10from os import urandom
11import pkgutil
11from textwrap import dedent12from textwrap import dedent
1213
13from netaddr import IPAddress14from netaddr import IPAddress
15import tempita
14import yaml16import yaml
1517
16from maasserver import ntp18from maasserver import ntp
@@ -29,6 +31,9 @@ from provisioningserver.utils.text import make_gecos_field
29LXD_CERTIFICATE_METADATA_KEY = "lxd_certificate"31LXD_CERTIFICATE_METADATA_KEY = "lxd_certificate"
30VIRSH_PASSWORD_METADATA_KEY = "virsh_password"32VIRSH_PASSWORD_METADATA_KEY = "virsh_password"
3133
34HARDWARE_SYNC_TIMER_TEMPLATE = "hardware_sync_timer.template"
35HARDWARE_SYNC_SERVICE_TEMPLATE = "hardware_sync_service.template"
36
3237
33def get_vendor_data(node, proxy):38def get_vendor_data(node, proxy):
34 generators = (39 generators = (
@@ -40,6 +45,7 @@ def get_vendor_data(node, proxy):
40 generate_ephemeral_netplan_lock_removal(node),45 generate_ephemeral_netplan_lock_removal(node),
41 generate_ephemeral_deployment_network_configuration(node),46 generate_ephemeral_deployment_network_configuration(node),
42 generate_vcenter_configuration(node),47 generate_vcenter_configuration(node),
48 generate_hardware_sync_systemd_configuration(node),
43 )49 )
44 vendor_data = {}50 vendor_data = {}
45 for key, value in chain(*generators):51 for key, value in chain(*generators):
@@ -350,6 +356,47 @@ def generate_vcenter_configuration(node):
350 ]356 ]
351357
352358
359def _get_metadataserver_template(template_name):
360 """Returns the contents of a given template in metadataserver/vendor_data/templates/"""
361 return pkgutil.get_data(
362 "metadataserver.vendor_data", "templates/" + template_name
363 ).decode("utf-8")
364
365
366def generate_hardware_sync_systemd_configuration(node):
367 """generate systemd unit files for hardware sync"""
368 if not node.enable_hw_sync:
369 return
370
371 hardware_sync_interval = Config.objects.get_configs(
372 ["hardware_sync_interval"]
373 )
374 hardware_sync_timer_tmpl = tempita.Template(
375 _get_metadataserver_template(HARDWARE_SYNC_TIMER_TEMPLATE)
376 )
377 hardware_sync_service_tmpl = tempita.Template(
378 _get_metadataserver_template(HARDWARE_SYNC_SERVICE_TEMPLATE)
379 )
380
381 hardware_sync_timer = hardware_sync_timer_tmpl.substitute(
382 hardware_sync_interval=hardware_sync_interval
383 )
384 hardware_sync_service = (
385 hardware_sync_service_tmpl.substitute()
386 ) # TODO substitute node architecture for executable
387
388 yield "write_files", [
389 {
390 "content": hardware_sync_timer,
391 "path": "/lib/systemd/system/maas_hardware_sync.timer",
392 },
393 {
394 "content": hardware_sync_service,
395 "path": "/lib/systemd/system/maas_hardware_sync.service",
396 },
397 ]
398
399
353def _generate_password():400def _generate_password():
354 """Generate a 32-character password by encoding 24 bytes as base64."""401 """Generate a 32-character password by encoding 24 bytes as base64."""
355 return b64encode(urandom(24), altchars=b".!").decode("ascii")402 return b64encode(urandom(24), altchars=b".!").decode("ascii")

Subscribers

People subscribed via source and target branches