From ef3546c22a1c0f0a232f9b60d653f069a9342866 Mon Sep 17 00:00:00 2001 From: Mihaela Balutoiu Date: Mon, 9 Mar 2026 21:04:55 +0200 Subject: [PATCH 1/3] Add VM inventory CSV export support Adds a `PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT` capability type that supports exporting VM inventory as CSV. Signed-off-by: Mihaela Balutoiu --- coriolis/api/v1/endpoint_inventory.py | 39 +++++++++++ coriolis/api/v1/router.py | 6 ++ coriolis/conductor/rpc/client.py | 7 ++ coriolis/conductor/rpc/server.py | 15 ++++ coriolis/constants.py | 1 + coriolis/endpoint_resources/api.py | 5 ++ coriolis/policies/endpoints.py | 11 +++ coriolis/providers/base.py | 21 ++++++ coriolis/providers/factory.py | 4 +- .../tests/api/v1/test_endpoint_inventory.py | 69 +++++++++++++++++++ coriolis/tests/conductor/rpc/test_server.py | 41 +++++++++++ coriolis/tests/worker/rpc/test_server.py | 49 +++++++++++++ coriolis/worker/rpc/client.py | 8 +++ coriolis/worker/rpc/server.py | 16 +++++ 14 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 coriolis/api/v1/endpoint_inventory.py create mode 100644 coriolis/tests/api/v1/test_endpoint_inventory.py diff --git a/coriolis/api/v1/endpoint_inventory.py b/coriolis/api/v1/endpoint_inventory.py new file mode 100644 index 00000000..616d60d3 --- /dev/null +++ b/coriolis/api/v1/endpoint_inventory.py @@ -0,0 +1,39 @@ +# Copyright 2026 Cloudbase Solutions Srl +# All Rights Reserved. + +from coriolis.api import wsgi as api_wsgi +from coriolis.endpoint_resources import api +from coriolis.policies import endpoints as endpoint_policies +from coriolis import utils + +from oslo_log import log as logging + +LOG = logging.getLogger(__name__) + + +class EndpointInventoryController(api_wsgi.Controller): + """Returns a VM inventory CSV for endpoints that support it.""" + + def __init__(self): + self._endpoint_resources_api = api.API() + super(EndpointInventoryController, self).__init__() + + def index(self, req, endpoint_id): + context = req.environ['coriolis.context'] + context.can("%s:export_inventory" % ( + endpoint_policies.ENDPOINTS_POLICY_PREFIX)) + + env = req.GET.get("env") + if env is not None: + env = utils.decode_base64_param(env, is_json=True) + else: + env = {} + + csv_content = self._endpoint_resources_api.get_endpoint_inventory_csv( + context, endpoint_id, env) + + return api_wsgi.ResponseObject(csv_content) + + +def create_resource(): + return api_wsgi.Resource(EndpointInventoryController()) diff --git a/coriolis/api/v1/router.py b/coriolis/api/v1/router.py index 35297957..168270e6 100644 --- a/coriolis/api/v1/router.py +++ b/coriolis/api/v1/router.py @@ -11,6 +11,7 @@ from coriolis.api.v1 import endpoint_destination_minion_pool_options from coriolis.api.v1 import endpoint_destination_options from coriolis.api.v1 import endpoint_instances +from coriolis.api.v1 import endpoint_inventory from coriolis.api.v1 import endpoint_networks from coriolis.api.v1 import endpoint_source_minion_pool_options from coriolis.api.v1 import endpoint_source_options @@ -109,6 +110,11 @@ def _setup_routes(self, mapper, ext_mgr): mapper.resource('instance', 'endpoints/{endpoint_id}/instances', controller=self.resources['endpoint_instances']) + self.resources['endpoint_inventory'] = \ + endpoint_inventory.create_resource() + mapper.resource('inventory', 'endpoints/{endpoint_id}/inventory', + controller=self.resources['endpoint_inventory']) + self.resources['endpoint_networks'] = \ endpoint_networks.create_resource() mapper.resource('network', 'endpoints/{endpoint_id}/networks', diff --git a/coriolis/conductor/rpc/client.py b/coriolis/conductor/rpc/client.py index dabf2bbe..bfa04afb 100644 --- a/coriolis/conductor/rpc/client.py +++ b/coriolis/conductor/rpc/client.py @@ -102,6 +102,13 @@ def get_endpoint_storage(self, ctxt, endpoint_id, env): endpoint_id=endpoint_id, env=env) + def get_endpoint_inventory_csv( + self, ctxt, endpoint_id, source_environment): + return self._call( + ctxt, 'get_endpoint_inventory_csv', + endpoint_id=endpoint_id, + source_environment=source_environment) + def validate_endpoint_connection(self, ctxt, endpoint_id): return self._call( ctxt, 'validate_endpoint_connection', diff --git a/coriolis/conductor/rpc/server.py b/coriolis/conductor/rpc/server.py index fa70e524..4bff9b79 100644 --- a/coriolis/conductor/rpc/server.py +++ b/coriolis/conductor/rpc/server.py @@ -572,6 +572,21 @@ def get_endpoint_storage(self, ctxt, endpoint_id, env): return worker_rpc.get_endpoint_storage( ctxt, endpoint.type, endpoint.connection_info, env) + def get_endpoint_inventory_csv( + self, ctxt, endpoint_id, source_environment): + endpoint = self.get_endpoint(ctxt, endpoint_id) + + worker_rpc = self._get_worker_service_rpc_for_specs( + ctxt, enabled=True, + region_sets=[[reg.id for reg in endpoint.mapped_regions]], + provider_requirements={ + endpoint.type: [ + constants.PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT]}) + + return worker_rpc.get_endpoint_inventory_csv( + ctxt, endpoint.type, endpoint.connection_info, + source_environment) + def validate_endpoint_connection(self, ctxt, endpoint_id): endpoint = self.get_endpoint(ctxt, endpoint_id) diff --git a/coriolis/constants.py b/coriolis/constants.py index 71e55343..e5ca4c1f 100644 --- a/coriolis/constants.py +++ b/coriolis/constants.py @@ -207,6 +207,7 @@ PROVIDER_TYPE_DESTINATION_TRANSFER_UPDATE = 262144 PROVIDER_TYPE_SOURCE_MINION_POOL = 524288 PROVIDER_TYPE_DESTINATION_MINION_POOL = 1048576 +PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT = 2097152 # NOTE(dvincze): These are deprecated, we should remove them, # and de-increment the rest PROVIDER_TYPE_VALIDATE_MIGRATION_EXPORT = 2048 diff --git a/coriolis/endpoint_resources/api.py b/coriolis/endpoint_resources/api.py index ee2364b8..59b7c182 100644 --- a/coriolis/endpoint_resources/api.py +++ b/coriolis/endpoint_resources/api.py @@ -27,3 +27,8 @@ def get_endpoint_networks(self, ctxt, endpoint_id, env): def get_endpoint_storage(self, ctxt, endpoint_id, env): return self._rpc_client.get_endpoint_storage( ctxt, endpoint_id, env) + + def get_endpoint_inventory_csv( + self, ctxt, endpoint_id, source_environment): + return self._rpc_client.get_endpoint_inventory_csv( + ctxt, endpoint_id, source_environment) diff --git a/coriolis/policies/endpoints.py b/coriolis/policies/endpoints.py index 7bba45f6..17dddf41 100644 --- a/coriolis/policies/endpoints.py +++ b/coriolis/policies/endpoints.py @@ -173,6 +173,17 @@ def get_endpoints_policy_label(rule_label): } ] ), + policy.DocumentedRuleDefault( + get_endpoints_policy_label('export_inventory'), + ENDPOINTS_POLICY_DEFAULT_RULE, + "Export VM inventory as CSV for a supported endpoint", + [ + { + "path": "/endpoints/{endpoint_id}/inventory", + "method": "GET" + } + ] + ), ] diff --git a/coriolis/providers/base.py b/coriolis/providers/base.py index 8f39d221..bbc9022a 100644 --- a/coriolis/providers/base.py +++ b/coriolis/providers/base.py @@ -623,6 +623,27 @@ def healthcheck_minion( pass +class BaseEndpointInventoryExportProvider( + object, with_metaclass(abc.ABCMeta)): + """Capability class for providers that support VM inventory CSV export. + + Providers that implement this class will be offered in the UI as + supporting the inventory export action. Providers that do not implement + this class cleanly do not support it — no additional error handling is + required at the provider level. + """ + + @abc.abstractmethod + def export_instance_inventory( + self, ctxt, connection_info, source_environment): + """Export the full VM inventory as a CSV-formatted string. + + Returns a standards-compliant CSV string with a header row and one + row per VM, sorted deterministically by VM ID. + """ + raise NotImplementedError() + + class BaseSourceMinionPoolProvider(_BaseMinionPoolProvider): pass diff --git a/coriolis/providers/factory.py b/coriolis/providers/factory.py index ff3a5cdb..26279d80 100644 --- a/coriolis/providers/factory.py +++ b/coriolis/providers/factory.py @@ -53,7 +53,9 @@ constants.PROVIDER_TYPE_SOURCE_MINION_POOL: ( base.BaseSourceMinionPoolProvider), constants.PROVIDER_TYPE_DESTINATION_MINION_POOL: ( - base.BaseDestinationMinionPoolProvider) + base.BaseDestinationMinionPoolProvider), + constants.PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT: ( + base.BaseEndpointInventoryExportProvider), } diff --git a/coriolis/tests/api/v1/test_endpoint_inventory.py b/coriolis/tests/api/v1/test_endpoint_inventory.py new file mode 100644 index 00000000..78833772 --- /dev/null +++ b/coriolis/tests/api/v1/test_endpoint_inventory.py @@ -0,0 +1,69 @@ +# Copyright 2026 Cloudbase Solutions Srl +# All Rights Reserved. + +from unittest import mock + +from coriolis.api.v1 import endpoint_inventory as endpoint +from coriolis.api import wsgi as api_wsgi +from coriolis.endpoint_resources import api +from coriolis.tests import test_base +from coriolis import utils + + +class EndpointInventoryControllerTestCase(test_base.CoriolisBaseTestCase): + """Test suite for the Coriolis Endpoint Inventory v1 API""" + + def setUp(self): + super(EndpointInventoryControllerTestCase, self).setUp() + self.endpoint_api = endpoint.EndpointInventoryController() + + @mock.patch.object(utils, 'decode_base64_param') + @mock.patch.object(api.API, 'get_endpoint_inventory_csv') + def test_index( + self, + mock_get_endpoint_inventory_csv, + mock_decode_base64_param, + ): + mock_req = mock.Mock() + mock_context = mock.Mock() + endpoint_id = mock.sentinel.endpoint_id + mock_req.environ = {'coriolis.context': mock_context} + env = mock.sentinel.env + mock_req.GET = {'env': env} + mock_get_endpoint_inventory_csv.return_value = 'vm_id,vm_name\n' + + response = self.endpoint_api.index(mock_req, endpoint_id) + + mock_context.can.assert_called_once_with( + 'migration:endpoints:export_inventory') + mock_decode_base64_param.assert_called_once_with(env, is_json=True) + mock_get_endpoint_inventory_csv.assert_called_once_with( + mock_context, endpoint_id, + mock_decode_base64_param.return_value) + self.assertIsInstance(response, api_wsgi.ResponseObject) + self.assertEqual(response.code, 200) + self.assertEqual(response.obj, 'vm_id,vm_name\n') + + @mock.patch.object(utils, 'decode_base64_param') + @mock.patch.object(api.API, 'get_endpoint_inventory_csv') + def test_index_no_env( + self, + mock_get_endpoint_inventory_csv, + mock_decode_base64_param, + ): + mock_req = mock.Mock() + mock_context = mock.Mock() + endpoint_id = mock.sentinel.endpoint_id + mock_req.environ = {'coriolis.context': mock_context} + mock_req.GET = {} + mock_get_endpoint_inventory_csv.return_value = 'vm_id,vm_name\n' + + response = self.endpoint_api.index(mock_req, endpoint_id) + + mock_decode_base64_param.assert_not_called() + mock_get_endpoint_inventory_csv.assert_called_once_with( + mock_context, endpoint_id, {}) + self.assertIsInstance(response, api_wsgi.ResponseObject) + self.assertEqual(response.code, 200) + self.assertEqual( + mock_req.environ['coriolis.best_content_type'], 'text/csv') diff --git a/coriolis/tests/conductor/rpc/test_server.py b/coriolis/tests/conductor/rpc/test_server.py index fb6dac0c..e8ba91a2 100644 --- a/coriolis/tests/conductor/rpc/test_server.py +++ b/coriolis/tests/conductor/rpc/test_server.py @@ -525,6 +525,47 @@ def test_get_endpoint_storage_pools( storage_pools, rpc_return_value.get_endpoint_storage.return_value ) + @mock.patch.object( + server.ConductorServerEndpoint, "_get_worker_service_rpc_for_specs" + ) + @mock.patch.object(server.ConductorServerEndpoint, "get_endpoint") + def test_get_endpoint_inventory_csv( + self, mock_get_endpoint, mock_get_worker_service_rpc_for_specs + ): + result = self.server.get_endpoint_inventory_csv( + mock.sentinel.context, + mock.sentinel.endpoint_id, + mock.sentinel.source_environment, + ) + + mock_get_endpoint.assert_called_once_with( + mock.sentinel.context, mock.sentinel.endpoint_id + ) + + mock_get_worker_service_rpc_for_specs.assert_called_once_with( + mock.sentinel.context, + enabled=True, + region_sets=[[]], + provider_requirements={ + mock_get_endpoint.return_value.type: [ + constants.PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT + ] + }, + ) + + rpc_return_value = mock_get_worker_service_rpc_for_specs.return_value + rpc_return_value.get_endpoint_inventory_csv.assert_called_once_with( + mock.sentinel.context, + mock_get_endpoint.return_value.type, + mock_get_endpoint.return_value.connection_info, + mock.sentinel.source_environment, + ) + + self.assertEqual( + result, + rpc_return_value.get_endpoint_inventory_csv.return_value + ) + @mock.patch.object( server.ConductorServerEndpoint, "_get_worker_service_rpc_for_specs" ) diff --git a/coriolis/tests/worker/rpc/test_server.py b/coriolis/tests/worker/rpc/test_server.py index 20b32f4b..f5e1114d 100644 --- a/coriolis/tests/worker/rpc/test_server.py +++ b/coriolis/tests/worker/rpc/test_server.py @@ -940,6 +940,55 @@ def test_get_endpoint_storage( storage, mock_get_provider.return_value.get_storage.return_value ) + @mock.patch.object(utils, "get_secret_connection_info") + @mock.patch.object(providers_factory, "get_provider") + def test_get_endpoint_inventory_csv( + self, mock_get_provider, mock_get_secret + ): + result = self.server.get_endpoint_inventory_csv( + mock.sentinel.context, + mock.sentinel.platform_name, + mock.sentinel.connection_info, + mock.sentinel.source_environment, + ) + + mock_get_provider.assert_called_once_with( + mock.sentinel.platform_name, + constants.PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT, + None, + ) + mock_get_secret.assert_called_once_with( + mock.sentinel.context, mock.sentinel.connection_info + ) + mock_get_provider.return_value.export_instance_inventory\ + .assert_called_once_with( + mock.sentinel.context, + mock_get_secret.return_value, + mock.sentinel.source_environment, + ) + self.assertEqual( + result, + mock_get_provider.return_value.export_instance_inventory + .return_value + ) + + @mock.patch.object(utils, "get_secret_connection_info") + @mock.patch.object(providers_factory, "get_provider") + def test_get_endpoint_inventory_csv_unsupported_provider( + self, mock_get_provider, mock_get_secret + ): + mock_get_provider.return_value = None + + self.assertRaises( + exception.InvalidInput, + self.server.get_endpoint_inventory_csv, + mock.sentinel.context, + mock.sentinel.platform_name, + mock.sentinel.connection_info, + mock.sentinel.source_environment, + ) + mock_get_secret.assert_not_called() + @mock.patch.object(providers_factory, "get_available_providers") def test_get_available_providers(self, mock_get_available_providers): result = self.server.get_available_providers(mock.sentinel.context) diff --git a/coriolis/worker/rpc/client.py b/coriolis/worker/rpc/client.py index cec7aa0c..7625d2dd 100644 --- a/coriolis/worker/rpc/client.py +++ b/coriolis/worker/rpc/client.py @@ -146,6 +146,14 @@ def get_endpoint_storage(self, ctxt, platform_name, connection_info, env): connection_info=connection_info, env=env) + def get_endpoint_inventory_csv( + self, ctxt, platform_name, connection_info, source_environment): + return self._call( + ctxt, 'get_endpoint_inventory_csv', + platform_name=platform_name, + connection_info=connection_info, + source_environment=source_environment) + def get_available_providers(self, ctxt): return self._call( ctxt, 'get_available_providers') diff --git a/coriolis/worker/rpc/server.py b/coriolis/worker/rpc/server.py index 19d9dbf3..a969d112 100644 --- a/coriolis/worker/rpc/server.py +++ b/coriolis/worker/rpc/server.py @@ -492,6 +492,22 @@ def get_endpoint_storage(self, ctxt, platform_name, connection_info, env): return storage + def get_endpoint_inventory_csv( + self, ctxt, platform_name, connection_info, source_environment): + provider = providers_factory.get_provider( + platform_name, + constants.PROVIDER_TYPE_ENDPOINT_INVENTORY_EXPORT, None) + if not provider: + raise exception.InvalidInput( + "Provider plugin for platform '%s' does not support " + "VM inventory CSV export." % platform_name) + + secret_connection_info = utils.get_secret_connection_info( + ctxt, connection_info) + + return provider.export_instance_inventory( + ctxt, secret_connection_info, source_environment) + def get_available_providers(self, ctxt): return providers_factory.get_available_providers() From bbbf41a7cc76b798907e0b557abe8b4e82003f6d Mon Sep 17 00:00:00 2001 From: Mihaela Balutoiu Date: Thu, 26 Mar 2026 16:34:47 +0200 Subject: [PATCH 2/3] Add CSV serializer support to WSGI layer Signed-off-by: Mihaela Balutoiu --- coriolis/api/wsgi.py | 12 +++++++++++- coriolis/tests/api/v1/test_endpoint_inventory.py | 2 -- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/coriolis/api/wsgi.py b/coriolis/api/wsgi.py index 161744df..6c42df7f 100644 --- a/coriolis/api/wsgi.py +++ b/coriolis/api/wsgi.py @@ -34,10 +34,12 @@ SUPPORTED_CONTENT_TYPES = ( 'application/json', + 'text/csv', ) _MEDIA_TYPE_MAP = { 'application/json': 'json', + 'text/csv': 'csv', } @@ -426,6 +428,13 @@ def default(self, data): return jsonutils.dumps(data) +class CSVSerializer(DictSerializer): + """Serializer for CSV responses. Expects pre-formatted CSV string.""" + + def default(self, data): + return str(data) + + def serializers(**serializers): """Attaches serializers to a method. @@ -693,7 +702,8 @@ def __init__(self, controller, action_peek=None, **deserializers): default_deserializers.update(deserializers) self.default_deserializers = default_deserializers - self.default_serializers = dict(json=JSONDictSerializer) + self.default_serializers = dict(json=JSONDictSerializer, + csv=CSVSerializer) self.action_peek = dict(json=action_peek_json) self.action_peek.update(action_peek or {}) diff --git a/coriolis/tests/api/v1/test_endpoint_inventory.py b/coriolis/tests/api/v1/test_endpoint_inventory.py index 78833772..e187c0ec 100644 --- a/coriolis/tests/api/v1/test_endpoint_inventory.py +++ b/coriolis/tests/api/v1/test_endpoint_inventory.py @@ -65,5 +65,3 @@ def test_index_no_env( mock_context, endpoint_id, {}) self.assertIsInstance(response, api_wsgi.ResponseObject) self.assertEqual(response.code, 200) - self.assertEqual( - mock_req.environ['coriolis.best_content_type'], 'text/csv') From 56313e3d6cacef1d20a291be0dc8091646f5b66e Mon Sep 17 00:00:00 2001 From: Mihaela Balutoiu Date: Thu, 26 Mar 2026 16:43:00 +0200 Subject: [PATCH 3/3] Add VM inventory CSV endpoint to api-ref docs Signed-off-by: Mihaela Balutoiu --- .../endpoint/endpoint-inventory-resp.csv | 3 + coriolis/api-refs/source/endpoint.inc | 58 +++++++++++++++++++ coriolis/api-refs/source/parameters.yaml | 7 +++ 3 files changed, 68 insertions(+) create mode 100644 coriolis/api-refs/api_samples/endpoint/endpoint-inventory-resp.csv diff --git a/coriolis/api-refs/api_samples/endpoint/endpoint-inventory-resp.csv b/coriolis/api-refs/api_samples/endpoint/endpoint-inventory-resp.csv new file mode 100644 index 00000000..9f59a028 --- /dev/null +++ b/coriolis/api-refs/api_samples/endpoint/endpoint-inventory-resp.csv @@ -0,0 +1,3 @@ +vm_id,vm_name,firmware,num_cpu,memory_mb,nested_virtualization,dynamic_memory_enabled,secure_boot,os_type,guest_id,disks,nics,hostname,parent_vapp,host,power_state +4cb7e5e1-d3c4-4b0a-8742-f2b1b3d9a1c2,web-server-01,efi,4,8192,False,True,False,linux,ubuntu64Guest,150GB,Network adapter 1|00:50:56:aa:bb:cc|VM Network|10.0.0.10,web-server-01,,esxi-host-01.example.com,poweredOn +9fa23b11-7e2a-4c10-a3f8-0d1e2f3c4a5b,db-server-01,bios,8,16384,False,False,False,windows,windows9Server64Guest,300GB,Network adapter 1|00:50:56:aa:cc:dd|VM Network|10.0.0.20,db-server-01,db-vapp,esxi-host-02.example.com,poweredOn diff --git a/coriolis/api-refs/source/endpoint.inc b/coriolis/api-refs/source/endpoint.inc index 943fa8c2..dc21c34b 100644 --- a/coriolis/api-refs/source/endpoint.inc +++ b/coriolis/api-refs/source/endpoint.inc @@ -325,6 +325,64 @@ Response .. literalinclude:: ../api_samples/endpoint/endpoint-instance-show-resp.json :language: javascript +Get Endpoint VM Inventory +========================= + +.. rest_method:: GET /endpoints/{endpoint_id}/inventory + +Exports the full VM inventory of an endpoint in CSV format. + +**Preconditions** + +The endpoint must exist and the provider must support inventory export. + +Normal response codes: 200 + +Error response codes: unauthorized(401), forbidden(403), +itemNotFound(404) + +Request +------- + +.. rest_parameters:: parameters.yaml + + - endpoint_id : endpoint_id_path + - env : inventory_source_env + +Response +-------- + +The response body is a UTF-8 encoded CSV file with various columns returned. +Each provider may return more specific fields (i.e. parentVapp when using VMWare). +The example below shows the values returned by the VMWare provider. + +- **vm_id** – Unique identifier (UUID) of the VM. +- **vm_name** – Display name of the VM. +- **guest_id** – Raw VMware guest OS identifier (e.g. ``ubuntu64Guest``). +- **firmware** – Firmware type (``bios`` or ``efi``). +- **num_cpu** – Number of vCPUs. +- **memory_mb** – Memory in megabytes. +- **nested_virtualization** – Whether nested virtualisation is enabled. +- **dynamic_memory_enabled** – Whether dynamic memory is enabled. +- **secure_boot** – Whether EFI Secure Boot is enabled. +- **os_type** – Coriolis-normalised OS type (e.g. ``linux``, ``windows``). +- **disks** – Total provisioned disk size for the VM (e.g. ``150GB``). +- **nics** – Semicolon-separated list of NIC entries, each formatted as + ``label|mac[|network[|ip1,ip2,...]]``. +- **hostname** – Guest hostname as reported by VMware Tools (empty if tools + are not running). +- **parent_vapp** – Name of the parent vApp, if any. +- **host** – ESXi host the VM is currently running on. +- **power_state** – Current power state (e.g. ``poweredOn``, ``poweredOff``). + +The response is returned with ``Content-Type: text/csv`` and a +``Content-Disposition: attachment`` header suggesting a filename of the form +``vm_inventory_{endpoint_id}.csv``. + +**Example VM Inventory CSV Response** + +.. literalinclude:: ../api_samples/endpoint/endpoint-inventory-resp.csv + Get Endpoint Destination Options ================================ diff --git a/coriolis/api-refs/source/parameters.yaml b/coriolis/api-refs/source/parameters.yaml index 9fef155a..3b332f37 100644 --- a/coriolis/api-refs/source/parameters.yaml +++ b/coriolis/api-refs/source/parameters.yaml @@ -96,6 +96,13 @@ instance_refresh: required: false type: boolean default: false +inventory_source_env: + description: | + Optional base64-encoded JSON object containing source environment options + for the inventory export When omitted, the provider's defaults are used. + in: query + required: false + type: string show_deleted: description: | Whether to include deleted resources in the response.