跳转到主要内容

LXD客户端

项目描述

为LXD REST API(目前处于高度开发中)提供的异步Python客户端。

使用方法

安装

pip install lxd

初始化客户端

import asyncio
from pathlib import Path

from yarl import URL

from lxd.client import lxd_client


async def main():
    client = lxd_client(
        URL('https://mylxd:8443/'),
        cert_path=Path('~/.config/lxc/client.crt'),
        key_path=Path('~/.config/lxc/client.key'),
        endpoint_cert_path=Path('~/.config/lxc/servercerts/mylxd.crt'),
    )

    await client.authenticate(
        cert_path=Path('~/.config/lxc/client.crt'),
        password='your-trust-password'
    )


asyncio.run(main())

示例用法

# Recursion 0 returns only links to objects,
# you can resolve them by awaiting
instance_links = await client.instances.list(recursion=0)
instance = await instance_links[0]

# Recursion 1 returns only some fields
instances = await client.instances.list(recursion=1)

# Recursion 2 returns all possible information
instances = await client.instances.list(recursion=2)

更改实例状态

from lxd.entities.instances import InstanceAction

instances = await client.instances.list()
operation = await client.instances.update_state(
    instances[0].name, action=InstanceAction.STOP
)
await client.operations.wait(operation.id)  # wait as long as possible
await client.operations.wait(operation.id, timeout=30)  # 30s

获取事件流

async for event in client.server.get_events():
    # See Event object for more properties
    print(event.type)
    print(event.metadata)

可用端点

服务器

server.get

获取服务器环境和配置。

# See lxd.entities.server.Server
info = await client.server.get()
print(info.config)
print(info.environment)

server.update_configuration

更新服务器配置

await client.server.update_configuration({
    'core.https_address': '0.0.0.0:8443'
    'core.trust_password': 'very-strong-password'
})

server.update_configuration_subset

更新服务器配置的部分。

await client.server.update_configuration_subset({
    'images.remote_cache_expiry': 2
})

server.get_resources

获取LXD服务器的硬件信息配置文件。

# See lxd.entities.server.ServerResources
server_resources = await client.server.get_resources()
print(server_resources.cpu)

server.get_events

使用WebSocket连接到事件API

# Listen all events
async for event in client.server.get_events():
    print(event.type)
    print(event.metadata)

# Listen to specific events
async for event in client.server.get_events(type='operation'):
    print(event.metadata.id)
    print(event.metadata.status)

证书

certificates.list

返回受信任证书的列表。

# See lxd.entities.certificates.Certificate
certs = await client.certificates.list()
print(certs[0].fingerprint)

如果您传递recursion=0参数,lxd会只返回引用,这些引用在当前模块中表示为lxd.entities.certificates.CertificateLink对象。

如果您await这样的链接对象,您将获得该对象本身(每个await调用都会执行单独的HTTP请求)。

cert_links = await client.certificates.list(recursion=0)
certs = await asyncio.gather(*cert_links)

certificates.get

通过指纹从受信任存储中获取特定证书条目。

from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.primitives import hashes

fprint = '97f267c0fe20fd013b6b4ba3f5440ea3e9361ce8568d41c633f28c620ab37ea0'
cert = await client.certificates.get(fprint)

cert_obj = load_pem_x509_certificate(cert.certificate.encode())
assert cert_obj.fingerprint(hashes.SHA256()).hex() == fprint

certificates.add

将证书添加到信任存储库作为受信任用户(客户端证书应该是受信任的)。

from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import rsa

private_key = rsa.generate_private_key(
    public_exponent=65537, key_size=2048, backend=default_backend()
)
subj = x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, "alvassin@osx")
])

cert = x509.CertificateBuilder().subject_name(
    subj
).issuer_name(
    subj
).public_key(
    private_key.public_key()
).serial_number(
    x509.random_serial_number()
).not_valid_before(
    datetime.utcnow()
).not_valid_after(
    datetime.utcnow() + timedelta(days=365)
).sign(
    private_key=private_key,
    algorithm=hashes.SHA256(),
    backend=default_backend()
)

await client.certificates.add(
    cert.public_bytes(serialization.Encoding.PEM)
)

如果指定了密码参数,则将证书添加到信任存储库作为不受信任的用户。

await client.certificates.add(
    cert.public_bytes(serialization.Encoding.PEM),
    password='your-trust-password'
)

certificates.update_configuration

更新整个证书配置。

await client.certificates.update_configuration(
    '97f267c0fe20fd013b6b4ba3f5440ea3e9361ce8568d41c633f28c620ab37ea0',
    certificate='-----BEGIN CERTIFICATE-----\n...',
    name='new-name',
    projects=[],
    restricted=False,
    type='client'
)

certificates.update_configuration_subset

更新证书配置的一部分。

await client.certificates.update_configuration_subset(
    '97f267c0fe20fd013b6b4ba3f5440ea3e9361ce8568d41c633f28c620ab37ea0',
    name='another-name'
)

certificates.remove

从信任存储库中删除证书。

await client.certificates.remove(
    '97f267c0fe20fd013b6b4ba3f5440ea3e9361ce8568d41c633f28c620ab37ea0'
)

实例

  • client.instances.list

  • client.instances.get

  • client.instances.create

  • client.instances.delete

  • client.instances.get_state

  • client.instances.update_state

操作

  • client.operations.list

  • client.operations.get

  • client.operations.wait

  • client.operations.cancel

待办事项

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

lxd-0.2.16.tar.gz (11.6 kB 查看哈希值)

上传时间:

由以下支持