RIFT OSM R1 Initial Submission
[osm/SO.git] / rwlaunchpad / ra / pytest / ns / haproxy / test_scaling.py
diff --git a/rwlaunchpad/ra/pytest/ns/haproxy/test_scaling.py b/rwlaunchpad/ra/pytest/ns/haproxy/test_scaling.py
new file mode 100644 (file)
index 0000000..846ef2e
--- /dev/null
@@ -0,0 +1,170 @@
+
+# 
+#   Copyright 2016 RIFT.IO Inc
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+
+import pytest
+
+from gi.repository import NsrYang, RwNsrYang, RwVnfrYang, NsdYang, RwNsdYang
+import rift.auto.session
+
+@pytest.fixture(scope='module')
+def proxy(request, mgmt_session):
+    return mgmt_session.proxy
+
+
+ScalingGroupInstance = NsrYang.YangData_Nsr_NsInstanceConfig_Nsr_ScalingGroup_Instance
+ScalingGroup = NsrYang.YangData_Nsr_NsInstanceConfig_Nsr_ScalingGroup
+
+INSTANCE_ID = 1
+
+
+@pytest.mark.depends('nsr')
+@pytest.mark.incremental
+class TestScaling:
+    def wait_for_nsr_state(self, proxy, state):
+        """Wait till the NSR reaches a desired state.
+
+        Args:
+            proxy (Callable): Proxy for launchpad session.
+            state (str): Expected state
+        """
+        nsr_opdata = proxy(RwNsrYang).get('/ns-instance-opdata')
+        nsr = nsr_opdata.nsr[0]
+        xpath = "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/operational-status".format(nsr.ns_instance_config_ref)
+        proxy(RwNsrYang).wait_for(xpath, state, timeout=240)
+
+    def verify_scaling_group(self, proxy, group_name, expected_records_count, scale_out=True):
+        """
+        Args:
+            proxy (Callable): LP session
+            group_name (str): Group name which is being scaled up.
+            scale_out (bool, optional): To identify scale-out/scale-in mode.
+
+        Asserts:
+            1. Additional records are added to the opdata
+            2. Status of the scaling group
+            3. New vnfr record has been created.
+        """
+        nsr_opdata = proxy(RwNsrYang).get('/ns-instance-opdata')
+        nsr_id = nsr_opdata.nsr[0].ns_instance_config_ref
+
+        xpath = ('/ns-instance-opdata/nsr[ns-instance-config-ref="{}"]'
+                 '/scaling-group-record[scaling-group-name-ref="{}"]').format(
+                        nsr_id, group_name)
+
+        scaling_record = proxy(NsrYang).get(xpath)
+
+        assert len(scaling_record.instance) == expected_records_count
+
+        for instance in scaling_record.instance:
+            assert instance.op_status == 'running'
+
+            for vnfr in instance.vnfrs:
+                vnfr_record = proxy(RwVnfrYang).get(
+                        "/vnfr-catalog/vnfr[id='{}']".format(vnfr))
+                assert vnfr_record is not None
+
+    def verify_scale_up(self, proxy, group_name, expected):
+        """Verifies the scaling up steps for the group
+        NSR moves from running -> scaling-up -> running
+
+        Args:
+            proxy (callable): LP proxy
+            group_name (str): Name of the group to verify.
+        """
+        self.wait_for_nsr_state(proxy, "scaling-out")
+        self.wait_for_nsr_state(proxy, "running")
+        self.verify_scaling_group(proxy, group_name, expected)
+
+    def verify_scale_in(self, proxy, group_name, expected):
+        """Verifies the scaling in streps for the group.
+        NSR moves from running -> scaling-down -> running
+
+        Args:
+            proxy (callable): LP proxy
+            group_name (str): group name.
+        """
+        self.wait_for_nsr_state(proxy, "scaling-in")
+        self.wait_for_nsr_state(proxy, "running")
+        self.verify_scaling_group(proxy, group_name, expected, scale_out=False)
+
+    def test_wait_for_nsr_configured(self, proxy):
+        """Wait till the NSR state moves to configured before starting scaling
+        tests.
+        """
+        nsr_opdata = proxy(RwNsrYang).get('/ns-instance-opdata')
+        nsrs = nsr_opdata.nsr
+
+        assert len(nsrs) == 1
+        current_nsr = nsrs[0]
+
+        xpath = "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/config-status".format(current_nsr.ns_instance_config_ref)
+        proxy(RwNsrYang).wait_for(xpath, "configured", timeout=240)
+
+
+    def test_min_max_scaling(self, proxy):
+        nsr_opdata = proxy(RwNsrYang).get('/ns-instance-opdata')
+        nsrs = nsr_opdata.nsr
+        nsd_id = nsrs[0].nsd_ref
+        nsr_id = nsrs[0].ns_instance_config_ref
+
+        # group_name = "http_client_group"
+
+        xpath = "/ns-instance-opdata/nsr[ns-instance-config-ref='{}']/scaling-group-record".format(nsr_id)
+        scaling_records = proxy(RwNsrYang).get(xpath, list_obj=True)
+
+        for scaling_record in scaling_records.scaling_group_record:
+            group_name = scaling_record.scaling_group_name_ref
+            xpath = "/nsd-catalog/nsd[id='{}']/scaling-group-descriptor[name='{}']".format(
+                    nsd_id, group_name)
+            scaling_group_desc = proxy(NsdYang).get(xpath)
+
+            # Add + 1 to go beyond the threshold
+            for instance_id in range(1, scaling_group_desc.max_instance_count + 1):
+                xpath = '/ns-instance-config/nsr[id="{}"]/scaling-group[scaling-group-name-ref="{}"]'.format(
+                            nsr_id, 
+                            group_name)
+
+                instance = ScalingGroupInstance.from_dict({"id": instance_id})
+                scaling_group = proxy(NsrYang).get(xpath)
+
+                if scaling_group is None:
+                    scaling_group = ScalingGroup.from_dict({
+                        'scaling_group_name_ref': group_name,
+                        })
+
+                scaling_group.instance.append(instance)
+
+                try:
+                    proxy(NsrYang).merge_config(xpath, scaling_group)
+                    self.verify_scale_up(proxy, group_name, instance_id + 1)
+                except rift.auto.session.ProxyRequestError:
+                    assert instance_id == scaling_group_desc.max_instance_count
+
+            for instance_id in range(1, scaling_group_desc.max_instance_count):
+                xpath = ('/ns-instance-config/nsr[id="{}"]/scaling-group'
+                         '[scaling-group-name-ref="{}"]/'
+                         'instance[id="{}"]').format(
+                         nsr_id, group_name, instance_id)
+                proxy(NsrYang).delete_config(xpath)
+                self.verify_scale_in(proxy, group_name, instance_id)
+
+
+
+
+
+
+