pythonic统一openstack客户端库
yakumo的Python项目详细描述
每个openstack客户端库(如python novaclient)只能处理一个 openstack程序,因此我们必须使用多个客户端库/命令 使用OpenStack平台。yakumo是一个pythonic,统一的openstack 客户端库。它的基本用法与python novaclient有点类似 但它可以处理多个程序(nova,swift glance, 炉渣,中子和基石现在)而且很容易管理多个 多个程序的资源。
是的,还有一个统一的openstack客户端库 “python openstacksdk”。但是它的api风格不同于 python novaclient和其他。这就是我开始做雅库莫的原因 自己开发。
基本用法
yakumo包含一个名为“ossh”的简单示例openstack shell。为了 示例,
bash$ ossh --os-cloud=packstack --verbose >>> Welcome to bpython! Press <F1> for help.
“c”是OSSH中定义的客户端对象,使用凭据信息 从环境变量。当然,您可以定义另一个客户机 自己反对。详见OSSH源代码。
奥什拥有类似于ipython的内置完成能力。
>>> c.<tab><tab> 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
如果可用,您也可以使用bpython之一。
>>> 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 | +------------------------------------------------------------------------------------------+
list()返回资源对象列表:
>>> c.image.list() [<yakumo.glance.v2.image.Resource (id="887b0393-5065-4bcf-941d-623100baa06e", name="trusty")>] >>>
find(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)返回与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()很有用。已经导入了
>>> 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()方法返回所有属性。
>>> 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} >>>
您可以看到方法的描述:
>>> 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(
或者使用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 | +--------------------------------------------------------------------------------------------------------------+
您可以创建新资源:
>>> 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”是新实例的空资源对象。“空”是指 对象只有id属性。其他属性将按需加载。 例如,“print(s)”会导致加载属性。
>>> 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''})> >>>
让我们确认一下钥匙对。
>>> s.key_pair <yakumo.nova.v2.key_pair.Resource (name="key1" empty)> >>>
您可以更新“s”的信息:
>>> s.reload() >>>
等待服务器激活:
>>> s.wait_for_finished() >>>
让我们确认新实例的状态。
>>> s.status u'ACTIVE' >>>
get_id()方法返回其id。
>>> s.get_id() u'b1477f6c-bbc4-4c37-ba05-14b935a5d08c' >>>
如果有新的资源对象的ID,则可以直接创建该对象。
>>> s2 = c.server.get('b1477f6c-bbc4-4c37-ba05-14b935a5d08c') >>> s2 <yakumo.nova.v2.server.Resource (id="b1477f6c-bbc4-4c37-ba05-14b935a5d08c", name="vm1")> >>>
您可以检查两个对象是否相同:
>>> s == s2 True >>>
删除一个:
>>> s.delete() >>>
这个怎么样?
>>> for i in c.server.list(): i.delete()
注意:如果您在上面运行,您的实例将被删除。
是的,这是我想做的事情之一。
许可证
yakumo是在apache许可2.0版下发布的。参见许可证 更多细节。
注意:yakumo/patch.py包含来自os cloud config的派生代码。是的 也在apache许可2.0版下发布。
注意:yakumo/console.py包含来自rlcompleter.py和 用于readline模块的python联机手册。它是在python下发布的 软件基金会许可证。有关更多详细信息,请参阅license-python。