Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions coriolis/api-refs/source/endpoint.inc
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ Request
.. rest_parameters:: parameters.yaml

- endpoint_id : endpoint_id_path
- refresh : instance_refresh

Response
--------
Expand Down
9 changes: 9 additions & 0 deletions coriolis/api-refs/source/parameters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,15 @@ instance_limit:
in: query
required: false
type: integer
instance_refresh:
description: |
When set to true, forces a refresh of any cached instance data from the
source platform. This is useful when the instance list may have changed
and you want to ensure fresh data is retrieved.
in: query
required: false
type: boolean
default: false
show_deleted:
description: |
Whether to include deleted resources in the response.
Expand Down
5 changes: 4 additions & 1 deletion coriolis/api/v1/endpoint_instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
# All Rights Reserved.

from coriolis.api import common
from coriolis.api.v1 import utils as api_utils
from coriolis.api.v1.views import endpoint_resources_view
from coriolis.api import wsgi as api_wsgi
from coriolis.endpoint_resources import api
Expand All @@ -24,6 +25,8 @@ def index(self, req, endpoint_id):
endpoint_policies.ENDPOINTS_POLICY_PREFIX))
marker, limit = common.get_paging_params(req)
instance_name_pattern = req.GET.get("name")
refresh = api_utils.get_bool_url_arg(
req, "refresh", default=False)

env = req.GET.get("env")
if env is not None:
Expand All @@ -34,7 +37,7 @@ def index(self, req, endpoint_id):
return endpoint_resources_view.instances_collection(
self._instance_api.get_endpoint_instances(
context, endpoint_id, env, marker, limit,
instance_name_pattern))
instance_name_pattern, refresh=refresh))

def show(self, req, endpoint_id, id):
context = req.environ['coriolis.context']
Expand Down
5 changes: 3 additions & 2 deletions coriolis/conductor/rpc/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,15 @@ def delete_endpoint(self, ctxt, endpoint_id):

def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
marker=None, limit=None,
instance_name_pattern=None):
instance_name_pattern=None, refresh=False):
return self._call(
ctxt, 'get_endpoint_instances',
endpoint_id=endpoint_id,
source_environment=source_environment,
marker=marker,
limit=limit,
instance_name_pattern=instance_name_pattern)
instance_name_pattern=instance_name_pattern,
refresh=refresh)

def get_endpoint_instance(
self, ctxt, endpoint_id, source_environment, instance_name):
Expand Down
6 changes: 4 additions & 2 deletions coriolis/conductor/rpc/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,8 @@ def delete_endpoint(self, ctxt, endpoint_id):
db_api.delete_endpoint(ctxt, endpoint_id)

def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
marker, limit, instance_name_pattern):
marker, limit, instance_name_pattern,
refresh=False):
endpoint = self.get_endpoint(ctxt, endpoint_id)

worker_rpc = self._get_worker_service_rpc_for_specs(
Expand All @@ -503,7 +504,8 @@ def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
endpoint.type: [constants.PROVIDER_TYPE_ENDPOINT_INSTANCES]})
return worker_rpc.get_endpoint_instances(
ctxt, endpoint.type, endpoint.connection_info,
source_environment, marker, limit, instance_name_pattern)
source_environment, marker, limit, instance_name_pattern,
refresh=refresh)

def get_endpoint_instance(
self, ctxt, endpoint_id, source_environment, instance_name):
Expand Down
4 changes: 2 additions & 2 deletions coriolis/endpoint_resources/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ def __init__(self):

def get_endpoint_instances(self, ctxt, endpoint_id, source_environment,
marker=None, limit=None,
instance_name_pattern=None):
instance_name_pattern=None, refresh=False):
return self._rpc_client.get_endpoint_instances(
ctxt, endpoint_id, source_environment, marker,
limit, instance_name_pattern)
limit, instance_name_pattern, refresh=refresh)

def get_endpoint_instance(
self, ctxt, endpoint_id, source_environment, instance_name):
Expand Down
7 changes: 5 additions & 2 deletions coriolis/providers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,11 @@ class BaseEndpointInstancesProvider(BaseEndpointProvider):
@abc.abstractmethod
def get_instances(self, ctxt, connection_info, source_environment,
limit=None, last_seen_id=None,
instance_name_pattern=None):
"""Returns a list of instances."""
instance_name_pattern=None, refresh=False):
"""Returns a list of instances.

:param refresh: If True, forces a refresh of any cached instance data.
"""
raise NotImplementedError()

