summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gvnfmadapter/driver/interfaces/tests.py30
-rw-r--r--gvnfmadapter/driver/interfaces/views.py12
-rw-r--r--gvnfmadapter/driver/pub/config/config.py10
-rw-r--r--gvnfmadapter/driver/pub/utils/restcall.py54
4 files changed, 88 insertions, 18 deletions
diff --git a/gvnfmadapter/driver/interfaces/tests.py b/gvnfmadapter/driver/interfaces/tests.py
index f20d7ac..48f3783 100644
--- a/gvnfmadapter/driver/interfaces/tests.py
+++ b/gvnfmadapter/driver/interfaces/tests.py
@@ -27,8 +27,9 @@ class InterfacesTest(TestCase):
def tearDown(self):
pass
+ @mock.patch.object(restcall, 'call_req_aai')
@mock.patch.object(restcall, 'call_req')
- def test_instantiate_vnf(self, mock_call_req):
+ def test_instantiate_vnf(self, mock_call_req, mock_call_req_aai):
vnfm_info = {
'userName': 'admin',
'vendor': 'ZTE',
@@ -55,7 +56,8 @@ class InterfacesTest(TestCase):
r1 = [0, json.JSONEncoder().encode(vnfm_info), "200"]
ret = [0, json.JSONEncoder().encode(job_info), '200']
ret2 = [0, json.JSONEncoder().encode(vnflcm_info), '200']
- mock_call_req.side_effect = [r1, ret, r1, ret2]
+ mock_call_req_aai.side_effect = [r1, r1]
+ mock_call_req.side_effect = [ret, ret2]
req_data = {
'vnfInstanceName': 'VFW_f88c0cb7-512a-44c4-bd09-891663f19367',
'vnfPackageId': 'd852e1be-0aac-48f1-b1a4-cd825f6cdf9a',
@@ -80,8 +82,9 @@ class InterfacesTest(TestCase):
self.assertEqual(job_info, response.data)
+ @mock.patch.object(restcall, 'call_req_aai')
@mock.patch.object(restcall, 'call_req')
- def test_terminate_vnf(self, mock_call_req):
+ def test_terminate_vnf(self, mock_call_req, mock_call_req_aai):
vnfm_info = {
"vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
"name": "g_vnfm",
@@ -101,14 +104,16 @@ class InterfacesTest(TestCase):
r1 = [0, json.JSONEncoder().encode(vnfm_info), "200"]
r2 = [0, json.JSONEncoder().encode(job_info), "200"]
job_ret = [0, json.JSONEncoder().encode(job_status_info), "200"]
- mock_call_req.side_effect = [r1, r2, r1, job_ret, r1, r2]
+ mock_call_req_aai.side_effect = [r1, r1, r1]
+ mock_call_req.side_effect = [r2, job_ret, r2]
response = self.client.post("/api/gvnfmdriver/v1/ztevnfmid/vnfs/2/terminate")
self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code)
self.assertEqual(job_info, response.data)
+ @mock.patch.object(restcall, 'call_req_aai')
@mock.patch.object(restcall, 'call_req')
- def test_query_vnf(self, mock_call_req):
+ def test_query_vnf(self, mock_call_req, mock_call_req_aai):
vnfm_info = {
"vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
"name": "g_vnfm",
@@ -126,15 +131,17 @@ class InterfacesTest(TestCase):
job_info = {"ResponseInfo": {"vnfInstanceId":"88","instantiationState":"INSTANTIATED","vnfSoftwareVersion":"v1.2.3"}}
r1 = [0, json.JSONEncoder().encode(vnfm_info), "200"]
r2 = [0, json.JSONEncoder().encode(job_info), "200"]
- mock_call_req.side_effect = [r1, r2]
+ mock_call_req_aai.side_effect = [r1]
+ mock_call_req.side_effect = [r2]
response = self.client.get("/api/gvnfmdriver/v1/19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee/vnfs/88")
self.assertEqual(status.HTTP_200_OK, response.status_code)
expect_resp_data = {"vnfInfo": {"vnfInstanceId": "88", "vnfStatus": "ACTIVE","version":"v1.2.3"}}
self.assertEqual(expect_resp_data, response.data)
-
-
+
+
+ @mock.patch.object(restcall, 'call_req_aai')
@mock.patch.object(restcall, 'call_req')
- def test_operation_status(self, mock_call_req):
+ def test_operation_status(self, mock_call_req, mock_call_req_aai):
vnfm_info = {
'userName': 'admin',
'vendor': 'ZTE',
@@ -188,7 +195,8 @@ class InterfacesTest(TestCase):
}
r1 = [0, json.JSONEncoder().encode(vnfm_info), '200']
r2 = [0, json.JSONEncoder().encode(resp_body), '200']
- mock_call_req.side_effect = [r1, r2]
+ mock_call_req_aai.side_effect = [r1]
+ mock_call_req.side_effect = [r2]
response = self.client.get("/api/gvnfmdriver/v1/{vnfmid}/jobs/{jobid}?responseId={responseId}".
format(vnfmid=vnfm_info["vnfmId"],jobid=resp_body["ResponseInfo"]["vnfLcOpId"],
responseId=resp_body["ResponseInfo"]["responseDescriptor"]["responseId"]))
@@ -284,7 +292,7 @@ class InterfacesTest(TestCase):
self.assertEqual(str(status.HTTP_200_OK), response.status_code)
expect_resp_data = None
self.assertEqual(expect_resp_data, response.data)
-
+
@mock.patch.object(restcall, 'call_req')
def test_get_vnfpkgs(self, mock_call_req):
mock_call_req.return_value = [0, json.JSONEncoder().encode({
diff --git a/gvnfmadapter/driver/interfaces/views.py b/gvnfmadapter/driver/interfaces/views.py
index efd2631..7316654 100644
--- a/gvnfmadapter/driver/interfaces/views.py
+++ b/gvnfmadapter/driver/interfaces/views.py
@@ -12,17 +12,17 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-
-
import inspect
import json
import logging
import time
+
+from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
+
from driver.pub.utils import restcall
-from driver.pub.utils.restcall import req_by_msb
-from rest_framework import status
+from driver.pub.utils.restcall import req_by_msb, call_aai
# ==================================================
vnf_create_url = "api/vnflcm/v1/vnf_instances"
@@ -31,7 +31,7 @@ vnf_delete_url = "api/vnflcm/v1/vnf_instances/%s"
vnf_terminate_url = "api/vnflcm/v1/vnf_instances/%s/terminate"
operation_status_url = "api/vnflcm/v1/vnf_lc_ops/%s?responseId=%s"
vnf_detail_url = "api/vnflcm/v1/vnf_instances/%s"
-EXTSYS_GET_VNFM = "api/extsys/v1/vnfms/%s"
+EXTSYS_GET_VNFM = "api/aai-esr-server/v1/vnfms/%s"
vnf_query_url = "api/vnflcm/v1/vnf_instances/%s"
notify_url = 'api/nslcm/v1/vnfs/{vnfInstanceId}/Notify'
@@ -110,7 +110,7 @@ def get_inst_levelId(vnfdId):
return inst_levelId
def get_vnfm_info(vnfm_id):
- ret = req_by_msb((EXTSYS_GET_VNFM) % vnfm_id, "GET")
+ ret = call_aai((EXTSYS_GET_VNFM) % vnfm_id, "GET")
if ret[0] != 0:
return 255, Response(data={'error': ret[1]}, status=ret[2])
vnfm_info = json.JSONDecoder().decode(ret[1])
diff --git a/gvnfmadapter/driver/pub/config/config.py b/gvnfmadapter/driver/pub/config/config.py
index 198ae76..ab143a1 100644
--- a/gvnfmadapter/driver/pub/config/config.py
+++ b/gvnfmadapter/driver/pub/config/config.py
@@ -12,6 +12,16 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+# [AAI]
+AAI_SERVICE_IP = '127.0.0.1'
+AAI_SERVICE_PORT = '8443'
+AAI_BASE_URL = "https://%s:%s/aai/v11" % (AAI_SERVICE_IP, AAI_SERVICE_PORT)
+AAI_USER = "AAI"
+AAI_PASSWORD = "AAI"
+CLOUD_OWNER = ""
+CLOUD_REGION_ID = ""
+TENANT_ID = ""
+
# [MSB]
MSB_SERVICE_IP = '127.0.0.1'
MSB_SERVICE_PORT = '80'
diff --git a/gvnfmadapter/driver/pub/utils/restcall.py b/gvnfmadapter/driver/pub/utils/restcall.py
index 08f4cf3..0cb7ed4 100644
--- a/gvnfmadapter/driver/pub/utils/restcall.py
+++ b/gvnfmadapter/driver/pub/utils/restcall.py
@@ -19,7 +19,7 @@ import urllib2
import uuid
import httplib2
-from driver.pub.config.config import MSB_SERVICE_IP, MSB_SERVICE_PORT
+from driver.pub.config.config import MSB_SERVICE_IP, MSB_SERVICE_PORT, AAI_BASE_URL, AAI_USER, AAI_PASSWORD
rest_no_auth, rest_oneway_auth, rest_bothway_auth = 0, 1, 2
HTTP_200_OK, HTTP_201_CREATED, HTTP_204_NO_CONTENT, HTTP_202_ACCEPTED = '200', '201', '204', '202'
@@ -93,3 +93,55 @@ def combine_url(base_url, resource):
else:
full_url = base_url + '/' + resource
return full_url
+
+def call_req_aai(base_url, user, passwd, auth_type, resource, method, content=''):
+ callid = str(uuid.uuid1())
+ logger.debug("[%s]call_req('%s','%s','%s',%s,'%s','%s','%s')" % (
+ callid, base_url, user, passwd, auth_type, resource, method, content))
+ ret = None
+ resp_status = ''
+ try:
+ full_url = combine_url(base_url, resource)
+ headers = {'content-type': 'application/json', 'accept': 'application/json',
+ 'X-FromAppId': 'VFC-SVNFM-ZTE-DRIVER', 'X-TransactionId': str(uuid.uuid1())}
+ if user:
+ headers['Authorization'] = 'Basic ' + ('%s:%s' % (user, passwd)).encode("base64")
+ ca_certs = None
+ for retry_times in range(3):
+ http = httplib2.Http(ca_certs=ca_certs, disable_ssl_certificate_validation=(auth_type == rest_no_auth))
+ http.follow_all_redirects = True
+ try:
+ resp, resp_content = http.request(full_url, method=method.upper(), body=content, headers=headers)
+ resp_status, resp_body = resp['status'], resp_content.decode('UTF-8')
+ logger.debug("[%s][%d]status=%s,resp_body=%s)" % (callid, retry_times, resp_status, resp_body))
+ if resp_status in status_ok_list:
+ ret = [0, resp_body, resp_status]
+ else:
+ ret = [1, resp_body, resp_status]
+ break
+ except Exception as ex:
+ if 'httplib.ResponseNotReady' in str(sys.exc_info()):
+ logger.debug("retry_times=%d", retry_times)
+ logger.error(traceback.format_exc())
+ ret = [1, "Unable to connect to %s" % full_url, resp_status]
+ continue
+ raise ex
+ except urllib2.URLError as err:
+ ret = [2, str(err), resp_status]
+ except Exception as ex:
+ logger.error(traceback.format_exc())
+ logger.error("[%s]ret=%s" % (callid, str(sys.exc_info())))
+ res_info = str(sys.exc_info())
+ if 'httplib.ResponseNotReady' in res_info:
+ res_info = "The URL[%s] request failed or is not responding." % full_url
+ ret = [3, res_info, resp_status]
+ except:
+ logger.error(traceback.format_exc())
+ ret = [4, str(sys.exc_info()), resp_status]
+
+ logger.debug("[%s]ret=%s" % (callid, str(ret)))
+ return ret
+
+
+def call_aai(resource, method, data=''):
+ return call_req_aai(AAI_BASE_URL, AAI_USER, AAI_PASSWORD, rest_no_auth, resource, method, data)