git-harry 239bfd30c6 Add devices-list to support /v1/devices
This commit adds a new command, 'craton device-list', to support the
endpoint /v1/devices. Currently the endpoint only supports GET requests.

The command supports filtering by cloud, cell, region, parent and active
status. In addition, where a parent is specified, it is also possible to
request descendants.

The API response body is of the form:

    {
        "devices: {
            "hosts": [
            ],
            "network-devices": [
            ],
        },
        "links": [
        ],
    }

This object differs, from the other response bodies that return
collections, in that devices is not an array but is instead an object
whose values are arrays. This difference has necessitated modifying the
list and pagination functionality to support nested data.

Change-Id: I7cdec9935a360dae3910802f210ab9341ef7a696
Closes-bug: 1668705
2017-03-03 08:41:13 +00:00

50 lines
1.8 KiB
Python

# -*- coding: utf-8 -*-
# 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.
"""Top-level client for version 1 of Craton's API."""
from cratonclient.v1 import cells
from cratonclient.v1 import clouds
from cratonclient.v1 import devices
from cratonclient.v1 import hosts
from cratonclient.v1 import projects
from cratonclient.v1 import regions
class Client(object):
"""Craton v1 API Client."""
def __init__(self, session, url):
"""Initialize our client object with our session and url.
:param session:
Initialized Session object.
:type session:
cratonclient.session.Session
:param str url:
The URL that points us to the craton instance. For example,
'https://10.1.1.0:8080/'.
"""
self._url = url
self._session = session
if not self._url.endswith('/v1'):
self._url += '/v1'
manager_kwargs = {'session': self._session, 'url': self._url}
self.hosts = hosts.HostManager(**manager_kwargs)
self.cells = cells.CellManager(**manager_kwargs)
self.projects = projects.ProjectManager(**manager_kwargs)
self.clouds = clouds.CloudManager(**manager_kwargs)
self.devices = devices.DeviceManager(**manager_kwargs)
self.regions = regions.RegionManager(**manager_kwargs)