*** Settings ***
Documentation     Setup and Teardown Functionality for XOS API Tests
Library           Collections
Library           String
Library           OperatingSystem
Library           XML
Library           RequestsLibrary
Library		      HttpLibrary.HTTP
Library           ../Framework/utils/utils.py
Library           ../Framework/restApi.py
Variables         ../Properties/RestApiProperties.py

*** Keywords ***
Verify API Functionality
    [Arguments]    ${type}    ${endpoint}    ${data}=${EMPTY}    ${data_id}=${EMPTY}    ${key}=${EMPTY}
    Run Keyword If    "${type}" == "RETRIEVE"    CORD Get    ${endpoint}    ${data_id}    ${data}    ${key}
    Run Keyword If    "${type}" == "CREATE"   CORD Post    ${endpoint}    ${data}
    Run Keyword If    "${type}" == "UPDATE"   CORD Put    ${endpoint}    ${data}    ${data_id}
    Run Keyword If    "${type}" == "DELETE"    CORD Delete    ${endpoint}    ${data_id}

CORD Get
    [Documentation]    Make a GET call to the CORD controller
    [Arguments]    ${service}    ${id}    ${value}    ${key}
    ${resp}=    Get Request    ${SERVER_IP}    ${service}/${id}
    Log    ${resp.content}
    Should Be Equal As Strings    ${resp.status_code}    200
    ${updated_value}=    Run Keyword If    '${key}' != 'null'    Get Json Value    ${resp.content}    /${key}
    ${updated_value}=    Run Keyword If    '${key}' != 'null'    Remove String    ${updated_value}    "
    Run Keyword If    '${key}' != 'null'    Should Contain    "${value}"    ${updated_value}
    [Return]    ${resp}

CORD Post
    [Documentation]    Make a POST call to the CORD controller
    [Arguments]    ${service}    ${data}
    ${data}=    Evaluate    json.dumps(${data})    json
    ${resp}=    Post Request    ${SERVER_IP}    uri=${service}    data=${data}
    Log    ${resp.content}
    Should Be Equal As Strings    ${resp.status_code}    200
    ${id}=    Get Json Value    ${resp.content}    /id
    Set Suite Variable    ${id}
    [Return]    ${resp}

CORD Put
    [Documentation]    Make a PUT call to the CORD controller
    [Arguments]    ${service}    ${data}    ${data_id}
    ${data}=    Evaluate    json.dumps(${data})    json
    ${resp}=    Put Request    ${SERVER_IP}    uri=${service}/${data_id}    data=${data}
    Log    ${resp.content}
    Should Be Equal As Strings    ${resp.status_code}    200
    ${id}=    Get Json Value    ${resp.content}    /id
    Set Suite Variable    ${id}
    [Return]    ${resp}

CORD Delete
    [Documentation]    Make a DELETE call to the CORD controller
    [Arguments]    ${service}    ${data_id}
    ${resp}=    Delete Request    ${SERVER_IP}    uri=${service}/${data_id}
    Log    ${resp.content}
    Should Be Equal As Strings    ${resp.status_code}    200
    [Return]    ${resp}

