diff --git a/lib/ssconf.py b/lib/ssconf.py index 19368376f6d7c4f303849586eacd91b07ccf69e3..8f24f9dc7c9b7e2b6f3f573309d5764891251c06 100644 --- a/lib/ssconf.py +++ b/lib/ssconf.py @@ -27,14 +27,11 @@ configuration data, which is mostly static and available to all nodes. """ import sys -import os import errno from ganeti import errors from ganeti import constants from ganeti import utils -from ganeti import serializer -from ganeti import objects from ganeti import netutils from ganeti import pathutils @@ -42,224 +39,6 @@ from ganeti import pathutils SSCONF_LOCK_TIMEOUT = 10 -class SimpleConfigReader(object): - """Simple class to read configuration file. - - """ - def __init__(self, file_name=pathutils.CLUSTER_CONF_FILE): - """Initializes this class. - - @type file_name: string - @param file_name: Configuration file path - - """ - self._file_name = file_name - self._last_inode = None - self._last_mtime = None - self._last_size = None - - self._config_data = None - self._inst_ips_by_link = None - self._ip_to_inst_by_link = None - self._instances_ips = None - self._mc_primary_ips = None - self._nodes_primary_ips = None - - # we need a forced reload at class init time, to initialize _last_* - self._Load(force=True) - - def _Load(self, force=False): - """Loads (or reloads) the config file. - - @type force: boolean - @param force: whether to force the reload without checking the mtime - @rtype: boolean - @return: boolean value that says whether we reloaded the configuration or - not (because we decided it was already up-to-date) - - """ - try: - cfg_stat = os.stat(self._file_name) - except EnvironmentError, err: - raise errors.ConfigurationError("Cannot stat config file %s: %s" % - (self._file_name, err)) - inode = cfg_stat.st_ino - mtime = cfg_stat.st_mtime - size = cfg_stat.st_size - - if (force or inode != self._last_inode or - mtime > self._last_mtime or - size != self._last_size): - self._last_inode = inode - self._last_mtime = mtime - self._last_size = size - else: - # Don't reload - return False - - try: - self._config_data = serializer.Load(utils.ReadFile(self._file_name)) - except EnvironmentError, err: - raise errors.ConfigurationError("Cannot read config file %s: %s" % - (self._file_name, err)) - except ValueError, err: - raise errors.ConfigurationError("Cannot load config file %s: %s" % - (self._file_name, err)) - - self._ip_to_inst_by_link = {} - self._instances_ips = [] - self._inst_ips_by_link = {} - c_nparams = self._config_data["cluster"]["nicparams"][constants.PP_DEFAULT] - for iname in self._config_data["instances"]: - instance = self._config_data["instances"][iname] - for nic in instance["nics"]: - if "ip" in nic and nic["ip"]: - params = objects.FillDict(c_nparams, nic["nicparams"]) - if not params["link"] in self._inst_ips_by_link: - self._inst_ips_by_link[params["link"]] = [] - self._ip_to_inst_by_link[params["link"]] = {} - self._ip_to_inst_by_link[params["link"]][nic["ip"]] = iname - self._inst_ips_by_link[params["link"]].append(nic["ip"]) - - self._nodes_primary_ips = [] - self._mc_primary_ips = [] - for node_name in self._config_data["nodes"]: - node = self._config_data["nodes"][node_name] - self._nodes_primary_ips.append(node["primary_ip"]) - if node["master_candidate"]: - self._mc_primary_ips.append(node["primary_ip"]) - - return True - - # Clients can request a reload of the config file, so we export our internal - # _Load function as Reload. - Reload = _Load - - def GetClusterName(self): - return self._config_data["cluster"]["cluster_name"] - - def GetHostKey(self): - return self._config_data["cluster"]["rsahostkeypub"] - - def GetMasterNode(self): - return self._config_data["cluster"]["master_node"] - - def GetMasterIP(self): - return self._config_data["cluster"]["master_ip"] - - def GetMasterNetdev(self): - return self._config_data["cluster"]["master_netdev"] - - def GetMasterNetmask(self): - return self._config_data["cluster"]["master_netmask"] - - def GetFileStorageDir(self): - return self._config_data["cluster"]["file_storage_dir"] - - def GetSharedFileStorageDir(self): - return self._config_data["cluster"]["shared_file_storage_dir"] - - def GetNodeList(self): - return self._config_data["nodes"].keys() - - def GetConfigSerialNo(self): - return self._config_data["serial_no"] - - def GetClusterSerialNo(self): - return self._config_data["cluster"]["serial_no"] - - def GetDefaultNicParams(self): - return self._config_data["cluster"]["nicparams"][constants.PP_DEFAULT] - - def GetDefaultNicLink(self): - return self.GetDefaultNicParams()[constants.NIC_LINK] - - def GetNodeStatusFlags(self, node): - """Get a node's status flags - - @type node: string - @param node: node name - @rtype: (bool, bool, bool) - @return: (master_candidate, drained, offline) (or None if no such node) - - """ - if node not in self._config_data["nodes"]: - return None - - master_candidate = self._config_data["nodes"][node]["master_candidate"] - drained = self._config_data["nodes"][node]["drained"] - offline = self._config_data["nodes"][node]["offline"] - return master_candidate, drained, offline - - def GetInstanceByLinkIp(self, ip, link): - """Get instance name from its link and ip address. - - @type ip: string - @param ip: ip address - @type link: string - @param link: nic link - @rtype: string - @return: instance name - - """ - if not link: - link = self.GetDefaultNicLink() - if not link in self._ip_to_inst_by_link: - return None - if not ip in self._ip_to_inst_by_link[link]: - return None - return self._ip_to_inst_by_link[link][ip] - - def GetNodePrimaryIp(self, node): - """Get a node's primary ip - - @type node: string - @param node: node name - @rtype: string, or None - @return: node's primary ip, or None if no such node - - """ - if node not in self._config_data["nodes"]: - return None - return self._config_data["nodes"][node]["primary_ip"] - - def GetInstancePrimaryNode(self, instance): - """Get an instance's primary node - - @type instance: string - @param instance: instance name - @rtype: string, or None - @return: primary node, or None if no such instance - - """ - if instance not in self._config_data["instances"]: - return None - return self._config_data["instances"][instance]["primary_node"] - - def GetNodesPrimaryIps(self): - return self._nodes_primary_ips - - def GetMasterCandidatesPrimaryIps(self): - return self._mc_primary_ips - - def GetInstancesIps(self, link): - """Get list of nic ips connected to a certain link. - - @type link: string - @param link: nic link - @rtype: list - @return: list of ips connected to that link - - """ - if not link: - link = self.GetDefaultNicLink() - - if link in self._inst_ips_by_link: - return self._inst_ips_by_link[link] - else: - return [] - - class SimpleStore(object): """Interface to static cluster data.