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 (
24 ProjectNsdYang
as NsdYang
,
25 RwProjectNsdYang
as RwNsdYang
27 import rift
.auto
.session
29 @pytest.fixture(scope
='module')
30 def proxy(request
, mgmt_session
):
31 return mgmt_session
.proxy
34 ScalingGroupInstance
= NsrYang
.YangData_RwProject_Project_NsInstanceConfig_Nsr_ScalingGroup_Instance
35 ScalingGroup
= NsrYang
.YangData_RwProject_Project_NsInstanceConfig_Nsr_ScalingGroup
40 @pytest.mark
.depends('nsr')
41 @pytest.mark
.incremental
43 def wait_for_nsr_state(self
, proxy
, state
):
44 """Wait till the NSR reaches a desired state.
47 proxy (Callable): Proxy for launchpad session.
48 state (str): Expected state
50 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
51 nsr
= nsr_opdata
.nsr
[0]
52 xpath
= "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/operational-status".format(nsr
.ns_instance_config_ref
)
53 proxy(RwNsrYang
).wait_for(xpath
, state
, timeout
=240)
55 def verify_scaling_group(self
, proxy
, group_name
, expected_records_count
, scale_out
=True):
58 proxy (Callable): LP session
59 group_name (str): Group name which is being scaled up.
60 scale_out (bool, optional): To identify scale-out/scale-in mode.
63 1. Additional records are added to the opdata
64 2. Status of the scaling group
65 3. New vnfr record has been created.
67 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
68 nsr_id
= nsr_opdata
.nsr
[0].ns_instance_config_ref
70 xpath
= ('/ns-instance-opdata/nsr[ns-instance-config-ref="{}"]'
71 '/scaling-group-record[scaling-group-name-ref="{}"]').format(
74 scaling_record
= proxy(NsrYang
).get(xpath
)
76 assert len(scaling_record
.instance
) == expected_records_count
78 for instance
in scaling_record
.instance
:
79 assert instance
.op_status
== 'running'
81 for vnfr
in instance
.vnfrs
:
82 vnfr_record
= proxy(RwVnfrYang
).get(
83 "/vnfr-catalog/vnfr[id='{}']".format(vnfr
))
84 assert vnfr_record
is not None
86 def verify_scale_up(self
, proxy
, group_name
, expected
):
87 """Verifies the scaling up steps for the group
88 NSR moves from running -> scaling-up -> running
91 proxy (callable): LP proxy
92 group_name (str): Name of the group to verify.
94 self
.wait_for_nsr_state(proxy
, "scaling-out")
95 self
.wait_for_nsr_state(proxy
, "running")
96 self
.verify_scaling_group(proxy
, group_name
, expected
)
98 def verify_scale_in(self
, proxy
, group_name
, expected
):
99 """Verifies the scaling in streps for the group.
100 NSR moves from running -> scaling-down -> running
103 proxy (callable): LP proxy
104 group_name (str): group name.
106 self
.wait_for_nsr_state(proxy
, "scaling-in")
107 self
.wait_for_nsr_state(proxy
, "running")
108 self
.verify_scaling_group(proxy
, group_name
, expected
, scale_out
=False)
110 def test_wait_for_nsr_configured(self
, proxy
):
111 """Wait till the NSR state moves to configured before starting scaling
114 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
115 nsrs
= nsr_opdata
.nsr
117 assert len(nsrs
) == 1
118 current_nsr
= nsrs
[0]
120 xpath
= "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/config-status".format(current_nsr
.ns_instance_config_ref
)
121 proxy(RwNsrYang
).wait_for(xpath
, "configured", timeout
=240)
124 def test_min_max_scaling(self
, proxy
):
125 nsr_opdata
= proxy(RwNsrYang
).get('/ns-instance-opdata')
126 nsrs
= nsr_opdata
.nsr
127 nsd_id
= nsrs
[0].nsd_ref
128 nsr_id
= nsrs
[0].ns_instance_config_ref
130 # group_name = "http_client_group"
132 xpath
= "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/scaling-group-record".format(nsr_id
)
133 scaling_records
= proxy(RwNsrYang
).get(xpath
, list_obj
=True)
135 for scaling_record
in scaling_records
.scaling_group_record
:
136 group_name
= scaling_record
.scaling_group_name_ref
137 xpath
= "/nsd-catalog/nsd[id='{}']/scaling-group-descriptor[name='{}']".format(
139 scaling_group_desc
= proxy(NsdYang
).get(xpath
)
141 # Add + 1 to go beyond the threshold
142 for instance_id
in range(1, scaling_group_desc
.max_instance_count
+ 1):
143 xpath
= '/ns-instance-config/nsr[id="{}"]/scaling-group[scaling-group-name-ref="{}"]'.format(
147 instance
= ScalingGroupInstance
.from_dict({"id": instance_id
})
148 scaling_group
= proxy(NsrYang
).get(xpath
)
150 if scaling_group
is None:
151 scaling_group
= ScalingGroup
.from_dict({
152 'scaling_group_name_ref': group_name
,
155 scaling_group
.instance
.append(instance
)
158 proxy(NsrYang
).merge_config(xpath
, scaling_group
)
159 self
.verify_scale_up(proxy
, group_name
, instance_id
+ 1)
160 except rift
.auto
.session
.ProxyRequestError
:
161 assert instance_id
== scaling_group_desc
.max_instance_count
163 for instance_id
in range(1, scaling_group_desc
.max_instance_count
):
164 xpath
= ('/ns-instance-config/nsr[id="{}"]/scaling-group'
165 '[scaling-group-name-ref="{}"]/'
166 'instance[id="{}"]').format(
167 nsr_id
, group_name
, instance_id
)
168 proxy(NsrYang
).delete_config(xpath
)
169 self
.verify_scale_in(proxy
, group_name
, instance_id
)