Merge "SEBA-274 adding k8s synchronizer test for simpleexampleservice"
diff --git a/jjb/defaults.yaml b/jjb/defaults.yaml
index 94d103a..f32f1a3 100644
--- a/jjb/defaults.yaml
+++ b/jjb/defaults.yaml
@@ -72,7 +72,7 @@
 
     # matching repos that should be version tagged by the version-tag job
     # (basically the same as imagebuilder projects + helm charts + tools
-    version-tag-projects-regexp: '^(xos.*|helm-charts|automation-tools|cord-tester|chameleon|rcord|mcord|ecord|acordion|addressmanager|epc-service|exampleservice|fabric|fabric-crossconnect|globalxos|hippie-oss|hss_db|hypercache|internetemulator|kubernetes-service|monitoring|olt-service|onos-service|openstack|progran|sdn-controller|simpleexampleservice|templateservice|vEE|vEG|vBBU|venb|vHSS|vMME|vnaas|vPGWC|vPGWU|vrouter|vsg|vsg-hw|vSGW|vSM|vspgwc|vspgwu|vtn-service|vtr|att-workflow-driver|ves-agent)$'
+    version-tag-projects-regexp: '^(xos.*|helm-charts|automation-tools|cord-tester|chameleon|rcord|mcord|ecord|acordion|addressmanager|epc-service|exampleservice|fabric|fabric-crossconnect|globalxos|hippie-oss|hss_db|hypercache|internetemulator|kubernetes-service|monitoring|olt-service|onos-service|openstack|progran|sdn-controller|simpleexampleservice|templateservice|vEE|vEG|vBBU|venb|vHSS|vMME|vnaas|vPGWC|vPGWU|vrouter|vsg|vsg-hw|vSGW|vSM|vspgwc|vspgwu|vtn-service|vtr|att-workflow-driver|ves-agent|voltha-bbsim|openolt)$'
 
     # for matching files with file-include-regexp
     all-files-regexp: '.*'
diff --git a/jjb/pipeline/siab.groovy b/jjb/pipeline/siab.groovy
index e4f7431..0b9eb91 100644
--- a/jjb/pipeline/siab.groovy
+++ b/jjb/pipeline/siab.groovy
@@ -49,7 +49,7 @@
       steps {
         sh """
             pushd $WORKSPACE/automation-tools/seba-in-a-box
-            make run-tests || true
+            make run-tests ${params.Test_Tags} || true
             popd
             """
             }
diff --git a/jjb/python-unit.yaml b/jjb/python-unit.yaml
new file mode 100644
index 0000000..1a20728
--- /dev/null
+++ b/jjb/python-unit.yaml
@@ -0,0 +1,75 @@
+---
+# python module unit test
+
+- job-template:
+    id: 'python-unit-test'
+    name: 'verify_{project}_unit-test'
+
+    description: |
+      Created by {id} job-template from ci-management/jjb/xos-unit.yaml
+
+    triggers:
+      - cord-infra-gerrit-trigger-patchset:
+          gerrit-server-name: '{gerrit-server-name}'
+          project-regexp: '^{project}$'
+          branch-regexp: '{branch-regexp}'
+          dependency-jobs: '{dependency-jobs}'
+          file-include-regexp: '{all-files-regexp}'
+
+    properties:
+      - cord-infra-properties:
+          build-days-to-keep: '{build-days-to-keep}'
+          artifact-num-to-keep: '{artifact-num-to-keep}'
+
+    wrappers:
+      - lf-infra-wrappers:
+          build-timeout: 20
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+
+    scm:
+      - lf-infra-gerrit-scm:
+          git-url: '$GIT_URL/$GERRIT_PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: 'false'
+          choosing-strategy: gerrit
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+
+    node: '{build-node}'
+    project-type: freestyle
+    concurrent: true
+
+    builders:
+      - shell: |
+          #!/usr/bin/env bash
+          set -eux -o pipefail
+
+          if [ -f 'tox.ini' ]; then
+            echo "tox.ini found, running tox for Python2/3 unit tests"
+            tox
+          else
+            echo "tox.ini not found, running nose2 unit tests"
+
+            if [ -f 'requirements.txt' ]; then
+              echo "requirements.txt found, installing locally with pip"
+              pip install -r requirements.txt
+            fi
+
+            echo "Performing nose2 tests"
+            nose2 --verbose --coverage-report xml --coverage-report term --junit-xml
+          fi
+
+    publishers:
+      - junit:
+          results: "**/nose2-junit.xml"
+      - cobertura:
+          report-file: "**/coverage.xml"
+          targets:
+            - files:
+                healthy: 80
+                unhealthy: 0
+                failing: 0
+            - method:
+                healthy: 50
+                unhealthy: 0
+                failing: 0
diff --git a/jjb/shell/licensecheck.sh b/jjb/shell/licensecheck.sh
index 3d64307..2cf2655 100755
--- a/jjb/shell/licensecheck.sh
+++ b/jjb/shell/licensecheck.sh
@@ -43,6 +43,7 @@
   ! -name "*.iml" \
   ! -name "*.in" \
   ! -name "*.inc" \
