diff options
author | Michael DeHaan <mdehaan@mdehaan.rdu.redhat.com> | 2007-06-06 17:53:24 -0400 |
---|---|---|
committer | Michael DeHaan <mdehaan@mdehaan.rdu.redhat.com> | 2007-06-06 17:53:24 -0400 |
commit | 3673e98fdf97f77c2f66d5c14e60dddc5b1fe349 (patch) | |
tree | fb9a8bc429abbaf069bea62cf2aeb7cd62dd1e72 | |
parent | ec14d428ffafee3e4fa0b549e26c74028b67313e (diff) | |
download | cobbler-3673e98fdf97f77c2f66d5c14e60dddc5b1fe349.tar.gz cobbler-3673e98fdf97f77c2f66d5c14e60dddc5b1fe349.tar.xz cobbler-3673e98fdf97f77c2f66d5c14e60dddc5b1fe349.zip |
This is Adam Rosenwald's patch for seperating triggers into pre and post
triggers, plus my modifications to make them deal with return codes.
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | cobbler.spec | 24 | ||||
-rw-r--r-- | cobbler/collection.py | 24 | ||||
-rw-r--r-- | cobbler/collection_distros.py | 3 | ||||
-rw-r--r-- | cobbler/collection_profiles.py | 3 | ||||
-rw-r--r-- | cobbler/collection_repos.py | 3 | ||||
-rw-r--r-- | cobbler/collection_systems.py | 3 | ||||
-rw-r--r-- | setup.py | 24 | ||||
-rw-r--r-- | tests/tests.py | 8 |
9 files changed, 61 insertions, 32 deletions
@@ -13,6 +13,7 @@ Patches and other contributions from: Jim Meyering <jim@meyering.net> Mihai Ibanescu <mihai.ibanescu@gmail.com> Tru Huynh <tru@pasteur.fr> + Adam Rosenwald <thestrider@gmail.com> Scott Seago <sseago@redhat.com> [...send patches to get your name here...] diff --git a/cobbler.spec b/cobbler.spec index a18a0539..8835d831 100644 --- a/cobbler.spec +++ b/cobbler.spec @@ -110,14 +110,22 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT %dir /var/log/cobbler/syslog %defattr(2550,root,root) %dir /var/lib/cobbler -%dir /var/lib/cobbler/triggers/add/distro -%dir /var/lib/cobbler/triggers/add/profile -%dir /var/lib/cobbler/triggers/add/system -%dir /var/lib/cobbler/triggers/add/repo -%dir /var/lib/cobbler/triggers/delete/distro -%dir /var/lib/cobbler/triggers/delete/profile -%dir /var/lib/cobbler/triggers/delete/system -%dir /var/lib/cobbler/triggers/delete/repo +%dir /var/lib/cobbler/triggers/add/distro/pre +%dir /var/lib/cobbler/triggers/add/distro/post +%dir /var/lib/cobbler/triggers/add/profile/pre +%dir /var/lib/cobbler/triggers/add/profile/post +%dir /var/lib/cobbler/triggers/add/system/pre +%dir /var/lib/cobbler/triggers/add/system/post +%dir /var/lib/cobbler/triggers/add/repo/pre +%dir /var/lib/cobbler/triggers/add/repo/post +%dir /var/lib/cobbler/triggers/delete/distro/pre +%dir /var/lib/cobbler/triggers/delete/distro/post +%dir /var/lib/cobbler/triggers/delete/profile/pre +%dir /var/lib/cobbler/triggers/delete/profile/post +%dir /var/lib/cobbler/triggers/delete/system/pre +%dir /var/lib/cobbler/triggers/delete/system/post +%dir /var/lib/cobbler/triggers/delete/repo/pre +%dir /var/lib/cobbler/triggers/delete/repo/post /var/lib/cobbler/elilo-3.6-ia64.efi /var/lib/cobbler/menu.c32 %defattr(-,root,root) diff --git a/cobbler/collection.py b/cobbler/collection.py index b1c3be41..6a8c7879 100644 --- a/cobbler/collection.py +++ b/cobbler/collection.py @@ -85,13 +85,27 @@ class Collection(serializable.Serializable): if the object was added to the collection. Returns False if the object specified by ref deems itself invalid (and therefore won't be added to the collection). + + with_copy is a bit of a misnomer, but lots of internal add operations + can run with "with_copy" as False. True means a real final commit, as if + entered from the command line (or basically, by a user). + + With with_copy as False, the particular add call might just be being run + during deserialization, in which case extra semantics around the add don't really apply. + So, in that case, don't run any triggers and don't deal with any actual files. + """ if ref is None or not ref.is_valid(): raise CX(_("invalid parameter")) - self.listing[ref.name] = ref + if not with_copy: + # don't need to run triggers, so add it already ... + self.listing[ref.name] = ref # perform filesystem operations if with_copy: + # failure of a pre trigger will prevent the object from being added + self._run_triggers(ref,"/var/lib/cobbler/triggers/add/%s/pre/*" % self.collection_type()) + self.listing[ref.name] = ref lite_sync = action_litesync.BootLiteSync(self.config) if isinstance(ref, item_system.System): lite_sync.add_single_system(ref.name) @@ -104,15 +118,17 @@ class Collection(serializable.Serializable): # save the tree, so if neccessary, scripts can examine it. self.config.api.serialize() - - self._run_triggers(ref,"/var/lib/cobbler/triggers/add/%s/*" % self.collection_type()) + self._run_triggers(ref,"/var/lib/cobbler/triggers/add/%s/post/*" % self.collection_type()) + return True def _run_triggers(self,ref,globber): triggers = glob.glob(globber) for file in triggers: - sub_process.call("%s %s" % (file,ref.name), shell=True) + rc = sub_process.call("%s %s" % (file,ref.name), shell=True) + if rc != 0: + raise CX(_("cobbler trigger failed: %(file)s returns %(code)d") % { "file" : file, "code" : rc }) def printable(self): """ diff --git a/cobbler/collection_distros.py b/cobbler/collection_distros.py index 3fe45eda..4b88002e 100644 --- a/cobbler/collection_distros.py +++ b/cobbler/collection_distros.py @@ -52,9 +52,10 @@ class Distros(collection.Collection): raise CX(_("removal would orphan profile: %s") % v.name) if self.find(name): if with_delete: + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/pre/*") lite_sync = action_litesync.BootLiteSync(self.config) lite_sync.remove_single_profile(name) - self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/*") + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/post/*") del self.listing[name] return True raise CX(_("cannot delete object that does not exist")) diff --git a/cobbler/collection_profiles.py b/cobbler/collection_profiles.py index cd1d1045..bebaf494 100644 --- a/cobbler/collection_profiles.py +++ b/cobbler/collection_profiles.py @@ -50,9 +50,10 @@ class Profiles(collection.Collection): raise CX(_("removal would orphan system: %s") % v.name) if self.find(name): if with_delete: + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/pre/*") lite_sync = action_litesync.BootLiteSync(self.config) lite_sync.remove_single_profile(name) - self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/*") + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/post/*") del self.listing[name] return True raise CX(_("cannot delete an object that does not exist")) diff --git a/cobbler/collection_repos.py b/cobbler/collection_repos.py index 922a1ad6..e4e52195 100644 --- a/cobbler/collection_repos.py +++ b/cobbler/collection_repos.py @@ -54,8 +54,9 @@ class Repos(collection.Collection): # but is left in for consistancy in the API. if self.find(name): - self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/*") + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/pre/*") del self.listing[name] + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/post/*") return True raise CX(_("cannot delete an object that does not exist")) diff --git a/cobbler/collection_systems.py b/cobbler/collection_systems.py index 4eff2fbc..952fdbac 100644 --- a/cobbler/collection_systems.py +++ b/cobbler/collection_systems.py @@ -50,9 +50,10 @@ class Systems(collection.Collection): """ if self.find(name): if with_delete: + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/pre/*") lite_sync = action_litesync.BootLiteSync(self.config) lite_sync.remove_single_system(name) - self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/*") + self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/post/*") del self.listing[name] return True raise CX(_("cannot delete an object that does not exist")) @@ -79,14 +79,22 @@ if __name__ == "__main__": (vw_links, []), (tftp_cfg, []), (tftp_images, []), - ("/var/lib/cobbler/triggers/add/distro", []), - ("/var/lib/cobbler/triggers/add/profile", []), - ("/var/lib/cobbler/triggers/add/system", []), - ("/var/lib/cobbler/triggers/add/repo", []), - ("/var/lib/cobbler/triggers/delete/distro", []), - ("/var/lib/cobbler/triggers/delete/profile", []), - ("/var/lib/cobbler/triggers/delete/system", []), - ("/var/lib/cobbler/triggers/delete/repo", []) + ("/var/lib/cobbler/triggers/add/distro/pre", []), + ("/var/lib/cobbler/triggers/add/distro/post", []), + ("/var/lib/cobbler/triggers/add/profile/pre", []), + ("/var/lib/cobbler/triggers/add/profile/post", []), + ("/var/lib/cobbler/triggers/add/system/pre", []), + ("/var/lib/cobbler/triggers/add/system/post", []), + ("/var/lib/cobbler/triggers/add/repo/pre", []), + ("/var/lib/cobbler/triggers/add/repo/post", []), + ("/var/lib/cobbler/triggers/delete/distro/pre", []), + ("/var/lib/cobbler/triggers/delete/distro/post", []), + ("/var/lib/cobbler/triggers/delete/profile/pre", []), + ("/var/lib/cobbler/triggers/delete/profile/post", []), + ("/var/lib/cobbler/triggers/delete/system/pre", []), + ("/var/lib/cobbler/triggers/delete/system/post", []), + ("/var/lib/cobbler/triggers/delete/repo/pre", []) + ("/var/lib/cobbler/triggers/delete/repo/post", []) ], description = SHORT_DESC, long_description = LONG_DESC diff --git a/tests/tests.py b/tests/tests.py index e2b41e12..2f082e74 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -193,14 +193,6 @@ class Additions(BootTest): # self.failUnlessRaises(CobblerException, profile.set_virt_file_size, "54321.23") self.assertTrue(self.api.profiles().add(profile)) - def test_invalid_system_bad_name_host(self): - system = self.api.new_system() - name = "hostnamewontresolveanyway" - self.failUnlessRaises(CobblerException, system.set_name, name) - self.assertTrue(system.set_profile("testprofile0")) - self.failUnlessRaises(CobblerException, self.api.systems().add, system) - self.assertFalse(self.api.systems().find(name)) - def test_system_name_is_a_MAC(self): system = self.api.new_system() name = "00:16:41:14:B7:71" |