Refactor duplicate methods in functional tests

This patch includes the following changes.
* Move BaseSolV2Test and BaseVnfLcmKubernetesV2Test duplicate methods
  to BaseTackerTestV2.
* Rename duplicate method names in BaseSolV2Test and
  BaseVnfLcmKubernetesV2Test.
* Define a repeat execution method of LCM operation in BaseTackerTestV2.
  And remove this processing from each FT.
* Change sleep times used in v2 API FT to the following constant.
   - WAIT_LCMOCC_UPDATE_TIME
   - WAIT_NOTIFICATION_TIME
   - WAIT_TEST_NOTIFICATION_TIME
   - WAIT_CREATE_THRESHOLD_TIME
   - WAIT_AUTO_HEAL_TIME
   - SERVER_NOTIFICATION_INTERVAL
* Change versions used in v2 API FT to the following constant.
   - VNFLCM_V2_VERSION = "2.0.0"
   - VNFFM_V1_VERSION = "1.3.0"
   - VNFPM_V2_VERSION = "2.1.0"
* Rename VNF Package and VNFD ID used in the FT of the v2 API
  to something that is easy to understand.

Co-Author: Ai Hamano <ai.hamano@ntt-at.co.jp>
Change-Id: I6230ab56dec3a5c96cd123c62168a6495d8f7092
This commit is contained in:
taiki kimura
2023-04-26 11:08:00 +09:00
committed by Ai Hamano
parent 0becf595f4
commit 7eaf841525
28 changed files with 1234 additions and 1773 deletions

View File

@@ -32,6 +32,8 @@ domain_name = "Default"
user_domain_name = "Default"
project_domain_name = "Default"
VNFLCM_V2_VERSION = "2.0.0"
class Client(object):
@@ -55,82 +57,85 @@ class Client(object):
def create(self, req_body):
resp, body = self.client.do_request(
self.path, "POST", body=req_body, version="2.0.0")
self.path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def list(self, req_body):
if req_body is not None:
resp, body = self.client.do_request(
self.path, "GET", version="2.0.0", params=req_body)
self.path, "GET", version=VNFLCM_V2_VERSION, params=req_body)
else:
resp, body = self.client.do_request(
self.path, "GET", version="2.0.0")
self.path, "GET", version=VNFLCM_V2_VERSION)
self.print(resp, body)
def show(self, id):
resp, body = self.client.do_request(
self.path + '/' + id, "GET", version="2.0.0")
self.path + '/' + id, "GET", version=VNFLCM_V2_VERSION)
self.print(resp, body)
def delete(self, id):
resp, body = self.client.do_request(
self.path + '/' + id, "DELETE", version="2.0.0")
self.path + '/' + id, "DELETE", version=VNFLCM_V2_VERSION)
self.print(resp, body)
def update(self, id, req_body):
resp, body = self.client.do_request(
self.path + '/' + id, "PATCH", body=req_body, version="2.0.0")
resp, body = self.client.do_request(self.path + '/' + id,
"PATCH", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def inst(self, id, req_body):
path = self.path + '/' + id + '/instantiate'
resp, body = self.client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def term(self, id, req_body):
path = self.path + '/' + id + '/terminate'
resp, body = self.client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def scale(self, id, req_body):
path = self.path + '/' + id + '/scale'
resp, body = self.client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def heal(self, id, req_body):
path = self.path + '/' + id + '/heal'
resp, body = self.client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def chg_ext_conn(self, id, req_body):
path = self.path + '/' + id + '/change_ext_conn'
resp, body = self.client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def change_vnfpkg(self, id, req_body):
path = self.path + '/' + id + '/change_vnfpkg'
resp, body = self.client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
self.print(resp, body)
def retry(self, id):
path = self.path + '/' + id + '/retry'
resp, body = self.client.do_request(path, "POST", version="2.0.0")
resp, body = self.client.do_request(
path, "POST", version=VNFLCM_V2_VERSION)
self.print(resp, body)
def rollback(self, id):
path = self.path + '/' + id + '/rollback'
resp, body = self.client.do_request(path, "POST", version="2.0.0")
resp, body = self.client.do_request(
path, "POST", version=VNFLCM_V2_VERSION)
self.print(resp, body)
def fail(self, id):
path = self.path + '/' + id + '/fail'
resp, body = self.client.do_request(path, "POST", version="2.0.0")
resp, body = self.client.do_request(
path, "POST", version=VNFLCM_V2_VERSION)
self.print(resp, body)

View File

@@ -0,0 +1,433 @@
# Copyright (C) 2023 Nippon Telegraph and Telephone Corporation
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import shutil
import tempfile
import time
import urllib
import yaml
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import uuidutils
from tempest.lib import base
from tacker.sol_refactored.common import http_client
from tacker.sol_refactored import objects
from tacker.tests.functional.common.fake_server import FakeServerManager
from tacker.tests.functional.sol_v2_common import utils
from tacker.tests import utils as base_utils
from tacker import version
FAKE_SERVER_MANAGER = FakeServerManager()
MOCK_NOTIFY_CALLBACK_URL = '/notification/callback'
RETRY_WAIT_TIME = 3
VNF_PACKAGE_UPLOAD_TIMEOUT = 300
VNFLCM_V2_VERSION = "2.0.0"
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
class BaseTackerTestV2(base.BaseTestCase):
"""Base test case class for SOL v2 functional tests."""
@classmethod
def setUpClass(cls):
super(BaseTackerTestV2, cls).setUpClass()
FAKE_SERVER_MANAGER.prepare_http_server()
if getattr(cls, 'is_https', False):
FAKE_SERVER_MANAGER.set_https_server()
FAKE_SERVER_MANAGER.start_server()
cfg.CONF(args=['--config-file', '/etc/tacker/tacker.conf'],
project='tacker',
version=f'%%prog {version.version_info.release_string()}')
objects.register_all()
vim_info = cls.get_vim_info()
cls.auth_handle = http_client.KeystonePasswordAuthHandle(
auth_url=vim_info.interfaceInfo['endpoint'],
username=vim_info.accessInfo['username'],
password=vim_info.accessInfo['password'],
project_name=vim_info.accessInfo['project'],
user_domain_name=vim_info.accessInfo['userDomain'],
project_domain_name=vim_info.accessInfo['projectDomain']
)
cls.tacker_client = http_client.HttpClient(cls.auth_handle)
@classmethod
def tearDownClass(cls):
super(BaseTackerTestV2, cls).tearDownClass()
FAKE_SERVER_MANAGER.stop_server()
@classmethod
def get_vim_info(cls):
vim_params = yaml.safe_load(base_utils.read_file('local-vim.yaml'))
vim_params['auth_url'] = f"{vim_params['auth_url']}/v3"
vim_info = objects.VimConnectionInfo(
interfaceInfo={'endpoint': vim_params['auth_url']},
accessInfo={
'region': 'RegionOne',
'project': vim_params['project_name'],
'username': vim_params['username'],
'password': vim_params['password'],
'userDomain': vim_params['user_domain_name'],
'projectDomain': vim_params['project_domain_name']
}
)
return vim_info
def setUp(self):
super().setUp()
callback_url = os.path.join(
MOCK_NOTIFY_CALLBACK_URL,
self._testMethodName)
FAKE_SERVER_MANAGER.clear_history(callback_url)
FAKE_SERVER_MANAGER.set_callback('POST', callback_url, status_code=204)
FAKE_SERVER_MANAGER.set_callback('GET', callback_url, status_code=204)
def get_notify_callback_url(self):
return MOCK_NOTIFY_CALLBACK_URL
def get_server_port(self):
return FAKE_SERVER_MANAGER.SERVER_PORT
def set_server_callback(self, method, uri, **kwargs):
FAKE_SERVER_MANAGER.set_callback(method, uri, **kwargs)
@classmethod
def create_vnf_package(cls, sample_path, user_data={},
image_path=None, nfvo=False, userdata_path=None,
provider=None, namespace=None):
vnfd_id = uuidutils.generate_uuid()
tmp_dir = tempfile.mkdtemp()
utils.make_zip(sample_path, tmp_dir, vnfd_id, image_path,
userdata_path, provider, namespace)
zip_file_name = f"{os.path.basename(os.path.abspath(sample_path))}.zip"
zip_file_path = os.path.join(tmp_dir, zip_file_name)
if nfvo:
return zip_file_path, vnfd_id
path = "/vnfpkgm/v1/vnf_packages"
req_body = {'userDefinedData': user_data}
resp, body = cls.tacker_client.do_request(
path, "POST", expected_status=[201], body=req_body)
pkg_id = body['id']
with open(zip_file_path, 'rb') as fp:
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}/package_content"
resp, body = cls.tacker_client.do_request(
path, "PUT", body=fp, content_type='application/zip',
expected_status=[202])
# wait for onboard
timeout = VNF_PACKAGE_UPLOAD_TIMEOUT
start_time = int(time.time())
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}"
while True:
resp, body = cls.tacker_client.do_request(
path, "GET", expected_status=[200])
if body['onboardingState'] == "ONBOARDED":
break
if int(time.time()) - start_time > timeout:
raise Exception("Failed to onboard vnf package")
time.sleep(RETRY_WAIT_TIME)
shutil.rmtree(tmp_dir)
return pkg_id, vnfd_id
def get_vnf_package(self, pkg_id):
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}"
resp, body = self.tacker_client.do_request(path, "GET")
return body
@classmethod
def delete_vnf_package(cls, pkg_id):
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}"
req_body = {"operationalState": "DISABLED"}
resp, _ = cls.tacker_client.do_request(
path, "PATCH", body=req_body)
if resp.status_code != 200:
LOG.error("failed to set operationalState to DISABLED")
return
cls.tacker_client.do_request(path, "DELETE")
def create_vnf_instance(self, req_body):
path = "/vnflcm/v2/vnf_instances"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def instantiate_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/instantiate"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def terminate_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/terminate"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def heal_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/heal"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def delete_vnf_instance(self, inst_id):
path = f"/vnflcm/v2/vnf_instances/{inst_id}"
return self.tacker_client.do_request(
path, "DELETE", version=VNFLCM_V2_VERSION)
def show_vnf_instance(self, inst_id):
path = f"/vnflcm/v2/vnf_instances/{inst_id}"
return self.tacker_client.do_request(
path, "GET", version=VNFLCM_V2_VERSION)
def list_vnf_instance(self, filter_expr=None):
path = "/vnflcm/v2/vnf_instances"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version=VNFLCM_V2_VERSION)
def scale_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/scale"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def change_vnfpkg(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/change_vnfpkg"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def show_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
return self.tacker_client.do_request(
path, "GET", version=VNFLCM_V2_VERSION)
def list_lcmocc(self, filter_expr=None):
path = "/vnflcm/v2/vnf_lcm_op_occs"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version=VNFLCM_V2_VERSION)
def retry_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/retry"
return self.tacker_client.do_request(
path, "POST", version=VNFLCM_V2_VERSION)
def fail_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/fail"
return self.tacker_client.do_request(
path, "POST", version=VNFLCM_V2_VERSION)
def rollback_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/rollback"
return self.tacker_client.do_request(
path, "POST", version=VNFLCM_V2_VERSION)
def create_subscription(self, req_body):
path = "/vnflcm/v2/subscriptions"
return self.tacker_client.do_request(
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def delete_subscription(self, sub_id):
path = f"/vnflcm/v2/subscriptions/{sub_id}"
return self.tacker_client.do_request(
path, "DELETE", version=VNFLCM_V2_VERSION)
def show_subscription(self, sub_id):
path = f"/vnflcm/v2/subscriptions/{sub_id}"
return self.tacker_client.do_request(
path, "GET", version=VNFLCM_V2_VERSION)
def list_subscriptions(self, filter_expr=None):
path = "/vnflcm/v2/subscriptions"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version=VNFLCM_V2_VERSION)
def exec_lcm_operation(self, func, *args):
for _ in range(3):
resp, body = func(*args)
if resp.status_code == 409:
# may happen. there is a bit time between lcmocc become
# COMPLETED and lock of terminate is freed.
time.sleep(RETRY_WAIT_TIME)
else:
return resp, body
self.fail()
def wait_lcmocc_complete(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(RETRY_WAIT_TIME)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version=VNFLCM_V2_VERSION)
state = body['operationState']
if state == 'COMPLETED':
return
elif state in ['STARTING', 'PROCESSING']:
continue
else: # FAILED_TEMP or ROLLED_BACK
raise Exception(f"Operation failed. state: {state}")
def wait_lcmocc_failed_temp(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(RETRY_WAIT_TIME)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version=VNFLCM_V2_VERSION)
state = body['operationState']
if state == 'FAILED_TEMP':
return
elif state in ['STARTING', 'PROCESSING']:
continue
elif state == 'COMPLETED':
raise Exception("Operation unexpected COMPLETED.")
else: # ROLLED_BACK
raise Exception(f"Operation failed. state: {state}")
def wait_lcmocc_rolled_back(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(RETRY_WAIT_TIME)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version=VNFLCM_V2_VERSION)
state = body['operationState']
if state == 'ROLLED_BACK':
return
if state == 'ROLLING_BACK':
continue
raise Exception(f"Operation failed. state: {state}")
def put_fail_file(self, operation):
with open(f'/tmp/{operation}', 'w'):
pass
def rm_fail_file(self, operation):
os.remove(f'/tmp/{operation}')
def assert_notification_get(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
def _check_notification(self, callback_url, notify_type):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
self.assertEqual(notify_type, notify_mock_responses[0].request_body[
'notificationType'])
def _check_no_notification(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
self.assertEqual(0, len(notify_mock_responses))
def _get_crossing_direction(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
return notify_mock_responses[0].request_body['crossingDirection']
def prometheus_auto_scaling_alert(self, req_body):
path = "/alert/auto_scaling"
return self.tacker_client.do_request(
path, "POST", body=req_body)
def prometheus_auto_healing_alert(self, req_body):
path = "/alert/auto_healing"
return self.tacker_client.do_request(
path, "POST", body=req_body)
def check_resp_headers_in_create(self, resp):
# includes location header and response body
supported_headers = ['Version', 'Location', 'Content-Type',
'Accept-Ranges']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_operation_task(self, resp):
# includes location header and no response body
supported_headers = ['Version', 'Location']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_get(self, resp):
# includes a single data in response body and no location header
supported_headers = ['Version', 'Content-Type',
'Accept-Ranges']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_index(self, resp):
# includes some data in response body and no location header
supported_headers = ['Version', 'Content-Type',
'Accept-Ranges', 'Link']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_delete(self, resp):
# no location header and response body
supported_headers = ['Version']
self._check_resp_headers(resp, supported_headers)
def check_resp_body(self, body, expected_attrs):
for attr in expected_attrs:
if attr not in body:
raise Exception(f"Expected attribute doesn't exist: {attr}")
def _check_resp_headers(self, resp, supported_headers):
unsupported_headers = ['Retry-After',
'Content-Range', 'WWW-Authenticate']
for s in supported_headers:
if s not in resp.headers:
raise Exception(f"Supported header doesn't exist: {s}")
for u in unsupported_headers:
if u in resp.headers:
raise Exception(f"Unsupported header exist: {u}")
def check_package_usage(self, package_id, state='NOT_IN_USE',
is_nfvo=False):
if not is_nfvo:
usage_state = self.get_vnf_package(package_id)['usageState']
self.assertEqual(state, usage_state)

View File

@@ -21,12 +21,13 @@ from tacker.sol_refactored.common import http_client
from tacker.sol_refactored import objects
from tacker.tests.functional.sol_enhanced_policy.base import (
BaseEnhancedPolicyTest)
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common.test_vnflcm_basic_common import (
CommonVnfLcmTest)
from tacker.tests import utils as base_utils
WAIT_LCMOCC_UPDATE_TIME = 3
class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
@@ -335,7 +336,7 @@ class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
# wait a bit because there is a bit time lag between lcmocc DB
# update and instantiate completion.
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
def _step_lcm_show(self, username, inst_id, expected_status_code):
self.tacker_client = self.get_tk_http_client_by_user(username)
@@ -363,7 +364,7 @@ class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
if expected_status_code == 202:
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
def _step_lcm_update(self, username, inst_id, update_vnfd_id,
expected_status_code):
@@ -424,7 +425,7 @@ class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
# wait a bit because there is a bit time lag between lcmocc DB
# update and change_vnfpkg completion.
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
def _step_lcm_change_ext_conn(self, username, inst_id, area,
zone_name_list, expected_status_code):
@@ -490,7 +491,7 @@ class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
if expected_status_code == 202:
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
def _step_lcm_terminate(self, username, inst_id, expected_status_code):
self.tacker_client = self.get_tk_http_client_by_user(username)
@@ -502,23 +503,20 @@ class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
def _step_lcm_delete(self, username, inst_id, expected_status_code):
self.tacker_client = self.get_tk_http_client_by_user(username)
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance,
inst_id)
self.assertEqual(expected_status_code, resp.status_code)
def vnflcm_apis_v2_vnf_test_before_instantiate(self):
# Create subscription
self.tacker_client = self.get_tk_http_client_by_user('user_all')
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -530,7 +528,7 @@ class VnflcmAPIsV2VNFBase(CommonVnfLcmTest, BaseEnhancedPolicyTest):
# Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package
self._check_package_usage(False, self.vnf_pkg_a)
self.check_package_usage(self.vnf_pkg_a)
# step 1 LCM-CreateV2, Resource Group A / User Group A
inst_id_a = self._step_lcm_create('user_a', self.vnfd_id_a, 201)
@@ -820,10 +818,10 @@ class VnflcmAPIsV2VNFInstanceWithoutArea(VnflcmAPIsV2VNFBase):
# Create subscription
self.tacker_client = self.get_tk_http_client_by_user('user_all')
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -835,7 +833,7 @@ class VnflcmAPIsV2VNFInstanceWithoutArea(VnflcmAPIsV2VNFBase):
# Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package
self._check_package_usage(False, self.vnf_pkg_c)
self.check_package_usage(self.vnf_pkg_c)
# step 1 LCM-CreateV2, Resource Group C / User Group C
inst_id_c = self._step_lcm_create('user_c', self.vnfd_id_c, 201)

View File

@@ -26,6 +26,9 @@ from tacker.tests.functional.sol_kubernetes_v2.base_v2 import (
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
from tacker.tests import utils as base_utils
VNFLCM_V2_VERSION = "2.0.0"
WAIT_LCMOCC_UPDATE_TIME = 3
class VnflcmAPIsV2CNFBase(BaseVnfLcmKubernetesV2Test, BaseEnhancedPolicyTest):
@@ -245,7 +248,7 @@ class VnflcmAPIsV2CNFBase(BaseVnfLcmKubernetesV2Test, BaseEnhancedPolicyTest):
self.tacker_client = self.get_tk_http_client_by_user(username)
path = "/vnflcm/v2/vnf_instances"
resp, vnf_instances = self.tacker_client.do_request(
path, "GET", version="2.0.0")
path, "GET", version=VNFLCM_V2_VERSION)
self.assertEqual(200, resp.status_code)
inst_ids = set([inst.get('id') for inst in vnf_instances])
for inst_id in expected_inst_list:
@@ -377,7 +380,7 @@ class VnflcmAPIsV2CNFBase(BaseVnfLcmKubernetesV2Test, BaseEnhancedPolicyTest):
# wait a bit because there is a bit time lag between lcmocc DB
# update and change_vnfpkg completion.
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
def _step_lcm_update(self, username, inst_id,
expected_status_code):
@@ -387,7 +390,7 @@ class VnflcmAPIsV2CNFBase(BaseVnfLcmKubernetesV2Test, BaseEnhancedPolicyTest):
}
path = f"/vnflcm/v2/vnf_instances/{inst_id}"
resp, body = self.tacker_client.do_request(
path, "PATCH", body=update_req, version="2.0.0")
path, "PATCH", body=update_req, version=VNFLCM_V2_VERSION)
self.assertEqual(expected_status_code, resp.status_code)
if expected_status_code == 202:
lcmocc_id = os.path.basename(resp.headers['Location'])
@@ -439,14 +442,11 @@ class VnflcmAPIsV2CNFBase(BaseVnfLcmKubernetesV2Test, BaseEnhancedPolicyTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
def _step_lcm_delete(self, username, inst_id, expected_status_code):
self.tacker_client = self.get_tk_http_client_by_user(username)
# Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance,
inst_id)
self.assertEqual(expected_status_code, resp.status_code)
if expected_status_code == 204:
# check deletion of VNF instance

