9f4805bedb
Just noticed that the README says "for operating OpenStack". The word operating has very specific connotations in OpenStack world, and that is decidedly _not_ the primary use case of shade. Change-Id: Ic0205c82abc3b5bfd6223ea7a6ee1bd6bfb365dd
46 lines
1.7 KiB
ReStructuredText
46 lines
1.7 KiB
ReStructuredText
Introduction
|
|
============
|
|
|
|
shade is a simple client library for interacting with OpenStack clouds. The
|
|
key word here is *simple*. Clouds can do many many many things - but there are
|
|
probably only about 10 of them that most people care about with any
|
|
regularity. If you want to do complicated things, you should probably use
|
|
the lower level client libraries - or even the REST API directly. However,
|
|
if what you want is to be able to write an application that talks to clouds
|
|
no matter what crazy choices the deployer has made in an attempt to be
|
|
more hipster than their self-entitled narcissist peers, then shade is for you.
|
|
|
|
shade started its life as some code inside of ansible. ansible has a bunch
|
|
of different OpenStack related modules, and there was a ton of duplicated
|
|
code. Eventually, between refactoring that duplication into an internal
|
|
library, and adding logic and features that the OpenStack Infra team had
|
|
developed to run client applications at scale, it turned out that we'd written
|
|
nine-tenths of what we'd need to have a standalone library.
|
|
|
|
Example
|
|
=======
|
|
|
|
Sometimes an example is nice.
|
|
::
|
|
|
|
import shade
|
|
|
|
# Initialize and turn on debug logging
|
|
shade.simple_logging(debug=True)
|
|
|
|
# Initialize cloud
|
|
# Cloud configs are read with os-client-config
|
|
cloud = shade.openstack_cloud(cloud='mordred')
|
|
|
|
# Upload an image to the cloud
|
|
image = cloud.create_image(
|
|
'ubuntu-trusty', filename='ubuntu-trusty.qcow2', wait=True)
|
|
|
|
# Find a flavor with at least 512M of RAM
|
|
flavor = cloud.get_flavor_by_ram(512)
|
|
|
|
# Boot a server, wait for it to boot, and then do whatever is needed
|
|
# to get a public ip for it.
|
|
cloud.create_server(
|
|
'my-server', image=image, flavor=flavor, wait=True, auto_ip=True)
|