def get_address_of_node(self, server_name=None, server=None): if not (server_name or server): raise Exception('Either server_name or server needs to be given') if server_name: try: for server in self.novacl.servers.list(): if server.name == server_name: return server.addresses['ctlplane'][0]['addr'] except Exception as ex: LOG.error('Unsupported installer platform.') raise ex if server: return server.addresses['ctlplane'][0]['addr']
def get_node_name_by_ilo_address(self, ilo_address): try: node_name = None for node in self.ironiccl.node.list(): nova_uuid = node.instance_uuid if ilo_address == self.ironiccl.node.get_by_instance_uuid( nova_uuid).driver_info['ilo_address']: node_name = self.novacl.servers.find(id=nova_uuid).name break if not node_name: raise Exception('Cannot get nova instance for ilo address %s' % ilo_address) return node_name except Exception as ex: LOG.error('Unsupported installer platform.') raise ex
def run(self, sys_args, config): self.env = str(sys_args.env_number).replace('"', '') self.BUILD_DIR = '../build/apex-%s' % self.env self.cleanup() if sys_args.cleanup: return if not sys_args.cloner_info or not sys_args.snapshot_disks\ or not sys_args.vjump_hosts: LOG.error('--cloner-info, --snapshot-disks and --vjump-hosts ' ' have to be given if not only --cleanup.') exit(1) node_info = utils_yaml.read_dict_from_yaml(sys_args.cloner_info + '/node.yaml') nodes = node_info['servers'] number_of_nodes = len(nodes) disk_home = self.BUILD_DIR + '/disks/' shutil.mkdir_if_not_exsist(disk_home) # Create Snapshots for i in range(number_of_nodes): disk_name = '%s%s.qcow2' % (self.NODE_NAME, i) self.create_snapshot( '%s/%s' % (sys_args.snapshot_disks, disk_name), '%s/%s' % (disk_home, disk_name)) # Create Bridges if not existing for net in self.BRIGES: bridge_name = '%s-%s' % (net, self.env) if not self.check_if_br_exists(bridge_name): LOG.info('Creating bridge %s' % bridge_name) execute('ovs-vsctl add-br %s' % bridge_name, as_root=True) # Create virtual Nodes dom_template = self.TEMPLATES + '/nodes/baremetalX.xml' dom_config = self.BUILD_DIR + '/nodes/baremetalX.xml' shutil.mkdir_if_not_exsist(self.BUILD_DIR + '/nodes/') LOG.info('Creating virtual Nodes') for name, node in nodes.iteritems(): orig_node_name = node['vNode-name'] node_name = orig_node_name + '-' + self.env LOG.info('Create node %s' % node_name) type = node['type'] if type == 'compute': cpu = 4 mem = 4 elif type == 'controller': cpu = 8 mem = 10 else: raise Exception('Unknown node type! %s' % type) shutil.copy('to', dom_template, dom_config) shutil.replace_string_in_file(dom_config, 'NaMe', node_name) disk_full_path = os.path.abspath('%s/%s.qcow2' % (disk_home, orig_node_name)) shutil.replace_string_in_file(dom_config, 'DiSk', disk_full_path) shutil.replace_string_in_file(dom_config, 'vCpU', str(cpu)) shutil.replace_string_in_file(dom_config, 'MeMoRy', str(mem)) shutil.replace_string_in_file(dom_config, 'InDeX', self.env) execute('virsh define ' + dom_config) execute('virsh start ' + node_name) cores_per_environment = 8 cores = '%s-%s' % (int(self.env) * 8, int(self.env) * 8 + cores_per_environment - 1) LOG.info('Pining vCPU of node %s to cores %s' % (node_name, cores)) for i in range(cpu): execute('virsh vcpupin %(node)s %(nodes_cpu)s %(host_cpu)s' % { 'node': node_name, 'nodes_cpu': i, 'host_cpu': cores }) # Upload cloner_info to jenkins slave node_name = 'jenkins%s' % self.env jenkins_node_config = utils_yaml.read_dict_from_yaml( sys_args.vjump_hosts)['servers'] if node_name not in jenkins_node_config: raise Exception('Jenkins host %s not provided in %s' % (node_name, sys_args.vjump_hosts)) jenkins_slave = NodeManager(jenkins_node_config).get_node(node_name) if 'CLONER_INFO' in os.environ: cloner_info_path = os.environ['CLONER_INFO'] else: cloner_info_path = '/home/jenkins/cloner-info/' jenkins_slave.copy('to', sys_args.cloner_info, cloner_info_path)