View File

@@ -24,11 +24,14 @@ from tacker.sol_refactored.common import config
from tacker.sol_refactored.conductor import conductor_rpc_v2
from tacker.tests.functional.sol_https_v2 import paramgen
from tacker.tests.functional.sol_separated_nfvo_v2 import fake_grant_v2
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
CONF = config.CONF
VNFFM_V1_VERSION = "1.3.0"
WAIT_NOTIFICATION_TIME = 5
WAIT_TEST_NOTIFICATION_TIME = 10
@ddt.ddt
class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
@@ -49,27 +52,17 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
def _create_fm_subscription(self, req_body):
path = "/vnffm/v1/subscriptions"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="1.3.0")
path, "POST", body=req_body, version=VNFFM_V1_VERSION)
def _delete_fm_subscription(self, sub_id):
path = "/vnffm/v1/subscriptions/{}".format(sub_id)
return self.tacker_client.do_request(
path, "DELETE", version="1.3.0")
path, "DELETE", version=VNFFM_V1_VERSION)
def _create_fm_alarm(self, req_body):
path = "/alert"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="1.3.0")
def _check_notification(self, callback_url, notify_type):
notify_mock_responses = base_v2.FAKE_SERVER_MANAGER.get_history(
callback_url)
base_v2.FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
self.assertEqual(notify_type, notify_mock_responses[0].request_body[
'notificationType'])
path, "POST", body=req_body, version=VNFFM_V1_VERSION)
def test_fm_notification_over_https_no_auth(self):
"""Test FM operations over https with no auth
@@ -95,11 +88,11 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
@@ -107,7 +100,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
zone_name_list = self.get_zone_list()
# 1. LCM-Create
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -125,10 +118,10 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 3. FM-Create-Subscription
expected_inst_attrs = ['id', 'callbackUri', '_links']
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_https_no_auth(callback_uri)
resp, body = self._create_fm_subscription(sub_req)
@@ -144,7 +137,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
ctx = context.get_admin_context()
alarm = paramgen.alarm(inst_id)
r.store_alarm_info(ctx, alarm)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmNotification')
# 5. FM-Delete-Subscription
@@ -160,10 +153,6 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -171,7 +160,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -202,11 +191,11 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
@@ -214,7 +203,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
zone_name_list = self.get_zone_list()
# 1. LCM-Create
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -234,10 +223,10 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 3. FM-Create-Subscription
expected_inst_attrs = ['id', 'callbackUri', '_links']
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_https_basic_auth(
callback_uri)
@@ -254,7 +243,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
ctx = context.get_admin_context()
alarm = paramgen.alarm(inst_id)
r.store_alarm_info(ctx, alarm)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmNotification')
# 5. FM-Delete-Subscription
@@ -270,10 +259,6 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -281,7 +266,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -312,11 +297,11 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
@@ -324,7 +309,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
zone_name_list = self.get_zone_list()
# 1. LCM-Create
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -345,10 +330,10 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 3. FM-Create-Subscription
expected_inst_attrs = ['id', 'callbackUri', '_links']
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_https_oauth2_auth(
callback_uri)
@@ -357,7 +342,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.check_resp_headers_in_create(resp)
sub_id = body['id']
self.check_resp_body(body, expected_inst_attrs)
time.sleep(10)
time.sleep(WAIT_TEST_NOTIFICATION_TIME)
# Test notification
self.assert_notification_get(callback_url)
@@ -366,7 +351,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
ctx = context.get_admin_context()
alarm = paramgen.alarm(inst_id)
r.store_alarm_info(ctx, alarm)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmNotification')
# 5. FM-Delete-Subscription
@@ -382,10 +367,6 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -393,7 +374,7 @@ class VnfFmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -15,15 +15,12 @@
import ddt
import os
import time
from tacker.sol_refactored.common import config
from tacker.objects import fields
from tacker.tests.functional.sol_https_v2 import paramgen
from tacker.tests.functional.sol_separated_nfvo_v2 import fake_grant_v2
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
CONF = config.CONF
@@ -68,12 +65,12 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
@@ -81,13 +78,13 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
# 1. LCM-Create-Subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_https_no_auth(callback_uri)
@@ -156,10 +153,6 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_name = "vnf-{}".format(inst_id)
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -169,7 +162,7 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -211,12 +204,12 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
@@ -224,13 +217,13 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
# 1. LCM-Create-Subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_https_basic_auth(callback_uri)
resp, body = self.create_subscription(sub_req)
@@ -297,10 +290,6 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_name = "vnf-{}".format(inst_id)
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -310,7 +299,7 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -352,12 +341,12 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
@@ -365,13 +354,13 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
# 1. LCM-Create-Subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_https_oauth2_auth(callback_uri)
resp, body = self.create_subscription(sub_req)
@@ -438,10 +427,6 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_name = "vnf-{}".format(inst_id)
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -451,7 +436,7 @@ class VnfLcmWithHttpsRequest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -23,11 +23,13 @@ from tacker.sol_refactored.common import config
from tacker.sol_refactored.conductor import conductor_rpc_v2
from tacker.tests.functional.sol_https_v2 import paramgen
from tacker.tests.functional.sol_separated_nfvo_v2 import fake_grant_v2
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
CONF = config.CONF
VNFPM_V2_VERSION = "2.1.0"
WAIT_NOTIFICATION_TIME = 5
@ddt.ddt
class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
@@ -45,7 +47,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
def setUp(self):
super(VnfPmWithHttpsRequestTest, self).setUp()
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'PUT', "/-/reload", status_code=202,
response_headers={"Content-Type": "text/plain"})
@@ -62,27 +64,17 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
def _create_pm_job(self, req_body):
path = "/vnfpm/v2/pm_jobs"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.1.0")
path, "POST", body=req_body, version=VNFPM_V2_VERSION)
def _create_pm_event(self, req_body):
path = "/pm_event"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.1.0")
def _check_notification(self, callback_url, notify_type):
notify_mock_responses = base_v2.FAKE_SERVER_MANAGER.get_history(
callback_url)
base_v2.FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
self.assertEqual(notify_type, notify_mock_responses[0].request_body[
'notificationType'])
path, "POST", body=req_body, version=VNFPM_V2_VERSION)
def _delete_pm_job(self, pm_job_id):
path = f"/vnfpm/v2/pm_jobs/{pm_job_id}"
return self.tacker_client.do_request(
path, "DELETE", version="2.1.0")
path, "DELETE", version=VNFPM_V2_VERSION)
def test_pm_notification_over_https_no_auth(self):
"""Test PM operations over https with no auth
@@ -107,23 +99,23 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
# 1. LCM-Create
self._set_grant_response(
True, 'INSTANTIATE', glance_image=glance_image,
flavour_vdu_dict=flavour_vdu_dict, zone_name_list=zone_name_list)
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -148,10 +140,10 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_job_https_no_auth(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -168,7 +160,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
ctx = context.get_admin_context()
entries = paramgen.entries(body, inst_id)
r.store_job_info(ctx, entries)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'PerformanceInformationAvailableNotification')
@@ -186,10 +178,6 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_name = "vnf-{}".format(inst_id)
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -199,7 +187,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -230,20 +218,20 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
# 1. LCM-Create
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -266,10 +254,10 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_job_https_basic_auth(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -286,7 +274,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
ctx = context.get_admin_context()
entries = paramgen.entries(body, inst_id)
r.store_job_info(ctx, entries)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'PerformanceInformationAvailableNotification')
@@ -303,10 +291,6 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_name = "vnf-{}".format(inst_id)
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -316,7 +300,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -348,23 +332,23 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
cur_dir = os.path.dirname(__file__)
basic_lcms_min_path = os.path.join(
cur_dir, "../sol_v2_common/samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(min_vnfd_id,
min_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
# 1. LCM-Create
self._set_grant_response(
True, 'INSTANTIATE', glance_image=glance_image,
flavour_vdu_dict=flavour_vdu_dict, zone_name_list=zone_name_list)
create_req = paramgen.create_vnf_min(vnfd_id_1)
create_req = paramgen.create_vnf_min(min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -384,10 +368,10 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('https://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_job_https_oauth2_auth(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -404,7 +388,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
ctx = context.get_admin_context()
entries = paramgen.entries(body, inst_id)
r.store_job_info(ctx, entries)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'PerformanceInformationAvailableNotification')
@@ -422,10 +406,6 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_name = "vnf-{}".format(inst_id)
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -435,7 +415,7 @@ class VnfPmWithHttpsRequestTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 7. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -16,7 +16,6 @@
import copy
import ddt
import os
import time
from tacker.tests.functional.sol_kubernetes_oidc_auth.vnflcm_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
@@ -33,14 +32,14 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
test_instantiate_cnf_resources_path = os.path.join(cur_dir,
"../../sol_kubernetes_v2/samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(VnfLcmKubernetesTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(VnfLcmKubernetesTest, self).setUp()
@@ -84,7 +83,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
'_links'
]
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -92,8 +91,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
vim_id = self.get_k8s_vim_id()
@@ -130,12 +128,8 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# 5. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -144,8 +138,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'NOT_IN_USE')
def test_instantiationV2_with_bad_oidc_auth_info(self):
"""Test CNF LCM v2 with bad OIDC auth
@@ -183,7 +176,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
'_links'
]
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -191,8 +184,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
k8s_vim_info = copy.deepcopy(self.k8s_vim_info)
@@ -251,5 +243,4 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2OidcTest):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'NOT_IN_USE')

View File

@@ -13,97 +13,35 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
import shutil
import tempfile
import time
import urllib
from oslo_config import cfg
from oslo_utils import uuidutils
from tempest.lib import base
import yaml
from tacker.sol_refactored.common import http_client
from tacker.sol_refactored import objects
from tacker.tests.functional.common.fake_server import FakeServerManager
from tacker.tests.functional.sol_v2_common import utils
from tacker.tests.functional import base_v2
from tacker.tests import utils as base_utils
from tacker import version
FAKE_SERVER_MANAGER = FakeServerManager()
MOCK_NOTIFY_CALLBACK_URL = '/notification/callback'
VNF_PACKAGE_UPLOAD_TIMEOUT = 300
VNF_INSTANTIATE_TIMEOUT = 600
VNF_TERMINATE_TIMEOUT = 600
RETRY_WAIT_TIME = 5
VNFPM_V2_VERSION = "2.1.0"
VNFFM_V1_VERSION = "1.3.0"
class BaseVnfLcmKubernetesV2Test(base.BaseTestCase):
class BaseVnfLcmKubernetesV2Test(base_v2.BaseTackerTestV2):
"""Base test case class for SOL v2 kubernetes functional tests."""
@classmethod
def setUpClass(cls):
super(BaseVnfLcmKubernetesV2Test, cls).setUpClass()
"""Base test case class for SOL v2 kubernetes functional tests."""
FAKE_SERVER_MANAGER.prepare_http_server()
FAKE_SERVER_MANAGER.start_server()
cfg.CONF(args=['--config-file', '/etc/tacker/tacker.conf'],
project='tacker',
version='%%prog %s' % version.version_info.release_string())
objects.register_all()
k8s_vim_info = cls.get_k8s_vim_info()
cls.auth_url = k8s_vim_info.interfaceInfo['endpoint']
cls.bearer_token = k8s_vim_info.accessInfo['bearer_token']
cls.ssl_ca_cert = k8s_vim_info.interfaceInfo['ssl_ca_cert']
vim_info = cls.get_vim_info()
auth = http_client.KeystonePasswordAuthHandle(
auth_url=vim_info.interfaceInfo['endpoint'],
username=vim_info.accessInfo['username'],
password=vim_info.accessInfo['password'],
project_name=vim_info.accessInfo['project'],
user_domain_name=vim_info.accessInfo['userDomain'],
project_domain_name=vim_info.accessInfo['projectDomain']
)
cls.tacker_client = http_client.HttpClient(auth)
cls.fake_prometheus_ip = cls.get_controller_tacker_ip()
@classmethod
def tearDownClass(cls):
super(BaseVnfLcmKubernetesV2Test, cls).tearDownClass()
FAKE_SERVER_MANAGER.stop_server()
def setUp(self):
super().setUp()
callback_url = os.path.join(
MOCK_NOTIFY_CALLBACK_URL,
self._testMethodName)
FAKE_SERVER_MANAGER.clear_history(callback_url)
FAKE_SERVER_MANAGER.set_callback('POST', callback_url, status_code=204)
FAKE_SERVER_MANAGER.set_callback('GET', callback_url, status_code=204)
@classmethod
def get_vim_info(cls):
vim_params = yaml.safe_load(base_utils.read_file('local-vim.yaml'))
vim_params['auth_url'] += '/v3'
vim_info = objects.VimConnectionInfo(
interfaceInfo={'endpoint': vim_params['auth_url']},
accessInfo={
'region': 'RegionOne',
'project': vim_params['project_name'],
'username': vim_params['username'],
'password': vim_params['password'],
'userDomain': vim_params['user_domain_name'],
'projectDomain': vim_params['project_domain_name']
}
)
return vim_info
@classmethod
def get_k8s_vim_info(cls):
@@ -138,46 +76,11 @@ class BaseVnfLcmKubernetesV2Test(base.BaseTestCase):
@classmethod
def create_vnf_package(cls, sample_path, user_data={}, image_path=None,
provider=None, namespace=None):
vnfd_id = uuidutils.generate_uuid()
tmp_dir = tempfile.mkdtemp()
utils.make_zip(sample_path, tmp_dir, vnfd_id, image_path,
provider=provider, namespace=namespace)
zip_file_name = os.path.basename(os.path.abspath(sample_path)) + ".zip"
zip_file_path = os.path.join(tmp_dir, zip_file_name)
path = "/vnfpkgm/v1/vnf_packages"
req_body = {'userDefinedData': user_data}
resp, body = cls.tacker_client.do_request(
path, "POST", expected_status=[201], body=req_body)
pkg_id = body['id']
with open(zip_file_path, 'rb') as fp:
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}/package_content"
resp, body = cls.tacker_client.do_request(
path, "PUT", body=fp, content_type='application/zip',
expected_status=[202])
# wait for onboard
timeout = VNF_PACKAGE_UPLOAD_TIMEOUT
start_time = int(time.time())
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}"
while True:
resp, body = cls.tacker_client.do_request(
path, "GET", expected_status=[200])
if body['onboardingState'] == "ONBOARDED":
break
if ((int(time.time()) - start_time) > timeout):
raise Exception("Failed to onboard vnf package")
time.sleep(5)
shutil.rmtree(tmp_dir)
return pkg_id, vnfd_id
return super().create_vnf_package(sample_path, user_data=user_data,
image_path=image_path,
provider=provider,
namespace=namespace)
@classmethod
def get_controller_tacker_ip(cls):
@@ -190,330 +93,121 @@ class BaseVnfLcmKubernetesV2Test(base.BaseTestCase):
'http://')[1].split('"')[0]
return ip
def assert_notification_get(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
def _check_notification(self, callback_url, notify_type):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
self.assertEqual(notify_type, notify_mock_responses[0].request_body[
'notificationType'])
def _check_no_notification(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
self.assertEqual(0, len(notify_mock_responses))
def _get_crossing_direction(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
return notify_mock_responses[0].request_body['crossingDirection']
@classmethod
def delete_vnf_package(cls, pkg_id):
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}"
req_body = {"operationalState": "DISABLED"}
resp, _ = cls.tacker_client.do_request(
path, "PATCH", body=req_body)
if resp.status_code != 200:
print("failed to set operationalState to DISABLED")
return
cls.tacker_client.do_request(path, "DELETE")
def list_vims(self):
path = "/v1.0/vims.json"
resp, body = self.tacker_client.do_request(path, "GET")
return body
def get_vnf_package(self, pkg_id):
path = f"/vnfpkgm/v1/vnf_packages/{pkg_id}"
resp, body = self.tacker_client.do_request(path, "GET")
return body
def create_vnf_instance(self, req_body):
path = "/vnflcm/v2/vnf_instances"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def delete_vnf_instance(self, inst_id):
path = f"/vnflcm/v2/vnf_instances/{inst_id}"
return self.tacker_client.do_request(
path, "DELETE", version="2.0.0")
def show_vnf_instance(self, inst_id):
path = f"/vnflcm/v2/vnf_instances/{inst_id}"
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def instantiate_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/instantiate"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def scale_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/scale"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def heal_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/heal"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def change_vnfpkg(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/change_vnfpkg"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def terminate_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/terminate"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def rollback_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/rollback"
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def retry_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/retry"
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def fail_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/fail"
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def show_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def list_lcmocc(self, filter_expr=None):
path = "/vnflcm/v2/vnf_lcm_op_occs"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def create_subscription(self, req_body):
def create_fm_subscription(self, req_body):
path = "/vnffm/v1/subscriptions"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="1.3.0")
path, "POST", body=req_body, version=VNFFM_V1_VERSION)
def list_subscriptions(self, filter_expr=None):
def list_fm_subscriptions(self, filter_expr=None):
path = "/vnffm/v1/subscriptions"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="1.3.0")
path, "GET", version=VNFFM_V1_VERSION)
def show_subscription(self, subscription_id):
def show_fm_subscription(self, subscription_id):
path = f"/vnffm/v1/subscriptions/{subscription_id}"
return self.tacker_client.do_request(
path, "GET", version="1.3.0")
path, "GET", version=VNFFM_V1_VERSION)
def delete_subscription(self, subscription_id):
def delete_fm_subscription(self, subscription_id):
path = f"/vnffm/v1/subscriptions/{subscription_id}"
return self.tacker_client.do_request(
path, "DELETE", version="1.3.0")
path, "DELETE", version=VNFFM_V1_VERSION)
def create_fm_alarm(self, req_body):
path = "/alert"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="1.3.0")
path, "POST", body=req_body, version=VNFFM_V1_VERSION)
def list_fm_alarm(self, filter_expr=None):
path = "/vnffm/v1/alarms"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="1.3.0")
path, "GET", version=VNFFM_V1_VERSION)
def show_fm_alarm(self, alarm_id):
path = f"/vnffm/v1/alarms/{alarm_id}"
return self.tacker_client.do_request(
path, "GET", version="1.3.0")
path, "GET", version=VNFFM_V1_VERSION)
def update_fm_alarm(self, alarm_id, req_body):
path = f"/vnffm/v1/alarms/{alarm_id}"
return self.tacker_client.do_request(
path, "PATCH", body=req_body, version="1.3.0")
path, "PATCH", body=req_body, version=VNFFM_V1_VERSION)
def create_pm_job(self, req_body):
path = "/vnfpm/v2/pm_jobs"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.1.0")
path, "POST", body=req_body, version=VNFPM_V2_VERSION)
def update_pm_job(self, pm_job_id, req_body):
path = f"/vnfpm/v2/pm_jobs/{pm_job_id}"
return self.tacker_client.do_request(
path, "PATCH", body=req_body, version="2.1.0")
path, "PATCH", body=req_body, version=VNFPM_V2_VERSION)
def create_pm_event(self, req_body):
path = "/pm_event"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.1.0")
path, "POST", body=req_body, version=VNFPM_V2_VERSION)
def list_pm_job(self, filter_expr=None):
path = "/vnfpm/v2/pm_jobs"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="2.1.0")
path, "GET", version=VNFPM_V2_VERSION)
def show_pm_job(self, pm_job_id):
path = f"/vnfpm/v2/pm_jobs/{pm_job_id}"
return self.tacker_client.do_request(
path, "GET", version="2.1.0")
path, "GET", version=VNFPM_V2_VERSION)
def show_pm_job_report(self, pm_job_id, report_id):
path = f"/vnfpm/v2/pm_jobs/{pm_job_id}/reports/{report_id}"
return self.tacker_client.do_request(
path, "GET", version="2.1.0")
path, "GET", version=VNFPM_V2_VERSION)
def delete_pm_job(self, pm_job_id):
path = f"/vnfpm/v2/pm_jobs/{pm_job_id}"
return self.tacker_client.do_request(
path, "DELETE", version="2.1.0")
path, "DELETE", version=VNFPM_V2_VERSION)
def create_pm_threshold(self, req_body):
path = "/vnfpm/v2/thresholds"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.1.0")
path, "POST", body=req_body, version=VNFPM_V2_VERSION)
def update_pm_threshold(self, pm_threshold_id, req_body):
path = f"/vnfpm/v2/thresholds/{pm_threshold_id}"
return self.tacker_client.do_request(
path, "PATCH", body=req_body, version="2.1.0",
path, "PATCH", body=req_body, version=VNFPM_V2_VERSION,
content_type="application/mergepatch+json")
def pm_threshold(self, req_body):
path = "/pm_threshold"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.1.0")
path, "POST", body=req_body, version=VNFPM_V2_VERSION)
def list_pm_threshold(self, filter_expr=None):
path = "/vnfpm/v2/thresholds"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="2.1.0")
path, "GET", version=VNFPM_V2_VERSION)
def show_pm_threshold(self, pm_threshold_id):
path = f"/vnfpm/v2/thresholds/{pm_threshold_id}"
return self.tacker_client.do_request(
path, "GET", version="2.1.0")
path, "GET", version=VNFPM_V2_VERSION)
def delete_pm_threshold(self, pm_threshold_id):
path = f"/vnfpm/v2/thresholds/{pm_threshold_id}"
return self.tacker_client.do_request(
path, "DELETE", version="2.1.0")
def prometheus_auto_scaling_alert(self, req_body):
path = "/alert/auto_scaling"
return self.tacker_client.do_request(
path, "POST", body=req_body)
def prometheus_auto_healing_alert(self, req_body):
path = "/alert/auto_healing"
return self.tacker_client.do_request(
path, "POST", body=req_body)
def _check_resp_headers(self, resp, supported_headers):
unsupported_headers = ['Link', 'Retry-After',
'Content-Range', 'WWW-Authenticate']
for s in supported_headers:
if s not in resp.headers:
raise Exception("Supported header doesn't exist: %s" % s)
for u in unsupported_headers:
if u in resp.headers:
raise Exception("Unsupported header exist: %s" % u)
def check_resp_headers_in_create(self, resp):
# includes location header and response body
supported_headers = ['Version', 'Location', 'Content-Type',
'Accept-Ranges']
self._check_resp_headers(resp, supported_headers)
def check_resp_body(self, body, expected_attrs):
for attr in expected_attrs:
if attr not in body:
raise Exception("Expected attribute doesn't exist: %s" % attr)
def check_resp_headers_in_operation_task(self, resp):
# includes location header and no response body
supported_headers = ['Version', 'Location']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_get(self, resp):
# includes response body and no location header
supported_headers = ['Version', 'Content-Type',
'Accept-Ranges']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_delete(self, resp):
# no location header and response body
supported_headers = ['Version']
self._check_resp_headers(resp, supported_headers)
def wait_lcmocc_complete(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(5)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version="2.0.0")
state = body['operationState']
if state == 'COMPLETED':
return
elif state in ['STARTING', 'PROCESSING']:
continue
else: # FAILED_TEMP or ROLLED_BACK
raise Exception("Operation failed. state: %s" % state)
def wait_lcmocc_failed_temp(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(5)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version="2.0.0")
state = body['operationState']
if state == 'FAILED_TEMP':
return
elif state in ['STARTING', 'PROCESSING']:
continue
elif state == 'COMPLETED':
raise Exception("Operation unexpected COMPLETED.")
else: # ROLLED_BACK
raise Exception("Operation failed. state: %s" % state)
def wait_lcmocc_rolled_back(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(5)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version="2.0.0")
state = body['operationState']
if state == 'ROLLED_BACK':
return
if state in ['ROLLING_BACK']:
continue
raise Exception(f"Operation failed. state: {state}")
path, "DELETE", version=VNFPM_V2_VERSION)

View File

@@ -19,6 +19,8 @@ import time
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
WAIT_LCMOCC_UPDATE_TIME = 3
class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
@@ -30,20 +32,20 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.old_pkg, cls.old_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
test_change_vnf_pkg_with_deployment_path = os.path.join(
cur_dir, "samples/test_change_vnf_pkg_with_deployment")
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.new_pkg, cls.new_vnfd_id = cls.create_vnf_package(
test_change_vnf_pkg_with_deployment_path)
@classmethod
def tearDownClass(cls):
super(VnfLcmKubernetesChangeVnfpkgTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.old_pkg)
cls.delete_vnf_package(cls.new_pkg)
def setUp(self):
super(VnfLcmKubernetesChangeVnfpkgTest, self).setUp()
@@ -83,7 +85,7 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
'_links'
]
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.old_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -91,8 +93,7 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.old_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
instantiate_req = paramgen.change_vnfpkg_instantiate(
@@ -121,21 +122,20 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(2, len(before_resource_ids))
# 4. Change Current VNF Package
change_vnfpkg_req = paramgen.change_vnfpkg(self.vnfd_id_2)
change_vnfpkg_req = paramgen.change_vnfpkg(self.new_vnfd_id)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.old_pkg, 'NOT_IN_USE')
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2).get('usageState')
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.new_pkg, 'IN_USE')
# 5. Show VNF instance
additional_inst_attrs = [
@@ -163,12 +163,8 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 7. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -177,8 +173,7 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.new_pkg, 'NOT_IN_USE')
def test_change_vnfpkg_failed_and_rollback(self):
"""Test LCM operations error handing
@@ -216,7 +211,7 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
'_links'
]
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.old_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -224,8 +219,7 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.old_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
instantiate_req = paramgen.change_vnfpkg_instantiate(
@@ -253,7 +247,7 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
for vnfc_info in vnfc_resource_infos]
# 4. Change Current VNF Package (will fail)
change_vnfpkg_req = paramgen.change_vnfpkg_error(self.vnfd_id_2)
change_vnfpkg_req = paramgen.change_vnfpkg_error(self.new_vnfd_id)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -292,12 +286,8 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 8. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -306,5 +296,4 @@ class VnfLcmKubernetesChangeVnfpkgTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.new_pkg, 'NOT_IN_USE')

