update link to upper-constraints.txt
[integration.git] / test / vcpe / preload.py
index c4efafd..62c036c 100755 (executable)
@@ -1,10 +1,9 @@
-#! /usr/bin/python
+#!/usr/bin/env python
 
 import requests
 import json
 import sys
 from datetime import datetime
-from vcpecommon import *
 import csar_parser
 import logging
 import base64
@@ -13,6 +12,7 @@ import base64
 class Preload:
     def __init__(self, vcpecommon):
         self.logger = logging.getLogger(__name__)
+        self.logger.setLevel(logging.DEBUG)
         self.vcpecommon = vcpecommon
 
     def replace(self, sz, replace_dict):
@@ -26,14 +26,14 @@ class Preload:
         with open(template_file) as json_input:
             json_data = json.load(json_input)
             stk = [json_data]
-            while len(stk) > 0:
+            while stk:
                 data = stk.pop()
                 for k, v in data.items():
                     if type(v) is dict:
                         stk.append(v)
                     elif type(v) is list:
                         stk.extend(v)
-                    elif type(v) is str or type(v) is unicode:
+                    elif type(v) is str or type(v) is unicode: # pylint: disable=E0602
                         if self.vcpecommon.template_variable_symbol in v:
                             data[k] = self.replace(v, replace_dict)
                     else:
@@ -46,7 +46,7 @@ class Preload:
         if 2 != r.status_code / 100:
             self.logger.debug(r.content)
             self.logger.error('Clearing SNIRO date failed.')
-            sys.exit()
+            sys.exit(1)
 
     def preload_sniro(self, template_sniro_data, template_sniro_request, tunnelxconn_ar_name, vgw_name, vbrg_ar_name,
                       vgmux_svc_instance_uuid, vbrg_svc_instance_uuid):
@@ -75,7 +75,7 @@ class Preload:
             response = r.json()
             self.logger.debug(json.dumps(response, indent=4, sort_keys=True))
             self.logger.error('SNIRO preloading failed.')
-            sys.exit()
+            sys.exit(1)
 
         return True
 
@@ -100,12 +100,17 @@ class Preload:
                         '${subnet_gateway}': subnet_gateway
                         }
         self.logger.info('Preloading network ' + network_role)
-        return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_network_url)
+        self.logger.info('template_file:' + template_file)
+        if 'networkgra' in template_file:
+            return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_network_gra_url)
+        else:
+            return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_network_url)
 
     def preload(self, template_file, replace_dict, url):
+        self.logger.debug('tempalte_file:'+ template_file)
         json_data = self.generate_json(template_file, replace_dict)
         self.logger.debug(json.dumps(json_data, indent=4, sort_keys=True))
-        r = requests.post(url, headers=self.vcpecommon.sdnc_headers, auth=self.vcpecommon.sdnc_userpass, json=json_data)
+        r = requests.post(url, headers=self.vcpecommon.sdnc_headers, auth=self.vcpecommon.sdnc_userpass, json=json_data, verify=False)
         response = r.json()
         if int(response.get('output', {}).get('response-code', 0)) != 200:
             self.logger.debug(json.dumps(response, indent=4, sort_keys=True))
@@ -121,7 +126,16 @@ class Preload:
         self.logger.info('Preloading vGW')
         return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
 
