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
3 changes: 2 additions & 1 deletion coriolis/api/v1/endpoint_instances.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ 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 = req.GET.get("refresh", "false").lower() == "true"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please use the get_bool_url_arg method you implemented a while ago.


env = req.GET.get("env")
if env is not None:
Expand All @@ -34,7 +35,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