@abc.abstractmethod
Expand Down
4 changes: 2 additions & 2 deletions coriolis/tests/api/v1/test_endpoint_instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def test_index(
mock_get_endpoint_instances.assert_called_once_with(
mock_context, endpoint_id,
mock_decode_base64_param.return_value,
marker, limit, instance_name_pattern)
marker, limit, instance_name_pattern, refresh=False)
mock_instances_collection.assert_called_once_with(
mock_get_endpoint_instances.return_value)
self.assertEqual(
Expand Down Expand Up @@ -84,7 +84,7 @@ def test_index_no_env_and_options(
mock_decode_base64_param.assert_not_called()
mock_get_endpoint_instances.assert_called_once_with(
mock_context, endpoint_id,
{}, None, None, None)
{}, None, None, None, refresh=False)
mock_instances_collection.assert_called_once_with(
mock_get_endpoint_instances.return_value)
self.assertEqual(
Expand Down
3 changes: 2 additions & 1 deletion coriolis/tests/conductor/rpc/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ def test_get_endpoint_instances(self):
"source_environment": "mock_source_environment",
"marker": None,
"limit": None,
"instance_name_pattern": None
"instance_name_pattern": None,
"refresh": False
}
self._test(self.client.get_endpoint_instances, args)

Expand Down
1 change: 1 addition & 0 deletions coriolis/tests/conductor/rpc/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,7 @@ def test_get_endpoint_instances(
mock.sentinel.marker,
mock.sentinel.limit,
mock.sentinel.instance_name_pattern,
mock.sentinel.refresh,
)

mock_get_endpoint.assert_called_once_with(
Expand Down
6 changes: 4 additions & 2 deletions coriolis/tests/endpoint_resources/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,17 @@ def test_get_endpoint_instances(self):
source_environment=mock.sentinel.source_environment,
marker=mock.sentinel.marker,
limit=mock.sentinel.limit,
instance_name_pattern=mock.sentinel.instance_name_pattern
instance_name_pattern=mock.sentinel.instance_name_pattern,
refresh=mock.sentinel.refresh
)
(self.endpoint_resources_api._rpc_client.
get_endpoint_instances.assert_called_once_with)(
*(ARGS.values()),
mock.sentinel.source_environment,
mock.sentinel.marker,
mock.sentinel.limit,
mock.sentinel.instance_name_pattern
mock.sentinel.instance_name_pattern,
refresh=mock.sentinel.refresh
)
self.assertEqual(
(self.endpoint_resources_api._rpc_client.
Expand Down
1 change: 1 addition & 0 deletions coriolis/tests/worker/rpc/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ def test_get_endpoint_instances(self):
'marker': None,
'limit': None,
'instance_name_pattern': None,
'refresh': False
}
self._test(self.client.get_endpoint_instances, args)

Expand Down
2 changes: 2 additions & 0 deletions coriolis/tests/worker/rpc/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,7 @@ def test_get_endpoint_instances(
mock.sentinel.marker,
mock.sentinel.limit,
mock.sentinel.instance_name_pattern,
mock.sentinel.refresh,
)

mock_get_provider.assert_called_once_with(
Expand All @@ -571,6 +572,7 @@ def test_get_endpoint_instances(
last_seen_id=mock.sentinel.marker,
limit=mock.sentinel.limit,
instance_name_pattern=mock.sentinel.instance_name_pattern,
refresh=mock.sentinel.refresh,
)

# values are validated for each instance returned by the provider
Expand Down
5 changes: 3 additions & 2 deletions coriolis/worker/rpc/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,16 @@ def cancel_task(self, ctxt, task_id, process_id, force):

def get_endpoint_instances(self, ctxt, platform_name, connection_info,
source_environment, marker=None, limit=None,
instance_name_pattern=None):
instance_name_pattern=None, refresh=False):
return self._call(
ctxt, 'get_endpoint_instances',
platform_name=platform_name,
connection_info=connection_info,
source_environment=source_environment,
marker=marker,
limit=limit,
instance_name_pattern=instance_name_pattern)
instance_name_pattern=instance_name_pattern,
refresh=refresh)

def get_endpoint_instance(self, ctxt, platform_name, connection_info,
source_environment, instance_name):
Expand Down
4 changes: 2 additions & 2 deletions coriolis/worker/rpc/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ def exec_task(self, ctxt, task_id, task_type, origin, destination,

def get_endpoint_instances(self, ctxt, platform_name, connection_info,
source_environment, marker, limit,
instance_name_pattern):
instance_name_pattern, refresh=False):
export_provider = providers_factory.get_provider(
platform_name, constants.PROVIDER_TYPE_ENDPOINT_INSTANCES, None)

Expand All @@ -344,7 +344,7 @@ def get_endpoint_instances(self, ctxt, platform_name, connection_info,
instances_info = export_provider.get_instances(
ctxt, secret_connection_info, source_environment,
last_seen_id=marker, limit=limit,
instance_name_pattern=instance_name_pattern)
instance_name_pattern=instance_name_pattern, refresh=refresh)
for instance_info in instances_info:
schemas.validate_value(
instance_info, schemas.CORIOLIS_VM_INSTANCE_INFO_SCHEMA)
Expand Down