Generate JSON Data
    {%- for m in proto.messages -%}
    {%- if m.name not in  ['XOSBase'] -%}
    {% autoescape false %}
    {% endautoescape %}
    ${json_{{ m.name | lower }}_1}=    Set Variable    { }
    ${json_{{ m.name | lower }}_amend_1}=    Set Variable    { }
    ${json_{{ m.name | lower}}_amend_key}=    Set Variable    null
    Set Suite Variable    ${json_{{ m.name | lower}}_amend_key}
    # set required fields for {{ m.name | lower }} object
    {% for f in m.fields + xproto_base_fields(m, proto.message_table) -%}
    {% if f.modifier == "required" and f.options.blank != "True" -%}
    {% if not f.options.default -%}
    {% if f.link -%}
    ${tmp_{{ f.options.model | lower }}_id}=    Create {{ f.options.model }}
    ${json_{{ m.name | lower }}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}_id    ${tmp_{{ f.options.model | lower }}_id}
    {% elif f.name == "created" or f.name == "amend" or f.name =="expires" or f.name =='granted' -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    float
    ${json_{{ m.name | lower }}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower }}_{{ f.name }}_1}"
    {% elif f.name == "role" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    role
    ${json_{{ m.name | lower }}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower }}_{{ f.name }}_1}"
    {% elif f.name == "direction" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    direction
    ${json_{{ m.name | lower }}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower }}_{{ f.name }}_1}"
    {% elif f.name == "flavor" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    flavor
    ${json_{{ m.name | lower }}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower }}_{{ f.name }}_1}"
    {% elif f.name == "s_tag" and m.name == "BNGPortMapping" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    vlan_tag
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_1}"    
    {% else -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    {{ f.type }}
    ${json_{{ m.name | lower }}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower }}_{{ f.name }}_1}"
    {% if f.name == "created" or f.name == "amend" or f.name =="expires" or f.name =='granted' -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_1}=    Generate Random Value    float
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_1}"
    {% else -%}
    {% if loop.index0 == 0 -%}
    ${json_{{ m.name | lower}}_amend_key}=    Set Variable    {{ f.name }}
    ${json_{{ m.name | lower}}_{{ f.name }}_amend_1}=    Generate Random Value    {{ f.type }}
    ${json_{{ m.name | lower }}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /{{ f.name }}    "${json_{{ m.name | lower }}_{{ f.name }}_amend_1}"
    {% endif -%}
    {% endif -%}
    {% endif -%}
    {% endif -%}
    {% endif -%}
    {% endfor -%}
    {% if  m.name  == "User" -%}
    ${json_{{ m.name | lower}}_email}=    Set Variable    testuser@opencord.org
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /email    "${json_{{ m.name | lower }}_email}"
    ${json_{{ m.name | lower}}_email_amend_1}=    Set Variable    testuseramend@opencord.org
    ${json_{{ m.name | lower}}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /email    "${json_{{ m.name | lower }}_email_amend_1}"
    {% endif %}
    {% if  m.name  == "Site" -%}
    ${json_{{ m.name | lower}}_login_base_tmp}=    Set Variable    testloginbase
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /login_base    "${json_{{ m.name | lower }}_login_base_tmp}"
    {% endif %}
    {% if  m.name  == "Flavor" -%}
    ${json_{{ m.name | lower}}_flavor_tmp}=    Set Variable    m1.small
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /flavor    "${json_{{ m.name | lower }}_flavor_tmp}"
    {% endif %}
    {% if  m.name  == "ServiceGraphConstraint" -%}
    ${json_{{ m.name | lower}}_constraints_tmp}=    Generate Random Value    string
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /constraints    "${json_{{ m.name | lower }}_constraints_tmp}"
    {% endif %}
    {% if  m.name  == "Slice" -%}
    ${json_{{ m.name | lower}}_name}=    Generate Random Slice Name
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /name    "${json_{{ m.name | lower }}_name}"
    ${json_{{ m.name | lower}}_name_amend_1}=    Generate Random Slice Name
    ${json_{{ m.name | lower}}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /name    "${json_{{ m.name | lower}}_name_amend_1}"
    {% endif -%}
    {% if  m.name  == "ProgranServiceInstance" -%}
    ${json_{{ m.name | lower}}_name}=    Generate Random Value    string
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /name    "${json_{{ m.name | lower }}_name}"
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /CellIndividualOffset    "1"
    ${json_{{ m.name | lower}}_name_amend_1}=    Generate Random Value    string
    ${json_{{ m.name | lower}}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /name    "${json_{{ m.name | lower}}_name_amend_1}"
    ${json_{{ m.name | lower}}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /CellIndividualOffset    "1"
    {% endif %}
    {% if  m.name  == "RCORDSubscriber" -%}
    ## Create req service owner for rcord subscriber and
    CORD Post    /xosapi/v1/rcord/rcordservices    {"name": "testrcordservice", "access": "unknown"}
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /owner_id    ${id}
    ${rcord_tmp_service_id}=    Set Variable    ${id}
    Set Suite Variable    ${rcord_tmp_service_id}
    {% endif %}
    {% if  m.name  == "HippieOSSServiceInstance" -%}
    ## Create req service owner for hippie oss service instance
    CORD Post    /xosapi/v1/hippie-oss/hippieossservices    {"name": "testhippieservice"}
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /owner_id    ${id}
    {% endif %}
    {% if  m.name  == "MCordSubscriberInstance" -%}
    ## Create req service owner for hippie oss service instance
    CORD Post    /xosapi/v1/mcord/mcordsubscriberservices    {"name": "testmcordservice"}
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /owner_id    ${id}
    {% endif %}
    {% if  m.name  == "AddressManagerServiceInstance" -%}
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /public_ip    "2.2.2.2"
    ${json_{{ m.name | lower}}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /public_ip    "3.3.3.3"
    {% endif %}
    {% if  m.name  == "RCORDIpAddress" -%}
    ${json_{{ m.name | lower}}_1}=    Set Json Value    ${json_{{ m.name | lower }}_1}    /ip    "2.2.2.2"
    ${json_{{ m.name | lower}}_amend_1}=    Set Json Value    ${json_{{ m.name | lower }}_amend_1}    /ip    "3.3.3.3"
    {% endif %}
    ${json_{{ m.name | lower }}_1}=     To JSON    ${json_{{ m.name | lower }}_1}
    ${json_{{ m.name | lower }}_amend_1}=     To JSON    ${json_{{ m.name | lower }}_amend_1}
    Set Suite Variable    ${json_{{ m.name | lower }}_1}
    Set Suite Variable    ${json_{{ m.name | lower }}_amend_1}
    {% endif -%}
    {% endfor %}

{% for m in proto.messages %}
{%- if m.name not in  ['XOSBase'] -%}
Create {{ m.name }}
    ##Creating {{ m.name | lower }} object
    ${json_{{ m.name | lower }}_tmp}=    Set Variable    { }
    # set required fields for {{ m.name | lower }} object
    {% for f in m.fields + xproto_base_fields(m, proto.message_table) -%}
    {% if f.link -%}
    {% if f.modifier == "required" and f.options.blank != "True"-%}
    # create dependent {{ f.options.model }}
    ${dependent_{{ f.options.model | lower }}_id}=    Create {{ f.options.model }}
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}_id    ${dependent_{{ f.options.model | lower }}_id}
    {% endif -%}
    {% else -%}
    {% if f.modifier == "required" and f.options.blank != "True"-%}
    {% if not f.options.default -%}
    {% if m.name == "User" and f.name == "email" -%}
    ${json_user_email_tmp}=   Generate Random Value    {{ f.type }}
    ${json_user_email_tmp}=    Catenate    SEPARATOR=    ${json_user_email_tmp}    @opencord.org
    ${json_user_tmp}=   Set Json Value    ${json_user_tmp}   /email    "${json_user_email_tmp}"
    {% else -%}
    {% if f.name == "created" or f.name == "amend" or f.name =="expires" or f.name =='granted' -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_tmp}=    Generate Random Value    float
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
    {% elif f.name == "role" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_tmp}=    Generate Random Value    role
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
    {% elif f.name == "direction" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_tmp}=    Generate Random Value    direction
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
    {% elif f.name == "flavor" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_tmp}=    Generate Random Value    flavor
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
    {% elif f.name == "s_tag" and m.name == "BNGPortMapping" -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_tmp}=    Generate Random Value    vlan_tag
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
    {% else -%}
    ${json_{{ m.name | lower}}_{{ f.name }}_tmp}=    Generate Random Value    {{ f.type }}
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /{{ f.name }}    "${json_{{ m.name | lower}}_{{ f.name }}_tmp}"
    {% endif -%}
    {% endif -%}
    {% endif -%}
    {% endif -%}
    {% endif -%}
    {% endfor -%}
    {% if  m.name  == "Site" -%}
    ${json_{{ m.name | lower}}_login_base_tmp}=    Set Variable    testloginbase
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /login_base    "${json_{{ m.name | lower }}_login_base_tmp}"
    {% endif %}
    {% if  m.name  == "Flavor" -%}
    ${json_{{ m.name | lower}}_flavor_tmp}=    Set Variable    m1.small
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /flavor    "${json_{{ m.name | lower }}_flavor_tmp}"
    {% endif %}
    {% if  m.name  == "ServiceGraphConstraint" -%}
    ${json_{{ m.name | lower}}_contraints_tmp}=    Generate Random Value    string
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /contraints    "${json_{{ m.name | lower }}_contraints_tmp}"
    {% endif %}
    {% if  m.name  == "Slice" -%}
    ${json_{{ m.name | lower}}_name}=    Generate Random Slice Name
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /name    "${json_{{ m.name | lower }}_name}"
    {% endif -%}
    {% if  m.name  == "Network" -%}
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /permit_all_slices    true
    {% endif %}
    {% if  m.name  == "RCORDSubscriber" -%}
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /owner_id    ${rcord_tmp_service_id}
    {% endif %}
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /no_policy    true
    ${json_{{ m.name | lower}}_tmp}=    Set Json Value    ${json_{{ m.name | lower }}_tmp}    /no_sync    true    
    ${json_{{ m.name | lower }}_tmp}=     To JSON    ${json_{{ m.name | lower }}_tmp}
    ${resp}=    CORD Post    /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/{{ xproto_pluralize(m) | lower}}    ${json_{{ m.name | lower }}_tmp}
    ${id_{{ m.name | lower }}_tmp}=    Get Json Value    ${resp.content}    /id
    Append To List    ${dependent_{{ m.name | lower }}_ids}    ${id_{{ m.name | lower }}_tmp}
    [Return]    ${id_{{ m.name | lower }}_tmp}
{% endif %}
{% endfor -%}

Setup Tests
    [Documentation]    Find all dependent objects per model and create them and store them for later use
    {% for m in proto.messages %}
    {%- if m.name not in  ['XOSBase'] -%}
    ${model}=    Set Variable    {{ m.name | lower }}s
    @{dependent_{{ m.name | lower }}_ids}=    Create List    ${model}
    Set Suite Variable    @{dependent_{{ m.name | lower }}_ids}
    {% endif -%}
    {% endfor -%}
    @{dependent_models}=    Create List
    Set Suite Variable    ${dependent_models}
    ${auth} =    Create List    ${XOS_USER}    ${XOS_PASSWD}
    ${HEADERS}    Create Dictionary    Content-Type=application/json
    Create Session    ${SERVER_IP}    http://${SERVER_IP}:${SERVER_PORT}    auth=${AUTH}    headers=${HEADERS}
    Generate JSON Data

Teardown Tests
    [Documentation]    Delete all dependent objects created in Setup
    {% for m in proto.messages %}
    {%- if m.name not in  ['XOSBase'] -%}
    ${len}=    Get Length    ${dependent_{{ m.name | lower }}_ids}
    : FOR    ${INDEX}    IN RANGE    1    ${len}
    \    Run Keyword And Ignore Error    CORD Delete    /xosapi/v1/{{ xproto_unquote(m.options.app_label) }}/${dependent_{{ m.name | lower }}_ids[0]}    ${dependent_{{ m.name | lower }}_ids[${INDEX}]}
    {% endif -%}
    {% endfor -%}
    Delete All Sessions
