|
|
6f183fd |
From d0b32e693eadf6fdc9e885dbe09656a69d5e3662 Mon Sep 17 00:00:00 2001
|
|
|
6f183fd |
From: Chris Behrens <cbehrens@codestud.com>
|
|
|
6f183fd |
Date: Mon, 9 Apr 2012 19:23:03 +0000
|
|
|
6f183fd |
Subject: [PATCH] Create compute.api.BaseAPI for compute APIs to use
|
|
|
6f183fd |
|
|
|
6f183fd |
Fixes bug 960226 where compute.api.HostAPI called non-existent methods
|
|
|
6f183fd |
|
|
|
6f183fd |
Regression was introduced here:
|
|
|
6f183fd |
https://review.openstack.org/#change,5252
|
|
|
6f183fd |
|
|
|
6f183fd |
Added tests for HostAPI
|
|
|
6f183fd |
|
|
|
6f183fd |
Change-Id: Id17927bc608ff638ea9b0b5509f0f0bb14503f85
|
|
|
6f183fd |
---
|
|
|
6f183fd |
nova/compute/api.py | 36 ++++++++++++++++++--------------
|
|
|
6f183fd |
nova/tests/test_compute.py | 48 +++++++++++++++++++++++++++++++++++++++++++-
|
|
|
6f183fd |
2 files changed, 67 insertions(+), 17 deletions(-)
|
|
|
6f183fd |
|
|
|
6f183fd |
diff --git a/nova/compute/api.py b/nova/compute/api.py
|
|
|
6f183fd |
index 6edfefd..92adea1 100644
|
|
|
6f183fd |
--- a/nova/compute/api.py
|
|
|
6f183fd |
+++ b/nova/compute/api.py
|
|
|
6f183fd |
@@ -106,17 +106,10 @@ def check_policy(context, action, target):
|
|
|
6f183fd |
nova.policy.enforce(context, _action, target)
|
|
|
6f183fd |
|
|
|
6f183fd |
|
|
|
6f183fd |
-class API(base.Base):
|
|
|
6f183fd |
- """API for interacting with the compute manager."""
|
|
|
6f183fd |
-
|
|
|
6f183fd |
- def __init__(self, image_service=None, network_api=None, volume_api=None,
|
|
|
6f183fd |
- **kwargs):
|
|
|
6f183fd |
- self.image_service = (image_service or
|
|
|
6f183fd |
- nova.image.get_default_image_service())
|
|
|
6f183fd |
-
|
|
|
6f183fd |
- self.network_api = network_api or network.API()
|
|
|
6f183fd |
- self.volume_api = volume_api or volume.API()
|
|
|
6f183fd |
- super(API, self).__init__(**kwargs)
|
|
|
6f183fd |
+class BaseAPI(base.Base):
|
|
|
6f183fd |
+ """Base API class."""
|
|
|
6f183fd |
+ def __init__(self, **kwargs):
|
|
|
6f183fd |
+ super(BaseAPI, self).__init__(**kwargs)
|
|
|
6f183fd |
|
|
|
6f183fd |
def _cast_or_call_compute_message(self, rpc_method, compute_method,
|
|
|
6f183fd |
context, instance=None, host=None, params=None):
|
|
|
6f183fd |
@@ -157,10 +150,24 @@ class API(base.Base):
|
|
|
6f183fd |
"""Generic handler for RPC calls to compute."""
|
|
|
6f183fd |
return self._cast_or_call_compute_message(rpc.call, *args, **kwargs)
|
|
|
6f183fd |
|
|
|
6f183fd |
- def _cast_scheduler_message(self, context, args):
|
|
|
6f183fd |
+ @staticmethod
|
|
|
6f183fd |
+ def _cast_scheduler_message(context, args):
|
|
|
6f183fd |
"""Generic handler for RPC calls to the scheduler."""
|
|
|
6f183fd |
rpc.cast(context, FLAGS.scheduler_topic, args)
|
|
|
6f183fd |
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+class API(BaseAPI):
|
|
|
6f183fd |
+ """API for interacting with the compute manager."""
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ def __init__(self, image_service=None, network_api=None, volume_api=None,
|
|
|
6f183fd |
+ **kwargs):
|
|
|
6f183fd |
+ self.image_service = (image_service or
|
|
|
6f183fd |
+ nova.image.get_default_image_service())
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ self.network_api = network_api or network.API()
|
|
|
6f183fd |
+ self.volume_api = volume_api or volume.API()
|
|
|
6f183fd |
+ super(API, self).__init__(**kwargs)
|
|
|
6f183fd |
+
|
|
|
6f183fd |
def _check_injected_file_quota(self, context, injected_files):
|
|
|
6f183fd |
"""Enforce quota limits on injected files.
|
|
|
6f183fd |
|
|
|
6f183fd |
@@ -1677,11 +1684,8 @@ class API(base.Base):
|
|
|
6f183fd |
return self.db.instance_fault_get_by_instance_uuids(context, uuids)
|
|
|
6f183fd |
|
|
|
6f183fd |
|
|
|
6f183fd |
-class HostAPI(base.Base):
|
|
|
6f183fd |
+class HostAPI(BaseAPI):
|
|
|
6f183fd |
"""Sub-set of the Compute Manager API for managing host operations."""
|
|
|
6f183fd |
- def __init__(self, **kwargs):
|
|
|
6f183fd |
- super(HostAPI, self).__init__(**kwargs)
|
|
|
6f183fd |
-
|
|
|
6f183fd |
def set_host_enabled(self, context, host, enabled):
|
|
|
6f183fd |
"""Sets the specified host's ability to accept new instances."""
|
|
|
6f183fd |
# NOTE(comstud): No instance_uuid argument to this compute manager
|
|
|
6f183fd |
diff --git a/nova/tests/test_compute.py b/nova/tests/test_compute.py
|
|
|
6f183fd |
index 305282c..2e7e7de 100644
|
|
|
6f183fd |
--- a/nova/tests/test_compute.py
|
|
|
6f183fd |
+++ b/nova/tests/test_compute.py
|
|
|
6f183fd |
@@ -24,7 +24,6 @@ import sys
|
|
|
6f183fd |
import time
|
|
|
6f183fd |
|
|
|
6f183fd |
import mox
|
|
|
6f183fd |
-import webob.exc
|
|
|
6f183fd |
|
|
|
6f183fd |
import nova
|
|
|
6f183fd |
import nova.common.policy
|
|
|
6f183fd |
@@ -3643,3 +3642,50 @@ class ComputePolicyTestCase(BaseTestCase):
|
|
|
6f183fd |
self.assertRaises(exception.PolicyNotAuthorized,
|
|
|
6f183fd |
self.compute_api.get_instance_faults,
|
|
|
6f183fd |
self.context, instances)
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+class ComputeHostAPITestCase(BaseTestCase):
|
|
|
6f183fd |
+ def setUp(self):
|
|
|
6f183fd |
+ super(ComputeHostAPITestCase, self).setUp()
|
|
|
6f183fd |
+ self.host_api = compute_api.HostAPI()
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ def _rpc_call_stub(self, call_info):
|
|
|
6f183fd |
+ def fake_rpc_call(context, topic, msg):
|
|
|
6f183fd |
+ call_info['context'] = context
|
|
|
6f183fd |
+ call_info['topic'] = topic
|
|
|
6f183fd |
+ call_info['msg'] = msg
|
|
|
6f183fd |
+ self.stubs.Set(rpc, 'call', fake_rpc_call)
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ def test_set_host_enabled(self):
|
|
|
6f183fd |
+ ctxt = context.RequestContext('fake', 'fake')
|
|
|
6f183fd |
+ call_info = {}
|
|
|
6f183fd |
+ self._rpc_call_stub(call_info)
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ self.host_api.set_host_enabled(ctxt, 'fake_host', 'fake_enabled')
|
|
|
6f183fd |
+ self.assertEqual(call_info['context'], ctxt)
|
|
|
6f183fd |
+ self.assertEqual(call_info['topic'], 'compute.fake_host')
|
|
|
6f183fd |
+ self.assertEqual(call_info['msg'],
|
|
|
6f183fd |
+ {'method': 'set_host_enabled',
|
|
|
6f183fd |
+ 'args': {'enabled': 'fake_enabled'}})
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ def test_host_power_action(self):
|
|
|
6f183fd |
+ ctxt = context.RequestContext('fake', 'fake')
|
|
|
6f183fd |
+ call_info = {}
|
|
|
6f183fd |
+ self._rpc_call_stub(call_info)
|
|
|
6f183fd |
+ self.host_api.host_power_action(ctxt, 'fake_host', 'fake_action')
|
|
|
6f183fd |
+ self.assertEqual(call_info['context'], ctxt)
|
|
|
6f183fd |
+ self.assertEqual(call_info['topic'], 'compute.fake_host')
|
|
|
6f183fd |
+ self.assertEqual(call_info['msg'],
|
|
|
6f183fd |
+ {'method': 'host_power_action',
|
|
|
6f183fd |
+ 'args': {'action': 'fake_action'}})
|
|
|
6f183fd |
+
|
|
|
6f183fd |
+ def test_set_host_maintenance(self):
|
|
|
6f183fd |
+ ctxt = context.RequestContext('fake', 'fake')
|
|
|
6f183fd |
+ call_info = {}
|
|
|
6f183fd |
+ self._rpc_call_stub(call_info)
|
|
|
6f183fd |
+ self.host_api.set_host_maintenance(ctxt, 'fake_host', 'fake_mode')
|
|
|
6f183fd |
+ self.assertEqual(call_info['context'], ctxt)
|
|
|
6f183fd |
+ self.assertEqual(call_info['topic'], 'compute.fake_host')
|
|
|
6f183fd |
+ self.assertEqual(call_info['msg'],
|
|
|
6f183fd |
+ {'method': 'host_maintenance_mode',
|
|
|
6f183fd |
+ 'args': {'host': 'fake_host', 'mode': 'fake_mode'}})
|