3 # Copyright 2016 RIFT.IO Inc
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
21 from gi
.repository
import (
27 import rift
.auto
.session
28 gi
.require_version('RwKeyspec', '1.0')
29 from gi
.repository
.RwKeyspec
import quoted_key
31 @pytest.fixture(scope
='module')
32 def proxy(request
, mgmt_session
):
33 return mgmt_session
.proxy
36 ScalingGroupInstance
= NsrYang
.YangData_RwProject_Project_NsInstanceConfig_Nsr_ScalingGroup_Instance
37 ScalingGroup
= NsrYang
.YangData_RwProject_Project_NsInstanceConfig_Nsr_ScalingGroup
42 @pytest.mark
.depends('nsr')
43 @pytest.mark
.incremental
45 def wait_for_nsr_state(self
, proxy
, state
):
46 """Wait till the NSR reaches a desired state.
49 proxy (Callable): Proxy for launchpad session.
50 state (str): Expected state
52 nsr_opdata
= proxy(RwNsrYang
).get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
53 nsr
= nsr_opdata
.nsr
[0]
54 xpath
= "/rw-project:project[rw-project:name='default']/ns-instance-opdata/nsr[ns-instance-config-ref={}]/operational-status".format(quoted_key(nsr
.ns_instance_config_ref
))
55 proxy(RwNsrYang
).wait_for(xpath
, state
, timeout
=240)
57 def verify_scaling_group(self
, proxy
, group_name
, expected_records_count
, scale_out
=True):
60 proxy (Callable): LP session
61 group_name (str): Group name which is being scaled up.
62 scale_out (bool, optional): To identify scale-out/scale-in mode.
65 1. Additional records are added to the opdata
66 2. Status of the scaling group
67 3. New vnfr record has been created.
69 nsr_opdata
= proxy(RwNsrYang
).get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
70 nsr_id
= nsr_opdata
.nsr
[0].ns_instance_config_ref
72 xpath
= ('/rw-project:project[rw-project:name="default"]/ns-instance-opdata/nsr[ns-instance-config-ref={}]'
73 '/scaling-group-record[scaling-group-name-ref={}]').format(
74 quoted_key(nsr_id
), quoted_key(group_name
))
76 scaling_record
= proxy(NsrYang
).get(xpath
)
78 assert len(scaling_record
.instance
) == expected_records_count
80 for instance
in scaling_record
.instance
:
81 assert instance
.op_status
== 'running'
83 for vnfr
in instance
.vnfrs
:
84 vnfr_record
= proxy(RwVnfrYang
).get(
85 "/rw-project:project[rw-project:name='default']/vnfr-catalog/vnfr[id={}]".format(quoted_key(vnfr
)))
86 assert vnfr_record
is not None
88 def verify_scale_up(self
, proxy
, group_name
, expected
):
89 """Verifies the scaling up steps for the group
90 NSR moves from running -> scaling-up -> running
93 proxy (callable): LP proxy
94 group_name (str): Name of the group to verify.
96 self
.wait_for_nsr_state(proxy
, "scaling-out")
97 self
.wait_for_nsr_state(proxy
, "running")
98 self
.verify_scaling_group(proxy
, group_name
, expected
)
100 def verify_scale_in(self
, proxy
, group_name
, expected
):
101 """Verifies the scaling in streps for the group.
102 NSR moves from running -> scaling-down -> running
105 proxy (callable): LP proxy
106 group_name (str): group name.
108 self
.wait_for_nsr_state(proxy
, "scaling-in")
109 self
.wait_for_nsr_state(proxy
, "running")
110 self
.verify_scaling_group(proxy
, group_name
, expected
, scale_out
=False)
112 def test_wait_for_nsr_configured(self
, proxy
):
113 """Wait till the NSR state moves to configured before starting scaling
116 nsr_opdata
= proxy(RwNsrYang
).get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
117 nsrs
= nsr_opdata
.nsr
119 assert len(nsrs
) == 1
120 current_nsr
= nsrs
[0]
122 xpath
= "/rw-project:project[rw-project:name='default']/ns-instance-opdata/nsr[ns-instance-config-ref={}]/config-status".format(quoted_key(current_nsr
.ns_instance_config_ref
))
123 proxy(RwNsrYang
).wait_for(xpath
, "configured", timeout
=240)
126 def test_min_max_scaling(self
, proxy
):
127 nsr_opdata
= proxy(RwNsrYang
).get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
128 nsrs
= nsr_opdata
.nsr
129 nsd_id
= nsrs
[0].nsd_ref
130 nsr_id
= nsrs
[0].ns_instance_config_ref
132 # group_name = "http_client_group"
134 xpath
= "/rw-project:project[rw-project:name='default']/ns-instance-opdata/nsr[ns-instance-config-ref={}]/scaling-group-record".format(quoted_key(nsr_id
))
135 scaling_records
= proxy(RwNsrYang
).get(xpath
, list_obj
=True)
137 for scaling_record
in scaling_records
.scaling_group_record
:
138 group_name
= scaling_record
.scaling_group_name_ref
139 xpath
= "/rw-project:project[rw-project:name='default']/nsd-catalog/nsd[id={}]/scaling-group-descriptor[name={}]".format(
140 quoted_key(nsd_id
), quoted_key(group_name
))
141 scaling_group_desc
= proxy(RwProjectNsdYang
).get(xpath
)
143 # Add + 1 to go beyond the threshold
144 for instance_id
in range(1, scaling_group_desc
.max_instance_count
+ 1):
145 xpath
= '/rw-project:project[rw-project:name="default"]/ns-instance-config/nsr[id={}]/scaling-group[scaling-group-name-ref={}]'.format(
147 quoted_key(group_name
))
149 instance
= ScalingGroupInstance
.from_dict({"id": instance_id
})
150 scaling_group
= proxy(NsrYang
).get(xpath
)
152 if scaling_group
is None:
153 scaling_group
= ScalingGroup
.from_dict({
154 'scaling_group_name_ref': group_name
,
157 scaling_group
.instance
.append(instance
)
160 proxy(NsrYang
).merge_config(xpath
, scaling_group
)
161 self
.verify_scale_up(proxy
, group_name
, instance_id
+ 1)
162 except rift
.auto
.session
.ProxyRequestError
:
163 assert instance_id
== scaling_group_desc
.max_instance_count
165 for instance_id
in range(1, scaling_group_desc
.max_instance_count
):
166 xpath
= ('/rw-project:project[rw-project:name="default"]/ns-instance-config/nsr[id={}]/scaling-group'
167 '[scaling-group-name-ref={}]/'
168 'instance[id={}]').format(
169 quoted_key(nsr_id
), quoted_key(group_name
), quoted_key(instance_id
))
170 proxy(NsrYang
).delete_config(xpath
)
171 self
.verify_scale_in(proxy
, group_name
, instance_id
)