Merge lp:~fwereade/pyjuju/cobbler-instance-ids into lp:pyjuju

Proposed by William Reade
Status: Merged
Approved by: Kapil Thangavelu
Approved revision: 318
Merged at revision: 292
Proposed branch: lp:~fwereade/pyjuju/cobbler-instance-ids
Merge into: lp:pyjuju
Prerequisite: lp:~fwereade/pyjuju/cobbler-connect-production
Diff against target: 113 lines (+23/-15)
3 files modified
ensemble/providers/orchestra/cobbler.py (+11/-9)
ensemble/providers/orchestra/launch.py (+4/-4)
ensemble/providers/orchestra/tests/test_bootstrap.py (+8/-2)
To merge this branch: bzr merge lp:~fwereade/pyjuju/cobbler-instance-ids
Reviewer Review Type Date Requested Status
Kapil Thangavelu (community) Approve
Gustavo Niemeyer Approve
Review via email: mp+68725@code.launchpad.net

Description of the change

Long-term, cobbler system names can change, and are therefore a bad choice for ensemble instance IDs. This uses cobbler UIDs as instance IDs instead, and should therefore be more reliable in general (we'll still have problems if system names change while we're manipulating them, but the window of opportunity is much smaller)

To post a comment you must log in.
Revision history for this message
Gustavo Niemeyer (niemeyer) wrote :

Looks good!

review: Approve
316. By William Reade

merge parent

317. By William Reade

merge parent

318. By William Reade

merge parent

Revision history for this message
Kapil Thangavelu (hazmat) wrote :

LGTM, +1

review: Approve
319. By William Reade

