From a9a157a6c8c6ff935d1033eafee08b90255f17c6 Mon Sep 17 00:00:00 2001 From: Leonardo Maycotte Date: Thu, 18 Sep 2014 07:22:54 -0500 Subject: [PATCH] Updting networks, subnets and ports client comments with @type Adding query params for filtering and pagination at list client methods Updating update_subnet client method with allocation_pools param (now updatable) Change-Id: Id4029543968bd0cc8d17a43eb7147ecf60819b9e --- .../networks/networks_api/client.py | 98 +++++++++--- .../networking/networks/ports_api/client.py | 129 ++++++++++++---- .../networking/networks/subnets_api/client.py | 145 +++++++++++++----- 3 files changed, 275 insertions(+), 97 deletions(-) diff --git a/cloudcafe/networking/networks/networks_api/client.py b/cloudcafe/networking/networks/networks_api/client.py index 264cf6d3..5b6372d3 100644 --- a/cloudcafe/networking/networks/networks_api/client.py +++ b/cloudcafe/networking/networks/networks_api/client.py @@ -26,12 +26,17 @@ class NetworksClient(AutoMarshallingHTTPClient): def __init__(self, url, auth_token, serialize_format=None, deserialize_format=None, tenant_id=None): """ - @param string url: Base URL for the networks service - @param string auth_token: Auth token to be used for all requests - @param string serialize_format: Format for serializing requests - @param string deserialize_format: Format for de-serializing responses - @param string tenant_id: optional tenant id to be included in the + @param url: Base URL for the networks service + @type url: string + @param auth_token: Auth token to be used for all requests + @type auth_token: string + @param serialize_format: Format for serializing requests + @type serialize_format: string + @param deserialize_format: Format for de-serializing responses + @type deserialize_format: string + @param tenant_id: optional tenant id to be included in the header if given + @type tenant_id: string """ super(NetworksClient, self).__init__(serialize_format, deserialize_format) @@ -53,14 +58,20 @@ class NetworksClient(AutoMarshallingHTTPClient): tenant_id=None, requestslib_kwargs=None): """ @summary: Creates a Network - @param string name: human readable name for the network, + @param name: human readable name for the network, may not be unique. (CRUD: CRU) - @param bool admin_state_up: true or false, the admin state + @type name: string + @param admin_state_up: true or false, the admin state of the network. If down, the network does not forward packets. Default value is True (CRUD: CRU) - @param bool shared: specifies if the network can be accessed by any + @type admin_state_up: bool + @param shared: specifies if the network can be accessed by any tenant. Default value is False. (CRUD: CRU) - @param string tenant_id: owner of the network. (CRUD: CR) + @type shared: bool + @param tenant_id: owner of the network. (CRUD: CR) + @type tenant_id: string + @return: network create response + @rtype: Requests.response """ url = '{base_url}/networks'.format(base_url=self.url) @@ -77,15 +88,22 @@ class NetworksClient(AutoMarshallingHTTPClient): shared=None, tenant_id=None, requestslib_kwargs=None): """ @summary: Updates a specified Network - @param string network_id: The UUID for the network - @param string name: human readable name for the network, - may not be unique. (CRUD: CRU) - @param bool admin_state_up: true or false, the admin state - of the network. If down, the network does not forward packets. - Default value is True (CRUD: CRU) - @param bool shared: specifies if the network can be accessed by any - tenant. Default value is False. (CRUD: CRU) - @param string tenant_id: owner of the network. (CRUD: CR) + @param network_id: The UUID for the network + @type network_id: string + @param name: human readable name for the network, may not be unique. + (CRUD: CRU) + @type name: string + @param admin_state_up: true or false, the admin state of the network. + If down, the network does not forward packets. Default value is + True (CRUD: CRU) + @type admin_state_up: bool + @param shared: specifies if the network can be accessed by any tenant. + Default value is False. (CRUD: CRU) + @type shared: bool + @param tenant_id: owner of the network. (CRUD: CR) + @type tenant_id: string + @return: update network response + @rtype: Requests.response """ url = '{base_url}/networks/{network_id}'.format( @@ -102,7 +120,10 @@ class NetworksClient(AutoMarshallingHTTPClient): def get_network(self, network_id, requestslib_kwargs=None): """ @summary: Shows information for a specified network - @param string network_id: The UUID for the network + @param network_id: The UUID for the network + @type network_id: string + @return: get network response + @rtype: Requests.response """ url = '{base_url}/networks/{network_id}'.format( @@ -112,14 +133,40 @@ class NetworksClient(AutoMarshallingHTTPClient): requestslib_kwargs=requestslib_kwargs) return resp - def list_networks(self, requestslib_kwargs=None): + def list_networks(self, network_id=None, name=None, status=None, + admin_state_up=None, shared=None, tenant_id=None, + limit=None, marker=None, page_reverse=None, + requestslib_kwargs=None): """ - @summary: Lists networks + @summary: Lists networks, filtered by params if given + @param network_id: network ID to filter by + @type network_id: string + @param name: network name to filter by + @type name: string + @param status: network status to filter by + @type status: string + @param admin_state_up: Admin state of the network to filter by + @type admin_state_up: bool + @param shared: If network is shared across tenants status to filter by + @type shared: bool + @param tenant_id: tenant ID network owner to filter by + @type tenant_id: string + @param limit: page size + @type limit: int + @param marker: Id of the last item of the previous page + @type marker: string + @param page_reverse: direction of the page + @type page_reverse: bool + @return: list networks response + @rtype: Requests.response """ - # TODO: add field query params to filter the response + params = {'id': network_id, 'name': name, 'status': status, + 'admin_state_up': admin_state_up, 'shared': shared, + 'tenant_id': tenant_id, 'limit': limit, 'marker': marker, + 'page_reverse': page_reverse} url = '{base_url}/networks'.format(base_url=self.url) - resp = self.request('GET', url, + resp = self.request('GET', url, params=params, response_entity_type=Networks, requestslib_kwargs=requestslib_kwargs) return resp @@ -127,7 +174,10 @@ class NetworksClient(AutoMarshallingHTTPClient): def delete_network(self, network_id, requestslib_kwargs=None): """ @summary: Deletes a specified network and its associated resources - @param string network_id: The UUID for the network + @param network_id: The UUID for the network + @type network_id: string + @return: delete network response + @rtype: Requests.response """ url = '{base_url}/networks/{network_id}'.format( diff --git a/cloudcafe/networking/networks/ports_api/client.py b/cloudcafe/networking/networks/ports_api/client.py index e93d48ae..29e6eef6 100644 --- a/cloudcafe/networking/networks/ports_api/client.py +++ b/cloudcafe/networking/networks/ports_api/client.py @@ -25,12 +25,17 @@ class PortsClient(AutoMarshallingHTTPClient): def __init__(self, url, auth_token, serialize_format=None, deserialize_format=None, tenant_id=None): """ - @param string url: Base URL for the ports service - @param string auth_token: Auth token to be used for all requests - @param string serialize_format: Format for serializing requests - @param string deserialize_format: Format for de-serializing responses - @param string tenant_id: optional tenant id to be included in the + @param url: Base URL for the ports service + @type url: string + @param auth_token: Auth token to be used for all requests + @type auth_token: string + @param serialize_format: Format for serializing requests + @type serialize_format: string + @param deserialize_format: Format for de-serializing responses + @type deserialize_format: string + @param tenant_id: optional tenant id to be included in the header if given + @type tenant_id: string """ super(PortsClient, self).__init__(serialize_format, deserialize_format) @@ -54,21 +59,31 @@ class PortsClient(AutoMarshallingHTTPClient): requestslib_kwargs=None): """ @summary: Creates a Port - @param string network_id: network port is associated with (CRUD: CR) - @param string name: human readable name for the port, + @param network_id: network port is associated with (CRUD: CR) + @type network_id: string + @param name: human readable name for the port, may not be unique. (CRUD: CRU) - @param bool admin_state_up: true or false (default true), + @type name: string + @param admin_state_up: true or false (default true), the admin state of the port. If down, the port does not forward packets (CRUD: CRU) - @param string mac_address: mac address to use on the port (CRUD: CR) - @param list(dict) fixed_ips: ip addresses for the port associating the - port with the subnets where the IPs come from (CRUD: CRU) - @param string device_id: id of device using this port (CRUD: CRUD) - @param string device_owner: entity using this port (ex. dhcp agent, - CRUD: CRUD) - @param string tenant_id: owner of the port (CRUD: CR) - @param list(dict) security_groups: ids of any security groups - associated with the port (CRUD: CRUD) + @type admin_state_up: bool + @param mac_address: mac address to use on the port (CRUD: CR) + @type mac_address: string + @param fixed_ips: ip addresses for the port associating the port with + the subnets where the IPs come from (CRUD: CRU) + @type fixed_ips: list(dict) + @param device_id: id of device using this port (CRUD: CRUD) + @type device_id: string + @param device_owner: entity using this port (ex. dhcp agent,CRUD: CRUD) + @type device_owner: string + @param tenant_id: owner of the port (CRUD: CR) + @type tenant_id: string + @param security_groups: ids of any security groups associated with the + port (CRUD: CRUD) + @type security_groups: list(dict) + @return: port create response + @rtype: Requests.response """ url = '{base_url}/ports'.format(base_url=self.url) @@ -90,19 +105,27 @@ class PortsClient(AutoMarshallingHTTPClient): security_groups=None, requestslib_kwargs=None): """ @summary: Updates a specified Port - @param string port_id: The UUID for the port - @param string name: human readable name for the port, - may not be unique. (CRUD: CRU) - @param bool admin_state_up: true or false (default true), - the admin state of the port. If down, the port does not forward - packets (CRUD: CRU) - @param list(dict) fixed_ips: ip addresses for the port associating the - port with the subnets where the IPs come from (CRUD: CRU) - @param string device_id: id of device using this port (CRUD: CRUD) + @param port_id: The UUID for the port + @type port_id: string + @param name: human readable name for the port, may not be unique + (CRUD: CRU) + @type name: string + @param admin_state_up: true or false (default true), the admin state + of the port. If down, the port does not forward packets (CRUD: CRU) + @type admin_state_up: bool + @param fixed_ips: ip addresses for the port associating the port with + the subnets where the IPs come from (CRUD: CRU) + @type fixed_ips: list(dict) + @param device_id: id of device using this port (CRUD: CRUD) + @type device_id: string @param string device_owner: entity using this port (ex. dhcp agent, CRUD: CRUD) - @param list(dict) security_groups: ids of any security groups - associated with the port (CRUD: CRUD) + @type device_owner: string + @param security_groups: ids of any security groups associated with the + port (CRUD: CRUD) + @type security_groups: list(dict) + @return: update port response + @rtype: Requests.response """ url = '{base_url}/ports/{port_id}'.format( @@ -120,7 +143,10 @@ class PortsClient(AutoMarshallingHTTPClient): def get_port(self, port_id, requestslib_kwargs=None): """ @summary: Shows information for a specified port - @param string port_id: The UUID for the port + @param port_id: The UUID for the port + @type port_id: string + @return: get port response + @rtype: Requests.response """ url = '{base_url}/ports/{port_id}'.format( @@ -130,14 +156,48 @@ class PortsClient(AutoMarshallingHTTPClient): requestslib_kwargs=requestslib_kwargs) return resp - def list_ports(self, requestslib_kwargs=None): + def list_ports(self, port_id=None, network_id=None, name=None, status=None, + admin_state_up=None, device_id=None, tenant_id=None, + device_owner=None, mac_address=None, limit=None, + marker=None, page_reverse=None, requestslib_kwargs=None): """ - @summary: Lists ports + @summary: Lists ports, filtered by params if given + @param port_id: The UUID for the port to filter by + @type port_id: string + @param network_id: network ID to filter by + @type network_id: string + @param name: port name to filter by + @type name: string + @param status: port status to filter by + @type status: string + @param admin_state_up: Admin state of the port to filter by + @type admin_state_up: bool + @param device_id: id of device to filter by + @type device_id: string + @param tenant_id: owner of the port to filter by + @type tenant_id: string + @param device_owner: device owner to filter by + @type device_owner: string + @param mac_address: mac address to filter by + @type mac_address: string + @param limit: page size + @type limit: int + @param marker: Id of the last item of the previous page + @type marker: string + @param page_reverse: direction of the page + @type page_reverse: bool + @return: list ports response + @rtype: Requests.response """ - # TODO: add field query params to filter the response + params = {'id': port_id, 'network_id': network_id, 'name': name, + 'status': status, 'admin_state_up': admin_state_up, + 'device_id': device_id, 'tenant_id': tenant_id, + 'device_owner': device_owner, 'mac_address': mac_address, + 'limit': limit, 'marker': marker, + 'page_reverse': page_reverse} url = '{base_url}/ports'.format(base_url=self.url) - resp = self.request('GET', url, + resp = self.request('GET', url, params=params, response_entity_type=Ports, requestslib_kwargs=requestslib_kwargs) return resp @@ -146,6 +206,9 @@ class PortsClient(AutoMarshallingHTTPClient): """ @summary: Deletes a specified port @param string port_id: The UUID for the port + @type port_id: string + @return: delete port response + @rtype: Requests.response """ url = '{base_url}/ports/{port_id}'.format( diff --git a/cloudcafe/networking/networks/subnets_api/client.py b/cloudcafe/networking/networks/subnets_api/client.py index 4f4fb0b9..584ad1d8 100644 --- a/cloudcafe/networking/networks/subnets_api/client.py +++ b/cloudcafe/networking/networks/subnets_api/client.py @@ -25,12 +25,17 @@ class SubnetsClient(AutoMarshallingHTTPClient): def __init__(self, url, auth_token, serialize_format=None, deserialize_format=None, tenant_id=None): """ - @param string url: Base URL for the subnets service - @param string auth_token: Auth token to be used for all requests - @param string serialize_format: Format for serializing requests - @param string deserialize_format: Format for de-serializing responses - @param string tenant_id: optional tenant id to be included in the - header if given + @param url: Base URL for the subnets service + @type url: string + @param auth_token: Auth token to be used for all requests + @type auth_token: string + @param serialize_format: Format for serializing requests + @type serialize_format: string + @param deserialize_format: Format for de-serializing responses + @type deserialize_format: string + @param tenant_id: optional tenant id to be included in the header if + given + @type tenant_id: string """ super(SubnetsClient, self).__init__(serialize_format, deserialize_format) @@ -54,23 +59,34 @@ class SubnetsClient(AutoMarshallingHTTPClient): enable_dhcp=None, requestslib_kwargs=None): """ @summary: Creates a Subnet - @param string name: human readable name for the subnet, - may not be unique. (CRUD: CRU) - @param string tenant_id: owner of the network. (CRUD: CR) - @param string network_id: network subnet is associated with (CRUD: CR) - @param int ip_version: IP version 4 or 6 (CRUD: CR) - @param string cidr: represents IP range for the subnet and should be in - the form / (CRUD: CR) - @param string gateway_ip: default gateway used by devices in the subnet - (CRUD: CRUD) - @param list(str) dns_nameservers: DNS name servers used by subnet hosts + @param name: human readable name for the subnet, may not be unique (CRUD: CRU) - @param list(dict) allocation_pools: sub range of cidr available for - dynamic allocation to ports (CRUD: CR) - @param list(dict) host_routes: routes that should be used by devices - with IPs from this subnet (does not includes the local route, - CRUD: CRU) - @param bool enable_dhcp: whether DHCP is enabled (CRUD:CRU) + @type name: string + @param tenant_id: owner of the network. (CRUD: CR) + @type tenant_id: string + @param network_id: network subnet is associated with (CRUD: CR) + @type network_id: string + @param ip_version: IP version 4 or 6 (CRUD: CR) + @type ip_version: int + @param cidr: represents IP range for the subnet and should be in the + form / (CRUD: CR) + @type cidr: string + @param gateway_ip: default gateway used by devices in the subnet + (CRUD: CRUD) + @type gateway_ip: string + @param dns_nameservers: DNS name servers used by subnet hosts + (CRUD: CRU) + @type dns_nameservers: list(str) + @param allocation_pools: sub range of cidr available for dynamic + allocation to ports (CRUD: CRU) + @type allocation_pools: list(dict) + @param host_routes: routes that should be used by devices with IPs + from this subnet (does not includes the local route, CRUD: CRU) + @type host_routes: list(dict) + @param enable_dhcp: whether DHCP is enabled (CRUD:CRU) + @type enable_dhcp: bool + @return: subnet create response + @rtype: Requests.response """ url = '{base_url}/subnets'.format(base_url=self.url) @@ -90,20 +106,31 @@ class SubnetsClient(AutoMarshallingHTTPClient): def update_subnet(self, subnet_id, name=None, gateway_ip=None, dns_nameservers=None, host_routes=None, - enable_dhcp=None, requestslib_kwargs=None): + enable_dhcp=None, allocation_pools=None, + requestslib_kwargs=None): """ @summary: Updates a specified Subnet - @param string subnet_id: The UUID for the subnet - @param string name: human readable name for the subnet, - may not be unique. (CRUD: CRU) - @param string gateway_ip: default gateway used by devices in the subnet - (CRUD: CRUD) - @param list(str) dns_nameservers: DNS name servers used by subnet hosts + @param subnet_id: The UUID for the subnet + @type subnet_id: string + @param name: human readable name for the subnet, may not be unique (CRUD: CRU) - @param list(dict) host_routes: routes that should be used by devices - with IPs from this subnet (does not includes the local route, - CRUD: CRU) - @param bool enable_dhcp: whether DHCP is enabled (CRUD:CRU) + @type name: string + @param gateway_ip: default gateway used by devices in the subnet + (CRUD: CRUD) + @type gateway_ip: string + @param dns_nameservers: DNS name servers used by subnet hosts + (CRUD: CRU) + @type dns_nameservers: list(str) + @param host_routes: routes that should be used by devices with IPs + from this subnet (does not includes the local route (CRUD: CRU) + @type host_routes: list(dict) + @param enable_dhcp: whether DHCP is enabled (CRUD:CRU) + @type enable_dhcp: bool + @param allocation_pools: sub range of cidr available for dynamic + allocation to ports (CRUD: CRU) + @type allocation_pools: list(dict) + @return: subnet update response + @rtype: Requests.response """ url = '{base_url}/subnets/{subnet_id}'.format( @@ -112,7 +139,8 @@ class SubnetsClient(AutoMarshallingHTTPClient): request = SubnetRequest(name=name, gateway_ip=gateway_ip, dns_nameservers=dns_nameservers, host_routes=host_routes, - enable_dhcp=enable_dhcp) + enable_dhcp=enable_dhcp, + allocation_pools=allocation_pools) resp = self.request('PUT', url, response_entity_type=Subnet, request_entity=request, @@ -122,7 +150,10 @@ class SubnetsClient(AutoMarshallingHTTPClient): def get_subnet(self, subnet_id, requestslib_kwargs=None): """ @summary: Shows information for a specified subnet - @param string subnet_id: The UUID for the subnet + @param subnet_id: The UUID for the subnet + @type subnet_id: string + @return: get subnet response + @rtype: Requests.response """ url = '{base_url}/subnets/{subnet_id}'.format( @@ -132,14 +163,45 @@ class SubnetsClient(AutoMarshallingHTTPClient): requestslib_kwargs=requestslib_kwargs) return resp - def list_subnets(self, requestslib_kwargs=None): + def list_subnets(self, subnet_id=None, network_id=None, cidr=None, + tenant_id=None, gateway_ip=None, ip_version=None, + enable_dhcp=None, name=None, limit=None, marker=None, + page_reverse=None, requestslib_kwargs=None): """ - @summary: Lists subnets + @summary: Lists subnets, filtered by params if given + @param subnet_id: subnet ID to filter by + @type subnet_id: string + @param network_id: network ID to filter by + @type network_id: string + @param cidr: cider to filter by + @type cidr: string + @param tenant_id: owner of the network to filter by + @type tenant_id: string + @param gateway_ip: gateway_ip to filter by + @type gateway_ip: string + @param ip_version: IP version 4 or 6 to filter by + @type ip_version: int + @param enable_dhcp: enable_dhcp status to filter by + @type enable_dhcp: bool + @param name: subnet name to filter by + @type name: string + @param limit: page size + @type limit: int + @param marker: Id of the last item of the previous page + @type marker: string + @param page_reverse: direction of the page + @type page_reverse: bool + @return: list subnet response + @rtype: Requests.response """ - # TODO: add field query params to filter the response + params = {'id': subnet_id, 'network_id': network_id, 'cidr': cidr, + 'tenant_id': tenant_id, 'gteway_ip': gateway_ip, + 'ip_version': ip_version, 'enable_dhcp': enable_dhcp, + 'name': name, 'limit': limit, 'marker': marker, + 'page_reverse': page_reverse} url = '{base_url}/subnets'.format(base_url=self.url) - resp = self.request('GET', url, + resp = self.request('GET', url, params=params, response_entity_type=Subnets, requestslib_kwargs=requestslib_kwargs) return resp @@ -147,7 +209,10 @@ class SubnetsClient(AutoMarshallingHTTPClient): def delete_subnet(self, subnet_id, requestslib_kwargs=None): """ @summary: Deletes a specified subnet - @param string subnet_id: The UUID for the subnet + @param subnet_id: The UUID for the subnet + @type subnet_id: string + @return: delete subnet response + @rtype: Requests.response """ url = '{base_url}/subnets/{subnet_id}'.format(