*** Comments ***
#   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 to deploy and delete OSM repos.

Library   OperatingSystem

Resource   ../lib/nsd_lib.resource


*** Variables ***
${SUCCESS_RETURN_CODE}   0
${REPO_DELETE_MAX_WAIT_TIME}   1min
${REPO_DELETE_POL_TIME}   15sec


*** Keywords ***
Get Repos List
    [Documentation]   Get the list of repos and log it.
    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-list
    Log   ${stdout}
    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}

Create Repo
    [Documentation]   Create a repository in OSM with the name and options passed as arguments, and return the repo id.
    [Arguments]   ${repo_name}   ${repo_uri}   ${repo_type}   ${user}   ${password}   ${additional_options}=""
    ${user_attr}=   Set Variable If   '${user}'!='${EMPTY}'   --user ${user}   \
    ${password_attr}=   Set Variable If   '${password}'!='${EMPTY}'   --password ${password}   \
    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-add --type ${repo_type} ${user_attr} ${password_attr} ${additional_options} ${repo_name} ${repo_uri}
    Log   ${rc},${stdout}
    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
    RETURN   ${stdout}

Delete Repo
    [Documentation]   Delete from OSM the repo passed as argument.
    [Arguments]   ${repo_id}
    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return RC And Output   osm repo-delete ${repo_id}
    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
    Log   ${stdout}
    WAIT UNTIL KEYWORD SUCCEEDS   ${REPO_DELETE_MAX_WAIT_TIME}   ${REPO_DELETE_POL_TIME}   Check For NSD   ${repo_id}

Check For Repo
    [Documentation]   Check that a repository exists in OSM.
    [Arguments]   ${repo_id}
    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-list | awk '{print $2}' | grep ${repo_id}
    Log   ${rc},${stdout}
    Should Not Be Equal As Strings   ${stdout}   ${repo_id}