merge latest trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'ensemble/providers/orchestra/cobbler.py'
--- ensemble/providers/orchestra/cobbler.py 2011-07-30 11:50:10 +0000
+++ ensemble/providers/orchestra/cobbler.py 2011-08-03 06:19:24 +0000
@@ -75,33 +75,35 @@
75 return call75 return call
7676
77 @inlineCallbacks77 @inlineCallbacks
78 def _set_on_system(self, name, key, value):78 def _set_on_system(self, instance_id, key, value):
79 (name,) = yield self._call("find_system", ({"uid": instance_id},))
79 handle = yield self._call("get_system_handle", (name,), auth=True)80 handle = yield self._call("get_system_handle", (name,), auth=True)
80 yield self._check_call("modify_system", (handle, key, value),81 yield self._check_call("modify_system", (handle, key, value),
81 auth=True, expect=True)82 auth=True, expect=True)
82 yield self._check_call("save_system", (handle,), auth=True, expect=True)83 yield self._check_call("save_system", (handle,), auth=True, expect=True)
84 returnValue(name)
8385
84 @inlineCallbacks86 @inlineCallbacks
85 def acquire_system(self):87 def acquire_system(self):
86 """Find a system marked as available and mark it as acquired.88 """Find a system marked as available and mark it as acquired.
8789
88 @return: the name of the acquired system.90 @return: the instance id (cobbler uid) of the acquired system.
8991
90 @raise: ProviderError if no suitable system can be found.92 @raise: ProviderError if no suitable system can be found.
91 """93 """
92 systems = yield self._call("get_systems")94 systems = yield self._call("get_systems")
93 system = _acceptable_system(systems, self._available_class)95 system = _acceptable_system(systems, self._available_class)
94 name = system["name"]96 instance_id = system["uid"]
95 # TODO surely we should preserve unrelated management classes?97 # TODO surely we should preserve unrelated management classes?
96 yield self._set_on_system(name, "mgmt_classes", [self._acquired_class])98 yield self._set_on_system(instance_id, "mgmt_classes", [self._acquired_class])
97 returnValue(name)99 returnValue(instance_id)
98100
99 def set_system_ks_meta(self, name, ks_meta):101 def set_system_ks_meta(self, instance_id, ks_meta):
100 return self._set_on_system(name, "ks_meta", ks_meta)102 return self._set_on_system(instance_id, "ks_meta", ks_meta)
101103
102 @inlineCallbacks104 @inlineCallbacks
103 def start_system(self, name):105 def start_system(self, instance_id):
104 yield self._set_on_system(name, "netboot_enabled", True)106 name = yield self._set_on_system(instance_id, "netboot_enabled", True)
105 yield self._call("background_power_system",107 yield self._call("background_power_system",
106 ({"power": "on", "systems": [name]},),108 ({"power": "on", "systems": [name]},),
107 auth=True)109 auth=True)
108110
=== modified file 'ensemble/providers/orchestra/launch.py'
--- ensemble/providers/orchestra/launch.py 2011-07-20 23:20:23 +0000
+++ ensemble/providers/orchestra/launch.py 2011-08-03 06:19:24 +0000
@@ -11,10 +11,10 @@
1111
12 @inlineCallbacks12 @inlineCallbacks
13 def start_machine(self, variables):13 def start_machine(self, variables):
14 name = yield self._provider.cobbler.acquire_system()14 instance_id = yield self._provider.cobbler.acquire_system()
15 ks_meta = 'ENSEMBLE_LATE_COMMAND="true"'15 ks_meta = 'ENSEMBLE_LATE_COMMAND="true"'
1616
17 yield self._provider.cobbler.set_system_ks_meta(name, ks_meta)17 yield self._provider.cobbler.set_system_ks_meta(instance_id, ks_meta)
18 yield self._provider.cobbler.start_system(name)18 yield self._provider.cobbler.start_system(instance_id)
1919
20 returnValue([OrchestraMachine(name, name)])20 returnValue([OrchestraMachine(instance_id, instance_id)])
2121
=== modified file 'ensemble/providers/orchestra/tests/test_bootstrap.py'
--- ensemble/providers/orchestra/tests/test_bootstrap.py 2011-08-01 20:02:18 +0000
+++ ensemble/providers/orchestra/tests/test_bootstrap.py 2011-08-03 06:19:24 +0000
@@ -34,12 +34,14 @@
34 systems.append(34 systems.append(
35 {"mgmt_classes": ["available"], # relevant35 {"mgmt_classes": ["available"], # relevant
36 "netboot_enabled": True,36 "netboot_enabled": True,
37 "name": "winston"})37 "uid": "winston-uid"})
3838
39 self.proxy_m.callRemote("get_systems")39 self.proxy_m.callRemote("get_systems")
40 self.mocker.result(succeed(systems))40 self.mocker.result(succeed(systems))
4141
42 def mock_acquire_system(self, unexpected_auth_error=None):42 def mock_acquire_system(self, unexpected_auth_error=None):
43 self.proxy_m.callRemote("find_system", {"uid": "winston-uid"})
44 self.mocker.result(succeed(["winston"]))
43 self.proxy_m.callRemote("get_system_handle", "winston", "")45 self.proxy_m.callRemote("get_system_handle", "winston", "")
44 if unexpected_auth_error is not None:46 if unexpected_auth_error is not None:
45 self.mocker.result(fail(unexpected_auth_error))47 self.mocker.result(fail(unexpected_auth_error))
@@ -56,6 +58,8 @@
56 self.mocker.result(succeed(True))58 self.mocker.result(succeed(True))
5759
58 def mock_set_ks_meta(self, fail_modify=False, fail_save=False):60 def mock_set_ks_meta(self, fail_modify=False, fail_save=False):
61 self.proxy_m.callRemote("find_system", {"uid": "winston-uid"})
62 self.mocker.result(succeed(["winston"]))
59 self.proxy_m.callRemote("get_system_handle", "winston", "TOKEN")63 self.proxy_m.callRemote("get_system_handle", "winston", "TOKEN")
60 self.mocker.result(succeed("smith"))64 self.mocker.result(succeed("smith"))
61 # TODO: parameterise this match?65 # TODO: parameterise this match?
@@ -73,6 +77,8 @@
73 self.mocker.result(succeed(True))77 self.mocker.result(succeed(True))
7478
75 def mock_start_system(self):79 def mock_start_system(self):
80 self.proxy_m.callRemote("find_system", {"uid": "winston-uid"})
81 self.mocker.result(succeed(["winston"]))
76 self.proxy_m.callRemote("get_system_handle", "winston", "TOKEN")82 self.proxy_m.callRemote("get_system_handle", "winston", "TOKEN")
77 self.mocker.result(succeed("smith"))83 self.mocker.result(succeed("smith"))
78 self.proxy_m.callRemote(84 self.proxy_m.callRemote(
@@ -138,6 +144,6 @@
138 def verify_machines(machines):144 def verify_machines(machines):
139 (machine,) = machines145 (machine,) = machines
140 self.assertTrue(isinstance(machine, OrchestraMachine))146 self.assertTrue(isinstance(machine, OrchestraMachine))
141 self.assertEquals(machine.instance_id, "winston")147 self.assertEquals(machine.instance_id, "winston-uid")
142 d.addCallback(verify_machines)148 d.addCallback(verify_machines)
143 return d149 return d

Subscribers

People subscribed via source and target branches

to status/vote changes: