+ def __wait_for_vm(self, vm_id, status):
+ """wait until vm is in the desired status and return True.
+ If the VM gets in ERROR status, return false.
+ If the timeout is reached generate an exception"""
+ elapsed_time = 0
+ while elapsed_time < server_timeout:
+ vm_status = self.nova.servers.get(vm_id).status
+ if vm_status == status:
+ return True
+ if vm_status == 'ERROR':
+ return False
+ time.sleep(1)
+ elapsed_time += 1
+
+ # if we exceeded the timeout rollback
+ if elapsed_time >= server_timeout:
+ raise vimconn.vimconnException('Timeout waiting for instance ' + vm_id + ' to get ' + status,
+ http_code=vimconn.HTTP_Request_Timeout)
+
+ def _get_openstack_availablity_zones(self):
+ """
+ Get from openstack availability zones available
+ :return:
+ """
+ try:
+ openstack_availability_zone = self.nova.availability_zones.list()
+ openstack_availability_zone = [str(zone.zoneName) for zone in openstack_availability_zone
+ if zone.zoneName != 'internal']
+ return openstack_availability_zone
+ except Exception as e:
+ return None
+
+ def _set_availablity_zones(self):
+ """
+ Set vim availablity zone
+ :return:
+ """
+
+ if 'availability_zone' in self.config:
+ vim_availability_zones = self.config.get('availability_zone')
+ if isinstance(vim_availability_zones, str):
+ self.availability_zone = [vim_availability_zones]
+ elif isinstance(vim_availability_zones, list):
+ self.availability_zone = vim_availability_zones
+ else:
+ self.availability_zone = self._get_openstack_availablity_zones()
+
+ def _get_vm_availavility_zone(self, availavility_zone_index, nfv_availability_zones):
+ """
+ Return a list with all availability zones create during datacenter attach.
+ :return: List with availability zones
+ """
+ openstack_avilability_zone = self.availability_zone
+
+ # check if VIM offer enough availability zones describe in the VNFC
+ if self.availability_zone and availavility_zone_index is not None \
+ and 0 <= len(nfv_availability_zones) <= len(self.availability_zone):
+
+ if nfv_availability_zones:
+ vnf_azone = nfv_availability_zones[availavility_zone_index]
+ zones_available = []
+
+ for nfv_zone in nfv_availability_zones:
+ for vim_zone in openstack_avilability_zone:
+ if nfv_zone is vim_zone:
+ zones_available.append(nfv_zone)
+
+ if len(zones_available) == len(openstack_avilability_zone) and vnf_azone in openstack_avilability_zone:
+ return vnf_azone
+ else:
+ return openstack_avilability_zone[availavility_zone_index]
+ else:
+ raise vimconn.vimconnConflictException("No enough availablity zones for this deployment")
+ return None
+
+ def new_vminstance(self, name, description, start, image_id, flavor_id, net_list,cloud_config=None,disk_list=None,
+ availavility_zone_index=None, nfv_availability_zones=None):