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
1diff --git a/src/maasserver/forms/settings.py b/src/maasserver/forms/settings.py
2index df6a13b..0061e09 100644
3--- a/src/maasserver/forms/settings.py
4+++ b/src/maasserver/forms/settings.py
5@@ -1006,6 +1006,18 @@ CONFIG_ITEMS = {
6 ),
7 },
8 },
9+ "hardware_sync_interval": {
10+ "default": "15m",
11+ "form": forms.CharField,
12+ "form_kwargs": {
13+ "label": "Hardware Sync Interval",
14+ "required": False,
15+ "help_text": (
16+ "The interval to send hardware info to MAAS from"
17+ "hardware sync enabled machines, in systemd time span syntax."
18+ ),
19+ },
20+ },
21 }
22
23
24diff --git a/src/maasserver/models/config.py b/src/maasserver/models/config.py
25index b39974c..d87c7b5 100644
26--- a/src/maasserver/models/config.py
27+++ b/src/maasserver/models/config.py
28@@ -134,6 +134,8 @@ def get_default_config():
29 "vcenter_username": "",
30 "vcenter_password": "",
31 "vcenter_datacenter": "",
32+ # Hardware Sync options
33+ "hardware_sync_interval": "15m",
34 }
35
36
37diff --git a/src/metadataserver/templates/hardware_sync_service.template b/src/metadataserver/templates/hardware_sync_service.template
38new file mode 100644
39index 0000000..a649777
40--- /dev/null
41+++ b/src/metadataserver/templates/hardware_sync_service.template
42@@ -0,0 +1,9 @@
43+[Unit]
44+Description=MAAS Hardware Sync Service
45+Documentation=https://maas.io
46+Want=network.target
47+After=network.target
48+
49+[Service]
50+type=oneshot
51+ExecStart=/bin/echo "TODO add hardware sync executable"
52diff --git a/src/metadataserver/templates/hardware_sync_timer.template b/src/metadataserver/templates/hardware_sync_timer.template
53new file mode 100644
54index 0000000..a0c175e
55--- /dev/null
56+++ b/src/metadataserver/templates/hardware_sync_timer.template
57@@ -0,0 +1,11 @@
58+[Unit]
59+Description=Timer for periodically running MAAS hardware sync
60+Documentation=https://maas.io
61+Want=network.target
62+After=network.target
63+
64+[Install]
65+WantedBy=timers.target
66+
67+[Timer]
68+OnActiveSec={{ hardware_sync_interval }}
69diff --git a/src/metadataserver/tests/test_vendor_data.py b/src/metadataserver/tests/test_vendor_data.py
70index 1d9f131..0432a9a 100644
71--- a/src/metadataserver/tests/test_vendor_data.py
72+++ b/src/metadataserver/tests/test_vendor_data.py
73@@ -5,6 +5,7 @@ import random
74 from textwrap import dedent
75
76 from netaddr import IPAddress
77+import tempita
78 from testtools.matchers import (
79 Contains,
80 ContainsDict,
81@@ -27,14 +28,18 @@ from maasserver.testing.testcase import MAASServerTestCase
82 from maastesting.matchers import MockNotCalled
83 from metadataserver import vendor_data
84 from metadataserver.vendor_data import (
85+ _get_metadataserver_template,
86 generate_ephemeral_deployment_network_configuration,
87 generate_ephemeral_netplan_lock_removal,
88+ generate_hardware_sync_systemd_configuration,
89 generate_kvm_pod_configuration,
90 generate_ntp_configuration,
91 generate_rack_controller_configuration,
92 generate_snap_configuration,
93 generate_system_info,
94 get_vendor_data,
95+ HARDWARE_SYNC_SERVICE_TEMPLATE,
96+ HARDWARE_SYNC_TIMER_TEMPLATE,
97 )
98 from provisioningserver.drivers.pod.lxd import LXD_MAAS_PROJECT_CONFIG
99
100@@ -683,3 +688,50 @@ class TestGenerateVcenterConfiguration(MAASServerTestCase):
101 Config.objects.set_config(key, factory.make_name(key))
102 config = get_vendor_data(node, None)
103 self.assertNotIn("write_files", config)
104+
105+
106+class TestGenerateHardwareSyncSystemdConfiguration(MAASServerTestCase):
107+ def _get_timer_template(self):
108+ return tempita.Template(
109+ _get_metadataserver_template(HARDWARE_SYNC_TIMER_TEMPLATE),
110+ )
111+
112+ def _get_service_template(self):
113+ return tempita.Template(
114+ _get_metadataserver_template(HARDWARE_SYNC_SERVICE_TEMPLATE),
115+ )
116+
117+ def test_returns_nothing_if_node_enable_hw_sync_is_False(self):
118+ node = factory.make_Node(
119+ status=NODE_STATUS.DEPLOYING,
120+ )
121+ config = generate_hardware_sync_systemd_configuration(node)
122+ self.assertRaises(StopIteration, next, config)
123+
124+ def test_returns_timer_and_service_when_node_enable_hw_sync_is_True(self):
125+ node = factory.make_Node(
126+ status=NODE_STATUS.DEPLOYING,
127+ enable_hw_sync=True,
128+ )
129+ config = generate_hardware_sync_systemd_configuration(node)
130+ expected_interval = Config.objects.get_configs(
131+ ["hardware_sync_interval"]
132+ )
133+
134+ expected = (
135+ "write_files",
136+ [
137+ {
138+ "content": self._get_timer_template().substitute(
139+ hardware_sync_interval=expected_interval
140+ ),
141+ "path": "/lib/systemd/system/maas_hardware_sync.timer",
142+ },
143+ {
144+ "content": self._get_service_template().substitute(),
145+ "path": "/lib/systemd/system/maas_hardware_sync.service",
146+ },
147+ ],
148+ )
149+
150+ self.assertCountEqual(next(config), expected)
151diff --git a/src/metadataserver/vendor_data.py b/src/metadataserver/vendor_data.py
152index 7e92c68..2826009 100644
153--- a/src/metadataserver/vendor_data.py
154+++ b/src/metadataserver/vendor_data.py
155@@ -8,9 +8,11 @@ from base64 import b64encode
156 from crypt import crypt
157 from itertools import chain
158 from os import urandom
159+import pkgutil
160 from textwrap import dedent
161
162 from netaddr import IPAddress
163+import tempita
164 import yaml
165
166 from maasserver import ntp
167@@ -29,6 +31,9 @@ from provisioningserver.utils.text import make_gecos_field
168 LXD_CERTIFICATE_METADATA_KEY = "lxd_certificate"
169 VIRSH_PASSWORD_METADATA_KEY = "virsh_password"
170
171+HARDWARE_SYNC_TIMER_TEMPLATE = "hardware_sync_timer.template"
172+HARDWARE_SYNC_SERVICE_TEMPLATE = "hardware_sync_service.template"
173+
174
175 def get_vendor_data(node, proxy):
176 generators = (
177@@ -40,6 +45,7 @@ def get_vendor_data(node, proxy):
178 generate_ephemeral_netplan_lock_removal(node),
179 generate_ephemeral_deployment_network_configuration(node),
180 generate_vcenter_configuration(node),
181+ generate_hardware_sync_systemd_configuration(node),
182 )
183 vendor_data = {}
184 for key, value in chain(*generators):
185@@ -350,6 +356,47 @@ def generate_vcenter_configuration(node):
186 ]
187
188
189+def _get_metadataserver_template(template_name):
190+ """Returns the contents of a given template in metadataserver/vendor_data/templates/"""
191+ return pkgutil.get_data(
192+ "metadataserver.vendor_data", "templates/" + template_name
193+ ).decode("utf-8")
194+
195+
196+def generate_hardware_sync_systemd_configuration(node):
197+ """generate systemd unit files for hardware sync"""
198+ if not node.enable_hw_sync:
199+ return
200+
201+ hardware_sync_interval = Config.objects.get_configs(
202+ ["hardware_sync_interval"]
203+ )
204+ hardware_sync_timer_tmpl = tempita.Template(
205+ _get_metadataserver_template(HARDWARE_SYNC_TIMER_TEMPLATE)
206+ )
207+ hardware_sync_service_tmpl = tempita.Template(
208+ _get_metadataserver_template(HARDWARE_SYNC_SERVICE_TEMPLATE)
209+ )
210+
211+ hardware_sync_timer = hardware_sync_timer_tmpl.substitute(
212+ hardware_sync_interval=hardware_sync_interval
213+ )
214+ hardware_sync_service = (
215+ hardware_sync_service_tmpl.substitute()
216+ ) # TODO substitute node architecture for executable
217+
218+ yield "write_files", [
219+ {
220+ "content": hardware_sync_timer,
221+ "path": "/lib/systemd/system/maas_hardware_sync.timer",
222+ },
223+ {
224+ "content": hardware_sync_service,
225+ "path": "/lib/systemd/system/maas_hardware_sync.service",
226+ },
227+ ]
228+
229+
230 def _generate_password():
231 """Generate a 32-character password by encoding 24 bytes as base64."""
232 return b64encode(urandom(24), altchars=b".!").decode("ascii")

Subscribers

People subscribed via source and target branches