+  ! -name "*.install" \
   ! -name "*.j2" \
   ! -name "*.jar" \
   ! -name "*.jks" \
diff --git a/jjb/siab-e2e.yaml b/jjb/siab-e2e.yaml
index 31664ee..0ff1f83 100644
--- a/jjb/siab-e2e.yaml
+++ b/jjb/siab-e2e.yaml
@@ -7,7 +7,7 @@
     refspec: 'refs/heads/master'
     failure-email-address: 'andy@opennetworking.org'
     timed-trigger: '{every-hour}'
-    build-timeout: 20
+    build-timeout: 60
     jobs:
       - 'siab-e2e-att'
 
diff --git a/jjb/siab.yaml b/jjb/siab.yaml
index 8a13a74..5c50f70 100644
--- a/jjb/siab.yaml
+++ b/jjb/siab.yaml
@@ -40,6 +40,11 @@
           default: 'stable'
           description: 'Latest | Stable'
 
+      - string:
+          name: Test_Tags
+          default: ''
+          description: 'empty for stable and latest for latest'
+
     project-type: pipeline
     concurrent: false
 
@@ -80,6 +85,11 @@
           default: 'latest'
           description: 'Latest | Stable'
 
+      - string:
+          name: Test_Tags
+          default: 'TESTTAGS=latest'
+          description: 'empty for stable and latest for latest'
+
     project-type: pipeline
     concurrent: false
 
