diff options
| author | Monty Taylor <mordred@inaugust.com> | 2017-05-09 08:11:51 -0400 |
|---|---|---|
| committer | Monty Taylor <mordred@inaugust.com> | 2017-05-09 08:49:05 -0400 |
| commit | 8ab3b94833e341dc700ab1e7f62dc514848181f3 (patch) | |
| tree | 2f712dd06afb44d05667ee169cc31c81caf21aa9 /src/talks | |
| parent | 5a9bcdde9a88a40ddfa71097990acc3f2fc0f66e (diff) | |
Add shade: Everything you ever wanted as a cloud user
Diffstat (limited to 'src/talks')
| -rw-r--r-- | src/talks/everything-you-ever-wanted.hbs | 1335 |
1 files changed, 1335 insertions, 0 deletions
diff --git a/src/talks/everything-you-ever-wanted.hbs b/src/talks/everything-you-ever-wanted.hbs new file mode 100644 index 0000000..a5c79fc --- /dev/null +++ b/src/talks/everything-you-ever-wanted.hbs | |||
| @@ -0,0 +1,1335 @@ | |||
| 1 | <!doctype html> | ||
| 2 | <html lang="en"> | ||
| 3 | |||
| 4 | <head> | ||
| 5 | <meta charset="utf-8"> | ||
| 6 | |||
| 7 | <title>shade: Everything You Ever Wanted As a Cloud User</title> | ||
| 8 | </head> | ||
| 9 | <body> | ||
| 10 | |||
| 11 | <section id="who-am-i-redhat" class="slide level2"> | ||
| 12 | <h1>Who am I?</h1> | ||
| 13 | <img style="float:right; margin:24pt" src="/images/Logo_RH_CMYK_Default.jpg" /> | ||
| 14 | <p> Office of Technology </p> | ||
| 15 | <p> Zuul </p> | ||
| 16 | <p> Ansible </p> | ||
| 17 | </section> | ||
| 18 | |||
| 19 | <section id="who-am-i-openstack" class="slide level2"> | ||
| 20 | <h1>Who am I?</h1> | ||
| 21 | <img style="float:right; margin-right:24pt; width:300px; height: auto" src="/images/openstack-cloud-software-vertical-large.png" /> | ||
| 22 | <p>Technical Committee</p> | ||
| 23 | <p>Developer Infrastructure Core Team</p> | ||
| 24 | </section> | ||
| 25 | |||
| 26 | <section id="what-are-we-going-to-talk-about" class="slide level2"> | ||
| 27 | <h1>What are we going to talk about?</h1> | ||
| 28 | <ul> | ||
| 29 | <li>What</li> | ||
| 30 | <li>Why</li> | ||
| 31 | <li>Configuration</li> | ||
| 32 | <li>Basics</li> | ||
| 33 | <li>Advanced things | ||
| 34 | <ul> | ||
| 35 | <li>Caching</li> | ||
| 36 | <li>Task Management</li> | ||
| 37 | </ul> | ||
| 38 | </li> | ||
| 39 | </ul> | ||
| 40 | </section> | ||
| 41 | |||
| 42 | <section class="slide level2"> | ||
| 43 | <h1>shade: a Python library to wrap business logic around | ||
| 44 | OpenStack resources and operations</h1> | ||
| 45 | </section> | ||
| 46 | |||
| 47 | <section class="slide level2"> | ||
| 48 | <h1>Design Principles</h1> | ||
| 49 | <ul> | ||
| 50 | <li class='fragment'>Expose a single API that works on all clouds</li> | ||
| 51 | <li class='fragment'>Hide all vendor or deployer differences</li> | ||
| 52 | <li class='fragment'>Support multi-cloud (<em>write once, run anywhere</em>)</li> | ||
| 53 | <li class='fragment'>Simple to use (<em>sane defaults</em>)</li> | ||
| 54 | <li class='fragment'>No plugins *</li> | ||
| 55 | <li class='fragment'>Efficient at scale</li> | ||
| 56 | <li class='fragment'>API always backwards compatible</li> | ||
| 57 | </ul> | ||
| 58 | </section> | ||
| 59 | |||
| 60 | <section class="slide level2"> | ||
| 61 | <h1>Current Status</h1> | ||
| 62 | <h3>https://git.openstack.org/cgit/openstack-infra/shade</h3> | ||
| 63 | <h3>https://pypi.python.org/pypi/shade</h3> | ||
| 64 | <ul> | ||
| 65 | <li class='fragment'>Used in Ansible</li> | ||
| 66 | <li class='fragment'>Used in Infra Nodepool</li> | ||
| 67 | <li class='fragment'>Official OpenStack Project</li> | ||
| 68 | <li class='fragment'>Backend conversion to pure REST almost done</li> | ||
| 69 | </ul> | ||
| 70 | </section> | ||
| 71 | |||
| 72 | <section class="slide level2"> | ||
| 73 | <h1>Why?</h1> | ||
| 74 | </section> | ||
| 75 | |||
| 76 | <section class="slide level2"> | ||
| 77 | <blockquote> | ||
| 78 | Brand experts insist that success comes from promoting your unique | ||
| 79 | attributes, but in practice differentiation is less profitable than | ||
| 80 | consolidation. | ||
| 81 | </blockquote> | ||
| 82 | </section> | ||
| 83 | |||
| 84 | <section class="slide level2" data-transition='zoom'> | ||
| 85 | <h1>OpenStack Leaks Abstractions</h1> | ||
| 86 | </section> | ||
| 87 | |||
| 88 | <section class="slide level2" data-transition='zoom'> | ||
| 89 | <h1>OpenStack Breaks APIs</h1> | ||
| 90 | </section> | ||
| 91 | |||
| 92 | <section class="slide level2" data-transition='zoom'> | ||
| 93 | <h1>Basic concepts are needlessly complex</h1> | ||
| 94 | </section> | ||
| 95 | |||
| 96 | <section class="slide level2" data-transition='zoom'> | ||
| 97 | <h1>Client libraries are really for server-server communication</h1> | ||
| 98 | </section> | ||
| 99 | |||
| 100 | <section class="slide level2"> | ||
| 101 | <h1>Infra solved these problems</h1> | ||
| 102 | <p>Infra runs across 14 clouds at massive scale (20k servers per day)</p> | ||
| 103 | <p>Why not share what we've learned with other people?</p> | ||
| 104 | </section> | ||
| 105 | |||
| 106 | <section class="slide level2"> | ||
| 107 | <h1>simplicity</h1> | ||
| 108 | <p>This is what using a cloud should look like</p> | ||
| 109 | <pre><code> | ||
| 110 | cloud = openstack_cloud('vexxhost') | ||
| 111 | image = cloud.create_image( | ||
| 112 | 'image-name', filename='image-filename.qcow2', wait=True) | ||
| 113 | flavor = cloud.get_flavor_by_ram(512) | ||
| 114 | cloud.create_server( | ||
| 115 | 'my-server', image=image, flavor=flavor, wait=True, auto_ip=True) | ||
| 116 | </code></pre> | ||
| 117 | </section> | ||
| 118 | |||
| 119 | <section class="slide level2" data-transition='zoom'> | ||
| 120 | <h1>existence of shade is a bug</h1> | ||
| 121 | </section> | ||
| 122 | |||
| 123 | <section class="slide level2" data-transition='zoom'> | ||
| 124 | <h1>existence of shade is a <em>feature</em></h1> | ||
| 125 | </section> | ||
| 126 | |||
| 127 | <section class="slide level2"> | ||
| 128 | <h1>Using shade</h1> | ||
| 129 | <h2>Step One: Configuration</h2> | ||
| 130 | </section> | ||
| 131 | |||
| 132 | <section class="slide level2"> | ||
| 133 | <h1>os-client-config</h1> | ||
| 134 | <h3>http://git.openstack.org/cgit/openstack/os-client-config</h3> | ||
| 135 | <ul> | ||
| 136 | <li>A library to handle config information for openstack clients</li> | ||
| 137 | <li>Tracks differences in vendors that can't be discovered</li> | ||
| 138 | <li>Also used for ansible, python-openstackclient and openstacksdk</li> | ||
| 139 | <li>Reads clouds.yaml config file, environment vars and argparse</li> | ||
| 140 | </ul> | ||
| 141 | </section> | ||
| 142 | |||
| 143 | <section class="slide level2"> | ||
| 144 | <h1>clouds.yaml - simple</h1> | ||
| 145 | <pre><code> | ||
| 146 | clouds: | ||
| 147 | my-citycloud: | ||
| 148 | profile: citycloud | ||
| 149 | auth: | ||
| 150 | username: mordred | ||
| 151 | password: XXXXXXXXXXXXX | ||
| 152 | project_id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 153 | user_domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 154 | project_domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 155 | </code></pre> | ||
| 156 | </section> | ||
| 157 | |||
| 158 | <section class="slide level2"> | ||
| 159 | <h1>clouds.yaml - mildly complex</h1> | ||
| 160 | <pre><code> | ||
| 161 | my-vexxhost: | ||
| 162 | volume_api_version: 3 | ||
| 163 | profile: vexxhost | ||
| 164 | auth: | ||
| 165 | user_domain_id: default | ||
| 166 | project_domain_id: default | ||
| 167 | project_name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 168 | username: 0b8c435b-cc4d-4e05-8a47-a2ada0539af1 | ||
| 169 | password: XXXXXXXXXXXXX | ||
| 170 | regions: | ||
| 171 | - ca-ymq-1 | ||
| 172 | image_endpoint_override: https://image-ca-ymq-1.vexxhost.net/v2 | ||
| 173 | </code></pre> | ||
| 174 | </section> | ||
| 175 | |||
| 176 | <section class="slide level2"> | ||
| 177 | <h1>clouds.yaml - complex</h1> | ||
| 178 | <pre><code> | ||
| 179 | my-internap: | ||
| 180 | auth: | ||
| 181 | auth_url: https://identity.api.cloud.iweb.com | ||
| 182 | username: api-55f9a00fb2619 | ||
| 183 | project_name: inap-17037 | ||
| 184 | password: XXXXXXXXXXXXX | ||
| 185 | identity_api_version: 3 | ||
| 186 | floating_ip_source: None | ||
| 187 | regions: | ||
| 188 | - name: ams01 | ||
| 189 | values: | ||
| 190 | networks: | ||
| 191 | - name: inap-17037-WAN1654 | ||
| 192 | routes_externally: true | ||
| 193 | default_interface: true | ||
| 194 | - name: inap-17037-LAN3631 | ||
| 195 | routes_externally: false | ||
| 196 | </code></pre> | ||
| 197 | </section> | ||
| 198 | |||
| 199 | <section class="slide level2"> | ||
| 200 | <h1>Environment Variables</h1> | ||
| 201 | <ul> | ||
| 202 | <li>os-client-config also processes OS_ environment variables</li> | ||
| 203 | <li>If present, they go into a cloud named "envvars"</li> | ||
| 204 | </ul> | ||
| 205 | </section> | ||
| 206 | |||
| 207 | <section class="slide level2"> | ||
| 208 | <h1>auth_type</h1> | ||
| 209 | <p>keystone has pluggable authentication</p> | ||
| 210 | |||
| 211 | <ul> | ||
| 212 | <li>auth dict contents vary based on plugin</li> | ||
| 213 | <li>Defaults to 'password' which autodetects based on parameters</li> | ||
| 214 | <li>Other options: admin_token, v3oidcpassword, v3oidcauthcode</li> | ||
| 215 | <li>This is where I said "*" on "no plugins" earlier</li> | ||
| 216 | </ul> | ||
| 217 | </section> | ||
| 218 | |||
| 219 | <section class="slide level2"> | ||
| 220 | <h1>auth_type - not part of auth_dict</h1> | ||
| 221 | <pre><code> | ||
| 222 | my-vexxhost: | ||
| 223 | profile: vexxhost | ||
| 224 | auth_type: v3password | ||
| 225 | auth: | ||
| 226 | user_domain_id: default | ||
| 227 | project_domain_id: default | ||
| 228 | project_name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 229 | username: 0b8c435b-cc4d-4e05-8a47-a2ada0539af1 | ||
| 230 | password: XXXXXXXXXXXXX | ||
| 231 | regions: | ||
| 232 | - ca-ymq-1 | ||
| 233 | </code></pre> | ||
| 234 | </section> | ||
| 235 | |||
| 236 | <section class="slide level2"> | ||
| 237 | <h1>python-openstackclient</h1> | ||
| 238 | <pre> | ||
| 239 | openstack --os-cloud=my-vexxhost servers list | ||
| 240 | </pre> | ||
| 241 | Or | ||
| 242 | <pre> | ||
| 243 | export OS_CLOUD=my-vexxhost | ||
| 244 | openstack servers list | ||
| 245 | </pre> | ||
| 246 | </section> | ||
| 247 | |||
| 248 | <section class="slide level2"> | ||
| 249 | <h1>shade inventory</h1> | ||
| 250 | <ul> | ||
| 251 | <li>Code behind ansible OpenStack dynamic inventory plugin</li> | ||
| 252 | <li>All resources in all of your clouds</li> | ||
| 253 | </ul> | ||
| 254 | <pre> | ||
| 255 | mordred@camelot:~$ shade-inventory --list --yaml | ||
| 256 | </pre> | ||
| 257 | <pre><code> | ||
| 258 | - accessIPv4: 199.204.45.50 | ||
| 259 | accessIPv6: 2604:e100:1:0:f816:3eff:feb5:ce98 | ||
| 260 | addresses: | ||
| 261 | public: | ||
| 262 | - OS-EXT-IPS-MAC:mac_addr: fa:16:3e:b5:ce:98 | ||
| 263 | OS-EXT-IPS:type: fixed | ||
| 264 | addr: 2604:e100:1:0:f816:3eff:feb5:ce98 | ||
| 265 | version: 6 | ||
| 266 | - OS-EXT-IPS-MAC:mac_addr: fa:16:3e:b5:ce:98 | ||
| 267 | OS-EXT-IPS:type: fixed | ||
| 268 | addr: 199.204.45.50 | ||
| 269 | version: 4 | ||
| 270 | adminPass: null | ||
| 271 | created: '2017-04-02T17:04:49Z' | ||
| 272 | disk_config: AUTO | ||
| 273 | flavor: | ||
| 274 | id: bbcb7eb5-5c8d-498f-9d7e-307c575d3566 | ||
| 275 | name: v1-standard-1 | ||
| 276 | has_config_drive: false | ||
| 277 | host_id: 5b303fdae29a6b2c39c90a2a1c6dc1191297840d8c395e09c4e319b7 | ||
| 278 | id: 5b3cde7d-ad17-4b28-9c08-9f4627abc659 | ||
| 279 | image: | ||
| 280 | id: dd33a4c8-5a86-40ec-9fe0-8578d6a6dc10 | ||
| 281 | name: Ubuntu 16.04.1 LTS [2017-03-03] | ||
| 282 | interface_ip: 199.204.45.50 | ||
| 283 | key_name: mordred | ||
| 284 | launched_at: '2017-04-02T17:05:02.000000' | ||
| 285 | location: | ||
| 286 | cloud: my-vexxhost | ||
| 287 | project: | ||
| 288 | domain_id: default | ||
| 289 | domain_name: null | ||
| 290 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 291 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 292 | region_name: ca-ymq-1 | ||
| 293 | zone: ca-ymq-2 | ||
| 294 | metadata: {} | ||
| 295 | name: irc-bouncer | ||
| 296 | networks: | ||
| 297 | public: | ||
| 298 | - 2604:e100:1:0:f816:3eff:feb5:ce98 | ||
| 299 | - 199.204.45.50 | ||
| 300 | power_state: 1 | ||
| 301 | private_v4: '' | ||
| 302 | progress: 0 | ||
| 303 | properties: {} | ||
| 304 | public_v4: 199.204.45.50 | ||
| 305 | public_v6: 2604:e100:1:0:f816:3eff:feb5:ce98 | ||
| 306 | security_groups: | ||
| 307 | - description: default | ||
| 308 | id: 22f8104a-2359-4091-aa61-9a4c48d6df3f | ||
| 309 | location: | ||
| 310 | cloud: my-vexxhost | ||
| 311 | project: | ||
| 312 | domain_id: default | ||
| 313 | domain_name: null | ||
| 314 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 315 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 316 | region_name: ca-ymq-1 | ||
| 317 | zone: null | ||
| 318 | name: default | ||
| 319 | properties: {} | ||
| 320 | security_group_rules: | ||
| 321 | - direction: ingress | ||
| 322 | ethertype: IPv4 | ||
| 323 | id: 2172daaa-e402-4cf0-b353-1a7cb7dae184 | ||
| 324 | location: | ||
| 325 | cloud: my-vexxhost | ||
| 326 | project: | ||
| 327 | domain_id: default | ||
| 328 | domain_name: null | ||
| 329 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 330 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 331 | region_name: ca-ymq-1 | ||
| 332 | zone: null | ||
| 333 | port_range_max: null | ||
| 334 | port_range_min: null | ||
| 335 | properties: | ||
| 336 | group: {} | ||
| 337 | protocol: null | ||
| 338 | remote_group_id: null | ||
| 339 | remote_ip_prefix: 0.0.0.0/0 | ||
| 340 | security_group_id: 22f8104a-2359-4091-aa61-9a4c48d6df3f | ||
| 341 | - direction: ingress | ||
| 342 | ethertype: IPv4 | ||
| 343 | id: 47fb6b4c-2f9b-4279-a77c-a645f7fc964f | ||
| 344 | location: | ||
| 345 | cloud: my-vexxhost | ||
| 346 | project: | ||
| 347 | domain_id: default | ||
| 348 | domain_name: null | ||
| 349 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 350 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 351 | region_name: ca-ymq-1 | ||
| 352 | zone: null | ||
| 353 | port_range_max: null | ||
| 354 | port_range_min: null | ||
| 355 | properties: | ||
| 356 | group: | ||
| 357 | name: default | ||
| 358 | tenant_id: db92b20496ae4fbda850a689ea9d563f | ||
| 359 | protocol: null | ||
| 360 | remote_group_id: null | ||
| 361 | remote_ip_prefix: null | ||
| 362 | security_group_id: 22f8104a-2359-4091-aa61-9a4c48d6df3f | ||
| 363 | - direction: ingress | ||
| 364 | ethertype: IPv4 | ||
| 365 | id: 8287f9be-614b-4145-9f00-62fa9c856362 | ||
| 366 | location: | ||
| 367 | cloud: my-vexxhost | ||
| 368 | project: | ||
| 369 | domain_id: default | ||
| 370 | domain_name: null | ||
| 371 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 372 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 373 | region_name: ca-ymq-1 | ||
| 374 | zone: null | ||
| 375 | port_range_max: null | ||
| 376 | port_range_min: null | ||
| 377 | properties: | ||
| 378 | group: | ||
| 379 | name: default | ||
| 380 | tenant_id: db92b20496ae4fbda850a689ea9d563f | ||
| 381 | protocol: null | ||
| 382 | remote_group_id: null | ||
| 383 | remote_ip_prefix: null | ||
| 384 | security_group_id: 22f8104a-2359-4091-aa61-9a4c48d6df3f | ||
| 385 | - direction: ingress | ||
| 386 | ethertype: IPv4 | ||
| 387 | id: fdd91863-c19b-4b4b-a1bc-822cb8b0adf7 | ||
| 388 | location: | ||
| 389 | cloud: my-vexxhost | ||
| 390 | project: | ||
| 391 | domain_id: default | ||
| 392 | domain_name: null | ||
| 393 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 394 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 395 | region_name: ca-ymq-1 | ||
| 396 | zone: null | ||
| 397 | port_range_max: null | ||
| 398 | port_range_min: null | ||
| 399 | properties: | ||
| 400 | group: {} | ||
| 401 | protocol: null | ||
| 402 | remote_group_id: null | ||
| 403 | remote_ip_prefix: 0.0.0.0/0 | ||
| 404 | security_group_id: 22f8104a-2359-4091-aa61-9a4c48d6df3f | ||
| 405 | status: ACTIVE | ||
| 406 | task_state: null | ||
| 407 | terminated_at: null | ||
| 408 | updated: '2017-04-02T17:05:02Z' | ||
| 409 | user_id: e9b21dc437d149858faee0898fb08e92 | ||
| 410 | vm_state: active | ||
| 411 | volumes: | ||
| 412 | - attachments: | ||
| 413 | - attached_at: '2017-04-11T19:11:09.000000' | ||
| 414 | attachment_id: 60f81620-4714-438b-b481-cd8fd7a4dd3e | ||
| 415 | device: /dev/vdc | ||
| 416 | host_name: null | ||
| 417 | id: 7aa81299-bb1c-449b-8a73-b55a9bdc5fca | ||
| 418 | server_id: 5b3cde7d-ad17-4b28-9c08-9f4627abc659 | ||
| 419 | volume_id: 7aa81299-bb1c-449b-8a73-b55a9bdc5fca | ||
| 420 | can_multiattach: false | ||
| 421 | consistencygroup_id: null | ||
| 422 | created_at: '2017-04-11T19:10:20.000000' | ||
| 423 | description: '' | ||
| 424 | device: /dev/vdc | ||
| 425 | host: null | ||
| 426 | id: 7aa81299-bb1c-449b-8a73-b55a9bdc5fca | ||
| 427 | is_bootable: false | ||
| 428 | is_encrypted: false | ||
| 429 | location: | ||
| 430 | cloud: my-vexxhost | ||
| 431 | project: | ||
| 432 | domain_id: default | ||
| 433 | domain_name: null | ||
| 434 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 435 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 436 | region_name: ca-ymq-1 | ||
| 437 | zone: ca-ymq-2 | ||
| 438 | metadata: | ||
| 439 | attached_mode: rw | ||
| 440 | readonly: 'False' | ||
| 441 | migration_status: null | ||
| 442 | name: foo | ||
| 443 | properties: | ||
| 444 | volume_image_metadata: {} | ||
| 445 | replication_driver: null | ||
| 446 | replication_extended_status: null | ||
| 447 | replication_status: disabled | ||
| 448 | size: 1 | ||
| 449 | snapshot_id: null | ||
| 450 | source_volume_id: null | ||
| 451 | status: in-use | ||
| 452 | updated_at: '2017-04-11T19:11:09.000000' | ||
| 453 | volume_type: null | ||
| 454 | - attachments: | ||
| 455 | - attached_at: '2017-04-02T17:06:27.000000' | ||
| 456 | attachment_id: 4f24b276-ea5c-4a79-824f-434183c3c518 | ||
| 457 | device: /dev/vdb | ||
| 458 | host_name: null | ||
| 459 | id: 9b6110df-cd97-4e37-9596-af371653a791 | ||
| 460 | server_id: 5b3cde7d-ad17-4b28-9c08-9f4627abc659 | ||
| 461 | volume_id: 9b6110df-cd97-4e37-9596-af371653a791 | ||
| 462 | can_multiattach: false | ||
| 463 | consistencygroup_id: null | ||
| 464 | created_at: '2017-04-02T16:34:41.000000' | ||
| 465 | description: '' | ||
| 466 | device: /dev/vdb | ||
| 467 | host: null | ||
| 468 | id: 9b6110df-cd97-4e37-9596-af371653a791 | ||
| 469 | is_bootable: true | ||
| 470 | is_encrypted: false | ||
| 471 | location: | ||
| 472 | cloud: my-vexxhost | ||
| 473 | project: | ||
| 474 | domain_id: default | ||
| 475 | domain_name: null | ||
| 476 | id: db92b20496ae4fbda850a689ea9d563f | ||
| 477 | name: d8af8a8f-a573-48e6-898a-af333b970a2d | ||
| 478 | region_name: ca-ymq-1 | ||
| 479 | zone: ca-ymq-2 | ||
| 480 | metadata: | ||
| 481 | attached_mode: rw | ||
| 482 | readonly: 'False' | ||
| 483 | migration_status: null | ||
| 484 | name: mordred-irc-save | ||
| 485 | properties: | ||
| 486 | volume_image_metadata: | ||
| 487 | base_image_ref: 69c99b45-cd53-49de-afdc-f24789eb8f83 | ||
| 488 | checksum: dddc88434b12b5b61b6c7a3a5a880c35 | ||
| 489 | clean_attempts: '7' | ||
| 490 | container_format: bare | ||
| 491 | disk_format: raw | ||
| 492 | hw_rng_model: virtio | ||
| 493 | image_id: 1659da1f-7650-4b91-b316-c3d69623e3fc | ||
| 494 | image_location: snapshot | ||
| 495 | image_name: mordred-irc-save | ||
| 496 | image_state: available | ||
| 497 | image_type: snapshot | ||
| 498 | instance_uuid: 811c5197-dba7-4d3a-a3f6-68ca5328b9a7 | ||
| 499 | libvirt_use_agent: 'True' | ||
| 500 | min_disk: '40' | ||
| 501 | min_ram: '0' | ||
| 502 | network_allocated: 'True' | ||
| 503 | os_type: linux | ||
| 504 | owner_id: db92b20496ae4fbda850a689ea9d563f | ||
| 505 | size: '42949672960' | ||
| 506 | user_id: e9b21dc437d149858faee0898fb08e92 | ||
| 507 | replication_driver: null | ||
| 508 | replication_extended_status: null | ||
| 509 | replication_status: disabled | ||
| 510 | size: 40 | ||
| 511 | snapshot_id: null | ||
| 512 | source_volume_id: null | ||
| 513 | status: in-use | ||
| 514 | updated_at: '2017-04-02T17:06:27.000000' | ||
| 515 | volume_type: null | ||
| 516 | - accessIPv4: 89.40.216.229 | ||
| 517 | accessIPv6: '' | ||
| 518 | addresses: | ||
| 519 | private: | ||
| 520 | - OS-EXT-IPS-MAC:mac_addr: fa:16:3e:29:6d:20 | ||
| 521 | OS-EXT-IPS:type: fixed | ||
| 522 | addr: 10.4.0.22 | ||
| 523 | version: 4 | ||
| 524 | - OS-EXT-IPS-MAC:mac_addr: fa:16:3e:29:6d:20 | ||
| 525 | OS-EXT-IPS:type: floating | ||
| 526 | addr: 89.40.216.229 | ||
| 527 | version: 4 | ||
| 528 | adminPass: null | ||
| 529 | created: '2017-05-08T18:48:34Z' | ||
| 530 | disk_config: MANUAL | ||
| 531 | flavor: | ||
| 532 | id: 10973fe6-81ba-480c-bc36-bec93ee03d5c | ||
| 533 | name: 4C-4GB-100GB | ||
| 534 | has_config_drive: false | ||
| 535 | host_id: 8ed21447e12616c0c24f6e246f0ec423d6be1532716869a3617fbe80 | ||
| 536 | id: a72fd3ea-9357-482d-b33a-fe61d7c37bfc | ||
| 537 | image: | ||
| 538 | id: 95e4c449-8abf-486e-97d9-dc3f82417d2d | ||
| 539 | name: Ubuntu 16.04 Xenial Xerus | ||
| 540 | interface_ip: 89.40.216.229 | ||
| 541 | key_name: null | ||
| 542 | launched_at: '2017-05-08T18:48:39.000000' | ||
| 543 | location: | ||
| 544 | cloud: my-citycloud | ||
| 545 | project: | ||
| 546 | domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 547 | domain_name: null | ||
| 548 | id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 549 | name: null | ||
| 550 | region_name: Buf1 | ||
| 551 | zone: nova | ||
| 552 | metadata: {} | ||
| 553 | name: my-server | ||
| 554 | networks: | ||
| 555 | private: | ||
| 556 | - 10.4.0.22 | ||
| 557 | - 89.40.216.229 | ||
| 558 | power_state: 1 | ||
| 559 | private_v4: 10.4.0.22 | ||
| 560 | progress: 0 | ||
| 561 | properties: {} | ||
| 562 | public_v4: 89.40.216.229 | ||
| 563 | public_v6: '' | ||
| 564 | security_groups: | ||
| 565 | - description: Default security group | ||
| 566 | id: 9fb5ba44-5c46-4357-8e60-8b55526cab54 | ||
| 567 | location: | ||
| 568 | cloud: my-citycloud | ||
| 569 | project: | ||
| 570 | domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 571 | domain_name: null | ||
| 572 | id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 573 | name: null | ||
| 574 | region_name: Buf1 | ||
| 575 | zone: null | ||
| 576 | name: default | ||
| 577 | properties: {} | ||
| 578 | security_group_rules: | ||
| 579 | - direction: ingress | ||
| 580 | ethertype: IPv4 | ||
| 581 | id: 67cbd716-ace1-4822-93e3-1a14a2763efa | ||
| 582 | location: | ||
| 583 | cloud: my-citycloud | ||
| 584 | project: | ||
| 585 | domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 586 | domain_name: null | ||
| 587 | id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 588 | name: null | ||
| 589 | region_name: Buf1 | ||
| 590 | zone: null | ||
| 591 | port_range_max: null | ||
| 592 | port_range_min: null | ||
| 593 | properties: | ||
| 594 | group: | ||
| 595 | name: default | ||
| 596 | tenant_id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 597 | protocol: null | ||
| 598 | remote_group_id: null | ||
| 599 | remote_ip_prefix: null | ||
| 600 | security_group_id: 9fb5ba44-5c46-4357-8e60-8b55526cab54 | ||
| 601 | - direction: ingress | ||
| 602 | ethertype: IPv4 | ||
| 603 | id: f5e80c4c-fe7a-4bfc-a8c0-0105b2c272d5 | ||
| 604 | location: | ||
| 605 | cloud: my-citycloud | ||
| 606 | project: | ||
| 607 | domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 608 | domain_name: null | ||
| 609 | id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 610 | name: null | ||
| 611 | region_name: Buf1 | ||
| 612 | zone: null | ||
| 613 | port_range_max: null | ||
| 614 | port_range_min: null | ||
| 615 | properties: | ||
| 616 | group: | ||
| 617 | name: default | ||
| 618 | tenant_id: 65222a4d09ea4c68934fa1028c77f394 | ||
| 619 | protocol: null | ||
| 620 | remote_group_id: null | ||
| 621 | remote_ip_prefix: null | ||
| 622 | security_group_id: 9fb5ba44-5c46-4357-8e60-8b55526cab54 | ||
| 623 | status: ACTIVE | ||
| 624 | task_state: null | ||
| 625 | terminated_at: null | ||
| 626 | updated: '2017-05-08T18:48:39Z' | ||
| 627 | user_id: c17534835f8f42bf98fc367e0bf35e09 | ||
| 628 | vm_state: active | ||
| 629 | volumes: [] | ||
| 630 | - accessIPv4: 173.231.180.251 | ||
| 631 | accessIPv6: '' | ||
| 632 | addresses: | ||
| 633 | inap-17037-WAN1654: | ||
| 634 | - OS-EXT-IPS-MAC:mac_addr: fa:16:3e:6b:97:9c | ||
| 635 | OS-EXT-IPS:type: fixed | ||
| 636 | addr: 173.231.180.251 | ||
| 637 | version: 4 | ||
| 638 | adminPass: null | ||
| 639 | created: '2017-05-08T18:48:56Z' | ||
| 640 | disk_config: null | ||
| 641 | flavor: | ||
| 642 | id: A1.4 | ||
| 643 | name: A1.4 | ||
| 644 | has_config_drive: true | ||
| 645 | host_id: 6d0c22f3176c3bcbb78a418a93809ba6bfa16267a4c38bd614a892d9 | ||
| 646 | id: ba864796-b56a-4154-b220-e1b96daf39c0 | ||
| 647 | image: | ||
| 648 | id: a6fefc9b-c208-4cd0-acc3-2ab09a38054b | ||
| 649 | name: Ubuntu 16.04 LTS (Xenial Xerus) | ||
| 650 | interface_ip: 173.231.180.251 | ||
| 651 | key_name: null | ||
| 652 | launched_at: null | ||
| 653 | location: | ||
| 654 | cloud: my-internap | ||
| 655 | project: | ||
| 656 | domain_id: null | ||
| 657 | domain_name: null | ||
| 658 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 659 | name: inap-17037 | ||
| 660 | region_name: ams01 | ||
| 661 | zone: null | ||
| 662 | metadata: {} | ||
| 663 | name: my-server | ||
| 664 | networks: | ||
| 665 | inap-17037-WAN1654: | ||
| 666 | - 173.231.180.251 | ||
| 667 | power_state: 1 | ||
| 668 | private_v4: '' | ||
| 669 | progress: 0 | ||
| 670 | properties: {} | ||
| 671 | public_v4: 173.231.180.251 | ||
| 672 | public_v6: '' | ||
| 673 | security_groups: | ||
| 674 | - description: default | ||
| 675 | id: 69871901-68c6-486b-9a1b-6a9adb88ea23 | ||
| 676 | location: | ||
| 677 | cloud: my-internap | ||
| 678 | project: | ||
| 679 | domain_id: null | ||
| 680 | domain_name: null | ||
| 681 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 682 | name: inap-17037 | ||
| 683 | region_name: ams01 | ||
| 684 | zone: null | ||
| 685 | name: default | ||
| 686 | properties: {} | ||
| 687 | security_group_rules: | ||
| 688 | - direction: ingress | ||
| 689 | ethertype: IPv4 | ||
| 690 | id: 24b2ce3a-bf29-44fb-849f-f958e3efb736 | ||
| 691 | location: | ||
| 692 | cloud: my-internap | ||
| 693 | project: | ||
| 694 | domain_id: null | ||
| 695 | domain_name: null | ||
| 696 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 697 | name: inap-17037 | ||
| 698 | region_name: ams01 | ||
| 699 | zone: null | ||
| 700 | port_range_max: 65535 | ||
| 701 | port_range_min: 1 | ||
| 702 | properties: | ||
| 703 | group: {} | ||
| 704 | protocol: tcp | ||
| 705 | remote_group_id: null | ||
| 706 | remote_ip_prefix: 0.0.0.0/0 | ||
| 707 | security_group_id: 69871901-68c6-486b-9a1b-6a9adb88ea23 | ||
| 708 | - direction: ingress | ||
| 709 | ethertype: IPv4 | ||
| 710 | id: 374aa520-c101-4de3-be88-f0025396bdb7 | ||
| 711 | location: | ||
| 712 | cloud: my-internap | ||
| 713 | project: | ||
| 714 | domain_id: null | ||
| 715 | domain_name: null | ||
| 716 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 717 | name: inap-17037 | ||
| 718 | region_name: ams01 | ||
| 719 | zone: null | ||
| 720 | port_range_max: null | ||
| 721 | port_range_min: null | ||
| 722 | properties: | ||
| 723 | group: | ||
| 724 | name: default | ||
| 725 | tenant_id: 760e6c137b3840d78472d313dfa3df45 | ||
| 726 | protocol: null | ||
| 727 | remote_group_id: null | ||
| 728 | remote_ip_prefix: null | ||
| 729 | security_group_id: 69871901-68c6-486b-9a1b-6a9adb88ea23 | ||
| 730 | - direction: ingress | ||
| 731 | ethertype: IPv4 | ||
| 732 | id: 376b67c2-284b-4a81-a989-e7b8f6d44a07 | ||
| 733 | location: | ||
| 734 | cloud: my-internap | ||
| 735 | project: | ||
| 736 | domain_id: null | ||
| 737 | domain_name: null | ||
| 738 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 739 | name: inap-17037 | ||
| 740 | region_name: ams01 | ||
| 741 | zone: null | ||
| 742 | port_range_max: 65535 | ||
| 743 | port_range_min: 1 | ||
| 744 | properties: | ||
| 745 | group: {} | ||
| 746 | protocol: udp | ||
| 747 | remote_group_id: null | ||
| 748 | remote_ip_prefix: 0.0.0.0/0 | ||
| 749 | security_group_id: 69871901-68c6-486b-9a1b-6a9adb88ea23 | ||
| 750 | - direction: ingress | ||
| 751 | ethertype: IPv4 | ||
| 752 | id: 481f9402-753d-4286-8079-be45a414023c | ||
| 753 | location: | ||
| 754 | cloud: my-internap | ||
| 755 | project: | ||
| 756 | domain_id: null | ||
| 757 | domain_name: null | ||
| 758 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 759 | name: inap-17037 | ||
| 760 | region_name: ams01 | ||
| 761 | zone: null | ||
| 762 | port_range_max: null | ||
| 763 | port_range_min: null | ||
| 764 | properties: | ||
| 765 | group: {} | ||
| 766 | protocol: icmp | ||
| 767 | remote_group_id: null | ||
| 768 | remote_ip_prefix: 0.0.0.0/0 | ||
| 769 | security_group_id: 69871901-68c6-486b-9a1b-6a9adb88ea23 | ||
| 770 | - direction: ingress | ||
| 771 | ethertype: IPv4 | ||
| 772 | id: 832aaf3b-b0fb-4103-b2fa-def955077667 | ||
| 773 | location: | ||
| 774 | cloud: my-internap | ||
| 775 | project: | ||
| 776 | domain_id: null | ||
| 777 | domain_name: null | ||
| 778 | id: 760e6c137b3840d78472d313dfa3df45 | ||
| 779 | name: inap-17037 | ||
| 780 | region_name: ams01 | ||
| 781 | zone: null | ||
| 782 | port_range_max: null | ||
| 783 | port_range_min: null | ||
| 784 | properties: | ||
| 785 | group: | ||
| 786 | name: default | ||
| 787 | tenant_id: 760e6c137b3840d78472d313dfa3df45 | ||
| 788 | protocol: null | ||
| 789 | remote_group_id: null | ||
| 790 | remote_ip_prefix: null | ||
| 791 | security_group_id: 69871901-68c6-486b-9a1b-6a9adb88ea23 | ||
| 792 | status: ACTIVE | ||
| 793 | task_state: null | ||
| 794 | terminated_at: null | ||
| 795 | updated: '2017-05-08T18:49:05Z' | ||
| 796 | user_id: c18bd37c27d14b1ba4c424e6d42f2ccd | ||
| 797 | vm_state: active | ||
| 798 | volumes: [] | ||
| 799 | </code></pre> | ||
| 800 | </section> | ||
| 801 | |||
| 802 | <section class="slide level2"> | ||
| 803 | <h1>Cloud-Region</h1> | ||
| 804 | <p>Each OpenStackCloud object represents one region of one cloud</p> | ||
| 805 | </section> | ||
| 806 | |||
| 807 | <section class="slide level2"> | ||
| 808 | <h1>Simplest Cloud Construction</h1> | ||
| 809 | <ul> | ||
| 810 | <li>Works if you only have one cloud</li> | ||
| 811 | </ul> | ||
| 812 | |||
| 813 | <pre><code> | ||
| 814 | import shade | ||
| 815 | cloud = shade.openstack_cloud() | ||
| 816 | </code></pre> | ||
| 817 | </section> | ||
| 818 | |||
| 819 | <section class="slide level2"> | ||
| 820 | <h1>Simplest Cloud Construction - More than one</h1> | ||
| 821 | <pre><code> | ||
| 822 | clients: | ||
| 823 | default: | ||
| 824 | cloud: vexxhost | ||
| 825 | </code></pre> | ||
| 826 | |||
| 827 | <pre><code> | ||
| 828 | import shade | ||
| 829 | cloud = shade.openstack_cloud() | ||
| 830 | </code></pre> | ||
| 831 | </section> | ||
| 832 | |||
| 833 | <section class="slide level2"> | ||
| 834 | <h1>Simple Cloud Construction</h1> | ||
| 835 | <pre><code> | ||
| 836 | import shade | ||
| 837 | cloud = shade.openstack_cloud(cloud='ustack', region_name='bj1') | ||
| 838 | </code></pre> | ||
| 839 | </section> | ||
| 840 | |||
| 841 | <section class="slide level2"> | ||
| 842 | <h1>Complex Cloud Construction</h1> | ||
| 843 | <pre><code> | ||
| 844 | import os_client_config | ||
| 845 | import shade | ||
| 846 | |||
| 847 | config = os_client_config.OpenStackConfig() | ||
| 848 | cloud_config = config.get_one_cloud( | ||
| 849 | cloud='ustack', region_name='bj1', | ||
| 850 | argparse=my_args, **other_arguments) | ||
| 851 | cloud = shade.OpenStackCloud(cloud_config=cloud_config) | ||
| 852 | </code></pre> | ||
| 853 | </section> | ||
| 854 | |||
| 855 | <section class="slide level2"> | ||
| 856 | <h1>logging</h1> | ||
| 857 | <ul> | ||
| 858 | <li>Python logging</li> | ||
| 859 | <li>shade.simple_logging() helper function</li> | ||
| 860 | <li>Turns off annoying warnings</li> | ||
| 861 | <li>debug=True - turn on debug logging and request_id logging</li> | ||
| 862 | <li>http_debug=True - debug=True + http request tracing</li> | ||
| 863 | </ul> | ||
| 864 | </section> | ||
| 865 | |||
| 866 | <section class="slide level2"> | ||
| 867 | <h1>A note on Exceptions</h1> | ||
| 868 | <ul> | ||
| 869 | <li>All (remaining) python*client exceptions are hidden and re-raised</li> | ||
| 870 | <li>Hiding exceptions is evil and I'm a bad person</li> | ||
| 871 | <li>Exceptions are part of the interface</li> | ||
| 872 | <li>Can't hide vendor choice if shade user catches underlying exception</li> | ||
| 873 | <li>See also: Restification later</li> | ||
| 874 | </section> | ||
| 875 | |||
| 876 | <section class="slide level2"> | ||
| 877 | <h1>Exceptions</h1> | ||
| 878 | <ul> | ||
| 879 | <li>All Exceptions are subclasses of OpenStackCloudException</li> | ||
| 880 | <li>Direct REST calls throw OpenStackCloudHTTPError</li> | ||
| 881 | <li>OpenStackCloudHTTPError subclasses OpenStackCloudException | ||
| 882 | and requests.exceptions.HTTPError</li> | ||
| 883 | <li>OpenStackCloudURINotFound for 404</li> | ||
| 884 | <li>OpenStackCloudBadRequest for 400</li> | ||
| 885 | </ul> | ||
| 886 | </section> | ||
| 887 | |||
| 888 | <section class="slide level2"> | ||
| 889 | <h1>Putting it all together</h1> | ||
| 890 | <pre><code> | ||
| 891 | import shade | ||
| 892 | |||
| 893 | shade.simple_logging(debug=True) | ||
| 894 | cloud = shade.openstack_cloud(cloud='vexxhost') | ||
| 895 | image = cloud.create_image( | ||
| 896 | 'ubuntu-trusty', filename='ubuntu-trusty.qcow2', wait=True) | ||
| 897 | flavor = cloud.get_flavor_by_ram(512) | ||
| 898 | cloud.create_server( | ||
| 899 | 'my-server', image=image['id'], flavor=flavor['id'], | ||
| 900 | wait=True, auto_ip=True) | ||
| 901 | </code></pre> | ||
| 902 | </section> | ||
| 903 | |||
| 904 | <section class="slide level2"> | ||
| 905 | <h1>Problem: Image API version</h1> | ||
| 906 | <ul> | ||
| 907 | <li class='fragment'> | ||
| 908 | v1 PUT: Catalyst, Datacentred, Internap | ||
| 909 | </li> | ||
| 910 | <li class='fragment'> | ||
| 911 | v2 PUT: Auro, City Cloud, Dreamhost, Elastx, Enter Cloud Suite, OVH, RunAbove, Vexxhost, Ultimum, UnitedStack | ||
| 912 | </li> | ||
| 913 | <li class='fragment'> | ||
| 914 | v2 Tasks: Switch Engines, Rackspace | ||
| 915 | </li> | ||
| 916 | </ul> | ||
| 917 | </section> | ||
| 918 | |||
| 919 | <section class="slide level2"> | ||
| 920 | <h1>Image Upload Code</h1> | ||
| 921 | <pre><code> | ||
| 922 | cloud = shade.openstack_cloud(cloud='vexxhost', region_name='ca-ymq-1') | ||
| 923 | cloud.create_image('my-image', filename='my-image.qcow2', wait=True) | ||
| 924 | </code></pre> | ||
| 925 | </section> | ||
| 926 | |||
| 927 | <section class="slide level2"> | ||
| 928 | <h1>Image Upload PUT v2 Log</h1> | ||
| 929 | <pre><code> | ||
| 930 | Calculating hashes for my-image.qcow2 | ||
| 931 | Image file my-image.vhd md5:b28fa44077b94ba635842a73eecc1d8c sha256:9a3da71e37ef1579657c4a77ff2caf936dd9be8361d1a02595cc116f0ffd328d | ||
| 932 | Manager my-vexxhost:ca-ymq-1 running task image.GET.images | ||
| 933 | Manager my-vexxhost:ca-ymq-1 ran task image.GET.images in 1.38961982727s | ||
| 934 | GET call to image for https://image-ca-ymq-1.vexxhost.net/v2/images used request id req-2bbc8c10-6c4c-4aa3-8bb7-6ba425cb0ea7 | ||
| 935 | Manager my-vexxhost:ca-ymq-1 running task image.GET.images | ||
| 936 | Manager my-vexxhost:ca-ymq-1 ran task image.GET.images in 0.245140790939s | ||
| 937 | GET call to image for https://image-ca-ymq-1.vexxhost.net/v2/images?marker=5ebb74ba-c9c5-4006-8c77-ceebf9833428 used request id req-da204dc3-eb07-460d-b9f5-74b6ea5fe944 | ||
| 938 | Manager my-vexxhost:ca-ymq-1 running task image.POST.images | ||
| 939 | Manager my-vexxhost:ca-ymq-1 ran task image.POST.images in 0.114197969437s | ||
| 940 | POST call to image for https://image-ca-ymq-1.vexxhost.net/v2/images used request id req-02a5fd04-ca9a-4a71-bfe1-4ff80e49cdea returning object 28d3e4b2-4607-4778-84bd-e84ef217d21c | ||
| 941 | Manager my-vexxhost:ca-ymq-1 running task image.PUT.images.file | ||
| 942 | Manager my-vexxhost:ca-ymq-1 ran task image.PUT.images.file in 2.10132312775s | ||
| 943 | PUT call to image for https://image-ca-ymq-1.vexxhost.net/v2/images/28d3e4b2-4607-4778-84bd-e84ef217d21c/file used request id req-71e3ed5e-77dc-4062-9ba8-13d495713e13 | ||
| 944 | </code></pre> | ||
| 945 | </section> | ||
| 946 | |||
| 947 | <section class="slide level2"> | ||
| 948 | <h1>Image Tasks</h1> | ||
| 949 | <pre><code> | ||
| 950 | cloud = shade.openstack_cloud(cloud='rax', region_name='DFW') | ||
| 951 | cloud.create_image('my-image', filename='my-image.<span style='color: red'>vhd</span>', wait=True) | ||
| 952 | </code></pre> | ||
| 953 | </section> | ||
| 954 | |||
| 955 | |||
| 956 | <section class="slide level2"> | ||
| 957 | <h1>Image Upload Tasks Log</h1> | ||
| 958 | <pre><code> | ||
| 959 | Calculating hashes for my-image.vhd | ||
| 960 | Image file my-image.vhd md5:b28fa44077b94ba635842a73eecc1d8c sha256:9a3da71e37ef1579657c4a77ff2caf936dd9be8361d1a02595cc116f0ffd328d | ||
| 961 | Manager rax:DFW running task image.GET.discovery | ||
| 962 | Manager rax:DFW ran task image.GET.discovery in 1.65571808815s | ||
| 963 | Glance version discovery failed, assuming endpoint in the catalog is already versioned. (404) Client Error: Not Found for https://dfw.images.api.rackspacecloud.com/v2/ | ||
| 964 | Manager rax:DFW running task image.GET.images | ||
| 965 | Manager rax:DFW ran task image.GET.images in 0.637840032578s | ||
| 966 | GET call to image for https://dfw.images.api.rackspacecloud.com/v2/images used request id req-b716bd86-121f-4cdc-b386-2f50546e8d88 | ||
| 967 | Manager rax:DFW running task image.GET.images | ||
| 968 | Manager rax:DFW ran task image.GET.images in 0.491132974625s | ||
| 969 | GET call to image for https://dfw.images.api.rackspacecloud.com/v2/v2/images?marker=e389ab51-1327-488a-867c-4d7c14e6c916 used request id req-90746cbf-610a-4c3d-aab8-f81e673b315a | ||
| 970 | Manager rax:DFW running task image.GET.images | ||
| 971 | Manager rax:DFW ran task image.GET.images in 0.371850967407s | ||
| 972 | GET call to image for https://dfw.images.api.rackspacecloud.com/v2/v2/images?marker=3eba4fbb-51da-4233-b699-8a4030561add used request id req-00937f32-f573-4ac3-86d5-0aeada7432d1 | ||
| 973 | Manager rax:DFW running task object-store.GET.info | ||
| 974 | Manager rax:DFW ran task object-store.GET.info in 0.335763931274s | ||
| 975 | Manager rax:DFW running task object-store.HEAD.images | ||
| 976 | Manager rax:DFW ran task object-store.HEAD.images in 0.393274784088s | ||
| 977 | Manager rax:DFW running task object-store.HEAD.images | ||
| 978 | Manager rax:DFW ran task object-store.HEAD.images in 3.68135595322s | ||
| 979 | swift stale check, no object: images/my-image | ||
| 980 | swift uploading my-image.vhd to images/my-image | ||
| 981 | Manager rax:DFW running task object-store.PUT.images | ||
| 982 | Manager rax:DFW ran task object-store.PUT.images in 3.57636904716s | ||
| 983 | Manager rax:DFW running task image.GET.images | ||
| 984 | Manager rax:DFW ran task image.GET.images in 0.616628885269s | ||
| 985 | GET call to image for https://dfw.images.api.rackspacecloud.com/v2/images used request id req-ee7091ae-88a2-4cdb-ac8e-35159ef4cda0 | ||
| 986 | Manager rax:DFW running task image.GET.images | ||
| 987 | Manager rax:DFW ran task image.GET.images in 0.527029037476s | ||
| 988 | GET call to image for https://dfw.images.api.rackspacecloud.com/v2/v2/images?marker=e389ab51-1327-488a-867c-4d7c14e6c916 used request id req-d2caefd2-d69f-46d2-86c1-a062f039ce74 | ||
| 989 | Manager rax:DFW running task image.GET.images | ||
| 990 | Manager rax:DFW ran task image.GET.images in 0.317733049393s | ||
| 991 | GET call to image for https://dfw.images.api.rackspacecloud.com/v2/v2/images?marker=3eba4fbb-51da-4233-b699-8a4030561add used request id req-56411197-65ce-4ac9-847d-0a7e7041766d | ||
| 992 | Manager rax:DFW running task image.POST.tasks | ||
| 993 | Manager rax:DFW ran task image.POST.tasks in 0.796432971954s | ||
| 994 | POST call to image for https://dfw.images.api.rackspacecloud.com/v2/tasks used request id req-edc7842f-5fca-4a08-96b3-55a67c840d16 returning object 45df1ffa-3837-4fbc-a8fb-f213f845b18c | ||
| 995 | </code></pre> | ||
| 996 | </section> | ||
| 997 | |||
| 998 | <section class="slide level2"> | ||
| 999 | <h1>Problem: Version Discovery</h1> | ||
| 1000 | <ul> | ||
| 1001 | <li>OpenStack Services have version discovery documents</li> | ||
| 1002 | <li>Deployers register versioned endpoints in catalog</li> | ||
| 1003 | <li>Some services (cinder, mistral) have versioned service types (volumev2, workflowv2)</li> | ||
| 1004 | <li>Users can't (sanely) do version discovery</li> | ||
| 1005 | <li>shade fixes this for glance and cinder today</li> | ||
| 1006 | </ul> | ||
| 1007 | </section> | ||
| 1008 | |||
| 1009 | <section class="slide level2"> | ||
| 1010 | <h1>Version Discovery Solutions</h1> | ||
| 1011 | <ul> | ||
| 1012 | <li>shade will fix for everything by end of the month</li> | ||
| 1013 | <li>OpenStack Service Types Authority</li> | ||
| 1014 | <li>API-WG specs on Full Service Type and Version Discovery Process</li> | ||
| 1015 | <li>Work with other languages to implement API-WG specs</li> | ||
| 1016 | <li>User requests:<ul> | ||
| 1017 | <li>image version 2</li> | ||
| 1018 | <li>workflow LATEST</li> | ||
| 1019 | <li>compute</li> | ||
| 1020 | <li>volume versions 2 or 3</li> | ||
| 1021 | </ul></li> | ||
| 1022 | <li>Later today we'll be discussing moving this forward (Room 102 at 4:40)</li> | ||
| 1023 | </ul> | ||
| 1024 | </section> | ||
| 1025 | |||
| 1026 | <section class="slide level2"> | ||
| 1027 | <h1>Problem: Networking choices</h1> | ||
| 1028 | <ul> | ||
| 1029 | <li class='fragment'>Cloud has externally routable IP from neutron (OVH)</li> | ||
| 1030 | <li class='fragment'>Cloud has externally routable IP neutron AND supports optional private tenant networks (vexxhost)</li> | ||
| 1031 | <li class='fragment'>Cloud has private tenant network provided by neutron and requires floating IP (citycloud)</li> | ||
| 1032 | <li class='fragment'>Cloud has private tenant network provided by nova-network and requires floating-ip for external routing (auro)</li> | ||
| 1033 | <li class='fragment'>Cloud has externally routable IP from neutron but no neutron APIs (Rackspace)</li> | ||
| 1034 | </ul> | ||
| 1035 | </section> | ||
| 1036 | |||
| 1037 | <section class="slide level2"> | ||
| 1038 | <h1>The Floating IP Case</h1> | ||
| 1039 | <pre><code> | ||
| 1040 | import shade | ||
| 1041 | |||
| 1042 | shade.simple_logging(debug=True) | ||
| 1043 | cloud = shade.openstack_cloud(cloud='my-citycloud') | ||
| 1044 | cloud.create_server( | ||
| 1045 | 'my-server', | ||
| 1046 | image='Ubuntu 16.04 Xenial Xerus', | ||
| 1047 | flavor=dict(id='0dab10b5-42a2-438e-be7b-505741a7ffcc'), | ||
| 1048 | wait=True, auto_ip=True) | ||
| 1049 | </code></pre> | ||
| 1050 | </section> | ||
| 1051 | |||
| 1052 | <section class="slide level2"> | ||
| 1053 | <h1>The Floating IP Case Log</h1> | ||
| 1054 | <pre><code> | ||
| 1055 | Manager my-citycloud:Buf1 running task network.GET.networks | ||
| 1056 | Manager my-citycloud:Buf1 ran task network.GET.networks in 1.29657912254s | ||
| 1057 | GET call to network for https://buf1.citycloud.com:9696/v2.0/networks.json used request id req-a65496e6-984f-4323-98d5-3adb339875c6 | ||
| 1058 | Manager my-citycloud:Buf1 running task network.GET.subnets | ||
| 1059 | Manager my-citycloud:Buf1 ran task network.GET.subnets in 0.713509082794s | ||
| 1060 | GET call to network for https://buf1.citycloud.com:9696/v2.0/subnets.json used request id req-66ccbfce-ceb6-4e0a-a969-0eaf62605d92 | ||
| 1061 | Manager my-citycloud:Buf1 running task image.GET.discovery | ||
| 1062 | Manager my-citycloud:Buf1 ran task image.GET.discovery in 0.474808931351s | ||
| 1063 | Manager my-citycloud:Buf1 running task image.GET.images | ||
| 1064 | Manager my-citycloud:Buf1 ran task image.GET.images in 0.714179039001s | ||
| 1065 | GET call to image for https://buf1.citycloud.com:9292/v2/images used request id req-9a7756c3-2ee4-416d-a6ad-804027330e5f | ||
| 1066 | Manager my-citycloud:Buf1 running task ServerCreate | ||
| 1067 | Manager my-citycloud:Buf1 ran task ServerCreate in 3.38534998894s | ||
| 1068 | Manager my-citycloud:Buf1 running task ServerList | ||
| 1069 | Manager my-citycloud:Buf1 ran task ServerList in 0.959898948669s | ||
| 1070 | Waiting 2.0 seconds | ||
| 1071 | Manager my-citycloud:Buf1 running task ServerList | ||
| 1072 | Manager my-citycloud:Buf1 ran task ServerList in 1.21962594986s | ||
| 1073 | Manager my-citycloud:Buf1 running task network.GET.ports | ||
| 1074 | Manager my-citycloud:Buf1 ran task network.GET.ports in 0.287118911743s | ||
| 1075 | GET call to network for https://buf1.citycloud.com:9696/v2.0/ports.json?device_id=1e2211f2-993f-4ba0-aa54-01743cc49181 used request id req-fd5acf95-21bd-40bb-ad08-e15ac7107874 | ||
| 1076 | Manager my-citycloud:Buf1 running task network.GET.floatingips | ||
| 1077 | Manager my-citycloud:Buf1 ran task network.GET.floatingips in 0.228282928467s | ||
| 1078 | GET call to network for https://buf1.citycloud.com:9696/v2.0/floatingips.json?port_id=af554254-ac9f-4440-b93a-e4ec64783758 used request id req-ed52ca15-9924-488e-a3c0-3a805348eca3 | ||
| 1079 | Manager my-citycloud:Buf1 running task network.GET.ports | ||
| 1080 | Manager my-citycloud:Buf1 ran task network.GET.ports in 0.200226068497s | ||
| 1081 | GET call to network for https://buf1.citycloud.com:9696/v2.0/ports.json?device_id=1e2211f2-993f-4ba0-aa54-01743cc49181 used request id req-f808b9e0-d136-4bd7-a51b-b08d3c6eddb3 | ||
| 1082 | Manager my-citycloud:Buf1 running task network.GET.floatingips | ||
| 1083 | Manager my-citycloud:Buf1 ran task network.GET.floatingips in 0.140635967255s | ||
| 1084 | GET call to network for https://buf1.citycloud.com:9696/v2.0/floatingips.json used request id req-880919b7-4af3-42a3-8e07-4b80a6ae5bac | ||
| 1085 | Manager my-citycloud:Buf1 running task network.GET.ports | ||
| 1086 | Manager my-citycloud:Buf1 ran task network.GET.ports in 0.317744970322s | ||
| 1087 | GET call to network for https://buf1.citycloud.com:9696/v2.0/ports.json?device_id=1e2211f2-993f-4ba0-aa54-01743cc49181 used request id req-af4bb447-e157-44c1-a727-2cecfb595c0e | ||
| 1088 | Manager my-citycloud:Buf1 running task network.PUT.floatingips | ||
| 1089 | Manager my-citycloud:Buf1 ran task network.PUT.floatingips in 0.425180912018s | ||
| 1090 | PUT call to network for https://buf1.citycloud.com:9696/v2.0/floatingips/e69179dc-a904-4c9a-a4c9-891e2ecb984c.json used request id req-2241d8b6-bf50-41c1-9129-c8cfca2c73bc returning object e69179dc-a904-4c9a-a4c9-891e2ecb984c | ||
| 1091 | Manager my-citycloud:Buf1 running task ServerList | ||
| 1092 | Manager my-citycloud:Buf1 ran task ServerList in 1.19975018501s | ||
| 1093 | Manager my-citycloud:Buf1 running task network.GET.ports | ||
| 1094 | Manager my-citycloud:Buf1 ran task network.GET.ports in 0.184152126312s | ||
| 1095 | GET call to network for https://buf1.citycloud.com:9696/v2.0/ports.json?device_id=1e2211f2-993f-4ba0-aa54-01743cc49181 used request id req-9f49b751-d741-45ff-a5fc-ca750826df63 | ||
| 1096 | Manager my-citycloud:Buf1 running task network.GET.floatingips | ||
| 1097 | Manager my-citycloud:Buf1 ran task network.GET.floatingips in 0.21661400795s | ||
| 1098 | GET call to network for https://buf1.citycloud.com:9696/v2.0/floatingips.json?port_id=af554254-ac9f-4440-b93a-e4ec64783758 used request id req-81e231c6-a4d5-466a-bffd-0af6f4dc4be8 | ||
| 1099 | </code></pre> | ||
| 1100 | </section> | ||
| 1101 | |||
| 1102 | <section class="slide level2"> | ||
| 1103 | <h1>The Direct Attached IP Case</h1> | ||
| 1104 | <pre><code> | ||
| 1105 | import shade | ||
| 1106 | |||
| 1107 | shade.simple_logging(debug=True) | ||
| 1108 | cloud = shade.openstack_cloud(cloud='internap', region_name='ams01') | ||
| 1109 | cloud.create_server( | ||
| 1110 | 'my-server', | ||
| 1111 | image='Ubuntu 16.04 LTS (Xenial Xerus)', | ||
| 1112 | flavor=dict(id='A1.4'), | ||
| 1113 | wait=True, auto_ip=True) | ||
| 1114 | </code></pre> | ||
| 1115 | </section> | ||
| 1116 | |||
| 1117 | <section class="slide level2"> | ||
| 1118 | <h1>Direct Attached IP Log</h1> | ||
| 1119 | <pre><code> | ||
| 1120 | Manager my-internap:ams01 running task network.GET.networks | ||
| 1121 | Manager my-internap:ams01 ran task network.GET.networks in 0.783267021179s | ||
| 1122 | GET call to network for https://network.api.ams01.cloud.iweb.com/v2.0/networks.json used request id req-807686be-238a-46e1-b0e5-5dfa31949316 | ||
| 1123 | Manager my-internap:ams01 running task network.GET.subnets | ||
| 1124 | Manager my-internap:ams01 ran task network.GET.subnets in 0.155231952667s | ||
| 1125 | GET call to network for https://network.api.ams01.cloud.iweb.com/v2.0/subnets.json used request id req-9e71772d-70dc-4dc9-8da4-734639a10dd4 | ||
| 1126 | Manager my-internap:ams01 running task image.GET.discovery | ||
| 1127 | Manager my-internap:ams01 ran task image.GET.discovery in 0.589816093445s | ||
| 1128 | Manager my-internap:ams01 running task image.GET.images | ||
| 1129 | Manager my-internap:ams01 ran task image.GET.images in 0.568889856339s | ||
| 1130 | GET call to image for https://image.api.ams01.cloud.iweb.com/v2/images used request id req-b0e25143-a581-4c6a-baab-2376626e529a | ||
| 1131 | Manager my-internap:ams01 running task ServerCreate | ||
| 1132 | Manager my-internap:ams01 ran task ServerCreate in 1.55480098724s | ||
| 1133 | Manager my-internap:ams01 running task ServerList | ||
| 1134 | Manager my-internap:ams01 ran task ServerList in 0.316590070724s | ||
| 1135 | Waiting 2.0 seconds | ||
| 1136 | Manager my-internap:ams01 running task ServerList | ||
| 1137 | Manager my-internap:ams01 ran task ServerList in 0.317390918732s | ||
| 1138 | </code></pre> | ||
| 1139 | </section> | ||
| 1140 | |||
| 1141 | <section class="slide level2"> | ||
| 1142 | <h1>Problem: Finding an Image</h1> | ||
| 1143 | <ul> | ||
| 1144 | <li>Ubuntu 16.04.1 LTS [2017-03-03]</li> | ||
| 1145 | <li>Ubuntu 16.04 Xenial Xerus</li> | ||
| 1146 | <li>Ubuntu 16.04 LTS (Xenial Xerus)</li> | ||
| 1147 | <li>Easy for a human - hard for a computer</li> | ||
| 1148 | </ul> | ||
| 1149 | </section> | ||
| 1150 | |||
| 1151 | <section class="slide level2"> | ||
| 1152 | <h1>Solution: Sorry - no good solution yet</h1> | ||
| 1153 | <ul> | ||
| 1154 | <li>Always Upload your Own Images</li> | ||
| 1155 | <li>Discussed in Glance Deployer Session Yesterday</li> | ||
| 1156 | <li>Next step - collecting full set of User Stories</li> | ||
| 1157 | <li>Hopefully we'll define common metadata</li> | ||
| 1158 | <li>Hopefully we'll define "correct" image lifecycle</li> | ||
| 1159 | </ul> | ||
| 1160 | </section> | ||
| 1161 | |||
| 1162 | <section class="slide level2"> | ||
| 1163 | <h1>Problem: Crazy Dependencies</h1> | ||
| 1164 | <ul> | ||
| 1165 | <li>shade started life depending on python-*client</li> | ||
| 1166 | <li>Giant dependency chain</li> | ||
| 1167 | <li>Users should ALWAYS use the latest shade</li> | ||
| 1168 | <li>Conflicting depends makes this hard</li> | ||
| 1169 | </ul> | ||
| 1170 | </section> | ||
| 1171 | |||
| 1172 | <section class="slide level2"> | ||
| 1173 | <h1>Solution: 'RESTification'</h1> | ||
| 1174 | <ul> | ||
| 1175 | <li>Have been hard at work moving to REST</li> | ||
| 1176 | <li>Done with heat, magnum, swift, glance, trove</li> | ||
| 1177 | <li>cinder and neutron done but unreleased</li> | ||
| 1178 | <li>nova, ironic, designate left</li> | ||
| 1179 | <li>Thanks Rosario and Slaweq!!!</li> | ||
| 1180 | </ul> | ||
| 1181 | <h2>BTW - The code is easier with REST</h2> | ||
| 1182 | </section> | ||
| 1183 | |||
| 1184 | <section class="slide level2"> | ||
| 1185 | <h1>Advanced Things</h1> | ||
| 1186 | <ul> | ||
| 1187 | <li>shade should DTRT 95% of the time</li> | ||
| 1188 | <li>Sometimes, you need to be extra advanced</li> | ||
| 1189 | <li>We want to suppor that too</li> | ||
| 1190 | </ul> | ||
| 1191 | </section> | ||
| 1192 | |||
| 1193 | <section class="slide level2"> | ||
| 1194 | <h1>Task Manager</h1> | ||
| 1195 | <pre> | ||
| 1196 | Manager zetta ran task ServerGet in 0.726951122284s | ||
| 1197 | </pre> | ||
| 1198 | <ul> | ||
| 1199 | <li>Every API operation is a Task() that is run by a TaskManager()</li> | ||
| 1200 | <li>Default shade TaskManager immediately executes the call</li> | ||
| 1201 | <li>nodepool passes in a threaded TaskManager to manage API throttling</li> | ||
| 1202 | <pre><code> | ||
| 1203 | cloud = shade.OpenStackCloud( | ||
| 1204 | cloud_config=cloud_config, | ||
| 1205 | manager=MyTaskManager()) | ||
| 1206 | </code></pre> | ||
| 1207 | </ul> | ||
| 1208 | </section> | ||
| 1209 | |||
| 1210 | <section class="slide level2"> | ||
| 1211 | <h1>list vs. get</h1> | ||
| 1212 | <ul> | ||
| 1213 | <li>get_server is a wrapper around list_servers</li> | ||
| 1214 | <li>*sometimes* we can push filter conditions to the cloud</li> | ||
| 1215 | <li>Actually done in SUPPORT of scaling</li> | ||
| 1216 | </ul> | ||
| 1217 | </section> | ||
| 1218 | |||
| 1219 | <section class="slide level2"> | ||
| 1220 | <h1>Caching and Rate Limiting</h1> | ||
| 1221 | <ul> | ||
| 1222 | <li>API Operations can be expensive</li> | ||
| 1223 | <li>Support grew from nodepool's needs</li> | ||
| 1224 | <li>shade uses dogpile.cache - default to NullCache</li> | ||
| 1225 | </li> | ||
| 1226 | </section> | ||
| 1227 | |||
| 1228 | <section class="slide level2"> | ||
| 1229 | <h1>Cache Config</h1> | ||
| 1230 | <h2>clouds.yaml</h2> | ||
| 1231 | <pre><code> | ||
| 1232 | cache: | ||
| 1233 | class: dogpile.cache.dbm | ||
| 1234 | expiration_time: 3600 | ||
| 1235 | arguments: | ||
| 1236 | filename: /home/mordred/.cache/openstack/shade.dbm | ||
| 1237 | expiration: | ||
| 1238 | server: 5 | ||
| 1239 | </code></pre> | ||
| 1240 | </section> | ||
| 1241 | |||
| 1242 | <section class="slide level2"> | ||
| 1243 | <h1>Caching Special Case</h1> | ||
| 1244 | <ul> | ||
| 1245 | <li>servers, ports and floating-ips have custome caching</li> | ||
| 1246 | <li>Specifically done for nodepool</li> | ||
| 1247 | <li>After RESTification, will migrate them to dogpile</li> | ||
| 1248 | <li>Two levels - caching and rate-limiting</li> | ||
| 1249 | </ul> | ||
| 1250 | </section> | ||
| 1251 | |||
| 1252 | <section class="slide level2"> | ||
| 1253 | <h1>What if you're not a Python developer?</h1> | ||
| 1254 | <p class='fragment'>Yes, we love you too</p> | ||
| 1255 | </section> | ||
| 1256 | |||
| 1257 | <section class="slide level2"> | ||
| 1258 | <h1>ansible</h1> | ||
| 1259 | <pre><code> | ||
| 1260 | - os_image: | ||
| 1261 | cloud: vexxhost | ||
| 1262 | name: centos-7 | ||
| 1263 | file: centos-7.qcow2 | ||
| 1264 | wait: true | ||
| 1265 | - os_server: | ||
| 1266 | cloud: vexxhost | ||
| 1267 | name: my-server | ||
| 1268 | flavor_ram: 1024 | ||
| 1269 | image: centos-7 | ||
| 1270 | wait: true | ||
| 1271 | </code></pre> | ||
| 1272 | </section> | ||
| 1273 | |||
| 1274 | <section class="slide level2"> | ||
| 1275 | <h1>ansible</h1> | ||
| 1276 | <h2>Add my keypair to 30 Regions in 13 clouds<h2> | ||
| 1277 | <pre><code> | ||
| 1278 | - os_keypair: | ||
| 1279 | cloud: "{{ item.cloud }}" | ||
| 1280 | region_name: "{{ item.region_name }}" | ||
| 1281 | name: mordred | ||
| 1282 | public_key_file: ~/.ssh/id_rsa.pub | ||
| 1283 | with-items: | ||
| 1284 | - {cloud: vexxhost, region_name: ca-ymq-1} | ||
| 1285 | - {cloud: ovh, region_name: SBG1} | ||
| 1286 | - {cloud: ovh, region_name: BHS1} | ||
| 1287 | - {cloud: ovh, region_name: GRA1} | ||
| 1288 | - {cloud: citycloud, region_name: Buf1} | ||
| 1289 | - {cloud: citycloud, region_name: La1} | ||
| 1290 | - {cloud: citycloud, region_name: Fra1} | ||
| 1291 | - {cloud: citycloud, region_name: Lon1} | ||
| 1292 | - {cloud: citycloud, region_name: Sto2} | ||
| 1293 | - {cloud: citycloud, region_name: Kna1} | ||
| 1294 | - {cloud: internap, region_name: ams01} | ||
| 1295 | - {cloud: internap, region_name: da01} | ||
| 1296 | - {cloud: internap, region_name: nyj01} | ||
| 1297 | - {cloud: internap, region_name: sin01} | ||
| 1298 | - {cloud: internap, region_name: sjc01} | ||
| 1299 | - {cloud: infracloud, region_name: vanilla} | ||
| 1300 | - {cloud: infracloud, region_name: chocolate} | ||
| 1301 | - {cloud: fuga, region_name: cystack} | ||
| 1302 | - {cloud: datacentred, region_name: sal01} | ||
| 1303 | - {cloud: clouda, region_name: regionOne} | ||
| 1304 | - {cloud: auro, region_name: van1} | ||
| 1305 | - {cloud: ustack, region_name: bj1} | ||
| 1306 | - {cloud: zetta, region_name: no-osl1} | ||
| 1307 | - {cloud: kiss, region_name: region1} | ||
| 1308 | - {cloud: rax, region_name: IAD} | ||
| 1309 | - {cloud: rax, region_name: ORD} | ||
| 1310 | - {cloud: rax, region_name: SYD} | ||
| 1311 | - {cloud: rax, region_name: LON} | ||
| 1312 | - {cloud: rax, region_name: DFW} | ||
| 1313 | - {cloud: rax, region_name: HKG} | ||
| 1314 | </code></pre> | ||
| 1315 | </section> | ||
| 1316 | |||
| 1317 | <section class="slide level2"> | ||
| 1318 | <h1>The Future: Pushing Back Into OpenStack APIs</h1> | ||
| 1319 | <ul> | ||
| 1320 | <li>Discussions later today</li> | ||
| 1321 | <li>Service Discovery</li> | ||
| 1322 | <li>Version Discovery</li> | ||
| 1323 | <li>Vendors Publishing Vendor Profile Documents</li> | ||
| 1324 | <li>Capabilities Discovery</li> | ||
| 1325 | <li>Connecting those to Interop Working Group</li> | ||
| 1326 | </ul> | ||
| 1327 | </section> | ||
| 1328 | |||
| 1329 | <section class="slide level2"> | ||
| 1330 | <h1>Thank You!</h1> | ||
| 1331 | </section> | ||
| 1332 | |||
| 1333 | </body> | ||
| 1334 | </html> | ||
| 1335 | |||
