def update(cls, cluster, network_configuration): from nailgun.network.manager import NetworkManager network_manager = NetworkManager() if 'net_manager' in network_configuration: setattr(cluster, 'net_manager', network_configuration['net_manager']) if 'dns_nameservers' in network_configuration: setattr(cluster, 'dns_nameservers', network_configuration['dns_nameservers']['nameservers']) if 'networks' in network_configuration: for ng in network_configuration['networks']: if ng['id'] == network_manager.get_admin_network_group_id(): continue ng_db = db().query(NetworkGroup).get(ng['id']) for key, value in ng.iteritems(): if key == "ip_ranges": cls._set_ip_ranges(ng['id'], value) else: if key == 'cidr' and \ not ng['name'] in ('public', 'floating'): network_manager.update_ranges_from_cidr( ng_db, value) setattr(ng_db, key, value) network_manager.create_networks(ng_db) ng_db.cluster.add_pending_changes('networks')
def verify_data_correctness(cls, node): db_node = db().query(Node).filter_by(id=node['id']).first() if not db_node: raise errors.InvalidData("There is no node with ID '%d' in DB" % node['id'], log_message=True) interfaces = node['interfaces'] db_interfaces = db_node.interfaces if len(interfaces) != len(db_interfaces): raise errors.InvalidData( "Node '%d' has different amount of interfaces" % node['id'], log_message=True) # FIXIT: we should use not all networks but appropriate for this # node only. db_network_groups = db().query(NetworkGroup).filter_by( cluster_id=db_node.cluster_id).all() if not db_network_groups: raise errors.InvalidData("There are no networks related to" " node '%d' in DB" % node['id'], log_message=True) network_group_ids = set([ng.id for ng in db_network_groups]) admin_ng_id = NetworkManager.get_admin_network_group_id() for iface in interfaces: db_iface = filter(lambda i: i.id == iface['id'], db_interfaces) if not db_iface: raise errors.InvalidData("There is no interface with ID '%d'" " for node '%d' in DB" % (iface['id'], node['id']), log_message=True) db_iface = db_iface[0] for net in iface['assigned_networks']: if net['id'] not in network_group_ids and not \ net['id'] == admin_ng_id: raise errors.InvalidData( "Node '%d' shouldn't be connected to" " network with ID '%d'" % (node['id'], net['id']), log_message=True) elif net['id'] != admin_ng_id: network_group_ids.remove(net['id']) # Check if there are unassigned networks for this node. if network_group_ids: raise errors.InvalidData( "Too few networks to assign to node '%d'" % node['id'], log_message=True)
def update(cls, cluster, network_configuration): from nailgun.network.manager import NetworkManager network_manager = NetworkManager() if 'net_manager' in network_configuration: setattr( cluster, 'net_manager', network_configuration['net_manager'] ) if 'dns_nameservers' in network_configuration: setattr( cluster, 'dns_nameservers', network_configuration['dns_nameservers']['nameservers'] ) if 'networks' in network_configuration: for ng in network_configuration['networks']: if ng['id'] == network_manager.get_admin_network_group_id(): continue ng_db = db().query(NetworkGroup).get(ng['id']) for key, value in ng.iteritems(): if key == "ip_ranges": cls._set_ip_ranges(ng['id'], value) else: if key == 'cidr' and \ not ng['name'] in ('public', 'floating'): network_manager.update_range_mask_from_cidr( ng_db, value) setattr(ng_db, key, value) network_manager.create_networks(ng_db) ng_db.cluster.add_pending_changes('networks')
def prepare_syslog_dir(cls, node, prefix=None): logger.debug("Preparing syslog directories for node: %s", node.fqdn) if not prefix: prefix = settings.SYSLOG_DIR logger.debug("prepare_syslog_dir prefix=%s", prefix) old = os.path.join(prefix, str(node.ip)) bak = os.path.join(prefix, "%s.bak" % str(node.fqdn)) new = os.path.join(prefix, str(node.fqdn)) admin_net_id = NetworkManager.get_admin_network_group_id() links = map( lambda i: os.path.join(prefix, i.ip_addr), db().query(IPAddr.ip_addr). filter_by(node=node.id). filter_by(network=admin_net_id).all() ) logger.debug("prepare_syslog_dir old=%s", old) logger.debug("prepare_syslog_dir new=%s", new) logger.debug("prepare_syslog_dir bak=%s", bak) logger.debug("prepare_syslog_dir links=%s", str(links)) # backup directory if it exists if os.path.isdir(new): logger.debug("New %s already exists. Trying to backup", new) if os.path.islink(bak): logger.debug("Bak %s already exists and it is link. " "Trying to unlink", bak) os.unlink(bak) elif os.path.isdir(bak): logger.debug("Bak %s already exists and it is directory. " "Trying to remove", bak) shutil.rmtree(bak) os.rename(new, bak) # rename bootstrap directory into fqdn if os.path.islink(old): logger.debug("Old %s exists and it is link. " "Trying to unlink", old) os.unlink(old) if os.path.isdir(old): logger.debug("Old %s exists and it is directory. " "Trying to rename into %s", old, new) os.rename(old, new) else: logger.debug("Creating %s", new) os.makedirs(new) # creating symlinks for l in links: if os.path.islink(l) or os.path.isfile(l): logger.debug("%s already exists. " "Trying to unlink", l) os.unlink(l) if os.path.isdir(l): logger.debug("%s already exists and it directory. " "Trying to remove", l) shutil.rmtree(l) logger.debug("Creating symlink %s -> %s", l, new) os.symlink(str(node.fqdn), l) os.system("/usr/bin/pkill -HUP rsyslog")
def prepare_syslog_dir(cls, node, prefix=None): logger.debug("Preparing syslog directories for node: %s", node.fqdn) if not prefix: prefix = settings.SYSLOG_DIR logger.debug("prepare_syslog_dir prefix=%s", prefix) old = os.path.join(prefix, str(node.ip)) bak = os.path.join(prefix, "%s.bak" % str(node.fqdn)) new = os.path.join(prefix, str(node.fqdn)) admin_net_id = NetworkManager.get_admin_network_group_id() links = map( lambda i: os.path.join(prefix, i.ip_addr), db().query(IPAddr.ip_addr). filter_by(node=node.id). filter_by(network=admin_net_id).all() ) logger.debug("prepare_syslog_dir old=%s", old) logger.debug("prepare_syslog_dir new=%s", new) logger.debug("prepare_syslog_dir bak=%s", bak) logger.debug("prepare_syslog_dir links=%s", str(links)) # backup directory if it exists if os.path.isdir(new): logger.debug("New %s already exists. Trying to backup", new) if os.path.islink(bak): logger.debug("Bak %s already exists and it is link. " "Trying to unlink", bak) os.unlink(bak) elif os.path.isdir(bak): logger.debug("Bak %s already exists and it is directory. " "Trying to remove", bak) shutil.rmtree(bak) os.rename(new, bak) # rename bootstrap directory into fqdn if os.path.islink(old): logger.debug("Old %s exists and it is link. " "Trying to unlink", old) os.unlink(old) if os.path.isdir(old): logger.debug("Old %s exists and it is directory. " "Trying to rename into %s", old, new) os.rename(old, new) else: logger.debug("Creating %s", new) os.makedirs(new) # creating symlinks for l in links: if os.path.islink(l) or os.path.isfile(l): logger.debug("%s already exists. " "Trying to unlink", l) os.unlink(l) if os.path.isdir(l): logger.debug("%s already exists and it directory. " "Trying to remove", l) shutil.rmtree(l) logger.debug("Creating symlink %s -> %s", l, new) os.symlink(str(node.fqdn), l) os.system("/usr/bin/pkill -HUP rsyslog")
def verify_data_correctness(cls, node): db_node = db().query(Node).filter_by(id=node['id']).first() if not db_node: raise errors.InvalidData( "There is no node with ID '%d' in DB" % node['id'], log_message=True ) interfaces = node['interfaces'] db_interfaces = db_node.interfaces if len(interfaces) != len(db_interfaces): raise errors.InvalidData( "Node '%d' has different amount of interfaces" % node['id'], log_message=True ) # FIXIT: we should use not all networks but appropriate for this # node only. db_network_groups = db().query(NetworkGroup).filter_by( cluster_id=db_node.cluster_id ).all() if not db_network_groups: raise errors.InvalidData( "There are no networks related to" " node '%d' in DB" % node['id'], log_message=True ) network_group_ids = set([ng.id for ng in db_network_groups]) admin_ng_id = NetworkManager.get_admin_network_group_id() for iface in interfaces: db_iface = filter( lambda i: i.id == iface['id'], db_interfaces ) if not db_iface: raise errors.InvalidData( "There is no interface with ID '%d'" " for node '%d' in DB" % (iface['id'], node['id']), log_message=True ) db_iface = db_iface[0] for net in iface['assigned_networks']: if net['id'] not in network_group_ids and not \ net['id'] == admin_ng_id: raise errors.InvalidData( "Node '%d' shouldn't be connected to" " network with ID '%d'" % (node['id'], net['id']), log_message=True ) elif net['id'] != admin_ng_id: network_group_ids.remove(net['id']) # Check if there are unassigned networks for this node. if network_group_ids: raise errors.InvalidData( "Too few networks to assign to node '%d'" % node['id'], log_message=True )