#   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   RequestsLibrary


*** Variables ***
${timeout}   30
${max_retries}   1


*** Keywords ***
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}   \${metric}
    ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   \${metric}   \${param1}=\${value1}   \${param2}=\${value2}

    [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${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
        ${filter}=   Catenate   SEPARATOR=   ${filter}   ${param_name}="${param_value}",
    END
    ${resp}=   Execute Prometheus Instant Query   ${prometheus_host}   ${prometheus_port}   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}   ${querystring}

    Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${timeout}   max_retries=${max_retries}
    ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${timeout}
    Status Should Be   200   ${resp}
    [Return]   ${resp.json()}
