add vnf and service to vnf orch
[testsuite.git] / robot / resources / sdngc_interface.robot
1 *** Settings ***
2 Documentation     The main interface for interacting with SDN-GC. It handles low level stuff like managing the http request library and SDN-GC required fields
3 Library               RequestsLibrary
4 Library           ONAPLibrary.Utilities
5 Library             SeleniumLibrary
6 Library        OperatingSystem
7 Library         Collections
8 Library      String
9 Library           ONAPLibrary.ServiceMapping    WITH NAME     ServiceMapping
10 Library           ONAPLibrary.PreloadData    WITH NAME     Preload
11 Library           ONAPLibrary.Templating    WITH NAME     Templating
12 Library           ONAPLibrary.SDNC        WITH NAME     SDNC
13 Resource          global_properties.robot
14 Resource        browser_setup.robot
15
16
17 *** Variables ***
18 ${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH}  /operations/VNF-API:preload-vnf-topology-operation
19 ${PRELOAD_NETWORK_TOPOLOGY_OPERATION_PATH}  /operations/VNF-API:preload-network-topology-operation
20 ${PRELOAD_GR_TOPOLOGY_OPERATION_PATH}     /operations/GENERIC-RESOURCE-API:preload-vf-module-topology-operation
21 ${PRELOAD_VNF_CONFIG_PATH}  /config/VNF-API:preload-vnfs/vnf-preload-list
22 ${PRELOAD_TOPOLOGY_OPERATION_BODY}  sdnc
23 ${SDNGC_INDEX_PATH}    /restconf
24 ${SDNCGC_HEALTHCHECK_OPERATION_PATH}  /operations/SLI-API:healthcheck
25 ${SDNGC_REST_ENDPOINT}    ${GLOBAL_SDNGC_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SDNC_IP_ADDR}:${GLOBAL_SDNGC_REST_PORT}
26 ${SDNGC_ADMIN_ENDPOINT}    ${GLOBAL_SDNGC_SERVER_PROTOCOL}://${GLOBAL_INJECTED_SDNC_PORTAL_IP_ADDR}:${GLOBAL_SDNGC_ADMIN_PORT}
27 ${SDNGC_ADMIN_SIGNUP_URL}    ${SDNGC_ADMIN_ENDPOINT}/signup
28 ${SDNGC_ADMIN_LOGIN_URL}    ${SDNGC_ADMIN_ENDPOINT}/login
29 ${SDNGC_ADMIN_VNF_PROFILE_URL}    ${SDNGC_ADMIN_ENDPOINT}/mobility/getVnfProfile
30
31 *** Keywords ***
32 Run SDNGC Health Check
33     [Documentation]    Runs an SDNGC healthcheck
34     ${auth}=  Create List  ${GLOBAL_SDNGC_USERNAME}    ${GLOBAL_SDNGC_PASSWORD}
35     ${resp}=    SDNC.Run Post Request   ${SDNGC_REST_ENDPOINT}  ${SDNGC_INDEX PATH}${SDNCGC_HEALTHCHECK_OPERATION_PATH}     data=${None}    auth=${auth}
36     Should Be Equal As Strings  ${resp.status_code}     200
37     Should Be Equal As Strings  ${resp.json()['output']['response-code']}       200
38
39 Preload Vcpe Networks
40     Preload Network    cpe_public    10.2.0.2    10.2.0.1
41     Preload Network    cpe_signal    10.4.0.2    10.4.0.1
42     Preload Network    brg_bng    10.3.0.2    10.3.0.1
43     Preload Network    bng_mux    10.1.0.10    10.1.0.1
44     Preload Network    mux_gw    10.5.0.10    10.5.0.1
45
46 Preload Network
47     [Arguments]    ${network_role}     ${subnet_start_ip}    ${subnet_gateway}
48     ${name_suffix}=    Generate Timestamp
49     ${network_name}=     Catenate    SEPARATOR=_    net     ${network_role}         ${name_suffix}
50     ${subnet_name}=     Catenate    SEPARATOR=_    net      ${network_role}         subnet    ${name_suffix}
51     ${parameters}=     Create Dictionary    network_role=${network_role}    service_type=vCPE    network_type=Generic NeutronNet    network_name=${network_name}    subnet_start_ip=${subnet_start_ip}    subnet_gateway=${subnet_gateway}
52     Templating.Create Environment    sdnc    ${GLOBAL_TEMPLATE_FOLDER}
53     ${data}=   Templating.Apply Template    sdnc   ${PRELOAD_TOPOLOGY_OPERATION_BODY}/template.network.jinja   ${parameters}
54     ${auth}=  Create List  ${GLOBAL_SDNGC_USERNAME}    ${GLOBAL_SDNGC_PASSWORD}
55     ${post_resp}=       SDNC.Run Post Request   ${SDNGC_REST_ENDPOINT}  ${SDNGC_INDEX_PATH}${PRELOAD_NETWORK_TOPOLOGY_OPERATION_PATH}     data=${data}    auth=${auth}
56     [Return]    ${network_name}   ${subnet_name}
57
58 Preload Vcpe vGW
59     [Arguments]    ${brg_mac}    ${cpe_network_name}   ${cpe_subnet_name}    ${mux_gw_net}    ${mux_gw_subnet}
60     ${name_suffix}=    Generate Timestamp
61     ${parameters}=     Create Dictionary    pub_key=${GLOBAL_INJECTED_PUBLIC_KEY}    brg_mac=${brg_mac}    cpe_public_net=${cpe_network_name}     cpe_public_subnet=${cpe_subnet_name}    mux_gw_net=${mux_gw_net}      mux_gw_subnet=${mux_gw_subnet}    suffix=${name_suffix}    oam_onap_net=oam_network_2No2        oam_onap_subnet=oam_network_2No2        public_net_id=${GLOBAL_INJECTED_PUBLIC_NET_ID}
62     Templating.Create Environment    sdnc    ${GLOBAL_TEMPLATE_FOLDER}
63     ${data}=   Templating.Apply Template    sdnc   ${PRELOAD_TOPOLOGY_OPERATION_BODY}/template.vcpe_vgw_vfmodule.jinja   ${parameters}
64     ${auth}=  Create List  ${GLOBAL_SDNGC_USERNAME}    ${GLOBAL_SDNGC_PASSWORD}
65     ${post_resp}=       SDNC.Run Post Request   ${SDNGC_REST_ENDPOINT}  ${SDNGC_INDEX_PATH}${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH}     data=${data}    auth=${auth}
66
67 Preload Vcpe vGW Gra
68     [Arguments]    ${brg_mac}   ${cpe_public_network_name}   ${cpe_public_subnet_name}    ${mux_gw_net}    ${mux_gw_subnet}
69     ${name_suffix}=    Generate Timestamp
70     ${parameters}=     Create Dictionary    pub_key=${GLOBAL_INJECTED_PUBLIC_KEY}    brg_mac=${brg_mac}    cpe_public_net=${cpe_public_network_name}     cpe_public_subnet=${cpe_public_subnet_name}    mux_gw_net=${mux_gw_net}        mux_gw_subnet=${mux_gw_subnet}    suffix=${name_suffix}    oam_onap_net=oam_network_2No2        oam_onap_subnet=oam_network_2No2        public_net_id=${GLOBAL_INJECTED_PUBLIC_NET_ID}
71     Templating.Create Environment    sdnc    ${GLOBAL_TEMPLATE_FOLDER}
72     ${data}=   Templating.Apply Template    sdnc   ${PRELOAD_TOPOLOGY_OPERATION_BODY}/template.vcpe_gwgra_vfmodule.jinja   ${parameters}
73     ${auth}=  Create List  ${GLOBAL_SDNGC_USERNAME}    ${GLOBAL_SDNGC_PASSWORD}
74     ${post_resp}=       SDNC.Run Post Request   ${SDNGC_REST_ENDPOINT}  ${SDNGC_INDEX_PATH}${PRELOAD_GR_TOPOLOGY_OPERATION_PATH}     data=${data}    auth=${auth}
75
76 Preload Generic VfModule
77     [Arguments]    ${service_instance_id}       ${vnf_model}   ${model_customization_name}    ${short_model_customization_name}     ${cpe_public_network_name}=None   ${cpe_public_subnet_name}=None   ${cpe_signal_network_name}=None   ${cpe_signal_subnet_name}=None
78     ${name_suffix}=    Generate Timestamp
79     ${vfmodule_name}=     Catenate    SEPARATOR=_    vf     ${short_model_customization_name}       ${name_suffix}
80     #TODO this became a mess, need to fix
81     ${parameters}=     Create Dictionary    pub_key=${GLOBAL_INJECTED_PUBLIC_KEY}    suffix=${name_suffix}    mr_ip_addr=${GLOBAL_INJECTED_MR_IP_ADDR}    mr_ip_port=${GLOBAL_MR_SERVER_PORT}
82     Set To Dictionary    ${parameters}    oam_onap_net=oam_network_2No2        oam_onap_subnet=oam_network_2No2    cpe_public_net=${cpe_public_network_name}     cpe_public_subnet=${cpe_public_subnet_name}    
83     Set To Dictionary    ${parameters}    cpe_signal_subnet=${cpe_signal_subnet_name}    cpe_signal_net=${cpe_signal_network_name}    public_net_id=${GLOBAL_INJECTED_PUBLIC_NET_ID}
84     # vnf_type and generic_vnf_type are identical
85     Set To Dictionary    ${parameters}    vnf_type=${model_customization_name}    generic_vnf_type=${model_customization_name}    generic_vnf_name=${model_customization_name}    vnf_name=${vfmodule_name}    
86     Set To Dictionary    ${parameters}    service_type=${service_instance_id}    sdnc_oam_ip=${GLOBAL_INJECTED_SDNC_IP_ADDR}
87         ${post_resp}=    SDNC.Preload Vfmodule    ${SDNGC_REST_ENDPOINT}    ${SDNGC_INDEX_PATH}${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH}    ${GLOBAL_TEMPLATE_FOLDER}    ${PRELOAD_TOPOLOGY_OPERATION_BODY}/template.vcpe_infra_vfmodule.jinja    ${parameters}
88     [Return]    ${post_resp}
89             
90 Preload Vnf
91     [Arguments]    ${service_type_uuid}    ${generic_vnf_name}    ${generic_vnf_type}     ${vf_module_name}    ${vf_modules}    ${vnf}   ${uuid}    ${service}
92     ${base_vf_module_type}=    Catenate
93     ${closedloop_vf_module}=    Create Dictionary
94     ServiceMapping.Set Directory    default    ${GLOBAL_SERVICE_MAPPING_DIRECTORY}
95     ${templates}=    ServiceMapping.Get Service Template Mapping    default    ${service}    ${generic_vnf_type}
96     :FOR    ${vf_module}    IN      @{vf_modules}
97     \       ${vf_module_type}=    Get From Dictionary    ${vf_module}    name
98     #     need to pass in vnf_index if non-zero
99     \       ${dict}   Run Keyword If    "${generic_vnf_name}".endswith('0')      Get From Mapping With Index    ${templates}    ${vf_module}   0
100             ...    ELSE IF  "${generic_vnf_name}".endswith('1')      Get From Mapping With Index    ${templates}    ${vf_module}   1
101             ...    ELSE IF  "${generic_vnf_name}".endswith('2')      Get From Mapping With Index    ${templates}    ${vf_module}   2
102             ...    ELSE   Get From Mapping    ${templates}    ${vf_module}
103     #     skip this iteration if no template 
104     \       ${test_dict_length} =  Get Length  ${dict}
105     \       Continue For Loop If   ${test_dict_length} == 0
106     \       ${filename}=    Get From Dictionary    ${dict}    template
107     \       ${base_vf_module_type}=   Set Variable If    '${dict['isBase']}' == 'true'     ${vf_module_type}    ${base_vf_module_type}
108     \       ${closedloop_vf_module}=   Set Variable If    '${dict['isBase']}' == 'false'     ${vf_module}    ${closedloop_vf_module}
109     \       ${vf_name}=     Update Module Name    ${dict}    ${vf_module_name}
110     #    Admin portal update no longer 
111     #\       Preload Vnf Profile    ${vf_module_type}
112     \       Preload One Vnf Topology    ${service_type_uuid}    ${generic_vnf_name}    ${generic_vnf_type}     ${vf_name}    ${vf_module_type}    ${service}    ${filename}   ${uuid}
113     [Return]    ${base_vf_module_type}   ${closedloop_vf_module}
114
115 Update Module Name
116     [Arguments]    ${dict}    ${vf_module_name}
117     Return From Keyword If    'prefix' not in ${dict}    ${vf_module_name}
118     Return From Keyword If    '${dict['prefix']}' == ''    ${vf_module_name}
119     ${name}=    Replace String   ${vf_module_name}   Vfmodule_    ${dict['prefix']}
120     [Return]    ${name}
121
122 Get From Mapping With Index
123     [Documentation]    Retrieve the appropriate prelad template entry for the passed vf_module
124     [Arguments]    ${templates}    ${vf_module}   ${vnf_index}=0
125     ${vf_module_name}=    Get From DIctionary    ${vf_module}    name
126     :FOR    ${template}   IN   @{templates}
127     \    Return From Keyword If    '${template['name_pattern']}' in '${vf_module_name}' and ('${template['vnf_index']}' == '${vnf_index}')     ${template}
128     ${result}=    Create Dictionary
129     [Return]    ${result}
130
131 Get From Mapping
132     [Documentation]    Retrieve the appropriate prelad template entry for the passed vf_module
133     [Arguments]    ${templates}    ${vf_module}
134     ${vf_module_name}=    Get From DIctionary    ${vf_module}    name
135     :FOR    ${template}   IN   @{templates}
136     \    Return From Keyword If    '${template['name_pattern']}' in '${vf_module_name}'     ${template}
137     ${result}=    Create Dictionary
138     [Return]    ${result}
139
140 Preload One Vnf Topology
141     [Arguments]    ${service_type_uuid}    ${generic_vnf_name}    ${generic_vnf_type}       ${vf_module_name}    ${vf_module_type}    ${service}    ${filename}   ${uuid}
142     Return From Keyword If    '${filename}' == ''
143     ${parameters}=    Get Template Parameters    ${generic_vnf_name}    ${filename}   ${uuid}    ${service}
144     Set To Dictionary   ${parameters}   generic_vnf_name=${generic_vnf_name}     generic_vnf_type=${generic_vnf_type}  service_type=${service_type_uuid}    vf_module_name=${vf_module_name}    vf_module_type=${vf_module_type}
145     Templating.Create Environment    sdnc    ${GLOBAL_TEMPLATE_FOLDER}
146     ${data}=   Templating.Apply Template    sdnc   ${PRELOAD_TOPOLOGY_OPERATION_BODY}/preload.jinja    ${parameters}
147     ${auth}=  Create List  ${GLOBAL_SDNGC_USERNAME}    ${GLOBAL_SDNGC_PASSWORD}
148     ${post_resp}=       SDNC.Run Post Request   ${SDNGC_REST_ENDPOINT}  ${SDNGC_INDEX_PATH}${PRELOAD_VNF_TOPOLOGY_OPERATION_PATH}     data=${data}    auth=${auth}
149     Should Be Equal As Strings  ${post_resp.json()['output']['response-code']}  200
150     ${auth}=  Create List  ${GLOBAL_SDNGC_USERNAME}    ${GLOBAL_SDNGC_PASSWORD}
151     ${get_resp}=        SDNC.Run Get Request    ${SDNGC_REST_ENDPOINT}    ${SDNGC_INDEX_PATH}${PRELOAD_VNF_CONFIG_PATH}/${vf_module_name}/${vf_module_type}     auth=${auth}
152
153 Get Template Parameters
154     [Arguments]   ${generic_vnf_name}    ${template}    ${uuid}    ${service}
155     ${uuid}=    Catenate    ${uuid}
156     ${hostid}=    Get Substring    ${uuid}    -4
157     ${ecompnet}=    Evaluate    (${GLOBAL_BUILD_NUMBER}%128)+128
158
159
160     # Initialize the value map with the properties generated from the Robot VM /opt/config folder
161     ${valuemap}=   Copy Dictionary    ${GLOBAL_INJECTED_PROPERTIES}
162
163     # These should be deprecated by the above....
164     Set To Dictionary   ${valuemap}   artifacts_version=${GLOBAL_INJECTED_ARTIFACTS_VERSION}
165     Set To Dictionary   ${valuemap}   network=${GLOBAL_INJECTED_NETWORK}
166     Set To Dictionary   ${valuemap}   public_net_id=${GLOBAL_INJECTED_PUBLIC_NET_ID}
167     Set To Dictionary   ${valuemap}   cloud_env=${GLOBAL_INJECTED_CLOUD_ENV}
168     Set To Dictionary   ${valuemap}   install_script_version=${GLOBAL_INJECTED_SCRIPT_VERSION}
169     Set To Dictionary   ${valuemap}   vm_image_name=${GLOBAL_INJECTED_VM_IMAGE_NAME}
170     Set To Dictionary   ${valuemap}   vm_flavor_name=${GLOBAL_INJECTED_VM_FLAVOR}
171
172
173     # update the value map with unique values.
174     Set To Dictionary   ${valuemap}   uuid=${uuid}   hostid=${hostid}    ecompnet=${ecompnet}    generic_vnf_name=${generic_vnf_name}
175
176     #
177     # Mash together the defaults dict with the test case dict to create the set of
178     # preload parameters
179     #
180     Preload.Set Directory    preload    ./demo/preload_data
181     ${defaults}=       Get Default Preload Data    preload
182     ${template}=    Get Preload Data    preload    ${service}    ${template}
183     # add all of the defaults to template...
184     @{keys}=    Get Dictionary Keys    ${defaults}
185     :FOR   ${key}   IN   @{keys}
186     \    ${value}=   Get From Dictionary    ${defaults}    ${key}
187     \    Set To Dictionary    ${template}  ${key}    ${value}
188
189     #
190     # Get the vnf_parameters to preload
191     #
192     ${vnf_parameters}=   Resolve VNF Parameters Into Array   ${valuemap}   ${template}
193     ${vnf_parameters_json}=   Evaluate    json.dumps(${vnf_parameters})    json
194     ${parameters}=   Create Dictionary   vnf_parameters=${vnf_parameters_json}
195     [Return]    ${parameters}
196
197 Resolve VNF Parameters Into Array
198     [Arguments]   ${valuemap}    ${from}
199     ${vnf_parameters}=   Create List
200     ${keys}=    Get Dictionary Keys    ${from}
201     :FOR   ${key}   IN  @{keys}
202     \    ${value}=    Get From Dictionary    ${from}   ${key}
203     \    ${value}=    Templating.Template String    ${value}    ${valuemap}
204     \    ${parameter}=   Create Dictionary   vnf-parameter-name=${key}    vnf-parameter-value=${value}
205     \    Append To List    ${vnf_parameters}   ${parameter}
206     [Return]   ${vnf_parameters}
207
208 Preload Vnf Profile
209     [Arguments]    ${vnf_name}
210     Login To SDNGC Admin GUI
211     Go To    ${SDNGC_ADMIN_VNF_PROFILE_URL}
212     Click Button    xpath=//button[@data-target='#add_vnf_profile']
213     Input Text    xpath=//input[@id='nf_vnf_type']    ${vnf_name}
214     Input Text    xpath=//input[@id='nf_availability_zone_count']    999
215     Input Text    xpath=//input[@id='nf_equipment_role']    robot-ete-test
216     Click Button    xpath=//button[contains(.,'Submit')]
217     Page Should Contain  VNF Profile
218     Input Text    xpath=//div[@id='vnf_profile_filter']//input    ${vnf_name}
219     Page Should Contain  ${vnf_name}
220
221 Delete Vnf Profile
222     [Arguments]    ${vnf_name}
223     Login To SDNGC Admin GUI
224     Go To    ${SDNGC_ADMIN_VNF_PROFILE_URL}
225     Page Should Contain  VNF Profile
226     Input Text    xpath=//div[@id='vnf_profile_filter']//input    ${vnf_name}
227     Page Should Contain  ${vnf_name}
228     Click Button    xpath=//button[contains(@onclick, '${vnf_name}')]
229     Page Should Contain    Are you sure you want to delete VNF_PROFILE
230     Click Button    xpath=//button[contains(text(), 'Yes')]
231     Page Should Not Contain  ${vnf_name}
232
233 Login To SDNGC Admin GUI
234     [Documentation]   Login To SDNGC Admin GUI
235     ## Setup Browser is now being managed by the test case
236     ## Setup Browser
237     Go To    ${SDNGC_ADMIN_SIGNUP_URL}
238     ##Maximize Browser Window
239     Set Selenium Speed    ${GLOBAL_SELENIUM_DELAY}
240     Set Browser Implicit Wait    ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
241     Log    Logging in to ${SDNGC_ADMIN_LOGIN_URL}
242     Handle Proxy Warning
243     Title Should Be    AdminPortal
244     ${uuid}=    Generate UUID4
245     ${shortened_uuid}=     Evaluate    str("${uuid}")[:12]
246     ${email}=        Catenate    ${shortened_uuid}@robotete.com
247     Input Text    xpath=//input[@id='nf_email']    ${email}
248     Input Password    xpath=//input[@id='nf_password']    ${shortened_uuid}
249     Click Button    xpath=//button[@type='submit']
250     Wait Until Page Contains    User created   20s
251     Go To    ${SDNGC_ADMIN_LOGIN_URL}
252     Input Text    xpath=//input[@id='email']    ${email}
253     Input Password    xpath=//input[@id='password']    ${shortened_uuid}
254     Click Button    xpath=//button[@type='submit']
255     Title Should Be    SDN-C AdminPortal
256     Log    Logged in to ${SDNGC_ADMIN_LOGIN_URL}