Initial checkin of EopenECOMP testsuite

Change-Id: I64a2b6d8cf66169829866b73b3d26a4ff59b0a42
Signed-off-by: DR695H <dr695h@att.com>
diff --git a/robot/resources/openstack/nova_interface.robot b/robot/resources/openstack/nova_interface.robot
new file mode 100644
index 0000000..efee279
--- /dev/null
+++ b/robot/resources/openstack/nova_interface.robot
@@ -0,0 +1,149 @@
+*** Settings ***
+Documentation     The main interface for interacting with Openstack. It handles low level stuff like managing the authtoken and Openstack required fields
+Library           OpenstackLibrary
+Library 	      RequestsLibrary
+Library 	      JSONUtils
+Library	          UUID      
+Library    OperatingSystem
+Library    Collections
+Resource    ../global_properties.robot
+Resource    ../json_templater.robot
+Resource    openstack_common.robot
+
+*** Variables ***
+${OPENSTACK_NOVA_API_VERSION}    /v2
+${OPENSTACK_NOVA_KEYPAIR_PATH}    /os-keypairs
+${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE}    robot/assets/templates/nova_add_keypair.template
+${OPENSTACK_NOVA_KEYPAIR_SSH_KEY}    robot/assets/keys/robot_ssh_public_key.txt
+${OPENSTACK_NOVA_FLAVORS_PATH}    /flavors
+${OPENSTACK_NOVA_SERVERS_PATH}    /servers
+${OPENSTACK_NOVA_IMAGES_PATH}    /images
+${OPENSTACK_NOVA_SERVERS_REBOOT_BODY}    {"reboot" : { "type" : "SOFT" }}
+${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    robot/assets/templates/nova_add_server.template
+
+
+*** Keywords ***
+Get Openstack Keypair
+    [Documentation]    Runs an Openstack Request and returns the keypair info
+    [Arguments]    ${alias}    ${keypair_name}
+    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_KEYPAIR_PATH}    /${keypair_name}
+    [Return]    ${resp.json()}
+
+Add Openstack Keypair
+    [Documentation]    Runs an Openstack Request to add a keypair and returns the keypair name
+    [Arguments]    ${alias}    ${name}
+    ${data_template}=    OperatingSystem.Get File    ${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE}
+    ${ssh_key}=    OperatingSystem.Get File     ${OPENSTACK_NOVA_KEYPAIR_SSH_KEY}
+    ${arguments}=    Create Dictionary    name=${name}	    publickey=${ssh_key}
+    ${data}=	Fill JSON Template    ${data_template}    ${arguments}
+    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_KEYPAIR_PATH}    data_path=    data=${data}
+    Should Be Equal As Strings    200  ${resp.status_code}
+    [Return]    ${resp.json()['keypair']['name']}
+
+Delete Openstack Keypair
+    [Documentation]    Runs an Openstack Request to delete a keypair
+    [Arguments]    ${alias}    ${keypair_name}
+    ${resp}=    Internal Delete Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_KEYPAIR_PATH}	  /${keypair_name}  
+    ${status_string}=    Convert To String    ${resp.status_code}
+    Should Match Regexp    ${status_string}    ^(204|202|200)$    
+    [Return]    ${resp.text}
+
+
+Get Openstack Servers
+    [Documentation]    Returns the list of servers as a dictionary by name
+    [Arguments]    ${alias}
+    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}    /detail
+    Log    Returned from Internal Get Openstack
+    ${by_name}=    Make List Into Dict    ${resp.json()['servers']}    name
+    Log    got it
+    [Return]    ${by_name}
+    
+Get Openstack Server By Id
+    [Documentation]    Returns the openstack stacks info for the given stack name
+    [Arguments]    ${alias}    ${server_id}        
+    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}    /${server_id}
+    [Return]    ${resp}
+    
+Get Openstack Flavors
+    [Documentation]    Runs an Openstack Request and returns the flavor list
+    [Arguments]    ${alias}
+    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_FLAVORS_PATH}
+    [Return]    ${resp.json()}
+
+Get Openstack Images
+    [Documentation]    Runs an Openstack Request and returns the flavor list
+    [Arguments]    ${alias}
+    ${resp}=    Internal Get Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_IMAGES_PATH}
+    [Return]    ${resp.json()}
+
+Reboot Server
+    [Documentation]    Requests a reboot of the passed server id
+    [Arguments]    ${alias}    ${server_id}        
+    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}    /${server_id}/action    ${OPENSTACK_NOVA_SERVERS_REBOOT_BODY}
+    [Return]    ${resp}
+
+Add Server
+    [Documentation]    Adds a server for the passed if
+    [Arguments]    ${alias}    ${name}    ${imageRef}    ${flavorRef}
+    ${dict}=    Create Dictionary   name=${name}   imageRef=${imageRef}   flavorRef=${flavorRef}
+    ${data}=    Fill JSON Template File    ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    ${dict}        
+    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}   data_path=    data=${data}     
+    [Return]    ${resp}
+
+Add Server For Image Name
+    [Documentation]    Adds a server for the passed if
+    [Arguments]    ${alias}    ${name}    ${imageName}    ${flavorName}
+    ${images}=  Get Openstack Images    ${alias}
+    ${flavors}=  Get Openstack Flavors    ${alias}
+    ${images}=   Get From Dictionary   ${images}   images
+    ${flavors}=   Get From Dictionary   ${flavors}   flavors
+    ${imageRef}=    Get Id For Name   ${images}    ${imageName}
+    ${flavorRef}=   Get Id For Name   ${flavors}    ${flavorName}
+    ${dict}=    Create Dictionary   name=${name}   imageRef=${imageRef}   flavorRef=${flavorRef}
+    ${data}=    Fill JSON Template File    ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE}    ${dict}        
+    ${resp}=    Internal Post Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}   data_path=    data=${data}     
+    ${status_string}=    Convert To String    ${resp.status_code}
+    Should Match Regexp    ${status_string}    ^(202)$
+    [Return]    ${resp.json()}
+
+Wait for Server to Be Active
+    [Arguments]    ${alias}   ${server_id}    ${timeout}=300s
+    ${server_info}=    Wait Until Keyword Succeeds    ${timeout}    10 sec    Get Active Server    ${alias}    ${server_id}    
+    ${status}=   Get From Dictionary    ${server_info}    status
+    Should Be Equal    ${status}    ACTIVE
+    [Return]    ${server_info}
+
+ Get Active Server
+    [Arguments]    ${alias}    ${server_id}    
+    ${resp}=    Get Openstack Server By Id    ${alias}    ${server_id}
+    Should Be Equal As Strings   ${resp.status_code}    200
+    ${server_info}=    Set Variable    ${resp.json()}   
+    ${server_info}=    Get From Dictionary   ${server_info}    server
+    ${status}=   Get From Dictionary    ${server_info}    status
+    Should Not Be Equal    ${status}    BUILD
+    [Return]    ${server_info}     
+
+Wait for Server to Be Deleted
+    [Arguments]    ${alias}    ${server_id}
+    Wait Until Keyword Succeeds    300s   10s    Get Deleted Server   ${alias}    ${server_id}
+
+Get Deleted Server
+    [Arguments]    ${alias}    ${server_id}
+    ${resp}=  Get Openstack Server By Id   ${alias}    ${server_id}
+    Should Be Equal As Strings    ${resp.status_code}    404
+
+Delete Server
+    [Documentation]    Runs an Openstack Request to delete a keypair
+    [Arguments]    ${alias}    ${server_id}
+    ${resp}=    Internal Delete Openstack    ${alias}    ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE}    ${GLOBAL_OPENSTACK_SERVICE_REGION}    ${OPENSTACK_NOVA_SERVERS_PATH}	  /${server_id}  
+    ${status_string}=    Convert To String    ${resp.status_code}
+    Should Match Regexp    ${status_string}    ^(204)$    
+    [Return]    ${resp.text}
+
+Get Id For Name
+    [Arguments]    ${list}    ${name}
+    :for   ${item}   in   @{list}
+    \    ${id}=    Get From Dictionary    ${item}    id 
+    \    ${n}=    Get From Dictionary    ${item}    name
+    \    Return from Keyword If   '${n}' == '${name}'   ${id} 
+    [Return]   None