change default configuration to do not proxy the VIM VNF consoles
[osm/RO.git] / vimconn_openstack.py
index cdd1178..96d89e3 100644 (file)
@@ -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)