A pathlib-like interface for Juju K8s charms to interact with files in their workload container.
Project description
charmlibs-pathops
pathops
provides a pathlib
-like interface for local filesystem and workload container paths for Juju Charms.
To install, add charmlibs-pathops
to your requirements. Then in your Python code, import as:
from charmlibs import pathops
Check out the reference docs here.
Getting started
To get started, you can create an attribute self.root
with the root directory for the local or remote paths you'll be working with.
import ops
from charmlibs import pathops
class KubernetesCharm(ops.CharmBase):
def __init__(self, framework: ops.Framework):
super().__init__(framework)
container = self.unit.get_container('container-name')
self.root = pathops.ContainerPath('/', container=container)
# or
class MachineCharm(ops.CharmBase):
def __init__(self, framework: ops.Framework):
super().__init__(framework)
self.root = pathops.LocalPath('/')
You can then write code that could be used by either charm, using the pathops.PathProtocol
type, which describes the operations supported by both local and container paths.
CONFIG_FILE_LOCATION = '/foo/bar'
CONFIG_FILE_CONTENTS = '...'
def write_config_file(root: pathops.PathProtocol) -> None:
path = root / CONFIG_FILE_LOCATION
path.write_text(CONFIG_FILE_CONTENTS)
For a Kubernetes charm, this also allows you to use the same API to work with paths in the charm container or the workload container.
import ops
from charmlibs import pathops
class KubernetesCharm(ops.CharmBase):
def __init__(self, framework: ops.Framework):
super().__init__(framework)
self.charm_root = pathops.LocalPath('/')
container = self.unit.get_container('container-name')
self.workload_root = pathops.ContainerPath('/', container=container)
...
def copy_config(self):
source = self.charm_root / 'foo/bar'
dest = self.workload_root / 'foo/bar/baz'
dest.parent.mkdir(parents=True, exist_ok=True)
dest.write_bytes(source.read_bytes())
pathops
also provides a helper function for ensuring that a file is present with specified content, which returns whether changes were made.
import ops
from charmlibs import pathops
class KubernetesCharm(ops.CharmBase):
...
def copy_config(self):
changed = pathops.ensure_contents(
path=self.workload_root / 'foo/bar/baz',
source=(self.charm_root / 'foo/bar').read_bytes(),
)
if changed:
# make the workload reload its configuration
...
pathops.PathProtocol
provides a subset of the pathlib.Path
API. PathProtocol
doesn't support relative paths, open
, or manipulating hardlinks and symlinks.
pathops
doesn't provide a separate chmod
method, as Pebble doesn't currently support this. Instead, mkdir
, write_bytes
, and write_text
have arguments mode
, user
, and group
to set directory or file permissions and ownership. ensure_contents
also has these arguments.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file charmlibs_pathops-1.0.0.tar.gz
.
File metadata
- Download URL: charmlibs_pathops-1.0.0.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 84637424b3069a1d85c8094bbf90232dc38ba8dfb63f794bf0d99b3a32be0ae3 |
|
MD5 | 42b31f330a9637407f5d77b6d9ed99df |
|
BLAKE2b-256 | 57ad1e4b5d6de8475c732eb11505c018534d4358b17ce3d381e02b183a339c49 |
Provenance
The following attestation bundles were made for charmlibs_pathops-1.0.0.tar.gz
:
Publisher:
publish-charmlibs-pathops-package.yaml
on canonical/charmtech-charmlibs
-
Statement:
- Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
charmlibs_pathops-1.0.0.tar.gz
- Subject digest:
84637424b3069a1d85c8094bbf90232dc38ba8dfb63f794bf0d99b3a32be0ae3
- Sigstore transparency entry: 202423048
- Sigstore integration time:
- Permalink:
canonical/charmtech-charmlibs@518bb6b171a4d480a7cef66fd75869b1652c4eff
- Branch / Tag:
refs/tags/pathops-v1.0.0
- Owner: https://github.com/canonical
- Access:
public
- Token Issuer:
https://token.actions.githubusercontent.com
- Runner Environment:
github-hosted
- Publication workflow:
publish-charmlibs-pathops-package.yaml@518bb6b171a4d480a7cef66fd75869b1652c4eff
- Trigger Event:
push
- Statement type:
File details
Details for the file charmlibs_pathops-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: charmlibs_pathops-1.0.0-py3-none-any.whl
- Upload date:
- Size: 26.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4f59552faa9f417df40fbefc6a1ec96f24687442693f185d616a1ff1d003b78d |
|
MD5 | 765fad01c3743f8c141ae3af01674074 |
|
BLAKE2b-256 | 6ebb5788644daacdad762cfce174cff6b271103e1557cd4d43ae5f0fd597fe1f |
Provenance
The following attestation bundles were made for charmlibs_pathops-1.0.0-py3-none-any.whl
:
Publisher:
publish-charmlibs-pathops-package.yaml
on canonical/charmtech-charmlibs
-
Statement:
- Statement type:
https://in-toto.io/Statement/v1
- Predicate type:
https://docs.pypi.org/attestations/publish/v1
- Subject name:
charmlibs_pathops-1.0.0-py3-none-any.whl
- Subject digest:
4f59552faa9f417df40fbefc6a1ec96f24687442693f185d616a1ff1d003b78d
- Sigstore transparency entry: 202423050
- Sigstore integration time:
- Permalink:
canonical/charmtech-charmlibs@518bb6b171a4d480a7cef66fd75869b1652c4eff
- Branch / Tag:
refs/tags/pathops-v1.0.0
- Owner: https://github.com/canonical
- Access:
public
- Token Issuer:
https://token.actions.githubusercontent.com
- Runner Environment:
github-hosted
- Publication workflow:
publish-charmlibs-pathops-package.yaml@518bb6b171a4d480a7cef66fd75869b1652c4eff
- Trigger Event:
push
- Statement type: