Following patch allows power templates to be discovered dynamically. It doesn't cache the data but I think its low overhead. If someone wants to add caching to it then please do.
From 133b6e6fdbdd4edaae29edba3f89366f72d01d1a Mon Sep 17 00:00:00 2001
From: Bill Peck bpeck@redhat.com Date: Thu, 28 May 2009 14:18:16 -0400 Subject: [PATCH] allow power validation based on installed templates
--- cobbler/action_power.py | 22 ++-------------------- cobbler/item_system.py | 5 ++--- cobbler/utils.py | 20 +++++++++++++++++++- 3 files changed, 23 insertions(+), 24 deletions(-)
diff --git a/cobbler/action_power.py b/cobbler/action_power.py index 2ab88b8..3d62956 100644 --- a/cobbler/action_power.py +++ b/cobbler/action_power.py @@ -147,26 +147,8 @@ class PowerTool: if self.system.power_type in [ "", "none" ]: raise CX("Power management is not enabled for this system")
- powerdir=self.settings.power_template_dir - map = { - "bullpap" : os.path.join(powerdir,"power_bullpap.template"), - "apc" : os.path.join(powerdir,"power_apc.template"), - "apc_snmp" : os.path.join(powerdir,"power_apc_snmp.template"), - "ether-wake" : os.path.join(powerdir,"power_ether_wake.template"), - "drac" : os.path.join(powerdir,"power_drac.template"), - "ipmitool" : os.path.join(powerdir,"power_ipmitool.template"), - "ipmilan" : os.path.join(powerdir,"power_ipmilan.template"), - "ilo" : os.path.join(powerdir,"power_ilo.template"), - "rsa" : os.path.join(powerdir,"power_rsa.template"), - "lpar" : os.path.join(powerdir,"power_lpar.template"), - "bladecenter": os.path.join(powerdir,"power_bladecenter.template"), - "virsh" : os.path.join(powerdir,"power_virsh.template"), - "integrity" : os.path.join(powerdir,"power_integrity.template"), - "wti" : os.path.join(powerdir,"power_wti.template"), - } - - result = map.get(self.system.power_type, "") - if result == "": + result = utils.get_power(self.system.power_type) + if not result: raise CX("Invalid power management type for this system (%s, %s)" % (self.system.power_type, self.system.name)) return result
diff --git a/cobbler/item_system.py b/cobbler/item_system.py index 26da67e..5e67188 100644 --- a/cobbler/item_system.py +++ b/cobbler/item_system.py @@ -54,7 +54,7 @@ FIELDS = [ ["comment","",0,"Comment",True,"Free form text description",0], ["ctime",0,0,"",False,"",0], ["mtime",0,0,"",False,"",0], - ["power_type","SETTINGS:power_management_default_type",0,"Power Management Type",True,"",["apc_snmp","bladecenter","bullpap","drac","ether_wake","ilo","integrity","ipmilan","ipmitool","lpar","rsa","virsh","wti"]], + ["power_type","SETTINGS:power_management_default_type",0,"Power Management Type",True,"",utils.get_power_types()], ["power_address","",0,"Power Management Address",True,"Ex: power-device.example.org",0], ["power_user","",0,"Power Username ",True,"",0], ["power_pass","",0,"Power Password",True,"",0], @@ -489,8 +489,7 @@ class System(item.Item): if power_type is None: power_type = "" power_type = power_type.lower() - valid = "bullpap wti apc_snmp ether-wake ipmilan drac ipmitool ilo rsa lpar bladecenter virsh integrity none" - choices = valid.split(" ") + choices = utils.get_power_types() choices.sort() if power_type not in choices: raise CX("power type must be one of: %s" % ",".join(choices)) diff --git a/cobbler/utils.py b/cobbler/utils.py index 4e7690d..5dd6b9f 100644 --- a/cobbler/utils.py +++ b/cobbler/utils.py @@ -1789,4 +1789,22 @@ def get_remote_methods_from_fields(obj,fields): ds["delete_interface"] = getattr(obj,"delete_interface") return ds
- +def get_power_types(): + """ + Return all possible power types + """ + power_types = [] + power_template = re.compile(r'power_(.*).template') + for x in glob.glob("/etc/cobbler/power/power_*.template"): + power_types.append(power_template.search(x).group(1)) + return power_types + +def get_power(powertype=None): + """ + Return power command for type + """ + if powertype: + powerpath = "/etc/cobbler/power/power_%s.template" % powertype + if os.path.isfile(powerpath): + return powerpath + return None