diff --git a/jjb/verify/kafka-topic-exporter.yaml b/jjb/verify/kafka-topic-exporter.yaml
new file mode 100644
index 0000000..cd2861a
--- /dev/null
+++ b/jjb/verify/kafka-topic-exporter.yaml
@@ -0,0 +1,107 @@
+---
+# verification jobs for 'kafka-topic-exporter' repo
+
+- project:
+    name: kafka-topic-exporter
+    project: '{name}'
+
+    jobs:
+      - 'verify-kafka-topic-exporter-jobs':
+          branch-regexp: '{supported-branches-regexp}'
+
+- job-group:
+    name: 'verify-kafka-topic-exporter-jobs'
+    jobs:
+      - 'verify-licensed'
+      - 'tag-collision-reject':
+          dependency-jobs: 'verify_kafka-topic-exporter_licensed'
+      - 'verify-sonarqube':
+          dependency-jobs: 'verify_kafka-topic-exporter_tag-collision'
+      - 'kafka-topic-exporter-tests':
+          dependency-jobs: 'verify_kafka-topic-exporter_sonarqube'
+
+- job-template:
+    id: 'kafka-topic-exporter-tests'
+    name: 'verify_{project}_tests'
+
+    description: |
+      Created by {id} job-template from ci-management/jjb/verify/kafka-topic-exporter.yaml
+
+    triggers:
+      - cord-infra-gerrit-trigger-patchset:
+          gerrit-server-name: '{gerrit-server-name}'
+          project-regexp: '^{project}$'
+          branch-regexp: '{branch-regexp}'
+          dependency-jobs: '{dependency-jobs}'
+          file-include-regexp: '{all-files-regexp}'
+
+    properties:
+      - cord-infra-properties:
+          build-days-to-keep: '{build-days-to-keep}'
+          artifact-num-to-keep: '{artifact-num-to-keep}'
+
+    wrappers:
+      - lf-infra-wrappers:
+          build-timeout: 20
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+
+    scm:
+      - cord-infra-gerrit-scm:
+          git-url: '$GIT_URL/$GERRIT_PROJECT'
+          refspec: '$GERRIT_REFSPEC'
+          branch: '$GERRIT_BRANCH'
+          submodule-recursive: 'false'
+          choosing-strategy: 'gerrit'
+          jenkins-ssh-credential: '{jenkins-ssh-credential}'
+          basedir: '{project}'
+
+    node: 'ubuntu16.04-basebuild-1c-2g'
+    project-type: freestyle
+    concurrent: true
+
+    builders:
+      - shell: |
+          #!/usr/bin/env bash
+          set -eux -o pipefail
+
+          export GOPATH=~/go
+          export PATH=$PATH:/usr/lib/go-1.10/bin:/usr/local/go/bin:~/go/bin
+
+          # move code the proper location
+          mkdir -p $GOPATH/src/gerrit.opencord.org
+          mv kafka-topic-exporter $GOPATH/src/gerrit.opencord.org/kafka-topic-exporter
+
+          # get prereqs
+          go get -v github.com/prometheus/client_golang/prometheus
+          go get -v github.com/Shopify/sarama
+
+          pushd $GOPATH/src/gerrit.opencord.org/kafka-topic-exporter
+
+          go get -v -d ./...
+          go test -v ./...
+
+          # generate Jenkins report
+          go test -v ./...  2>&1 | go-junit-report > $WORKSPACE/junit-report.xml
+
+          # generate Jenkins coverage
+          go test -coverprofile=coverage.txt -covermode=count ./...
+          gocover-cobertura < coverage.txt > $WORKSPACE/coverage.xml
+
+          popd
+
+
+    publishers:
+      - junit:
+          results: "junit-report.xml"
+          allow-empty-results: true
+      - cobertura:
+          report-file: "coverage.xml"
+          targets:
+            - files:
+                healthy: 80
+                unhealthy: 0
+                failing: 0
+            - method:
+                healthy: 50
+                unhealthy: 0
+                failing: 0
diff --git a/jjb/verify/kafkaloghandler.yaml b/jjb/verify/kafkaloghandler.yaml
new file mode 100644
index 0000000..4294afd
--- /dev/null
+++ b/jjb/verify/kafkaloghandler.yaml
@@ -0,0 +1,21 @@
+---
+# verification jobs for 'kafkaloghandler' repo
+
+- project:
+    name: kafkaloghandler
+    project: '{name}'
+
+    jobs:
+      - 'verify-kafkaloghandler-jobs':
+          branch-regexp: '{supported-branches-regexp}'
+
+- job-group:
+    name: 'verify-kafkaloghandler-jobs'
+    jobs:
+      - 'verify-licensed'
+      - 'tag-collision-reject':
+          dependency-jobs: 'verify_kafkaloghandler_licensed'
+      - 'verify-sonarqube':
+          dependency-jobs: 'verify_kafkaloghandler_tag-collision'
+      - 'python-unit-test':
+          dependency-jobs: 'verify_kafkaloghandler_sonarqube'
diff --git a/jjb/verify/multistructlog.yaml b/jjb/verify/multistructlog.yaml
new file mode 100644
index 0000000..e85bb20
--- /dev/null
+++ b/jjb/verify/multistructlog.yaml
@@ -0,0 +1,21 @@
+---
+# verification jobs for 'multistructlog' repo
+
+- project:
+    name: multistructlog
+    project: '{name}'
+
+    jobs:
+      - 'verify-multistructlog-jobs':
+          branch-regexp: '{supported-branches-regexp}'
+
+- job-group:
+    name: 'verify-multistructlog-jobs'
+    jobs:
+      - 'verify-licensed'
+      - 'tag-collision-reject':
+          dependency-jobs: 'verify_multistructlog_licensed'
+      - 'verify-sonarqube':
+          dependency-jobs: 'verify_multistructlog_tag-collision'
+      - 'python-unit-test':
+          dependency-jobs: 'verify_multistructlog_sonarqube'
diff --git a/jjb/verify/openolt.yaml b/jjb/verify/openolt.yaml
new file mode 100644
index 0000000..0ae1b3c
--- /dev/null
+++ b/jjb/verify/openolt.yaml
@@ -0,0 +1,63 @@
+---
+# verification jobs for 'openolt' repo
+
+- project:
+    name: openolt
+    project: '{name}'
+
+    jobs:
+      - 'verify-openolt-jobs':
+          branch-regexp: '{supported-branches-regexp}'
+
+- job-group:
+    name: 'verify-openolt-jobs'
+    jobs:
+      - 'verify-licensed'
+      - 'tag-collision-reject':
+          dependency-jobs: 'verify_openolt_licensed'
+      - 'verify-sonarqube':
+          dependency-jobs: 'verify_openolt_tag-collision'
+#      - 'openolt-tests':
+#          dependency-jobs: 'verify_openolt_sonarqube'
+
+- job-template:
+    id: 'openolt-tests'
+    name: 'verify_{project}_tests'
+
+    description: |
+      Created by {id} job-template from ci-management/jjb/verify/openolt.yaml
+
+    triggers:
+      - cord-infra-gerrit-trigger-patchset:
+          gerrit-server-name: '{gerrit-server-name}'
+          project-regexp: '^{project}$'
+          branch-regexp: '{branch-regexp}'
+          dependency-jobs: '{dependency-jobs}'
+          file-include-regexp: '{all-files-regexp}'
+
+    properties:
+      - cord-infra-properties:
+          build-days-to-keep: '{build-days-to-keep}'
+          artifact-num-to-keep: '{artifact-num-to-keep}'
+
+    parameters:
+      - string:
+         name: notificationEmail
+         default: '$GERRIT_EVENT_ACCOUNT_EMAIL'
+         description: 'Verification failure of patch $GERRIT_CHANGE_NUMBER to {project} repo'
+
+    node: 'openolt_deb_onf_agent'
+    project-type: pipeline
+    concurrent: true
+
+    pipeline-scm:
+      script-path: 'Jenkinsfile.test'
+      scm:
+        - cord-infra-gerrit-scm:
+            git-url: '$GIT_URL/$GERRIT_PROJECT'
+            refspec: '$GERRIT_REFSPEC'
+            branch: '$GERRIT_BRANCH'
+            submodule-recursive: 'false'
+            choosing-strategy: 'gerrit'
+            jenkins-ssh-credential: '{jenkins-ssh-credential}'
+            basedir: ''
diff --git a/jjb/verify/osam.yaml b/jjb/verify/osam.yaml
new file mode 100644
index 0000000..7cfe36a
--- /dev/null
+++ b/jjb/verify/osam.yaml
@@ -0,0 +1,21 @@
+---
+# verification jobs for 'osam' repo
+
+- project:
+    name: osam
+    project: '{name}'
+
+    jobs:
+      - 'verify-osam-jobs':
+          branch-regexp: '{supported-branches-regexp}'
+
+- job-group:
+    name: 'verify-osam-jobs'
+    jobs:
+      - 'verify-licensed'
+#     - 'tag-collision-reject':
+#         dependency-jobs: 'verify_osam_licensed'
+#     - 'verify-sonarqube':
+#         dependency-jobs: 'verify_osam_tag-collision'
+#         sonar-prep-commands: './build.sh'
+#         sonar-java-binaries: 'target'
diff --git a/jjb/verify/voltha-bbsim.yaml b/jjb/verify/voltha-bbsim.yaml
index 0ecd412..567526c 100644
--- a/jjb/verify/voltha-bbsim.yaml
+++ b/jjb/verify/voltha-bbsim.yaml
@@ -13,8 +13,10 @@
     name: 'verify-voltha-bbsim-jobs'
     jobs:
       - 'verify-licensed'
