garage/doc/book/build/python.md
Matthias Doering 2b0bfa9b18
Some checks failed
ci/woodpecker/pr/debug Pipeline failed
the old value do not work out of the box
2024-10-14 17:20:26 +02:00

3.6 KiB

+++ title = "Python" weight = 20 +++

S3

Using Minio SDK

First install the SDK:

pip3 install minio

Then instantiate a client object using garage root domain, api key and secret:

import minio

client = minio.Minio(
  "your.domain.tld",
  "GKyourapikey",
  "abcd[...]1234",
  # Force the region, this is specific to garage
  region="garage",
)

Then use all the standard S3 endpoints as implemented by the Minio SDK:

# List buckets
print(client.list_buckets())

# Put an object containing 'content' to /path in bucket named 'bucket':
content = b"content"
client.put_object(
  "bucket",
  "path",
  io.BytesIO(content),
  len(content),
)

# Read the object back and check contents
data = client.get_object("bucket", "path").read()
assert data == content

For further documentation, see the Minio SDK Reference

Using Amazon boto3

Coming soon

See the official documentation:

K2V

Coming soon

Admin API

You need at least Python 3.6, pip, and setuptools. Because the python package is in a subfolder, the command is a bit more complicated than usual:

pip3 install --user 'git+https://git.deuxfleurs.fr/garage-sdk/garage-admin-sdk-python'

Now, let imagine you have a fresh Garage instance running on localhost, with the admin API configured on port 3903 with the bearer s3cr3t:

import garage_admin_sdk
from garage_admin_sdk.apis import *
from garage_admin_sdk.models import *

configuration = garage_admin_sdk.Configuration(
  host = "http://localhost:3903/v1",
  access_token = "s3cr3t"
)

# Init APIs
api = garage_admin_sdk.ApiClient(configuration)
nodes, layout, keys, buckets = NodesApi(api), LayoutApi(api), KeyApi(api), BucketApi(api)

# Display some info on the node
status = nodes.get_nodes()
print(f"running garage {status.garage_version}, node_id {status.node}")

# Change layout of this node
current = layout.get_layout()
layout.add_layout([
  NodeRoleChange(
    id = status.node,
    zone = "dc1",
    capacity = 1000000000,
    tags = [ "dev" ],
  )
])
layout.apply_layout(LayoutVersion(
  version = current.version + 1
))

# Create key, allow it to create buckets
kinfo = keys.add_key(AddKeyRequest(name="openapi"))

allow_create = UpdateKeyRequestAllow(create_bucket=True)
keys.update_key(kinfo.access_key_id, UpdateKeyRequest(allow=allow_create))

# Create a bucket, allow key, set quotas
binfo = buckets.create_bucket(CreateBucketRequest(global_alias="documentation"))
binfo = buckets.allow_bucket_key(AllowBucketKeyRequest(
  bucket_id=binfo.id,
  access_key_id=kinfo.access_key_id,
  permissions=AllowBucketKeyRequestPermissions(read=True, write=True, owner=True),
))
binfo = buckets.update_bucket(binfo.id, UpdateBucketRequest(
  quotas=UpdateBucketRequestQuotas(max_size=19029801,max_objects=1500)))

# Display key
print(f"""
cluster ready
key id is {kinfo.access_key_id}
secret key is {kinfo.secret_access_key}
bucket {binfo.global_aliases[0]} contains {binfo.objects}/{binfo.quotas.max_objects} objects
""")

This example is named short.py in the example folder. Other python examples are also available.

See also: