*** 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 obtain metrics from Prometheus.

Library   String
Library   Collections
Library   OperatingSystem
Library   RequestsLibrary


*** Variables ***
${TIMEOUT}   30
${MAX_RETRIES}   1
${PROMETHEUS_HOST}   %{PROMETHEUS_HOSTNAME=UNKNOWN}
${PROMETHEUS_PORT}   %{PROMETHEUS_PORT=9090}
${PROMETHEUS_USER}   %{PROMETHEUS_USER=""}
${PROMETHEUS_PASSWORD}   %{PROMETHEUS_PASSWORD=""}


*** Keywords ***
Set Testsuite Prometheus Variables
    [Documentation]   Set Testsuite Prometheus Variables to be used in subsequent test cases

    IF   ${PROMETHEUS_HOST} == 'UNKNOWN'
        ${local_prometheus_host}=   Get Environment Variable   OSM_HOSTNAME
        Set Suite Variable   ${PROMETHEUS_HOST}   ${local_prometheus_host}
        Set Suite Variable   ${PROMETHEUS_HOST}   9091
    END
    Log   ${PROMETHEUS_PORT}
    Log   ${PROMETHEUS_HOST}
    Log   ${PROMETHEUS_USER}
    Log   ${PROMETHEUS_PASSWORD}

Get Metric
    [Documentation]   Get the instant value of a metric from Prometheus using multiple filter parameters.
    ...                 The filter parameters are given to this function in key=value format (one argument per key/value pair).
    ...                 Fails if the metric is not found or has multiple values.
    ...                 Examples of execution:
    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}
    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}   \${param1}=\${value1}   \${param2}=\${value2}
    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric}   @{filter_parameters}
    ${filter}=   Set Variable   ${EMPTY}
    FOR   ${param}   IN   @{filter_parameters}
        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in filter parameters
        Log   ${match},${param_name},${param_value}
        ${filter}=   Catenate   SEPARATOR=   ${filter}   ${param_name}="${param_value}",
    END
    ${resp}=   Execute Prometheus Instant Query   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   query=${metric}{${filter}}
    ${result_list}=   Convert To List   ${resp["data"]["result"]}
    ${results}=   Get Length   ${result_list}
    Should Not Be Equal As Numbers   0   ${results}   msg=Metric ${metric} not found   values=false
    Should Be Equal As Integers   1   ${results}   msg=Metric ${metric} with multiple values   values=false
    RETURN   ${result_list[0]["value"][1]}

Execute Prometheus Instant Query
    [Documentation]   Execute a Prometheus Instant Query using HTTP API.
    ...                 Return an inline json with the result of the query.
    ...                 The requested URL is the next: http://\${prometheus_ip}:\${prometheus_port}/api/v1/query?\${querystring}
    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${querystring}
    ${auth}=   IF   '${prometheus_password}' != '${EMPTY}'   Create List   ${prometheus_user}   ${prometheus_password}   ELSE   Set Variable   None
    Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${TIMEOUT}   max_retries=${MAX_RETRIES}   verify=false   auth=${auth}
    ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${TIMEOUT}
    Status Should Be   200   ${resp}
    RETURN   ${resp.json()}
