def _launch_kadeploy(self, max_tries=10, check_deploy=True): """Create an execo_g5k.Deployment object, launch the deployment and return a tuple (deployed_hosts, undeployed_hosts) """ # if the provisioner has oar_job_ids and no config_file_path # then the configs variable is not created if not hasattr(self, 'configs'): logger.info('The list of %s hosts: \n%s', len(self.hosts), hosts_list(self.hosts, separator='\n')) return logger.info('Deploying %s hosts \n%s', len(self.hosts), hosts_list(self.hosts, separator='\n')) try: deployment = Deployment( hosts=[Host(canonical_host_name(host)) for host in self.hosts], env_file=self.configs['custom_image'], env_name=self.configs['cloud_provider_image']) except ValueError: logger.error( "Please put in the config file either custom_image or cloud_provider_image." ) exit() # user=self.env_user, # vlan=self.kavlan) # Activate kadeploy output log if log level is debug if logger.getEffectiveLevel() <= 10: stdout = [sys.stdout] stderr = [sys.stderr] else: stdout = None stderr = None # deploy() function will iterate through each frontend to run kadeploy # so that the deployment hosts will be performed sequentially site after site deployed_hosts, undeployed_hosts = deploy( deployment, stdout_handlers=stdout, stderr_handlers=stderr, num_tries=max_tries, check_deployed_command=check_deploy) deployed_hosts = list(deployed_hosts) undeployed_hosts = list(undeployed_hosts) # # Renaming hosts if a kavlan is used # if self.kavlan: # for i, host in enumerate(deployed_hosts): # deployed_hosts[i] = get_kavlan_host_name(host, self.kavlan) # for i, host in enumerate(undeployed_hosts): # undeployed_hosts[i] = get_kavlan_host_name(host, self.kavlan) logger.info('Deployed %s hosts successfully', len(deployed_hosts)) cr = '\n' if len(undeployed_hosts) > 0 else '' logger.info('Failed %s hosts %s%s', len(undeployed_hosts), cr, hosts_list(undeployed_hosts)) return deployed_hosts, undeployed_hosts
def _enable_bridge(self, name='br0'): """We need a bridge to have automatic DHCP configuration for the VM.""" logger.detail('Configuring the bridge') hosts_br = self._get_bridge(self.hosts) nobr_hosts = [] for host, br in hosts_br.iteritems(): if br is None: logger.debug('No bridge on host %s', style.host(host)) nobr_hosts.append(host) elif br != name: logger.debug('Wrong bridge on host %s, destroying it', style.host(host)) SshProcess('ip link set ' + br + ' down ; brctl delbr ' + br, host).run() nobr_hosts.append(host) else: logger.debug('Bridge %s is present on host %s', style.emph('name'), style.host(host)) nobr_hosts = map(lambda x: x.address if isinstance(x, Host) else x, nobr_hosts) if len(nobr_hosts) > 0: logger.debug('Creating bridge on %s', hosts_list(nobr_hosts)) script = 'export br_if=`ip route |grep default |cut -f 5 -d " "`; \n' + \ 'ifdown $br_if ; \n' + \ 'sed -i "s/$br_if inet dhcp/$br_if inet manual/g" /etc/network/interfaces ; \n' + \ 'sed -i "s/auto $br_if//g" /etc/network/interfaces ; \n' + \ 'echo " " >> /etc/network/interfaces ; \n' + \ 'echo "auto ' + name + '" >> /etc/network/interfaces ; \n' + \ 'echo "iface ' + name + ' inet dhcp" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_ports $br_if" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_stp off" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_maxwait 0" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_fd 0" >> /etc/network/interfaces ; \n' + \ 'ifup ' + name fd, br_script = mkstemp(dir='/tmp/', prefix='create_br_') f = fdopen(fd, 'w') f.write(script) f.close() self.fact.get_fileput(nobr_hosts, [br_script]).run() self.fact.get_remote('nohup sh ' + br_script.split('/')[-1], nobr_hosts).run() logger.debug('Waiting for network restart') if_up = False nmap_tries = 0 while (not if_up) and nmap_tries < 20: sleep(20) nmap_tries += 1 nmap = Process('nmap ' + ' '.join([host for host in nobr_hosts]) + ' -p 22').run() for line in nmap.stdout.split('\n'): if 'Nmap done' in line: if_up = line.split()[2] == line.split()[5].replace( '(', '') logger.debug('Network has been restarted') logger.detail('All hosts have the bridge %s', style.emph(name))
def _enable_bridge(self, name='br0'): """We need a bridge to have automatic DHCP configuration for the VM.""" logger.detail('Configuring the bridge') hosts_br = self._get_bridge(self.hosts) nobr_hosts = [] for host, br in hosts_br.iteritems(): if br is None: logger.debug('No bridge on host %s', style.host(host)) nobr_hosts.append(host) elif br != name: logger.debug('Wrong bridge on host %s, destroying it', style.host(host)) SshProcess('ip link set ' + br + ' down ; brctl delbr ' + br, host).run() nobr_hosts.append(host) else: logger.debug('Bridge %s is present on host %s', style.emph('name'), style.host(host)) nobr_hosts = map(lambda x: x.address if isinstance(x, Host) else x, nobr_hosts) if len(nobr_hosts) > 0: logger.debug('Creating bridge on %s', hosts_list(nobr_hosts)) script = 'export br_if=`ip route |grep default |cut -f 5 -d " "`; \n' + \ 'ifdown $br_if ; \n' + \ 'sed -i "s/$br_if inet dhcp/$br_if inet manual/g" /etc/network/interfaces ; \n' + \ 'sed -i "s/auto $br_if//g" /etc/network/interfaces ; \n' + \ 'echo " " >> /etc/network/interfaces ; \n' + \ 'echo "auto ' + name + '" >> /etc/network/interfaces ; \n' + \ 'echo "iface ' + name + ' inet dhcp" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_ports $br_if" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_stp off" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_maxwait 0" >> /etc/network/interfaces ; \n' + \ 'echo " bridge_fd 0" >> /etc/network/interfaces ; \n' + \ 'ifup ' + name fd, br_script = mkstemp(dir='/tmp/', prefix='create_br_') f = fdopen(fd, 'w') f.write(script) f.close() self.fact.get_fileput(nobr_hosts, [br_script]).run() self.fact.get_remote('nohup sh ' + br_script.split('/')[-1], nobr_hosts).run() logger.debug('Waiting for network restart') if_up = False nmap_tries = 0 while (not if_up) and nmap_tries < 20: sleep(20) nmap_tries += 1 nmap = Process('nmap ' + ' '.join([host for host in nobr_hosts]) + ' -p 22').run() for line in nmap.stdout.split('\n'): if 'Nmap done' in line: if_up = line.split()[2] == line.split()[5].replace('(', '') logger.debug('Network has been restarted') logger.detail('All hosts have the bridge %s', style.emph(name))
def _launch_kadeploy(self, max_tries=1, check_deploy=True): """Create a execo_g5k.Deployment object, launch the deployment and return a tuple (deployed_hosts, undeployed_hosts) """ logger.info('Deploying %s hosts \n%s', len(self.hosts), hosts_list(self.hosts)) deployment = Deployment( hosts=[Host(canonical_host_name(host)) for host in self.hosts], env_file=self.env_file, env_name=self.env_name, user=self.env_user, vlan=self.kavlan) # Activate kadeploy output log if log level is debug if logger.getEffectiveLevel() <= 10: stdout = [sys.stdout] stderr = [sys.stderr] else: stdout = None stderr = None deployed_hosts, undeployed_hosts = deploy( deployment, stdout_handlers=stdout, stderr_handlers=stderr, num_tries=max_tries, check_deployed_command=check_deploy) deployed_hosts = list(deployed_hosts) undeployed_hosts = list(undeployed_hosts) # Renaming hosts if a kavlan is used if self.kavlan: for i, host in enumerate(deployed_hosts): deployed_hosts[i] = get_kavlan_host_name(host, self.kavlan) for i, host in enumerate(undeployed_hosts): undeployed_hosts[i] = get_kavlan_host_name(host, self.kavlan) logger.info('Deployed %s hosts \n%s', len(deployed_hosts), hosts_list(deployed_hosts)) cr = '\n' if len(undeployed_hosts) > 0 else '' logger.info('Failed %s hosts %s%s', len(undeployed_hosts), cr, hosts_list(undeployed_hosts)) self._update_hosts_state(deployed_hosts, undeployed_hosts) return deployed_hosts, undeployed_hosts
def _launch_kadeploy(self, max_tries=1, check_deploy=True): """Create a execo_g5k.Deployment object, launch the deployment and return a tuple (deployed_hosts, undeployed_hosts) """ logger.info('Deploying %s hosts \n%s', len(self.hosts), hosts_list(self.hosts)) deployment = Deployment(hosts=[Host(canonical_host_name(host)) for host in self.hosts], env_file=self.env_file, env_name=self.env_name, user=self.env_user, vlan=self.kavlan) # Activate kadeploy output log if log level is debug if logger.getEffectiveLevel() <= 10: stdout = [sys.stdout] stderr = [sys.stderr] else: stdout = None stderr = None deployed_hosts, undeployed_hosts = deploy(deployment, stdout_handlers=stdout, stderr_handlers=stderr, num_tries=max_tries, check_deployed_command=check_deploy) deployed_hosts = list(deployed_hosts) undeployed_hosts = list(undeployed_hosts) # Renaming hosts if a kavlan is used if self.kavlan: for i, host in enumerate(deployed_hosts): deployed_hosts[i] = get_kavlan_host_name(host, self.kavlan) for i, host in enumerate(undeployed_hosts): undeployed_hosts[i] = get_kavlan_host_name(host, self.kavlan) logger.info('Deployed %s hosts \n%s', len(deployed_hosts), hosts_list(deployed_hosts)) cr = '\n' if len(undeployed_hosts) > 0 else '' logger.info('Failed %s hosts %s%s', len(undeployed_hosts), cr, hosts_list(undeployed_hosts)) self._update_hosts_state(deployed_hosts, undeployed_hosts) return deployed_hosts, undeployed_hosts
def get_CPU_RAM_FLOPS(hosts): """Return the number of CPU and amount RAM for a host list """ hosts_attr = {'TOTAL': {'CPU': 0, 'RAM': 0}} cluster_attr = {} for host in hosts: if isinstance(host, Host): host = host.address cluster = get_host_cluster(host) if cluster not in cluster_attr: attr = get_host_attributes(host) cluster_attr[cluster] = { 'CPU': attr['architecture']['nb_cores'], 'RAM': int(attr['main_memory']['ram_size'] / 10 ** 6), 'flops': attr['performance']['node_flops']} hosts_attr[host] = cluster_attr[cluster] hosts_attr['TOTAL']['CPU'] += attr['architecture']['nb_cores'] hosts_attr['TOTAL']['RAM'] += int(attr['main_memory']['ram_size'] \ / 10 ** 6) logger.debug(hosts_list(hosts_attr)) return hosts_attr
def get_CPU_RAM_FLOPS(hosts): """Return the number of CPU and amount RAM for a host list """ hosts_attr = {'TOTAL': {'CPU': 0, 'RAM': 0}} cluster_attr = {} for host in hosts: if isinstance(host, Host): host = host.address cluster = get_host_cluster(host) if cluster not in cluster_attr: attr = get_host_attributes(host) cluster_attr[cluster] = { 'CPU': attr['architecture']['smt_size'], 'RAM': int(attr['main_memory']['ram_size'] / 10 ** 6), 'flops': attr['performance']['node_flops']} hosts_attr[host] = cluster_attr[cluster] hosts_attr['TOTAL']['CPU'] += attr['architecture']['smt_size'] hosts_attr['TOTAL']['RAM'] += int(attr['main_memory']['ram_size'] \ / 10 ** 6) logger.debug(hosts_list(hosts_attr)) return hosts_attr
def _update_hosts_state(self, hosts_ok, hosts_ko): """ """ for host in hosts_ok: if host: if isinstance(host, Host): host = host.address self.state.find(".//host/[@id='" + host + "']").set('state', 'OK') for host in hosts_ko: if host: if isinstance(host, Host): host = host.address self.state.find(".//host/[@id='" + host + "']").set('state', 'KO') self.hosts.remove(host) if len(self.hosts) == 0: logger.error('No hosts available, because %s are KO', hosts_list(hosts_ko)) exit() if self.vms: distribute_vms(self.vms, self.hosts, self.distribution) self._set_vms_ip_mac()
def _update_hosts_state(self, hosts_ok, hosts_ko): """ """ for host in hosts_ok: if host: if isinstance(host, Host): host = host.address self.state.find(".//host/[@id='" + host + "']").set( 'state', 'OK') for host in hosts_ko: if host: if isinstance(host, Host): host = host.address self.state.find(".//host/[@id='" + host + "']").set( 'state', 'KO') self.hosts.remove(host) if len(self.hosts) == 0: logger.error('No hosts available, because %s are KO', hosts_list(hosts_ko)) exit() if self.vms: distribute_vms(self.vms, self.hosts, self.distribution) self._set_vms_ip_mac()
from execo_g5k.utils import hosts_list from networkx.algorithms.shortest_paths.generic import shortest_path from execo_g5k.api_utils import get_host_shortname from random import uniform jobs = [(1696863, 'grenoble'), (1502558, 'lille'), (74715, 'luxembourg')] logger.info( 'Retrieving hosts used for jobs %s', ', '.join([ style.host(site) + ':' + style.emph(job_id) for job_id, site in jobs ])) hosts = [ get_host_shortname(h) for job_id, site in jobs for h in get_oar_job_nodes(job_id, site) ] logger.info(hosts_list(hosts)) logger.info('Creating topological graph') g = g5k_graph(elements=hosts) i, j = int(uniform(1, len(hosts))), int(uniform(1, len(hosts))) path = shortest_path(g, hosts[i], hosts[j]) logger.info( 'Communication between %s and %s go through ' 'the following links: \n%s', style.host(hosts[i]), style.host(hosts[j]), ' -> '.join(path)) logger.info('Active links between nodes %s and %s are: \n%s', style.host(path[0]), style.host(path[1]), {k: v for k, v in g.edge[path[0]][path[1]].items() if v['active']})
from execo_g5k.topology import g5k_graph, treemap from execo.log import logger, style from execo_g5k.oar import get_oar_job_nodes from execo_g5k.utils import hosts_list from networkx.algorithms.shortest_paths.generic import shortest_path from execo_g5k.api_utils import get_host_shortname from random import uniform jobs = [(1696863, 'grenoble'), (1502558, 'lille'), (74715, 'luxembourg')] logger.info('Retrieving hosts used for jobs %s', ', '.join([style.host(site) + ':' + style.emph(job_id) for job_id, site in jobs])) hosts = [get_host_shortname(h) for job_id, site in jobs for h in get_oar_job_nodes(job_id, site)] logger.info(hosts_list(hosts)) logger.info('Creating topological graph') g = g5k_graph(elements=hosts) i, j = int(uniform(1, len(hosts))), int(uniform(1, len(hosts))) path = shortest_path(g, hosts[i], hosts[j]) logger.info('Communication between %s and %s go through ' 'the following links: \n%s', style.host(hosts[i]), style.host(hosts[j]), ' -> '.join(path)) logger.info('Active links between nodes %s and %s are: \n%s', style.host(path[0]), style.host(path[1]),