-    def preload_vfmodule(self, template_file, service_instance_id, vnf_model, vfmodule_model, common_dict, name_suffix):
+    def preload_vgw_gra(self, template_file, brg_mac, commont_dict, name_suffix, vgw_vfmod_name_index):
+        replace_dict = {'${brg_mac}': brg_mac,
+                        '${suffix}': name_suffix,
+                        '${vgw_vfmod_name_index}': vgw_vfmod_name_index
+                        }
+        replace_dict.update(commont_dict)
+        self.logger.info('Preloading vGW-GRA')
+        return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_gra_url)
+
+    def preload_vfmodule(self, template_file, service_instance_id, vnf_model, vfmodule_model, common_dict, name_suffix , gra_api_flag):
         """
         :param template_file:
         :param service_instance_id:
@@ -145,10 +159,16 @@ class Preload:
                         '${service_type}': service_instance_id,
                         '${generic_vnf_name}': vnf_model['modelCustomizationName'],
                         '${vnf_name}': vfmodule_name,
+                        '${mr_ip_addr}': self.vcpecommon.mr_ip_addr,
+                        '${mr_ip_port}': self.vcpecommon.mr_ip_port,
+                        '${sdnc_oam_ip}': self.vcpecommon.sdnc_oam_ip,
                         '${suffix}': name_suffix}
         replace_dict.update(common_dict)
         self.logger.info('Preloading VF Module ' + vfmodule_name)
-        return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
+        if gra_api_flag:
+            return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_gra_url)
+        else:
+            return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
 
     def preload_all_networks(self, template_file, name_suffix):
         common_dict = {'${' + k + '}': v for k, v in self.vcpecommon.common_preload_config.items()}
@@ -159,11 +179,90 @@ class Preload:
                 return None
         return common_dict
 
+    def aai_region_query(self, req_method, json=None, verify=False):
+        """
+        Perform actual AAI API request for region
+        :param req_method: request method ({'get','put'})
+        :param json: Json payload
+        :param verify: SSL verify mode
+        :return:
+        """
+        url, headers, auth = (self.vcpecommon.aai_region_query_url,
+                              self.vcpecommon.aai_headers,
+                              self.vcpecommon.aai_userpass)
+        try:
+            if req_method == 'get':
+                request = requests.get(url, headers=headers, auth=auth,
+                                       verify=verify)
+            elif req_method == 'put':
+                request = requests.put(url, headers=headers, auth=auth,
+                                        verify=verify, json=json)
+            else:
+                raise requests.exceptions.RequestException
+        except requests.exceptions.RequestException as e:
+            self.logger.error("Error connecting to AAI API. Error details: " + str(e.message))
+            return False
+        try:
+            assert request.status_code == 200
+        except AssertionError:
+            self.logger.error('AAI request failed. API returned http code ' + str(request.status_code))
+            return False
+        try:
+            return request.json()
+        except ValueError as e:
+            if req_method == 'get':
+                self.logger.error('Unable to parse AAI response: ' + e.message)
+                return False
+            elif req_method == 'put':
+                return request.ok
+            else:
+                return False
+
+    def preload_aai_data(self, template_aai_region_data):
+        """
+        Update aai region data with identity-url
+        :param template_aai_region_data: path to region data template
+        :return:
+        """
+        request = self.aai_region_query('get')
+        if request:
+            # Check if identity-url already updated (for idempotency)
+            self.logger.debug("Regiond data acquired from AAI:\n" + json.dumps(request,indent=4))
+            try:
+                assert request['identity-url']
+            except KeyError:
+                pass
+            else:
+                self.logger.info('Identity-url already present in {0} data, not updating'.format(self.vcpecommon.cloud['--os-region-name']))
+                return
+
+            # Get resource_version and relationship_list from region data
+            resource_version = request['resource-version']
+            relationship_list = request['relationship-list']
+
+            replace_dict = {'${identity-url}': self.vcpecommon.cloud['--os-auth-url'],
+                            '${identity_api_version}': self.vcpecommon.cloud['--os-identity-api-version'],
+                            '${region_name}': self.vcpecommon.cloud['--os-region-name'],
+                            '${resource_version}': resource_version
+                           }
+            json_data = self.generate_json(template_aai_region_data, replace_dict)
+            json_data['relationship-list'] = relationship_list
+            self.logger.debug('Region update payload:\n' + json.dumps(json_data,indent=4))
+        else:
+            sys.exit(1)
+
+        # Update region data
+        request = self.aai_region_query('put', json_data)
+        if request:
+            self.logger.info('Successully updated identity-url in {0} '
+                    'region'.format(self.vcpecommon.cloud['--os-region-name']))
+        else:
+            sys.exit(1)
+
     def test(self):
         # this is for testing purpose
         name_suffix = datetime.now().strftime('%Y%m%d%H%M')
-        vcpecommon = VcpeCommon()
-        preloader = Preload(vcpecommon)
+        preloader = Preload(self.vcpecommon)
 
         network_dict = {'${' + k + '}': v for k, v in self.vcpecommon.common_preload_config.items()}
         template_file = 'preload_templates/template.network.json'
@@ -178,14 +277,21 @@ class Preload:
 
         keys = ['infra', 'bng', 'gmux', 'brg']
         for key in keys:
+            key_vnf= key + "_"
+            key_gra = key + "gra_"
             csar_file = self.vcpecommon.find_file(key, 'csar', 'csar')
-            template_file = self.vcpecommon.find_file(key, 'json', 'preload_templates')
-            if csar_file and template_file:
+            template_file = self.vcpecommon.find_file(key_vnf, 'json', 'preload_templates')
+            template_file_gra = self.vcpecommon.find_file(key_gra, 'json', 'preload_templates')
+            if csar_file and template_file and template_file_gra:
                 parser = csar_parser.CsarParser()
                 parser.parse_csar(csar_file)
                 service_instance_id = 'test112233'
+               # preload both VNF-API and GRA-API
                 preloader.preload_vfmodule(template_file, service_instance_id, parser.vnf_models[0],
-                                           parser.vfmodule_models[0], network_dict, name_suffix)
+                                           parser.vfmodule_models[0], network_dict, name_suffix, False)
+                preloader.preload_vfmodule(template_file_gra, service_instance_id, parser.vnf_models[0],
+                                           parser.vfmodule_models[0], network_dict, name_suffix, True)
+
 
     def test_sniro(self):
         template_sniro_data = self.vcpecommon.find_file('sniro_data', 'json', 'preload_templates')
@@ -207,7 +313,7 @@ class Preload:
 
         if not (tunnelxconn_ar_name and brg_ar_name and vgw_name):
             self.logger.error('Cannot find all names from %s.', vcperescust_csar)
-            sys.exit()
+            sys.exit(1)
 
         vgmux_svc_instance_uuid = '88888888888888'
         vbrg_svc_instance_uuid = '999999999999999'