-      - 'verify-sonarqube':
+      - 'tag-collision-reject':
           dependency-jobs: 'verify_voltha-bbsim_licensed'
+      - 'verify-sonarqube':
+          dependency-jobs: 'verify_voltha-bbsim_tag-collision'
       - 'voltha-bbsim-tests':
           dependency-jobs: 'verify_voltha-bbsim_sonarqube'
 
@@ -77,8 +79,13 @@
 
           make dep
 
+          # run tests as a developer would
+          make test
+
+          # generate Jenkins report
           go test -v ./...  2>&1 | go-junit-report > $WORKSPACE/junit-report.xml
 
+          # generate Jenkins coverage
           go test -coverprofile=coverage.txt -covermode=count ./...
           gocover-cobertura < coverage.txt > $WORKSPACE/coverage.xml
 
diff --git a/jjb/xos-tosca-e2e.yaml b/jjb/xos-tosca-e2e.yaml
index ef66e1c..dff9bea 100644
--- a/jjb/xos-tosca-e2e.yaml
+++ b/jjb/xos-tosca-e2e.yaml
@@ -23,7 +23,7 @@
 
     wrappers:
       - lf-infra-wrappers:
-          build-timeout: '{build-timeout}'
+          build-timeout: '20'
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
 
     scm:
