Merge "Change api version"
[functest.git] / functest / utils / openstack_tacker.py
index d143ad6..8327fdb 100644 (file)
@@ -45,8 +45,16 @@ def get_vnfd_id(tacker_client, vnfd_name):
     return get_id_from_name(tacker_client, 'vnfd', vnfd_name)
 
 
-def get_vnf_id(tacker_client, vnf_name):
-    return get_id_from_name(tacker_client, 'vnf', vnf_name)
+def get_vnf_id(tacker_client, vnf_name, timeout=5):
+    vnf_id = None
+    while vnf_id is None and timeout >= 0:
+        vnf_id = get_id_from_name(tacker_client, 'vnf', vnf_name)
+        if vnf_id is None:
+            logger.info("Could not retrieve ID for vnf with name [%s]."
+                        " Retrying." % vnf_name)
+            time.sleep(1)
+            timeout -= 1
+    return vnf_id
 
 
 def get_sfc_id(tacker_client, sfc_name):
@@ -74,12 +82,12 @@ def create_vnfd(tacker_client, tosca_file=None):
         if tosca_file is not None:
             with open(tosca_file) as tosca_fd:
                 vnfd_body = tosca_fd.read()
-            logger.error(vnfd_body)
+            logger.info('VNFD template:\n{0}'.format(vnfd_body))
         return tacker_client.create_vnfd(
             body={"vnfd": {"attributes": {"vnfd": vnfd_body}}})
     except Exception, e:
-        logger.exception("Error [create_vnfd(tacker_client, '%s')]: %s"
-                         % (tosca_file, e))
+        logger.error("Error [create_vnfd(tacker_client, '%s')]: %s"
+                     % (tosca_file, e))
         return None
 
 
@@ -108,7 +116,8 @@ def list_vnfs(tacker_client, verbose=False):
         return None
 
 
-def create_vnf(tacker_client, vnf_name, vnfd_id=None, vnfd_name=None):
+def create_vnf(tacker_client, vnf_name, vnfd_id=None,
+               vnfd_name=None, param_file=None):
     try:
         vnf_body = {
             'vnf': {
@@ -116,6 +125,11 @@ def create_vnf(tacker_client, vnf_name, vnfd_id=None, vnfd_name=None):
                 'name': vnf_name
             }
         }
+        if param_file is not None:
+            params = None
+            with open(param_file) as f:
+                params = f.read()
+            vnf_body['vnf']['attributes']['param_values'] = params
         if vnfd_id is not None:
             vnf_body['vnf']['vnfd_id'] = vnfd_id
         else:
@@ -124,37 +138,50 @@ def create_vnf(tacker_client, vnf_name, vnfd_id=None, vnfd_name=None):
             vnf_body['vnf']['vnfd_id'] = get_vnfd_id(tacker_client, vnfd_name)
         return tacker_client.create_vnf(body=vnf_body)
     except Exception, e:
-        logger.error("error [create_vnf(tacker_client, '%s', '%s', '%s')]: %s"
+        logger.error("error [create_vnf(tacker_client,"
+                     " '%s', '%s', '%s')]: %s"
                      % (vnf_name, vnfd_id, vnfd_name, e))
         return None
 
 
-def wait_for_vnf(tacker_client, vnf_id=None, vnf_name=None):
+def get_vnf(tacker_client, vnf_id=None, vnf_name=None):
     try:
-        _id = None
-        if vnf_id is not None:
-            _id = vnf_id
-        elif vnf_name is not None:
-            while _id is None:
-                try:
-                    _id = get_vnf_id(tacker_client, vnf_name)
-                except:
-                    logger.error("Bazinga")
-        else:
+        if vnf_id is None and vnf_name is None:
             raise Exception('You must specify vnf_id or vnf_name')
-        while True:
-            vnf = [v for v in list_vnfs(tacker_client, verbose=True)['vnfs']
-                   if v['id'] == _id]
-            vnf = vnf[0]
-            logger.info('Waiting for vnf {0}'.format(str(vnf)))
+
+        _id = get_vnf_id(tacker_client, vnf_name) if vnf_id is None else vnf_id
+
+        if _id is not None:
+            all_vnfs = list_vnfs(tacker_client, verbose=True)['vnfs']
+            return next((vnf for vnf in all_vnfs if vnf['id'] == _id), None)
+        else:
+            raise Exception('Could not retrieve ID from name [%s]' % vnf_name)
+
+    except Exception, e:
+        logger.error("Could not retrieve VNF [vnf_id=%s, vnf_name=%s] - %s"
+                     % (vnf_id, vnf_name, e))
+        return None
+
+
+def wait_for_vnf(tacker_client, vnf_id=None, vnf_name=None, timeout=60):
+    try:
+        vnf = get_vnf(tacker_client, vnf_id, vnf_name)
+        if vnf is None:
+            raise Exception("Could not retrieve VNF - id='%s', name='%s'"
+                            % vnf_id, vnf_name)
+        logger.info('Waiting for vnf {0}'.format(str(vnf)))
+        while vnf['status'] != 'ACTIVE' and timeout >= 0:
             if vnf['status'] == 'ERROR':
-                raise Exception('Error when booting vnf %s' % _id)
+                raise Exception('Error when booting vnf %s' % vnf['id'])
             elif vnf['status'] == 'PENDING_CREATE':
                 time.sleep(3)
-                continue
-            else:
-                break
-        return _id
+                timeout -= 3
+            vnf = get_vnf(tacker_client, vnf_id, vnf_name)
+
+        if (timeout < 0):
+            raise Exception('Timeout when booting vnf %s' % vnf['id'])
+
+        return vnf['id']
     except Exception, e:
         logger.error("error [wait_for_vnf(tacker_client, '%s', '%s')]: %s"
                      % (vnf_id, vnf_name, e))
@@ -188,7 +215,8 @@ def list_sfcs(tacker_client, verbose=False):
 
 def create_sfc(tacker_client, sfc_name,
                chain_vnf_ids=None,
-               chain_vnf_names=None):
+               chain_vnf_names=None,
+               symmetrical=False):
     try:
         sfc_body = {
             'sfc': {
@@ -197,6 +225,8 @@ def create_sfc(tacker_client, sfc_name,
                 'chain': []
             }
         }
+        if symmetrical:
+            sfc_body['sfc']['symmetrical'] = True
         if chain_vnf_ids is not None:
             sfc_body['sfc']['chain'] = chain_vnf_ids
         else:
@@ -206,7 +236,8 @@ def create_sfc(tacker_client, sfc_name,
                                         for name in chain_vnf_names]
         return tacker_client.create_sfc(body=sfc_body)
     except Exception, e:
-        logger.error("error [create_sfc(tacker_client, '%s', '%s', '%s')]: %s"
+        logger.error("error [create_sfc(tacker_client,"
+                     " '%s', '%s', '%s')]: %s"
                      % (sfc_name, chain_vnf_ids, chain_vnf_names, e))
         return None
 
@@ -263,8 +294,8 @@ def create_sfc_classifier(tacker_client, sfc_clf_name, sfc_id=None,
                 tacker_client, sfc_name)
         return tacker_client.create_sfc_classifier(body=sfc_clf_body)
     except Exception, e:
-        logger.error("error [create_sfc_classifier(tacker_client, '%s', '%s',"
-                     " '%s', '%s')]: '%s'"
+        logger.error("error [create_sfc_classifier(tacker_client,"
+                     " '%s', '%s','%s', '%s')]: '%s'"
                      % (sfc_clf_name, sfc_id, sfc_name, str(match), e))
         return None