2 Documentation The main interface for interacting with Openstack. It handles low level stuff like managing the authtoken and Openstack required fields
3 Library ONAPLibrary.Openstack
4 Library RequestsLibrary
5 Library ONAPLibrary.JSON
6 Library ONAPLibrary.Templating WITH NAME Templating
7 Library OperatingSystem
9 Resource ../global_properties.robot
10 Resource openstack_common.robot
13 ${OPENSTACK_NOVA_API_VERSION} /v2
14 ${OPENSTACK_NOVA_KEYPAIR_PATH} /os-keypairs
15 ${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE} openstack/nova_add_keypair.jinja
16 ${OPENSTACK_NOVA_FLAVORS_PATH} /flavors
17 ${OPENSTACK_NOVA_SERVERS_PATH} /servers
18 ${OPENSTACK_NOVA_IMAGES_PATH} /images
19 ${OPENSTACK_NOVA_SERVERS_REBOOT_BODY} {"reboot" : { "type" : "SOFT" }}
20 ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE} openstack/nova_add_server.jinja
25 [Documentation] Runs an Openstack Request and returns the keypair info
26 [Arguments] ${alias} ${keypair_name}
27 ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_KEYPAIR_PATH} /${keypair_name}
28 [Return] ${resp.json()}
31 [Documentation] Runs an Openstack Request to add a keypair and returns the keypair name
32 [Arguments] ${alias} ${name} ${ssh_key}
33 ${arguments}= Create Dictionary name=${name} publickey=${ssh_key}
34 Templating.Create Environment openstack ${GLOBAL_TEMPLATE_FOLDER}
35 ${data}= Templating.Apply Template openstack ${OPENSTACK_NOVA_KEYPAIR_ADD_BODY_FILE} ${arguments}
36 ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_KEYPAIR_PATH} data_path= data=${data}
37 Should Be Equal As Strings 200 ${resp.status_code}
38 [Return] ${resp.json()['keypair']['name']}
40 Delete Openstack Keypair
41 [Documentation] Runs an Openstack Request to delete a keypair
42 [Arguments] ${alias} ${keypair_name}
43 ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_KEYPAIR_PATH} /${keypair_name}
44 ${status_string}= Convert To String ${resp.status_code}
45 Should Match Regexp ${status_string} ^(204|202|200)$
50 [Documentation] Returns the list of servers as a dictionary by name
52 ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /detail
53 Log Returned from Internal Get Openstack
54 ${by_name}= Make List Into Dict ${resp.json()['servers']} name
58 Get Openstack Server By Id
59 [Documentation] Returns the openstack stacks info for the given stack name
60 [Arguments] ${alias} ${server_id}
61 ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /${server_id}
65 [Documentation] Runs an Openstack Request and returns the flavor list
67 ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_FLAVORS_PATH}
68 [Return] ${resp.json()}
71 [Documentation] Runs an Openstack Request and returns the flavor list
73 ${resp}= Internal Get Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_IMAGES_PATH}
74 [Return] ${resp.json()}
77 [Documentation] Requests a reboot of the passed server id
78 [Arguments] ${alias} ${server_id}
79 ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /${server_id}/action ${OPENSTACK_NOVA_SERVERS_REBOOT_BODY}
83 [Documentation] Adds a server for the passed if
84 [Arguments] ${alias} ${name} ${imageRef} ${flavorRef}
85 ${dict}= Create Dictionary name=${name} imageRef=${imageRef} flavorRef=${flavorRef}
86 Create Environment openstack ${GLOBAL_TEMPLATE_FOLDER}
87 ${data}= Apply Template openstack ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE} ${dict}
88 ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} data_path= data=${data}
91 Add Server For Image Name
92 [Documentation] Adds a server for the passed if
93 [Arguments] ${alias} ${name} ${imageName} ${flavorName} ${public_net_id}
94 ${images}= Get Openstack Images ${alias}
95 ${flavors}= Get Openstack Flavors ${alias}
96 ${images}= Get From Dictionary ${images} images
97 ${flavors}= Get From Dictionary ${flavors} flavors
98 ${imageRef}= Get Id For Name ${images} ${imageName}
99 ${flavorRef}= Get Id For Name ${flavors} ${flavorName}
100 ${dict}= Create Dictionary name=${name} imageRef=${imageRef} flavorRef=${flavorRef} public_net_id=${public_net_id}
101 Templating.Create Environment openstack ${GLOBAL_TEMPLATE_FOLDER}
102 ${data}= Templating.Apply Template openstack ${OPENSTACK_NOVA_SERVER_ADD_BODY_FILE} ${dict}
103 ${resp}= Internal Post Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} data_path= data=${data}
104 ${status_string}= Convert To String ${resp.status_code}
105 Should Match Regexp ${status_string} ^(202)$
106 [Return] ${resp.json()}
108 Wait for Server to Be Active
109 [Arguments] ${alias} ${server_id} ${timeout}=300s
110 ${server_info}= Wait Until Keyword Succeeds ${timeout} 10 sec Get Active Server ${alias} ${server_id}
111 ${status}= Get From Dictionary ${server_info} status
112 Should Be Equal ${status} ACTIVE
113 [Return] ${server_info}
116 [Arguments] ${alias} ${server_id}
117 ${resp}= Get Openstack Server By Id ${alias} ${server_id}
118 Should Be Equal As Strings ${resp.status_code} 200
119 ${server_info}= Set Variable ${resp.json()}
120 ${server_info}= Get From Dictionary ${server_info} server
121 ${status}= Get From Dictionary ${server_info} status
122 Should Not Be Equal ${status} BUILD
123 [Return] ${server_info}
125 Wait for Server to Be Deleted
126 [Arguments] ${alias} ${server_id}
127 Wait Until Keyword Succeeds 300s 10s Get Deleted Server ${alias} ${server_id}
130 [Arguments] ${alias} ${server_id}
131 ${resp}= Get Openstack Server By Id ${alias} ${server_id}
132 Should Be Equal As Strings ${resp.status_code} 404
135 [Documentation] Runs an Openstack Request to delete a keypair
136 [Arguments] ${alias} ${server_id}
137 ${resp}= Internal Delete Openstack ${alias} ${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} ${OPENSTACK_NOVA_SERVERS_PATH} /${server_id}
138 ${status_string}= Convert To String ${resp.status_code}
139 Should Match Regexp ${status_string} ^(204)$
140 [Return] ${resp.text}
143 [Arguments] ${list} ${name}
144 :FOR ${item} IN @{list}
145 \ ${id}= Get From Dictionary ${item} id
146 \ ${n}= Get From Dictionary ${item} name
147 \ Return from Keyword If '${n}' == '${name}' ${id}