Skip to main content

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 an “unified” OpenStack client library. Its basic usage is similar to python-novaclient and others, but it can handle multiple programs (Nova, 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 created Yakumo 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 code completion capability of bpython. Type “c.”:

>>> c.agent
+--------------------------------------------------------------------------------------------------------------+
| agent                         aggregate                     availability_zone                                |
| certificate                   cinder                        cloudpipe                                        |
| consistency_group             consistency_group_snapshot    endpoint                                         |
| fixed_ip                      flavor                        floating_ip                                      |
| floating_ip_bulk              floating_ip_dns               glance                                           |
| host                          hypervisor                    image                                            |
| key_pair                      keystone                      lb                                               |
| lbaas                         network                       network_quota                                    |
| neutron                       nova                          port                                             |
| project                       quota_set                     role                                             |
| router                        security_group                security_group_default_rule                      |
| server                        server_group                  service                                          |
| subnet                        subnet_pool                   user                                             |
| volume                        volume_backup                 volume_snapshot                                  |
| volume_transfer               volume_type                   volume_type_qos_spec                             |
| 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(
+--------------------------------------------------------------------------------------------------------------+
| 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                                                             |
| @keyword networks: list of networks or ones with tag and/or fixed IP                                         |
| @type networks: [yakumo.network.Resource]                                                                    |
| @keyword security_groups: list of SecurityGroup object(s) to use                                             |
| @type security_groups: [yakumo.nova.v2.security_group.Resource]                                              |
| @keyword block_devices: block device mapping                                                                 |
| @type block_devices: [dict]                                                                                  |
| @keyword personality: file path and the content to embed                                                     |
| @type personality: dict                                                                                      |
| @keyword max_count: the maximum number of server(s) to create                                                |
| @type max_count: int                                                                                         |
| @keyword min_count: the minimun number of server(s) to create                                                |
| @type min_count: int                                                                                         |
| @keyword config_drive: config drive exists or not (bool)                                                     |
| @type config_drive: bool                                                                                     |
| @keyword user_data: content of a batch file (str)                                                            |
| @type user_data: str                                                                                         |
| @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.

Release files for yakumo 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for yakumo 0.8.0
File Interpreter ABI Platform
yakumo-0.8.0-py2.py3-none-any.whl Python 3, Python 2 none any Details
yakumo-0.8.0-py2.7.egg Legacy Egg format - - Details

Total release size: 559.3 kB

Release files / yakumo-0.8.0-py2.py3-none-any.whl

Download URL yakumo-0.8.0-py2.py3-none-any.whl
Size 185.7 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
4e746af25e4ffe3f2074e60a9aa4d3ba8896d0022101f940ee94808aa5850a87
BLAKE2b-256 checksum
How to use checksums
c6a41c46ab0dcf4efab68a7e683120ef1c520c7a55a314fd459457c7a5dac495
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / yakumo-0.8.0-py2.7.egg

Download URL yakumo-0.8.0-py2.7.egg
Size 373.6 kB
Tags Egg
SHA-256 checksum
How to use checksums
ef2524a1f98ee06de5dd8930c1d2bcb61f54caa857c6625e2d70e8e0bce209d3
BLAKE2b-256 checksum
How to use checksums
ea557a644b38dc3c7f9e50bbfd798c19af2bd85fc34e135e8797ce71bdbeaa36
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

0.10.3

2 release files

0.10.2

2 release files

0.10.1

2 release files

0.10.0

3 release files

0.9.0

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.2.dev2

0.8.1

2 release files

This release

0.8.0 This release

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.0

3 release files

0.5.0

0.4.1

0.4.0

0.3.7

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page