feat(oraclecloud): support regionless SDK setup

This commit is contained in:
Hugo P.Brito committed 2026-06-30 14:44:43 +01:00
1 parent 76063d02d9
commit 317f04de04
3 files changed
+338 -19

No files matched your search

@@ -5,6 +5,7 @@ import pytest
from prowler.providers.oraclecloud.exceptions.exceptions import (
OCIAuthenticationError,
OCIInvalidConfigError,
OCISetUpSessionError,
)
from prowler.providers.oraclecloud.models import OCIIdentityInfo, OCIRegion, OCISession
from prowler.providers.oraclecloud.oraclecloud_provider import OraclecloudProvider
@@ -200,6 +201,41 @@ MIIEpQIBAAKCAQEA0Z3VS5JJcds3xfn/ygWyF8n0sMcD/QHWCJ7yGSEtLN2T
assert connection.is_connected is True
def test_test_connection_direct_credentials_without_region_uses_bootstrap_region(
self,
):
"""Direct API key auth should not fall back to config-file auth without a region."""
import base64
valid_key = (
"-----BEGIN RSA PRIVATE KEY-----\nfake\n-----END RSA PRIVATE KEY-----"
)
encoded_key = base64.b64encode(valid_key.encode("utf-8")).decode("utf-8")
with (
patch("oci.config.validate_config") as mock_validate_config,
patch("oci.identity.IdentityClient") as mock_identity_client,
):
mock_tenancy = MagicMock()
mock_tenancy.name = "test-tenancy"
mock_response = MagicMock()
mock_response.data = mock_tenancy
mock_client_instance = MagicMock()
mock_client_instance.get_tenancy.return_value = mock_response
mock_identity_client.return_value = mock_client_instance
connection = OraclecloudProvider.test_connection(
key_content=encoded_key,
user="ocid1.user.oc1..aaaaaaaexample",
fingerprint="aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99",
tenancy="ocid1.tenancy.oc1..aaaaaaaexample",
provider_id="ocid1.tenancy.oc1..aaaaaaaexample",
raise_on_exception=False,
)
assert connection.is_connected is True
assert mock_validate_config.call_args.args[0]["region"] == "us-ashburn-1"
class TestOraclecloudProviderInit:
"""Tests for OraclecloudProvider initialization"""
@@ -256,6 +292,159 @@ class TestOraclecloudProviderInit:
assert provider.home_region == "us-ashburn-1"
mock_set_global.assert_called_once_with(provider)
def test_init_with_multiple_regions_uses_deterministic_session_region(self):
mock_session = OCISession(
config={"region": "us-ashburn-1"}, signer=None, profile="DEFAULT"
)
mock_identity = OCIIdentityInfo(
tenancy_id="ocid1.tenancy.oc1..aaaaaaaexample",
tenancy_name="test-tenancy",
user_id="ocid1.user.oc1..aaaaaaaexample",
region="us-ashburn-1",
profile="DEFAULT",
audited_regions=set(),
audited_compartments=[],
)
audited_regions = [
OCIRegion(key="us-ashburn-1", name="us-ashburn-1", is_home_region=True),
OCIRegion(key="us-phoenix-1", name="us-phoenix-1", is_home_region=False),
]
with (
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.setup_session",
return_value=mock_session,
) as mock_setup_session,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.set_identity",
return_value=mock_identity,
) as mock_set_identity,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_regions_to_audit",
return_value=audited_regions,
) as mock_get_regions_to_audit,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_compartments_to_audit",
return_value=["ocid1.compartment.oc1..aaaaaaaexample"],
),
patch("prowler.providers.common.provider.Provider.set_global_provider"),
):
provider = OraclecloudProvider(
region={"us-phoenix-1", "us-ashburn-1"},
user="ocid1.user.oc1..aaaaaaaexample",
fingerprint="aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99",
key_content="fake-base64-key-content",
tenancy="ocid1.tenancy.oc1..aaaaaaaexample",
config_content={"dummy": True},
mutelist_content={"Accounts": {}},
)
assert mock_setup_session.call_args.kwargs["region"] == "us-ashburn-1"
assert mock_set_identity.call_args.kwargs["region"] == "us-ashburn-1"
assert mock_get_regions_to_audit.call_args_list[0].args == (
{"us-phoenix-1", "us-ashburn-1"},
)
assert provider.regions == audited_regions
def test_init_with_legacy_region_string_uses_full_region_for_identity(self):
mock_session = OCISession(
config={"region": "us-ashburn-1"}, signer=None, profile="DEFAULT"
)
mock_identity = OCIIdentityInfo(
tenancy_id="ocid1.tenancy.oc1..aaaaaaaexample",
tenancy_name="test-tenancy",
user_id="ocid1.user.oc1..aaaaaaaexample",
region="us-ashburn-1",
profile="DEFAULT",
audited_regions=set(),
audited_compartments=[],
)
audited_regions = [
OCIRegion(key="us-ashburn-1", name="us-ashburn-1", is_home_region=True),
]
with (
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.setup_session",
return_value=mock_session,
) as mock_setup_session,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.set_identity",
return_value=mock_identity,
) as mock_set_identity,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_regions_to_audit",
return_value=audited_regions,
),
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_compartments_to_audit",
return_value=["ocid1.compartment.oc1..aaaaaaaexample"],
),
patch("prowler.providers.common.provider.Provider.set_global_provider"),
):
OraclecloudProvider(
region="us-ashburn-1",
user="ocid1.user.oc1..aaaaaaaexample",
fingerprint="aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99",
key_content="fake-base64-key-content",
tenancy="ocid1.tenancy.oc1..aaaaaaaexample",
config_content={"dummy": True},
mutelist_content={"Accounts": {}},
)
assert mock_setup_session.call_args.kwargs["region"] == "us-ashburn-1"
assert mock_set_identity.call_args.kwargs["region"] == "us-ashburn-1"
def test_init_without_region_uses_bootstrap_region_without_scan_filter(self):
mock_session = OCISession(
config={"region": "us-ashburn-1"}, signer=None, profile="DEFAULT"
)
mock_identity = OCIIdentityInfo(
tenancy_id="ocid1.tenancy.oc1..aaaaaaaexample",
tenancy_name="test-tenancy",
user_id="ocid1.user.oc1..aaaaaaaexample",
region="us-ashburn-1",
profile="DEFAULT",
audited_regions=set(),
audited_compartments=[],
)
all_subscribed_regions = [
OCIRegion(key="us-ashburn-1", name="us-ashburn-1", is_home_region=True),
OCIRegion(key="us-phoenix-1", name="us-phoenix-1", is_home_region=False),
]
with (
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.setup_session",
return_value=mock_session,
) as mock_setup_session,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.set_identity",
return_value=mock_identity,
) as mock_set_identity,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_regions_to_audit",
return_value=all_subscribed_regions,
) as mock_get_regions_to_audit,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_compartments_to_audit",
return_value=["ocid1.compartment.oc1..aaaaaaaexample"],
),
patch("prowler.providers.common.provider.Provider.set_global_provider"),
):
provider = OraclecloudProvider(
user="ocid1.user.oc1..aaaaaaaexample",
fingerprint="aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99",
key_content="fake-base64-key-content",
tenancy="ocid1.tenancy.oc1..aaaaaaaexample",
config_content={"dummy": True},
mutelist_content={"Accounts": {}},
)
assert mock_setup_session.call_args.kwargs["region"] == "us-ashburn-1"
assert mock_set_identity.call_args.kwargs["region"] == "us-ashburn-1"
assert mock_get_regions_to_audit.call_args_list[0].args == (None,)
assert provider.regions == all_subscribed_regions
def test_home_region_uses_full_subscription_list_not_region_filter(self):
"""Home region must come from the full subscription list, not the --region filter.
@@ -313,3 +502,105 @@ class TestOraclecloudProviderInit:
assert provider.regions == audited_regions
assert provider.home_region == "us-ashburn-1"
def test_init_with_legacy_single_region_preserves_fallback_for_home_region(self):
mock_session = OCISession(
config={"region": "us-phoenix-1"}, signer=None, profile="DEFAULT"
)
mock_identity = OCIIdentityInfo(
tenancy_id="ocid1.tenancy.oc1..aaaaaaaexample",
tenancy_name="test-tenancy",
user_id="ocid1.user.oc1..aaaaaaaexample",
region="us-phoenix-1",
profile="DEFAULT",
audited_regions=set(),
audited_compartments=[],
)
with (
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.setup_session",
return_value=mock_session,
),
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.set_identity",
return_value=mock_identity,
),
patch("oci.identity.IdentityClient") as mock_identity_client,
patch(
"prowler.providers.oraclecloud.oraclecloud_provider.OraclecloudProvider.get_compartments_to_audit",
return_value=["ocid1.compartment.oc1..aaaaaaaexample"],
),
patch("prowler.providers.common.provider.Provider.set_global_provider"),
):
mock_identity_client.return_value.list_region_subscriptions.side_effect = (
Exception("discovery failed")
)
provider = OraclecloudProvider(
region="us-phoenix-1",
config_content={"dummy": True},
mutelist_content={"Accounts": {}},
)
assert [region.key for region in provider.regions] == ["us-phoenix-1"]
assert provider.home_region == "us-phoenix-1"
class TestGetRegionsToAudit:
def _provider_with_identity(self):
provider = OraclecloudProvider.__new__(OraclecloudProvider)
provider._session = OCISession(
config={"region": "us-ashburn-1"}, signer=None, profile="DEFAULT"
)
provider._identity = OCIIdentityInfo(
tenancy_id="ocid1.tenancy.oc1..aaaaaaaexample",
tenancy_name="test-tenancy",
user_id="ocid1.user.oc1..aaaaaaaexample",
region="us-ashburn-1",
profile="DEFAULT",
audited_regions=set(),
audited_compartments=[],
)
return provider
def test_regionless_scan_raises_when_region_subscription_discovery_fails(self):
provider = self._provider_with_identity()
with patch("oci.identity.IdentityClient") as mock_identity_client:
mock_identity_client.return_value.list_region_subscriptions.side_effect = (
Exception("discovery failed")
)
with pytest.raises(OCISetUpSessionError) as exc_info:
provider.get_regions_to_audit()
assert "Could not retrieve OCI subscribed regions" in str(exc_info.value)
def test_single_explicit_region_falls_back_when_region_subscription_discovery_fails(
self,
):
provider = self._provider_with_identity()
with patch("oci.identity.IdentityClient") as mock_identity_client:
mock_identity_client.return_value.list_region_subscriptions.side_effect = (
Exception("discovery failed")
)
regions = provider.get_regions_to_audit("us-phoenix-1")
assert len(regions) == 1
assert regions[0].key == "us-phoenix-1"
def test_multiple_explicit_regions_raise_when_region_subscription_discovery_fails(
self,
):
provider = self._provider_with_identity()
with patch("oci.identity.IdentityClient") as mock_identity_client:
mock_identity_client.return_value.list_region_subscriptions.side_effect = (
Exception("discovery failed")
)
with pytest.raises(OCISetUpSessionError):
provider.get_regions_to_audit({"us-ashburn-1", "us-phoenix-1"})