Skip to main content

Pythonic Unified OpenStack Client Library

Project description

Each OpenStack client library like python-novaclient can handle only one OpenStack program, so we have to use multiple client libraries/commands to use OpenStack platform. Yakumo is a pythonic, unified OpenStack client library. Its basic usage is a bit similar to python-novaclient and others, but it can handle multiple programs (Nova, Swift Glance, Cinder, Neutron and Keystone now) and it’s easy to manage multiple resources on the multiple programs with it.

Yes, there is another unified OpenStack client library named ‘python-openstacksdk’. But its API style is different from python-novaclient and others. That is the reason I started Yakumo development by myself.

Basic Usage

Yakumo contains a simple sample OpenStack shell named ‘ossh’. For example,

bash$ ossh --os-cloud=packstack --verbose
>>>
Welcome to bpython! Press <F1> for help.

‘c’ is a client object defined in ossh, using credential information from environment variables. Of course, you can define another client object by yourself. See ossh source code for details.

ossh has iPython-like built-in completion capability. Type “c.”:

>>> c.
c.aggregate                    c.image                        c.server
c.availability_zone            c.key_pair                     c.server_group
c.cinder                       c.keystone                     c.service
c.cloudpipe                    c.lb                           c.subnet
c.consistency_group            c.lbaas                        c.subnet_pool
c.consistency_group_snapshot   c.network                      c.swift
c.container                    c.network_quota                c.user
c.endpoint                     c.neutron                      c.volume
c.fixed_ip                     c.nova                         c.volume_backup
c.flavor                       c.port                         c.volume_snapshot
c.floating_ip                  c.project                      c.volume_transfer
c.floating_ip_bulk             c.role                         c.volume_type
c.floating_ip_dns              c.router                       c.volume_type_qos
c.glance                       c.security_group               c.vpn
c.hypervisor                   c.security_group_default_rule

You can also use one of bpython if available. Type “c.”:

>>> c.
+------------------------------------------------------------------------------------------+
| aggregate                     availability_zone             cinder                       |
| cloudpipe                     consistency_group             consistency_group_snapshot   |
| container                     credential                    domain                       |
| endpoint                      fixed_ip                      flavor                       |
| floating_ip                   floating_ip_bulk              floating_ip_dns              |
| glance                        group                         hypervisor                   |
| image                         key_pair                      keystone                     |
| lb                            lbaas                         network                      |
| network_quota                 neutron                       nova                         |
| port                          project                       region                       |
| role                          router                        security_group               |
| security_group_default_rule   server                        server_group                 |
| service                       subnet                        subnet_pool                  |
| swift                         user                          volume                       |
| volume_backup                 volume_snapshot               volume_transfer              |
| volume_type                   volume_type_qos               vpn                          |
+------------------------------------------------------------------------------------------+

c.CATEGORY.list() returns a list of resource objects:

>>> c.image.list()
[<yakumo.glance.v2.image.Resource (id="887b0393-5065-4bcf-941d-623100baa06e", name="trusty")>]
>>>

c.CATEGORY.find(cond) returns a list of resource objects matched to cond:

>>> c.flavor.find(vcpus=1)
[<yakumo.nova.v2.flavor.Resource (id="1", name="m1.tiny")>, <yakumo.nova.v2.flavor.Resource (id="2", name="m1.small")>]
>>>

c.CATEGORY.find_one(cond) returns a resource object matched to cond:

