Merge ~simpoir/ubuntu/+source/landscape-client:beyond_19.04_bionic into ubuntu/+source/landscape-client:ubuntu/bionic-devel

Proposed by Simon Poirier
Status: Merged
Approved by: Andreas Hasenack
Approved revision: 8d11f9bc42b67bdef9e5f3a6540c650bbfa4288b
Merged at revision: 8d11f9bc42b67bdef9e5f3a6540c650bbfa4288b
Proposed branch: ~simpoir/ubuntu/+source/landscape-client:beyond_19.04_bionic
Merge into: ubuntu/+source/landscape-client:ubuntu/bionic-devel
Diff against target: 377 lines (+326/-1)
6 files modified
debian/changelog (+12/-0)
debian/landscape-client.init (+2/-1)
debian/landscape-client.postinst (+3/-0)
debian/patches/product-name-vminfo-1828217.patch (+49/-0)
debian/patches/series (+2/-0)
debian/patches/stagger-launch-1788518.patch (+258/-0)
Reviewer Review Type Date Requested Status
Andreas Hasenack Approve
git-ubuntu developers Pending
Review via email: mp+370075@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Verified it's the same change that already went into disco, bar the changelog:
$ git range-diff pkg/ubuntu/bionic-devel..beyond_19.04_bionic pkg/ubuntu/disco-devel..beyond_19.04_disco
1: a939d04 = 1: 643b439 Add d/p/product-name-vminfo-1828217.patch
2: 74bc2ea = 2: 3d0177f Default data_path in postinst (LP: #1728681)
3: 6dd6f7a = 3: 65bd8bf Add d/p/stagger-launch-1788518.patch
4: 75db615 = 4: 9188d8c Fix regression with d/landscape-client.init
5: 8d11f9b ! 5: a4c9ce7 Update changelog
(...)

The bugs will need the respective ubuntu release tasks, and note that the init one is claimed to only affect disco, so it would probably be good to add a note to the bug explaining why it's being "fixed" for non-disco, i.e., we want to keep the source package the same for all releases, etc, something like that.

+1

review: Approve
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Sponsoring 8d11f9bc42b67bdef9e5f3a6540c650bbfa4288b

Tagged and uploaded:
$ git push pkg upload/18.01-0ubuntu3.4
Enumerating objects: 32, done.
Counting objects: 100% (32/32), done.
Delta compression using up to 2 threads
Compressing objects: 100% (25/25), done.
Writing objects: 100% (25/25), 6.96 KiB | 713.00 KiB/s, done.
Total 25 (delta 17), reused 0 (delta 0)
To ssh://git.launchpad.net/~usd-import-team/ubuntu/+source/landscape-client
 * [new tag] upload/18.01-0ubuntu3.4 -> upload/18.01-0ubuntu3.4

$ dput ubuntu ../landscape-client_18.01-0ubuntu3.4_source.changes
Checking signature on .changes
gpg: ../landscape-client_18.01-0ubuntu3.4_source.changes: Valid signature from AC983EB5BF6BCBA9
Checking signature on .dsc
gpg: ../landscape-client_18.01-0ubuntu3.4.dsc: Valid signature from AC983EB5BF6BCBA9
Uploading to ubuntu (via ftp to upload.ubuntu.com):
  Uploading landscape-client_18.01-0ubuntu3.4.dsc: done.
  Uploading landscape-client_18.01-0ubuntu3.4.debian.tar.xz: done.
  Uploading landscape-client_18.01-0ubuntu3.4_source.buildinfo: done.
  Uploading landscape-client_18.01-0ubuntu3.4_source.changes: done.
Successfully uploaded packages.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/debian/changelog b/debian/changelog
index 5e26fb2..53ea9c1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
1landscape-client (18.01-0ubuntu3.4) bionic; urgency=medium
2
3 * d/p/product-name-vminfo-1828217.patch: Add product_name to things scanned
4 for vm_info (LP: #1828217)
5 * d/landscape-client.postinst: Set default value if data_path is
6 missing. (LP: #1728681)
7 * d/p/stagger-launch-1788518.patch: Add option to stagger launch of broker
8 plugins. (LP: #1788518)
9 * d/landscape-client.init: Fix init script stop action (LP: #1833137)
10
11 -- Simon Poirier <simon.poirier@canonical.com> Thu, 27 Jun 2019 11:07:30 -0400
12
1landscape-client (18.01-0ubuntu3.3) bionic; urgency=medium13landscape-client (18.01-0ubuntu3.3) bionic; urgency=medium
214
3 * debian/patches/mem-usage-1685885.patch: Reduce memory usage by15 * debian/patches/mem-usage-1685885.patch: Reduce memory usage by
diff --git a/debian/landscape-client.init b/debian/landscape-client.init
index fcaeafd..ed51cc2 100644
--- a/debian/landscape-client.init
+++ b/debian/landscape-client.init
@@ -63,7 +63,8 @@ case "$1" in
6363
64 stop)64 stop)
65 log_daemon_msg "Stopping $NAME daemon"65 log_daemon_msg "Stopping $NAME daemon"
66 start-stop-daemon --retry 30 --stop --quiet --pidfile $PIDFILE66 # not a typo, linux process names are truncated to 15chars
67 start-stop-daemon --retry 30 --stop --quiet --pidfile $PIDFILE -n landscape-clien
67 log_end_msg $?68 log_end_msg $?
68 ;;69 ;;
6970
diff --git a/debian/landscape-client.postinst b/debian/landscape-client.postinst
index d8d91ba..6e441ea 100644
--- a/debian/landscape-client.postinst
+++ b/debian/landscape-client.postinst
@@ -102,6 +102,9 @@ END
102 # user information. The flag file will be removed by the client when102 # user information. The flag file will be removed by the client when
103 # the update completes.103 # the update completes.
104 DATA_PATH="`grep ^data_path /etc/landscape/client.conf | cut -d= -f2 | tr -d '[[:space:]]'`"104 DATA_PATH="`grep ^data_path /etc/landscape/client.conf | cut -d= -f2 | tr -d '[[:space:]]'`"
105 if [ -z "$DATA_PATH" ]; then
106 DATA_PATH=/var/lib/landscape/client
107 fi
105 install --owner=landscape --directory $DATA_PATH108 install --owner=landscape --directory $DATA_PATH
106 USER_UPDATE_FLAG_FILE="$DATA_PATH/user-update-flag"109 USER_UPDATE_FLAG_FILE="$DATA_PATH/user-update-flag"
107 install --owner=landscape /dev/null $USER_UPDATE_FLAG_FILE110 install --owner=landscape /dev/null $USER_UPDATE_FLAG_FILE
diff --git a/debian/patches/product-name-vminfo-1828217.patch b/debian/patches/product-name-vminfo-1828217.patch
108new file mode 100644111new file mode 100644
index 0000000..4420e0c
--- /dev/null
+++ b/debian/patches/product-name-vminfo-1828217.patch
@@ -0,0 +1,49 @@
1Description: Add product_name to things scanned for vm_info
2Author: Simon Poirier <simon.poirier@canonical.com>
3Origin: upstream, https://github.com/CanonicalLtd/landscape-client/commit/ad28feeb7d3031268eeb206c4d8bdcd015ad79ae
4Bug-Ubuntu: https://bugs.launchpad.net/bugs/1828217
5Last-Update: 2019-06-14
6
7--- a/landscape/lib/tests/test_vm_info.py
8+++ b/landscape/lib/tests/test_vm_info.py
9@@ -179,6 +179,11 @@
10 self.make_dmi_info("sys_vendor", "Some other vendor")
11 self.assertEqual(b"", get_vm_info(root_path=self.root_path))
12
13+ def test_get_vm_info_with_kvm_product(self):
14+ """get_vm_info returns 'kvm', if product_name is 'KVM'."""
15+ self.make_dmi_info("product_name", "KVM")
16+ self.assertEqual(b"kvm", get_vm_info(root_path=self.root_path))
17+
18
19 class GetContainerInfoTest(BaseTestCase):
20
21--- a/landscape/lib/vm_info.py
22+++ b/landscape/lib/vm_info.py
23@@ -6,6 +6,9 @@
24 from landscape.lib.fs import read_text_file
25
26
27+DMI_FILES = ("sys_vendor", "chassis_vendor", "bios_vendor", "product_name")
28+
29+
30 def get_vm_info(root_path="/"):
31 """
32 Return a bytestring with the virtualization type if it's known, an empty
33@@ -22,7 +25,7 @@
34 # Iterate through all dmi *_vendors, as clouds can (and will) customize
35 # sysinfo values. (https://libvirt.org/formatdomain.html#elementsSysinfo)
36 dmi_info_path = os.path.join(root_path, "sys/class/dmi/id")
37- for dmi_info_file in ("sys_vendor", "chassis_vendor", "bios_vendor"):
38+ for dmi_info_file in DMI_FILES:
39 dmi_vendor_path = os.path.join(dmi_info_path, dmi_info_file)
40 if not os.path.exists(dmi_vendor_path):
41 continue
42@@ -76,6 +79,7 @@
43 ("nutanix", b"kvm"),
44 ("openstack", b"kvm"),
45 ("qemu", b"kvm"),
46+ ("kvm", b"kvm"),
47 ("vmware", b"vmware"))
48 for name, vm_type in content_vendors_map:
49 if name in vendor:
diff --git a/debian/patches/series b/debian/patches/series
index 79d72dd..ebfbf13 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -7,3 +7,5 @@ post-upgrade-reboot.patch
7unicode-tags-script.patch7unicode-tags-script.patch
81616116-resync-loop.patch81616116-resync-loop.patch
9mem-usage-1685885.patch9mem-usage-1685885.patch
10product-name-vminfo-1828217.patch
11stagger-launch-1788518.patch
diff --git a/debian/patches/stagger-launch-1788518.patch b/debian/patches/stagger-launch-1788518.patch
10new file mode 10064412new file mode 100644
index 0000000..d0f2908
--- /dev/null
+++ b/debian/patches/stagger-launch-1788518.patch
@@ -0,0 +1,258 @@
1Description: Add option to stagger launch of broker plugins.
2Author: Simon Poirier <simon.poirier@canonical.com>
3Origin: upstream, https://github.com/CanonicalLtd/landscape-client/commit/597a584083f5245b8960e6c20d67e0fe25bdcdc2
4Bug-Ubuntu: https://bugs.launchpad.net/bugs/1788518
5Last-Update: 2019-06-14
6
7diff --git a/example.conf b/example.conf
8index 47dac275..3965d29d 100644
9--- a/example.conf
10+++ b/example.conf
11@@ -50,6 +50,16 @@ ping_url = http://landscape.canonical.com/ping
12 #
13 #ssl_public_key
14
15+# The ratio over which to spread landscape intervals. This is to mitigate
16+# the impact of restarting the host of multiple landscape-client instances.
17+# Values range from 0.0 to 1.0, from unstaggered to spreading over
18+# the full interval.
19+#
20+# Default value is 0.1, meaning jobs will start with up to 10% delay
21+#
22+# Example:
23+# stagger_launch = 0.5
24+
25 # If set to True interrupt (SIGINT) signals will be ignored by the
26 # landscape-client daemon.
27 ignore_sigint = False
28diff --git a/landscape/client/broker/client.py b/landscape/client/broker/client.py
29index 62287329..042c18a4 100644
30--- a/landscape/client/broker/client.py
31+++ b/landscape/client/broker/client.py
32@@ -1,5 +1,6 @@
33-from logging import info, exception, error
34+from logging import info, exception, error, debug
35 import sys
36+import random
37
38 from twisted.internet.defer import maybeDeferred, succeed
39
40@@ -105,9 +106,18 @@ class BrokerClientPlugin(object):
41 if self.run_immediately:
42 self._run_with_error_log()
43 if self.run_interval is not None:
44- self._loop = self.client.reactor.call_every(
45- self.run_interval,
46- self._run_with_error_log)
47+ delay = (random.random() * self.run_interval *
48+ self.client.config.stagger_launch)
49+ debug("delaying start of %s for %d seconds",
50+ format_object(self), delay)
51+ self._loop = self.client.reactor.call_later(
52+ delay, self._start_loop)
53+
54+ def _start_loop(self):
55+ """Launch the client loop."""
56+ self._loop = self.client.reactor.call_every(
57+ self.run_interval,
58+ self._run_with_error_log)
59
60 def _run_with_error_log(self):
61 """Wrap self.run in a Deferred with a logging error handler."""
62@@ -140,10 +150,11 @@ class BrokerClient(object):
63 """
64 name = "client"
65
66- def __init__(self, reactor):
67+ def __init__(self, reactor, config):
68 super(BrokerClient, self).__init__()
69 self.reactor = reactor
70 self.broker = None
71+ self.config = config
72 self._registered_messages = {}
73 self._plugins = []
74 self._plugin_names = {}
75diff --git a/landscape/client/broker/tests/helpers.py b/landscape/client/broker/tests/helpers.py
76index 97c5e4f4..fc010209 100644
77--- a/landscape/client/broker/tests/helpers.py
78+++ b/landscape/client/broker/tests/helpers.py
79@@ -206,7 +206,9 @@ class BrokerClientHelper(RemoteBrokerHelper):
80 # The client needs its own reactor to avoid infinite loops
81 # when the broker broadcasts and event
82 test_case.client_reactor = FakeReactor()
83- test_case.client = BrokerClient(test_case.client_reactor)
84+ config = BrokerConfiguration()
85+ config.stagger_launch = 0 # let's keep tests deterministic
86+ test_case.client = BrokerClient(test_case.client_reactor, config)
87 test_case.client.broker = test_case.remote
88
89
90diff --git a/landscape/client/broker/tests/test_client.py b/landscape/client/broker/tests/test_client.py
91index 967f77db..3295b02b 100644
92--- a/landscape/client/broker/tests/test_client.py
93+++ b/landscape/client/broker/tests/test_client.py
94@@ -178,6 +178,26 @@ class BrokerClientTest(LandscapeTest):
95 deferred.callback(123)
96 self.assertEquals(runs, [True, True])
97
98+ @mock.patch("random.random")
99+ def test_run_interval_staggered(self, mock_random):
100+ """
101+ If a plugin has a run method and staggered_launch is set,
102+ the launch gets delayed by a random factor.
103+ """
104+ mock_random.return_value = 1.0
105+ plugin = BrokerClientPlugin()
106+ plugin.run_interval = 60
107+ plugin.run = mock.Mock()
108+ self.client.config.stagger_launch = 0.5
109+ self.client.add(plugin)
110+ self.client_reactor.advance(30)
111+ self.assertEqual(0, plugin.run.call_count)
112+ self.client_reactor.advance(60)
113+ self.assertEqual(1, plugin.run.call_count)
114+ self.client_reactor.advance(60)
115+ self.assertEqual(2, plugin.run.call_count)
116+ self.assertEqual(1, mock_random.call_count)
117+
118 def test_run_immediately(self):
119 """
120 If a plugin has a C{run} method and C{run_immediately} is C{True},
121diff --git a/landscape/client/deployment.py b/landscape/client/deployment.py
122index 8c2f905e..7c5464cb 100644
123--- a/landscape/client/deployment.py
124+++ b/landscape/client/deployment.py
125@@ -82,6 +82,7 @@ class Configuration(BaseConfiguration):
126 - C{ping_url} (C{"http://landscape.canonical.com/ping"})
127 - C{ssl_public_key}
128 - C{ignore_sigint} (C{False})
129+ - C{stagger_launch} (C{0.1})
130 """
131 parser = super(Configuration, self).make_parser()
132 logging.add_cli_options(parser, logdir="/var/log/landscape")
133@@ -111,6 +112,10 @@ class Configuration(BaseConfiguration):
134 metavar="INTERVAL",
135 help="The number of seconds between flushes to disk "
136 "for persistent data.")
137+ parser.add_option("--stagger-launch", metavar="STAGGER_RATIO",
138+ dest="stagger_launch", default=0.1, type=float,
139+ help="Ratio, between 0 and 1, by which to scatter "
140+ "various tasks of landscape.")
141
142 # Hidden options, used for load-testing to run in-process clones
143 parser.add_option("--clones", default=0, type=int, help=SUPPRESS_HELP)
144diff --git a/landscape/client/manager/manager.py b/landscape/client/manager/manager.py
145index a662e13e..18d13148 100644
146--- a/landscape/client/manager/manager.py
147+++ b/landscape/client/manager/manager.py
148@@ -12,7 +12,7 @@ class Manager(BrokerClient):
149 name = "manager"
150
151 def __init__(self, reactor, config):
152- super(Manager, self).__init__(reactor)
153+ super(Manager, self).__init__(reactor, config)
154 self.reactor = reactor
155 self.config = config
156 self.store = ManagerStore(self.config.store_filename)
157diff --git a/landscape/client/monitor/monitor.py b/landscape/client/monitor/monitor.py
158index 7ab82560..ebd3823d 100644
159--- a/landscape/client/monitor/monitor.py
160+++ b/landscape/client/monitor/monitor.py
161@@ -12,7 +12,7 @@ class Monitor(BrokerClient):
162
163 def __init__(self, reactor, config, persist, persist_filename=None,
164 step_size=5 * 60):
165- super(Monitor, self).__init__(reactor)
166+ super(Monitor, self).__init__(reactor, config)
167 self.reactor = reactor
168 self.config = config
169 self.persist = persist
170diff --git a/landscape/client/tests/helpers.py b/landscape/client/tests/helpers.py
171index 73775f99..a15353fc 100644
172--- a/landscape/client/tests/helpers.py
173+++ b/landscape/client/tests/helpers.py
174@@ -175,6 +175,7 @@ class MonitorHelper(FakeBrokerServiceHelper):
175 persist_filename = test_case.makePersistFile()
176 test_case.config = MonitorConfiguration()
177 test_case.config.load(["-c", test_case.config_filename])
178+ test_case.config.stagger_launch = 0 # let's keep tests deterministic
179 test_case.reactor = FakeReactor()
180 test_case.monitor = Monitor(
181 test_case.reactor, test_case.config,
182diff --git a/landscape/client/tests/test_configuration.py b/landscape/client/tests/test_configuration.py
183index 58381321..36d6d3ec 100644
184--- a/landscape/client/tests/test_configuration.py
185+++ b/landscape/client/tests/test_configuration.py
186@@ -753,6 +753,13 @@ class LandscapeSetupScriptTest(LandscapeTest):
187 self.assertEqual(self.config.access_group, u"webservers")
188 mock_input.assert_not_called()
189
190+ @mock.patch("landscape.client.configuration.input")
191+ def test_stagger_defined_on_command_line(self, mock_input):
192+ self.assertEqual(self.config.stagger_launch, 0.1)
193+ self.config.load_command_line(["--stagger-launch", "0.5"])
194+ self.assertEqual(self.config.stagger_launch, 0.5)
195+ mock_input.assert_not_called()
196+
197 @mock.patch("landscape.client.configuration.show_help")
198 def test_show_header(self, mock_show_help):
199 help_snippet = "This script will"
200diff --git a/man/landscape-client.1 b/man/landscape-client.1
201index 3a16c4a9..adb4bdc1 100644
202--- a/man/landscape-client.1
203+++ b/man/landscape-client.1
204@@ -1,5 +1,5 @@
205 .\" Text automatically generated by txt2man
206-.TH landscape-client 1 "05 January 2017" "" ""
207+.TH landscape-client 1 "14 February 2019" "" ""
208 .SH NAME
209 \fBlandscape-client \fP- Landscape system client
210 \fB
211diff --git a/man/landscape-config.1 b/man/landscape-config.1
212index 6f362f2f..7d398fff 100644
213--- a/man/landscape-config.1
214+++ b/man/landscape-config.1
215@@ -1,5 +1,5 @@
216 .\" Text automatically generated by txt2man
217-.TH landscape-config 1 "05 January 2017" "" ""
218+.TH landscape-config 1 "14 February 2019" "" ""
219 .SH NAME
220 \fBlandscape-config \fP- configure the Landscape management client
221 \fB
222@@ -139,6 +139,11 @@ Comma separated list of tag names to be sent to the
223 server.
224 .TP
225 .B
226+\fB--stagger-launch\fP=STAGGER_RATIO
227+Ratio, between 0 and 1, by which to scatter various
228+tasks of landscape.
229+.TP
230+.B
231 \fB--import\fP=FILENAME_OR_URL
232 Filename or URL to import configuration from.
233 Imported \fIoptions\fP behave as if they were passed in
234diff --git a/man/landscape-config.txt b/man/landscape-config.txt
235index 223398b7..5a100bf0 100644
236--- a/man/landscape-config.txt
237+++ b/man/landscape-config.txt
238@@ -58,6 +58,8 @@ OPTIONS
239 EC2 or UEC. Read below for details.
240 --tags=TAGS Comma separated list of tag names to be sent to the
241 server.
242+ --stagger-launch=STAGGER_RATIO Ratio, between 0 and 1, by which to scatter various
243+ tasks of landscape.
244 --import=FILENAME_OR_URL Filename or URL to import configuration from.
245 Imported options behave as if they were passed in
246 the command line, with precedence being given to
247diff --git a/man/landscape-sysinfo.1 b/man/landscape-sysinfo.1
248index e8dd2ff4..90852975 100644
249--- a/man/landscape-sysinfo.1
250+++ b/man/landscape-sysinfo.1
251@@ -1,5 +1,5 @@
252 .\" Text automatically generated by txt2man
253-.TH landscape-sysinfo 1 "07 March 2018" "" ""
254+.TH landscape-sysinfo 1 "14 February 2019" "" ""
255 .SH NAME
256 \fBlandscape-sysinfo \fP- Display a summary of the current system status
257 \fB
258

Subscribers

People subscribed via source and target branches