diff --git a/coriolis/api/v1/endpoint_actions.py b/coriolis/api/v1/endpoint_actions.py index 7ab7b1881..c82c605cb 100644 --- a/coriolis/api/v1/endpoint_actions.py +++ b/coriolis/api/v1/endpoint_actions.py @@ -31,6 +31,24 @@ def _validate_connection(self, req, id, body): except exception.InvalidParameterValue as ex: raise exc.HTTPNotFound(explanation=ex.msg) + @api_wsgi.action('invalidate') + def _invalidate(self, req, id, body): + context = req.environ['coriolis.context'] + context.can( + "%s:invalidate" % endpoint_policies.ENDPOINTS_POLICY_PREFIX) + try: + self._endpoint_api.invalidate_cache(context, id) + return { + "invalidate": { + "success": True, + "message": "Instance list cache invalidation triggered." + } + } + except exception.NotFound as ex: + raise exc.HTTPNotFound(explanation=ex.msg) + except exception.InvalidParameterValue as ex: + raise exc.HTTPBadRequest(explanation=ex.msg) + def create_resource(): return api_wsgi.Resource(EndpointActionsController()) diff --git a/coriolis/cache.py b/coriolis/cache.py index 94611303e..cf1424c52 100644 --- a/coriolis/cache.py +++ b/coriolis/cache.py @@ -25,3 +25,7 @@ def get_cache_decorator(provider): MEMOIZE = cache.get_memoization_decorator( CONF, cache_region, provider) return MEMOIZE + + +def invalidate(): + cache_region.invalidate() diff --git a/coriolis/endpoints/api.py b/coriolis/endpoints/api.py index 887abbd2b..1bb6385ed 100644 --- a/coriolis/endpoints/api.py +++ b/coriolis/endpoints/api.py @@ -1,6 +1,7 @@ # Copyright 2016 Cloudbase Solutions Srl # All Rights Reserved. +from coriolis import cache from coriolis.conductor.rpc import client as rpc_conductor_client from coriolis.minion_manager.rpc import client as rpc_minion_manager_client from coriolis import utils @@ -35,6 +36,9 @@ def validate_connection(self, ctxt, endpoint_id): return self._rpc_conductor_client.validate_endpoint_connection( ctxt, endpoint_id) + def invalidate_cache(self, ctxt, endpoint_id): + cache.invalidate() + @utils.bad_request_on_error("Invalid destination environment: %s") def validate_target_environment(self, ctxt, endpoint_id, target_env): return self._rpc_conductor_client.validate_endpoint_target_environment( diff --git a/coriolis/policies/endpoints.py b/coriolis/policies/endpoints.py index 7bba45f66..45986bc19 100644 --- a/coriolis/policies/endpoints.py +++ b/coriolis/policies/endpoints.py @@ -84,6 +84,17 @@ def get_endpoints_policy_label(rule_label): } ] ), + policy.DocumentedRuleDefault( + get_endpoints_policy_label('invalidate'), + ENDPOINTS_POLICY_DEFAULT_RULE, + "Invalidate instance list cache for endpoint", + [ + { + "path": "/endpoints/{endpoint_id}/actions", + "method": "POST" + } + ] + ), policy.DocumentedRuleDefault( get_endpoints_policy_label('list_instances'), ENDPOINTS_POLICY_DEFAULT_RULE,