Fix some bugs related legacy cnf operations
This patch fixes some bugs related legacy cnf operations below: * Delete the "unsupported key check" of policies in TOSCA template, to resolve `openstack vnf create` command failure due to property validation of policies. * Change the branch condition of legacy/sol, to resolve the `openstack vnf scale` command failure due to keyError. * Add interval to each retry loops of delete_wait_legacy, to resolve the `openstack vnf delete` command failure. And this patch revises the documentation for legacy cnf operations to work properly. Closes-Bug: #1920085 Change-Id: If14b95b2f9dfafe994a5ebf4f447a2bf7d27981c
This commit is contained in:
parent
550b39277f
commit
667377b849
@ -83,6 +83,8 @@ Kubernetes environment with one container per VDU.
|
|||||||
min_instances: 1
|
min_instances: 1
|
||||||
max_instances: 3
|
max_instances: 3
|
||||||
target_cpu_utilization_percentage: 40
|
target_cpu_utilization_percentage: 40
|
||||||
|
default_instances: 1 # required parameter but ignored for cnf
|
||||||
|
increment: 1 # required parameter but ignored for cnf
|
||||||
|
|
||||||
In "vnfcs", there are 2 components: front_end and rss_reader.
|
In "vnfcs", there are 2 components: front_end and rss_reader.
|
||||||
We model them as Containers [#second]_ inside a Pod [#third]_. To provide
|
We model them as Containers [#second]_ inside a Pod [#third]_. To provide
|
||||||
@ -158,6 +160,8 @@ will be added in the future.
|
|||||||
min_instances: 1
|
min_instances: 1
|
||||||
max_instances: 3
|
max_instances: 3
|
||||||
target_cpu_utilization_percentage: 40
|
target_cpu_utilization_percentage: 40
|
||||||
|
default_instances: 1 # required parameter but ignored for cnf
|
||||||
|
increment: 1 # required parameter but ignored for cnf
|
||||||
|
|
||||||
2. Two containers per VDU example
|
2. Two containers per VDU example
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -204,6 +208,8 @@ Similar to the above example, in this scenario, we define 2 containers in VDU1.
|
|||||||
min_instances: 1
|
min_instances: 1
|
||||||
max_instances: 3
|
max_instances: 3
|
||||||
target_cpu_utilization_percentage: 40
|
target_cpu_utilization_percentage: 40
|
||||||
|
default_instances: 1 # required parameter but ignored for cnf
|
||||||
|
increment: 1 # required parameter but ignored for cnf
|
||||||
|
|
||||||
Viewing a containerized VNF
|
Viewing a containerized VNF
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -284,7 +290,7 @@ User also can scale VNF manually, by running the following commands:
|
|||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
$ openstack vnf scale --vnf-name VNF1 --scaling-policy-name SP1 --scaling-type out
|
$ openstack vnf scale --scaling-policy-name SP1 --scaling-type out VNF1
|
||||||
|
|
||||||
$ kubectl get deployment
|
$ kubectl get deployment
|
||||||
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
|
||||||
|
@ -34,4 +34,6 @@ topology_template:
|
|||||||
properties:
|
properties:
|
||||||
min_instances: 1
|
min_instances: 1
|
||||||
max_instances: 3
|
max_instances: 3
|
||||||
target_cpu_utilization_percentage: 40
|
target_cpu_utilization_percentage: 40
|
||||||
|
default_instances: 1 # required parameter but ignored for cnf
|
||||||
|
increment: 1 # required parameter but ignored for cnf
|
||||||
|
@ -34,3 +34,5 @@ topology_template:
|
|||||||
min_instances: 1
|
min_instances: 1
|
||||||
max_instances: 10
|
max_instances: 10
|
||||||
target_cpu_utilization_percentage: 50
|
target_cpu_utilization_percentage: 50
|
||||||
|
default_instances: 1 # required parameter but ignored for cnf
|
||||||
|
increment: 1 # required parameter but ignored for cnf
|
||||||
|
@ -1023,21 +1023,24 @@ def fake_pod_list():
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_scale_policy(type, aspect_id='vdu1', delta_num=1):
|
def get_scale_policy(type, aspect_id='vdu1', delta_num=1, is_legacy=False):
|
||||||
policy = dict()
|
policy = dict()
|
||||||
policy['vnf_instance_id'] = uuidsentinel.vnf_instance_id
|
|
||||||
policy['action'] = type
|
policy['action'] = type
|
||||||
policy['name'] = aspect_id
|
policy['name'] = aspect_id
|
||||||
policy['delta_num'] = delta_num
|
if is_legacy:
|
||||||
policy['vdu_defs'] = {
|
policy['instance_id'] = "fake_namespace,fake_name"
|
||||||
'VDU1': {
|
else:
|
||||||
'type': 'tosca.nodes.nfv.Vdu.Compute',
|
policy['vnf_instance_id'] = uuidsentinel.vnf_instance_id
|
||||||
'properties': {
|
policy['delta_num'] = delta_num
|
||||||
'name': 'fake_name',
|
policy['vdu_defs'] = {
|
||||||
'description': 'test description',
|
'VDU1': {
|
||||||
'vdu_profile': {
|
'type': 'tosca.nodes.nfv.Vdu.Compute',
|
||||||
'min_number_of_instances': 1,
|
'properties': {
|
||||||
'max_number_of_instances': 3}}}}
|
'name': 'fake_name',
|
||||||
|
'description': 'test description',
|
||||||
|
'vdu_profile': {
|
||||||
|
'min_number_of_instances': 1,
|
||||||
|
'max_number_of_instances': 3}}}}
|
||||||
|
|
||||||
return policy
|
return policy
|
||||||
|
|
||||||
|
@ -2352,7 +2352,8 @@ class TestKubernetes(base.TestCase):
|
|||||||
mock_read_namespaced_deployment,
|
mock_read_namespaced_deployment,
|
||||||
mock_patch_namespaced_deployment_scale,
|
mock_patch_namespaced_deployment_scale,
|
||||||
mock_read_namespaced_horizontal_pod_autoscaler):
|
mock_read_namespaced_horizontal_pod_autoscaler):
|
||||||
policy = fakes.get_scale_policy(type=scale_type, aspect_id='SP1')
|
policy = fakes.get_scale_policy(
|
||||||
|
type=scale_type, aspect_id='SP1', is_legacy=True)
|
||||||
policy['instance_id'] = "fake_namespace,fake_name"
|
policy['instance_id'] = "fake_namespace,fake_name"
|
||||||
mock_vnf_resource_list.return_value = []
|
mock_vnf_resource_list.return_value = []
|
||||||
mock_read_namespaced_deployment.return_value = \
|
mock_read_namespaced_deployment.return_value = \
|
||||||
@ -2569,8 +2570,8 @@ class TestKubernetes(base.TestCase):
|
|||||||
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id")
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id")
|
||||||
def test_scale_wait_legacy(self, mock_vnf_resource_list,
|
def test_scale_wait_legacy(self, mock_vnf_resource_list,
|
||||||
mock_list_namespaced_pod):
|
mock_list_namespaced_pod):
|
||||||
policy = fakes.get_scale_policy(type='out', aspect_id='SP1')
|
policy = fakes.get_scale_policy(
|
||||||
policy['instance_id'] = "fake_namespace,fake_name"
|
type='out', aspect_id='SP1', is_legacy=True)
|
||||||
mock_vnf_resource_list.return_value = []
|
mock_vnf_resource_list.return_value = []
|
||||||
mock_list_namespaced_pod.return_value = \
|
mock_list_namespaced_pod.return_value = \
|
||||||
client.V1PodList(items=[
|
client.V1PodList(items=[
|
||||||
@ -2587,8 +2588,8 @@ class TestKubernetes(base.TestCase):
|
|||||||
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id")
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id")
|
||||||
def test_scale_wait_legacy_retry_over(self, mock_vnf_resource_list,
|
def test_scale_wait_legacy_retry_over(self, mock_vnf_resource_list,
|
||||||
mock_list_namespaced_pod):
|
mock_list_namespaced_pod):
|
||||||
policy = fakes.get_scale_policy(type='out', aspect_id='SP1')
|
policy = fakes.get_scale_policy(
|
||||||
policy['instance_id'] = "fake_namespace,fake_name"
|
type='out', aspect_id='SP1', is_legacy=True)
|
||||||
mock_vnf_resource_list.return_value = []
|
mock_vnf_resource_list.return_value = []
|
||||||
mock_list_namespaced_pod.return_value = \
|
mock_list_namespaced_pod.return_value = \
|
||||||
client.V1PodList(items=[
|
client.V1PodList(items=[
|
||||||
@ -2603,8 +2604,8 @@ class TestKubernetes(base.TestCase):
|
|||||||
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id")
|
@mock.patch.object(objects.VnfResourceList, "get_by_vnf_instance_id")
|
||||||
def test_scale_wait_legacy_status_unknown(self, mock_vnf_resource_list,
|
def test_scale_wait_legacy_status_unknown(self, mock_vnf_resource_list,
|
||||||
mock_list_namespaced_pod):
|
mock_list_namespaced_pod):
|
||||||
policy = fakes.get_scale_policy(type='out', aspect_id='SP1')
|
policy = fakes.get_scale_policy(
|
||||||
policy['instance_id'] = "fake_namespace,fake_name"
|
type='out', aspect_id='SP1', is_legacy=True)
|
||||||
mock_vnf_resource_list.return_value = []
|
mock_vnf_resource_list.return_value = []
|
||||||
mock_list_namespaced_pod.return_value = \
|
mock_list_namespaced_pod.return_value = \
|
||||||
client.V1PodList(items=[
|
client.V1PodList(items=[
|
||||||
|
@ -189,8 +189,11 @@ class Parser(object):
|
|||||||
and vdu_name in policy.targets:
|
and vdu_name in policy.targets:
|
||||||
count = count + 1
|
count = count + 1
|
||||||
policy_props = policy.properties
|
policy_props = policy.properties
|
||||||
self.check_unsupported_key(policy_props,
|
# NOTE(ueha): check_unsupported_key() is commented out to
|
||||||
ALLOWED_SCALING_OBJECT_PROPS)
|
# resolve vnf create error due to required
|
||||||
|
# parameters of policies.
|
||||||
|
# self.check_unsupported_key(policy_props,
|
||||||
|
# ALLOWED_SCALING_OBJECT_PROPS)
|
||||||
scaling_obj.scaling_name = policy.name
|
scaling_obj.scaling_name = policy.name
|
||||||
scaling_obj.target_cpu_utilization_percentage = \
|
scaling_obj.target_cpu_utilization_percentage = \
|
||||||
policy_props.get(
|
policy_props.get(
|
||||||
|
@ -930,6 +930,7 @@ class Kubernetes(abstract_driver.VnfAbstractDriver,
|
|||||||
# If one of objects is still alive, keeps on waiting
|
# If one of objects is still alive, keeps on waiting
|
||||||
if count > 0:
|
if count > 0:
|
||||||
keep_going = True
|
keep_going = True
|
||||||
|
time.sleep(self.STACK_RETRY_WAIT)
|
||||||
else:
|
else:
|
||||||
keep_going = False
|
keep_going = False
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -1123,13 +1124,13 @@ class Kubernetes(abstract_driver.VnfAbstractDriver,
|
|||||||
"""
|
"""
|
||||||
# initialize Kubernetes APIs
|
# initialize Kubernetes APIs
|
||||||
auth_cred, file_descriptor = self._get_auth_creds(auth_attr)
|
auth_cred, file_descriptor = self._get_auth_creds(auth_attr)
|
||||||
vnf_resources = objects.VnfResourceList.get_by_vnf_instance_id(
|
|
||||||
context, policy['vnf_instance_id'])
|
|
||||||
try:
|
try:
|
||||||
if not vnf_resources:
|
if not policy.get('vnf_instance_id'):
|
||||||
# execute legacy scale method
|
# execute legacy scale method
|
||||||
self._scale_legacy(policy, auth_cred)
|
self._scale_legacy(policy, auth_cred)
|
||||||
else:
|
else:
|
||||||
|
vnf_resources = objects.VnfResourceList.get_by_vnf_instance_id(
|
||||||
|
context, policy['vnf_instance_id'])
|
||||||
app_v1_api_client = self.kubernetes.get_app_v1_api_client(
|
app_v1_api_client = self.kubernetes.get_app_v1_api_client(
|
||||||
auth=auth_cred)
|
auth=auth_cred)
|
||||||
aspect_id = policy['name']
|
aspect_id = policy['name']
|
||||||
@ -1287,13 +1288,13 @@ class Kubernetes(abstract_driver.VnfAbstractDriver,
|
|||||||
"""
|
"""
|
||||||
# initialize Kubernetes APIs
|
# initialize Kubernetes APIs
|
||||||
auth_cred, file_descriptor = self._get_auth_creds(auth_attr)
|
auth_cred, file_descriptor = self._get_auth_creds(auth_attr)
|
||||||
vnf_resources = objects.VnfResourceList.get_by_vnf_instance_id(
|
|
||||||
context, policy['vnf_instance_id'])
|
|
||||||
try:
|
try:
|
||||||
if not vnf_resources:
|
if not policy.get('vnf_instance_id'):
|
||||||
# execute legacy scale_wait method
|
# execute legacy scale_wait method
|
||||||
self._scale_wait_legacy(policy, auth_cred)
|
self._scale_wait_legacy(policy, auth_cred)
|
||||||
else:
|
else:
|
||||||
|
vnf_resources = objects.VnfResourceList.get_by_vnf_instance_id(
|
||||||
|
context, policy['vnf_instance_id'])
|
||||||
core_v1_api_client = self.kubernetes.get_core_v1_api_client(
|
core_v1_api_client = self.kubernetes.get_core_v1_api_client(
|
||||||
auth=auth_cred)
|
auth=auth_cred)
|
||||||
app_v1_api_client = self.kubernetes.get_app_v1_api_client(
|
app_v1_api_client = self.kubernetes.get_app_v1_api_client(
|
||||||
|
Loading…
Reference in New Issue
Block a user