View File

@@ -19,6 +19,8 @@ import time
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
WAIT_LCMOCC_UPDATE_TIME = 3
class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
@@ -30,12 +32,12 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_helm_instantiate_path = os.path.join(
cur_dir, "samples/test_helm_instantiate")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.helm_pkg, cls.helm_vnfd_id = cls.create_vnf_package(
test_helm_instantiate_path)
test_helm_change_vnf_pkg_path = os.path.join(
cur_dir, "samples/test_helm_change_vnf_pkg")
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.new_pkg, cls.new_vnfd_id = cls.create_vnf_package(
test_helm_change_vnf_pkg_path)
cls.helm_vim_id = cls.get_k8s_vim_id(use_helm=True)
@@ -43,8 +45,8 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
def tearDownClass(cls):
super(VnfLcmHelmTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.helm_pkg)
cls.delete_vnf_package(cls.new_pkg)
def setUp(self):
super(VnfLcmHelmTest, self).setUp()
@@ -96,7 +98,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
'_links'
]
create_req = paramgen.test_helm_instantiate_create(
self.vnfd_id_1)
self.helm_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -104,8 +106,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.helm_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
if not use_register_vim:
@@ -217,21 +218,20 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
vnfc_resource_infos = body['instantiatedVnfInfo']['vnfcResourceInfo']
before_vdu2_ids = [vnfc_info['id'] for vnfc_info in vnfc_resource_infos
if vnfc_info['vduId'] == 'VDU2']
change_vnfpkg_req = paramgen.helm_change_vnfpkg(self.vnfd_id_2)
change_vnfpkg_req = paramgen.helm_change_vnfpkg(self.new_vnfd_id)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
time.sleep(3)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.helm_pkg, 'NOT_IN_USE')
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2).get('usageState')
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.new_pkg, 'IN_USE')
# 11. Show VNF instance
additional_inst_attrs = [
@@ -259,12 +259,8 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 13. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -273,15 +269,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
def _put_fail_file(self, operation):
with open(f'/tmp/{operation}', 'w'):
pass
def _rm_fail_file(self, operation):
os.remove(f'/tmp/{operation}')
self.check_package_usage(self.helm_pkg, 'NOT_IN_USE')
def test_instantiate_rollback(self):
"""Test LCM operations with all attributes set
@@ -298,14 +286,14 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. Create a new VNF instance resource
create_req = paramgen.test_helm_instantiate_create(
self.vnfd_id_1)
self.helm_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
inst_id = body['id']
# 2. Instantiate a VNF instance => FAILED_TEMP
self._put_fail_file('instantiate_end')
self.put_fail_file('instantiate_end')
instantiate_req = paramgen.helm_instantiate(
self.auth_url, self.bearer_token, self.ssl_ca_cert)
resp, body = self.instantiate_vnf_instance(inst_id, instantiate_req)
@@ -314,7 +302,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('instantiate_end')
self.rm_fail_file('instantiate_end')
# 3. Show VNF instance
resp, body = self.show_vnf_instance(inst_id)
@@ -355,7 +343,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. Create a new VNF instance resource
create_req = paramgen.test_helm_instantiate_create(
self.vnfd_id_1)
self.helm_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -382,7 +370,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(1, len(vdu2_ids_0))
# 4. Scale out a VNF instance => FAILED_TEMP
self._put_fail_file('scale_end')
self.put_fail_file('scale_end')
scale_out_req = paramgen.helm_scale_out()
resp, body = self.scale_vnf_instance(inst_id, scale_out_req)
self.assertEqual(202, resp.status_code)
@@ -390,7 +378,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('scale_end')
self.rm_fail_file('scale_end')
# 5. Rollback scale out
resp, body = self.rollback_lcmocc(lcmocc_id)
@@ -416,12 +404,8 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 8. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -461,7 +445,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
'_links'
]
create_req = paramgen.test_helm_instantiate_create(
self.vnfd_id_1)
self.helm_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -469,8 +453,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.helm_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
instantiate_req = paramgen.helm_instantiate(
@@ -499,7 +482,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 4. Change Current VNF Package => FAILED_TEMP
change_vnfpkg_req = paramgen.helm_error_handling_change_vnfpkg(
self.vnfd_id_2)
self.new_vnfd_id)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -514,8 +497,7 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.wait_lcmocc_rolled_back(lcmocc_id)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.new_pkg, 'NOT_IN_USE')
# 6. Show VNF instance
additional_inst_attrs = [
@@ -542,12 +524,8 @@ class VnfLcmHelmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 8. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -38,14 +38,14 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(PromAutoScaleHealTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(PromAutoScaleHealTest, self).setUp()
@@ -69,7 +69,8 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
"""
# 1. LCM-Create: Create a new VNF instance resource
create_req = paramgen.instantiate_cnf_resources_create(self.vnfd_id_1)
create_req = paramgen.instantiate_cnf_resources_create(
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -95,8 +96,9 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 4-5. Send alert and auto heal
affected_vnfcs = body['resourceChanges']['affectedVnfcs']
vnfc_info_id = (affected_vnfcs[0]['vduId'] + '-'
+ affected_vnfcs[0]['id'])
vnfc_info_id = (f"{affected_vnfcs[0]['vduId']}-"
f"{affected_vnfcs[0]['id']}")
alert = paramgen.prometheus_auto_healing_alert(inst_id, vnfc_info_id)
resp, body = self.prometheus_auto_healing_alert(alert)
self.assertEqual(204, resp.status_code)
@@ -134,8 +136,8 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
if vnfc['changeType'] == 'REMOVED']
self.assertEqual(1, len(removed_vnfcs))
removed_vnfc_info_id = (affected_vnfcs[0]['vduId'] + '-'
+ affected_vnfcs[0]['id'])
removed_vnfc_info_id = (f"{affected_vnfcs[0]['vduId']}-"
f"{affected_vnfcs[0]['id']}")
self.assertEqual(vnfc_info_id, removed_vnfc_info_id)
# 7. Send alert
@@ -190,8 +192,8 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(2, len(removed_vnfcs))
removed_vnfc_info_ids = [
removed_vnfcs[0]['vduId'] + '-' + removed_vnfcs[0]['id'],
removed_vnfcs[1]['vduId'] + '-' + removed_vnfcs[1]['id']
f"{removed_vnfcs[0]['vduId']}-{removed_vnfcs[0]['id']}",
f"{removed_vnfcs[1]['vduId']}-{removed_vnfcs[1]['id']}"
]
self.assertCountEqual(
[vnfc_info_id_1, vnfc_info_id_2], removed_vnfc_info_ids)
@@ -204,10 +206,6 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# 12. LCM-Show-OpOccV2: Show OpOcc
resp, body = self.show_lcmocc(lcmocc_id)
self.assertEqual(200, resp.status_code)
@@ -215,7 +213,7 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual('TERMINATE', body['operation'])
# 13. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -240,7 +238,8 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
"""
# 1. LCM-Create: Create a new VNF instance resource
create_req = paramgen.instantiate_cnf_resources_create(self.vnfd_id_1)
create_req = paramgen.instantiate_cnf_resources_create(
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -336,10 +335,6 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# 11. LCM-Show-OpOccV2: Show OpOcc
resp, body = self.show_lcmocc(lcmocc_id)
self.assertEqual(200, resp.status_code)
@@ -347,7 +342,7 @@ class PromAutoScaleHealTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual('TERMINATE', body['operation'])
# 12. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance

View File

@@ -17,11 +17,10 @@ import os
import time
from tacker.objects import fields
from tacker.tests.functional.common.fake_server import FakeServerManager
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
FAKE_SERVER_MANAGER = FakeServerManager()
WAIT_CREATE_THRESHOLD_TIME = 5
@ddt.ddt
@@ -35,19 +34,18 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(VnfPmThresholdTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(VnfPmThresholdTest, self).setUp()
base_v2.FAKE_SERVER_MANAGER.set_callback(
'PUT', "/-/reload",
status_code=202,
self.set_server_callback(
'PUT', "/-/reload", status_code=202,
response_headers={"Content-Type": "text/plain"})
def test_pm_threshold_autoscaling_min(self):
@@ -109,7 +107,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
"""
# 1. LCM-Create: Create a new VNF instance resource
create_req = paramgen.pm_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -138,10 +136,10 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_threshold_min(
callback_uri, inst_id, self.fake_prometheus_ip
@@ -160,7 +158,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -206,7 +204,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -235,7 +233,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -264,7 +262,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -293,10 +291,6 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -305,7 +299,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 13. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -375,7 +369,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.pm_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -404,10 +398,10 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_threshold_max(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -425,7 +419,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -472,7 +466,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -502,7 +496,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -532,7 +526,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -561,10 +555,6 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -574,14 +564,14 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
# 13. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(404, resp.status_code)
def test_pm_threshold_with_all_attibutes(self):
def test_pm_threshold_with_all_attributes(self):
"""Test PM Threshold operations with all attributes set
* About attributes:
@@ -632,7 +622,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.pm_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -660,10 +650,10 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_threshold_max(
callback_uri, inst_id, self.fake_prometheus_ip
@@ -680,9 +670,9 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
sub_req = paramgen.pm_threshold(pm_threshold_id_5, inst_id)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(5)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('UP', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -694,9 +684,9 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(5)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self._check_no_notification(callback_url)
# 6. PM-Threshold 5-3
@@ -706,9 +696,9 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(5)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self._check_no_notification(callback_url)
# 7. PM-Threshold 5-4
@@ -718,9 +708,9 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(5)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self._check_no_notification(callback_url)
# 8. PM-Threshold 5-5
@@ -730,9 +720,9 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(5)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self.assertEqual('DOWN', self._get_crossing_direction(callback_url))
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -744,9 +734,9 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(5)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(WAIT_CREATE_THRESHOLD_TIME)
self._check_no_notification(callback_url)
resp, body = self.delete_pm_threshold(pm_threshold_id_5)
@@ -761,10 +751,6 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -774,7 +760,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
)
# 11. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance

View File

@@ -20,6 +20,8 @@ from tacker.objects import fields
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
WAIT_NOTIFICATION_TIME = 5
@ddt.ddt
class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
@@ -32,14 +34,14 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(VnfFmTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(VnfFmTest, self).setUp()
@@ -77,7 +79,8 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. LCM-Create: Create a new VNF instance resource
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.instantiate_cnf_resources_create(self.vnfd_id_1)
create_req = paramgen.instantiate_cnf_resources_create(
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -103,33 +106,33 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 3. FM-Create-Subscription: Create a new subscription
expected_inst_attrs = ['id', 'callbackUri', '_links']
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
resp, body = self.create_subscription(sub_req)
resp, body = self.create_fm_subscription(sub_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
sub_id = body['id']
self.check_resp_body(body, expected_inst_attrs)
# Test notification
self.assert_notification_get(callback_url)
self.addCleanup(self.delete_subscription, sub_id)
self.addCleanup(self.delete_fm_subscription, sub_id)
# 4. FM-List-Subscription: List subscription with attribute-based
# filtering
expected_attrs = ['id', 'callbackUri', '_links']
resp, body = self.list_subscriptions()
resp, body = self.list_fm_subscriptions()
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
for sbsc in body:
self.check_resp_body(sbsc, expected_attrs)
# 5. FM-Show-Subscription: Show subscription
resp, body = self.show_subscription(sub_id)
resp, body = self.show_fm_subscription(sub_id)
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
self.check_resp_body(body, expected_attrs)
@@ -138,7 +141,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
alert = paramgen.alert_event_firing(inst_id, pod_name)
resp, body = self.create_fm_alarm(alert)
self.assertEqual(204, resp.status_code)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmNotification')
# 7. FM-List-Alarm
@@ -201,7 +204,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
alert = paramgen.alert_event_resolved(inst_id, pod_name)
resp, body = self.create_fm_alarm(alert)
self.assertEqual(204, resp.status_code)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmClearedNotification')
# 12. FM-Show-Alarm
@@ -211,7 +214,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.check_resp_body(body, alarm_expected_attrs)
# 13. FM-Delete-Subscription: Delete subscription
resp, body = self.delete_subscription(sub_id)
resp, body = self.delete_fm_subscription(sub_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -223,10 +226,6 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -234,7 +233,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 15. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -274,7 +273,8 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. LCM-Create: Create a new VNF instance resource
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.instantiate_cnf_resources_create(self.vnfd_id_1)
create_req = paramgen.instantiate_cnf_resources_create(
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -300,14 +300,14 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 3. FM-Create-Subscription: Create a new subscription
expected_inst_attrs = ['id', 'callbackUri', '_links', 'filter']
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(
callback_uri, self.vnfd_id_1, inst_id)
resp, body = self.create_subscription(sub_req)
callback_uri, self.cnf_vnfd_id, inst_id)
resp, body = self.create_fm_subscription(sub_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
sub_id = body['id']
@@ -321,14 +321,14 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
filter_expr = {
'filter': f'(eq,id,{sub_id})'
}
resp, body = self.list_subscriptions(filter_expr)
resp, body = self.list_fm_subscriptions(filter_expr)
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
for sbsc in body:
self.check_resp_body(sbsc, expected_attrs)
# 5. FM-Show-Subscription: Show subscription
resp, body = self.show_subscription(sub_id)
resp, body = self.show_fm_subscription(sub_id)
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
self.check_resp_body(body, expected_attrs)
@@ -337,7 +337,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
alert = paramgen.alert_event_firing(inst_id, pod_name)
resp, body = self.create_fm_alarm(alert)
self.assertEqual(204, resp.status_code)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmNotification')
# 7. FM-List-Alarm
@@ -399,7 +399,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
alert = paramgen.alert_event_resolved(inst_id, pod_name)
resp, body = self.create_fm_alarm(alert)
self.assertEqual(204, resp.status_code)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(callback_url, 'AlarmClearedNotification')
# 12. FM-Show-Alarm
@@ -409,7 +409,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.check_resp_body(body, alarm_expected_attrs)
# 13. FM-Delete-Subscription: Delete subscription
resp, body = self.delete_subscription(sub_id)
resp, body = self.delete_fm_subscription(sub_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -421,10 +421,6 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -432,7 +428,7 @@ class VnfFmTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 15. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance

View File

@@ -15,7 +15,6 @@
import ddt
import os
import time
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
@@ -32,14 +31,14 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(VnfLcmKubernetesTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(VnfLcmKubernetesTest, self).setUp()
@@ -91,7 +90,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
'_links'
]
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -99,8 +98,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
instantiate_req = paramgen.max_sample_instantiate(
@@ -225,12 +223,8 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 11. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -239,8 +233,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'NOT_IN_USE')
def test_basic_lcms_min(self):
"""Test LCM operations with all attributes set
@@ -281,7 +274,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
'_links'
]
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -289,8 +282,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.cnf_pkg, 'IN_USE')
# 2. Instantiate a VNF instance
vim_id = self.get_k8s_vim_id()
@@ -327,12 +319,8 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 5. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -341,15 +329,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1).get('usageState')
self.assertEqual('NOT_IN_USE', usage_state)
def _put_fail_file(self, operation):
with open(f'/tmp/{operation}', 'w'):
pass
def _rm_fail_file(self, operation):
os.remove(f'/tmp/{operation}')
self.check_package_usage(self.cnf_pkg, 'NOT_IN_USE')
def test_instantiate_rollback(self):
"""Test LCM operations with all attributes set
@@ -366,14 +346,14 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. Create a new VNF instance resource
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
inst_id = body['id']
# 2. Instantiate a VNF instance
self._put_fail_file('instantiate_end')
self.put_fail_file('instantiate_end')
instantiate_req = paramgen.error_handling_instantiate(
self.auth_url, self.bearer_token)
resp, body = self.instantiate_vnf_instance(inst_id, instantiate_req)
@@ -382,7 +362,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('instantiate_end')
self.rm_fail_file('instantiate_end')
# 3. Show VNF instance
resp, body = self.show_vnf_instance(inst_id)
@@ -423,7 +403,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. Create a new VNF instance resource
create_req = paramgen.test_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -450,7 +430,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
self.assertEqual(2, len(vdu2_ids_0))
# 4. Scale out a VNF instance
self._put_fail_file('scale_end')
self.put_fail_file('scale_end')
scale_out_req = paramgen.error_handling_scale_out()
resp, body = self.scale_vnf_instance(inst_id, scale_out_req)
self.assertEqual(202, resp.status_code)
@@ -458,7 +438,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('scale_end')
self.rm_fail_file('scale_end')
# 5. Rollback instantiate
resp, body = self.rollback_lcmocc(lcmocc_id)
@@ -484,11 +464,7 @@ class VnfLcmKubernetesTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(3)
# 8. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -20,6 +20,8 @@ from tacker.objects import fields
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
WAIT_NOTIFICATION_TIME = 5
@ddt.ddt
class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
@@ -32,17 +34,17 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(VnfPmTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(VnfPmTest, self).setUp()
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'PUT', "/-/reload", status_code=202,
response_headers={"Content-Type": "text/plain"})
@@ -75,7 +77,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.pm_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -100,10 +102,10 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_job_min(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -116,16 +118,14 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
pm_job_id = body.get('id')
# 4. PMJob-Update
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_url = callback_url + '_1'
callback_url = f"{callback_url}_1"
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
base_v2.FAKE_SERVER_MANAGER.set_callback(
'GET', callback_url, status_code=204)
base_v2.FAKE_SERVER_MANAGER.set_callback(
'POST', callback_url, status_code=204)
self.set_server_callback('GET', callback_url, status_code=204)
self.set_server_callback('POST', callback_url, status_code=204)
update_req = paramgen.update_pm_job(callback_uri)
resp, body = self.update_pm_job(pm_job_id, update_req)
self.assertEqual(200, resp.status_code)
@@ -137,7 +137,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
sub_req = paramgen.pm_event(pm_job_id, inst_id)
resp, body = self.create_pm_event(sub_req)
self.assertEqual(204, resp.status_code)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'PerformanceInformationAvailableNotification')
@@ -177,10 +177,6 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -188,7 +184,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 11. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -223,7 +219,8 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. LCM-Create: Create a new VNF instance resource
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.instantiate_cnf_resources_create(self.vnfd_id_1)
create_req = paramgen.instantiate_cnf_resources_create(
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -248,10 +245,10 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_job_max(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -264,16 +261,14 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
pm_job_id = body.get('id')
# 4. PMJob-Update
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_url = callback_url + '_1'
callback_url = f"{callback_url}_1"
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
base_v2.FAKE_SERVER_MANAGER.set_callback(
'GET', callback_url, status_code=204)
base_v2.FAKE_SERVER_MANAGER.set_callback(
'POST', callback_url, status_code=204)
self.set_server_callback('GET', callback_url, status_code=204)
self.set_server_callback('POST', callback_url, status_code=204)
update_req = paramgen.update_pm_job(callback_uri)
resp, body = self.update_pm_job(pm_job_id, update_req)
self.assertEqual(200, resp.status_code)
@@ -285,7 +280,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
sub_req = paramgen.pm_event(pm_job_id, inst_id)
resp, body = self.create_pm_event(sub_req)
self.assertEqual(204, resp.status_code)
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'PerformanceInformationAvailableNotification')
@@ -326,10 +321,6 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -337,7 +328,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 11. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -359,7 +350,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
"""
# 1. LCM-Create: Create a new VNF instance resource
create_req = paramgen.pm_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -387,10 +378,10 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
pm_job_list = paramgen.pm_job_external(
callback_uri, inst_id, self.fake_prometheus_ip, rsc)
@@ -417,10 +408,6 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -428,7 +415,7 @@ class VnfPmTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 6. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance

