update from RIFT as of 696b75d2fe9fb046261b08c616f1bcf6c0b54a9b second try
[osm/SO.git] / rwlaunchpad / ra / pytest / ns / haproxy / test_scaling.py
1
2 #
3 # Copyright 2016 RIFT.IO Inc
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16 #
17
18 import gi
19 import pytest
20
21 from gi.repository import (
22 NsrYang,
23 RwNsrYang,
24 RwVnfrYang,
25 RwProjectNsdYang,
26 )
27 import rift.auto.session
28 gi.require_version('RwKeyspec', '1.0')
29 from gi.repository.RwKeyspec import quoted_key
30
31 @pytest.fixture(scope='module')
32 def proxy(request, mgmt_session):
33 return mgmt_session.proxy
34
35
36 ScalingGroupInstance = NsrYang.YangData_RwProject_Project_NsInstanceConfig_Nsr_ScalingGroup_Instance
37 ScalingGroup = NsrYang.YangData_RwProject_Project_NsInstanceConfig_Nsr_ScalingGroup
38
39 INSTANCE_ID = 1
40
41
42 @pytest.mark.depends('nsr')
43 @pytest.mark.incremental
44 class TestScaling:
45 def wait_for_nsr_state(self, proxy, state):
46 """Wait till the NSR reaches a desired state.
47
48 Args:
49 proxy (Callable): Proxy for launchpad session.
50 state (str): Expected state
51 """
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)
56
57 def verify_scaling_group(self, proxy, group_name, expected_records_count, scale_out=True):
58 """
59 Args:
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.
63
64 Asserts:
65 1. Additional records are added to the opdata
66 2. Status of the scaling group
67 3. New vnfr record has been created.
68 """
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
71
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))
75
76 scaling_record = proxy(NsrYang).get(xpath)
77
78 assert len(scaling_record.instance) == expected_records_count
79
80 for instance in scaling_record.instance:
81 assert instance.op_status == 'running'
82
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
87
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
91
92 Args:
93 proxy (callable): LP proxy
94 group_name (str): Name of the group to verify.
95 """
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)
99
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
103
104 Args:
105 proxy (callable): LP proxy
106 group_name (str): group name.
107 """
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)
111
112 def test_wait_for_nsr_configured(self, proxy):
113 """Wait till the NSR state moves to configured before starting scaling
114 tests.
115 """
116 nsr_opdata = proxy(RwNsrYang).get('/rw-project:project[rw-project:name="default"]/ns-instance-opdata')
117 nsrs = nsr_opdata.nsr
118
119 assert len(nsrs) == 1
120 current_nsr = nsrs[0]
121
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)
124
125
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
131
132 # group_name = "http_client_group"
133
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)
136
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)
142
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(
146 quoted_key(nsr_id),
147 quoted_key(group_name))
148
149 instance = ScalingGroupInstance.from_dict({"id": instance_id})
150 scaling_group = proxy(NsrYang).get(xpath)
151
152 if scaling_group is None:
153 scaling_group = ScalingGroup.from_dict({
154 'scaling_group_name_ref': group_name,
155 })
156
157 scaling_group.instance.append(instance)
158
159 try:
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
164
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)
172
173
174
175
176
177
178