From 6fe167c03e637a594f45f07c97b9202231d6813f Mon Sep 17 00:00:00 2001 From: Daryl Walleck Date: Wed, 9 Apr 2014 13:53:12 -0500 Subject: [PATCH] Adds basic client methods for Ironic * Added basic API operations for chassis, drivers, nodes, and ports Change-Id: Id1cea2a1a4eb1557b4957f5b3dddeede1aea3adb --- cloudcafe/bare_metal/chassis/client.py | 106 ++++++++++++++++ cloudcafe/bare_metal/config.py | 16 +++ cloudcafe/bare_metal/drivers/client.py | 47 ++++++++ .../bare_metal/drivers/models/requests.py | 15 --- cloudcafe/bare_metal/nodes/client.py | 114 ++++++++++++++++++ cloudcafe/bare_metal/ports/client.py | 96 +++++++++++++++ 6 files changed, 379 insertions(+), 15 deletions(-) delete mode 100644 cloudcafe/bare_metal/drivers/models/requests.py diff --git a/cloudcafe/bare_metal/chassis/client.py b/cloudcafe/bare_metal/chassis/client.py index 52e3d4c2..930546de 100644 --- a/cloudcafe/bare_metal/chassis/client.py +++ b/cloudcafe/bare_metal/chassis/client.py @@ -13,3 +13,109 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ + +from cafe.engine.http.client import AutoMarshallingHTTPClient + +from cloudcafe.bare_metal.chassis.models.responses import Chassis, ChassisList +from cloudcafe.bare_metal.chassis.models.requests import CreateChassis +from cloudcafe.bare_metal.nodes.models.responses import Nodes + + +class ChassisClient(AutoMarshallingHTTPClient): + + def __init__( + self, url, auth_token, serialize_format=None, + deserialize_format=None): + + super(ChassisClient, self).__init__( + serialize_format, deserialize_format) + + self.url = url + self.auth_token = auth_token + self.default_headers['X-Auth-Token'] = auth_token + self.default_headers['Content-Type'] = 'application/{0}'.format( + self.serialize_format) + self.default_headers['Accept'] = 'application/{0}'.format( + self.deserialize_format) + + def list_chassis(self, requestslib_kwargs=None): + """ + @summary: Lists all chassis. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/chassis'.format(base_url=self.url) + resp = self.get(url, response_entity_type=ChassisList, + requestslib_kwargs=requestslib_kwargs) + return resp + + def list_chassis_with_details(self, requestslib_kwargs=None): + """ + @summary: Lists all chassis with details. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/chassis/detail'.format(base_url=self.url) + resp = self.get(url, response_entity_type=ChassisList, + requestslib_kwargs=requestslib_kwargs) + return resp + + def list_nodes_for_chassis(self, uuid, requestslib_kwargs=None): + """ + @summary: Lists all nodes associated with a chassis. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/chassis/{chassis}/nodes'.format( + base_url=self.url, chassis=uuid) + resp = self.get(url, response_entity_type=Nodes, + requestslib_kwargs=requestslib_kwargs) + return resp + + def get_chassis(self, uuid, requestslib_kwargs=None): + """ + @summary: Retrieves the details of an individual chassis. + @param uuid: The uuid of an existing chassis + @type uuid: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/chassis/{uuid}'.format( + base_url=self.url, uuid=uuid) + resp = self.get(url, response_entity_type=Chassis, + requestslib_kwargs=requestslib_kwargs) + return resp + + def create_chassis(self, description=None, extra=None, + requestslib_kwargs=None): + """ + @summary: Creates a chassis from the provided parameters. + @param description: Description of the chassis + @type description: String + @param description: Extra metadata for the chassis + @type description: Dict + @return: resp + @rtype: Requests.response + """ + request = CreateChassis( + description=description, extra=extra) + + url = '{base_url}/chassis'.format(base_url=self.url) + resp = self.post(url, + response_entity_type=Chassis, + request_entity=request, + requestslib_kwargs=requestslib_kwargs) + return resp + + def delete_chassis(self, uuid, requestslib_kwargs=None): + """ + @summary: Deletes the specified chassis. + @param uuid: The uuid of a chassis + @type uuid: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/chassis/{uuid}'.format( + base_url=self.url, uuid=uuid) + resp = self.delete(url, requestslib_kwargs=requestslib_kwargs) + return resp diff --git a/cloudcafe/bare_metal/config.py b/cloudcafe/bare_metal/config.py index 826f21b0..ce6b1f5f 100644 --- a/cloudcafe/bare_metal/config.py +++ b/cloudcafe/bare_metal/config.py @@ -27,3 +27,19 @@ class MarshallingConfig(ConfigSectionInterface): @property def deserializer(self): return self.get("deserialize_format") + + +class BareMetalEndpointConfig(ConfigSectionInterface): + SECTION_NAME = 'bare_metal_endpoint' + + @property + def region(self): + return self.get("region") + + @property + def bare_metal_endpoint_name(self): + return self.get("bare_metal_endpoint_name") + + @property + def bare_metal_endpoint_url(self): + return self.get("bare_metal_endpoint_url") diff --git a/cloudcafe/bare_metal/drivers/client.py b/cloudcafe/bare_metal/drivers/client.py index 52e3d4c2..a2da6591 100644 --- a/cloudcafe/bare_metal/drivers/client.py +++ b/cloudcafe/bare_metal/drivers/client.py @@ -13,3 +13,50 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ + +from cafe.engine.http.client import AutoMarshallingHTTPClient + +from cloudcafe.bare_metal.drivers.models.responses import Driver, Drivers + + +class DriversClient(AutoMarshallingHTTPClient): + + def __init__( + self, url, auth_token, serialize_format=None, + deserialize_format=None): + + super(DriversClient, self).__init__( + serialize_format, deserialize_format) + + self.url = url + self.auth_token = auth_token + self.default_headers['X-Auth-Token'] = auth_token + self.default_headers['Content-Type'] = 'application/{0}'.format( + self.serialize_format) + self.default_headers['Accept'] = 'application/{0}'.format( + self.deserialize_format) + + def list_drivers(self, requestslib_kwargs=None): + """ + @summary: Lists all drivers with details. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/drivers'.format(base_url=self.url) + resp = self.get(url, response_entity_type=Drivers, + requestslib_kwargs=requestslib_kwargs) + return resp + + def get_driver(self, name, requestslib_kwargs=None): + """ + @summary: Retrieves the details of an individual driver. + @param name: The uuid of an existing port + @type name: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/drivers/{uuid}'.format( + base_url=self.url, uuid=name) + resp = self.get(url, response_entity_type=Driver, + requestslib_kwargs=requestslib_kwargs) + return resp diff --git a/cloudcafe/bare_metal/drivers/models/requests.py b/cloudcafe/bare_metal/drivers/models/requests.py deleted file mode 100644 index 52e3d4c2..00000000 --- a/cloudcafe/bare_metal/drivers/models/requests.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -Copyright 2014 Rackspace - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -""" diff --git a/cloudcafe/bare_metal/nodes/client.py b/cloudcafe/bare_metal/nodes/client.py index 52e3d4c2..483f11ba 100644 --- a/cloudcafe/bare_metal/nodes/client.py +++ b/cloudcafe/bare_metal/nodes/client.py @@ -13,3 +13,117 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ + +from cafe.engine.http.client import AutoMarshallingHTTPClient + +from cloudcafe.bare_metal.nodes.models.responses import Node, Nodes +from cloudcafe.bare_metal.nodes.models.requests import CreateNode +from cloudcafe.bare_metal.ports.models.responses import Ports + + +class NodesClient(AutoMarshallingHTTPClient): + + def __init__( + self, url, auth_token, serialize_format=None, + deserialize_format=None): + + super(NodesClient, self).__init__( + serialize_format, deserialize_format) + + self.url = url + self.auth_token = auth_token + self.default_headers['X-Auth-Token'] = auth_token + self.default_headers['Content-Type'] = 'application/{0}'.format( + self.serialize_format) + self.default_headers['Accept'] = 'application/{0}'.format( + self.deserialize_format) + + def list_nodes(self, requestslib_kwargs=None): + """ + @summary: Lists all nodes. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/nodes'.format(base_url=self.url) + resp = self.get(url, response_entity_type=Nodes, + requestslib_kwargs=requestslib_kwargs) + return resp + + def list_nodes_with_details(self, requestslib_kwargs=None): + """ + @summary: Lists all nodes with details. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/nodes/detail'.format(base_url=self.url) + resp = self.get(url, response_entity_type=Nodes, + requestslib_kwargs=requestslib_kwargs) + return resp + + def list_ports_for_node(self, uuid, requestslib_kwargs=None): + """ + @summary: Lists all nodes with details. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/nodes/{uuid}/ports'.format( + base_url=self.url, uuid=uuid) + resp = self.get(url, response_entity_type=Ports, + requestslib_kwargs=requestslib_kwargs) + return resp + + def get_node(self, uuid, requestslib_kwargs=None): + """ + @summary: Retrieves the details of an individual node. + @param uuid: The uuid of an existing node + @type uuid: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/nodes/{uuid}'.format( + base_url=self.url, uuid=uuid) + resp = self.get(url, response_entity_type=Node, + requestslib_kwargs=requestslib_kwargs) + return resp + + def create_node( + self, chassis_uuid, driver=None, properties=None, + driver_info=None, extra=None, requestslib_kwargs=None): + """ + @summary: Creates a node from the provided parameters. + @param chassis_uuid: The chassis the node is associated with + @type chassis_uuid: String + @param driver: The driver used to control the node + @type driver: String + @param properties: The physical characteristics of the node + @type properties: Dict + @param driver_info: Configuration parameters for the driver + @type driver_info: Dict + @param extra: Extra metadata for the node + @type extra: Dict + @return: resp + @rtype: Requests.response + """ + request = CreateNode( + chassis_uuid=chassis_uuid, driver=driver, properties=properties, + driver_info=driver_info, extra=extra) + + url = '{base_url}/nodes'.format(base_url=self.url) + resp = self.post(url, + response_entity_type=Node, + request_entity=request, + requestslib_kwargs=requestslib_kwargs) + return resp + + def delete_node(self, uuid, requestslib_kwargs=None): + """ + @summary: Deletes the specified node. + @param uuid: The uuid of a node + @type uuid: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/nodes/{uuid}'.format( + base_url=self.url, uuid=uuid) + resp = self.delete(url, requestslib_kwargs=requestslib_kwargs) + return resp diff --git a/cloudcafe/bare_metal/ports/client.py b/cloudcafe/bare_metal/ports/client.py index 52e3d4c2..ad61095f 100644 --- a/cloudcafe/bare_metal/ports/client.py +++ b/cloudcafe/bare_metal/ports/client.py @@ -13,3 +13,99 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ + +from cafe.engine.http.client import AutoMarshallingHTTPClient + +from cloudcafe.bare_metal.ports.models.responses import Port, Ports +from cloudcafe.bare_metal.ports.models.requests import CreatePort + + +class PortsClient(AutoMarshallingHTTPClient): + + def __init__( + self, url, auth_token, serialize_format=None, + deserialize_format=None): + + super(PortsClient, self).__init__( + serialize_format, deserialize_format) + + self.url = url + self.auth_token = auth_token + self.default_headers['X-Auth-Token'] = auth_token + self.default_headers['Content-Type'] = 'application/{0}'.format( + self.serialize_format) + self.default_headers['Accept'] = 'application/{0}'.format( + self.deserialize_format) + + def list_ports(self, requestslib_kwargs=None): + """ + @summary: Lists all ports. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/ports'.format(base_url=self.url) + resp = self.get(url, response_entity_type=Ports, + requestslib_kwargs=requestslib_kwargs) + return resp + + def list_ports_with_detail(self, requestslib_kwargs=None): + """ + @summary: Lists all ports with details. + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/ports/detail'.format(base_url=self.url) + resp = self.get(url, response_entity_type=Ports, + requestslib_kwargs=requestslib_kwargs) + return resp + + def get_port(self, uuid, requestslib_kwargs=None): + """ + @summary: Retrieves the details of an individual port. + @param uuid: The uuid of an existing port + @type uuid: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/ports/{uuid}'.format( + base_url=self.url, uuid=uuid) + resp = self.get(url, response_entity_type=Port, + requestslib_kwargs=requestslib_kwargs) + return resp + + def create_port( + self, node_uuid=None, address=None, extra=None, + requestslib_kwargs=None): + """ + @summary: Creates a port from the provided parameters. + @param node_uuid: The node the port is associated with + @type node_uuid: String + @param address: The MAC address of the port + @type address: String + @param extra: Extra metadata for the node + @type extra: Dict + @return: resp + @rtype: Requests.response + """ + request = CreatePort( + node_uuid=node_uuid, address=address, extra=extra) + + url = '{base_url}/ports'.format(base_url=self.url) + resp = self.post(url, + response_entity_type=Port, + request_entity=request, + requestslib_kwargs=requestslib_kwargs) + return resp + + def delete_port(self, uuid, requestslib_kwargs=None): + """ + @summary: Deletes the specified port. + @param uuid: The uuid of a port + @type uuid: String + @return: resp + @rtype: Requests.response + """ + url = '{base_url}/ports/{uuid}'.format( + base_url=self.url, uuid=uuid) + resp = self.delete(url, requestslib_kwargs=requestslib_kwargs) + return resp