>>> i = c.image.find_one(name="trusty")
>>> f = c.flavor.find_one(name='m1.small')
>>> k = c.key_pair.find_one(name='key1')
>>> n = c.network.find_one(name='private')
>>> i, f, k, n
(<yakumo.glance.v2.image.Resource (id="887b0393-5065-4bcf-941d-623100baa06e", name="trusty")>, <yakumo.nova.v2.flavor.Resource (id="2"
, name="m1.small")>, <yakumo.nova.v2.key_pair.Resource (name="key1")>, <yakumo.neutron.v2.network.Resource (id="22e3fa30-11c0-4065-bbf
7-8d8bbb50f63b", name="private")>)
>>>

pprint() is useful. It’s already imported

>>> pprint((i, f, k, n))
(<yakumo.glance.v2.image.Resource (id="887b0393-5065-4bcf-941d-623100baa06e", name="trusty")>,
 <yakumo.nova.v2.flavor.Resource (id="2", name="m1.small")>,
 <yakumo.nova.v2.key_pair.Resource (name="key1")>,
 <yakumo.neutron.v2.network.Resource (id="22e3fa30-11c0-4065-bbf7-8d8bbb50f63b", name="private")>)
>>>

get_attrs() method returns all attribute.

>>> pprint(f.get_attrs())
{'disk': 20,
 'ephemeral': 0,
 'id': u'2',
 'is_public': True,
 'name': u'm1.small',
 'ram': 2048,
 'rxtx_factor': 1.0,
 'swap': u'',
 'vcpus': 1}
>>>

You can see description of a method:

>>> c.server.create(<tab>
def create(self, name=UNDEF, image=UNDEF, flavor=UNDEF,
               personality=UNDEF, disks=UNDEF, max_count=UNDEF,
               min_count=UNDEF, networks=UNDEF, security_groups=UNDEF,
               availability_zone=UNDEF, metadata=UNDEF,
               config_drive=UNDEF, key_pair=UNDEF, user_data=UNDEF):
Create a new server

@keyword name: name of the new server (required)
@type name: str
@keyword flavor: Flavor object to use (required)
@type flavor: yakumo.nova.v2.flavor.Resource
@keyword image: Image object to use for ephemeral disk
@type image: yakumo.image.Resource
@keyword key_pair: KeyPair object to use
@type key_pair: yakumo.nova.v2.key_pair.Resource
        (snip)
@return: Created server
@rtype: yakumo.nova.v2.server.Resource
>>> c.server.create(

or with bpython:

>>> c.server.create(
+--------------------------------------------------------------------------------------------------------------+
| c.server.create: (self, name=None, image=None, flavor=None, personality=None, block_devices=None,            |
| max_count=None, min_count=None, networks=None, security_groups=None, config_drive=False, key_pair=None,      |
| user_data=None)                                                                                              |
| create                                                                                                       |
| Create a new server                                                                                          |
|                                                                                                              |
| @keyword name: name of the new server (required)                                                             |
| @type name: str                                                                                              |
| @keyword flavor: Flavor object to use (required)                                                             |
| @type flavor: yakumo.nova.v2.flavor.Resource                                                                 |
| @keyword image: Image object to use for ephemeral disk                                                       |
| @type image: yakumo.image.Resource                                                                           |
| @keyword key_pair: KeyPair object to use                                                                     |
| @type key_pair: yakumo.nova.v2.key_pair.Resource                                                             |
        (snip)
| @return: Created server                                                                                      |
| @rtype: yakumo.nova.v2.server.Resource                                                                       |
+--------------------------------------------------------------------------------------------------------------+

You can create a new resource:

>>> s = c.server.create(name='vm1', image=i, flavor=f, networks=[n], key_pair=k)
>>> s
<yakumo.nova.v2.server.Resource (id="b1477f6c-bbc4-4c37-ba05-14b935a5d08c" empty)>
>>>

‘s’ is an empty resource object for the new instance. “empty” means the object has only ID attribute. Other attributes will be loaded on-demand. For example, “print(s)” causes loading attributes.

>>> print(s)
<yakumo.nova.v2.server.Resource ({'status': u'BUILD', 'addresses': {u'private': [{u'OS-EXT-IPS-MAC:mac_addr': u'fa:16:3e:0a:73:d3', u'version': 4, u'addr': u'10.0.0.10', u'OS-EXT-IPS:type': u'fixed'}]}, 'access_ipv4': u'', 'created_at': datetime.datetime(2017, 2, 10, 3, 24, 22, tzinfo=tzutc()), 'updated_at': datetime.datetime(2017, 2, 10, 3, 24, 31, tzinfo=tzutc()), 'name': u'vm1', 'project': <yakumo.keystone.v2.project.Resource (id="68b7f45b07084546a089e75b29efae29" empty)>, 'host': <yakumo.nova.v2.host.Resource (name="packstack3" empty)>, 'key_pair': <yakumo.nova.v2.key_pair.Resource (name="key1" empty)>, 'user': <yakumo.keystone.v2.user.Resource (id="99605955005446c386a4c9bce4eaa7a1" empty)>, 'progress': 0, 'id': u'b1477f6c-bbc4-4c37-ba05-14b935a5d08c', 'access_ipv6': u''})>
>>>

Let’s confirm the keypair.

>>> s.key_pair
<yakumo.nova.v2.key_pair.Resource (name="key1" empty)>
>>>

You can update the information of ‘s’:

>>> s.reload()
>>>

Waiting server becomes active:

>>> s.wait_for_finished()
>>>

Let’s confirm status of the new instance.

>>> s.status
u'ACTIVE'
>>>

get_id() method returns its ID.

>>> s.get_id()
u'b1477f6c-bbc4-4c37-ba05-14b935a5d08c'
>>>

You can create a new resource object directly if you have its ID.

>>> s2 = c.server.get('b1477f6c-bbc4-4c37-ba05-14b935a5d08c')
>>> s2
<yakumo.nova.v2.server.Resource (id="b1477f6c-bbc4-4c37-ba05-14b935a5d08c", name="vm1")>
>>>

You can check the two objects are the same:

>>> s == s2
True
>>>

and delete one:

>>> s.delete()
>>>

How about this?

>>> for i in c.server.list(): i.delete()

CAUTION: YOUR INSTANCES WILL BE DELETED IF YOU RUN ABOVE.

Yes, that’s one of things I want to do.

Author

Akira Yoshiyama / akirayoshiyama at gmail.com

Project URL

https://github.com/yosshy/python-yakumo

License

Apache License Version 2.0 See LICENSE for more details.

Note: yakumo/console.py contains derived code from rlcompleter.py and python online manual for readline module. It has its own license. See LICENSE-PYTHON for more details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

yakumo-0.10.3-py2.py3-none-any.whl (191.2 kB view details)

Uploaded Python 2 Python 3

yakumo-0.10.3-py2.7.egg (385.4 kB view details)

Uploaded Egg

File details

Details for the file yakumo-0.10.3-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for yakumo-0.10.3-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 fdb2b0b33994a45e104cbef2bbe2aa189d46425331d92b6dd8321eeb110d95a5
MD5 3f4f10391fa79c544be8b8e540252178
BLAKE2b-256 4a86d4e1eca84789817aca7a2cbb8c60029ab450cb7e232a22628d54dd0451fb

See more details on using hashes here.

File details

Details for the file yakumo-0.10.3-py2.7.egg.

File metadata

  • Download URL: yakumo-0.10.3-py2.7.egg
  • Upload date:
  • Size: 385.4 kB
  • Tags: Egg
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for yakumo-0.10.3-py2.7.egg
Algorithm Hash digest
SHA256 7b316f7d5b76ca7dcb9eeca27cec15f6d45cf0e5124c205209998c95efb9a611
MD5 1f5209836d80f8510b188cfdd987ddbb
BLAKE2b-256 64a71bbd590852f282712cfde6c422f34f47a91f877c4aea94221fff87b46f6b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page