Fix tidy for Coe
[integration/test.git] / csit / libraries / Coe.robot
1 *** Settings ***
2 Library           BuiltIn
3 Library           SSHLibrary
4 Library           String
5 Resource          DataModels.robot
6 Resource          Genius.robot
7 Resource          OVSDB.robot
8 Resource          SSHKeywords.robot
9 Resource          Utils.robot
10 Resource          ../variables/netvirt/Variables.robot
11 Resource          ../variables/Variables.robot
12 Resource          VpnOperations.robot
13 Variables         ../variables/coe/Modules.py
14 Variables         ../variables/netvirt/Modules.py
15 Resource          ToolsSystem.robot
16
17 *** Variables ***
18 ${BUSY_BOX}       ${CURDIR}/../variables/coe/busy-box.yaml
19 ${CNI_BINARY_FILE}    /opt/cni/bin/odlovs-cni
20 ${CONFIG_FILE}    /etc/cni/net.d/odlovs-cni.conf
21 ${CONFIG_FILE_TEMPLATE}    ${CURDIR}/../variables/coe/odlovs-cni.conf.j2
22 ${HOST_INVENTORY}    ${CURDIR}/../variables/coe/hosts.yaml
23 ${K8s_MASTER_IP}    ${TOOLS_SYSTEM_1_IP}
24 ${HOSTS_FILE_TEMPLATE}    ${CURDIR}/../variables/coe/minions_template.yaml
25 ${NODE_READY_STATUS}    \\sReady    # The check using this variable should not mess up with NotReady
26 ${PLAYBOOK_FILE}    ${CURDIR}/../variables/coe/coe_play.yaml
27 ${POD_RUNNING_STATUS}    \\sRunning
28 ${VARIABLES_PATH}    ${CURDIR}/../variables/coe
29 ${WATCHER_COE}    ${CURDIR}/../variables/coe/coe.yaml
30 @{COE_DIAG_SERVICES}    OPENFLOW    IFM    ITM    DATASTORE    ELAN    OVSDB
31
32 *** Keywords ***
33 Coe Suite Setup
34     [Documentation]    COE project requires start suite to be executed only for the first test suite.This keyword find the current suite,compares it with the stored first suite value and executes Coe.Start suite only if the cuurent suite is equal to the first suite.
35     ToolsSystem.Get Tools System Nodes Data
36     Coe.Set Connection ids and Bridge
37     ${current suite}    ${suite names updated}    Extract current suite name
38     ${first_suite} =    Set Variable    ${suite names updated[0]}
39     ${status} =    BuiltIn.Evaluate    '${first_suite}' == '${current suite}'
40     Run Keyword If    '${status}' == 'True'    Coe.Start Suite
41
42 Start Suite
43     [Documentation]    Suite setup keyword.
44     Coe.Configuration Playbook
45     Coe.Verify Config Files
46     Coe.Verify Watcher Is Running
47     BuiltIn.Wait Until Keyword Succeeds    40s    2s    Coe.Check Node Status Is Ready
48     Coe.Label Nodes
49     BuiltIn.Wait Until Keyword Succeeds    60    2    ClusterManagement.Check Status Of Services Is OPERATIONAL    @{COE_DIAG_SERVICES}
50     BuiltIn.Wait Until Keyword Succeeds    85    2    Genius.Verify Tunnel Status as UP    default-transport-zone
51     Coe.Derive Coe Data Models
52
53 Set Connection ids and Bridge
54     [Documentation]    Sets the connection ids for all the nodes and get the bridge from configuration file .
55     : FOR    ${conn_id}    IN    @{TOOLS_SYSTEM_ALL_CONN_IDS}
56     \    SSHLibrary.Switch Connection    ${conn_id}
57     \    SSHKeywords.Flexible_SSH_Login    ${DEFAULT_USER}    ${DEFAULT_PASSWORD}
58     ${file} =    OperatingSystem.Get File    ${CONFIG_FILE_TEMPLATE}
59     ${ovs bridge output}    ${bridge} =    BuiltIn.Should Match Regexp    ${file}    "ovsBridge": "(\\w.*)"
60     BuiltIn.Set Suite Variable    ${bridge}
61
62 Configuration Playbook
63     [Documentation]    Ansible playbook which does all basic configuration for kubernetes nodes.
64     ${playbook minions}    ${playbook hosts}    ${host file}    Modifying templates in playbook
65     ${playbook} =    OperatingSystem.Get File    ${PLAYBOOK_FILE}
66     ${playbook} =    String.Replace String    ${playbook}    coe-hosts    ${playbook hosts}
67     ${playbook} =    String.Replace String    ${playbook}    coe-minions    ${playbook minions}
68     OperatingSystem.Create File    ${PLAYBOOK_FILE}    ${playbook}
69     OperatingSystem.Create File    ${USER_HOME}/hosts.yaml    ${host file}
70     ${watcher} =    OperatingSystem.Get File    ${WATCHER_COE}
71     ${watcher} =    String.Replace String    ${watcher}    odlip    ${ODL_SYSTEM_IP}
72     ${watcher} =    String.Replace String    ${watcher}    port    ${RESTCONFPORT}
73     OperatingSystem.Create File    ${WATCHER_COE}    ${watcher}
74     SSHKeywords.Copy_File_To_Remote_System    ${K8s_MASTER_IP}    ${WATCHER_COE}    ${USER_HOME}
75     OperatingSystem.Copy File    ${PLAYBOOK_FILE}    ${USER_HOME}
76     ${play_output} =    OperatingSystem.Run    ansible-playbook -v ${USER_HOME}/coe_play.yaml -i ${USER_HOME}/hosts.yaml --extra-vars '{"gerrit_branch":"FETCH_HEAD","gerrit_refspec":"${GERRIT_REFSPEC}"}'
77     BuiltIn.Log    ${play_output}
78
79 Modifying templates in playbook
80     ${inventory} =    OperatingSystem.Get File    ${HOST_INVENTORY}
81     ${template} =    OperatingSystem.Get File    ${HOSTS_FILE_TEMPLATE}
82     ${template} =    String.Replace String    ${template}    minion_ip    ${TOOLS_SYSTEM_ALL_IPS[0]}
83     @{minions}    Create List    coe-minion
84     ${hosts}    Set Variable    coe-master:
85     : FOR    ${i}    IN RANGE    1    ${NUM_TOOLS_SYSTEM}
86     \    Append To List    ${minions}    coe-minion${i}
87     \    ${hosts} =    Catenate    ${hosts}    coe-minion${i}:
88     ${hosts} =    Replace String Using Regexp    ${hosts}    :$    ${EMPTY}
89     ${hosts} =    Remove Space on String    ${hosts}
90     ${minion hosts} =    Replace String Using Regexp    ${hosts}    ^[\\w-]+:    ${EMPTY}
91     : FOR    ${i}    IN RANGE    1    ${NUM_TOOLS_SYSTEM}
92     \    ${j} =    Evaluate    ${i}+1
93     \    ${template} =    String.Replace String    ${template}    ${minions[${i}-1]}    ${minions[${i}]}
94     \    ${template} =    String.Replace String    ${template}    ${TOOLS_SYSTEM_ALL_IPS[${i}-1]}    ${TOOLS_SYSTEM_ALL_IPS[${i}]}
95     \    ${template} =    String.Replace String    ${template}    192.168.50.1${i}    192.168.50.1${j}
96     \    ${template} =    String.Replace String    ${template}    10.11.${i}.0/24    10.11.${j}.0/24
97     \    ${template} =    String.Replace String    ${template}    10.11.${i}.1    10.11.${j}.1
98     \    Append To File    ${HOST_INVENTORY}    ${template}
99     ${host file} =    OperatingSystem.Get File    ${HOST_INVENTORY}
100     ${host file} =    String.Replace String    ${host file}    master_ip    ${TOOLS_SYSTEM_ALL_IPS[0]}
101     ${host file} =    String.Replace String    ${host file}    odl_ip    ${ODL_SYSTEM_IP}
102     ${host file} =    String.Replace String    ${host file}    mport    ${OVSDBPORT}
103     ${host file} =    String.Replace String    ${host file}    cport    ${ODL_OF_PORT_6653}
104     ${host file} =    String.Replace String    ${host file}    filepath    ${CONFIG_FILE_TEMPLATE}
105     ${host file} =    String.Replace String    ${host file}    yamlpath    ${USER_HOME}/coe.yaml
106     log    ${host file}
107     [Return]    ${minion hosts}    ${hosts}    ${host file}
108
109 Verify Config Files
110     [Documentation]    Checks if the configuration files are present in all nodes
111     : FOR    ${nodes}    IN    @{TOOLS_SYSTEM_ALL_IPS}
112     \    Utils.Verify File Exists On Remote System    ${nodes}    ${CONFIG_FILE}
113     : FOR    ${nodes}    IN    @{TOOLS_SYSTEM_ALL_IPS}
114     \    Utils.Verify File Exists On Remote System    ${nodes}    ${CNI_BINARY_FILE}
115
116 Verify Watcher Is Running
117     [Documentation]    Checks if watcher is running in the background
118     ${watcher status} =    Utils.Run Command On Remote System    ${K8s_MASTER_IP}    ps -ef | grep watcher
119     BuiltIn.Should Match Regexp    ${watcher status}    .* watcher odl
120
121 Check Node Status Is Ready
122     [Documentation]    Checks the status of nodes.This keyword is repeated until the status of all nodes is Ready
123     ${nodes} =    Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl get nodes    ${DEFAULT_USER}    ${DEFAULT_PASSWORD}    ${DEFAULT_LINUX_PROMPT_STRICT}
124     ${node_status} =    String.Get Lines Matching Regexp    ${nodes}    ${NODE_READY_STATUS}    partial_match=True
125     ${lines_containing_ready} =    String.Get Line Count    ${node_status}
126     BuiltIn.Should Be Equal As Strings    ${lines_containing_ready}    ${NUM_TOOLS_SYSTEM}
127
128 Label Nodes
129     [Documentation]    Create labels for minions so that random allocation of pods to minions is avoided
130     ${i} =    BuiltIn.Set Variable    1
131     ${get nodes} =    Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl get nodes
132     @{get nodes} =    String.Split To Lines    ${get nodes}    2
133     : FOR    ${status}    IN    @{get nodes}
134     \    ${minion} =    BuiltIn.Should Match Regexp    ${status}    ^\\w+-.*-\\d+
135     \    Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl label nodes ${minion} disktype=ss${i}
136     \    ${i} =    BuiltIn.Evaluate    ${i}+1
137     Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl get nodes --show-labels
138
139 Derive Coe Data Models
140     [Documentation]    Data models is created by integrating netvirt and coe data models which is given as input to get the model dumps
141     : FOR    ${models}    IN    @{netvirt_data_models}
142     \    Collections.Append To List    ${coe_data_models}    ${models}
143
144 Check Pod Status Is Running
145     [Documentation]    Checks the status of pods.This keyword is repeated until the status of all pods is Running
146     ${pods} =    Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl get pods -o wide    ${DEFAULT_USER}    ${DEFAULT_PASSWORD}    ${DEFAULT_LINUX_PROMPT_STRICT}
147     @{cluster} =    String.Split To Lines    ${pods}    1
148     : FOR    ${pod}    IN    @{cluster}
149     \    BuiltIn.Should Match Regexp    ${pod}    ${POD_RUNNING_STATUS}
150
151 Tear Down
152     [Documentation]    Test teardown to get dumpflows,ovsconfig,model dump,node status,pod status and to dump config files \ and delete pods.
153     : FOR    ${conn_id}    IN    @{TOOLS_SYSTEM_ALL_CONN_IDS}
154     \    OVSDB.Get DumpFlows And Ovsconfig    ${conn_id}    ${bridge}
155     BuiltIn.Run Keyword And Ignore Error    DataModels.Get Model Dump    ${ODL_SYSTEM_IP}    ${coe_data_models}
156     Coe.DumpConfig File
157     Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl get nodes    ${DEFAULT_USER}    ${DEFAULT_PASSWORD}    ${DEFAULT_LINUX_PROMPT_STRICT}
158     Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl get pods -o wide    ${DEFAULT_USER}    ${DEFAULT_PASSWORD}    ${DEFAULT_LINUX_PROMPT_STRICT}
159     Coe.Delete Pods
160
161 Delete Pods
162     [Documentation]    Waits till the keyword delete status succeeds implying that all pods created have been deleted
163     ${get pods} =    Utils.Run Command On Remote System    ${K8s_MASTER_IP}    kubectl get pods -o wide
164     @{get pods} =    String.Split To Lines    ${get pods}    1
165     : FOR    ${status}    IN    @{get pods}
166     \    ${pod_name} =    BuiltIn.Should Match Regexp    ${status}    ^\\w+-\\w+
167     \    Utils.Run Command On Remote System    ${K8s_MASTER_IP}    kubectl delete pods ${pod_name}
168     BuiltIn.Wait Until Keyword Succeeds    60s    3s    Coe.Check If Pods Are Terminated
169
170 Check If Pods Are Terminated
171     [Documentation]    Checks if the pods created have been terminated.The keyword is repeated until the pods are deleted
172     ${status} =    Utils.Run Command On Remote System    ${K8s_MASTER_IP}    kubectl get pods -o wide    ${DEFAULT_USER}    ${DEFAULT_PASSWORD}    ${DEFAULT_LINUX_PROMPT_STRICT}
173     ...    ${DEFAULT_TIMEOUT}    return_stdout=False    return_stderr=True
174     BuiltIn.Should Contain    ${status}    No resources
175
176 Dump Config File
177     [Documentation]    Logs the configuration files present in all nodes
178     : FOR    ${nodes}    IN    @{TOOLS_SYSTEM_ALL_IPS}
179     \    Utils.Run Command On Remote System And Log    ${nodes}    cat ${CONFIG_FILE}
180
181 Stop Suite
182     [Documentation]    Suite teardown keyword
183     Coe.Collect Watcher Log
184     Coe.Collect Journalctl Log
185     Coe.Stop_Watcher
186     Coe.Kube_reset
187     SSHLibrary.Close All Connections
188
189 Collect Watcher Log
190     [Documentation]    Watcher running in background logs into watcher.out which is copied to ${JENKINS_WORKSPACE}/archives/watcher.log
191     SSHLibrary.Switch Connection    ${TOOLS_SYSTEM_ALL_CONN_IDS[0]}
192     SSHLibrary.Get File    /tmp/watcher.out    ${JENKINS_WORKSPACE}/archives/watcher.log
193
194 Collect Journalctl Log
195     [Documentation]    Logs of the command journalctl -u kubelet is copied to ${JENKINS_WORKSPACE}/archives/journal.log
196     Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    sudo journalctl -u kubelet > ${USER_HOME}/journal.txt
197     SSHLibrary.Switch Connection    ${TOOLS_SYSTEM_ALL_CONN_IDS[0]}
198     SSHLibrary.Get File    ${USER_HOME}/journal.txt    ${JENKINS_WORKSPACE}/archives/journalctl.log
199
200 Stop Watcher
201     [Documentation]    Kill the watcher running at the background after completion of tests cases
202     ${watcher status} =    Utils.Run Command On Remote System    ${K8s_MASTER_IP}    ps -ef | grep watcher
203     ${watcher}    ${pid} =    BuiltIn.Should Match Regexp    ${watcher status}    \\w+\\s+(\\d+).*watcher odl
204     Utils.Run Command On Remote System    ${K8s_MASTER_IP}    kill -9 ${pid}
205
206 Kube reset
207     [Documentation]    Reset K8s to clear up all stale entries
208     : FOR    ${nodes}    IN    @{TOOLS_SYSTEM_ALL_IPS}
209     \    ${kube} =    Utils.Run Command On Remote System And Log    ${nodes}    sudo kubeadm reset
210     \    BuiltIn.Should Contain    ${kube}    Stopping the kubelet service.
211
212 Create Pods
213     [Arguments]    ${label}    ${yaml}    ${name}
214     [Documentation]    Creates pods using the labels of the nodes and busy box names passed as arguments.
215     ${busybox} =    OperatingSystem.Get File    ${BUSY_BOX}
216     ${busybox} =    String.Replace String    ${busybox}    string    ${label}
217     ${busybox} =    String.Replace String    ${busybox}    busyboxname    ${name}
218     OperatingSystem.Create File    ${VARIABLES_PATH}/${yaml}    ${busybox}
219     SSHKeywords.Move_file_To_Remote_System    ${K8s_MASTER_IP}    ${VARIABLES_PATH}/${yaml}    ${USER_HOME}
220     Utils.Run Command On Remote System And Log    ${K8s_MASTER_IP}    kubectl create -f ${yaml}
221
222 Collect Pod Names and Ping
223     [Documentation]    This keyword collects the pod names and checks connectivity between each and every pod with respect to one another.
224     SSHLibrary.Switch Connection    ${TOOLS_SYSTEM_ALL_CONN_IDS[0]}
225     ${get pods} =    Write Commands Until Expected Prompt    kubectl get pods -o wide    ${DEFAULT_LINUX_PROMPT_STRICT}
226     @{pod ips} =    String.Get Regexp Matches    ${get pods}    \\d+\\.\\d+\\.\\d+\\.\\d+
227     @{pod names} =    String.Get Regexp Matches    ${get pods}    ss\\w+-\\w+
228     : FOR    ${pod_name}    IN    @{pod names}
229     \    ${logs} =    Log Statements    ${pod ips}    ${pod names}    ${pod_name}
230     \    Ping Pods    ${pod_name}    ${pod ips}    ${logs}
231
232 Log Statements
233     [Arguments]    ${pod ips}    ${pod names}    ${pod_name}
234     @{log statement} =    Create List
235     ${i} =    Set Variable    0
236     : FOR    ${pod_ip}    IN    @{pod ips}
237     \    ${ping statement}    Set Variable    Ping ${pod_name} and ${pod names[${i}]} : ${pod ip}
238     \    Append To List    ${log statement}    ${ping statement}
239     \    ${i} =    Evaluate    ${i}+1
240     [Return]    @{log statement}
241
242 Ping Pods
243     [Arguments]    ${pod_name}    ${pod ips}    ${logs}
244     ${i} =    Set Variable    0
245     : FOR    ${ping info}    IN    @{logs}
246     \    ${ping} =    Write Commands Until Expected Prompt    kubectl exec -it ${pod_name} -- ping -c 3 ${pod ips[${i}]}    ${DEFAULT_LINUX_PROMPT_STRICT}
247     \    BuiltIn.log    ${ping}
248     \    Builtin.Should Match Regexp    ${ping}    ${PING_REGEXP}
249     \    ${i}    Evaluate    ${i}+1
250
251 Coe Suite Teardown
252     [Documentation]    COE project requires stop suite to be executed only for the last test suite.This keyword find the current suite,compares it with the stored last suite value and executes Coe.Stop suite only if the cuurent suite is equal to the last suite.
253     ${current suite}    ${suite names updated}    Extract current suite name
254     ${last_suite} =    Set Variable    ${suite names updated[-1]}
255     ${status} =    BuiltIn.Evaluate    '${last_suite}' == '${current suite}'
256     Run Keyword If    '${status}' == 'True'    Coe.Stop Suite
257
258 Extract current suite name
259     [Documentation]    This keyword returns the name of current test suite.Appropriate replacement in text is done to make test suite names in SUITES and SUITE_NAME similar.
260     BuiltIn.Log    SUITE_NAME: ${SUITE_NAME}
261     BuiltIn.Log    SUITES: ${SUITES}
262     @{suite_names}    Get Regexp Matches    ${SUITES}    coe\\/(\\w+).robot    1
263     @{suite_names_updated}    Create List
264     : FOR    ${suite}    IN    @{suite_names}
265     \    ${suite}    Replace String    ${suite}    _    ${SPACE}
266     \    Append To List    ${suite_names_updated}    ${suite}
267     ${num_suites} =    BuiltIn.Get Length    ${suite_names_updated}
268     ${suite line}    ${current_suite} =    BuiltIn.Run Keyword If    ${num_suites} > ${1}    Should Match Regexp    ${SUITE_NAME}    .txt.(\\w.*)
269     ...    ELSE    BuiltIn.Set Variable    @{suite_names_updated}[0]    @{suite_names_updated}[0]
270     [Return]    ${current_suite}    ${suite_names_updated}