@@ -32,7 +32,7 @@
           branch: '$GERRIT_BRANCH'
           destination-dir: 'cord'
 
-    node: '{build-node}'
+    node: 'ubuntu16.04-basebuild-4c-8g'
     project-type: freestyle
     concurrent: true
 
@@ -49,23 +49,37 @@
           export XOS_DIR=$WORKSPACE/cord/orchestration/xos
           export TOSCA_DIR=$WORKSPACE/cord/orchestration/xos-tosca
 
-          # build tosca container
-          cd $TOSCA_DIR
-          make build
+           #install minikube+helm
+           export MINIKUBE_WANTUPDATENOTIFICATION=false
+           export MINIKUBE_WANTREPORTERRORPROMPT=false
+           export CHANGE_MINIKUBE_NONE_USER=true
+           export MINIKUBE_HOME=$HOME
+           mkdir -p $HOME/.kube || true
+           touch $HOME/.kube/config
+           export KUBECONFIG=$HOME/.kube/config
+           sudo -E /usr/bin/minikube start --vm-driver=none
+           sleep 300
 
-          #deploy xos core
-          cd $WORKSPACE/cord/helm-charts
-          helm dep update xos-core
-          helm install --set images.xos_tosca.tag=candidate -f examples/imagePullPolicy-IfNotPresent.yaml -n xos-core xos-core
+           helm init
+           sleep 60
+           helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com/
 
-          #wait for xos-core and models to be loaded
-          timeout 300 bash -c "until http -a admin@opencord.org:letmein GET http://127.0.0.1:30001/xosapi/v1/core/sites |jq '.items[0].name'|grep -q mysite; do echo 'Waiting for API To be up'; sleep 10; done"
+           # build tosca container
+           cd $TOSCA_DIR
+           make build
 
-          #test apis
-          http -a admin@opencord.org:letmein GET http://127.0.0.1:30001/xosapi/v1/core/sites | grep '200 OK'
-          http -a wronguser@opencord.org:wrongpass GET http://127.0.0.1:30001/xosapi/v1/core/sites | grep '403 Forbidden'
-          http -a admin@opencord.org:letmein GET http://127.0.0.1:30001/xosapi/v1/utility/auth_noop | grep '405 Method Not Allowed'
-          http -a wronguser@opencord.org:wrongpass GET http://127.0.0.1:30001/xosapi/v1/utility/auth_noop | grep '405 Method Not Allowed'
-          http -a wronguser@opencord.org:wrongpass GET http://127.0.0.1:30001/xosapi/v1/utility/noop | grep '405 Method Not Allowed'
-          http GET http://127.0.0.1:30001/xosapi/v1/utility/noop | grep '405 Method Not Allowed'
+           #deploy xos core
+           cd $WORKSPACE/cord/helm-charts
+           helm dep update xos-core
+           helm install --set images.xos_tosca.tag=candidate -f examples/imagePullPolicy-IfNotPresent.yaml -n xos-core xos-core
 
+           #wait for xos-core and models to be loaded
+           timeout 300 bash -c "until http -a admin@opencord.org:letmein GET http://127.0.0.1:30001/xosapi/v1/core/sites |jq '.items[0].name'|grep -q mysite; do echo 'Waiting for API To be up'; sleep 10; done"
+
+           #test apis
+           curl -Is -u admin@opencord.org:letmein GET http://127.0.0.1:30001/xosapi/v1/core/sites | grep -q '200 OK'
+           curl -Is -u wronguser@opencord.org:wrongpass GET http://127.0.0.1:30001/xosapi/v1/core/sites | grep '403 Forbidden'
+           curl -Is -u admin@opencord.org:letmein GET http://127.0.0.1:30001/xosapi/v1/utility/auth_noop | grep '405 Method Not Allowed'
+           curl -Is -u wronguser@opencord.org:wrongpass GET http://127.0.0.1:30001/xosapi/v1/utility/auth_noop | grep '405 Method Not Allowed'
+           curl -Is -u wronguser@opencord.org:wrongpass GET http://127.0.0.1:30001/xosapi/v1/utility/noop | grep '405 Method Not Allowed'
+           curl -Is GET http://127.0.0.1:30001/xosapi/v1/utility/noop | grep '405 Method Not Allowed'
diff --git a/packer/provision/basebuild.sh b/packer/provision/basebuild.sh
index 145080a..596c24c 100644
--- a/packer/provision/basebuild.sh
+++ b/packer/provision/basebuild.sh
@@ -48,6 +48,39 @@
     # set up golang repo
     add-apt-repository ppa:gophers/archive
 
