X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=snaps%2Fopenstack%2Fcreate_instance.py;h=252f2feb9d8dcdee28cd7efdf240984ae6a0eba4;hb=b003647b70545008405294c4268e62fa87c18574;hp=b034c5f9eabf92f238df7996d33308b0b9e56f02;hpb=34623d35ba81b5d8290b87e469af784be746f78f;p=snaps.git diff --git a/snaps/openstack/create_instance.py b/snaps/openstack/create_instance.py index b034c5f..252f2fe 100644 --- a/snaps/openstack/create_instance.py +++ b/snaps/openstack/create_instance.py @@ -57,9 +57,6 @@ class OpenStackVmInstance: self.image_settings = image_settings self.keypair_settings = keypair_settings - # TODO - get rid of FIP list and only use the dict(). Need to fix - # populating this object when already exists - self.__floating_ips = list() self.__floating_ip_dict = dict() # Instantiated in self.create() @@ -102,13 +99,14 @@ class OpenStackVmInstance: logger.info( 'Found existing machine with name - %s', self.instance_settings.name) - fips = neutron_utils.get_floating_ips(self.__neutron) - for fip in fips: - for subnet_name, ips in server.networks.items(): - if fip.ip in ips: - self.__floating_ips.append(fip) - # TODO - Determine a means to associate to the FIP - # configuration and add to FIP map + + fips = neutron_utils.get_floating_ips(self.__neutron, + self.__ports) + for port_name, fip in fips: + settings = self.instance_settings.floating_ip_settings + for fip_setting in settings: + if port_name == fip_setting.port_name: + self.__floating_ip_dict[fip_setting.name] = fip def __create_vm(self, block=False): """ @@ -126,7 +124,7 @@ class OpenStackVmInstance: if block: if not self.vm_active(block=True): - raise Exception( + raise VmInstanceCreationError( 'Fatal error, VM did not become ACTIVE within the alloted ' 'time') @@ -136,7 +134,7 @@ class OpenStackVmInstance: nova_utils.add_security_group(self.__nova, self.__vm, sec_grp_name) else: - raise Exception( + raise VmInstanceCreationError( 'Cannot applying security group with name ' + sec_grp_name + ' to VM that did not activate with name - ' + @@ -157,7 +155,7 @@ class OpenStackVmInstance: port = port_dict.get(floating_ip_setting.port_name) if not port: - raise Exception( + raise VmInstanceCreationError( 'Cannot find port object with name - ' + floating_ip_setting.port_name) @@ -170,7 +168,6 @@ class OpenStackVmInstance: self.__neutron, floating_ip_setting.subnet_name) floating_ip = neutron_utils.create_floating_ip( self.__neutron, ext_gateway) - self.__floating_ips.append(floating_ip) self.__floating_ip_dict[floating_ip_setting.name] = floating_ip logger.info( @@ -178,9 +175,9 @@ class OpenStackVmInstance: floating_ip_setting.router_name) self.__add_floating_ip(floating_ip, port, subnet) else: - raise Exception('Unable to add floating IP to port,' - ' cannot locate router with an external ' - 'gateway ') + raise VmInstanceCreationError( + 'Unable to add floating IP to port, cannot locate router ' + 'with an external gateway ') def __ext_gateway_by_router(self, router_name): """ @@ -204,13 +201,12 @@ class OpenStackVmInstance: """ # Cleanup floating IPs - for floating_ip in self.__floating_ips: + for name, floating_ip in self.__floating_ip_dict.items(): try: logger.info('Deleting Floating IP - ' + floating_ip.ip) neutron_utils.delete_floating_ip(self.__neutron, floating_ip) except Exception as e: logger.error('Error deleting Floating IP - ' + str(e)) - self.__floating_ips = list() self.__floating_ip_dict = dict() # Cleanup ports @@ -266,7 +262,7 @@ class OpenStackVmInstance: port = neutron_utils.get_port_by_name(self.__neutron, port_setting.name) if port: - ports.append((port_setting.name, {'port': port})) + ports.append((port_setting.name, port)) elif not cleanup: # Exception will be raised when port with same name already # exists @@ -287,8 +283,8 @@ class OpenStackVmInstance: if subnet: # Take IP of subnet if there is one configured on which to place # the floating IP - for fixed_ip in port.fixed_ips: - if fixed_ip['subnet_id'] == subnet['subnet']['id']: + for fixed_ip in port.ips: + if fixed_ip['subnet_id'] == subnet.id: ip = fixed_ip['ip_address'] break else: @@ -314,11 +310,12 @@ class OpenStackVmInstance: count -= 1 pass else: - raise Exception( + raise VmInstanceCreationError( 'Unable find IP address on which to place the floating IP') logger.error('Timeout attempting to add the floating IP to instance.') - raise Exception('Timeout while attempting add floating IP to instance') + raise VmInstanceCreationError( + 'Timeout while attempting add floating IP to instance') def get_os_creds(self): """ @@ -334,12 +331,12 @@ class OpenStackVmInstance: """ return self.__vm - def get_os_vm_server_obj(self): + def get_console_output(self): """ - Returns the OpenStack server object - :return: the server object + Returns the vm console object for parsing logs + :return: the console output object """ - return nova_utils.get_latest_server_os_object(self.__nova, self.__vm) + return nova_utils.get_server_console_output(self.__nova, self.__vm) def get_port_ip(self, port_name, subnet_name=None): """ @@ -394,13 +391,20 @@ class OpenStackVmInstance: logger.warning('Cannot find port with name - ' + port_name) return None + def get_vm_info(self): + """ + Returns a dictionary of a VMs info as returned by OpenStack + :return: a dict() + """ + return nova_utils.get_server_info(self.__nova, self.__vm) + def config_nics(self): """ Responsible for configuring NICs on RPM systems where the instance has more than one configured port :return: the value returned by ansible_utils.apply_ansible_playbook() """ - if len(self.__ports) > 1 and len(self.__floating_ips) > 0: + if len(self.__ports) > 1 and len(self.__floating_ip_dict) > 0: if self.vm_active(block=True) and self.vm_ssh_active(block=True): for key, port in self.__ports: port_index = self.__ports.index((key, port)) @@ -424,8 +428,9 @@ class OpenStackVmInstance: fip = self.__floating_ip_dict.get(floating_ip_setting.name) if fip: return fip - elif len(self.__floating_ips) > 0: - return self.__floating_ips[0] + elif len(self.__floating_ip_dict) > 0: + for key, fip in self.__floating_ip_dict.items(): + return fip def __config_nic(self, nic_name, port, ip): """ @@ -555,18 +560,18 @@ class OpenStackVmInstance: if not self.__vm: return False - instance = nova_utils.get_latest_server_os_object( - self.__nova, self.__vm) - if not instance: + status = nova_utils.get_server_status(self.__nova, self.__vm) + if not status: logger.warning('Cannot find instance with id - ' + self.__vm.id) return False - if instance.status == 'ERROR': - raise Exception('Instance had an error during deployment') + if status == 'ERROR': + raise VmInstanceCreationError( + 'Instance had an error during deployment') logger.debug( 'Instance status [%s] is - %s', self.instance_settings.name, - instance.status) - return instance.status == expected_status_code + status) + return status == expected_status_code def vm_ssh_active(self, block=False, poll_interval=POLL_INTERVAL): """ @@ -607,9 +612,10 @@ class OpenStackVmInstance: Returns True when can create a SSH session else False :return: T/F """ - if len(self.__floating_ips) > 0: + if len(self.__floating_ip_dict) > 0: ssh = self.ssh_client() if ssh: + ssh.close() return True return False @@ -623,9 +629,8 @@ class OpenStackVmInstance: fip = None if fip_name and self.__floating_ip_dict.get(fip_name): return self.__floating_ip_dict.get(fip_name) - if not fip and len(self.__floating_ips) > 0: - return self.__floating_ips[0] - return None + if not fip: + return self.__get_first_provisioning_floating_ip() def ssh_client(self, fip_name=None): """ @@ -637,7 +642,8 @@ class OpenStackVmInstance: fip = self.get_floating_ip(fip_name) if fip: return ansible_utils.ssh_client( - self.__floating_ips[0].ip, self.get_image_user(), + self.__get_first_provisioning_floating_ip().ip, + self.get_image_user(), self.keypair_settings.private_filepath, proxy_settings=self.__os_creds.proxy_settings) else: @@ -737,7 +743,7 @@ class VmInstanceSettings: elif isinstance(kwargs['security_group_names'], str): self.security_group_names = [kwargs['security_group_names']] else: - raise Exception( + raise VmInstanceSettingsError( 'Invalid data type for security_group_names attribute') else: self.security_group_names = set() @@ -775,11 +781,11 @@ class VmInstanceSettings: self.availability_zone = None if not self.name or not self.flavor: - raise Exception( + raise VmInstanceSettingsError( 'Instance configuration requires the attributes: name, flavor') if len(self.port_settings) == 0: - raise Exception( + raise VmInstanceSettingsError( 'Instance configuration requires port settings (aka. NICS)') @@ -816,6 +822,24 @@ class FloatingIpSettings: self.provisioning = True if not self.name or not self.port_name or not self.router_name: - raise Exception( + raise FloatingIpSettingsError( 'The attributes name, port_name and router_name are required ' 'for FloatingIPSettings') + + +class VmInstanceSettingsError(Exception): + """ + Exception to be thrown when an VM instance settings are incorrect + """ + + +class FloatingIpSettingsError(Exception): + """ + Exception to be thrown when an VM instance settings are incorrect + """ + + +class VmInstanceCreationError(Exception): + """ + Exception to be thrown when an VM instance cannot be created + """