diff options
Diffstat (limited to 'cobbler/item_system.py')
-rw-r--r-- | cobbler/item_system.py | 302 |
1 files changed, 160 insertions, 142 deletions
diff --git a/cobbler/item_system.py b/cobbler/item_system.py index d1411092..b7e77448 100644 --- a/cobbler/item_system.py +++ b/cobbler/item_system.py @@ -38,65 +38,65 @@ class System(item.Item): return cloned def clear(self,is_subobject=False): - self.name = None - self.uid = "" - self.owners = self.settings.default_ownership - self.profile = None - self.image = None - self.kernel_options = {} - self.kernel_options_post = {} - self.ks_meta = {} - self.interfaces = {} - self.netboot_enabled = True - self.depth = 2 - self.mgmt_classes = [] - self.template_files = {} - self.kickstart = "<<inherit>>" # use value in profile - self.server = "<<inherit>>" # "" (or settings) - self.virt_path = "<<inherit>>" # "" - self.virt_type = "<<inherit>>" # "" - self.virt_cpus = "<<inherit>>" # "" - self.virt_file_size = "<<inherit>>" # "" - self.virt_ram = "<<inherit>>" # "" - self.virt_type = "<<inherit>>" # "" - self.virt_path = "<<inherit>>" # "" - self.virt_bridge = "<<inherit>>" # "" - self.comment = "" - self.ctime = 0 - self.mtime = 0 - self.uid = "" - self.random_id = "" - self.power_type = self.settings.power_management_default_type - self.power_address = "" - self.power_user = "" - self.power_pass = "" - self.power_id = "" - self.hostname = "" - self.gateway = "" - self.name_servers = "" - self.bonding = "" - self.bonding_master = "" - self.bonding_opts = "" - self.redhat_management_key = "<<inherit>>" + self.name = None + self.uid = "" + self.owners = self.settings.default_ownership + self.profile = None + self.image = None + self.kernel_options = {} + self.kernel_options_post = {} + self.ks_meta = {} + self.interfaces = {} + self.netboot_enabled = True + self.depth = 2 + self.mgmt_classes = [] + self.template_files = {} + self.kickstart = "<<inherit>>" # use value in profile + self.server = "<<inherit>>" # "" (or settings) + self.virt_path = "<<inherit>>" # "" + self.virt_type = "<<inherit>>" # "" + self.virt_cpus = "<<inherit>>" # "" + self.virt_file_size = "<<inherit>>" # "" + self.virt_ram = "<<inherit>>" # "" + self.virt_type = "<<inherit>>" # "" + self.virt_path = "<<inherit>>" # "" + self.virt_bridge = "<<inherit>>" # "" + self.comment = "" + self.ctime = 0 + self.mtime = 0 + self.uid = "" + self.random_id = "" + self.power_type = self.settings.power_management_default_type + self.power_address = "" + self.power_user = "" + self.power_pass = "" + self.power_id = "" + self.hostname = "" + self.gateway = "" + self.name_servers = [] + self.name_servers_search = [] + self.bonding = "" + self.bonding_master = "" + self.bonding_opts = "" + self.redhat_management_key = "<<inherit>>" + self.redhat_management_server = "<<inherit>>" def delete_interface(self,name): """ - Used to remove an interface. Not valid for the default -interface. + Used to remove an interface. """ - if self.interfaces.has_key(name) and name != "eth0": + if self.interfaces.has_key(name) and len(self.interfaces) > 1: del self.interfaces[name] else: - if name == "eth0": - raise CX(_("Interface %s can never be deleted") % name) - else: + if not self.interfaces.has_key(name): raise CX(_("Cannot delete interface that is not present: %s") % name) + else: + raise CX(_("At least one interface needs to be defined.")) + return True def __get_interface(self,name): - if name is None: - return self.__get_default_interface() if not self.interfaces.has_key(name): self.interfaces[name] = { @@ -115,8 +115,6 @@ interface. return self.interfaces[name] - def __get_default_interface(self): - return self.__get_interface("eth0") def from_datastruct(self,seed_data): @@ -179,7 +177,9 @@ interface. self.hostname = self.load_item(seed_data, 'hostname', __hostname) self.name_servers = self.load_item(seed_data, 'name_servers', '<<inherit>>') + self.name_servers_search = self.load_item(seed_data, 'name_servers_search', '<<inherit>>') self.redhat_management_key = self.load_item(seed_data, 'redhat_management_key', '<<inherit>>') + self.redhat_management_server = self.load_item(seed_data, 'redhat_management_server', '<<inherit>>') # virt specific @@ -290,6 +290,12 @@ interface. self.set_image(self.image) self.set_profile(self.profile) + + # enforce that the system extends from a profile or system but not both + # profile wins as it's the more common usage + self.set_image(self.image) + self.set_profile(self.profile) + return self def get_parent(self): @@ -308,8 +314,6 @@ interface. Set the name. If the name is a MAC or IP, and the first MAC and/or IP is not defined, go ahead and fill that value in. """ - intf = self.__get_default_interface() - if self.name not in ["",None] and self.parent not in ["",None] and self.name == self.parent: raise CX(_("self parentage is weird")) @@ -319,10 +323,15 @@ interface. if not x.isalnum() and not x in [ "_", "-", ".", ":", "+" ] : raise CX(_("invalid characters in name: %s") % x) + # Stuff here defaults to eth0. Yes, it's ugly and hardcoded, but so was + # the default interface behaviour that's now removed. ;) + # --Jasper Capel if utils.is_mac(name): + intf = self.__get_interface("eth0") if intf["mac_address"] == "": intf["mac_address"] = name elif utils.is_ip(name): + intf = self.__get_interface("eth0") if intf["ip_address"] == "": intf["ip_address"] = name self.name = name @@ -332,6 +341,9 @@ interface. def set_redhat_management_key(self,key): return utils.set_redhat_management_key(self,key) + def set_redhat_management_server(self,server): + return utils.set_redhat_management_server(self,server) + def set_server(self,server): """ If a system can't reach the boot server at the value configured in settings @@ -351,7 +363,7 @@ interface. intf = self.__get_interface(interface) if intf["mac_address"] != "": - return intf["mac_address"] + return intf["mac_address"].strip() else: return None @@ -364,7 +376,7 @@ interface. intf = self.__get_interface(interface) if intf["ip_address"] != "": - return intf["ip_address"] + return intf["ip_address"].strip() else: return None @@ -387,12 +399,6 @@ interface. return True return False - def set_default_interface(self,interface): - if self.interfaces.has_key(interface): - self.default_interface = interface - else: - raise CX(_("invalid interface (%s)") % interface) - def set_dhcp_tag(self,dhcp_tag,interface): intf = self.__get_interface(interface) intf["dhcp_tag"] = dhcp_tag @@ -427,7 +433,7 @@ interface. """ intf = self.__get_interface(interface) if address == "" or utils.is_ip(address): - intf["ip_address"] = address + intf["ip_address"] = address.strip() return True raise CX(_("invalid format for IP address (%s)") % address) @@ -445,16 +451,23 @@ interface. return True def set_name_servers(self,data): - data = utils.input_string_or_list(data) + data = utils.input_string_or_list(data, delim=" ") self.name_servers = data return True + def set_name_servers_search(self,data): + data = utils.input_string_or_list(data, delim=" ") + self.name_servers_search = data + return True + def set_subnet(self,subnet,interface): intf = self.__get_interface(interface) intf["subnet"] = subnet return True def set_virt_bridge(self,bridge,interface): + if bridge == "": + bridge = self.settings.default_virt_bridge intf = self.__get_interface(interface) intf["virt_bridge"] = bridge return True @@ -591,7 +604,7 @@ interface. if power_type is None: power_type = "" power_type = power_type.lower() - valid = "bullpap wti apc_snmp ether-wake ipmilan drac ipmitool ilo rsai lpar bladecenter virsh none" + valid = "bullpap wti apc_snmp ether-wake ipmilan drac ipmitool ilo rsa lpar bladecenter virsh integrity none" choices = valid.split(" ") choices.sort() if power_type not in choices: @@ -629,41 +642,43 @@ interface. def to_datastruct(self): return { - 'name' : self.name, - 'uid' : self.uid, - 'random_id' : self.random_id, - 'kernel_options' : self.kernel_options, - 'kernel_options_post' : self.kernel_options_post, - 'depth' : self.depth, - 'interfaces' : self.interfaces, - 'ks_meta' : self.ks_meta, - 'kickstart' : self.kickstart, - 'netboot_enabled' : self.netboot_enabled, - 'owners' : self.owners, - 'parent' : self.parent, - 'profile' : self.profile, - 'image' : self.image, - 'server' : self.server, - 'virt_cpus' : self.virt_cpus, - 'virt_bridge' : self.virt_bridge, - 'virt_file_size' : self.virt_file_size, - 'virt_path' : self.virt_path, - 'virt_ram' : self.virt_ram, - 'virt_type' : self.virt_type, - 'mgmt_classes' : self.mgmt_classes, - 'template_files' : self.template_files, - 'comment' : self.comment, - 'ctime' : self.ctime, - 'mtime' : self.mtime, - 'power_type' : self.power_type, - 'power_address' : self.power_address, - 'power_user' : self.power_user, - 'power_pass' : self.power_pass, - 'power_id' : self.power_id, - 'hostname' : self.hostname, - 'gateway' : self.gateway, - 'name_servers' : self.name_servers, - 'redhat_management_key' : self.redhat_management_key + 'name' : self.name, + 'uid' : self.uid, + 'random_id' : self.random_id, + 'kernel_options' : self.kernel_options, + 'kernel_options_post' : self.kernel_options_post, + 'depth' : self.depth, + 'interfaces' : self.interfaces, + 'ks_meta' : self.ks_meta, + 'kickstart' : self.kickstart, + 'netboot_enabled' : self.netboot_enabled, + 'owners' : self.owners, + 'parent' : self.parent, + 'profile' : self.profile, + 'image' : self.image, + 'server' : self.server, + 'virt_cpus' : self.virt_cpus, + 'virt_bridge' : self.virt_bridge, + 'virt_file_size' : self.virt_file_size, + 'virt_path' : self.virt_path, + 'virt_ram' : self.virt_ram, + 'virt_type' : self.virt_type, + 'mgmt_classes' : self.mgmt_classes, + 'template_files' : self.template_files, + 'comment' : self.comment, + 'ctime' : self.ctime, + 'mtime' : self.mtime, + 'power_type' : self.power_type, + 'power_address' : self.power_address, + 'power_user' : self.power_user, + 'power_pass' : self.power_pass, + 'power_id' : self.power_id, + 'hostname' : self.hostname, + 'gateway' : self.gateway, + 'name_servers' : self.name_servers, + 'name_servers_search' : self.name_servers_search, + 'redhat_management_key' : self.redhat_management_key, + 'redhat_management_server' : self.redhat_management_server } def printable(self): @@ -682,6 +697,7 @@ interface. buf = buf + _("modified : %s\n") % time.ctime(self.mtime) buf = buf + _("name servers : %s\n") % self.name_servers + buf = buf + _("name servers search : %s\n") % self.name_servers_search buf = buf + _("netboot enabled? : %s\n") % self.netboot_enabled buf = buf + _("owners : %s\n") % self.owners buf = buf + _("server : %s\n") % self.server @@ -745,50 +761,52 @@ interface. # compatibility. At some point they may be removed. return { - 'name' : self.set_name, - 'profile' : self.set_profile, - 'image' : self.set_image, - 'kopts' : self.set_kernel_options, - 'kopts-post' : self.set_kernel_options_post, - 'kopts_post' : self.set_kernel_options_post, - 'ksmeta' : self.set_ksmeta, - 'kickstart' : self.set_kickstart, - 'netboot-enabled' : self.set_netboot_enabled, - 'netboot_enabled' : self.set_netboot_enabled, - 'virt-path' : self.set_virt_path, - 'virt_path' : self.set_virt_path, - 'virt-type' : self.set_virt_type, - 'virt_type' : self.set_virt_type, - 'modify-interface' : self.modify_interface, - 'modify_interface' : self.modify_interface, - 'delete-interface' : self.delete_interface, - 'delete_interface' : self.delete_interface, - 'virt-path' : self.set_virt_path, - 'virt_path' : self.set_virt_path, - 'virt-ram' : self.set_virt_ram, - 'virt_ram' : self.set_virt_ram, - 'virt-type' : self.set_virt_type, - 'virt_type' : self.set_virt_type, - 'virt-cpus' : self.set_virt_cpus, - 'virt_cpus' : self.set_virt_cpus, - 'virt-file-size' : self.set_virt_file_size, - 'virt_file_size' : self.set_virt_file_size, - 'server' : self.set_server, - 'owners' : self.set_owners, - 'mgmt-classes' : self.set_mgmt_classes, - 'mgmt_classes' : self.set_mgmt_classes, - 'template-files' : self.set_template_files, - 'template_files' : self.set_template_files, - 'comment' : self.set_comment, - 'power_type' : self.set_power_type, - 'power_address' : self.set_power_address, - 'power_user' : self.set_power_user, - 'power_pass' : self.set_power_pass, - 'power_id' : self.set_power_id, - 'hostname' : self.set_hostname, - 'gateway' : self.set_gateway, - 'name_servers' : self.set_name_servers, - 'redhat_management_key' : self.set_redhat_management_key + 'name' : self.set_name, + 'profile' : self.set_profile, + 'image' : self.set_image, + 'kopts' : self.set_kernel_options, + 'kopts-post' : self.set_kernel_options_post, + 'kopts_post' : self.set_kernel_options_post, + 'ksmeta' : self.set_ksmeta, + 'kickstart' : self.set_kickstart, + 'netboot-enabled' : self.set_netboot_enabled, + 'netboot_enabled' : self.set_netboot_enabled, + 'virt-path' : self.set_virt_path, + 'virt_path' : self.set_virt_path, + 'virt-type' : self.set_virt_type, + 'virt_type' : self.set_virt_type, + 'modify-interface' : self.modify_interface, + 'modify_interface' : self.modify_interface, + 'delete-interface' : self.delete_interface, + 'delete_interface' : self.delete_interface, + 'virt-path' : self.set_virt_path, + 'virt_path' : self.set_virt_path, + 'virt-ram' : self.set_virt_ram, + 'virt_ram' : self.set_virt_ram, + 'virt-type' : self.set_virt_type, + 'virt_type' : self.set_virt_type, + 'virt-cpus' : self.set_virt_cpus, + 'virt_cpus' : self.set_virt_cpus, + 'virt-file-size' : self.set_virt_file_size, + 'virt_file_size' : self.set_virt_file_size, + 'server' : self.set_server, + 'owners' : self.set_owners, + 'mgmt-classes' : self.set_mgmt_classes, + 'mgmt_classes' : self.set_mgmt_classes, + 'template-files' : self.set_template_files, + 'template_files' : self.set_template_files, + 'comment' : self.set_comment, + 'power_type' : self.set_power_type, + 'power_address' : self.set_power_address, + 'power_user' : self.set_power_user, + 'power_pass' : self.set_power_pass, + 'power_id' : self.set_power_id, + 'hostname' : self.set_hostname, + 'gateway' : self.set_gateway, + 'name_servers' : self.set_name_servers, + 'name_servers_search' : self.set_name_servers_search, + 'redhat_management_key' : self.set_redhat_management_key, + 'redhat_management_server' : self.set_redhat_management_server } |