blob: fa37733cd3e52ebe5ac637db892d264fa25bd6e6 [file] [log] [blame]
*** Settings ***
Documentation The main interface for interacting with Openstack Keystone API. It handles low level stuff like managing the authtoken and Openstack required fields
Library OpenstackLibrary
Library RequestsLibrary
Library HTTPUtils
Library UUID
Library Collections
Library OperatingSystem
Library String
Library HttpLibrary.HTTP
Resource ../global_properties.robot
Resource ../json_templater.robot
Resource openstack_common.robot
*** Variables ***
${OPENSTACK_KEYSTONE_API_v3_VERSION} /v3
${OPENSTACK_KEYSTONE_API_v2_VERSION} /v2.0
${OPENSTACK_KEYSTONE_AUTH_v3_PATH} /auth/tokens
${OPENSTACK_KEYSTONE_AUTH_v2_PATH} /tokens
${OPENSTACK_KEYSTONE_AUTH_v2_BODY_FILE} robot/assets/templates/keystone_get_v2_auth.template
${OPENSTACK_KEYSTONE_AUTH_v3_BODY_FILE} robot/assets/templates/keystone_get_v3_auth.template
${OPENSTACK_KEYSTONE_TENANT_PATH} /tenants
*** Keywords ***
Run Openstack Auth Request
[Documentation] Runs an Openstack Auth Request and returns the token and service catalog. you need to include the token in future request's x-auth-token headers. Service catalog describes what can be called
[Arguments] ${alias} ${username}= ${password}=
${username} ${password}= Set Openstack Credentials ${username} ${password}
${keystone_api_version}= Run Keyword If '${GLOBAL_INJECTED_OPENSTACK_KEYSTONE_API_VERSION}'=='' Get KeystoneAPIVersion
... ELSE Set Variable ${GLOBAL_INJECTED_OPENSTACK_KEYSTONE_API_VERSION}
${url} ${path}= Get Keystone Url And Path ${keystone_api_version}
${session}= Create Session keystone ${url} verify=True
${uuid}= Generate UUID
${data_path} ${data}= Run Keyword If '${keystone_api_version}'=='v2.0' Get KeyStoneAuthv2 Data ${username} ${password} ${path}
... ELSE Get KeyStoneAuthv3 Data ${username} ${password} ${path}
${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
Log Sending authenticate post request ${data_path} with headers ${headers} and data ${data}
${resp}= Post Request keystone ${data_path} data=${data} headers=${headers}
Should Be True 200 <= ${resp.status_code} < 300
${auth_token}= Evaluate ''
${auth_token}= Run Keyword If '${keystone_api_version}'=='v3' Get From Dictionary ${resp.headers} X-Subject-Token
Log Keystone API Version is ${keystone_api_version}
Save Openstack Auth ${alias} ${resp.text} ${auth_token} ${keystone_api_version}
Log Received response from keystone ${resp.text}
Get KeystoneAPIVersion
[Documentation] Get Keystone API version
${pieces}= Url Parse ${GLOBAL_INJECTED_KEYSTONE}
${url}= Catenate ${pieces.scheme}://${pieces.netloc}
Log Keystone URL is ${url}
${session}= Create Session keystone ${url} verify=True
${uuid}= Generate UUID
${headers}= Create Dictionary Accept=application/json Content-Type=application/json
${resp}= Get Request keystone / headers=${headers}
Log Received response from keystone ${resp.text}
Should Be Equal As Strings ${resp.status_code} 300
${json}= Parse Json ${resp.content}
${versions}= Get From Dictionary ${json} versions
${values}= Get From Dictionary ${versions} values
: FOR ${value} IN @{values}
\ ${status}= Get Variable Value ${value["status"]}
\ Run Keyword If '${status}'=='stable' Exit For Loop
${href}= Set Variable ${value["links"][0]["href"]}
${keystone}= Set Variable ${GLOBAL_INJECTED_KEYSTONE}
${version}= Remove String ${href} ${keystone} /
Return From Keyword If '${version}'=='v2.0' or '${version}'=='v3' ${version}
Fail Keystone API version not found or not supported
Get KeyStoneAuthv2 Data
[Documentation] Returns all the data for keystone auth v2 api
[Arguments] ${username} ${password} ${path}
${data_template}= OperatingSystem.Get File ${OPENSTACK_KEYSTONE_AUTH_v2_BODY_FILE}
${arguments}= Create Dictionary username=${username} password=${password} tenantId=${GLOBAL_INJECTED_OPENSTACK_TENANT_ID}
${data}= Fill JSON Template ${data_template} ${arguments}
${data_path}= Catenate ${path}${OPENSTACK_KEYSTONE_AUTH_v2_PATH}
[Return] ${data_path} ${data}
Get KeyStoneAuthv3 Data
[Documentation] Returns all the data for keystone auth v3 api
[Arguments] ${username} ${password} ${path}
${data_template}= OperatingSystem.Get File ${OPENSTACK_KEYSTONE_AUTH_v3_BODY_FILE}
${arguments}= Create Dictionary username=${username} password=${password} domain_id=${GLOBAL_INJECTED_OPENSTACK_DOMAIN_ID} project_name=${GLOBAL_INJECTED_OPENSTACK_PROJECT_NAME}
${data}= Fill JSON Template ${data_template} ${arguments}
${data_path}= Catenate ${path}${OPENSTACK_KEYSTONE_AUTH_v3_PATH}
[Return] ${data_path} ${data}
Get Openstack Tenants
[Documentation] Returns all the openstack tenant info
[Arguments] ${alias}
${resp}= Internal Get Openstack With Region ${alias} ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} region= url_ext=${OPENSTACK_KEYSTONE_TENANT_PATH} data_path=
[Return] ${resp.json()}
Get Openstack Tenant
[Documentation] Returns the openstack tenant info for the specified tenantid
[Arguments] ${alias} ${tenant_id}
${resp}= Internal Get Openstack With Region ${alias} ${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} region= url_ext=${OPENSTACK_KEYSTONE_TENANT_PATH} data_path=/${tenant_id}
[Return] ${resp.json()}
Set Openstack Credentials
[Arguments] ${username} ${password}
Return From Keyword If '${username}' != '' ${username} ${password}
${user} ${pass}= Get Openstack Credentials
[Return] ${user} ${pass}
Get Openstack Credentials
[Documentation] Returns the Decripted Password and openstack username using same api_key.txt as SO
${DECRYPTED_OPENSTACK_PASSWORD}= Run echo -n ${GLOBAL_INJECTED_OPENSTACK_API_KEY} | xxd -r -p | openssl enc -aes-128-ecb -d -nosalt -K aa3871669d893c7fb8abbcda31b88b4f | tr -d '\x08'
[Return] ${GLOBAL_INJECTED_OPENSTACK_USERNAME} ${DECRYPTED_OPENSTACK_PASSWORD}
Get Keystone Url And Path
[Arguments] ${keystone_api_version}
[Documentation] Handle arbitrary keystone identiit url. Add v2.0 if not present.
${url} ${path}= Run Keyword If '${keystone_api_version}'=='v2.0' Set API Version ${OPENSTACK_KEYSTONE_API_v2_VERSION}
... ELSE Set API Version ${OPENSTACK_KEYSTONE_API_v3_VERSION}
Log Path is ${url} ${path}
[Return] ${url} ${path}
Set API Version
[Documentation] Decides the API version to be used
[Arguments] ${openstack_version}
${pieces}= Url Parse ${GLOBAL_INJECTED_KEYSTONE}
${url}= Catenate ${pieces.scheme}://${pieces.netloc}
${version}= Evaluate ''
${version}= Set Variable If '${openstack_version}' not in '${pieces.path}' ${openstack_version} ${version}
${path}= Catenate ${pieces.path}${version}
[Return] ${url} ${path}