CORD-2771 adding k8 pod sanity tests

Change-Id: I411236edd7b3449f4512c0269d10b1a62915d274
diff --git a/src/test/robot/SanityK8POD.robot b/src/test/robot/SanityK8POD.robot
new file mode 100644
index 0000000..282775d
--- /dev/null
+++ b/src/test/robot/SanityK8POD.robot
@@ -0,0 +1,223 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# 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.
+
+
+*** Settings ***
+Documentation     Test suite to validate K8s in the experimental ControlKube Scenario
+Suite Setup       Setup
+Library           OperatingSystem
+Library           ../cord-api/Framework/utils/onosUtils.py
+Library           ../cord-api/Framework/utils/utils.py
+Resource          ../cord-api/Framework/utils/utils.robot
+
+*** Variables ***
+${profile}           rcord-lite
+${deployment}        virtual
+@{physical_nodes}    head1    compute1    compute2
+@{minikube_nodes}    minikube
+${resources_file}    ${CURDIR}/data/k8resources.json
+
+
+*** Test Cases ***
+Validate K8 Nodes
+    [Documentation]    Validates that all nodes that are running in the K8 are healthy
+    [Tags]    xos-core
+    ${nodes}=    Run    kubectl get nodes -o json
+    Log    ${nodes}
+    @{nodes}=    Get Names    ${nodes}
+    ##set nodes based on deployment
+    @{nodes_expected}=    Set Variable If    '${deployment}' == 'physical'    ${physical_nodes}    ${minikube_nodes}
+    Log    ${nodes_expected}
+    #validates that all expected nodes to be running
+    : FOR    ${i}    IN    @{nodes_expected}
+    \    List Should Contain Value    ${nodes}    ${i}
+    : FOR    ${i}    IN    @{nodes}
+    \    ${status}=     Run    kubectl get nodes ${i} -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
+    \    ${outofdisk}=     Run    kubectl get nodes ${i} -o jsonpath='{.status.conditions[?(@.type=="OutOfDisk")].status}'
+    \    ${memorypressure}=     Run    kubectl get nodes ${i} -o jsonpath='{.status.conditions[?(@.type=="MemoryPressure")].status}'
+    \    ${diskpressure}=     Run    kubectl get nodes ${i} -o jsonpath='{.status.conditions[?(@.type=="DiskPressure")].status}'
+    \    Should Be Equal    ${status}    True
+    \    Should Be Equal    ${outofdisk}    False
+    \    Should Be Equal    ${memorypressure}    False
+    \    Should Be Equal    ${diskpressure}    False
+
+Validate XOS Core Containers
+    [Documentation]    Validates that all xos core containers that are running in the K8 Pods are healthy
+    [Tags]    xos-core
+    @{core_container_names}=    Run Keyword and Continue on Failure    Validate Pods    xos-
+    #validates that all expected containers to be running are in one of the pods inspected above
+    : FOR    ${i}    IN    @{core_containers}
+    \    Run Keyword and Continue on Failure    List Should Contain Value    ${core_container_names}    ${i}
+
+Validate RCord-Lite Containers
+    [Documentation]    Validates that all rcord-lite containers that are running in the K8 Pods are healthy
+    [Tags]    rcord-lite
+    @{rcord_container_names}=    Run Keyword and Continue on Failure    Validate Pods    rcord-lite-
+    #validates that all expected containers to be running are in one of the pods inspected above
+    : FOR    ${i}    IN    @{rcord_lite_containers}
+    \    Run Keyword and Continue on Failure    List Should Contain Value    ${rcord_container_names}    ${i}
+
+Validate ONOS-Fabric Containers
+    [Documentation]    Validates that all onos-fabric containers that are running in the K8 Pods are healthy
+    [Tags]    onos-fabric
+    @{onos_container_names}=    Run Keyword and Continue on Failure    Validate Pods    onos-fabric
+    #validates that all expected containers to be running are in one of the pods inspected above
+    : FOR    ${i}    IN    @{onos_fabric_containers}
+    \    Run Keyword and Continue on Failure    List Should Contain Value    ${onos_container_names}    ${i}
+
+Validate XOS Core Deployments
+    [Documentation]    Validates that all xos-core deployments successfully rolled out and available
+    [Tags]    deployments    xos-core
+    Validate Deployments    xos-    ${core_deployments}
+
+Validate RCord-Lite Deployments
+    [Documentation]    Validates that all rcord-lite deployments successfully rolled out and available
+    [Tags]    deployments    rcord-lite
+    Validate Deployments    rcord-lite-    ${rcord_lite_deployments}
+
+Validate ONOS-Fabric Deployments
+    [Documentation]    Validates that all onos-fabric deployments successfully rolled out and available
+    [Tags]    deployments    onos-fabric
+    Validate Deployments    onos-fabric    ${onos_fabric_deployments}
+
+Validate XOS Core Services
+    [Documentation]    Validates that all expected xos-core services that are running in K8s
+    [Tags]    services    xos-core
+    ${services}=    Run    kubectl get services -o json
+    Log    ${services}
+    @{services}=    Get Names    ${services}
+    #validates that all expected services are running
+    : FOR    ${i}    IN    @{xos_core_services}
+    \    Run Keyword and Continue on Failure    List Should Contain Value    ${services}    ${i}
+    ##check for appropriate ports for each service and match with values in helm charts
+    ## eg. kubectl get svc xos-core -o jsonpath='{.spec.ports[?(@.name=="secure")].port}'
+    ## eg. kubectl get svc xos-core -o jsonpath='{.spec.ports[?(@.name=="secure")].targetPort}'
+
+Validate ONOS-Fabric Services
+    [Documentation]    Validates that all expected onos-fabric services that are running in K8s
+    [Tags]    services    onos-fabric
+    ${services}=    Run    kubectl get services -o json
+    Log    ${services}
+    @{services}=    Get Names    ${services}
+    #validates that all expected services are running
+    : FOR    ${i}    IN    @{onos_fabric_services}
+    \    Run Keyword and Continue on Failure    List Should Contain Value    ${services}    ${i}
+    ##check for appropriate ports for each service and match with values in helm charts
+    ## eg. kubectl get svc xos-core -o jsonpath='{.spec.ports[?(@.name=="secure")].port}'
+    ## eg. kubectl get svc xos-core -o jsonpath='{.spec.ports[?(@.name=="secure")].targetPort}'
+
+*** Keywords ***
+Setup
+    Log    Setting up
+    @{core_containers}=    Create List
+    @{rcord_lite_containers}=    Create List
+    @{onos_fabric_containers}=    Create List
+    @{core_deployments}=    Create List
+    @{rcord_lite_deployments}=    Create List
+    @{onos_fabric_deployments}=    Create List
+    @{xos_core_services}=    Create List
+    @{onos_fabric_services}=    Create List
+    ${xos-core_containers}    utils.jsonToList    ${resources_file}    xos-core-containers
+    : FOR    ${container}    IN    @{xos-core_containers}
+    \    Append To List    ${core_containers}    ${container}
+    ${rcord_containers}    utils.jsonToList    ${resources_file}    rcord-lite-containers
+    : FOR    ${container}    IN    @{rcord_containers}
+    \    Append To List    ${rcord_lite_containers}    ${container}
+    ${onosfabric_containers}    utils.jsonToList    ${resources_file}    onos-fabric-containers
+    : FOR    ${container}    IN    @{onosfabric_containers}
+    \    Append To List    ${onos_fabric_containers}    ${container}
+    ${xos-core_deployments}    utils.jsonToList    ${resources_file}    xos-core-deployments
+    : FOR    ${deployment}    IN    @{xos-core_containers}
+    \    Append To List    ${core_deployments}    ${deployment}
+    ${rcord_deployments}    utils.jsonToList    ${resources_file}    rcord-lite-deployments
+    : FOR    ${deployment}    IN    @{rcord_deployments}
+    \    Append To List    ${rcord_lite_deployments}    ${deployment}
+    ${onosfabric_deployments}    utils.jsonToList    ${resources_file}    rcord-lite-deployments
+    : FOR    ${deployment}    IN    @{onosfabric_deployments}
+    \    Append To List    ${onos_fabric_deployments}    ${deployment}
+    ${core_services}    utils.jsonToList    ${resources_file}    xos-core-services
+    : FOR    ${service}    IN    @{core_services}
+    \    Append To List    ${xos_core_services}    ${service}
+    ${onos_services}    utils.jsonToList    ${resources_file}    onos-fabric-services
+    : FOR    ${service}    IN    @{onos_services}
+    \    Append To List    ${onos_fabric_services}    ${service}
+    Set Suite Variable    @{core_containers}
+    Set Suite Variable    @{rcord_lite_containers}
+    Set Suite Variable    @{onos_fabric_containers}
+    Set Suite Variable    @{core_deployments}
+    Set Suite Variable    @{rcord_lite_deployments}
+    Set Suite Variable    @{onos_fabric_deployments}
+    Set Suite Variable    @{xos_core_services}
+    Set Suite Variable    @{onos_fabric_services}
+
+Teardown
+    Log    Tearing down
+
+Get Names
+    [Documentation]    Gets names of K8 resources running
+    [Arguments]    ${output}
+    @{names}=    Create List
+    ${output}=    To JSON    ${output}
+    ${len}=    Get Length    ${output}
+    ${length}=    Get Length    ${output['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${item}=    Get From List    ${output['items']}    ${INDEX}
+    \    ${metadata}=    Get From Dictionary    ${item}    metadata
+    \    ${name}=    Get From Dictionary    ${metadata}    name
+    \    Append To List    ${names}    ${name}
+    [Return]    @{names}
+
+Validate Pods
+    [Arguments]    ${component}
+    @{container_names}=    Create List
+    ${pods}=    Run    kubectl get pods -o json
+    Log    ${pods}
+    ${pods}=    To JSON    ${pods}
+    ${len}=    Get Length    ${pods}
+    ${length}=    Get Length    ${pods['items']}
+    : FOR    ${INDEX}    IN RANGE    0    ${length}
+    \    ${item}=    Get From List    ${pods['items']}    ${INDEX}
+    \    ${metadata}=    Get From Dictionary    ${item}    metadata
+    \    ${name}=    Get From Dictionary    ${metadata}    name
+    \    Continue For Loop If    '${component}' not in '''${name}'''
+    \    ${status}=    Get From Dictionary    ${item}    status
+    \    ${containerStatuses}=    Get From Dictionary    ${status}    containerStatuses
+    \    Log    ${containerStatuses}
+    \    ${cstatus}=    Get From List    ${containerStatuses}    0
+    \     Log    ${cstatus}
+    \    ${restartCount}=    Get From Dictionary    ${cstatus}    restartCount
+    \    Should Be Equal As Integers    ${restartCount}    0
+    \    ${container_name}=    Get From Dictionary    ${cstatus}    name
+    \    ${state}=    Get From Dictionary    ${cstatus}    state
+    \    Should Contain    ${state}    running
+    \    Should Not Contain    ${state}    stopped
+    \    Log    ${state}
+    \    Append To List    ${container_names}    ${container_name}
+    [Return]    ${container_names}
+
+Validate Deployments
+    [Arguments]    ${component}    ${expected_deployments}
+    ${deployments}=    Run    kubectl get deployments -o json
+    @{deployments}=    Get Names    ${deployments}
+    : FOR    ${i}    IN    @{deployments}
+    \    Continue For Loop If    '${component}' not in '''${i}'''
+    \    ${rollout_status}=    Run    kubectl rollout status deployment/${i}
+    \    Should Be Equal    ${rollout_status}    deployment "${i}" successfully rolled out
+    \    ##validate replication sets
+    \    ${desired}=    Run    kubectl get deployments ${i} -o jsonpath='{.status.replicas}'
+    \    ${available}=    Run    kubectl get deployments ${i} -o jsonpath='{.status.availableReplicas}'
+    \    Should Be Equal    ${desired}    ${available}
+    #validates that all expected deployments to exist
+    : FOR    ${i}    IN    @{expected_deployments}
+    \    List Should Contain Value    ${deployments}    ${i}
\ No newline at end of file
diff --git a/src/test/robot/data/k8resources.json b/src/test/robot/data/k8resources.json
new file mode 100644
index 0000000..bea80da
--- /dev/null
+++ b/src/test/robot/data/k8resources.json
@@ -0,0 +1,62 @@
+{
+    "xos-core-containers":
+    [
+        "xos-chameleon",
+        "xos-core",
+        "xos-db",
+        "xos-redis",
+        "xos-tosca"
+    ],
+    "xos-core-deployments":
+    [
+        "xos-chameleon",
+        "xos-core",
+        "xos-db",
+        "xos-redis",
+        "xos-tosca"
+    ],
+    "rcord-lite-containers":
+    [
+        "fabric",
+        "kubernetes",
+        "onos-service",
+        "rcord",
+        "volt",
+        "vrouter",
+        "vsg-hw"
+    ],
+    "rcord-lite-deployments":
+    [
+        "rcord-lite-fabric",
+        "rcord-lite-kubernetes",
+        "rcord-lite-onos-service",
+        "rcord-lite-rcord",
+        "rcord-lite-volt",
+        "rcord-lite-vrouter",
+        "rcord-lite-vsg-hw"
+    ],
+    "onos-fabric-containers":
+    [
+        "onos"
+    ],
+    "onos-fabric-deployments":
+    [
+        "onos-fabric"
+    ],
+    "xos-core-services":
+    [
+        "kubernetes",
+        "redis",
+        "xos-chameleon",
+        "xos-core",
+        "xos-db",
+        "xos-tosca"
+    ],
+    "onos-fabric-services":
+    [
+        "onos-fabric-openflow",
+        "onos-fabric-ovsdb",
+        "onos-fabric-ssh",
+        "onos-fabric-ui"
+    ]
+}