Skip to main content

The Python library behind great charms

Project description

The ops library

The ops library is a Python framework (available on PyPI) for developing and testing Juju charms in a consistent way, using standard Python constructs to allow for clean, maintainable, and reusable code.

A charm is an operator -- business logic encapsulated in a reusable software package that automates every aspect of an application's life.

Charms written with ops support Kubernetes using Juju's "sidecar charm" pattern, as well as charms that deploy to Linux-based machines and containers.

Charms should do one thing and do it well. Each charm drives a single application and can be integrated with other charms to deliver a complex system. A charm handles creating the application in addition to scaling, configuration, optimisation, networking, service mesh, observability, and other day-2 operations specific to the application.

The ops library is part of the Charm SDK (the other part being Charmcraft). Full developer documentation for the Charm SDK is available at https://juju.is/docs/sdk.

To learn more about Juju, visit https://juju.is/docs/olm.

Pure Python

The framework provides a standardised Python object model that represents the application graph, as well as an event-handling mechanism for distributed system coordination and communication.

The latest version of ops requires Python 3.8 or above.

Juju itself is written in Go for efficient concurrency even in large deployments. Charms can be written in any language, however, we recommend using Python with this framework to make development easier and more standardised. All new charms at Canonical are written using it.

Getting started

A package of operator code is called a charmed operator or simply "charm". You'll use charmcraft to register your charm name and publish it when you are ready. You can follow one of our charming tutorials to get started writing your first charm.

Testing your charms

The framework provides a testing harness, so you can ensure that your charm does the right thing in different scenarios, without having to create a full deployment. Our API documentation has the details, including this example:

class TestCharm(unittest.TestCase):
    def test_foo(self):
        harness = Harness(MyCharm)
        self.addCleanup(harness.cleanup)  # always clean up after ourselves

        # Instantiate the charm and trigger events that Juju would on startup
        harness.begin_with_initial_hooks()

        # Update charm config and trigger config-changed
        harness.update_config({'log_level': 'warn'})

        # Check that charm properly handled config-changed, for example,
        # the charm added the correct Pebble layer
        plan = harness.get_container_pebble_plan('prometheus')
        self.assertIn('--log.level=warn', plan.services['prometheus'].command)

Talk to us

If you need help, have ideas, or would just like to chat with us, reach out on the Charmhub Mattermost.

We also pay attention to the Charmhub Discourse.

And of course you can deep dive into the API reference.

Development of the framework

See HACKING.md for details on dev environments, testing, and so on.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ops-2.8.0.tar.gz (247.5 kB view details)

Uploaded Source

Built Distribution

ops-2.8.0-py3-none-any.whl (149.5 kB view details)

Uploaded Python 3

File details

Details for the file ops-2.8.0.tar.gz.

File metadata

  • Download URL: ops-2.8.0.tar.gz
  • Upload date:
  • Size: 247.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ops-2.8.0.tar.gz
Algorithm Hash digest
SHA256 bf7788fc6a79ee6fc9cc21f98be80fa685a605257ea8e5406f08a2e0a2dcdcb5
MD5 c8c05f9f7bffe2d5a91b8ea417381fa7
BLAKE2b-256 5e9976add92d22c8d3d4e43d61f704e5a50d290d282cc8e3bc37f64a52deb4c7

See more details on using hashes here.

File details

Details for the file ops-2.8.0-py3-none-any.whl.

File metadata

  • Download URL: ops-2.8.0-py3-none-any.whl
  • Upload date:
  • Size: 149.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.6

File hashes

Hashes for ops-2.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 31736fd98f327d3a4b8825e5d37c077ec838dd0b2579ffbb3852521b01f37b98
MD5 47712e30ce5b2c9b24064222f4369250
BLAKE2b-256 22e078e33042f4851e38dbb2c7802ab7083dfa3ad02c7ca81eeac341596edaa8

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page