diff options
| -rw-r--r-- | src/everything-you-need-to-know.rst | 1153 |
1 files changed, 1153 insertions, 0 deletions
diff --git a/src/everything-you-need-to-know.rst b/src/everything-you-need-to-know.rst new file mode 100644 index 0000000..f478d55 --- /dev/null +++ b/src/everything-you-need-to-know.rst | |||
| @@ -0,0 +1,1153 @@ | |||
| 1 | ========================================================= | ||
| 2 | Everything you need to know about using the OpenStack API | ||
| 3 | ========================================================= | ||
| 4 | |||
| 5 | This document contains a presentation in `presentty`_ format. If you want to | ||
| 6 | walk through it like a presentation, install `presentty` and run: | ||
| 7 | |||
| 8 | .. code:: bash | ||
| 9 | |||
| 10 | presentty doc/source/user/multi-cloud-demo.rst | ||
| 11 | |||
| 12 | The content is hopefully helpful even if it's not being narrated, so it's being | ||
| 13 | included in the `shade` docs. | ||
| 14 | |||
| 15 | .. _presentty: https://pypi.python.org/pypi/presentty | ||
| 16 | |||
| 17 | Everything you need to know about using the OpenStack API | ||
| 18 | ========================================================= | ||
| 19 | |||
| 20 | Who am I? | ||
| 21 | ========= | ||
| 22 | |||
| 23 | Monty Taylor | ||
| 24 | |||
| 25 | * OpenStack Infra Core | ||
| 26 | * irc: mordred | ||
| 27 | * twitter: @e_monty | ||
| 28 | |||
| 29 | This Talk is Free Software | ||
| 30 | ========================== | ||
| 31 | |||
| 32 | * http://git.inaugust.com/cgit/inaugust.com/tree/src/everything-you-need-to-know.rst | ||
| 33 | |||
| 34 | What are we going to talk about? | ||
| 35 | ================================ | ||
| 36 | |||
| 37 | * Overview of some terminology | ||
| 38 | * Discussion of SDKs | ||
| 39 | * 'Simple' example | ||
| 40 | * Step by step through in much more detail | ||
| 41 | |||
| 42 | * Auth | ||
| 43 | * The Catalog | ||
| 44 | * Service Types | ||
| 45 | * Version Discovery | ||
| 46 | * Actually doing things | ||
| 47 | * Microversions | ||
| 48 | |||
| 49 | Expected Ranting | ||
| 50 | ================ | ||
| 51 | |||
| 52 | * Fixed vs. Floating IPs | ||
| 53 | * Build your own images | ||
| 54 | * Boot-time scripting with cloud-init | ||
| 55 | |||
| 56 | Relevant Docs | ||
| 57 | ============= | ||
| 58 | |||
| 59 | * https://specs.openstack.org/openstack/api-wg/ | ||
| 60 | * https://service-types.openstack.org/ | ||
| 61 | * https://developer.openstack.org/api-ref/identity/ | ||
| 62 | * https://developer.openstack.org/api-ref/compute/ | ||
| 63 | * https://docs.openstack.org/os-client-config/latest/ | ||
| 64 | * https://docs.openstack.org/keystoneauth/latest/using-sessions.html | ||
| 65 | |||
| 66 | Cloud Terminology | ||
| 67 | ================= | ||
| 68 | |||
| 69 | Let's define a few terms, so that we can use them with ease: | ||
| 70 | |||
| 71 | * `cloud` - logically related collection of services | ||
| 72 | * `region` - completely independent subset of a given cloud | ||
| 73 | * `patron` - human who has an account | ||
| 74 | * `user` - account on a cloud | ||
| 75 | * `project` - logical collection of cloud resources | ||
| 76 | * `domain` - collection of users and projects | ||
| 77 | |||
| 78 | Cloud Terminology Relationships | ||
| 79 | =============================== | ||
| 80 | |||
| 81 | * A `cloud` has one or more `regions` | ||
| 82 | * A `patron` has one or more `users` | ||
| 83 | * A `patron` has one or more `projects` | ||
| 84 | * A `cloud` has one or more `domains` | ||
| 85 | * In a `cloud` with one `domain` it is named "default" | ||
| 86 | * Each `patron` may have their own `domain` | ||
| 87 | * Each `user` is in one `domain` | ||
| 88 | * Each `project` is in one `domain` | ||
| 89 | * A `user` has one or more `roles` on one or more `projects` | ||
| 90 | |||
| 91 | HTTP Sessions | ||
| 92 | ============= | ||
| 93 | |||
| 94 | * HTTP interactions are authenticated via keystone | ||
| 95 | * Authenticating returns a `token` | ||
| 96 | * An authenticated HTTP Session is shared across a `region` | ||
| 97 | |||
| 98 | Cloud Regions | ||
| 99 | ============= | ||
| 100 | |||
| 101 | A `cloud region` is the basic unit of REST interaction. | ||
| 102 | |||
| 103 | * A `cloud` has a `service catalog` | ||
| 104 | * The `service catalog` is returned in the `token` | ||
| 105 | * The `service catalog` lists `endpoint` for each `service` in each `region` | ||
| 106 | * A `region` is completely autonomous | ||
| 107 | |||
| 108 | Availability Zones | ||
| 109 | ================== | ||
| 110 | |||
| 111 | * If you have exposure to AWS - OpenStack Availability Zones are not what you | ||
| 112 | think they are. | ||
| 113 | * OpenStack Availability Zones are tagged groupings of hypervisor hosts, | ||
| 114 | storage nodes and network nodes. | ||
| 115 | |||
| 116 | Users, Projects and Domains | ||
| 117 | =========================== | ||
| 118 | |||
| 119 | In clouds with multiple domains, project and user names are | ||
| 120 | only unique within a region. | ||
| 121 | |||
| 122 | * Names require `domain` information for uniqueness. IDs do not. | ||
| 123 | * Providing `domain` information when not needed is fine. | ||
| 124 | * `project_name` requires `project_domain_name` or `project_domain_id` | ||
| 125 | * `project_id` does not | ||
| 126 | * `username` requires `user_domain_name` or `user_domain_id` | ||
| 127 | * `user_id` does not | ||
| 128 | |||
| 129 | Auth vs. Identity | ||
| 130 | ================= | ||
| 131 | |||
| 132 | * Both provided by the ``keystone`` service | ||
| 133 | * ``identity`` refers to CRUD operations on users, projects, etc. | ||
| 134 | * ``auth`` refers to a user getting a token and catalog | ||
| 135 | |||
| 136 | Keystone v2 vs. Keystone v3 | ||
| 137 | =========================== | ||
| 138 | |||
| 139 | * Two major versions of identity API | ||
| 140 | * v2 is deprecated/legacy | ||
| 141 | * ``project`` was called ``tenant`` in v2 | ||
| 142 | * ``domain`` did not exist in v2 | ||
| 143 | |||
| 144 | Confused Yet? | ||
| 145 | ============= | ||
| 146 | |||
| 147 | Awesome | ||
| 148 | |||
| 149 | SDKs | ||
| 150 | ==== | ||
| 151 | |||
| 152 | REST | ||
| 153 | ==== | ||
| 154 | |||
| 155 | * You can always do direct REST | ||
| 156 | * Auth and discovery are a bit of a pain | ||
| 157 | * Once you have those, it's all pretty easy | ||
| 158 | |||
| 159 | python | ||
| 160 | ====== | ||
| 161 | |||
| 162 | First: | ||
| 163 | |||
| 164 | * python-openstackclient ... CLI tool ``openstack`` | ||
| 165 | |||
| 166 | Five main libraries to be aware of: | ||
| 167 | |||
| 168 | * keystoneauth | ||
| 169 | * os-client-config | ||
| 170 | * shade | ||
| 171 | * python-openstacksdk | ||
| 172 | * python-*client | ||
| 173 | |||
| 174 | python-*client | ||
| 175 | ============== | ||
| 176 | |||
| 177 | * Per-service client libraries | ||
| 178 | * Avoid them. They're not written for you. They make things harder. | ||
| 179 | |||
| 180 | keystoneauth | ||
| 181 | ============ | ||
| 182 | |||
| 183 | * wrapper around python-requests that handles auth, catalog endpoint and | ||
| 184 | version discovery | ||
| 185 | * "REST" library | ||
| 186 | |||
| 187 | os-client-config | ||
| 188 | ================ | ||
| 189 | |||
| 190 | * Library to handle client configuration | ||
| 191 | * Can create python REST clients for you | ||
| 192 | * Used under the covers by shade, python-openstacksdk | ||
| 193 | and python-openstackclient | ||
| 194 | * Handles clouds.yaml files, environment variables and command line arguments | ||
| 195 | |||
| 196 | shade | ||
| 197 | ===== | ||
| 198 | |||
| 199 | * a task and end-user oriented Python library | ||
| 200 | * abstracts deployment differences | ||
| 201 | * designed for multi-cloud | ||
| 202 | * simple to use | ||
| 203 | * massive scale | ||
| 204 | |||
| 205 | * optional advanced features to handle 20k servers a day | ||
| 206 | |||
| 207 | * Initial logic/design extracted from nodepool | ||
| 208 | * Librified to re-use in Ansible | ||
| 209 | |||
| 210 | python-openstacksdk | ||
| 211 | =================== | ||
| 212 | |||
| 213 | * Object oriented interface to OpenStack REST APIs | ||
| 214 | * Just got adopted by the shade team | ||
| 215 | * Interface is going to break soon | ||
| 216 | * shade, python-openstacksdk and os-client-config are going to merge | ||
| 217 | * shade is safe to use - there will always be backwards compat for shade | ||
| 218 | |||
| 219 | Multi-Cloud Shade Example | ||
| 220 | ========================== | ||
| 221 | |||
| 222 | .. code:: python | ||
| 223 | |||
| 224 | import shade | ||
| 225 | |||
| 226 | # Initialize and turn on debug logging | ||
| 227 | shade.simple_logging(debug=True) | ||
| 228 | |||
| 229 | for cloud_name, region_name in [ | ||
| 230 | ('my-vexxhost', 'ca-ymq-1'), | ||
| 231 | ('my-citycloud', 'Buf1'), | ||
| 232 | ('my-internap', 'ams01')]: | ||
| 233 | # Initialize cloud | ||
| 234 | cloud = shade.openstack_cloud(cloud=cloud_name, region_name=region_name) | ||
| 235 | |||
| 236 | # Upload an image to the cloud | ||
| 237 | image = cloud.get_image('Fedora 24 (Cloud Edition) [2016-09-23]') | ||
| 238 | |||
| 239 | # Find a flavor with at least 512M of RAM | ||
| 240 | flavor = cloud.get_flavor_by_ram(512) | ||
| 241 | |||
| 242 | # Boot a server, wait for it to boot, and then do whatever is needed | ||
| 243 | # to get a public ip for it. | ||
| 244 | cloud.create_server( | ||
| 245 | 'my-server', image=image, flavor=flavor, wait=True, auto_ip=True) | ||
| 246 | |||
| 247 | It's Not Possible To Cover Everything That Does | ||
| 248 | =============================================== | ||
| 249 | |||
| 250 | Simpler Example | ||
| 251 | =============== | ||
| 252 | |||
| 253 | It still may not be possible to cover it all. | ||
| 254 | |||
| 255 | .. code-block:: python | ||
| 256 | |||
| 257 | import shade | ||
| 258 | |||
| 259 | # Initialize and turn on debug logging | ||
| 260 | shade.simple_logging(debug=True) | ||
| 261 | |||
| 262 | # Initialize cloud | ||
| 263 | cloud = shade.openstack_cloud(cloud='vexxhost') | ||
| 264 | |||
| 265 | # Upload an image to the cloud | ||
| 266 | image = cloud.get_image('Fedora 24 (Cloud Edition) [2016-09-23]') | ||
| 267 | |||
| 268 | # Find a flavor with at least 512M of RAM | ||
| 269 | flavor = cloud.get_flavor_by_ram(512) | ||
| 270 | |||
| 271 | # Boot a server, wait for it to boot, and then do whatever is needed | ||
| 272 | # to get a public ip for it. | ||
| 273 | cloud.create_server( | ||
| 274 | 'my-server', image=image, flavor=flavor, wait=True, auto_ip=True) | ||
| 275 | |||
| 276 | Get Some Stuff Installed | ||
| 277 | ======================== | ||
| 278 | |||
| 279 | .. code-block:: bash | ||
| 280 | |||
| 281 | virtualenv venv | ||
| 282 | source venv/bin/activate | ||
| 283 | pip install shade | ||
| 284 | |||
| 285 | Essential pieces of Auth Information | ||
| 286 | ==================================== | ||
| 287 | |||
| 288 | * auth_url | ||
| 289 | * password | ||
| 290 | * (username + (user_domain_name or user_domain_id)) or user_id) | ||
| 291 | * (project_name + (project_domain_name or project_domain_id)) or project_id | ||
| 292 | |||
| 293 | Note: It's important to know if you have a name or id for your user and | ||
| 294 | project. | ||
| 295 | |||
| 296 | I Lied | ||
| 297 | ====== | ||
| 298 | |||
| 299 | Essential pieces of Auth Information | ||
| 300 | ==================================== | ||
| 301 | |||
| 302 | * auth_url | ||
| 303 | * auth API version | ||
| 304 | * auth_type | ||
| 305 | |||
| 306 | If nobody tells you an auth_type, assume ``password`` | ||
| 307 | |||
| 308 | If nobody tells you an auth_url, look at | ||
| 309 | |||
| 310 | https://docs.openstack.org/os-client-config/latest/user/vendor-support.html | ||
| 311 | |||
| 312 | Exercise - Find Auth URL for known cloud | ||
| 313 | =========================================== | ||
| 314 | |||
| 315 | The cloud is Vexxhost. | ||
| 316 | |||
| 317 | Answer | ||
| 318 | ====== | ||
| 319 | |||
| 320 | https://auth.vexxhost.net | ||
| 321 | |||
| 322 | Version Discovery | ||
| 323 | ================= | ||
| 324 | |||
| 325 | * Each OpenStack service has a 'Version Discovery' document at its unversioned | ||
| 326 | root URL. We call this the 'Unversioned Discovery Document' | ||
| 327 | |||
| 328 | * Except for swift. (pending some work with discovery caching) | ||
| 329 | |||
| 330 | * Each OpenStack service ALSO has a 'Version Discovery' document at the root | ||
| 331 | of each Versioned URL. We call this the 'Versioned Discovery Document' | ||
| 332 | |||
| 333 | * Version Discovery documents should not require Authentication | ||
| 334 | |||
| 335 | * If they do on your cloud, your cloud is broken, please file a bug | ||
| 336 | |||
| 337 | Exercise #2 - Find Auth API Version from Auth URL | ||
| 338 | ================================================= | ||
| 339 | |||
| 340 | :: | ||
| 341 | |||
| 342 | curl -i https://auth.vexxhost.net | ||
| 343 | |||
| 344 | Auth Version Discovery Response | ||
| 345 | =============================== | ||
| 346 | |||
| 347 | :: | ||
| 348 | |||
| 349 | { | ||
| 350 | "versions": { | ||
| 351 | "values": [ | ||
| 352 | { | ||
| 353 | "status": "stable", | ||
| 354 | "updated": "2017-02-22T00:00:00Z", | ||
| 355 | "media-types": [ | ||
| 356 | { | ||
| 357 | "base": "application/json", | ||
| 358 | "type": "application/vnd.openstack.identity-v3+json" | ||
| 359 | } | ||
| 360 | ], | ||
| 361 | "id": "v3.8", | ||
| 362 | "links": [ | ||
| 363 | { | ||
| 364 | "href": "https://auth.vexxhost.net/v3/", | ||
| 365 | "rel": "self" | ||
| 366 | } | ||
| 367 | ] | ||
| 368 | }, | ||
| 369 | |||
| 370 | Auth Version Discovery Response Part 2 | ||
| 371 | ====================================== | ||
| 372 | |||
| 373 | :: | ||
| 374 | { | ||
| 375 | "status": "deprecated", | ||
| 376 | "updated": "2016-08-04T00:00:00Z", | ||
| 377 | "media-types": [ | ||
| 378 | { | ||
| 379 | "base": "application/json", | ||
| 380 | "type": "application/vnd.openstack.identity-v2.0+json" | ||
| 381 | } | ||
| 382 | ], | ||
| 383 | "id": "v2.0", | ||
| 384 | "links": [ | ||
| 385 | { | ||
| 386 | "href": "https://auth.vexxhost.net/v2.0/", | ||
| 387 | "rel": "self" | ||
| 388 | }, | ||
| 389 | { | ||
| 390 | "href": "https://docs.openstack.org/", | ||
| 391 | "type": "text/html", | ||
| 392 | "rel": "describedby" | ||
| 393 | } | ||
| 394 | ] | ||
| 395 | } | ||
| 396 | ] | ||
| 397 | } | ||
| 398 | } | ||
| 399 | |||
| 400 | Versioned Discovery Document | ||
| 401 | ============================ | ||
| 402 | |||
| 403 | Sometimes a cloud gives you a versioned auth_url. | ||
| 404 | |||
| 405 | :: | ||
| 406 | |||
| 407 | curl -i https://auth.vexxhost.net/v3 | ||
| 408 | |||
| 409 | Auth Version Discovery Resonse | ||
| 410 | ============================== | ||
| 411 | |||
| 412 | :: | ||
| 413 | |||
| 414 | { | ||
| 415 | "version": { | ||
| 416 | "status": "stable", | ||
| 417 | "updated": "2017-02-22T00:00:00Z", | ||
| 418 | "media-types": [ | ||
| 419 | { | ||
| 420 | "base": "application/json", | ||
| 421 | "type": "application/vnd.openstack.identity-v3+json" | ||
| 422 | } | ||
| 423 | ], | ||
| 424 | "id": "v3.8", | ||
| 425 | "links": [ | ||
| 426 | { | ||
| 427 | "href": "https://auth.vexxhost.net/v3/", | ||
| 428 | "rel": "self" | ||
| 429 | } | ||
| 430 | ] | ||
| 431 | } | ||
| 432 | } | ||
| 433 | |||
| 434 | Finding a Better Version | ||
| 435 | ======================== | ||
| 436 | |||
| 437 | Sometimes a cloud gives you a v2 versioned auth_url. | ||
| 438 | |||
| 439 | :: | ||
| 440 | |||
| 441 | curl -i https://auth.vexxhost.net/v2.0 | ||
| 442 | |||
| 443 | **ALWAYS** prefer v3 auth if it's available. | ||
| 444 | |||
| 445 | Old Auth Version Discovery Resonse | ||
| 446 | ================================== | ||
| 447 | |||
| 448 | :: | ||
| 449 | |||
| 450 | { | ||
| 451 | "version": { | ||
| 452 | "status": "deprecated", | ||
| 453 | "updated": "2016-08-04T00:00:00Z", | ||
| 454 | "media-types": [ | ||
| 455 | { | ||
| 456 | "base": "application/json", | ||
| 457 | "type": "application/vnd.openstack.identity-v2.0+json" | ||
| 458 | } | ||
| 459 | ], | ||
| 460 | "id": "v2.0", | ||
| 461 | "links": [ | ||
| 462 | { | ||
| 463 | "href": "https://auth.vexxhost.net/v2.0/", | ||
| 464 | "rel": "self" | ||
| 465 | }, | ||
| 466 | { | ||
| 467 | "href": "https://docs.openstack.org/", | ||
| 468 | "type": "text/html", | ||
| 469 | "rel": "describedby" | ||
| 470 | } | ||
| 471 | ] | ||
| 472 | } | ||
| 473 | } | ||
| 474 | |||
| 475 | Status Deprecated | ||
| 476 | ================= | ||
| 477 | |||
| 478 | Strip the trailing ``v.*`` portion from the URL and try again. | ||
| 479 | |||
| 480 | :: | ||
| 481 | |||
| 482 | { | ||
| 483 | "version": { | ||
| 484 | "status": "deprecated", | ||
| 485 | |||
| 486 | Strip the trailing ``v.*`` portion from the URL and try again. | ||
| 487 | |||
| 488 | If ``v3`` is not available, complain to someone. Keystone v3 api is considered | ||
| 489 | stable as of February 20, 2013. | ||
| 490 | |||
| 491 | Isn't this fun? | ||
| 492 | =============== | ||
| 493 | |||
| 494 | To Domain or Not To Domain | ||
| 495 | ========================== | ||
| 496 | |||
| 497 | In ``v3``: | ||
| 498 | |||
| 499 | * Project Names and User Names are only unique within a domain | ||
| 500 | * If you don't have domain info, assume ``domain_id`` is ``default`` | ||
| 501 | |||
| 502 | In ``v2``: | ||
| 503 | |||
| 504 | * No such thing as domains | ||
| 505 | * Projects are called "tenant" | ||
| 506 | |||
| 507 | Essential pieces of Auth Information | ||
| 508 | ==================================== | ||
| 509 | |||
| 510 | * auth_url - https://auth.vexxhost.net | ||
| 511 | * auth version - ``3`` | ||
| 512 | * versioned auth endpoint - https://auth.vexxhost.net/v3 | ||
| 513 | |||
| 514 | * username - osdn-user-1 | ||
| 515 | * user domain id - ``default`` | ||
| 516 | * project_name - osdn-project-1 | ||
| 517 | * project domain id = ``default`` | ||
| 518 | * password - XXXXXXXX | ||
| 519 | |||
| 520 | Now we can authenticate!!! | ||
| 521 | ========================== | ||
| 522 | |||
| 523 | :: | ||
| 524 | |||
| 525 | curl -g -i -X POST https://auth.vexxhost.net/v3/auth/tokens -H "Content-Type: application/json" -H "Accept: application/json" -d '{"auth": {"identity": {"methods": ["password"], "password": {"user": {"domain": {"id": "default"}, "name": "osdn-user-1", "password": "XXXXXXXX"}}},"scope": {"project": {"domain": {"id": "default"}, "name": "osdn-project-1"}}}}' | ||
| 526 | |||
| 527 | What, you can't read that? | ||
| 528 | ========================== | ||
| 529 | |||
| 530 | :: | ||
| 531 | |||
| 532 | curl -g -i -X POST https://auth.vexxhost.net/v3/auth/tokens \ | ||
| 533 | -H "Content-Type: application/json" \ | ||
| 534 | -H "Accept: application/json" -d '{ | ||
| 535 | "auth": { | ||
| 536 | "identity": { | ||
| 537 | "methods": ["password"], | ||
| 538 | "password": { | ||
| 539 | "user": { | ||
| 540 | "domain": {"id": "default"}, | ||
| 541 | "name": "osdn-user-1", | ||
| 542 | "password": "XXXXXXXX"}}}, | ||
| 543 | "scope": { | ||
| 544 | "project": { | ||
| 545 | "domain": {"id": "default"}, | ||
| 546 | "name": "osdn-project-1"}}}}' | ||
| 547 | |||
| 548 | Authentication Response | ||
| 549 | ======================= | ||
| 550 | |||
| 551 | Readable version of payload: http://paste.openstack.org/raw/623947/ | ||
| 552 | |||
| 553 | :: | ||
| 554 | |||
| 555 | HTTP/1.1 201 Created | ||
| 556 | Date: Tue, 17 Oct 2017 23:16:05 GMT | ||
| 557 | Server: Apache/2.4.6 (CentOS) | ||
| 558 | X-Subject-Token: gAAAAABZ5o81tyDsyJMXl6hVcVOqHgzKQ2WmpvepCSr2NWYM1D97VoaBy-i5OLT8-BbkWBZJq_aqrt03eutp2eEpORI-V4CYpYcWBDkR5jLNfq2gD-TDB9lzvRo7rHKu-PWSLIxEF7whsFJ8bVGDPMN4yc_ZwgfWcR13GxAKutU9_rzR9Gvewjg | ||
| 559 | Vary: X-Auth-Token | ||
| 560 | x-openstack-request-id: req-29d8c4e6-1924-42e9-8efa-4f154e813ee6 | ||
| 561 | Content-Length: 11696 | ||
| 562 | Content-Type: application/json | ||
| 563 | |||
| 564 | {"token": {"is_domain": false, "methods": ["password"], "roles": [{"id": "fd6d2130b7784b82aa6b49fd5901f70b", "name": "Member"}], "expires_at": "2017-10-18T23:16:05.000000Z", "project": {"domain": {"id": "default", "name": "Default"}, "id": "bbb1e479a9d04f34941470f37c7a0ecb", "name": "osdn-project-1"}, "catalog": [{"endpoints": [{"region_id": "ca-ymq-1", "url": "https://key-manager-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "522041f846934310b928a6afab47241e"}, {"region_id": "ca-ymq-1", "url": "https://key-manager-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "660a742372554b5581c1f4870d4d42cf"}, {"region_id": "ca-ymq-1", "url": "https://key-manager-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "c1c32be0de8441eea4306b8c22442ba3"}], "type": "key-manager", "id": "023de54c09654931856403e708b60a22", "name": "barbican"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://container-infra-ca-ymq-1.vexxhost.net/v1", "region": "ca-ymq-1", "interface": "public", "id": "289f7dcf096743fb9a17924bd598e716"}, {"region_id": "ca-ymq-1", "url": "https://container-infra-ca-ymq-1.vexxhost.net/v1", "region": "ca-ymq-1", "interface": "admin", "id": "61b6d283ef4b419a8ad23fc53dea70df"}, {"region_id": "ca-ymq-1", "url": "https://container-infra-ca-ymq-1.vexxhost.net/v1", "region": "ca-ymq-1", "interface": "internal", "id": "e1e7c79ce7834ec0aa74308326e2f96c"}], "type": "container-infra", "id": "041eac2489bb495b8a900c40b93b2065", "name": "magnum"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://orchestration-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "203fd4e466b44569aa9ab8c78ef55bad"}, {"region_id": "ca-ymq-1", "url": "https://orchestration-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "da3d087e0c724338ba12c9a1168ef80c"}, {"region_id": "ca-ymq-1", "url": "https://orchestration-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "f0a311cb5dbf4ae788670107a3433ac2"}], "type": "orchestration", "id": "0e852aec60e6412b88b066e62c2cd940", "name": "heat"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://object-storage-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "4f1fafb25e58421e91a2139dc0382c53"}, {"region_id": "ca-ymq-1", "url": "https://object-storage-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "5808ab12037f4ab49c37cba0ac9cd58e"}, {"region_id": "ca-ymq-1", "url": "https://object-storage-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "a680b7674b3b430c9f5e008f72f3dfe4"}], "type": "s3", "id": "13f4cf29c7394a7a801d8aeacca24378", "name": "swift_s3"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "http://dns.vexxhost.net/", "region": "ca-ymq-1", "interface": "internal", "id": "0bba70ede2ef4bc0a998ed73110406cb"}, {"region_id": "ca-ymq-1", "url": "http://dns.vexxhost.net/", "region": "ca-ymq-1", "interface": "public", "id": "25ee42ace1ad4707b485494baa5d4693"}, {"region_id": "ca-ymq-1", "url": "http://dns.vexxhost.net/", "region": "ca-ymq-1", "interface": "admin", "id": "cf817bfde96d4aa6807cdb4be21eca3b"}], "type": "dns", "id": "1b6455f4855e44bd85be449258340a02", "name": "designate"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://identity-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "8df18f47fcdc4c348d521d4724a5b7ac"}, {"region_id": "ca-ymq-1", "url": "https://auth.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "c0dd9f5f8db248b093d6735b167e1af6"}, {"region_id": "ca-ymq-1", "url": "https://auth.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "c8505f07c349413aa7cd61d42337af99"}], "type": "identity", "id": "1ca1ba37600a436185c317bef6d88c36", "name": "keystone"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://placement-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "299df431ac7942c18e2137613d8e03d8"}, {"region_id": "ca-ymq-1", "url": "https://placement-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "bec896cde16646d6a3b56cff997d08cc"}, {"region_id": "ca-ymq-1", "url": "https://placement-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "ce70c7029b6a45b78e008bc833187559"}], "type": "placement", "id": "37077d282f2b4961ad65f9fb87f58789", "name": "placement"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "4babd2f2b8d842e4b2303468fbf5d3ac"}, {"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "6b3ddcf427e04182a7aa4e24d4649581"}, {"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "e8e1eb90f7394f5999aec5c8f8c75c88"}], "type": "volume", "id": "40686c5446374c2b92771e67249521b3", "name": "cinder"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://image-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "218d9460bd6e4eabb32b980fc580a26a"}, {"region_id": "ca-ymq-1", "url": "https://image-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "21a2898a0fcf4ec783974cf75d774916"}, {"region_id": "ca-ymq-1", "url": "https://image-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "8842c03d2c51449ebf9ff36778cf17c1"}], "type": "image", "id": "49e5dc4cfe294aa0971e797d3bb1db20", "name": "glance"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://cloudformation-ca-ymq-1.vexxhost.net/v1", "region": "ca-ymq-1", "interface": "admin", "id": "83fbacf0d0014a27955384fb8632de4c"}, {"region_id": "ca-ymq-1", "url": "https://cloudformation-ca-ymq-1.vexxhost.net/v1", "region": "ca-ymq-1", "interface": "internal", "id": "9308a40f3a6f4dff9d20afa2dfa6b186"}, {"region_id": "ca-ymq-1", "url": "https://cloudformation-ca-ymq-1.vexxhost.net/v1", "region": "ca-ymq-1", "interface": "public", "id": "e5cb7e4e6f3440a386d397ec7e00ca44"}], "type": "cloudformation", "id": "4e77820be3494d26a0c39301082da4d7", "name": "heat-cfn"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://data-processing-ca-ymq-1.vexxhost.net/v1.1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "5fdfd118a3d6460ab45c1995ca21b7f1"}, {"region_id": "ca-ymq-1", "url": "https://data-processing-ca-ymq-1.vexxhost.net/v1.1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "ab9e70b4fde943e49d92c41d2f0892d9"}, {"region_id": "ca-ymq-1", "url": "https://data-processing-ca-ymq-1.vexxhost.net/v1.1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "cfa16dc27b82420a8cf7db5ea79aa3dd"}], "type": "data-processing", "id": "523b8e9f4bd44e51aec65c524c953c32", "name": "sahara"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://network-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "37860b492dd947daa738f461b9084d2a"}, {"region_id": "ca-ymq-1", "url": "https://network-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "7a095734e4984cc7b8ac581aa6131f23"}, {"region_id": "ca-ymq-1", "url": "https://network-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "96357df3d6694477b0ad17fef6091210"}], "type": "network", "id": "98f33898880441ddb91522bac15410b5", "name": "neutron"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v2/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "01fdd8e07ca74c9daf80a8b66dcc8bf6"}, {"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v2/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "a25efaf48347441a8d36ce302f31d527"}, {"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v2/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "ceea6017e14e4b549882b6fe359d07e0"}], "type": "volumev2", "id": "9ec8ed2478e44b368f51dd71a6f2759c", "name": "cinderv2"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://compute-ca-ymq-1.vexxhost.net/v2.1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "2f582f99db974766af7548dda56c3b50"}, {"region_id": "ca-ymq-1", "url": "https://compute-ca-ymq-1.vexxhost.net/v2.1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "39e28fa99b69466195aad1fbfb610323"}, {"region_id": "ca-ymq-1", "url": "https://compute-ca-ymq-1.vexxhost.net/v2.1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "4d38fa91197e4712a2f2d3f89fcd7dad"}], "type": "compute", "id": "a30d9b8a170144f0a7bca3ce028c9ed3", "name": "nova"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v3/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "5d9aa667f2fb4c83bf14ee8ae52b541a"}, {"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v3/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "96bcaf12b54d4060bc9973ded5ce4093"}, {"region_id": "ca-ymq-1", "url": "https://block-storage-ca-ymq-1.vexxhost.net/v3/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "ac9138596d3942babe1f9241f93a5e04"}], "type": "volumev3", "id": "a5ae83af15b146559711905c6531c721", "name": "cinderv3"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://octavia-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "internal", "id": "39830aba2eea44a3a432ea0bd219c1ab"}, {"region_id": "ca-ymq-1", "url": "https://octavia-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "public", "id": "5883ae0fb85842c5aca05ed51327ac35"}, {"region_id": "ca-ymq-1", "url": "https://octavia-ca-ymq-1.vexxhost.net", "region": "ca-ymq-1", "interface": "admin", "id": "80bd3d21df274c43ac8457aa2230598f"}], "type": "octavia", "id": "b6a1520b90a146f4a96321960e7a243a", "name": "octavia"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "http://secure.vexxhost.com/console/api", "region": "ca-ymq-1", "interface": "public", "id": "156bf3730b834d2bacf7eff6c542f394"}], "type": "dashboard", "id": "b7bb9d5476c649f483dfbcb49359c17b", "name": "cloudconsole"}, {"endpoints": [{"region_id": "ca-ymq-1", "url": "https://object-storage-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "admin", "id": "20b24181722b49a3983d17d42147a22c"}, {"region_id": "ca-ymq-1", "url": "https://object-storage-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "public", "id": "79fa33ff42ec45118ae8b36789fcb8ae"}, {"region_id": "ca-ymq-1", "url": "https://object-storage-ca-ymq-1.vexxhost.net/v1/bbb1e479a9d04f34941470f37c7a0ecb", "region": "ca-ymq-1", "interface": "internal", "id": "b073b767f10d44f895d9d14fbc3e3d6b"}], "type": "object-store", "id": "c1efec5454ec49b1b016721938401182", "name": "swift"}], "user": {"password_expires_at": null, "domain": {"id": "default", "name": "Default"}, "id": "bc2260d5b7cb40ff8270043fd7af3a08", "name": "osdn-user-1"}, "audit_ids": ["6bu2KObmSwGfO2gsIcmPNw"], "issued_at": "2017-10-17T23:16:05.000000Z"}} | ||
| 565 | |||
| 566 | Authentication Response Readable Version | ||
| 567 | ======================================== | ||
| 568 | |||
| 569 | http://paste.openstack.org/raw/623947/ | ||
| 570 | |||
| 571 | Listing Images | ||
| 572 | ============== | ||
| 573 | |||
| 574 | * Find 'image' Endpoint from the Catalog | ||
| 575 | * Find image api version | ||
| 576 | * Make API call | ||
| 577 | |||
| 578 | Consuming Service Catalog | ||
| 579 | ========================= | ||
| 580 | |||
| 581 | https://specs.openstack.org/openstack/api-wg/guidelines/consuming-catalog.html | ||
| 582 | |||
| 583 | Docs on version discovery and cloud profile: | ||
| 584 | |||
| 585 | * https://review.openstack.org/#/c/459869 Add guideline describing a cloud profile document | ||
| 586 | * https://review.openstack.org/#/c/459710 Add guidelines on Version Discovery | ||
| 587 | * https://review.openstack.org/#/c/459405 Add document describing consuming version discovery | ||
| 588 | |||
| 589 | Find Endpoint | ||
| 590 | ============= | ||
| 591 | |||
| 592 | * Most important piece of info: ``service_type`` (``type`` in catalog) | ||
| 593 | * ``service_name`` or name carries no meaning | ||
| 594 | |||
| 595 | Service Types Authority | ||
| 596 | ======================= | ||
| 597 | |||
| 598 | https://service-types.openstack.org | ||
| 599 | |||
| 600 | * Registry of known service types | ||
| 601 | * Listing of historical aliases for those service types | ||
| 602 | * https://service-types.openstack.org/service-types.json | ||
| 603 | * Not release versoined - most current file is always accurate | ||
| 604 | * Python library: os-service-types | ||
| 605 | |||
| 606 | Find Image Endpoint | ||
| 607 | =================== | ||
| 608 | |||
| 609 | :: | ||
| 610 | |||
| 611 | {'endpoints': [ | ||
| 612 | {'id': '218d9460bd6e4eabb32b980fc580a26a', | ||
| 613 | 'interface': 'internal', | ||
| 614 | 'region': 'ca-ymq-1', | ||
| 615 | 'region_id': 'ca-ymq-1', | ||
| 616 | 'url': 'https://image-ca-ymq-1.vexxhost.net'}, | ||
| 617 | {'id': '21a2898a0fcf4ec783974cf75d774916', | ||
| 618 | 'interface': 'admin', | ||
| 619 | 'region': 'ca-ymq-1', | ||
| 620 | 'region_id': 'ca-ymq-1', | ||
| 621 | 'url': 'https://image-ca-ymq-1.vexxhost.net'}, | ||
| 622 | {'id': '8842c03d2c51449ebf9ff36778cf17c1', | ||
| 623 | 'interface': 'public', | ||
| 624 | 'region': 'ca-ymq-1', | ||
| 625 | 'region_id': 'ca-ymq-1', | ||
| 626 | 'url': 'https://image-ca-ymq-1.vexxhost.net'}], | ||
| 627 | 'id': '49e5dc4cfe294aa0971e797d3bb1db20', | ||
| 628 | 'name': 'glance', | ||
| 629 | 'type': 'image'}, | ||
| 630 | |||
| 631 | Endpoint Interface | ||
| 632 | ================== | ||
| 633 | |||
| 634 | * public - Public/External API access - default value | ||
| 635 | * internal - Internal network API access | ||
| 636 | * admin - Historical - was used for keystone - not used anymore | ||
| 637 | |||
| 638 | Endpoint Region Name | ||
| 639 | ==================== | ||
| 640 | |||
| 641 | * If there is more than one region, region_name must be specified | ||
| 642 | * If there is only one, it can be omitted | ||
| 643 | |||
| 644 | Example with more than one region: | ||
| 645 | |||
| 646 | http://paste.openstack.org/raw/623900/ | ||
| 647 | |||
| 648 | Endpoints Found | ||
| 649 | =============== | ||
| 650 | |||
| 651 | * cloud=vexxhost1,service_type=image | ||
| 652 | |||
| 653 | https://image-ca-ymq-1.vexxhost.net | ||
| 654 | |||
| 655 | * cloud=citycloud1,service_type=image,region_name=Sto2 | ||
| 656 | |||
| 657 | https://sto2.citycloud.com:9292 | ||
| 658 | |||
| 659 | Finding Image API Version | ||
| 660 | ========================= | ||
| 661 | |||
| 662 | :: | ||
| 663 | |||
| 664 | curl -i https://image-ca-ymq-1.vexxhost.net | ||
| 665 | |||
| 666 | http://paste.openstack.org/raw/623901/ | ||
| 667 | |||
| 668 | * CURRENT - Best current version | ||
| 669 | |||
| 670 | https://image-ca-ymq-1.vexxhost.net/v2/ | ||
| 671 | |||
| 672 | Listing Images | ||
| 673 | ============== | ||
| 674 | |||
| 675 | * Send value of X-Subject-Token from auth request in X-Auth-Token | ||
| 676 | |||
| 677 | :: | ||
| 678 | |||
| 679 | curl -i -X GET https://image-ca-ymq-1.vexxhost.net/v2/images \ | ||
| 680 | -H "Accept: application/json" \ | ||
| 681 | -H "X-Auth-Token: gAAAAABZ5qpnytYif9wk-4fsqvgm3Ik81WQl_L4tdlfka7Vr4b-EG0w7QGF-JU_T4zkJsuql4XYSU_9epUnx-aE_UeKMMdaKAyecGG9om6TR3CA6yeeHbMJBTVFfdxvW-QFA76_JXoibCvXGIcKlpotK01BBl3DG5qYNxUFkSquk5cIQh-w63AY" | ||
| 682 | |||
| 683 | :: | ||
| 684 | |||
| 685 | HTTP/1.1 200 OK | ||
| 686 | Content-Length: 24153 | ||
| 687 | Content-Type: application/json | ||
| 688 | X-Openstack-Request-Id: req-8a602280-1bba-46b4-9406-97addcdd9b6c | ||
| 689 | Date: Wed, 18 Oct 2017 01:12:43 GMT | ||
| 690 | |||
| 691 | * Content: http://paste.openstack.org/raw/623902/ | ||
| 692 | * Note pagination links | ||
| 693 | |||
| 694 | Getting Auth information | ||
| 695 | ======================== | ||
| 696 | |||
| 697 | * Download a clouds.yaml file from horizon | ||
| 698 | * Download an legacy openrc file from horizon | ||
| 699 | * Investigate dashboard | ||
| 700 | * Carrier pigeon | ||
| 701 | |||
| 702 | Sometimes the files are wrong and you have to apply the earlier rules. | ||
| 703 | |||
| 704 | Incorrect openrc file (horizon bug) | ||
| 705 | =================================== | ||
| 706 | |||
| 707 | This is downloaded from my account. Who can spot the problems? | ||
| 708 | |||
| 709 | :: | ||
| 710 | |||
| 711 | export OS_AUTH_URL=https://auth.vexxhost.net/v2.0 | ||
| 712 | export OS_PROJECT_ID=bbb1e479a9d04f34941470f37c7a0ecb | ||
| 713 | export OS_PROJECT_NAME="osdn-project-1" | ||
| 714 | export OS_USER_DOMAIN_NAME="None" | ||
| 715 | export OS_USERNAME="osdn-user-1" | ||
| 716 | export OS_REGION_NAME="ca-ymq-1" | ||
| 717 | export OS_INTERFACE=public | ||
| 718 | export OS_IDENTITY_API_VERSION=3 | ||
| 719 | |||
| 720 | Put the info in a clouds.yaml file | ||
| 721 | ================================== | ||
| 722 | |||
| 723 | clouds.yaml | ||
| 724 | =========== | ||
| 725 | |||
| 726 | Information about the clouds you want to connect to is stored in a file | ||
| 727 | called `clouds.yaml`. | ||
| 728 | |||
| 729 | `clouds.yaml` can be in your homedir: `~/.config/openstack/clouds.yaml` | ||
| 730 | or system-wide: `/etc/openstack/clouds.yaml`. | ||
| 731 | |||
| 732 | Information in your homedir, if it exists, takes precedence. | ||
| 733 | |||
| 734 | Full docs on `clouds.yaml` are at | ||
| 735 | https://docs.openstack.org/developer/os-client-config/ | ||
| 736 | |||
| 737 | What about Mac and Windows? | ||
| 738 | =========================== | ||
| 739 | |||
| 740 | `USER_CONFIG_DIR` is different on Linux, OSX and Windows. | ||
| 741 | |||
| 742 | * Linux: `~/.config/openstack` | ||
| 743 | * OSX: `~/Library/Application Support/openstack` | ||
| 744 | * Windows: `C:\\Users\\USERNAME\\AppData\\Local\\OpenStack\\openstack` | ||
| 745 | |||
| 746 | `SITE_CONFIG_DIR` is different on Linux, OSX and Windows. | ||
| 747 | |||
| 748 | * Linux: `/etc/openstack` | ||
| 749 | * OSX: `/Library/Application Support/openstack` | ||
| 750 | * Windows: `C:\\ProgramData\\OpenStack\\openstack` | ||
| 751 | |||
| 752 | Config Terminology | ||
| 753 | ================== | ||
| 754 | |||
| 755 | For multi-cloud, think of two types: | ||
| 756 | |||
| 757 | * `profile` - Facts about the `cloud` that are true for everyone | ||
| 758 | * `cloud` - Information specific to a given `user` | ||
| 759 | |||
| 760 | Apologies for the use of `cloud` twice. | ||
| 761 | |||
| 762 | Example clouds.yaml file | ||
| 763 | ======================== | ||
| 764 | |||
| 765 | .. code-block:: yaml | ||
| 766 | |||
| 767 | clouds: | ||
| 768 | vexxhost1: | ||
| 769 | identity_api_version: 3 | ||
| 770 | auth: | ||
| 771 | auth_url: https://auth.vexxhost.net | ||
| 772 | user_domain_id: default | ||
| 773 | project_domain_id: default | ||
| 774 | project_name: osdn-project-1 | ||
| 775 | username: osdn-user-1 | ||
| 776 | password: XXXXXXXX | ||
| 777 | |||
| 778 | Vexxhost is known | ||
| 779 | ================= | ||
| 780 | |||
| 781 | .. code-block:: yaml | ||
| 782 | |||
| 783 | clouds: | ||
| 784 | vexxhost1: | ||
| 785 | identity_api_version: 3 | ||
| 786 | profile: vexxhost | ||
| 787 | auth: | ||
| 788 | user_domain_id: default | ||
| 789 | project_domain_id: default | ||
| 790 | project_name: osdn-project-1 | ||
| 791 | username: osdn-user-1 | ||
| 792 | password: XXXXXXXX | ||
| 793 | |||
| 794 | More than one cloud | ||
| 795 | =================== | ||
| 796 | |||
| 797 | Yes- I created the same user with the same password on CityCloud: | ||
| 798 | |||
| 799 | .. code-block:: yaml | ||
| 800 | |||
| 801 | clouds: | ||
| 802 | citycloud1: | ||
| 803 | profile: citycloud | ||
| 804 | auth: | ||
| 805 | username: osdn-user-1 | ||
| 806 | password: XXXXXXXX | ||
| 807 | project_name: osdn-project-1 | ||
| 808 | user_domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 809 | project_domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
| 810 | vexxhost1: | ||
| 811 | profile: vexxhost | ||
| 812 | auth: | ||
| 813 | user_domain_id: default | ||
| 814 | project_domain_id: default | ||
| 815 | project_name: osdn-project-1 | ||
| 816 | username: osdn-user-1 | ||
| 817 | password: XXXXXXXX | ||
| 818 | |||
| 819 | Quick note about SSL | ||
| 820 | ==================== | ||
| 821 | |||
| 822 | You can disable SSL verification:: | ||
| 823 | |||
| 824 | unitedstack: | ||
| 825 | profile: unitedstack | ||
| 826 | verify: False | ||
| 827 | |||
| 828 | You can set specific SSL arguments:: | ||
| 829 | |||
| 830 | openstackci-infracloud-vanilla: | ||
| 831 | region_name: RegionOne | ||
| 832 | cacert: /home/nodepool/.config/openstack/infracloud_vanilla_cacert.pem | ||
| 833 | auth: | ||
| 834 | auth_url: https://controller00.vanilla.ic.openstack.org:5000 | ||
| 835 | username: openstackci | ||
| 836 | |||
| 837 | Auth per cloud, select per region | ||
| 838 | ================================= | ||
| 839 | |||
| 840 | In general, the thing you need to know is: | ||
| 841 | |||
| 842 | * Configure authentication per `cloud` | ||
| 843 | * Select config to use by `cloud` and `region` | ||
| 844 | |||
| 845 | Environment Variables and Simple Usage | ||
| 846 | ====================================== | ||
| 847 | |||
| 848 | * Environment variables starting with `OS_` go into a cloud called `envvars` | ||
| 849 | * If you only have one cloud, you don't have to specify it | ||
| 850 | * `OS_CLOUD` and `OS_REGION_NAME` are default values for | ||
| 851 | `cloud` and `region_name` | ||
| 852 | |||
| 853 | Easier version of the above REST | ||
| 854 | ================================ | ||
| 855 | |||
| 856 | * What you should be able to do | ||
| 857 | |||
| 858 | .. code-block:: python | ||
| 859 | |||
| 860 | import os_client_config | ||
| 861 | client = os_client_config.make_rest_client('image', cloud='vexxhost1') | ||
| 862 | print(client.get('/images').json()) | ||
| 863 | |||
| 864 | * There's a bug with make_rest_client and glance - I'll get it fixed this week. | ||
| 865 | Workaround: | ||
| 866 | |||
| 867 | .. code-block:: python | ||
| 868 | |||
| 869 | import os_client_config | ||
| 870 | from keystoneauth1 import adapter | ||
| 871 | config = os_client_config.OpenStackConfig().get_one_cloud(cloud='vexxhost1') | ||
| 872 | client = adapter.Adapter( | ||
| 873 | config.get_session(), service_type='image', version='latest') | ||
| 874 | print(client.get('/images').json()) | ||
| 875 | |||
| 876 | Sessions and Adapters | ||
| 877 | ===================== | ||
| 878 | |||
| 879 | * A Session is an Authenticated HTTP connection to a cloud | ||
| 880 | |||
| 881 | .. code-block:: python | ||
| 882 | |||
| 883 | config = os_client_config.OpenStackConfig().get_one_cloud(cloud='vexxhost1') | ||
| 884 | session = config.get_session() | ||
| 885 | session.get('https://image-ca-ymq-1.vexxhost.net/v2/images') | ||
| 886 | |||
| 887 | * An "Adapter" is a Session that is 'mounted' on a base endpoint | ||
| 888 | |||
| 889 | .. code-block:: python | ||
| 890 | |||
| 891 | config = os_client_config.OpenStackConfig().get_one_cloud(cloud='vexxhost1') | ||
| 892 | client = adapter.Adapter( | ||
| 893 | config.get_session(), service_type='image', version='latest') | ||
| 894 | session.get('/images') | ||
| 895 | |||
| 896 | * ``os_client_config.make_rest_client`` returns a mounted Adapter | ||
| 897 | * Latest keystoneauth library handles version discovery properly in Adapter | ||
| 898 | |||
| 899 | Creating keystoneauth session directly | ||
| 900 | ====================================== | ||
| 901 | |||
| 902 | .. code-block:: python | ||
| 903 | |||
| 904 | from keystoneauth1 import adapter, loading, session | ||
| 905 | loader = loading.get_plugin_loader('password') | ||
| 906 | auth = loader.load_from_options( | ||
| 907 | auth_url='https://auth.vexxhost.net', | ||
| 908 | username='osdn-user-1', | ||
| 909 | user_domain_id='default', | ||
| 910 | password='XXXXXXXX', | ||
| 911 | project_name='osdn-project-1', | ||
| 912 | project_domain_id='default') | ||
| 913 | # verify and ssl cert info go here too | ||
| 914 | session = session.Session(auth) | ||
| 915 | # interface, region_name also go here | ||
| 916 | client = adapter.Adapter(session, service_type='image', version='latest') | ||
| 917 | client.get('/images') | ||
| 918 | |||
| 919 | Command Line | ||
| 920 | ============ | ||
| 921 | |||
| 922 | .. code-bock:: bash | ||
| 923 | |||
| 924 | openstack --os-cloud=vexxhost1 image list | ||
| 925 | |||
| 926 | Back to shade | ||
| 927 | ============= | ||
| 928 | |||
| 929 | .. code-block:: python | ||
| 930 | |||
| 931 | import shade | ||
| 932 | cloud = shade.openstack_cloud(cloud='vexxhost') | ||
| 933 | cloud.pprint(cloud.list_images()) | ||
| 934 | |||
| 935 | Shade Logging | ||
| 936 | ============= | ||
| 937 | |||
| 938 | * `shade` uses standard python logging | ||
| 939 | * `simple_logging` does easy defaults | ||
| 940 | * Squelches some meaningless warnings | ||
| 941 | |||
| 942 | * `debug` | ||
| 943 | |||
| 944 | * Logs shade loggers at debug level | ||
| 945 | |||
| 946 | * `http_debug` Implies `debug`, turns on HTTP tracing | ||
| 947 | |||
| 948 | .. code:: python | ||
| 949 | |||
| 950 | # Initialize and turn on debug logging | ||
| 951 | shade.simple_logging(debug=True) | ||
| 952 | |||
| 953 | Find out what REST calls shade is making | ||
| 954 | ======================================== | ||
| 955 | |||
| 956 | .. code-block:: python | ||
| 957 | |||
| 958 | import shade | ||
| 959 | shade.simple_logging(http_debug=True) | ||
| 960 | cloud = shade.openstack_cloud(cloud='vexxhost1') | ||
| 961 | cloud.pprint(cloud.list_images()) | ||
| 962 | |||
| 963 | http://paste.openstack.org/raw/623906/ | ||
| 964 | |||
| 965 | Real tokens are not logged, only a sha of the token. Reusing the printed | ||
| 966 | curl commands reuquires replacing the token with a real one. | ||
| 967 | |||
| 968 | :: | ||
| 969 | |||
| 970 | "X-Auth-Token: {SHA1}23ffd369ff0c0e7673c17bb97e6a77783d789e5e" | ||
| 971 | |||
| 972 | Microversions | ||
| 973 | ============= | ||
| 974 | |||
| 975 | * Per-HTTP-request behavior differences. | ||
| 976 | * Services declare microversion support ranges in Version Discovery Document | ||
| 977 | |||
| 978 | .. code-block:: bash | ||
| 979 | |||
| 980 | curl -i https://compute-ca-ymq-1.vexxhost.net | ||
| 981 | |||
| 982 | Nova Compute Version Document Part One | ||
| 983 | ====================================== | ||
| 984 | |||
| 985 | :: | ||
| 986 | |||
| 987 | HTTP/1.1 200 OK | ||
| 988 | Date: Wed, 18 Oct 2017 01:58:51 GMT | ||
| 989 | Server: Apache/2.4.6 (CentOS) | ||
| 990 | Content-Length: 399 | ||
| 991 | Vary: Accept-Encoding | ||
| 992 | Content-Type: application/json | ||
| 993 | |||
| 994 | { | ||
| 995 | "versions": [ | ||
| 996 | { | ||
| 997 | "status": "SUPPORTED", | ||
| 998 | "version": "", | ||
| 999 | "updated": "2011-01-21T11:33:21Z", | ||
| 1000 | "id": "v2.0", | ||
| 1001 | "links": [ | ||
| 1002 | { | ||
| 1003 | "href": "https://compute-ca-ymq-1.vexxhost.net/v2/", | ||
| 1004 | "rel": "self" | ||
| 1005 | } | ||
| 1006 | ], | ||
| 1007 | "min_version": "" | ||
| 1008 | }, | ||
| 1009 | |||
| 1010 | Nova Compute Version Document Part Two | ||
| 1011 | ====================================== | ||
| 1012 | |||
| 1013 | Note 'version' and 'min_version'. | ||
| 1014 | |||
| 1015 | :: | ||
| 1016 | |||
| 1017 | { | ||
| 1018 | "status": "CURRENT", | ||
| 1019 | "version": "2.53", | ||
| 1020 | "updated": "2013-07-23T11:33:21Z", | ||
| 1021 | "id": "v2.1", | ||
| 1022 | "links": [ | ||
| 1023 | { | ||
| 1024 | "href": "https://compute-ca-ymq-1.vexxhost.net/v2.1/", | ||
| 1025 | "rel": "self" | ||
| 1026 | } | ||
| 1027 | ], | ||
| 1028 | "min_version": "2.1" | ||
| 1029 | } | ||
| 1030 | |||
| 1031 | Microversion Field Names | ||
| 1032 | ======================== | ||
| 1033 | |||
| 1034 | The min and max available microversion for the given Major API version. | ||
| 1035 | |||
| 1036 | In some services they are: | ||
| 1037 | |||
| 1038 | * min_version | ||
| 1039 | * version | ||
| 1040 | |||
| 1041 | In other services they are: | ||
| 1042 | |||
| 1043 | * min_version | ||
| 1044 | * max_version | ||
| 1045 | |||
| 1046 | Request a Microversion | ||
| 1047 | ====================== | ||
| 1048 | |||
| 1049 | * Add a OpenStack-API-Version header with service-type and version:: | ||
| 1050 | |||
| 1051 | OpenStack-API-Version: compute 2.13 | ||
| 1052 | |||
| 1053 | * Response will contain the same header specifying which version was used:: | ||
| 1054 | |||
| 1055 | OpenStack-API-Version: compute 2.13 | ||
| 1056 | |||
| 1057 | * Older versions of Nova (pre Newton - or versions that do not support a max | ||
| 1058 | version of 2.27 or higher), use a different form:: | ||
| 1059 | |||
| 1060 | X-OpenStack-Nova-API-Version: 2.13 | ||
| 1061 | |||
| 1062 | * It doesn't hurt anything to send both - which is what keystoneauth does | ||
| 1063 | under the covers. | ||
| 1064 | |||
| 1065 | Documentation on Nova Microversion Changes | ||
| 1066 | ========================================== | ||
| 1067 | |||
| 1068 | https://docs.openstack.org/nova/latest/reference/api-microversion-history.html | ||
| 1069 | |||
| 1070 | Simple Microversion Example with Default | ||
| 1071 | ======================================== | ||
| 1072 | |||
| 1073 | Microversion 2.36 removed some calls. Before 2.36 nova had a ``/images`` API | ||
| 1074 | that would proxy to glance. It is removed in 2.36 and later. | ||
| 1075 | |||
| 1076 | Making a GET call defaults to the minimum (2.1 in this case) | ||
| 1077 | |||
| 1078 | .. code-bock:: python | ||
| 1079 | |||
| 1080 | import os_client_config | ||
| 1081 | |||
| 1082 | client = os_client_config.make_rest_client('compute', cloud='vexxhost') | ||
| 1083 | client.get('/images') | ||
| 1084 | |||
| 1085 | :: | ||
| 1086 | |||
| 1087 | curl -g -i -X GET https://compute-ca-ymq-1.vexxhost.net/v2.1/db92b20496ae4fbda850a689ea9d563f/images -H "X-Auth-Token: {SHA1}23ffd369ff0c0e7673c17bb97e6a77783d789e5e" -H "User-Agent: os-client-config/1.28.1 keystoneauth1/3.2.1 python-requests/2.18.3 CPython/3.5.2" | ||
| 1088 | [200] Date: Wed, 18 Oct 2017 02:10:49 GMT Server: Apache/2.4.6 (CentOS) OpenStack-API-Version: compute 2.1 X-OpenStack-Nova-API-Version: 2.1 Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version,Accept-Encoding x-openstack-request-id: req-3e6bc318-dfd6-493b-9675-8bb1f9285cac x-compute-request-id: req-3e6bc318-dfd6-493b-9675-8bb1f9285cac Content-Encoding: gzip Content-Length: 2411 Content-Type: application/json | ||
| 1089 | |||
| 1090 | Simple Microversion Example with Microversion | ||
| 1091 | ============================================= | ||
| 1092 | |||
| 1093 | Sending microversion 2.36 for the same call tells Nova to use the 2.36 | ||
| 1094 | behavior, which results in a 404. | ||
| 1095 | |||
| 1096 | .. code-bock:: python | ||
| 1097 | |||
| 1098 | import os_client_config | ||
| 1099 | |||
| 1100 | client = os_client_config.make_rest_client('compute', cloud='vexxhost') | ||
| 1101 | client.get('/images', microversion='2.36') | ||
| 1102 | |||
| 1103 | :: | ||
| 1104 | |||
| 1105 | curl -g -i -X GET https://compute-ca-ymq-1.vexxhost.net/v2.1/db92b20496ae4fbda850a689ea9d563f/images -H "User-Agent: os-client-config/1.28.1 keystoneauth1/3.2.1 python-requests/2.18.3 CPython/3.5.2" -H "X-Auth-Token: {SHA1}23ffd369ff0c0e7673c17bb97e6a77783d789e5e" -H "OpenStack-API-Version: compute 2.36" -H "X-OpenStack-Nova-API-Version: 2.36" | ||
| 1106 | [404] Date: Wed, 18 Oct 2017 02:11:00 GMT Server: Apache/2.4.6 (CentOS) OpenStack-API-Version: compute 2.36 X-OpenStack-Nova-API-Version: 2.36 Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version x-openstack-request-id: req-d733583e-d2c3-4ca4-bdfb-5e658e194028 x-compute-request-id: req-d733583e-d2c3-4ca4-bdfb-5e658e194028 Content-Length: 78 Content-Type: application/json; charset=UTF-8 | ||
| 1107 | {"itemNotFound": {"message": "The resource could not be found.", "code": 404}} | ||
| 1108 | |||
| 1109 | |||
| 1110 | Create Server Group | ||
| 1111 | =================== | ||
| 1112 | |||
| 1113 | The server group doesn't matter - this is just to have an object to show. | ||
| 1114 | |||
| 1115 | .. code-bock:: python | ||
| 1116 | |||
| 1117 | import os_client_config | ||
| 1118 | |||
| 1119 | client = os_client_config.make_rest_client('compute', cloud='vexxhost') | ||
| 1120 | client.post( | ||
| 1121 | '/os-server-groups', | ||
| 1122 | json=dict(server_group=dict(name='test', policies=['anti-affinity']))) | ||
| 1123 | |||
| 1124 | Example of No Microversion Content Behavior | ||
| 1125 | =========================================== | ||
| 1126 | |||
| 1127 | No microversion specified. | ||
| 1128 | |||
| 1129 | .. code-bock:: python | ||
| 1130 | |||
| 1131 | client.get('/os-server-groups') | ||
| 1132 | |||
| 1133 | :: | ||
| 1134 | |||
| 1135 | curl -g -i -X GET https://compute-ca-ymq-1.vexxhost.net/v2.1/bbb1e479a9d04f34941470f37c7a0ecb/os-server-groups -H "X-Auth-Token: {SHA1}fe541768b55bbe23f79f97595b137fed3326166a" -H "User-Agent: os-client-config/1.28.1 keystoneauth1/3.2.1 python-requests/2.18.3 CPython/3.5.2" | ||
| 1136 | [200] Date: Wed, 18 Oct 2017 02:18:30 GMT Server: Apache/2.4.6 (CentOS) OpenStack-API-Version: compute 2.1 X-OpenStack-Nova-API-Version: 2.1 Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version,Accept-Encoding x-openstack-request-id: req-85e061c0-d474-497c-bd17-96b629086169 x-compute-request-id: req-85e061c0-d474-497c-bd17-96b629086169 Content-Encoding: gzip Content-Length: 137 Content-Type: application/json | ||
| 1137 | {"server_groups": [{"members": [], "metadata": {}, "id": "f88c7aef-b34a-4b0e-b0c7-9076eab88de2", "policies": ["anti-affinity"], "name": "test"}]} | ||
| 1138 | |||
| 1139 | Example of Microversion Content Behavior | ||
| 1140 | ======================================== | ||
| 1141 | |||
| 1142 | Request microversion 2.13, which adds user_id and project_id. | ||
| 1143 | |||
| 1144 | .. code-bock:: python | ||
| 1145 | |||
| 1146 | client.get('/os-server-groups', microversion='2.13').json() | ||
| 1147 | |||
| 1148 | :: | ||
| 1149 | |||
| 1150 | curl -g -i -X GET https://compute-ca-ymq-1.vexxhost.net/v2.1/bbb1e479a9d04f34941470f37c7a0ecb/os-server-groups -H "User-Agent: os-client-config/1.28.1 keystoneauth1/3.2.1 python-requests/2.18.3 CPython/3.5.2" -H "X-Auth-Token: {SHA1}fe541768b55bbe23f79f97595b137fed3326166a" -H "OpenStack-API-Version: compute 2.13" -H "X-OpenStack-Nova-API-Version: 2.13" | ||
| 1151 | [200] Date: Wed, 18 Oct 2017 02:20:13 GMT Server: Apache/2.4.6 (CentOS) OpenStack-API-Version: compute 2.13 X-OpenStack-Nova-API-Version: 2.13 Vary: OpenStack-API-Version,X-OpenStack-Nova-API-Version,Accept-Encoding x-openstack-request-id: req-6c71b008-185a-46c1-8762-5c2718be1741 x-compute-request-id: req-6c71b008-185a-46c1-8762-5c2718be1741 Content-Encoding: gzip Content-Length: 195 Content-Type: application/json | ||
| 1152 | {"server_groups": [{"user_id": "bc2260d5b7cb40ff8270043fd7af3a08", "policies": ["anti-affinity"], "name": "test", "members": [], "project_id": "bbb1e479a9d04f34941470f37c7a0ecb", "id": "f88c7aef-b34a-4b0e-b0c7-9076eab88de2", "metadata": {}}]} | ||
| 1153 | |||