+    # set up kubernetes repo
+    cat << EOF | base64 -d > /tmp/k8s-apt-key.gpg
+mQENBFUd6rIBCAD6mhKRHDn3UrCeLDp7U5IE7AhhrOCPpqGF7mfTemZYHf/5JdjxcOxoSFlK
+7zwmFr3lVqJ+tJ9L1wd1K6P7RrtaNwCiZyeNPf/Y86AJ5NJwBe0VD0xHTXzPNTqRSByVYtdN
+94NoltXUYFAAPZYQls0x0nUD1hLMlOlC2HdTPrD1PMCnYq/NuL/Vk8sWrcUt4DIS+0RDQ8tK
+Ke5PSV0+PnmaJvdF5CKawhh0qGTklS2MXTyKFoqjXgYDfY2EodI9ogT/LGr9Lm/+u4OFPvmN
+9VN6UG+s0DgJjWvpbmuHL/ZIRwMEn/tpuneaLTO7h1dCrXC849PiJ8wSkGzBnuJQUbXnABEB
+AAG0QEdvb2dsZSBDbG91ZCBQYWNrYWdlcyBBdXRvbWF0aWMgU2lnbmluZyBLZXkgPGdjLXRl
+YW1AZ29vZ2xlLmNvbT6JAT4EEwECACgFAlUd6rICGy8FCQWjmoAGCwkIBwMCBhUIAgkKCwQW
+AgMBAh4BAheAAAoJEDdGwginMXsPcLcIAKi2yNhJMbu4zWQ2tM/rJFovazcY28MF2rDWGOnc
+9giHXOH0/BoMBcd8rw0lgjmOosBdM2JT0HWZIxC/Gdt7NSRA0WOlJe04u82/o3OHWDgTdm9M
+S42noSP0mvNzNALBbQnlZHU0kvt3sV1YsnrxljoIuvxKWLLwren/GVshFLPwONjw3f9Fan6G
+WxJyn/dkX3OSUGaduzcygw51vksBQiUZLCD2Tlxyr9NvkZYTqiaWW78L6regvATsLc9L/dQU
+iSMQZIK6NglmHE+cuSaoK0H4ruNKeTiQUw/EGFaLecay6Qy/s3Hk7K0QLd+gl0hZ1w1VzIeX
+Lo2BRlqnjOYFX4CwAgADmQENBFrBaNsBCADrF18KCbsZlo4NjAvVecTBCnp6WcBQJ5oSh7+E
+98jX9YznUCrNrgmeCcCMUvTDRDxfTaDJybaHugfba43nqhkbNpJ47YXsIa+YL6eEE9emSmQt
+jrSWIiY+2YJYwsDgsgckF3duqkb02OdBQlh6IbHPoXB6H//b1PgZYsomB+841XW1LSJPYlYb
+IrWfwDfQvtkFQI90r6NknVTQlpqQh5GLNWNYqRNrGQPmsB+NrUYrkl1nUt1LRGu+rCe4bSaS
+mNbwKMQKkROE4kTiB72DPk7zH4Lm0uo0YFFWG4qsMIuqEihJ/9KNX8GYBr+tWgyLooLlsdK3
+l+4dVqd8cjkJM1ExABEBAAG0QEdvb2dsZSBDbG91ZCBQYWNrYWdlcyBBdXRvbWF0aWMgU2ln
+bmluZyBLZXkgPGdjLXRlYW1AZ29vZ2xlLmNvbT6JAT4EEwECACgFAlrBaNsCGy8FCQWjmoAG
+CwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEGoDCyG6B/T78e8H/1WH2LN/nVNhm5TS1VYJ
+G8B+IW8zS4BqyozxC9iJAJqZIVHXl8g8a/Hus8RfXR7cnYHcg8sjSaJfQhqO9RbKnffiuQgG
+rqwQxuC2jBa6M/QKzejTeP0Mgi67pyrLJNWrFI71RhritQZmzTZ2PoWxfv6b+Tv5v0rPaG+u
+t1J47pn+kYgtUaKdsJz1umi6HzK6AacDf0C0CksJdKG7MOWsZcB4xeOxJYuy6NuO6KcdEz8/
+XyEUjIuIOlhYTd0hH8E/SEBbXXft7/VBQC5wNq40izPi+6WFK/e1O42DIpzQ749ogYQ1eode
+xPNhLzekKR3XhGrNXJ95r5KO10VrsLFNd8KwAgAD
+EOF
+
+    sudo apt-key add /tmp/k8s-apt-key.gpg
+    echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
+
+    # update after adding apt repos to sources
     apt-get update
 
     # install basic sofware requirements
