VOL-572: Integration testing with Kubernetes

* Updated the Kubernetes version installed in the single-node environment from 1.8.5 to 1.9.3.
* Replaced the Weave pod network plugin with Calico
* Updated test_device_state_changes to run in single-node Kubernetes
* Moved test_utils.py from voltha/tests/itests/docutests/ to voltha/tests/itests/.

Change-Id: I472cffec1e0c3a783edaecb375664cd1c6bb93b1
diff --git a/tests/itests/README.md b/tests/itests/README.md
index 761c02b..47aae4a 100644
--- a/tests/itests/README.md
+++ b/tests/itests/README.md
@@ -101,7 +101,7 @@
     * Ponsim_olt and Ponsim_onu adapters
     * Ponsim 
 
-First start the Voltha ensemble:
+To run the test in the docker-compose environment, first start the Voltha ensemble:
 ```
 cd /cord/incubator/voltha
 . ./env.sh
@@ -112,13 +112,26 @@
 sudo -s
 . ./env.sh
 ./ponsim/main.py -v -o 4
-``` 
+```
 Run the test:
 ``` 
 cd /cord/incubator/voltha
 . ./env.sh
 nosetests -s tests/itests/voltha/test_device_state_changes.py
 ```  
+To set up the test in a single-node Kubernetes environment (see document voltha/BUILD.md):
+```
+. ./env.sh
+./tests/itests/env/voltha-k8s-start.sh
+```
+Refer to the Kubernetes section in document voltha/ponsim/v2/README.md to set up the node for PONSIM. To install the CNI plugin, you may enter:
+```
+kubectl apply -f k8s/genie-cni-1.8.yml
+```
+To run the test:
+```
+nosetests -s tests/itests/voltha/test_device_state_changes.py --tc-file=tests/itests/env/k8s-consul.ini
+```
 
 * **Persistence**: This test goes through several voltha restarts along with variations 
 of configurations in between to ensure data integrity is preserved.
diff --git a/tests/itests/docutests/build_md_test.py b/tests/itests/docutests/build_md_test.py
index 6a00f71..6f6c018 100644
--- a/tests/itests/docutests/build_md_test.py
+++ b/tests/itests/docutests/build_md_test.py
@@ -29,7 +29,7 @@
 
 this_dir = os.path.abspath(os.path.dirname(__file__))
 
-from test_utils import run_command_to_completion_with_raw_stdout, \
+from tests.itests.test_utils import run_command_to_completion_with_raw_stdout, \
     is_open, \
     is_valid_ip, \
     run_long_running_command_with_timeout, \
diff --git a/tests/itests/ofagent/test_ofagent_multicontroller_failover.py b/tests/itests/ofagent/test_ofagent_multicontroller_failover.py
index b119e74..289a327 100644
--- a/tests/itests/ofagent/test_ofagent_multicontroller_failover.py
+++ b/tests/itests/ofagent/test_ofagent_multicontroller_failover.py
@@ -22,7 +22,7 @@
 
 this_dir = os.path.abspath(os.path.dirname(__file__))
 
-from tests.itests.docutests.test_utils import run_command_to_completion_with_raw_stdout
+from tests.itests.test_utils import run_command_to_completion_with_raw_stdout
 from voltha.protos.device_pb2 import Device
 from google.protobuf.json_format import MessageToDict
 from tests.itests.voltha.rest_base import RestBase
diff --git a/tests/itests/ofagent/test_ofagent_recovery.py b/tests/itests/ofagent/test_ofagent_recovery.py
index dba3563..bd44b6a 100644
--- a/tests/itests/ofagent/test_ofagent_recovery.py
+++ b/tests/itests/ofagent/test_ofagent_recovery.py
@@ -27,7 +27,7 @@
 
 this_dir = os.path.abspath(os.path.dirname(__file__))
 
-from tests.itests.docutests.test_utils import run_command_to_completion_with_raw_stdout
+from tests.itests.test_utils import run_command_to_completion_with_raw_stdout
 
 log = logging.getLogger(__name__)
 
diff --git a/tests/itests/docutests/test_utils.py b/tests/itests/test_utils.py
similarity index 100%
rename from tests/itests/docutests/test_utils.py
rename to tests/itests/test_utils.py
diff --git a/tests/itests/voltha/test_cold_activation_sequence.py b/tests/itests/voltha/test_cold_activation_sequence.py
index 1b06fda..9dd350b 100644
--- a/tests/itests/voltha/test_cold_activation_sequence.py
+++ b/tests/itests/voltha/test_cold_activation_sequence.py
@@ -9,7 +9,7 @@
 from tests.itests.voltha.rest_base import RestBase
 from common.utils.consulhelpers import get_endpoint_from_consul
 from structlog import get_logger
-from tests.itests.docutests.test_utils import get_pod_ip
+from tests.itests.test_utils import get_pod_ip
 from testconfig import config
 
 LOCAL_CONSUL = "localhost:8500"
diff --git a/tests/itests/voltha/test_device_state_changes.py b/tests/itests/voltha/test_device_state_changes.py
index 93685ca..14b73d0 100644
--- a/tests/itests/voltha/test_device_state_changes.py
+++ b/tests/itests/voltha/test_device_state_changes.py
@@ -8,9 +8,15 @@
 from voltha.protos import openflow_13_pb2 as ofp
 from tests.itests.voltha.rest_base import RestBase
 from common.utils.consulhelpers import get_endpoint_from_consul
+from testconfig import config
+from tests.itests.test_utils import get_pod_ip
 
 LOCAL_CONSUL = "localhost:8500"
 
+orch_env = 'docker-compose'
+if 'test_parameters' in config and 'orch_env' in config['test_parameters']:
+    orch_env = config['test_parameters']['orch_env']
+print('orchestration-environment: {}'.format(orch_env))
 
 class TestDeviceStateChangeSequence(RestBase):
     """
@@ -24,7 +30,15 @@
     """
 
     # Retrieve details of the REST entry point
-    rest_endpoint = get_endpoint_from_consul(LOCAL_CONSUL, 'envoy-8443')
+    if orch_env == 'k8s-single-node':
+        rest_endpoint = get_pod_ip('voltha') + ':8443'
+        olt_host_and_port = get_pod_ip('olt') + ':50060'
+    elif orch_env == 'swarm-single-node':
+        rest_endpoint = 'localhost:8443'
+        olt_host_and_port = 'localhost:50060'
+    else:
+        rest_endpoint = get_endpoint_from_consul(LOCAL_CONSUL, 'voltha-envoy-8443')
+        olt_host_and_port = '172.17.0.1:50060'
 
     # Construct the base_url
     base_url = 'https://' + rest_endpoint
@@ -127,7 +141,7 @@
     def add_olt_device(self):
         device = Device(
             type='ponsim_olt',
-            host_and_port='172.17.0.1:50060'
+            host_and_port=self.olt_host_and_port
         )
         device = self.post('/api/v1/devices', MessageToDict(device),
                            expected_http_code=200)
@@ -150,15 +164,13 @@
 
         self.wait_till(
             'admin state moves to ACTIVATING or ACTIVE',
-            lambda: self.get(path)['oper_status'] in ('ACTIVATING', 'ACTIVE'),
-            timeout=0.5)
+            lambda: self.get(path)['oper_status'] in ('ACTIVATING', 'ACTIVE'))
 
         # eventually, it shall move to active state and by then we shall have
         # device details filled, connect_state set, and device ports created
         self.wait_till(
             'admin state ACTIVE',
-            lambda: self.get(path)['oper_status'] == 'ACTIVE',
-            timeout=0.5)
+            lambda: self.get(path)['oper_status'] == 'ACTIVE')
         device = self.get(path)
         self.assertEqual(device['connect_status'], 'REACHABLE')
 
@@ -203,8 +215,7 @@
         # the olt device
         self.wait_till(
             'find four ONUs linked to the olt device',
-            lambda: len(self.find_onus(olt_id)) >= 4,
-            2
+            lambda: len(self.find_onus(olt_id)) >= 4
         )
         # verify that they are properly set
         onus = self.find_onus(olt_id)
@@ -280,11 +291,8 @@
         self.assertGreaterEqual(len(flows), 4)
 
     def verify_olt_eapol_flow(self, olt_id):
-        # olt shall have two flow rules, one is the default and the
-        # second is the result of eapol forwarding with rule:
-        # if eth_type == 0x888e => push vlan(1000); out_port=nni_port
         flows = self.get('/api/v1/devices/{}/flows'.format(olt_id))['items']
-        self.assertEqual(len(flows), 2)
+        self.assertEqual(len(flows), 8)
         flow = flows[1]
         self.assertEqual(flow['table_id'], 0)
         self.assertEqual(flow['priority'], 1000)
@@ -301,14 +309,12 @@
 
         self.wait_till(
             'operational state moves to UNKNOWN',
-            lambda: self.get(path)['oper_status'] == 'UNKNOWN',
-            timeout=0.5)
+            lambda: self.get(path)['oper_status'] == 'UNKNOWN')
 
         # eventually, the connect_state should be UNREACHABLE
         self.wait_till(
-            'connest status UNREACHABLE',
-            lambda: self.get(path)['connect_status'] == 'UNREACHABLE',
-            timeout=0.5)
+            'connect status UNREACHABLE',
+            lambda: self.get(path)['connect_status'] == 'UNREACHABLE')
 
         # Device's ports should be INACTIVE
         ports = self.get(path + '/ports')['items']
diff --git a/tests/itests/voltha/test_persistence.py b/tests/itests/voltha/test_persistence.py
index 54f091d..09da460 100644
--- a/tests/itests/voltha/test_persistence.py
+++ b/tests/itests/voltha/test_persistence.py
@@ -7,7 +7,7 @@
 import subprocess
 import select
 
-from tests.itests.docutests.test_utils import \
+from tests.itests.test_utils import \
     run_command_to_completion_with_raw_stdout, \
     run_command_to_completion_with_stdout_in_list
 from unittest import skip
diff --git a/tests/itests/voltha/test_self_signed_cert_auth_failure.py b/tests/itests/voltha/test_self_signed_cert_auth_failure.py
index c04fe00..b7e35eb 100644
--- a/tests/itests/voltha/test_self_signed_cert_auth_failure.py
+++ b/tests/itests/voltha/test_self_signed_cert_auth_failure.py
@@ -5,7 +5,7 @@
 from tests.itests.voltha.rest_base import RestBase
 from common.utils.consulhelpers import get_endpoint_from_consul
 from common.utils.consulhelpers import verify_all_services_healthy
-from tests.itests.docutests.test_utils import \
+from tests.itests.test_utils import \
     run_command_to_completion_with_raw_stdout, \
     run_command_to_completion_with_stdout_in_list
 
diff --git a/tests/itests/voltha/test_voltha_alarm_events.py b/tests/itests/voltha/test_voltha_alarm_events.py
index 48f68e1..dd37a6e 100644
--- a/tests/itests/voltha/test_voltha_alarm_events.py
+++ b/tests/itests/voltha/test_voltha_alarm_events.py
@@ -1,6 +1,6 @@
 from unittest import main
 from common.utils.consulhelpers import get_endpoint_from_consul
-from tests.itests.docutests.test_utils import \
+from tests.itests.test_utils import \
     run_long_running_command_with_timeout
 from tests.itests.voltha.rest_base import RestBase
 from google.protobuf.json_format import MessageToDict
diff --git a/tests/itests/voltha/test_voltha_alarm_filters.py b/tests/itests/voltha/test_voltha_alarm_filters.py
index 6624763..ccb2929 100644
--- a/tests/itests/voltha/test_voltha_alarm_filters.py
+++ b/tests/itests/voltha/test_voltha_alarm_filters.py
@@ -4,7 +4,7 @@
 from google.protobuf.json_format import MessageToDict
 
 from common.utils.consulhelpers import get_endpoint_from_consul
-from tests.itests.docutests.test_utils import \
+from tests.itests.test_utils import \
     run_long_running_command_with_timeout
 from tests.itests.voltha.rest_base import RestBase
 from voltha.protos.device_pb2 import Device
diff --git a/tests/itests/voltha/test_voltha_rest_apis.py b/tests/itests/voltha/test_voltha_rest_apis.py
index d5fc1ee..d1874b0 100644
--- a/tests/itests/voltha/test_voltha_rest_apis.py
+++ b/tests/itests/voltha/test_voltha_rest_apis.py
@@ -9,7 +9,7 @@
 from voltha.protos import openflow_13_pb2 as ofp
 from common.utils.consulhelpers import get_endpoint_from_consul
 from structlog import get_logger
-from tests.itests.docutests.test_utils import get_pod_ip
+from tests.itests.test_utils import get_pod_ip
 from testconfig import config
 
 LOCAL_CONSUL = "localhost:8500"