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.
20 from gi
.repository
import NsrYang
, RwNsrYang
, RwVnfrYang
, NsdYang
, RwNsdYang
21 import rift
.auto
.session
23 @pytest.fixture(scope
='module')
24 def proxy(request
, mgmt_session
):
25 return mgmt_session
.proxy
28 ScalingGroupInstance
= NsrYang
.YangData_Nsr_NsInstanceConfig_Nsr_ScalingGroup_Instance
29 ScalingGroup
= NsrYang
.YangData_Nsr_NsInstanceConfig_Nsr_ScalingGroup
34 @pytest.mark
.depends('nsr')
35 @pytest.mark
.incremental
37 def wait_for_nsr_state(self
, proxy
, state
):
38 """Wait till the NSR reaches a desired state.
41 proxy (Callable): Proxy for launchpad session.
42 state (str): Expected state
44 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
45 nsr
= nsr_opdata
.nsr
[0]
46 xpath
= "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/operational-status".format(nsr
.ns_instance_config_ref
)
47 proxy(RwNsrYang
).wait_for(xpath
, state
, timeout
=240)
49 def verify_scaling_group(self
, proxy
, group_name
, expected_records_count
, scale_out
=True):
52 proxy (Callable): LP session
53 group_name (str): Group name which is being scaled up.
54 scale_out (bool, optional): To identify scale-out/scale-in mode.
57 1. Additional records are added to the opdata
58 2. Status of the scaling group
59 3. New vnfr record has been created.
61 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
62 nsr_id
= nsr_opdata
.nsr
[0].ns_instance_config_ref
64 xpath
= ('/ns-instance-opdata/nsr[ns-instance-config-ref="{}"]'
65 '/scaling-group-record[scaling-group-name-ref="{}"]').format(
68 scaling_record
= proxy(NsrYang
).get(xpath
)
70 assert len(scaling_record
.instance
) == expected_records_count
72 for instance
in scaling_record
.instance
:
73 assert instance
.op_status
== 'running'
75 for vnfr
in instance
.vnfrs
:
76 vnfr_record
= proxy(RwVnfrYang
).get(
77 "/vnfr-catalog/vnfr[id='{}']".format(vnfr
))
78 assert vnfr_record
is not None
80 def verify_scale_up(self
, proxy
, group_name
, expected
):
81 """Verifies the scaling up steps for the group
82 NSR moves from running -> scaling-up -> running
85 proxy (callable): LP proxy
86 group_name (str): Name of the group to verify.
88 self
.wait_for_nsr_state(proxy
, "scaling-out")
89 self
.wait_for_nsr_state(proxy
, "running")
90 self
.verify_scaling_group(proxy
, group_name
, expected
)
92 def verify_scale_in(self
, proxy
, group_name
, expected
):
93 """Verifies the scaling in streps for the group.
94 NSR moves from running -> scaling-down -> running
97 proxy (callable): LP proxy
98 group_name (str): group name.
100 self
.wait_for_nsr_state(proxy
, "scaling-in")
101 self
.wait_for_nsr_state(proxy
, "running")
102 self
.verify_scaling_group(proxy
, group_name
, expected
, scale_out
=False)
104 def test_wait_for_nsr_configured(self
, proxy
):
105 """Wait till the NSR state moves to configured before starting scaling
108 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
109 nsrs
= nsr_opdata
.nsr
111 assert len(nsrs
) == 1
112 current_nsr
= nsrs
[0]
114 xpath
= "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/config-status".format(current_nsr
.ns_instance_config_ref
)
115 proxy(RwNsrYang
).wait_for(xpath
, "configured", timeout
=240)
118 def test_min_max_scaling(self
, proxy
):
119 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
120 nsrs
= nsr_opdata
.nsr
121 nsd_id
= nsrs
[0].nsd_ref
122 nsr_id
= nsrs
[0].ns_instance_config_ref
124 # group_name = "http_client_group"
126 xpath
= "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/scaling-group-record".format(nsr_id
)
127 scaling_records
= proxy(RwNsrYang
).get(xpath
, list_obj
=True)
129 for scaling_record
in scaling_records
.scaling_group_record
:
130 group_name
= scaling_record
.scaling_group_name_ref
131 xpath
= "/nsd-catalog/nsd[id='{}']/scaling-group-descriptor[name='{}']".format(
133 scaling_group_desc
= proxy(NsdYang
).get(xpath
)
135 # Add + 1 to go beyond the threshold
136 for instance_id
in range(1, scaling_group_desc
.max_instance_count
+ 1):
137 xpath
= '/ns-instance-config/nsr[id="{}"]/scaling-group[scaling-group-name-ref="{}"]'.format(
141 instance
= ScalingGroupInstance
.from_dict({"id": instance_id
})
142 scaling_group
= proxy(NsrYang
).get(xpath
)
144 if scaling_group
is None:
145 scaling_group
= ScalingGroup
.from_dict({
146 'scaling_group_name_ref': group_name
,
149 scaling_group
.instance
.append(instance
)
152 proxy(NsrYang
).merge_config(xpath
, scaling_group
)
153 self
.verify_scale_up(proxy
, group_name
, instance_id
+ 1)
154 except rift
.auto
.session
.ProxyRequestError
:
155 assert instance_id
== scaling_group_desc
.max_instance_count
157 for instance_id
in range(1, scaling_group_desc
.max_instance_count
):
158 xpath
= ('/ns-instance-config/nsr[id="{}"]/scaling-group'
159 '[scaling-group-name-ref="{}"]/'
160 'instance[id="{}"]').format(
161 nsr_id
, group_name
, instance_id
)
162 proxy(NsrYang
).delete_config(xpath
)
163 self
.verify_scale_in(proxy
, group_name
, instance_id
)