@@ -59,6 +92,10 @@
         curl \
         git \
         golang-1.10-go \
+        httpie \
+        "kubeadm=1.11.3-*" \
+        "kubelet=1.11.3-*" \
+        "kubectl=1.11.3-*" \
         less \
         libmysqlclient-dev \
         libpcap-dev \
@@ -87,6 +124,7 @@
         Jinja2 \
         ansible-lint \
         astroid==1.* \
+        coverage \
         docker-compose==1.20.1 \
         docker==3.2.1 \
         gitpython \
@@ -94,6 +132,8 @@
         grpcio-tools \
         isort \
         linkchecker \
+        mock \
+        nose2 \
         pexpect \
         pylint==1.* \
         pyyaml \
@@ -102,6 +142,7 @@
         robotframework-kafkalibrary \
         robotframework-requests \
         robotframework-sshlibrary \
+        tox \
         virtualenv
         # end of pip install list
 
@@ -150,8 +191,8 @@
     popd
 
     # install helm
-    HELM_VERSION="2.10.0"
-    HELM_SHA256SUM="0fa2ed4983b1e4a3f90f776d08b88b0c73fd83f305b5b634175cb15e61342ffe"
+    HELM_VERSION="2.11.0"
+    HELM_SHA256SUM="02a4751586d6a80f6848b58e7f6bd6c973ffffadc52b4c06652db7def02773a1"
     HELM_PLATFORM="linux-amd64"
     curl -L -o /tmp/helm.tgz "https://storage.googleapis.com/kubernetes-helm/helm-v${HELM_VERSION}-${HELM_PLATFORM}.tar.gz"
     echo "$HELM_SHA256SUM  /tmp/helm.tgz" | sha256sum -c -
@@ -162,19 +203,10 @@
     rm -rf helm.tgz ${HELM_PLATFORM}
     popd
 
-    # install kubectl
-    KUBECTL_VERSION="1.11.3"
-    KUBECTL_SHA256SUM="0d4c70484e90d4310f03f997b4432e0a97a7f5b5be5c31d281f3d05919f8b46c"
-    curl -L -o /tmp/kubectl "https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl"
-    echo "$KUBECTL_SHA256SUM  /tmp/kubectl" | sha256sum -c -
-    mv /tmp/kubectl /usr/local/bin/kubectl
-    chmod a+x /usr/local/bin/kubectl
-    rm -f /tmp/kubectl
-
     # install minikube
-    MINIKUBE_VERSION="0.28.2"
+    MINIKUBE_VERSION="0.30.0"
     MINIKUBE_DEB_VERSION="$(echo ${MINIKUBE_VERSION} | sed -n 's/\(.*\)\.\(.*\)/\1-\2/p')"
-    MINIKUBE_SHA256SUM="47cd2db6a65b092a3e1ac47ddd4331914290f04069260ee273530ab7e29123d2"
+    MINIKUBE_SHA256SUM="c6c5aa5956f8ad5f61d426e9b8601ba95965a9c30bb80a9fe7525c64e6dd12fd"
     curl -L -o /tmp/minikube.deb "https://storage.googleapis.com/minikube/releases/v${MINIKUBE_VERSION}/minikube_${MINIKUBE_DEB_VERSION}.deb"
     echo "$MINIKUBE_SHA256SUM  /tmp/minikube.deb" | sha256sum -c -
     pushd /tmp