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(a)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
--
1.6.0.6