diff --git a/docs/drydock_client.rst b/docs/drydock_client.rst new file mode 100644 index 00000000..66ac4187 --- /dev/null +++ b/docs/drydock_client.rst @@ -0,0 +1,82 @@ +=========================================================== + drydock_client - client for drydock_provisioner RESTful API +=========================================================== + +The drydock_client module can be used to access a remote (or local) +Drydock REST API server. It supports tokenized authentication and +marking API calls with an external context marker for log aggregation. + +It is composed of two parts - a DrydockSession which denotes the call +context for the API and a DrydockClient which gives access to actual +API calls. + +Simple Usage +============ + +The usage pattern for drydock_client is to build a DrydockSession +with your credentials and the target host. Then use this session +to build a DrydockClient to make one or more API calls. The +DrydockSession will care for TCP connection pooling and header +management:: + + import drydock_provisioner.drydock_client.client as client + import drydock_provisioner.drydock_client.session as session + + dd_session = session.DrydockSession('host.com', port=9000, token='abc123') + dd_client = client.DrydockClient(dd_session) + + drydock_task = dd_client.get_task('ba44e582-6b26-11e7-81cc-080027ef795a') + +Drydock Client Method API +========================= + +drydock_client.client.DrydockClient supports the following methods for +accessing the Drydock RESTful API + +get_design_ids +-------------- + +Return a list of UUID-formatted design IDs + +get_design +---------- + +Provide a UUID-formatted design ID, receive back a dictionary representing +a objects.site.SiteDesign instance. You can provide the kwarg 'source' with +the value of 'compiled' to see the site design after inheritance is applied. + +create_design +------------- + +Create a new design. Optionally provide a new base design (by UUID-formatted +design_id) that the new design uses as the starting state. Receive back a +UUID-formatted string of design_id + +get_part +-------- + +Get the attributes of a particular design part. Provide the design_id the part +is loaded in, the kind (one of 'Region', 'NetworkLink', 'Network', 'HardwareProfile', +'HostProfile' or 'BaremetalNode' and the part key (i.e. name). You can provide the kwarg +'source' with the value of 'compiled' to see the site design after inheritance is +applied. + +load_parts +---------- + +Parse a provided YAML string and load the parts into the provided design context + +get_tasks +--------- + +Get a list of all task ids + +get_task +-------- + +Get the attributes of the task identified by the provided task_id + +create_task +----------- + +Create a task to execute the provided action on the provided design context diff --git a/drydock_provisioner/drivers/node/maasdriver/driver.py b/drydock_provisioner/drivers/node/maasdriver/driver.py index 17082f96..1f4573e3 100644 --- a/drydock_provisioner/drivers/node/maasdriver/driver.py +++ b/drydock_provisioner/drivers/node/maasdriver/driver.py @@ -74,7 +74,7 @@ class MaasNodeDriver(NodeDriver): status=hd_fields.TaskStatus.Complete, result=hd_fields.ActionResult.Success) return - except errors.TransientDriverError(ex): + except errors.TransientDriverError as ex: result = { 'retry': True, 'detail': str(ex), @@ -84,7 +84,7 @@ class MaasNodeDriver(NodeDriver): result=hd_fields.ActionResult.Failure, result_details=result) return - except errors.PersistentDriverError(ex): + except errors.PersistentDriverError as ex: result = { 'retry': False, 'detail': str(ex), @@ -94,7 +94,7 @@ class MaasNodeDriver(NodeDriver): result=hd_fields.ActionResult.Failure, result_details=result) return - except Exception(ex): + except Exception as ex: result = { 'retry': False, 'detail': str(ex), diff --git a/drydock_provisioner/ingester/plugins/yaml.py b/drydock_provisioner/ingester/plugins/yaml.py index f9e6b7d7..0aac87d8 100644 --- a/drydock_provisioner/ingester/plugins/yaml.py +++ b/drydock_provisioner/ingester/plugins/yaml.py @@ -333,6 +333,7 @@ class YamlIngester(IngesterPlugin): node_metadata = spec.get('metadata', {}) metadata_tags = node_metadata.get('tags', []) + model.tags = metadata_tags owner_data = node_metadata.get('owner_data', {}) model.owner_data = {}