The current Entity Models in the client are a bit awkward to use. This blueprint proposes refactoring some functionality to make the API more usable and consistent.
The Entity Models in barbicanclient should be refactored to provide a more Pythonic api. This refactor will make the existing Entities consistent with the recently approved Containers blueprint. 
Refactor existing Models to provide methods for actions that affect a single entity inside the entity class. This will allow for worflows that only affect a single entity to be completed without the need for a reference to the corresponding EntityManager subclass.
The Secret entity should be refactored to add a store() method and a payload property:
from barbicanclient import client # Set up client connection connection = client.Client(tenant_id="1", endpoint=ENDPOINT, insecure=True) # Create a new Secret my_secret = connection.secrets.Secret(name="My secret name", payload="the secret sauce") my_secret.store() # Alternatively set Secret properties instead of passing args my_secret = connection.secrets.Secret() my_secret.name = "My secret name" my_secret.payload = "the secret sauce" my_secret.store()
Similarly, Orders should allow both args to the constructor as well as setting properties directly. We should also add a submit() method to submit the order to the API:
from barbicanclient import client # Set up client connection connection = client.Client(tenant_id="1", endpoint=ENDPOINT, insecure=True) # Create and submit a new Order my_order = connection.orders.Order( name="My Order", payload_content_type="application/octet-stream" algorithm="AES", mode="CBC", bit_length=256, expiration=None ) my_order.submit() # Alternatively set the Order properties instead of passing args my_order = connection.orders.Order() my_order.name = "My Order" my_order.payload_content_type = "application/octet-stream" my_order.algorithm = "AES" my_order.mode = "CBC" my_order.bit_length = 256 my_order.expiration = None my_order.submit()
Listing entities should still be handled via the corresponding EntityManager. The ability to decrypt a secret, however, should be moved to the Secret class, and removed from the SecretManager.
Retrieving entities should be moved from the EntityManager (replacing the get() function) to the Entity constructor. For example:
my_secret = connection.secrets.Secret(secret_ref=SECRET_REF) my_order = connection.orders.Order(order_ref=ORDER_REF)
Deleting entities can either be done with the existing EntityManager delete(entity_ref) or with a new Entity function, delete(). An example using a Secret:
# New method my_secret = connection.secrets.Secret(secret_ref=SECRET_REF) my_secret.delete() # Old way still works connection.secrets.delete(secret_ref=SECRET_REF)
We could continue to use the objects as they currently exist.
Also note that the Orders functionality will need to be revisited once the Typed Orders implementation lands. 
Logging should be done in a manner consistent with the rest of the library.
This change will require rewriting how Secret objects are consumed, and will require a new major version for the client library.
Blueprint Draft: Douglas Mendizábal (redrobot) Implementation: Adam Harwell (rm_work)
Testing should be consistent with existing testing in the library.
Common workflows will have to be updated to give examples on how to use the refactored classes.
Containers in the Client etherpad: https://etherpad.openstack.org/p/python-barbicanclient-containers Containers Blueprint: http://specs.openstack.org/openstack/barbican-specs/specs/juno/client-add-containers.html