X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=RO-VIM-openstack%2Fosm_rovim_openstack%2Fvimconn_openstack.py;h=00558dc686b9b8a1d4ea3856cf83d98145babab9;hb=ae04e5e8139ac83d30ff04942c37386d92440be9;hp=b18cf783fd9de5d50968d748e193e6eacf53dd71;hpb=4bc8eb99dbadadf5013de93fcb424038149e1576;p=osm%2FRO.git diff --git a/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py b/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py index b18cf783..00558dc6 100644 --- a/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py +++ b/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py @@ -754,7 +754,7 @@ class vimconnector(vimconn.VimConnector): self._reload_connection() network_dict = {"name": net_name, "admin_state_up": True} - if net_type in ("data", "ptp"): + if net_type in ("data", "ptp") or provider_network_profile: provider_physical_network = None if provider_network_profile and provider_network_profile.get( @@ -1954,11 +1954,46 @@ class vimconnector(vimconn.VimConnector): availability_zone=vm_av_zone, ) boot_volume_id = volume.id - created_items["volume:" + str(volume.id)] = True - block_device_mapping["vd" + chr(base_disk_index)] = volume.id + self.update_block_device_mapping( + volume=volume, + block_device_mapping=block_device_mapping, + base_disk_index=base_disk_index, + disk=disk, + created_items=created_items, + ) return boot_volume_id + @staticmethod + def update_block_device_mapping( + volume: object, + block_device_mapping: dict, + base_disk_index: int, + disk: dict, + created_items: dict, + ) -> None: + """Add volume information to block device mapping dict. + Args: + volume (object): Created volume object + block_device_mapping (dict): Block device details + base_disk_index (int): Disk index + disk (dict): Disk details + created_items (dict): All created items belongs to VM + """ + if not volume: + raise vimconn.VimConnException("Volume is empty.") + + if not hasattr(volume, "id"): + raise vimconn.VimConnException( + "Created volume is not valid, does not have id attribute." + ) + + volume_txt = "volume:" + str(volume.id) + if disk.get("keep"): + volume_txt += ":keep" + created_items[volume_txt] = True + block_device_mapping["vd" + chr(base_disk_index)] = volume.id + def _prepare_non_root_persistent_volumes( self, name: str, @@ -1998,8 +2033,13 @@ class vimconnector(vimconn.VimConnector): # Make sure volume is in the same AZ as the VM to be attached to availability_zone=vm_av_zone, ) - created_items["volume:" + str(volume.id)] = True - block_device_mapping["vd" + chr(base_disk_index)] = volume.id + self.update_block_device_mapping( + volume=volume, + block_device_mapping=block_device_mapping, + base_disk_index=base_disk_index, + disk=disk, + created_items=created_items, + ) def _wait_for_created_volumes_availability( self, elapsed_time: int, created_items: dict @@ -2017,7 +2057,10 @@ class vimconnector(vimconn.VimConnector): while elapsed_time < volume_timeout: for created_item in created_items: - v, _, volume_id = created_item.partition(":") + v, volume_id = ( + created_item.split(":")[0], + created_item.split(":")[1], + ) if v == "volume": if self.cinder.volumes.get(volume_id).status != "available": break @@ -2262,14 +2305,13 @@ class vimconnector(vimconn.VimConnector): return self.neutron.show_floatingip(free_floating_ip) def _get_free_floating_ip( - self, server: object, floating_network: dict, created_items: dict + self, server: object, floating_network: dict ) -> Optional[str]: """Get the free floating IP address. Args: server (object): Server Object floating_network (dict): Floating network details - created_items (dict): All created items belongs to new VM instance Returns: free_floating_ip (str): Free floating ip addr @@ -2281,9 +2323,7 @@ class vimconnector(vimconn.VimConnector): # Randomize random.shuffle(floating_ips) - return self._find_floating_ip( - server, floating_ips, floating_network, created_items - ) + return self._find_floating_ip(server, floating_ips, floating_network) def _prepare_external_network_for_vminstance( self, @@ -2313,7 +2353,7 @@ class vimconnector(vimconn.VimConnector): while not assigned: free_floating_ip = self._get_free_floating_ip( - server, floating_network, created_items + server, floating_network ) if not free_floating_ip: @@ -2478,6 +2518,7 @@ class vimconnector(vimconn.VimConnector): the method delete_vminstance and action_vminstance. Can be used to store created ports, volumes, etc. Format is vimconnector dependent, but do not use nested dictionaries and a value of None should be the same as not present. + """ self.logger.debug( "new_vminstance input: image='%s' flavor='%s' nics='%s'", @@ -2589,6 +2630,10 @@ class vimconnector(vimconn.VimConnector): server_id = server.id try: + created_items = self.remove_keep_tag_from_persistent_volumes( + created_items + ) + self.delete_vminstance(server_id, created_items) except Exception as e2: @@ -2596,6 +2641,21 @@ class vimconnector(vimconn.VimConnector): self._format_exception(e) + @staticmethod + def remove_keep_tag_from_persistent_volumes(created_items: Dict) -> Dict: + """Removes the keep flag from persistent volumes. So, those volumes could be removed. + + Args: + created_items (dict): All created items belongs to VM + + Returns: + updated_created_items (dict): Dict which does not include keep flag for volumes. + + """ + return { + key.replace(":keep", ""): value for (key, value) in created_items.items() + } + def get_vminstance(self, vm_id): """Returns the VM instance information from VIM""" # self.logger.debug("Getting VM from VIM") @@ -2802,6 +2862,22 @@ class vimconnector(vimconn.VimConnector): return keep_waiting + @staticmethod + def _extract_items_wth_keep_flag_from_created_items(created_items: dict) -> dict: + """Remove the volumes which has key flag from created_items + + Args: + created_items (dict): All created items belongs to VM + + Returns: + created_items (dict): Persistent volumes eliminated created_items + """ + return { + key: value + for (key, value) in created_items.items() + if len(key.split(":")) == 2 + } + def delete_vminstance( self, vm_id: str, created_items: dict = None, volumes_to_hold: list = None ) -> None: @@ -2817,6 +2893,10 @@ class vimconnector(vimconn.VimConnector): volumes_to_hold = [] try: + created_items = self._extract_items_wth_keep_flag_from_created_items( + created_items + ) + self._reload_connection() # Delete VM ports attached to the networks before the virtual machine