Merge "Add host aggregate missing functions"

This commit is contained in:
Zuul 2018-12-10 22:31:41 +00:00 committed by Gerrit Code Review
commit 46cbbfd372
3 changed files with 111 additions and 0 deletions

View File

@ -187,6 +187,47 @@ class Proxy(proxy.Proxy):
self._delete(_aggregate.Aggregate, aggregate,
ignore_missing=ignore_missing)
def add_host_to_aggregate(self, aggregate, host):
"""Adds a host to an aggregate
:param aggregate: Either the ID of a aggregate or a
:class:`~openstack.compute.v2.aggregate.Aggregate`
instance.
:param str host: The host to add to the aggregate
:returns: One :class:`~openstack.compute.v2.aggregate.Aggregate`
"""
aggregate = self._get_resource(_aggregate.Aggregate, aggregate)
return aggregate.add_host(self, host)
def remove_host_from_aggregate(self, aggregate, host):
"""Removes a host from an aggregate
:param aggregate: Either the ID of a aggregate or a
:class:`~openstack.compute.v2.aggregate.Aggregate`
instance.
:param str host: The host to remove from the aggregate
:returns: One :class:`~openstack.compute.v2.aggregate.Aggregate`
"""
aggregate = self._get_resource(_aggregate.Aggregate, aggregate)
return aggregate.remove_host(self, host)
def set_aggregate_metadata(self, aggregate, metadata):
"""Creates or replaces metadata for an aggregate
:param aggregate: Either the ID of a aggregate or a
:class:`~openstack.compute.v2.aggregate.Aggregate`
instance.
:param dict metadata: Metadata key and value pairs. The maximum
size for each metadata key and value pair
is 255 bytes.
:returns: One :class:`~openstack.compute.v2.aggregate.Aggregate`
"""
aggregate = self._get_resource(_aggregate.Aggregate, aggregate)
return aggregate.set_metadata(self, metadata)
def delete_image(self, image, ignore_missing=True):
"""Delete an image

View File

@ -12,6 +12,7 @@
from openstack import resource
from openstack import utils
class Aggregate(resource.Resource):
@ -36,3 +37,28 @@ class Aggregate(resource.Resource):
hosts = resource.Body('hosts')
#: Metadata
metadata = resource.Body('metadata')
def _action(self, session, body, microversion=None):
"""Preform aggregate actions given the message body."""
url = utils.urljoin(self.base_path, self.id, 'action')
headers = {'Accept': ''}
response = session.post(
url, json=body, headers=headers, microversion=microversion)
aggregate = Aggregate()
aggregate._translate_response(response=response)
return aggregate
def add_host(self, session, host):
"""Adds a host to an aggregate."""
body = {'add_host': {'host': host}}
return self._action(session, body)
def remove_host(self, session, host):
"""Removes a host from an aggregate."""
body = {'remove_host': {'host': host}}
return self._action(session, body)
def set_metadata(self, session, metadata):
"""Creates or replaces metadata for an aggregate."""
body = {'set_metadata': {'metadata': metadata}}
return self._action(session, body)

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import mock
from openstack.tests.unit import base
from openstack.compute.v2 import aggregate
@ -29,6 +30,16 @@ EXAMPLE = {
class TestAggregate(base.TestCase):
def setUp(self):
super(TestAggregate, self).setUp()
self.resp = mock.Mock()
self.resp.body = EXAMPLE.copy()
self.resp.json = mock.Mock(return_value=self.resp.body)
self.resp.status_code = 200
self.resp.headers = {'Accept': ''}
self.sess = mock.Mock()
self.sess.post = mock.Mock(return_value=self.resp)
def test_basic(self):
sot = aggregate.Aggregate()
self.assertEqual('aggregate', sot.resource_key)
@ -48,3 +59,36 @@ class TestAggregate(base.TestCase):
self.assertEqual(EXAMPLE['hosts'], sot.hosts)
self.assertEqual(EXAMPLE['id'], sot.id)
self.assertDictEqual(EXAMPLE['metadata'], sot.metadata)
def test_add_host(self):
sot = aggregate.Aggregate(**EXAMPLE)
sot.add_host(self.sess, 'host1')
url = 'os-aggregates/4/action'
body = {"add_host": {"host": "host1"}}
headers = {'Accept': ''}
self.sess.post.assert_called_with(
url, json=body, headers=headers, microversion=None)
def test_remove_host(self):
sot = aggregate.Aggregate(**EXAMPLE)
sot.remove_host(self.sess, 'host1')
url = 'os-aggregates/4/action'
body = {"remove_host": {"host": "host1"}}
headers = {'Accept': ''}
self.sess.post.assert_called_with(
url, json=body, headers=headers, microversion=None)
def test_set_metadata(self):
sot = aggregate.Aggregate(**EXAMPLE)
sot.set_metadata(self.sess, {"key: value"})
url = 'os-aggregates/4/action'
body = {"set_metadata": {"metadata": {"key: value"}}}
headers = {'Accept': ''}
self.sess.post.assert_called_with(
url, json=body, headers=headers, microversion=None)