[VOL-3516] OpenOnu-Go-Adapter: Check usage of MIB-Upload-Templating

Change-Id: Ib5e88e87aa9fe1db37fd49ec703519acd69237b4
diff --git a/tests/openonu-go-adapter/Voltha_ONUTemplateTests.robot b/tests/openonu-go-adapter/Voltha_ONUTemplateTests.robot
new file mode 100755
index 0000000..dedf443
--- /dev/null
+++ b/tests/openonu-go-adapter/Voltha_ONUTemplateTests.robot
@@ -0,0 +1,178 @@
+*** Settings ***
+Documentation     Test Template handling of ONU Go adapter with BBSIM controlledActivation: only-onu only!
+...               Values.yaml must contain 'onu: 2' and 'controlledActivation: only-onu' under BBSIM!
+...               Run robot with bbsim-kind-2x2.yaml
+Suite Setup       Setup Suite
+Suite Teardown    Teardown Suite
+Test Setup        Setup
+Test Teardown     Teardown
+Library           Collections
+Library           String
+Library           OperatingSystem
+Library           XML
+Library           RequestsLibrary
+Library           ../../libraries/DependencyLibrary.py
+Resource          ../../libraries/onos.robot
+Resource          ../../libraries/voltctl.robot
+Resource          ../../libraries/voltha.robot
+Resource          ../../libraries/utils.robot
+Resource          ../../libraries/k8s.robot
+Resource          ../../variables/variables.robot
+
+*** Variables ***
+${NAMESPACE}      voltha
+${timeout}        180s
+${of_id}          0
+${logical_id}     0
+${has_dataplane}    True
+${external_libs}    True
+${teardown_device}    True
+${scripts}        ../../scripts
+# Per-test logging on failure is turned off by default; set this variable to enable
+${container_log_dir}    ${None}
+
+# flag debugmode is used, if true timeout calculation various, can be passed via the command line too
+# example: -v debugmode:True
+${debugmode}    False
+# logging flag to enable Collect Logs, can be passed via the command line too
+# example: -v logging:True
+${logging}    False
+# if True execution will be paused before clean up
+# example: -v pausebeforecleanup:True
+${pausebeforecleanup}    False
+${data_dir}    ../data
+
+
+*** Test Cases ***
+ONU MIB Template Data Test
+    [Documentation]    Validates ONU Go adapter storage of MIB Template Data in etcd and checks the usage
+    ...                - setup one ONU
+    ...                - request MIB-Upload-Data by ONU via OMCI
+    ...                - storage MIB-Upload-Data in etcd
+    ...                - store setup duration of ONU
+    ...                - check Template-Data in etcd stored (service/voltha/omci_mibs/go_templates/)
+    ...                - setup second ONU
+    ...                - collect setup durationof second ONU
+    ...                - compare both duration
+    ...                - duration of second ONU should be at least 10 times faster than the first one
+    ...                - MIB-Upload-Data should not requested via OMCI by second ONU
+    ...                - MIB-Upload-Data should read from etcd
+    [Tags]    onutest
+    [Setup]    Run Keywords    Start Logging    ONUMibTemplateTest
+    ...    AND    Setup
+    Perform ONU MIB Template Data Test
+    [Teardown]    Run Keywords    Run Keyword If    ${logging}    Collect Logs
+    ...    AND    Stop Logging    ONUMibTemplateTest
+
+
+*** Keywords ***
+Setup Suite
+    [Documentation]    Set up the test suite
+    ${LogInfo}=    Catenate
+    ...    \r\nPassed arguments:
+    ...    debugmode:${debugmode}, logging:${logging}, pausebeforecleanup:${pausebeforecleanup},
+    Log    ${LogInfo}    console=yes
+    Common Test Suite Setup
+    ${onos_ssh_connection}    Open ONOS SSH Connection    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}
+    Set Suite Variable  ${onos_ssh_connection}
+    # delete etcd MIB Template Data
+    Delete MIB Template Data
+
+Teardown Suite
+    [Documentation]    Replaces the Suite Teardown in utils.robot.
+    ...    Cleans up and checks all ONU ports disabled in ONOS.
+    ...    Furthermore gives the possibility to pause the execution.
+    Run Keyword If    ${pausebeforecleanup}    Import Library    Dialogs
+    Run Keyword If    ${pausebeforecleanup}    Pause Execution    Press OK to continue with clean up!
+    Run Keyword If    ${pausebeforecleanup}    Log    Teardown will be continued...    console=yes
+    Run Keyword If    ${teardown_device}    Delete All Devices and Verify
+    Wait for Ports in ONOS      ${onos_ssh_connection}  0   BBSM
+    # delete etcd MIB Template Data (for repeating test)
+    Delete MIB Template Data
+    Close ONOS SSH Connection   ${onos_ssh_connection}
+
+Perform ONU MIB Template Data Test
+    [Documentation]    This keyword performs ONU MIB Template Data Test
+    ${firstonu}=    Set Variable    0
+    ${secondonu}=    Set Variable    1
+    ${state2test}=    Set Variable    6
+    Set Global Variable    ${state2test}
+    Run Keyword If    ${has_dataplane}    Clean Up Linux
+    # Start first Onu
+    Log    \r\nONU BBSM00000001: startup with MIB upload cycle and storage of template data to etcd.    console=yes
+    ${result}=    Exec Pod    ${NAMESPACE}    bbsim    bbsimctl onu poweron BBSM00000001
+    Should Contain    ${result}    successfully    msg=Can not poweron BBSM00000001    values=False
+    ${timeStart}=    Get Current Date
+    ${firstonustartup}=    Get ONU Startup Duration    ${firstonu}    ${timeStart}
+    # check MIB Template data stored in etcd
+    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    3s
+    ...    Verify MIB Template Data Available
+    # Start second Onu
+    Log    ONU BBSM00000002: startup without MIB upload cycle by using of template data of etcd.    console=yes
+    ${result}=    Exec Pod    ${NAMESPACE}    bbsim    bbsimctl onu poweron BBSM00000002
+    Should Contain    ${result}    successfully    msg=Can not poweron BBSM00000002    values=False
+    ${timeStart}=    Get Current Date
+    ${secondonustartup}=    Get ONU Startup Duration    ${secondonu}    ${timeStart}
+    # compare both durations, second onu should be at least 3 times faster
+    ${status}    Evaluate    ${firstonustartup}>=${secondonustartup}*3
+    Should Be True    ${status}
+    ...    Startup durations (${firstonustartup} and ${secondonustartup}) do not full fill the requirements of 1/10.
+
+Get ONU Startup Duration
+    [Documentation]    This keyword delivers startup duration of onu
+    [Arguments]    ${onu}    ${starttime}
+    ${src}=    Set Variable    ${hosts.src[${onu}]}
+    ${admin_state}    ${oper_status}    ${connect_status}    ${onu_state}=    Map State    ${state2test}
+    Run Keyword And Continue On Failure    Wait Until Keyword Succeeds    ${timeout}    50ms
+    ...    Validate Device    ${admin_state}    ${oper_status}    ${connect_status}
+    ...    ${src['onu']}    onu=True    onu_reason=${onu_state}
+    ${timeCurrent} =    Get Current Date
+    ${timeTotalMs} =    Subtract Date From Date    ${timeCurrent}    ${startTime}    result_format=number
+    Log    ONU ${src['onu']}: reached the state ${onu_state} after ${timeTotalMs} sec.    console=yes
+    [Return]    ${timeTotalMs}
+
+Verify MIB Template Data Available
+    [Documentation]    This keyword verifies MIB Template Data stored in etcd
+    ${namespace}=    Set Variable    default
+    ${podname}=    Set Variable    etcd
+    ${commandget}    Catenate
+    ...    /bin/sh -c 'ETCDCTL_API=3 etcdctl get --prefix service/voltha/omci_mibs/go_templates/'
+    ${result}=    Exec Pod    ${namespace}    ${podname}    ${commandget}
+    Should Not Be Empty    ${result}    No MIB Template Data stored in etcd!
+
+Delete MIB Template Data
+    [Documentation]    This keyword deletes MIB Template Data stored in etcd
+    ${namespace}=    Set Variable    default
+    ${podname}=    Set Variable    etcd
+    ${commanddel}    Catenate
+    ...    /bin/sh -c 'ETCDCTL_API=3 etcdctl del --prefix service/voltha/omci_mibs/go_templates/'
+    ${result}=    Exec Pod    ${namespace}    ${podname}    ${commanddel}
+    Sleep    3s
+    ${commandget}    Catenate
+    ...    /bin/sh -c 'ETCDCTL_API=3 etcdctl get --prefix service/voltha/omci_mibs/go_templates/'
+    ${result}=    Exec Pod    ${namespace}    ${podname}    ${commandget}
+    Should Be Empty    ${result}    Could not delete MIB Template Data stored in etcd!
+
+Map State
+    [Documentation]    This keyword converts the passed numeric value or name of a onu state to its state values.
+    [Arguments]    ${state}
+    # create state lists with corresponding return values
+    #                             ADMIN-STATE OPER-STATUS   CONNECT-STATUS ONU-STATE
+    ${state1}    Create List      ENABLED     ACTIVATING    REACHABLE      activating-onu
+    ${state2}    Create List      ENABLED     ACTIVATING    REACHABLE      starting-openomci
+    ${state3}    Create List      ENABLED     ACTIVATING    REACHABLE      discovery-mibsync-complete
+    ${state4}    Create List      ENABLED     ACTIVE        REACHABLE      initial-mib-downloaded
+    ${state5}    Create List      ENABLED     ACTIVE        REACHABLE      tech-profile-config-download-success
+    ${state6}    Create List      ENABLED     ACTIVE        REACHABLE      omci-flows-pushed
+    ${state7}    Create List      DISABLED    UNKNOWN       REACHABLE      omci-admin-lock
+    ${state8}    Create List      ENABLED     ACTIVE        REACHABLE      onu-reenabled
+    ${admin_state}    ${oper_status}    ${connect_status}    ${onu_state}=    Set Variable If
+    ...    '${state}'=='1' or '${state}'=='activating-onu'                          ${state1}
+    ...    '${state}'=='2' or '${state}'=='starting-openomci'                       ${state2}
+    ...    '${state}'=='3' or '${state}'=='discovery-mibsync-complete'              ${state3}
+    ...    '${state}'=='4' or '${state}'=='initial-mib-downloaded'                  ${state4}
+    ...    '${state}'=='5' or '${state}'=='tech-profile-config-download-success'    ${state5}
+    ...    '${state}'=='6' or '${state}'=='omci-flows-pushed'                       ${state6}
+    ...    '${state}'=='7' or '${state}'=='omci-admin-lock'                         ${state7}
+    ...    '${state}'=='8' or '${state}'=='onu-reenabled'                           ${state8}
+    [Return]    ${admin_state}    ${oper_status}    ${connect_status}    ${onu_state}