Merge "Support service force down"
This commit is contained in:
@@ -38,5 +38,6 @@
|
|||||||
"zun-service:delete": "rule:admin_api",
|
"zun-service:delete": "rule:admin_api",
|
||||||
"zun-service:disable": "rule:admin_api",
|
"zun-service:disable": "rule:admin_api",
|
||||||
"zun-service:enable": "rule:admin_api",
|
"zun-service:enable": "rule:admin_api",
|
||||||
|
"zun-service:force_down": "rule:admin_api",
|
||||||
"zun-service:get_all": "rule:admin_api"
|
"zun-service:get_all": "rule:admin_api"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,3 +36,15 @@ query_param_disable = {
|
|||||||
},
|
},
|
||||||
'additionalProperties': False
|
'additionalProperties': False
|
||||||
}
|
}
|
||||||
|
|
||||||
|
query_param_force_down = {
|
||||||
|
'type': 'object',
|
||||||
|
'properties': {
|
||||||
|
'host': parameter_types.hostname,
|
||||||
|
'binary': {
|
||||||
|
'type': 'string', 'minLength': 1, 'maxLength': 255,
|
||||||
|
},
|
||||||
|
'forced_down': parameter_types.boolean
|
||||||
|
},
|
||||||
|
'additionalProperties': False
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,7 +10,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
from oslo_utils import strutils
|
||||||
import pecan
|
import pecan
|
||||||
|
import six
|
||||||
|
|
||||||
from zun.api.controllers import base
|
from zun.api.controllers import base
|
||||||
from zun.api.controllers.v1 import collection
|
from zun.api.controllers.v1 import collection
|
||||||
@@ -56,6 +58,7 @@ class ZunServiceController(base.Controller):
|
|||||||
_custom_actions = {
|
_custom_actions = {
|
||||||
'enable': ['PUT'],
|
'enable': ['PUT'],
|
||||||
'disable': ['PUT'],
|
'disable': ['PUT'],
|
||||||
|
'force_down': ['PUT'],
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
@@ -98,6 +101,23 @@ class ZunServiceController(base.Controller):
|
|||||||
{'disabled': True,
|
{'disabled': True,
|
||||||
'disabled_reason': reason})
|
'disabled_reason': reason})
|
||||||
|
|
||||||
|
def _update_forced_down(self, context, body):
|
||||||
|
"""Set or unset forced_down flag for the service"""
|
||||||
|
try:
|
||||||
|
forced_down = strutils.bool_from_string(body['forced_down'], True)
|
||||||
|
except ValueError as err:
|
||||||
|
raise exception.InvalidValue(six.text_type(err))
|
||||||
|
self._update(context, body['host'], body['binary'],
|
||||||
|
{"forced_down": forced_down})
|
||||||
|
res = {
|
||||||
|
'service': {
|
||||||
|
'host': body['host'],
|
||||||
|
'binary': body['binary'],
|
||||||
|
'forced_down': forced_down
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
|
||||||
@pecan.expose('json')
|
@pecan.expose('json')
|
||||||
@exception.wrap_pecan_controller_exception
|
@exception.wrap_pecan_controller_exception
|
||||||
def get_all(self, **kwargs):
|
def get_all(self, **kwargs):
|
||||||
@@ -157,3 +177,13 @@ class ZunServiceController(base.Controller):
|
|||||||
else:
|
else:
|
||||||
reason = None
|
reason = None
|
||||||
return self._disable(context, kwargs, reason)
|
return self._disable(context, kwargs, reason)
|
||||||
|
|
||||||
|
@pecan.expose('json')
|
||||||
|
@exception.wrap_pecan_controller_exception
|
||||||
|
@validation.validate_query_param(pecan.request,
|
||||||
|
schema.query_param_force_down)
|
||||||
|
def force_down(self, **kwargs):
|
||||||
|
context = pecan.request.context
|
||||||
|
policy.enforce(context, "zun-service:force_down",
|
||||||
|
action="zun-service:force_down")
|
||||||
|
return self._update_forced_down(context, kwargs)
|
||||||
|
|||||||
@@ -99,6 +99,22 @@ class TestZunServiceController(api_base.FunctionalTest):
|
|||||||
self.assertEqual('abc', response.json['service']['disabled_reason'])
|
self.assertEqual('abc', response.json['service']['disabled_reason'])
|
||||||
self.assertEqual(return_value, response.json)
|
self.assertEqual(return_value, response.json)
|
||||||
|
|
||||||
|
@mock.patch.object(objects.ZunService, 'get_by_host_and_binary')
|
||||||
|
@mock.patch.object(objects.ZunService, 'update')
|
||||||
|
def test_force_down(self, mock_force_down, mock_get_host):
|
||||||
|
return_value = {
|
||||||
|
'service': {
|
||||||
|
'host': 'fake-host',
|
||||||
|
'binary': 'fake-binary',
|
||||||
|
'forced_down': True
|
||||||
|
},
|
||||||
|
}
|
||||||
|
params = {'binary': 'fake-binary', 'host': 'fake-host',
|
||||||
|
'forced_down': True}
|
||||||
|
response = self.put_json('/services/force_down', params)
|
||||||
|
self.assertTrue(response.json['service']['forced_down'])
|
||||||
|
self.assertEqual(return_value, response.json)
|
||||||
|
|
||||||
|
|
||||||
class TestZunServiceEnforcement(api_base.FunctionalTest):
|
class TestZunServiceEnforcement(api_base.FunctionalTest):
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user