from ganeti import objects
-def _my_uuidgen():
- """Poor-man's uuidgen using the uuidgen binary.
-
- """
- result = utils.RunCmd(["uuidgen", "-r"])
- if result.failed:
- return None
- return result.stdout.rstrip('\n')
-
-
-try:
- import uuid
- _uuidgen = uuid.uuid4
-except ImportError:
- _uuidgen = _my_uuidgen
-
-
class ConfigWriter:
"""The interface to the cluster configuration.
"""
def __init__(self, cfg_file=None, offline=False):
+ self.write_count = 0
self._config_data = None
self._config_time = None
self._config_size = None
raise errors.ConfigurationError("Can't generate unique MAC")
return mac
+ def IsMacInUse(self, mac):
+ """Predicate: check if the specified MAC is in use in the Ganeti cluster.
+
+ This only checks instances managed by this cluster, it does not
+ check for potential collisions elsewhere.
+
+ """
+ self._OpenConfig()
+ self._ReleaseLock()
+ all_macs = self._AllMACs()
+ return mac in all_macs
+
def _ComputeAllLVs(self):
"""Compute the list of all LVs.
existing.update(exceptions)
retries = 64
while retries > 0:
- unique_id = _uuidgen()
+ unique_id = utils.NewUUID()
if unique_id not in existing and unique_id is not None:
break
else:
for instance_name in data.instances:
instance = data.instances[instance_name]
if instance.primary_node not in data.nodes:
- result.append("Instance '%s' has invalid primary node '%s'" %
+ result.append("instance '%s' has invalid primary node '%s'" %
(instance_name, instance.primary_node))
for snode in instance.secondary_nodes:
if snode not in data.nodes:
- result.append("Instance '%s' has invalid secondary node '%s'" %
+ result.append("instance '%s' has invalid secondary node '%s'" %
(instance_name, snode))
for idx, nic in enumerate(instance.nics):
if nic.mac in seen_macs:
- result.append("Instance '%s' has NIC %d mac %s duplicate" %
+ result.append("instance '%s' has NIC %d mac %s duplicate" %
(instance_name, idx, nic.mac))
else:
seen_macs.append(nic.mac)
if disk.logical_id is None and disk.physical_id is not None:
return
- if disk.dev_type == "drbd":
+ if disk.dev_type in constants.LDS_DRBD:
pnode, snode, port = disk.logical_id
if node_name not in (pnode, snode):
raise errors.ConfigurationError("DRBD device not knowing node %s" %
f.close()
# we don't need to do os.close(fd) as f.close() did it
os.rename(name, destination)
+ self.write_count += 1
# re-set our cache as not to re-read the config file
try:
st = os.stat(destination)