From 561a6c5b9c00cd84bda9f0fe193b52906be763cb Mon Sep 17 00:00:00 2001 From: Chris Spencer Date: Thu, 4 Aug 2016 08:51:02 -0700 Subject: [PATCH] Adding Inventory class. Inventory will be access point for all sub entities to create an intuitive API for python developers to use when trying to access inventory entities (cells, hosts, etc). Change-Id: Icea217103c735ad53f029dac9cfd405281a1a715 --- cratonclient/tests/test_cratonclient.py | 12 ++++++++ cratonclient/tests/unit/test_inventory.py | 31 ++++++++++++++++++++ cratonclient/v1/client.py | 10 ++++++- cratonclient/v1/inventory.py | 35 +++++++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 cratonclient/tests/unit/test_inventory.py create mode 100644 cratonclient/v1/inventory.py diff --git a/cratonclient/tests/test_cratonclient.py b/cratonclient/tests/test_cratonclient.py index 3e5d9c1..1aaefab 100644 --- a/cratonclient/tests/test_cratonclient.py +++ b/cratonclient/tests/test_cratonclient.py @@ -12,8 +12,10 @@ # License for the specific language governing permissions and limitations # under the License. """Tests for `cratonclient` module.""" +import mock from cratonclient.tests import base +from cratonclient.v1 import client class TestCratonclient(base.TestCase): @@ -22,3 +24,13 @@ class TestCratonclient(base.TestCase): def test_something(self): """Do nothing.""" pass + + @mock.patch('cratonclient.v1.inventory.Inventory') + def test_client_creates_inventory(self, mock_inventory): + """Verify that Craton client creates Inventory.""" + session = mock.Mock() + url = 'https://10.1.1.8080' + region_id = 1 + craton = client.Client(session, url) + craton.inventory(region_id) + mock_inventory.assert_called_once_with(session, url + '/v1', region_id) diff --git a/cratonclient/tests/unit/test_inventory.py b/cratonclient/tests/unit/test_inventory.py new file mode 100644 index 0000000..ddc120e --- /dev/null +++ b/cratonclient/tests/unit/test_inventory.py @@ -0,0 +1,31 @@ +# 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. + +"""Tests for `cratonclient.v1.inventory` module.""" + +import mock + +from cratonclient.tests import base +from cratonclient.v1 import inventory + + +class TestInventory(base.TestCase): + """Test our craton inventory api class.""" + + @mock.patch('cratonclient.v1.hosts.HostManager') + def test_inventory_creates_host_manager(self, mock_hostmanager): + """Verify Inventory class creates HostManager.""" + session = mock.Mock() + url = 'https://10.1.1.0:8080/' + region_id = 1, + inventory.Inventory(session, url, region_id) + mock_hostmanager.assert_called_once_with(session, url) diff --git a/cratonclient/v1/client.py b/cratonclient/v1/client.py index 951a594..7483160 100644 --- a/cratonclient/v1/client.py +++ b/cratonclient/v1/client.py @@ -13,6 +13,7 @@ # under the License. """Top-level client for version 1 of Craton's API.""" from cratonclient.v1 import hosts +from cratonclient.v1 import inventory from cratonclient.v1 import regions @@ -37,6 +38,13 @@ class Client(object): self._url += '/v1' manager_kwargs = {'session': self._session, 'url': url} - + # TODO(cmspence):remove self.hosts self.hosts = hosts.HostManager(**manager_kwargs) self.regions = regions.RegionManager(**manager_kwargs) + # TODO(cmspence):self.projects, self.users + + def inventory(self, region_id): + """Retrieve inventory for a given region.""" + return inventory.Inventory(self._session, + self._url, + region_id) diff --git a/cratonclient/v1/inventory.py b/cratonclient/v1/inventory.py new file mode 100644 index 0000000..ce94534 --- /dev/null +++ b/cratonclient/v1/inventory.py @@ -0,0 +1,35 @@ +# -*- 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 hosts + + +class Inventory(object): + """Representation of the viewable inventory.""" + + def __init__(self, session, url, region_id): + """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/'. + """ + # TODO(cmspence): self.region = self.regions.get(region=region_id) + self.hosts = hosts.HostManager(session, url) + # TODO(cmspence): self.users, self.projects, self.workflows