+ def _get_vm_zone(self, availability_zone_index, availability_zone_list):
+ if availability_zone_index is None:
+ return None
+
+ vim_availability_zones = self._get_azure_availability_zones()
+ # check if VIM offer enough availability zones describe in the VNFD
+ if vim_availability_zones and len(availability_zone_list) <= len(
+ vim_availability_zones
+ ):
+ # check if all the names of NFV AV match VIM AV names
+ match_by_index = False
+
+ if not availability_zone_list:
+ match_by_index = True
+ else:
+ for av in availability_zone_list:
+ if av not in vim_availability_zones:
+ match_by_index = True
+ break
+
+ if match_by_index:
+ return vim_availability_zones[availability_zone_index]
+ else:
+ return availability_zone_list[availability_zone_index]
+ else:
+ raise vimconn.VimConnConflictException(
+ "No enough availability zones at VIM for this deployment"
+ )
+
+ def _get_azure_availability_zones(self):
+ return self.AZURE_ZONES
+
+ def _add_newvm_disk(
+ self, virtual_machine, vm_name, disk_index, disk, created_items={}
+ ):
+ disk_name = None
+ data_disk = None
+
+ # Check if must create empty disk or from image
+ if disk.get("vim_id"):
+ # disk already exists, just get
+ parsed_id = azure_tools.parse_resource_id(disk.get("vim_id"))
+ disk_name = parsed_id.get("name")
+ data_disk = self.conn_compute.disks.get(self.resource_group, disk_name)
+ else:
+ disk_name = vm_name + "_DataDisk_" + str(disk_index)
+ if not disk.get("image_id"):
+ self.logger.debug("create new data disk name: %s", disk_name)
+ async_disk_creation = self.conn_compute.disks.create_or_update(
+ self.resource_group,
+ disk_name,
+ {
+ "location": self.region,
+ "disk_size_gb": disk.get("size"),
+ "creation_data": {"create_option": DiskCreateOption.empty},
+ },
+ )
+ data_disk = async_disk_creation.result()
+ created_items[data_disk.id] = True
+ else:
+ image_id = disk.get("image_id")
+
+ if azure_tools.is_valid_resource_id(image_id):
+ parsed_id = azure_tools.parse_resource_id(image_id)
+
+ # Check if image is snapshot or disk
+ image_name = parsed_id.get("name")
+ type = parsed_id.get("resource_type")
+
+ if type == "snapshots" or type == "disks":
+ self.logger.debug("create disk from copy name: %s", image_name)
+ # ¿Should check that snapshot exists?
+ async_disk_creation = self.conn_compute.disks.create_or_update(
+ self.resource_group,
+ disk_name,
+ {
+ "location": self.region,
+ "creation_data": {
+ "create_option": "Copy",
+ "source_uri": image_id,
+ },
+ },
+ )
+ data_disk = async_disk_creation.result()
+ created_items[data_disk.id] = True
+ else:
+ raise vimconn.VimConnNotFoundException(
+ "Invalid image_id: %s ", image_id
+ )
+ else:
+ raise vimconn.VimConnNotFoundException(
+ "Invalid image_id: %s ", image_id
+ )
+
+ # Attach the disk created
+ virtual_machine.storage_profile.data_disks.append(
+ {
+ "lun": disk_index,
+ "name": disk_name,
+ "create_option": DiskCreateOption.attach,
+ "managed_disk": {"id": data_disk.id},
+ "disk_size_gb": disk.get("size"),
+ }
+ )
+ self.logger.debug("attach disk name: %s", disk_name)
+ self.conn_compute.virtual_machines.create_or_update(
+ self.resource_group, virtual_machine.name, virtual_machine
+ )
+