Feature 10923: Advanced cluster management

Change-Id: I384d1d3f6263876650681ed4d3b96709f08f45d8
Signed-off-by: garciadeblas <gerardo.garciadeblas@telefonica.com>
diff --git a/robot-systest/lib/advanced_cluster_mgmt_lib.resource b/robot-systest/lib/advanced_cluster_mgmt_lib.resource
new file mode 100644
index 0000000..de9bb5d
--- /dev/null
+++ b/robot-systest/lib/advanced_cluster_mgmt_lib.resource
@@ -0,0 +1,240 @@
+*** Comments ***
+# Copyright 2020 Canonical Ltd.
+#
+#   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   Library providing keywords for CRUD operations over clusters,
+...             OKAs and KSUs with OSM client.
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${CLUSTER_LAUNCH_MAX_WAIT_TIME}   12min
+${CLUSTER_LAUNCH_POL_TIME}   30sec
+${CLUSTER_DELETE_MAX_WAIT_TIME}   12min
+${CLUSTER_DELETE_POL_TIME}   30sec
+${OKA_OPERATION_MAX_WAIT_TIME}   5min
+${OKA_OPERATION_POL_TIME}   15sec
+${KSU_CREATION_MAX_WAIT_TIME}   10min
+${KSU_CREATION_POL_TIME}   30sec
+${KSU_DELETION_MAX_WAIT_TIME}   7min
+${KSU_DELETION_POL_TIME}   15sec
+
+
+*** Keywords ***
+Create Cluster
+    [Documentation]   Create a Kubernetes cluster in OSM using the name, version, nodes, etc., passed as arguments.
+    [Arguments]   ${name}   ${vim_account}   ${description}   ${vm_size}   ${version}   ${nodes}   ${region}   ${resource_group}   ${wait_flag}=True
+    ${command}=   Catenate
+    ...   osm cluster-create ${name}
+    ...   --node-count ${nodes}
+    ...   --node-size ${vm_size}
+    ...   --version ${version}
+    ...   --vim-account ${vim_account}
+    ...   --description ${description}
+    ...   --region-name ${region}
+    ...   --resource-group ${resource_group}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${command}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=Cluster creation failed: ${stdout}
+    ${cluster_id}=   Set Variable   ${stdout}
+    Log   ${cluster_id}
+    Check Cluster Age Keys   ${cluster_id}
+    IF   ${wait_flag} == True
+        Wait Until Keyword Succeeds   ${CLUSTER_LAUNCH_MAX_WAIT_TIME}   ${CLUSTER_LAUNCH_POL_TIME}
+        ...   Check For Cluster To Be Ready   ${name}
+    END
+    RETURN   ${cluster_id}
+
+Check Cluster Age Keys
+    [Documentation]   Check AGE keys in the cluster
+    [Arguments]   ${cluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output
+    ...   osm cluster-show ${cluster_name} -o jsonpath='{.age_privkey}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    # TODO: Check if privkey contains the expected value
+    Log   privkey is ${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output
+    ...   osm cluster-show ${cluster_name} -o jsonpath='{.age_pubkey}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    # TODO: Check if pubkey contains the expected value
+    Log   pubkey is ${stdout}
+
+Delete Cluster
+    [Documentation]   Unregister/delete a Kubernetes cluster from OSM.
+    [Arguments]   ${cluster_name}   ${wait_flag}=True
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm cluster-delete ${cluster_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=Cluster deletion failed: ${stdout}
+    IF   ${wait_flag} == True
+        Wait Until Keyword Succeeds   ${CLUSTER_DELETE_MAX_WAIT_TIME}   ${CLUSTER_DELETE_POL_TIME}
+        ...    Check For Cluster Deletion Status   ${cluster_name}
+    END
+
+Check For Cluster Deletion Status
+    [Documentation]   Check if a Kubernetes cluster identified by name is deleted or in error state.
+    [Arguments]   ${cluster_name}
+    ${rc}   ${output}=   Run And Return Rc And Output   osm cluster-show ${cluster_name}
+    Log   ${rc},${output}
+    ${rc}   ${resourceState}=   Run And Return Rc And Output   osm cluster-show ${cluster_name} -o jsonpath='{.resourceState}'
+    Log   ${rc},${resourceState}
+    IF   '$rc' == '$SUCCESS_RETURN_CODE' and '$resourceState' == 'ERROR'
+        Fail   Cluster is in error state and will not be deleted.
+    ELSE
+        Log   Either the cluster ${cluster_name} has been deleted or it is in a valid state.
+        Check For Cluster To Be Deleted   ${cluster_name}
+    END
+
+Get Clusters
+    [Documentation]   Get the list of Kubernetes clusters in OSM, and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm cluster-list
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    RETURN   ${stdout}
+
+Check For Cluster To Be Ready
+    [Documentation]   Check if a Kubernetes cluster is ready (the resourceState must be READY).
+    [Arguments]   ${cluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm cluster-show ${cluster_name}
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm cluster-show ${cluster_name} -o jsonpath='{.resourceState}'
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   READY
+
+Check For Cluster To Be Deleted
+    [Documentation]   Check if a Kubernetes cluster identified by name is not present in OSM.
+    [Arguments]   ${cluster_name}
+    ${matches}=   Get Regexp Matches   ${cluster_name}   ^[0-9a-fA-F-]{36}$
+    Log   ${matches}
+    IF   ${matches} != @{EMPTY}
+        Log   ${cluster_name} is a valid UUID
+        ${rc}   ${stdout}=   Run And Return Rc And Output   osm cluster-list --filter _id="${cluster_name}" | grep ${cluster_name}
+    ELSE
+        Log   ${cluster_name} is not a valid UUID, so it will be treated as a name
+        ${rc}   ${stdout}=   Run And Return Rc And Output   osm cluster-list --filter name="${cluster_name}" | grep ${cluster_name}
+    END
+    Log   ${rc},${stdout}
+    Should Be Empty   ${stdout}
+
+Add OKA Package
+    [Documentation]   Add OKA package to OSM
+    [Arguments]   ${oka_name}   ${oka_folder}   ${oka_profile}   ${wait_flag}=True
+    ${rc}   ${stdout}=   Run And Return Rc And Output
+    ...   osm oka-add ${oka_name} ${oka_folder} --description ${oka_name} --profile-type ${oka_profile}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=OKA addition failed: ${stdout}
+    ${oka_id}=   Set Variable   ${stdout}
+    Log   ${oka_id}
+    IF   ${wait_flag} == True
+        Wait Until Keyword Succeeds   ${OKA_OPERATION_MAX_WAIT_TIME}   ${OKA_OPERATION_POL_TIME}
+        ...    Check For OKA To Be Ready   ${oka_id}
+    END
+    RETURN   ${oka_id}
+
+Delete OKA Package
+    [Documentation]   Delete OKA package from OSM
+    [Arguments]   ${oka_name}   ${wait_flag}=True
+    ${rc}   ${stdout}=   Run And Return Rc And Output
+    ...   osm oka-delete ${oka_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=OKA deletion failed: ${stdout}
+    IF   ${wait_flag} == True
+        Wait Until Keyword Succeeds   ${OKA_OPERATION_MAX_WAIT_TIME}   ${OKA_OPERATION_POL_TIME}
+        ...    Check For OKA To Be Deleted   ${oka_name}
+    END
+
+Check For OKA To Be Ready
+    [Documentation]   Check if an OKA is ready (the resourceState must be READY).
+    [Arguments]   ${oka_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm oka-show ${oka_name}
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm oka-show ${oka_name} -o jsonpath='{.resourceState}'
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   READY
+
+Check For OKA To Be Deleted
+    [Documentation]   Check if an OKA identified by oka_name is not present in OSM.
+    [Arguments]   ${oka_name}
+    ${rc}   ${output}=   Run And Return Rc And Output   osm oka-show ${oka_name}
+    Log   ${rc},${output}
+    ${matches}=   Get Regexp Matches   ${oka_name}   ^[0-9a-fA-F-]{36}$
+    Log   ${matches}
+    IF   ${matches} != @{EMPTY}
+        Log   ${oka_name} is a valid UUID
+        ${rc}   ${stdout}=   Run And Return Rc And Output   osm oka-list --filter _id="${oka_name}" | grep ${oka_name}
+    ELSE
+        Log   ${oka_name} is not a valid UUID, so it will be treated as a name
+        ${rc}   ${stdout}=   Run And Return Rc And Output   osm oka-list --filter name="${oka_name}" | grep ${oka_name}
+    END
+    Log   ${rc},${stdout}
+    Should Be Empty   ${stdout}
+
+Create KSU
+    [Documentation]   Create a KSU
+    [Arguments]   ${ksu_name}   ${ksu_description}   ${profile}   ${profile_type}   ${oka_name}   ${ksu_params_file}   ${wait_flag}=True
+    ${rc}   ${stdout}=   Run And Return Rc And Output
+    ...   osm ksu-create --ksu ${ksu_name} --description ${ksu_description} --profile ${profile} --profile-type ${profile_type} --oka ${oka_name} --params ${ksu_params_file}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=KSU creation failed: ${stdout}
+    ${ksu_id}=   Set Variable   ${stdout}
+    Log   ${ksu_id}
+    IF   ${wait_flag} == True
+        Wait Until Keyword Succeeds   ${KSU_CREATION_MAX_WAIT_TIME}   ${KSU_CREATION_POL_TIME}
+        ...    Check For KSU To Be Ready   ${ksu_id}
+    END
+    RETURN   ${ksu_id}
+
+Delete KSU
+    [Documentation]   Delete KSU from OSM
+    [Arguments]   ${ksu_name}   ${wait_flag}=True
+    ${rc}   ${stdout}=   Run And Return Rc And Output
+    ...   osm ksu-delete ${ksu_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=KSU deletion failed: ${stdout}
+    IF   ${wait_flag} == True
+       Wait Until Keyword Succeeds   ${KSU_DELETION_MAX_WAIT_TIME}   ${KSU_DELETION_POL_TIME}
+       ...    Check For KSU To Be Deleted   ${ksu_name}
+    END
+
+Check For KSU To Be Ready
+    [Documentation]   Check if a KSU is ready (the resourceState must be READY).
+    [Arguments]   ${ksu_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ksu-show ${ksu_name}
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ksu-show ${ksu_name} -o jsonpath='{.resourceState}'
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   READY
+
+Check For KSU To Be Deleted
+    [Documentation]   Check if a KSU identified by ksu_name is not present in OSM.
+    [Arguments]   ${ksu_name}
+    ${rc}   ${output}=   Run And Return Rc And Output   osm ksu-show ${ksu_name}
+    Log   ${rc},${output}
+    ${matches}=   Get Regexp Matches   ${ksu_name}   ^[0-9a-fA-F-]{36}$
+    Log   ${matches}
+    IF   ${matches} != @{EMPTY}
+       Log   ${ksu_name} is a valid UUID
+       ${rc}   ${stdout}=   Run And Return Rc And Output   osm ksu-list --filter _id="${ksu_name}" | grep ${ksu_name}
+    ELSE
+       Log   ${ksu_name} is not a valid UUID, so it will be treated as a name
+       ${rc}   ${stdout}=   Run And Return Rc And Output   osm ksu-list --filter name="${ksu_name}" | grep ${ksu_name}
+    END
+    Log   ${rc},${stdout}
+    Should Be Empty   ${stdout}