View File

@@ -20,6 +20,8 @@ from tacker.objects import fields
from tacker.tests.functional.sol_kubernetes_v2 import base_v2
from tacker.tests.functional.sol_kubernetes_v2 import paramgen
WAIT_NOTIFICATION_TIME = 5
@ddt.ddt
class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
@@ -32,19 +34,18 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
test_instantiate_cnf_resources_path = os.path.join(
cur_dir, "samples/test_instantiate_cnf_resources")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.cnf_pkg, cls.cnf_vnfd_id = cls.create_vnf_package(
test_instantiate_cnf_resources_path)
@classmethod
def tearDownClass(cls):
super(VnfPmThresholdTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.cnf_pkg)
def setUp(self):
super(VnfPmThresholdTest, self).setUp()
base_v2.FAKE_SERVER_MANAGER.set_callback(
'PUT', "/-/reload",
status_code=202,
self.set_server_callback(
'PUT', "/-/reload", status_code=202,
response_headers={"Content-Type": "text/plain"})
def test_pm_threshold_interface_min(self):
@@ -73,7 +74,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.pm_instantiate_cnf_resources_create(
self.vnfd_id_1)
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -98,10 +99,10 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_threshold_min(
callback_uri, inst_id, self.fake_prometheus_ip
@@ -116,19 +117,17 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 4. PMThreshold-Update
callback_url = os.path.join(
base_v2.MOCK_NOTIFY_CALLBACK_URL,
self.get_notify_callback_url(),
self._testMethodName
)
callback_url = f'{callback_url}_1'
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
# Because the update of the threshold is executed, the 'callback_url'
# is updated, so the url of the fake server needs to be modified.
base_v2.FAKE_SERVER_MANAGER.set_callback(
'GET', callback_url, status_code=204)
base_v2.FAKE_SERVER_MANAGER.set_callback(
'POST', callback_url, status_code=204)
self.set_server_callback('GET', callback_url, status_code=204)
self.set_server_callback('POST', callback_url, status_code=204)
update_req = paramgen.update_pm_threshold(callback_uri)
resp, body = self.update_pm_threshold(pm_threshold_id, update_req)
self.assertEqual(200, resp.status_code)
@@ -141,9 +140,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
sub_req = paramgen.pm_threshold(pm_threshold_id, inst_id)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -173,10 +170,6 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -185,7 +178,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 10. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -219,7 +212,8 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
# 1. LCM-Create: Create a new VNF instance resource
# NOTE: extensions and vnfConfigurableProperties are omitted
# because they are commented out in etsi_nfv_sol001.
create_req = paramgen.instantiate_cnf_resources_create(self.vnfd_id_1)
create_req = paramgen.instantiate_cnf_resources_create(
self.cnf_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -244,10 +238,10 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
'callbackUri',
'_links'
]
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.pm_threshold_max(
callback_uri, inst_id, self.fake_prometheus_ip)
@@ -260,18 +254,16 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
pm_threshold_id = body.get('id')
# 4. PMThreshold-Update
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_url = f'{callback_url}_1'
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
# Because the update of the threshold is executed, the 'callback_url'
# is updated, so the url of the fake server needs to be modified.
base_v2.FAKE_SERVER_MANAGER.set_callback(
'GET', callback_url, status_code=204)
base_v2.FAKE_SERVER_MANAGER.set_callback(
'POST', callback_url, status_code=204)
self.set_server_callback('GET', callback_url, status_code=204)
self.set_server_callback('POST', callback_url, status_code=204)
update_req = paramgen.update_pm_threshold(callback_uri)
resp, body = self.update_pm_threshold(pm_threshold_id, update_req)
self.assertEqual(200, resp.status_code)
@@ -284,9 +276,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
sub_req = paramgen.pm_threshold(pm_threshold_id, inst_id)
resp, body = self.pm_threshold(sub_req)
self.assertEqual(204, resp.status_code)
# The creation of "pm_threshold" will be asynchronous
# and wait for the creation to end
time.sleep(5)
time.sleep(WAIT_NOTIFICATION_TIME)
self._check_notification(
callback_url, 'ThresholdCrossedNotification')
@@ -317,10 +307,6 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -328,7 +314,7 @@ class VnfPmThresholdTest(base_v2.BaseVnfLcmKubernetesV2Test):
body['instantiationState'])
# 10. LCM-Delete: Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance

View File

@@ -49,7 +49,7 @@ class GrantV2:
"userDomain": "Default"
}
vim_params = yaml.safe_load(base_utils.read_file('local-vim.yaml'))
vim_params['auth_url'] += '/v3'
vim_params['auth_url'] = f"{vim_params['auth_url']}/v3"
return {
"vim1": {
"vimId": uuidsentinel.vim_connection_id,

View File

@@ -15,7 +15,6 @@
import ddt
import os
import time
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
@@ -39,35 +38,35 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
change_vnfpkg_from_image_to_image_path = os.path.join(
cur_dir, "../sol_v2_common/samples/"
"test_instantiate_vnf_with_old_image_or_volume")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.old_pkg, cls.old_vnfd_id = cls.create_vnf_package(
change_vnfpkg_from_image_to_image_path)
change_vnfpkg_from_image_to_image_path_2 = os.path.join(
cur_dir, "../sol_v2_common/samples/"
"test_change_vnf_pkg_with_new_image")
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.new_image_pkg, cls.new_image_vnfd_id = cls.create_vnf_package(
change_vnfpkg_from_image_to_image_path_2, image_path=image_path)
change_vnfpkg_from_image_to_volume_path = os.path.join(
cur_dir, "../sol_v2_common/samples/"
"test_change_vnf_pkg_with_new_volume")
cls.vnf_pkg_3, cls.vnfd_id_3 = cls.create_vnf_package(
cls.new_volume_pkg, cls.new_volume_vnfd_id = cls.create_vnf_package(
change_vnfpkg_from_image_to_volume_path, image_path=image_path)
change_vnfpkg_failed_in_update_path = os.path.join(
cur_dir, "../sol_v2_common/samples/"
"test_change_vnf_pkg_with_update_failed")
cls.vnf_pkg_4, cls.vnfd_id_4 = cls.create_vnf_package(
cls.failed_pkg, cls.failed_vnfd_id = cls.create_vnf_package(
change_vnfpkg_failed_in_update_path, image_path=image_path)
@classmethod
def tearDownClass(cls):
super(ChangeVnfPkgVnfLcmTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.vnf_pkg_3)
cls.delete_vnf_package(cls.vnf_pkg_4)
cls.delete_vnf_package(cls.old_pkg)
cls.delete_vnf_package(cls.new_image_pkg)
cls.delete_vnf_package(cls.new_volume_pkg)
cls.delete_vnf_package(cls.failed_pkg)
def setUp(self):
super(ChangeVnfPkgVnfLcmTest, self).setUp()
@@ -76,7 +75,7 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.change_vnfpkg_from_image_to_image_common_test()
def test_change_vnfpkg_from_volume_to_volume(self):
create_req = paramgen.change_vnfpkg_create(self.vnfd_id_1)
create_req = paramgen.change_vnfpkg_create(self.old_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
expected_inst_attrs = [
'id',
@@ -132,7 +131,7 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.check_resp_headers_in_get(resp_1)
self.check_resp_body(body_1, expected_inst_attrs)
change_vnfpkg_req = paramgen.change_vnfpkg(self.vnfd_id_3)
change_vnfpkg_req = paramgen.change_vnfpkg(self.new_volume_vnfd_id)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -165,16 +164,12 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
def test_change_vnfpkg_failed_in_update(self):
create_req = paramgen.change_vnfpkg_create(self.vnfd_id_1)
create_req = paramgen.change_vnfpkg_create(self.old_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
expected_inst_attrs = [
'id',
@@ -221,7 +216,7 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.check_resp_headers_in_get(resp_1)
self.check_resp_body(body_1, expected_inst_attrs)
change_vnfpkg_req = paramgen.change_vnfpkg(self.vnfd_id_4)
change_vnfpkg_req = paramgen.change_vnfpkg(self.failed_vnfd_id)
del change_vnfpkg_req['additionalParams']['vdu_params'][1]
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
@@ -230,7 +225,7 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
resp, body = self.rollback(lcmocc_id)
resp, body = self.rollback_lcmocc(lcmocc_id)
self.assertEqual(202, resp.status_code)
self.wait_lcmocc_rolled_back(lcmocc_id)
@@ -250,16 +245,12 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
def test_change_vnfpkg_failed_with_error_coordinate_vnf(self):
create_req = paramgen.change_vnfpkg_create(self.vnfd_id_1)
create_req = paramgen.change_vnfpkg_create(self.old_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
expected_inst_attrs = [
'id',
@@ -312,7 +303,7 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.check_resp_headers_in_get(resp_1)
self.check_resp_body(body_1, expected_inst_attrs)
change_vnfpkg_req = paramgen.change_vnfpkg(self.vnfd_id_3)
change_vnfpkg_req = paramgen.change_vnfpkg(self.new_volume_vnfd_id)
change_vnfpkg_req['additionalParams'][
'lcm-operation-coordinate-new-vnf'
] = "./Scripts/error_coordinate_new_vnf.py"
@@ -324,7 +315,7 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
resp, body = self.rollback(lcmocc_id)
resp, body = self.rollback_lcmocc(lcmocc_id)
self.assertEqual(202, resp.status_code)
self.wait_lcmocc_rolled_back(lcmocc_id)
@@ -351,10 +342,6 @@ class ChangeVnfPkgVnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -14,14 +14,12 @@
# under the License.
import os
import time
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
def create_coordinate_response(req_header, req_body):
def _create_coordinate_response(req_header, req_body):
resp_body = {
'id': 'aeca5328-085c-4cd6-a6f4-c010e9082528',
@@ -60,38 +58,31 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# main vnf package for StandardUserData test
pkg_path_1 = os.path.join(cur_dir,
"../sol_v2_common/samples/userdata_standard")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.standard_pkg, cls.standard_vnfd_id = cls.create_vnf_package(
pkg_path_1, image_path=image_path, userdata_path=userdata_path)
# for change_vnfpkg test
pkg_path_2 = os.path.join(cur_dir,
"../sol_v2_common/samples/userdata_standard_change_vnfpkg")
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.new_pkg, cls.new_vnfd_id = cls.create_vnf_package(
pkg_path_2, image_path=image_path, userdata_path=userdata_path)
# for change_vnfpkg network/flavor change test
pkg_path_3 = os.path.join(cur_dir,
"../sol_v2_common/samples/userdata_standard_change_vnfpkg_nw")
cls.vnf_pkg_3, cls.vnfd_id_3 = cls.create_vnf_package(
cls.new_nw_pkg, cls.new_nw_vnfd_id = cls.create_vnf_package(
pkg_path_3, image_path=image_path, userdata_path=userdata_path)
@classmethod
def tearDownClass(cls):
super(IndividualVnfcMgmtTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.vnf_pkg_3)
cls.delete_vnf_package(cls.standard_pkg)
cls.delete_vnf_package(cls.new_pkg)
cls.delete_vnf_package(cls.new_nw_pkg)
def setUp(self):
super().setUp()
def _put_fail_file(self, operation):
with open(f'/tmp/{operation}', 'w'):
pass
def _rm_fail_file(self, operation):
os.remove(f'/tmp/{operation}')
def _get_vdu_indexes(self, inst, vdu):
return {
vnfc['metadata'].get('vdu_idx')
@@ -159,19 +150,6 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# must exist
return vnfc['metadata']['flavor']
def _delete_instance(self, inst_id):
for _ in range(3):
resp, body = self.delete_vnf_instance(inst_id)
if resp.status_code == 204: # OK
return
elif resp.status_code == 409:
# may happen. there is a bit time between lcmocc become
# COMPLETED and lock of terminate is freed.
time.sleep(3)
else:
break
self.assertTrue(False)
def test_basic_operations(self):
"""Test basic operations using StandardUserData
@@ -202,7 +180,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
subnet_ids = self.get_subnet_ids(['subnet0', 'subnet1'])
# Create VNF instance
create_req = paramgen.sample3_create(self.vnfd_id_1)
create_req = paramgen.sample3_create(self.standard_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -322,20 +300,20 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self._get_vnfc_cp_net_id(inst_5, 'VDU2', 0, 'VDU2_CP1'))
# 6. Change_vnfpkg operation
change_vnfpkg_req = paramgen.sample4_change_vnfpkg(self.vnfd_id_2,
change_vnfpkg_req = paramgen.sample4_change_vnfpkg(self.new_vnfd_id,
net_ids, subnet_ids)
for vdu_param in change_vnfpkg_req['additionalParams']['vdu_params']:
vdu_param['new_vnfc_param']['endpoint'] = (
f'http://localhost:{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}')
f'http://localhost:{self.get_server_port()}')
# Prepare coordination
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
'/lcmcoord/v1/coordinations',
status_code=201,
response_headers={"Content-Type": "application/json"},
callback=create_coordinate_response
callback=_create_coordinate_response
)
with open('/tmp/change_vnfpkg_coordination', 'w'):
@@ -355,7 +333,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# check vnfdId is changed
self.assertEqual(self.vnfd_id_2, inst_6['vnfdId'])
self.assertEqual(self.new_vnfd_id, inst_6['vnfdId'])
# check images are changed
self.assertNotEqual(self._get_vnfc_image(inst_5, 'VDU1', 0),
self._get_vnfc_image(inst_6, 'VDU1', 0))
@@ -390,7 +368,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# Delete VNF instance
self._delete_instance(inst_id)
self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
def test_rollback_operations(self):
"""Test rollback operations using StandardUserData
@@ -421,7 +399,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
subnet_ids = self.get_subnet_ids(['subnet0', 'subnet1'])
# Create VNF instance
create_req = paramgen.sample3_create(self.vnfd_id_1)
create_req = paramgen.sample3_create(self.standard_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -440,14 +418,14 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# 1. Scale out operation
self._put_fail_file('scale_end')
self.put_fail_file('scale_end')
scale_out_req = paramgen.sample3_scale_out()
resp, body = self.scale_vnf_instance(inst_id, scale_out_req)
self.assertEqual(202, resp.status_code)
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('scale_end')
self.rm_fail_file('scale_end')
# Rollback
resp, body = self.rollback_lcmocc(lcmocc_id)
@@ -469,14 +447,14 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self._get_vnfc_id(inst_1, 'VDU2', 0))
# 2. Change_ext_conn operation
self._put_fail_file('change_external_connectivity_end')
self.put_fail_file('change_external_connectivity_end')
change_ext_conn_req = paramgen.sample3_change_ext_conn(net_ids)
resp, body = self.change_ext_conn(inst_id, change_ext_conn_req)
self.assertEqual(202, resp.status_code)
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('change_external_connectivity_end')
self.rm_fail_file('change_external_connectivity_end')
# Rollback
resp, body = self.rollback_lcmocc(lcmocc_id)
@@ -494,23 +472,23 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self._get_vnfc_cp_net_id(inst_2, 'VDU2', 0, 'VDU2_CP1'))
# 3. Change_vnfpkg operation
self._put_fail_file('change_vnfpkg')
self.put_fail_file('change_vnfpkg')
with open('/tmp/change_vnfpkg_coordination', 'w'):
pass
change_vnfpkg_req = paramgen.sample4_change_vnfpkg(self.vnfd_id_2,
change_vnfpkg_req = paramgen.sample4_change_vnfpkg(self.new_vnfd_id,
net_ids, subnet_ids)
for vdu_param in change_vnfpkg_req['additionalParams']['vdu_params']:
vdu_param['old_vnfc_param']['endpoint'] = (
f'http://localhost:{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}')
f'http://localhost:{self.get_server_port()}')
# Prepare coordination
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
'/lcmcoord/v1/coordinations',
status_code=201,
response_headers={"Content-Type": "application/json"},
callback=create_coordinate_response
callback=_create_coordinate_response
)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
@@ -518,7 +496,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('change_vnfpkg')
self.rm_fail_file('change_vnfpkg')
# Rollback
resp, body = self.rollback_lcmocc(lcmocc_id)
@@ -532,7 +510,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# check vnfdId is not changed
self.assertEqual(self.vnfd_id_1, inst_3['vnfdId'])
self.assertEqual(self.standard_vnfd_id, inst_3['vnfdId'])
# check images are not changed
self.assertEqual(self._get_vnfc_image(inst_2, 'VDU1', 0),
self._get_vnfc_image(inst_3, 'VDU1', 0))
@@ -553,7 +531,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# Delete VNF instance
self._delete_instance(inst_id)
self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
def test_heal_vnfc_after_image_change(self):
"""Test heal operation after image change using StandardUserData
@@ -579,7 +557,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
subnet_ids = self.get_subnet_ids(['subnet0', 'subnet1'])
# Create VNF instance
create_req = paramgen.sample3_create(self.vnfd_id_1)
create_req = paramgen.sample3_create(self.standard_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -603,7 +581,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual({0}, self._get_vdu_indexes(inst_1, 'VDU2'))
# 2. Update VNF instance
update_req = paramgen.sample3_update_vnf_vnfd_id(self.vnfd_id_2)
update_req = paramgen.sample3_update_vnf_vnfd_id(self.new_vnfd_id)
resp, body = self.update_vnf_instance(inst_id, update_req)
self.assertEqual(202, resp.status_code)
@@ -619,7 +597,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual({0}, self._get_vdu_indexes(inst_2, 'VDU2'))
# check vnfdId is changed
self.assertEqual(self.vnfd_id_2, inst_2['vnfdId'])
self.assertEqual(self.new_vnfd_id, inst_2['vnfdId'])
# 3. Heal operation
heal_req = paramgen.sample3_heal()
@@ -661,7 +639,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# Delete VNF instance
self._delete_instance(inst_id)
self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
def test_change_vnfpkg_nw(self):
"""Test change_vnfpkg with additional functions
@@ -689,7 +667,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
subnet_ids = self.get_subnet_ids(['subnet0', 'subnet1'])
# Create VNF instance
create_req = paramgen.sample3_create(self.vnfd_id_1)
create_req = paramgen.sample3_create(self.standard_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -713,7 +691,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual({0}, self._get_vdu_indexes(inst_1, 'VDU2'))
# 2. Change_vnfpkg operation
change_vnfpkg_req = paramgen.sample5_change_vnfpkg(self.vnfd_id_3,
change_vnfpkg_req = paramgen.sample5_change_vnfpkg(self.new_nw_vnfd_id,
net_ids, subnet_ids)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
@@ -726,7 +704,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# check vnfdId is changed
self.assertEqual(self.vnfd_id_3, inst_2['vnfdId'])
self.assertEqual(self.new_nw_vnfd_id, inst_2['vnfdId'])
# check images are changed
self.assertNotEqual(self._get_vnfc_image(inst_1, 'VDU1', 0),
self._get_vnfc_image(inst_2, 'VDU1', 0))
@@ -773,7 +751,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# Delete VNF instance
self._delete_instance(inst_id)
self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
def test_change_vnfpkg_nw_rollback(self):
"""Test rollback of change_vnfpkg with additional functions
@@ -803,7 +781,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
subnet_ids = self.get_subnet_ids(['subnet0', 'subnet1'])
# Create VNF instance
create_req = paramgen.sample3_create(self.vnfd_id_1)
create_req = paramgen.sample3_create(self.standard_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -827,15 +805,15 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual({0}, self._get_vdu_indexes(inst_1, 'VDU2'))
# 2. Change_vnfpkg operation
self._put_fail_file('change_vnfpkg')
change_vnfpkg_req = paramgen.sample5_change_vnfpkg(self.vnfd_id_3,
self.put_fail_file('change_vnfpkg')
change_vnfpkg_req = paramgen.sample5_change_vnfpkg(self.new_nw_vnfd_id,
net_ids, subnet_ids)
resp, body = self.change_vnfpkg(inst_id, change_vnfpkg_req)
self.assertEqual(202, resp.status_code)
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_failed_temp(lcmocc_id)
self._rm_fail_file('change_vnfpkg')
self.rm_fail_file('change_vnfpkg')
# Rollback
resp, body = self.rollback_lcmocc(lcmocc_id)
@@ -847,7 +825,7 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(200, resp.status_code)
# check vnfdId is not changed
self.assertEqual(self.vnfd_id_1, inst_2['vnfdId'])
self.assertEqual(self.standard_vnfd_id, inst_2['vnfdId'])
# check images are not changed
self.assertEqual(self._get_vnfc_image(inst_1, 'VDU1', 0),
self._get_vnfc_image(inst_2, 'VDU1', 0))
@@ -882,4 +860,4 @@ class IndividualVnfcMgmtTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# Delete VNF instance
self._delete_instance(inst_id)
self.exec_lcm_operation(self.delete_vnf_instance, inst_id)

View File

@@ -98,8 +98,8 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 4-5. Send alert and auto heal
affected_vnfcs = body['resourceChanges']['affectedVnfcs']
vnfc_info_id = (affected_vnfcs[0]['vduId'] + '-'
+ affected_vnfcs[0]['id'])
vnfc_info_id = (f"{affected_vnfcs[0]['vduId']}-"
f"{affected_vnfcs[0]['id']}")
alert = paramgen.prometheus_auto_healing_alert(inst_id, vnfc_info_id)
resp, body = self.prometheus_auto_healing_alert(alert)
self.assertEqual(204, resp.status_code)
@@ -137,8 +137,8 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
if vnfc['changeType'] == 'REMOVED']
self.assertEqual(1, len(removed_vnfcs))
removed_vnfc_info_id = (affected_vnfcs[0]['vduId'] + '-'
+ affected_vnfcs[0]['id'])
removed_vnfc_info_id = (f"{affected_vnfcs[0]['vduId']}-"
f"{affected_vnfcs[0]['id']}")
self.assertEqual(vnfc_info_id, removed_vnfc_info_id)
# 7. Send alert
@@ -193,8 +193,8 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(2, len(removed_vnfcs))
removed_vnfc_info_ids = [
removed_vnfcs[0]['vduId'] + '-' + removed_vnfcs[0]['id'],
removed_vnfcs[1]['vduId'] + '-' + removed_vnfcs[1]['id']
f"{removed_vnfcs[0]['vduId']}-{removed_vnfcs[0]['id']}",
f"{removed_vnfcs[1]['vduId']}-{removed_vnfcs[1]['id']}"
]
self.assertCountEqual(
[vnfc_info_id_1, vnfc_info_id_2], removed_vnfc_info_ids)
@@ -207,10 +207,6 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# 12. Show OpOcc
resp, body = self.show_lcmocc(lcmocc_id)
self.assertEqual(200, resp.status_code)
@@ -218,7 +214,7 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual('TERMINATE', body['operation'])
# 13. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance
@@ -342,10 +338,6 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# 11. Show OpOcc
resp, body = self.show_lcmocc(lcmocc_id)
self.assertEqual(200, resp.status_code)
@@ -353,7 +345,7 @@ class PromAutoScaleHealTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual('TERMINATE', body['operation'])
# 12. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
# check deletion of VNF instance

View File

@@ -18,18 +18,19 @@ import os
import time
from tacker.objects import fields
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
test_count = 0
TEST_COUNT = 0
RETRY_LIMIT = 10
RETRY_TIMEOUT = 3
WAIT_AUTO_HEAL_TIME = 60
SERVER_NOTIFICATION_INTERVAL = 1
def make_alarm_id(header, body):
def _make_alarm_id(header, body):
from tacker.tests.functional.sol_v2 import test_server_notification
id = 'alarm_id_' + str(test_server_notification.test_count)
id = f"alarm_id_{test_server_notification.TEST_COUNT}"
return {'alarm_id': id}
@@ -49,21 +50,22 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# for basic lcms tests max pattern
basic_lcms_max_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/basic_lcms_max")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.max_pkg, cls.max_vnfd_id = cls.create_vnf_package(
basic_lcms_max_path, image_path=image_path)
# for basic lcms tests min pattern
basic_lcms_min_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/basic_lcms_min")
# no image contained
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.min_pkg, cls.min_vnfd_id = cls.create_vnf_package(
basic_lcms_min_path)
# for update vnf test
update_vnf_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/update_vnf")
# no image contained
cls.vnf_pkg_3, cls.vnfd_id_3 = cls.create_vnf_package(update_vnf_path)
cls.upd_pkg, cls.upd_vnfd_id = cls.create_vnf_package(
update_vnf_path)
# for server_notification test
server_notification_path = os.path.join(
@@ -75,19 +77,14 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
@classmethod
def tearDownClass(cls):
super(ServerNotificationTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.vnf_pkg_3)
cls.delete_vnf_package(cls.max_pkg)
cls.delete_vnf_package(cls.min_pkg)
cls.delete_vnf_package(cls.upd_pkg)
cls.delete_vnf_package(cls.svn_pkg)
def setUp(self):
super().setUp()
def _check_package_usage(self, is_nfvo, package_id, state='NOT_IN_USE'):
if not is_nfvo:
usage_state = self.get_vnf_package(package_id)['usageState']
self.assertEqual(state, usage_state)
def fault_notification_queueing_test(self):
"""Test Fault Notification with queueing
@@ -152,21 +149,21 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
create_req = paramgen.create_vnf_min(self.svn_id)
# Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
server_notification_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
'/server_notification')
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
'/server_notification',
status_code=200,
response_headers={"Content-Type": "application/json"},
callback=make_alarm_id
callback=_make_alarm_id
)
sub_req = paramgen.sub_create_min(callback_uri)
@@ -197,7 +194,7 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.svn_pkg, 'IN_USE')
self.check_package_usage(self.svn_pkg, 'IN_USE', is_nfvo)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -262,11 +259,11 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
resp, body = self.server_notification(
inst_id, 'server_id', fault_notification_param)
self.assertTrue(resp.status_code == 204 or resp.status_code == 404)
time.sleep(1)
time.sleep(SERVER_NOTIFICATION_INTERVAL)
if is_autoheal_enabled:
# waiting for auto healing process complete after packing timer.
time.sleep(60)
time.sleep(WAIT_AUTO_HEAL_TIME)
# 4. LCM-Heal
nested_stacks = self.heat_client.get_resources(stack_name)
@@ -326,8 +323,8 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(fields.VnfOperationalStateType.STARTED,
body['instantiatedVnfInfo']['vnfState'])
# check usageState of VNF Package 2
self._check_package_usage(is_nfvo, self.svn_pkg, 'IN_USE')
# check usageState of server notification VNF Package
self.check_package_usage(self.svn_pkg, 'IN_USE', is_nfvo)
self.assertEqual(self.svn_id, body['vnfdId'])
@@ -442,10 +439,6 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(20)
# check deletion of Heat-stack
stack_status, _ = self.heat_client.get_status(stack_name)
self.assertIsNone(stack_status)
@@ -457,7 +450,7 @@ class ServerNotificationTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 8. LCM-Delete
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -15,10 +15,8 @@
import ddt
import os
import time
from tacker.objects import fields
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
@@ -40,28 +38,28 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# for basic lcms tests max pattern
basic_lcms_max_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/basic_lcms_max")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.max_pkg, cls.max_vnfd_id = cls.create_vnf_package(
basic_lcms_max_path, image_path=image_path)
# for basic lcms tests min pattern
basic_lcms_min_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/basic_lcms_min")
# no image contained
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.min_pkg, cls.min_vnfd_id = cls.create_vnf_package(
basic_lcms_min_path)
# for update vnf test
update_vnf_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/update_vnf")
# no image contained
cls.vnf_pkg_3, cls.vnfd_id_3 = cls.create_vnf_package(update_vnf_path)
cls.upd_pkg, cls.upd_vnfd_id = cls.create_vnf_package(update_vnf_path)
@classmethod
def tearDownClass(cls):
super(VnfLcmTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.vnf_pkg_3)
cls.delete_vnf_package(cls.max_pkg)
cls.delete_vnf_package(cls.min_pkg)
cls.delete_vnf_package(cls.upd_pkg)
def setUp(self):
super().setUp()
@@ -75,8 +73,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
- 2. Show VNFLCM API versions
"""
path = "/vnflcm/api_versions"
resp, body = self.tacker_client.do_request(
path, "GET", version="2.0.0")
resp, body = self.tacker_client.do_request(path, "GET")
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
expected_body = {
@@ -89,8 +86,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(body, expected_body)
path = "/vnflcm/v2/api_versions"
resp, body = self.tacker_client.do_request(
path, "GET", version="2.0.0")
resp, body = self.tacker_client.do_request(path, "GET")
self.assertEqual(200, resp.status_code)
self.check_resp_headers_in_get(resp)
expected_body = {
@@ -129,10 +125,10 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
"""
# 0. Pre-setting
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -236,10 +232,10 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.addCleanup(self.delete_port, port_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(callback_uri)
@@ -269,7 +265,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_max(self.vnfd_id_1)
create_req = paramgen.create_vnf_max(self.max_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -313,16 +309,14 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 5. Update VNF
# check attribute value before update VNF
# check usageState of VNF Package 1
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
# check usageState of max pattern VNF Package
self.check_package_usage(self.max_pkg, 'IN_USE')
# check usageState of VNF Package 3
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, 'NOT_IN_USE')
# check vnfd id
self.assertEqual(self.vnfd_id_1, body['vnfdId'])
self.assertEqual(self.max_vnfd_id, body['vnfdId'])
# check vnfc info
vnfc_info = body['instantiatedVnfInfo']['vnfcInfo']
@@ -334,7 +328,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertIsNotNone(vnfc.get('vnfcState'))
self.assertIsNone(vnfc.get('vnfcConfigurableProperties'))
update_req = paramgen.update_vnf_max(self.vnfd_id_3, vnfc_ids)
update_req = paramgen.update_vnf_max(self.upd_vnfd_id, vnfc_ids)
resp, body = self.update_vnf_instance(inst_id, update_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -357,16 +351,14 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(fields.VnfOperationalStateType.STARTED,
body['instantiatedVnfInfo']['vnfState'])
# check usageState of VNF Package 1
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
# check usageState of max pattern VNF Package
self.check_package_usage(self.max_pkg, 'NOT_IN_USE')
# check usageState of VNF Package 3
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
# check usageState of update pattern VNF Package
self.check_package_usage(self.upd_pkg, 'IN_USE')
# check the specified attribute after update VNF
self.assertEqual(self.vnfd_id_3, body['vnfdId'])
self.assertEqual(self.upd_vnfd_id, body['vnfdId'])
self.assertEqual('new name', body['vnfInstanceName'])
self.assertEqual('new description', body['vnfInstanceDescription'])
dummy_key_value = {'dummy-key': 'dummy-value'}
@@ -421,10 +413,6 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -432,7 +420,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 9. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -502,10 +490,10 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.addCleanup(self.delete_port, port_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(callback_uri)
@@ -535,7 +523,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_max(self.vnfd_id_1)
create_req = paramgen.create_vnf_max(self.max_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -543,8 +531,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.max_pkg, 'IN_USE')
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -588,18 +575,16 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 5. Update VNF
# check attribute value before update VNF
# check usageState of VNF Package 1
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
# check usageState of max pattern VNF Package
self.check_package_usage(self.max_pkg, 'IN_USE')
# check usageState of VNF Package 3
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, 'NOT_IN_USE')
# check vnfd id
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
self.assertEqual(self.vnfd_id_1, body['vnfdId'])
self.assertEqual(self.max_vnfd_id, body['vnfdId'])
# check vnfc info
vnfc_info = body['instantiatedVnfInfo']['vnfcInfo']
@@ -611,7 +596,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertIsNotNone(vnfc.get('vnfcState'))
self.assertIsNone(vnfc.get('vnfcConfigurableProperties'))
update_req = paramgen.update_vnf_max(self.vnfd_id_3, vnfc_ids)
update_req = paramgen.update_vnf_max(self.upd_vnfd_id, vnfc_ids)
resp, body = self.update_vnf_instance(inst_id, update_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -634,16 +619,14 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.assertEqual(fields.VnfOperationalStateType.STARTED,
body['instantiatedVnfInfo']['vnfState'])
# check usageState of VNF Package 1
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
# check usageState of max pattern VNF Package
self.check_package_usage(self.max_pkg, 'NOT_IN_USE')
# check usageState of VNF Package 3
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, 'IN_USE')
# check the specified attribute after update VNF
self.assertEqual(self.vnfd_id_3, body['vnfdId'])
self.assertEqual(self.upd_vnfd_id, body['vnfdId'])
self.assertEqual('new name', body['vnfInstanceName'])
self.assertEqual('new description', body['vnfInstanceDescription'])
dummy_key_value = {'dummy-key': 'dummy-value'}
@@ -823,10 +806,6 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
@@ -834,7 +813,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 11. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -905,10 +884,10 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.addCleanup(self.delete_port, port_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(callback_uri)
@@ -938,7 +917,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_max(self.vnfd_id_1)
create_req = paramgen.create_vnf_max(self.max_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -946,8 +925,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.max_pkg, 'IN_USE')
# check instantiationState of VNF
self.assertEqual(fields.VnfInstanceState.NOT_INSTANTIATED,
@@ -1097,10 +1075,6 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_status, _ = self.heat_client.get_status(stack_name)
self.assertIsNone(stack_status)
@@ -1112,7 +1086,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 12. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -1125,7 +1099,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
"""Test the sequence of scale out/in and the other LCM operations
The change_ext_conn can't be tested in test_basic_lcms_min method
because VNF package 2 don't have external connectivity.
because min pattern VNF package don't have external connectivity.
So moved it here to test min pattern change_ext_conn.
* About attributes:
@@ -1212,10 +1186,10 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.addCleanup(self.delete_port, port_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(callback_uri)
@@ -1245,7 +1219,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_max(self.vnfd_id_1)
create_req = paramgen.create_vnf_max(self.max_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -1253,8 +1227,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_1)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.max_pkg, 'IN_USE')
# check instantiationState of VNF
self.assertEqual(fields.VnfInstanceState.NOT_INSTANTIATED,
@@ -1585,10 +1558,6 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_status, _ = self.heat_client.get_status(stack_name)
self.assertIsNone(stack_status)
@@ -1600,7 +1569,7 @@ class VnfLcmTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 17. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)

View File

@@ -15,10 +15,8 @@
import ddt
import os
import time
from tacker.objects import fields
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
@@ -41,14 +39,14 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# Scale operation will fail
scale_ng_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/scale_ng")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.scale_ng_pkg, cls.scale_ng_vnfd_id = cls.create_vnf_package(
scale_ng_path, image_path=image_path)
# Instantiate VNF will fail
error_network_path = os.path.join(cur_dir, "../sol_v2_common/"
"samples/error_network")
# no image contained
cls.vnf_pkg_2, cls.vnfd_id_2 = cls.create_vnf_package(
cls.err_nw_pkg, cls.err_nw_vnfd_id = cls.create_vnf_package(
error_network_path)
# update VNF or change external VNF connectivity will fail
@@ -56,16 +54,16 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
"../sol_v2_common/"
"samples/basic_lcms_min")
# no image contained
cls.vnf_pkg_3, cls.vnfd_id_3 = cls.create_vnf_package(
cls.min_pkg, cls.min_vnfd_id = cls.create_vnf_package(
update_change_ng_path)
@classmethod
def tearDownClass(cls):
super(VnfLcmErrorHandlingTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.vnf_pkg_2)
cls.delete_vnf_package(cls.vnf_pkg_3)
cls.delete_vnf_package(cls.scale_ng_pkg)
cls.delete_vnf_package(cls.err_nw_pkg)
cls.delete_vnf_package(cls.min_pkg)
def setUp(self):
super().setUp()
@@ -97,10 +95,10 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
"""
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -112,8 +110,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 2. Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.err_nw_pkg, 'NOT_IN_USE')
# 3. Create VNF instance
# ETSI NFV SOL003 v3.3.1 5.5.2.2 VnfInstance
@@ -134,7 +131,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_min(self.vnfd_id_2)
create_req = paramgen.create_vnf_min(self.err_nw_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -142,8 +139,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.err_nw_pkg, 'IN_USE')
# check instantiationState of VNF
self.assertEqual(fields.VnfInstanceState.NOT_INSTANTIATED,
@@ -159,8 +155,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_failed_temp(lcmocc_id)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.err_nw_pkg, 'IN_USE')
# 5. Show VNF instance
resp, body = self.show_vnf_instance(inst_id)
@@ -240,8 +235,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.check_resp_headers_in_delete(resp)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_2)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.err_nw_pkg, 'NOT_IN_USE')
# 10. Delete subscription
resp, body = self.delete_subscription(sub_id)
@@ -277,10 +271,10 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
"""
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -292,8 +286,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 2. Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'NOT_IN_USE')
# 3. Create VNF instance
# ETSI NFV SOL003 v3.3.1 5.5.2.2 VnfInstance
@@ -314,7 +307,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_min(self.vnfd_id_3)
create_req = paramgen.create_vnf_min(self.min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -322,8 +315,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'IN_USE')
# check instantiationState of VNF
self.assertEqual(fields.VnfInstanceState.NOT_INSTANTIATED,
@@ -339,8 +331,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'IN_USE')
# 5. Show VNF instance
additional_inst_attrs = [
@@ -425,13 +416,8 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'IN_USE')
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -440,13 +426,12 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 11. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'NOT_IN_USE')
# 12. Delete subscription
resp, body = self.delete_subscription(sub_id)
@@ -505,10 +490,10 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
'ft-ipv6-subnet1'])
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -520,8 +505,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 2. Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'NOT_IN_USE')
# 3. Create VNF instance
# ETSI NFV SOL003 v3.3.1 5.5.2.2 VnfInstance
@@ -542,7 +526,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# 'extensions', # omitted
'_links'
]
create_req = paramgen.create_vnf_min(self.vnfd_id_3)
create_req = paramgen.create_vnf_min(self.min_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
self.check_resp_headers_in_create(resp)
@@ -550,8 +534,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
inst_id = body['id']
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'IN_USE')
# check instantiationState of VNF
self.assertEqual(fields.VnfInstanceState.NOT_INSTANTIATED,
@@ -567,8 +550,7 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'IN_USE')
# 5. Show VNF instance
additional_inst_attrs = [
@@ -652,13 +634,8 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'IN_USE')
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -667,13 +644,12 @@ class VnfLcmErrorHandlingTest(test_vnflcm_basic_common.CommonVnfLcmTest):
body['instantiationState'])
# 11. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
# check usageState of VNF Package
usage_state = self.get_vnf_package(self.vnf_pkg_3)['usageState']
self.assertEqual('NOT_IN_USE', usage_state)
self.check_package_usage(self.min_pkg, 'NOT_IN_USE')
# 12. Delete subscription
resp, body = self.delete_subscription(sub_id)

View File

@@ -14,7 +14,6 @@
# under the License.
import os
import time
from tacker.tests.functional.sol_v2_common import paramgen
from tacker.tests.functional.sol_v2_common import test_vnflcm_basic_common
@@ -44,13 +43,13 @@ class AzRetryTest(test_vnflcm_basic_common.CommonVnfLcmTest):
# for update_stack_retry test
pkg_path_1 = os.path.join(cur_dir,
"../sol_v2_common/samples/userdata_standard_az_retry")
cls.vnf_pkg_1, cls.vnfd_id_1 = cls.create_vnf_package(
cls.az_retry_pkg, cls.az_retry_vnfd_id = cls.create_vnf_package(
pkg_path_1, image_path=image_path, userdata_path=userdata_path)
@classmethod
def tearDownClass(cls):
super(AzRetryTest, cls).tearDownClass()
cls.delete_vnf_package(cls.vnf_pkg_1)
cls.delete_vnf_package(cls.az_retry_pkg)
def setUp(self):
super().setUp()
@@ -72,19 +71,6 @@ class AzRetryTest(test_vnflcm_basic_common.CommonVnfLcmTest):
vnfc = self._get_vnfc_by_vdu_index(inst, vdu, index)
return vnfc['metadata'].get('zone')
def _delete_instance(self, inst_id):
for _ in range(3):
resp, body = self.delete_vnf_instance(inst_id)
if resp.status_code == 204: # OK
return
elif resp.status_code == 409:
# may happen. there is a bit time between lcmocc become
# COMPLETED and lock of terminate is freed.
time.sleep(3)
else:
break
self.assertTrue(False)
def test_update_stack_retry(self):
"""Test _update_stack_retry function using StandardUserData
@@ -117,7 +103,7 @@ class AzRetryTest(test_vnflcm_basic_common.CommonVnfLcmTest):
MAX_SCALE_COUNT = 4
# Create VNF instance
create_req = paramgen.sample6_create(self.vnfd_id_1)
create_req = paramgen.sample6_create(self.az_retry_vnfd_id)
resp, body = self.create_vnf_instance(create_req)
self.assertEqual(201, resp.status_code)
inst_id = body['id']
@@ -177,4 +163,5 @@ class AzRetryTest(test_vnflcm_basic_common.CommonVnfLcmTest):
self.wait_lcmocc_complete(lcmocc_id)
# Delete VNF instance
self._delete_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)

View File

@@ -13,176 +13,48 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
import shutil
import tempfile
import time
import urllib
import yaml
from oslo_config import cfg
from oslo_log import log as logging
from oslo_utils import uuidutils
from tempest.lib import base
from tacker.common import utils as common_utils
from tacker.sol_refactored.common import http_client
from tacker.sol_refactored.infra_drivers.openstack import heat_utils
from tacker.sol_refactored.nfvo import glance_utils
from tacker.sol_refactored import objects
from tacker.tests.functional.common.fake_server import FakeServerManager
from tacker.tests.functional.sol_v2_common import utils
from tacker.tests import utils as base_utils
from tacker import version
from tacker.tests.functional import base_v2
FAKE_SERVER_MANAGER = FakeServerManager()
MOCK_NOTIFY_CALLBACK_URL = '/notification/callback'
LOG = logging.getLogger(__name__)
VNF_PACKAGE_UPLOAD_TIMEOUT = 300
VNFLCM_V2_VERSION = "2.0.0"
class BaseSolV2Test(base.BaseTestCase):
class BaseSolV2Test(base_v2.BaseTackerTestV2):
"""Base test case class for SOL v2 functional tests."""
@classmethod
def setUpClass(cls):
super(BaseSolV2Test, cls).setUpClass()
FAKE_SERVER_MANAGER.prepare_http_server()
if getattr(cls, 'is_https', False):
FAKE_SERVER_MANAGER.set_https_server()
FAKE_SERVER_MANAGER.start_server()
cfg.CONF(args=['--config-file', '/etc/tacker/tacker.conf'],
project='tacker',
version='%%prog %s' % version.version_info.release_string())
objects.register_all()
vim_info = cls.get_vim_info()
cls.auth_url = vim_info.interfaceInfo['endpoint']
auth = http_client.KeystonePasswordAuthHandle(
auth_url=vim_info.interfaceInfo['endpoint'],
username=vim_info.accessInfo['username'],
password=vim_info.accessInfo['password'],
project_name=vim_info.accessInfo['project'],
user_domain_name=vim_info.accessInfo['userDomain'],
project_domain_name=vim_info.accessInfo['projectDomain']
)
cls.tacker_client = http_client.HttpClient(auth)
cls.neutron_client = http_client.HttpClient(auth,
cls.neutron_client = http_client.HttpClient(cls.auth_handle,
service_type='network')
cls.glance_client = http_client.HttpClient(auth,
cls.glance_client = http_client.HttpClient(cls.auth_handle,
service_type='image')
cls.nova_client = http_client.HttpClient(auth,
cls.nova_client = http_client.HttpClient(cls.auth_handle,
service_type='compute')
cls.heat_client = heat_utils.HeatClient(vim_info)
cls.cinder_client = http_client.HttpClient(
auth, service_type='block-storage')
cls.auth_handle, service_type='block-storage')
@classmethod
def tearDownClass(cls):
super(BaseSolV2Test, cls).tearDownClass()
FAKE_SERVER_MANAGER.stop_server()
@classmethod
def get_vim_info(cls):
vim_params = yaml.safe_load(base_utils.read_file('local-vim.yaml'))
vim_params['auth_url'] += '/v3'
vim_info = objects.VimConnectionInfo(
interfaceInfo={'endpoint': vim_params['auth_url']},
accessInfo={
'region': 'RegionOne',
'project': vim_params['project_name'],
'username': vim_params['username'],
'password': vim_params['password'],
'userDomain': vim_params['user_domain_name'],
'projectDomain': vim_params['project_domain_name']
}
)
return vim_info
@classmethod
def create_vnf_package(cls, sample_path, user_data={},
image_path=None, nfvo=False, userdata_path=None,
provider=None):
vnfd_id = uuidutils.generate_uuid()
tmp_dir = tempfile.mkdtemp()
utils.make_zip(sample_path, tmp_dir, vnfd_id, image_path,
userdata_path, provider)
zip_file_name = os.path.basename(os.path.abspath(sample_path)) + ".zip"
zip_file_path = os.path.join(tmp_dir, zip_file_name)
if nfvo:
return zip_file_path, vnfd_id
else:
path = "/vnfpkgm/v1/vnf_packages"
req_body = {'userDefinedData': user_data}
resp, body = cls.tacker_client.do_request(
path, "POST", expected_status=[201], body=req_body)
pkg_id = body['id']
with open(zip_file_path, 'rb') as fp:
path = "/vnfpkgm/v1/vnf_packages/{}/package_content".format(
pkg_id)
resp, body = cls.tacker_client.do_request(
path, "PUT", body=fp, content_type='application/zip',
expected_status=[202])
# wait for onboard
timeout = VNF_PACKAGE_UPLOAD_TIMEOUT
start_time = int(time.time())
path = "/vnfpkgm/v1/vnf_packages/{}".format(pkg_id)
while True:
resp, body = cls.tacker_client.do_request(
path, "GET", expected_status=[200])
if body['onboardingState'] == "ONBOARDED":
break
if ((int(time.time()) - start_time) > timeout):
raise Exception("Failed to onboard vnf package")
time.sleep(5)
shutil.rmtree(tmp_dir)
return pkg_id, vnfd_id
@classmethod
def delete_vnf_package(cls, pkg_id):
path = "/vnfpkgm/v1/vnf_packages/{}".format(pkg_id)
req_body = {"operationalState": "DISABLED"}
resp, _ = cls.tacker_client.do_request(
path, "PATCH", body=req_body)
if resp.status_code != 200:
LOG.error("failed to set operationalState to DISABLED")
return
cls.tacker_client.do_request(path, "DELETE")
def setUp(self):
super().setUp()
callback_url = os.path.join(
MOCK_NOTIFY_CALLBACK_URL,
self._testMethodName)
FAKE_SERVER_MANAGER.clear_history(callback_url)
FAKE_SERVER_MANAGER.set_callback('POST', callback_url, status_code=204)
FAKE_SERVER_MANAGER.set_callback('GET', callback_url, status_code=204)
def get_vnf_package(self, pkg_id):
path = "/vnfpkgm/v1/vnf_packages/{}".format(pkg_id)
resp, body = self.tacker_client.do_request(path, "GET")
return body
return super().create_vnf_package(sample_path, user_data=user_data,
image_path=image_path, nfvo=nfvo,
userdata_path=userdata_path,
provider=provider)
def get_network_ids(self, networks):
path = "/v2.0/networks"
@@ -359,227 +231,15 @@ class BaseSolV2Test(base.BaseTestCase):
for image_id in image_ids:
glance_client.delete_image(image_id)
def create_vnf_instance(self, req_body):
path = "/vnflcm/v2/vnf_instances"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def delete_vnf_instance(self, inst_id):
path = "/vnflcm/v2/vnf_instances/{}".format(inst_id)
return self.tacker_client.do_request(
path, "DELETE", version="2.0.0")
def show_vnf_instance(self, inst_id):
path = "/vnflcm/v2/vnf_instances/{}".format(inst_id)
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def list_vnf_instance(self, filter_expr=None):
path = "/vnflcm/v2/vnf_instances"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def instantiate_vnf_instance(self, inst_id, req_body):
path = "/vnflcm/v2/vnf_instances/{}/instantiate".format(inst_id)
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def scale_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/scale"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def update_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}"
return self.tacker_client.do_request(
path, "PATCH", body=req_body, version="2.0.0")
def heal_vnf_instance(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/heal"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
path, "PATCH", body=req_body, version=VNFLCM_V2_VERSION)
def change_ext_conn(self, inst_id, req_body):
path = f"/vnflcm/v2/vnf_instances/{inst_id}/change_ext_conn"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def change_vnfpkg(self, inst_id, req_body):
path = "/vnflcm/v2/vnf_instances/{}/change_vnfpkg".format(inst_id)
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def terminate_vnf_instance(self, inst_id, req_body):
path = "/vnflcm/v2/vnf_instances/{}/terminate".format(inst_id)
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def rollback(self, lcmocc_id):
path = "/vnflcm/v2/vnf_lcm_op_occs/{}/rollback".format(lcmocc_id)
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def wait_lcmocc_complete(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = "/vnflcm/v2/vnf_lcm_op_occs/{}".format(lcmocc_id)
while True:
time.sleep(5)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version="2.0.0")
state = body['operationState']
if state == 'COMPLETED':
return
elif state in ['STARTING', 'PROCESSING']:
continue
else: # FAILED_TEMP or ROLLED_BACK
raise Exception("Operation failed. state: %s" % state)
def wait_lcmocc_failed_temp(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = "/vnflcm/v2/vnf_lcm_op_occs/{}".format(lcmocc_id)
while True:
time.sleep(5)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version="2.0.0")
state = body['operationState']
if state == 'FAILED_TEMP':
return
elif state in ['STARTING', 'PROCESSING']:
continue
elif state == 'COMPLETED':
raise Exception("Operation unexpected COMPLETED.")
else: # ROLLED_BACK
raise Exception("Operation failed. state: %s" % state)
def wait_lcmocc_rolled_back(self, lcmocc_id):
# NOTE: It is not necessary to set timeout because the operation
# itself set timeout and the state will become 'FAILED_TEMP'.
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}"
while True:
time.sleep(5)
_, body = self.tacker_client.do_request(
path, "GET", expected_status=[200], version="2.0.0")
state = body['operationState']
if state == 'ROLLED_BACK':
return
if state in ['ROLLING_BACK']:
continue
raise Exception(f"Operation failed. state: {state}")
def show_lcmocc(self, lcmocc_id):
path = "/vnflcm/v2/vnf_lcm_op_occs/{}".format(lcmocc_id)
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def list_lcmocc(self, filter_expr=None):
path = "/vnflcm/v2/vnf_lcm_op_occs"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def rollback_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/rollback"
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def retry_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/retry"
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def fail_lcmocc(self, lcmocc_id):
path = f"/vnflcm/v2/vnf_lcm_op_occs/{lcmocc_id}/fail"
return self.tacker_client.do_request(
path, "POST", version="2.0.0")
def prometheus_auto_healing_alert(self, req_body):
path = "/alert/auto_healing"
return self.tacker_client.do_request(
path, "POST", body=req_body)
def prometheus_auto_scaling_alert(self, req_body):
path = "/alert/auto_scaling"
return self.tacker_client.do_request(
path, "POST", body=req_body)
def create_subscription(self, req_body):
path = "/vnflcm/v2/subscriptions"
return self.tacker_client.do_request(
path, "POST", body=req_body, version="2.0.0")
def delete_subscription(self, sub_id):
path = "/vnflcm/v2/subscriptions/{}".format(sub_id)
return self.tacker_client.do_request(
path, "DELETE", version="2.0.0")
def show_subscription(self, sub_id):
path = "/vnflcm/v2/subscriptions/{}".format(sub_id)
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def list_subscriptions(self, filter_expr=None):
path = "/vnflcm/v2/subscriptions"
if filter_expr:
path = "{}?{}".format(path, urllib.parse.urlencode(filter_expr))
return self.tacker_client.do_request(
path, "GET", version="2.0.0")
def _check_resp_headers(self, resp, supported_headers):
unsupported_headers = ['Retry-After',
'Content-Range', 'WWW-Authenticate']
for s in supported_headers:
if s not in resp.headers:
raise Exception("Supported header doesn't exist: %s" % s)
for u in unsupported_headers:
if u in resp.headers:
raise Exception("Unsupported header exist: %s" % u)
def check_resp_headers_in_create(self, resp):
# includes location header and response body
supported_headers = ['Version', 'Location', 'Content-Type',
'Accept-Ranges']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_operation_task(self, resp):
# includes location header and no response body
supported_headers = ['Version', 'Location']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_get(self, resp):
# includes a single data in response body and no location header
supported_headers = ['Version', 'Content-Type',
'Accept-Ranges']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_index(self, resp):
# includes some data in response body and no location header
supported_headers = ['Version', 'Content-Type',
'Accept-Ranges', 'Link']
self._check_resp_headers(resp, supported_headers)
def check_resp_headers_in_delete(self, resp):
# no location header and response body
supported_headers = ['Version']
self._check_resp_headers(resp, supported_headers)
def check_resp_body(self, body, expected_attrs):
for attr in expected_attrs:
if attr not in body:
raise Exception("Expected attribute doesn't exist: %s" % attr)
def assert_notification_get(self, callback_url):
notify_mock_responses = FAKE_SERVER_MANAGER.get_history(
callback_url)
FAKE_SERVER_MANAGER.clear_history(
callback_url)
self.assertEqual(1, len(notify_mock_responses))
self.assertEqual(204, notify_mock_responses[0].status_code)
path, "POST", body=req_body, version=VNFLCM_V2_VERSION)
def get_current_vdu_image(
self, stack_id, stack_name, resource_name):

View File

@@ -22,6 +22,8 @@ from tacker.tests.functional.sol_separated_nfvo_v2 import fake_vnfpkgm_v2
from tacker.tests.functional.sol_v2_common import base_v2
from tacker.tests.functional.sol_v2_common import paramgen
WAIT_LCMOCC_UPDATE_TIME = 10
@ddt.ddt
class CommonVnfLcmTest(base_v2.BaseSolV2Test):
@@ -45,7 +47,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
Response: VNF Package information
"""
# Set Token
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST', fake_grant_v2.GrantV2.TOKEN,
status_code=200,
response_headers={"Content-Type": "application/json"},
@@ -53,7 +55,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
)
# Set "VNF Package content" response
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'GET',
os.path.join(
'/vnfpkgm/v2/onboarded_vnf_packages',
@@ -64,7 +66,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
)
# Set "Individual VNF package" response
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'GET',
os.path.join(
'/vnfpkgm/v2/onboarded_vnf_packages',
@@ -76,7 +78,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
)
# Set "VNFD of individual VNF package" response
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'GET',
os.path.join(
'/vnfpkgm/v2/onboarded_vnf_packages',
@@ -86,17 +88,12 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
content=package_path
)
def _check_package_usage(self, is_nfvo, package_id, state='NOT_IN_USE'):
if not is_nfvo:
usage_state = self.get_vnf_package(package_id)['usageState']
self.assertEqual(state, usage_state)
def _set_grant_response(self, is_nfvo, operation, glance_image=None,
flavour_vdu_dict=None, zone_name_list=None):
if is_nfvo:
if operation == 'INSTANTIATE':
# Set Fake server response for Grant-Req(Instantiate)
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST', fake_grant_v2.GrantV2.GRANT_REQ_PATH,
status_code=201,
response_headers={"Content-Type": "application/json"},
@@ -106,7 +103,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
zone_name_list))
elif operation == 'TERMINATE':
# Set Fake server response for Grant-Req(Terminate)
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
fake_grant_v2.GrantV2.GRANT_REQ_PATH,
status_code=201,
@@ -116,7 +113,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
req_body))
elif operation == 'SCALE':
# Set Fake server response for Grant-Req(Scale)
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
fake_grant_v2.GrantV2.GRANT_REQ_PATH, status_code=201,
response_headers={"Content-Type": "application/json"},
@@ -126,7 +123,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
flavour_vdu_dict, zone_name_list))
elif operation == 'HEAL':
# Set Fake server response for Grant-Req(Heal)
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
fake_grant_v2.GrantV2.GRANT_REQ_PATH, status_code=201,
response_headers={"Content-Type": "application/json"},
@@ -136,7 +133,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
flavour_vdu_dict, zone_name_list))
elif operation == 'CHANGE_EXT_CONN':
# Set Fake server response for Grant-Req(change_ext_conn)
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
fake_grant_v2.GrantV2.GRANT_REQ_PATH, status_code=201,
response_headers={"Content-Type": "application/json"},
@@ -145,7 +142,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
req_body, zone_name_list))
elif operation == 'CHANGE_VNFPKG':
# Set Fake server response for Grant-Req(Change_vnfpkg)
base_v2.FAKE_SERVER_MANAGER.set_callback(
self.set_server_callback(
'POST',
fake_grant_v2.GrantV2.GRANT_REQ_PATH,
status_code=201,
@@ -218,15 +215,15 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
update_vnf_path = os.path.join(
cur_dir, "samples/update_vnf")
vnfd_path = "contents/Definitions/v2_sample1_df_simple.yaml"
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
max_zip_path, max_vnfd_id = self.create_vnf_package(
basic_lcms_max_path, image_path=image_path, nfvo=True)
zip_path_file_2, vnfd_id_2 = self.create_vnf_package(
upd_zip_path, upd_vnfd_id = self.create_vnf_package(
update_vnf_path, nfvo=True)
self._register_vnf_package_mock_response(vnfd_id_1,
zip_path_file_1)
self._register_vnf_package_mock_response(vnfd_id_2,
zip_path_file_2)
self._register_vnf_package_mock_response(max_vnfd_id,
max_zip_path)
self._register_vnf_package_mock_response(upd_vnfd_id,
upd_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_max_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
@@ -234,14 +231,14 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
zone_name_list = self.get_zone_list()
sw_data = fake_grant_v2.GrantV2.get_sw_data(
basic_lcms_max_path, vnfd_path)
create_req = paramgen.create_vnf_max(vnfd_id_1)
self.vnf_pkg_1 = None
self.vnf_pkg_3 = None
create_req = paramgen.create_vnf_max(max_vnfd_id)
self.max_pkg = None
self.upd_pkg = None
else:
glance_image = None
flavour_vdu_dict = None
zone_name_list = None
create_req = paramgen.create_vnf_max(self.vnfd_id_1)
create_req = paramgen.create_vnf_max(self.max_vnfd_id)
# Create a new network and subnet to check the IP allocation of
# IPv4 and IPv6
ft_net0_name = 'ft-net0'
@@ -295,10 +292,10 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.addCleanup(self.delete_port, port_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(callback_uri)
@@ -311,7 +308,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assert_notification_get(callback_url)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_1)
self.check_package_usage(self.max_pkg, is_nfvo=is_nfvo)
# 3. Show subscription
expected_attrs = [
@@ -360,7 +357,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
inst_id = body['id']
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_1, 'IN_USE')
self.check_package_usage(self.max_pkg, 'IN_USE', is_nfvo)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -377,7 +374,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
image_path, sw_data, inst_id, num_vdu=2)
glance_image['VDU1-VirtualStorage'] = image_1_id
glance_image['VDU2-VirtualStorage'] = image_2_id
time.sleep(10)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
self._set_grant_response(
is_nfvo, 'INSTANTIATE', glance_image=glance_image,
@@ -781,7 +778,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_1, 'IN_USE')
self.check_package_usage(self.max_pkg, 'IN_USE', is_nfvo)
# check stack info
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -902,7 +899,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_1, 'IN_USE')
self.check_package_usage(self.max_pkg, 'IN_USE', is_nfvo)
# check stack info
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -945,7 +942,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_1, 'IN_USE')
self.check_package_usage(self.max_pkg, 'IN_USE', is_nfvo)
# check stack info
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -999,7 +996,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_1, 'IN_USE')
self.check_package_usage(self.max_pkg, 'IN_USE', is_nfvo)
# check stack info
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -1037,19 +1034,19 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# 23. Update VNF
# check attribute value before update VNF
# check usageState of VNF Package 1
self._check_package_usage(is_nfvo, self.vnf_pkg_1, 'IN_USE')
# check usageState of max pattern VNF Package
self.check_package_usage(self.max_pkg, 'IN_USE', is_nfvo)
# check usageState of VNF Package 3
self._check_package_usage(is_nfvo, self.vnf_pkg_3)
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, is_nfvo=is_nfvo)
# check vnfd id
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
if not is_nfvo:
self.assertEqual(self.vnfd_id_1, body['vnfdId'])
self.assertEqual(self.max_vnfd_id, body['vnfdId'])
else:
self.assertEqual(vnfd_id_1, body['vnfdId'])
self.assertEqual(max_vnfd_id, body['vnfdId'])
# check vnfc info
vnfc_info = body['instantiatedVnfInfo']['vnfcInfo']
@@ -1062,9 +1059,9 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assertIsNone(vnfc.get('vnfcConfigurableProperties'))
if not is_nfvo:
update_req = paramgen.update_vnf_max(self.vnfd_id_3, vnfc_ids)
update_req = paramgen.update_vnf_max(self.upd_vnfd_id, vnfc_ids)
else:
update_req = paramgen.update_vnf_max(vnfd_id_2, vnfc_ids)
update_req = paramgen.update_vnf_max(upd_vnfd_id, vnfc_ids)
resp, body = self.update_vnf_instance(inst_id, update_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -1087,17 +1084,17 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assertEqual(fields.VnfOperationalStateType.STARTED,
body['instantiatedVnfInfo']['vnfState'])
# check usageState of VNF Package 1
self._check_package_usage(is_nfvo, self.vnf_pkg_1)
# check usageState of max pattern VNF Package
self.check_package_usage(self.max_pkg, is_nfvo=is_nfvo)
# check usageState of VNF Package 3
self._check_package_usage(is_nfvo, self.vnf_pkg_3, 'IN_USE')
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, 'IN_USE', is_nfvo)
if not is_nfvo:
# check the specified attribute after update VNF
self.assertEqual(self.vnfd_id_3, body['vnfdId'])
self.assertEqual(self.upd_vnfd_id, body['vnfdId'])
else:
self.assertEqual(vnfd_id_2, body['vnfdId'])
self.assertEqual(upd_vnfd_id, body['vnfdId'])
self.assertEqual('new name', body['vnfInstanceName'])
self.assertEqual('new description', body['vnfInstanceDescription'])
dummy_key_value = {'dummy-key': 'dummy-value'}
@@ -1147,7 +1144,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
time.sleep(WAIT_LCMOCC_UPDATE_TIME)
# check deletion of Heat-stack
stack_status, _ = self.heat_client.get_status(stack_name)
@@ -1160,7 +1157,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assertIsNone(image_id)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_3, 'IN_USE')
self.check_package_usage(self.upd_pkg, 'IN_USE', is_nfvo)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -1175,9 +1172,10 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# execute "update vnf" again to update the vnfd_id to the
# original vnfd_id
if not is_nfvo:
update_req = paramgen.update_vnf_min_with_parameter(self.vnfd_id_1)
update_req = paramgen.update_vnf_min_with_parameter(
self.max_vnfd_id)
else:
update_req = paramgen.update_vnf_min_with_parameter(vnfd_id_1)
update_req = paramgen.update_vnf_min_with_parameter(max_vnfd_id)
resp, body = self.update_vnf_instance(inst_id, update_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -1202,12 +1200,8 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# 29. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -1216,7 +1210,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(404, resp.status_code)
self._check_package_usage(is_nfvo, self.vnf_pkg_3)
self.check_package_usage(self.upd_pkg, is_nfvo=is_nfvo)
# 31. Delete subscription
resp, body = self.delete_subscription(sub_id)
@@ -1236,8 +1230,9 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
def basic_lcms_min_common_test(self, is_nfvo=False):
"""Test LCM operations with omitting except for required attributes
The change_ext_conn can't be tested here because VNF package 2 don't
have external connectivity. So moved it to the test_scale_other_lcm().
The change_ext_conn can't be tested here because min pattern VNF
package don't have external connectivity. So moved it to
the test_scale_other_lcm().
* About attributes:
Omit except for required attributes.
@@ -1274,38 +1269,39 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# for basic lcms tests min pattern
basic_lcms_min_path = os.path.join(
cur_dir, "samples/basic_lcms_min")
zip_path_file_1, vnfd_id_1 = self.create_vnf_package(
min_zip_path, min_vnfd_id = self.create_vnf_package(
basic_lcms_min_path, nfvo=True)
update_vnf_path = os.path.join(
cur_dir, "samples/update_vnf")
vnfd_path = "contents/Definitions/v2_sample2_df_simple.yaml"
zip_path_file_2, vnfd_id_2 = self.create_vnf_package(
upd_zip_path, upd_vnfd_id = self.create_vnf_package(
update_vnf_path, nfvo=True)
self._register_vnf_package_mock_response(
vnfd_id_1, zip_path_file_1)
min_vnfd_id, min_zip_path)
self._register_vnf_package_mock_response(
vnfd_id_2, zip_path_file_2)
upd_vnfd_id, upd_zip_path)
glance_image = fake_grant_v2.GrantV2.get_sw_image(
basic_lcms_min_path, vnfd_path)
flavour_vdu_dict = fake_grant_v2.GrantV2.get_compute_flavor(
basic_lcms_min_path, vnfd_path)
zone_name_list = self.get_zone_list()
create_req = paramgen.create_vnf_min(vnfd_id_1)
update_req = paramgen.update_vnf_min_with_parameter(vnfd_id_2)
self.vnf_pkg_2 = None
self.vnf_pkg_3 = None
create_req = paramgen.create_vnf_min(min_vnfd_id)
update_req = paramgen.update_vnf_min_with_parameter(upd_vnfd_id)
self.min_pkg = None
self.upd_pkg = None
else:
glance_image = None
flavour_vdu_dict = None
zone_name_list = None
create_req = paramgen.create_vnf_min(self.vnfd_id_2)
update_req = paramgen.update_vnf_min_with_parameter(self.vnfd_id_3)
create_req = paramgen.create_vnf_min(self.min_vnfd_id)
update_req = paramgen.update_vnf_min_with_parameter(
self.upd_vnfd_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_min(callback_uri)
@@ -1317,7 +1313,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# 2. Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_2)
self.check_package_usage(self.min_pkg, is_nfvo=is_nfvo)
# 3. Create VNF instance
# ETSI NFV SOL003 v3.3.1 5.5.2.2 VnfInstance
@@ -1345,7 +1341,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
inst_id = body['id']
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_2, 'IN_USE')
self.check_package_usage(self.min_pkg, 'IN_USE', is_nfvo)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -1457,18 +1453,18 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assertEqual(fields.VnfOperationalStateType.STARTED,
body['instantiatedVnfInfo']['vnfState'])
# check usageState of VNF Package 2
self._check_package_usage(is_nfvo, self.vnf_pkg_2, 'IN_USE')
# check usageState of min pattern VNF Package
self.check_package_usage(self.min_pkg, 'IN_USE', is_nfvo)
# check usageState of VNF Package 3
self._check_package_usage(is_nfvo, self.vnf_pkg_3)
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, is_nfvo=is_nfvo)
if not is_nfvo:
# check vnfd id
self.assertEqual(self.vnfd_id_2, body['vnfdId'])
self.assertEqual(self.min_vnfd_id, body['vnfdId'])
else:
# check vnfd id
self.assertEqual(vnfd_id_1, body['vnfdId'])
self.assertEqual(min_vnfd_id, body['vnfdId'])
# 8. Update VNF
resp, body = self.update_vnf_instance(inst_id, update_req)
@@ -1478,21 +1474,21 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# check usageState of VNF Package 2
self._check_package_usage(is_nfvo, self.vnf_pkg_2)
# check usageState of min pattern VNF Package
self.check_package_usage(self.min_pkg, is_nfvo=is_nfvo)
# check usageState of VNF Package 3
self._check_package_usage(is_nfvo, self.vnf_pkg_3, 'IN_USE')
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, 'IN_USE', is_nfvo)
if not is_nfvo:
# check vnfd id
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
self.assertEqual(self.vnfd_id_3, body['vnfdId'])
self.assertEqual(self.upd_vnfd_id, body['vnfdId'])
else:
# check vnfd id
resp, body = self.show_vnf_instance(inst_id)
self.assertEqual(200, resp.status_code)
self.assertEqual(vnfd_id_2, body['vnfdId'])
self.assertEqual(upd_vnfd_id, body['vnfdId'])
# 9. Heal VNF(vnfc)
self._set_grant_response(
@@ -1547,8 +1543,8 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assertEqual(fields.VnfOperationalStateType.STARTED,
body['instantiatedVnfInfo']['vnfState'])
# check usageState of VNF Package 3
self._check_package_usage(is_nfvo, self.vnf_pkg_3, 'IN_USE')
# check usageState of update VNF Package
self.check_package_usage(self.upd_pkg, 'IN_USE', is_nfvo)
# 11. Scale out operation
self._set_grant_response(
@@ -1614,16 +1610,12 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# check deletion of Heat-stack
stack_status, _ = self.heat_client.get_status(stack_name)
self.assertIsNone(stack_status)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_3, 'IN_USE')
self.check_package_usage(self.upd_pkg, 'IN_USE', is_nfvo)
# check instantiationState of VNF
resp, body = self.show_vnf_instance(inst_id)
@@ -1638,10 +1630,12 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# execute "update vnf" again to update the vnfd_id to the
# original vnfd_id
if not is_nfvo:
update_req = paramgen.update_vnf_min_with_parameter(self.vnfd_id_2)
update_req = paramgen.update_vnf_min_with_parameter(
self.min_vnfd_id)
else:
update_req = paramgen.update_vnf_min_with_parameter(vnfd_id_1)
resp, body = self.update_vnf_instance(inst_id, update_req)
update_req = paramgen.update_vnf_min_with_parameter(min_vnfd_id)
resp, body = self.exec_lcm_operation(self.update_vnf_instance,
inst_id, update_req)
self.assertEqual(202, resp.status_code)
self.check_resp_headers_in_operation_task(resp)
@@ -1665,12 +1659,8 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# 18. Delete a VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -1679,7 +1669,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.assertEqual(404, resp.status_code)
# check usageState of VNF Package
self._check_package_usage(is_nfvo, self.vnf_pkg_3)
self.check_package_usage(self.upd_pkg, is_nfvo=is_nfvo)
# 19. Delete subscription
resp, body = self.delete_subscription(sub_id)
@@ -1732,7 +1722,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
change_vnfpkg_from_image_to_image_path = os.path.join(
cur_dir,
"samples/test_instantiate_vnf_with_old_image_or_volume")
zip_file_path_1, vnfd_id_1 = self.create_vnf_package(
old_zip_path, old_vnfd_id = self.create_vnf_package(
change_vnfpkg_from_image_to_image_path, nfvo=True)
change_vnfpkg_from_image_to_image_path_2 = os.path.join(
cur_dir, "samples/test_change_vnf_pkg_with_new_image")
@@ -1740,7 +1730,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
cur_dir, "../../etc/samples/etsi/nfv/common/Files/images")
image_file = "cirros-0.5.2-x86_64-disk.img"
image_path = os.path.abspath(os.path.join(image_dir, image_file))
zip_file_path_2, vnfd_id_2 = self.create_vnf_package(
new_image_zip_path, new_image_vnfd_id = self.create_vnf_package(
change_vnfpkg_from_image_to_image_path_2,
image_path=image_path, nfvo=True)
package_dir = os.path.join(
@@ -1762,17 +1752,17 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
package_dir, vnfd_path)
zone_name_list = self.get_zone_list()
self._register_vnf_package_mock_response(
vnfd_id_1, zip_file_path_1)
create_req = paramgen.change_vnfpkg_create(vnfd_id_1)
old_vnfd_id, old_zip_path)
create_req = paramgen.change_vnfpkg_create(old_vnfd_id)
change_vnfpkg_req = paramgen.change_vnfpkg_with_ext_vl(
vnfd_id_2, self.get_network_ids(['net1']))
new_image_vnfd_id, self.get_network_ids(['net1']))
else:
glance_image = None
flavour_vdu_dict = None
zone_name_list = None
create_req = paramgen.change_vnfpkg_create(self.vnfd_id_1)
create_req = paramgen.change_vnfpkg_create(self.old_vnfd_id)
change_vnfpkg_req = paramgen.change_vnfpkg_with_ext_vl(
self.vnfd_id_2, self.get_network_ids(['net1']))
self.new_image_vnfd_id, self.get_network_ids(['net1']))
# 1. Create VNF instance
resp, body = self.create_vnf_instance(create_req)
@@ -1835,7 +1825,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# 4. Change Current VNF Package
if is_nfvo:
self._register_vnf_package_mock_response(
vnfd_id_2, zip_file_path_2)
new_image_vnfd_id, new_image_zip_path)
g_image_id_1, g_image_id_2 = self.glance_create_image(
instantiate_req.get("vimConnectionInfo").get("vim1"),
image_path, sw_data, inst_id, num_vdu=2)
@@ -1873,12 +1863,8 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
lcmocc_id = os.path.basename(resp.headers['Location'])
self.wait_lcmocc_complete(lcmocc_id)
# wait a bit because there is a bit time lag between lcmocc DB
# update and terminate completion.
time.sleep(10)
# 7. Delete VNF instance
resp, body = self.delete_vnf_instance(inst_id)
resp, body = self.exec_lcm_operation(self.delete_vnf_instance, inst_id)
self.assertEqual(204, resp.status_code)
self.check_resp_headers_in_delete(resp)
@@ -1929,7 +1915,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# Scale operation will fail
scale_ng_path = os.path.join(cur_dir, "samples/scale_ng")
zip_file_path_1, vnfd_id_1 = self.create_vnf_package(
scale_ng_zip_path, scale_ng_vnfd_id = self.create_vnf_package(
scale_ng_path, image_path=image_path, nfvo=True)
vnfd_path = "contents/Definitions/v2_sample1_df_simple.yaml"
glance_image = fake_grant_v2.GrantV2.get_sw_image(
@@ -1940,14 +1926,14 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
sw_data = fake_grant_v2.GrantV2.get_sw_data(scale_ng_path,
vnfd_path)
self._register_vnf_package_mock_response(
vnfd_id_1, zip_file_path_1)
create_req = paramgen.create_vnf_max(vnfd_id_1)
self.vnf_pkg_1 = None
scale_ng_vnfd_id, scale_ng_zip_path)
create_req = paramgen.create_vnf_max(scale_ng_vnfd_id)
self.scale_ng_pkg = None
else:
glance_image = None
flavour_vdu_dict = None
zone_name_list = None
create_req = paramgen.create_vnf_max(self.vnfd_id_1)
create_req = paramgen.create_vnf_max(self.scale_ng_vnfd_id)
# Create a new network and subnet to check the IP allocation of
# IPv4 and IPv6
ft_net0_name = 'ft-net0'
@@ -1981,10 +1967,10 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
self.addCleanup(self.delete_port, port_id)
# 1. Create subscription
callback_url = os.path.join(base_v2.MOCK_NOTIFY_CALLBACK_URL,
callback_url = os.path.join(self.get_notify_callback_url(),
self._testMethodName)
callback_uri = ('http://localhost:'
f'{base_v2.FAKE_SERVER_MANAGER.SERVER_PORT}'
f'{self.get_server_port()}'
f'{callback_url}')
sub_req = paramgen.sub_create_max(callback_uri)
@@ -1996,7 +1982,7 @@ class CommonVnfLcmTest(base_v2.BaseSolV2Test):
# 2. Test notification
self.assert_notification_get(callback_url)
# check usageState of VNF Package