X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=vimconn_openstack.py;h=96d89e361ac3756e6a722f1b7daea212cd913047;hb=00bdd8b2ba28833a250cbb86170039b393251c36;hp=cdd117849eb9897a79c0b903a1fb0633b385c943;hpb=bba83c837c93bada304f2cb31925c59c0afb82c8;p=osm%2FRO.git diff --git a/vimconn_openstack.py b/vimconn_openstack.py index cdd11784..96d89e36 100644 --- a/vimconn_openstack.py +++ b/vimconn_openstack.py @@ -62,6 +62,7 @@ netStatus2manoFormat={'ACTIVE':'ACTIVE','PAUSED':'PAUSED','INACTIVE':'INACTIVE', #global var to have a timeout creating and deleting volumes volume_timeout = 60 +server_timeout = 60 class vimconnector(vimconn.vimconnector): def __init__(self, uuid, name, tenant_id, tenant_name, url, url_admin=None, user=None, passwd=None, log_level=None, config={}): @@ -95,6 +96,9 @@ class vimconnector(vimconn.vimconnector): if self.osc_api_version == 'v3.3': self.k_creds['project_name'] = tenant_name self.k_creds['project_id'] = tenant_id + if config.get('region_name'): + self.k_creds['region_name'] = config.get('region_name') + self.n_creds['region_name'] = config.get('region_name') self.reload_client = True self.logger = logging.getLogger('openmano.vim.openstack') @@ -561,7 +565,7 @@ class vimconnector(vimconn.vimconnector): #determine format http://docs.openstack.org/developer/glance/formats.html if "disk_format" in image_dict: disk_format=image_dict["disk_format"] - else: #autodiscover base on extention + else: #autodiscover based on extension if image_dict['location'][-6:]==".qcow2": disk_format="qcow2" elif image_dict['location'][-4:]==".vhd": @@ -652,8 +656,8 @@ class vimconnector(vimconn.vimconnector): filtered_list = [] for image in image_list: image_dict=self.glance.images.get(image.id) - if image_dict['checksum']==filter_dict.get('checksum'): - filtered_list.append(image) + if 'checksum' not in filter_dict or image_dict['checksum']==filter_dict.get('checksum'): + filtered_list.append(image_dict) return filtered_list except (ksExceptions.ClientException, nvExceptions.ClientException, gl1Exceptions.CommunicationError, ConnectionError) as e: self._format_exception(e) @@ -705,6 +709,8 @@ class vimconnector(vimconn.vimconnector): port_dict["name"]=name if net.get("mac_address"): port_dict["mac_address"]=net["mac_address"] + if net.get("port_security") == False: + port_dict["port_security_enabled"]=net["port_security"] new_port = self.neutron.create_port({"port": port_dict }) net["mac_adress"] = new_port["port"]["mac_address"] net["vim_id"] = new_port["port"]["id"] @@ -787,7 +793,7 @@ class vimconnector(vimconn.vimconnector): #delete ports we just created for net_item in net_list_vim: if 'port-id' in net_item: - self.neutron.delete_port(net_item['port_id']) + self.neutron.delete_port(net_item['port-id']) raise vimconn.vimconnException('Timeout creating volumes for instance ' + name, http_code=vimconn.HTTP_Request_Timeout) @@ -800,15 +806,29 @@ class vimconnector(vimconn.vimconnector): block_device_mapping = block_device_mapping ) # , description=description) #print "DONE :-)", server - pool_id = None floating_ips = self.neutron.list_floatingips().get("floatingips", ()) for floating_network in external_network: + # wait until vm is active + elapsed_time = 0 + while elapsed_time < server_timeout: + status = self.nova.servers.get(server.id).status + if status == 'ACTIVE': + break + time.sleep(1) + elapsed_time += 1 + + #if we exceeded the timeout rollback + if elapsed_time >= server_timeout: + self.delete_vminstance(server.id) + raise vimconn.vimconnException('Timeout creating instance ' + name, + http_code=vimconn.HTTP_Request_Timeout) + assigned = False while(assigned == False): if floating_ips: ip = floating_ips.pop(0) - if not ip.get("port_id", False): + if not ip.get("port_id", False) and ip.get('tenant_id') == server.tenant_id: free_floating_ip = ip.get("floating_ip_address") try: fix_ip = floating_network.get('ip') @@ -818,8 +838,25 @@ class vimconnector(vimconn.vimconnector): self.delete_vminstance(server.id) raise vimconn.vimconnException(type(e).__name__ + ": Cannot create floating_ip "+ str(e), http_code=vimconn.HTTP_Conflict) else: - pool_id = floating_network.get('net_id') - param = {'floatingip': {'floating_network_id': pool_id}} + #Find the external network + external_nets = list() + for net in self.neutron.list_networks()['networks']: + if net['router:external']: + external_nets.append(net) + + if len(external_nets) == 0: + self.delete_vminstance(server.id) + raise vimconn.vimconnException("Cannot create floating_ip automatically since no external " + "network is present", + http_code=vimconn.HTTP_Conflict) + if len(external_nets) > 1: + self.delete_vminstance(server.id) + raise vimconn.vimconnException("Cannot create floating_ip automatically since multiple " + "external networks are present", + http_code=vimconn.HTTP_Conflict) + + pool_id = external_nets[0].get('id') + param = {'floatingip': {'floating_network_id': pool_id, 'tenant_id': server.tenant_id}} try: #self.logger.debug("Creating floating IP") new_floating_ip = self.neutron.create_floatingip(param) @@ -837,6 +874,15 @@ class vimconnector(vimconn.vimconnector): # error_text= "vm instance %s not found" % vm_id except (ksExceptions.ClientException, nvExceptions.ClientException, ConnectionError ) as e: + # delete the volumes we just created + if block_device_mapping != None: + for volume_id in block_device_mapping.itervalues(): + self.cinder.volumes.delete(volume_id) + + # delete ports we just created + for net_item in net_list_vim: + if 'port-id' in net_item: + self.neutron.delete_port(net_item['port-id']) self._format_exception(e) except TypeError as e: raise vimconn.vimconnException(type(e).__name__ + ": "+ str(e), http_code=vimconn.HTTP_Bad_Request)