mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-11-02 01:15:31 +00:00
feat(openstack): Add 7 New Compute Security Checks (#9944)
This commit is contained in:
1 parent
90e317d39f
commit
be516f1dfc
37 files changed
+3843
-25
No files matched your search
@@ -44,6 +44,24 @@ class TestComputeService:
|
||||
mock_server1.status = "ACTIVE"
|
||||
mock_server1.flavor = {"id": "flavor-1"}
|
||||
mock_server1.security_groups = [{"name": "default"}]
|
||||
mock_server1.is_locked = True
|
||||
mock_server1.locked_reason = "maintenance"
|
||||
mock_server1.key_name = "my-keypair"
|
||||
mock_server1.user_id = "user-123"
|
||||
mock_server1.access_ipv4 = "203.0.113.10"
|
||||
mock_server1.access_ipv6 = "2001:db8::1"
|
||||
mock_server1.public_v4 = "203.0.113.10"
|
||||
mock_server1.public_v6 = ""
|
||||
mock_server1.private_v4 = "10.0.0.5"
|
||||
mock_server1.private_v6 = ""
|
||||
mock_server1.addresses = {
|
||||
"private": [{"version": 4, "addr": "10.0.0.5"}],
|
||||
"public": [{"version": 4, "addr": "203.0.113.10"}],
|
||||
}
|
||||
mock_server1.has_config_drive = True
|
||||
mock_server1.metadata = {"environment": "production"}
|
||||
mock_server1.user_data = "#!/bin/bash\necho hello"
|
||||
mock_server1.trusted_image_certificates = ["cert-123"]
|
||||
|
||||
mock_server2 = MagicMock()
|
||||
mock_server2.id = "instance-2"
|
||||
@@ -51,6 +69,21 @@ class TestComputeService:
|
||||
mock_server2.status = "SHUTOFF"
|
||||
mock_server2.flavor = {"id": "flavor-2"}
|
||||
mock_server2.security_groups = [{"name": "web"}, {"name": "db"}]
|
||||
mock_server2.is_locked = False
|
||||
mock_server2.locked_reason = ""
|
||||
mock_server2.key_name = ""
|
||||
mock_server2.user_id = "user-456"
|
||||
mock_server2.access_ipv4 = ""
|
||||
mock_server2.access_ipv6 = ""
|
||||
mock_server2.public_v4 = ""
|
||||
mock_server2.public_v6 = ""
|
||||
mock_server2.private_v4 = "10.0.0.10"
|
||||
mock_server2.private_v6 = ""
|
||||
mock_server2.addresses = {"private": [{"version": 4, "addr": "10.0.0.10"}]}
|
||||
mock_server2.has_config_drive = False
|
||||
mock_server2.metadata = {}
|
||||
mock_server2.user_data = ""
|
||||
mock_server2.trusted_image_certificates = []
|
||||
|
||||
provider.connection.compute.servers.return_value = [
|
||||
mock_server1,
|
||||
@@ -68,8 +101,27 @@ class TestComputeService:
|
||||
assert compute.instances[0].security_groups == ["default"]
|
||||
assert compute.instances[0].region == OPENSTACK_REGION
|
||||
assert compute.instances[0].project_id == OPENSTACK_PROJECT_ID
|
||||
assert compute.instances[0].is_locked is True
|
||||
assert compute.instances[0].locked_reason == "maintenance"
|
||||
assert compute.instances[0].key_name == "my-keypair"
|
||||
assert compute.instances[0].user_id == "user-123"
|
||||
assert compute.instances[0].access_ipv4 == "203.0.113.10"
|
||||
assert compute.instances[0].access_ipv6 == "2001:db8::1"
|
||||
assert compute.instances[0].public_v4 == "203.0.113.10"
|
||||
assert compute.instances[0].private_v4 == "10.0.0.5"
|
||||
assert compute.instances[0].networks == {
|
||||
"private": ["10.0.0.5"],
|
||||
"public": ["203.0.113.10"],
|
||||
}
|
||||
assert compute.instances[0].has_config_drive is True
|
||||
assert compute.instances[0].metadata == {"environment": "production"}
|
||||
assert compute.instances[0].user_data == "#!/bin/bash\necho hello"
|
||||
assert compute.instances[0].trusted_image_certificates == ["cert-123"]
|
||||
|
||||
assert compute.instances[1].security_groups == ["web", "db"]
|
||||
assert compute.instances[1].is_locked is False
|
||||
assert compute.instances[1].key_name == ""
|
||||
assert compute.instances[1].trusted_image_certificates == []
|
||||
|
||||
def test_compute_list_instances_empty(self):
|
||||
"""Test listing instances when none exist."""
|
||||
@@ -90,6 +142,21 @@ class TestComputeService:
|
||||
del mock_server.status
|
||||
del mock_server.flavor
|
||||
del mock_server.security_groups
|
||||
del mock_server.is_locked
|
||||
del mock_server.locked_reason
|
||||
del mock_server.key_name
|
||||
del mock_server.user_id
|
||||
del mock_server.access_ipv4
|
||||
del mock_server.access_ipv6
|
||||
del mock_server.public_v4
|
||||
del mock_server.public_v6
|
||||
del mock_server.private_v4
|
||||
del mock_server.private_v6
|
||||
del mock_server.addresses
|
||||
del mock_server.has_config_drive
|
||||
del mock_server.metadata
|
||||
del mock_server.user_data
|
||||
del mock_server.trusted_image_certificates
|
||||
|
||||
provider.connection.compute.servers.return_value = [mock_server]
|
||||
|
||||
@@ -101,6 +168,21 @@ class TestComputeService:
|
||||
assert compute.instances[0].status == ""
|
||||
assert compute.instances[0].flavor_id == ""
|
||||
assert compute.instances[0].security_groups == []
|
||||
assert compute.instances[0].is_locked is False
|
||||
assert compute.instances[0].locked_reason == ""
|
||||
assert compute.instances[0].key_name == ""
|
||||
assert compute.instances[0].user_id == ""
|
||||
assert compute.instances[0].access_ipv4 == ""
|
||||
assert compute.instances[0].access_ipv6 == ""
|
||||
assert compute.instances[0].public_v4 == ""
|
||||
assert compute.instances[0].public_v6 == ""
|
||||
assert compute.instances[0].private_v4 == ""
|
||||
assert compute.instances[0].private_v6 == ""
|
||||
assert compute.instances[0].networks == {}
|
||||
assert compute.instances[0].has_config_drive is False
|
||||
assert compute.instances[0].metadata == {}
|
||||
assert compute.instances[0].user_data == ""
|
||||
assert compute.instances[0].trusted_image_certificates == []
|
||||
|
||||
def test_compute_list_instances_sdk_exception(self):
|
||||
"""Test handling SDKException when listing instances."""
|
||||
@@ -133,6 +215,21 @@ class TestComputeService:
|
||||
mock_server.status = "ACTIVE"
|
||||
mock_server.flavor = {"id": "flavor-1"}
|
||||
mock_server.security_groups = [{"name": "default"}]
|
||||
mock_server.is_locked = False
|
||||
mock_server.locked_reason = ""
|
||||
mock_server.key_name = ""
|
||||
mock_server.user_id = ""
|
||||
mock_server.access_ipv4 = ""
|
||||
mock_server.access_ipv6 = ""
|
||||
mock_server.public_v4 = ""
|
||||
mock_server.public_v6 = ""
|
||||
mock_server.private_v4 = ""
|
||||
mock_server.private_v6 = ""
|
||||
mock_server.addresses = {}
|
||||
mock_server.has_config_drive = False
|
||||
mock_server.metadata = {}
|
||||
mock_server.user_data = ""
|
||||
mock_server.trusted_image_certificates = []
|
||||
yield mock_server
|
||||
raise Exception("Iterator failed")
|
||||
|
||||
@@ -154,6 +251,23 @@ class TestComputeService:
|
||||
security_groups=["default"],
|
||||
region="RegionOne",
|
||||
project_id="project-1",
|
||||
is_locked=True,
|
||||
locked_reason="maintenance",
|
||||
key_name="my-keypair",
|
||||
user_id="user-123",
|
||||
access_ipv4="203.0.113.10",
|
||||
access_ipv6="2001:db8::1",
|
||||
public_v4="203.0.113.10",
|
||||
public_v6="",
|
||||
private_v4="10.0.0.5",
|
||||
private_v6="",
|
||||
networks={
|
||||
"private": ["10.0.0.5"]
|
||||
}, # Note: This is the processed dict, not addresses
|
||||
has_config_drive=True,
|
||||
metadata={"environment": "production"},
|
||||
user_data="#!/bin/bash\necho hello",
|
||||
trusted_image_certificates=["cert-123"],
|
||||
)
|
||||
|
||||
assert instance.id == "instance-1"
|
||||
@@ -163,6 +277,21 @@ class TestComputeService:
|
||||
assert instance.security_groups == ["default"]
|
||||
assert instance.region == "RegionOne"
|
||||
assert instance.project_id == "project-1"
|
||||
assert instance.is_locked is True
|
||||
assert instance.locked_reason == "maintenance"
|
||||
assert instance.key_name == "my-keypair"
|
||||
assert instance.user_id == "user-123"
|
||||
assert instance.access_ipv4 == "203.0.113.10"
|
||||
assert instance.access_ipv6 == "2001:db8::1"
|
||||
assert instance.public_v4 == "203.0.113.10"
|
||||
assert instance.public_v6 == ""
|
||||
assert instance.private_v4 == "10.0.0.5"
|
||||
assert instance.private_v6 == ""
|
||||
assert instance.networks == {"private": ["10.0.0.5"]}
|
||||
assert instance.has_config_drive is True
|
||||
assert instance.metadata == {"environment": "production"}
|
||||
assert instance.user_data == "#!/bin/bash\necho hello"
|
||||
assert instance.trusted_image_certificates == ["cert-123"]
|
||||
|
||||
def test_compute_service_inherits_from_base(self):
|
||||
"""Test Compute service inherits from OpenStackService."""
|
||||
@@ -180,3 +309,37 @@ class TestComputeService:
|
||||
assert hasattr(compute, "identity")
|
||||
assert hasattr(compute, "audit_config")
|
||||
assert hasattr(compute, "fixer_config")
|
||||
|
||||
def test_compute_list_instances_with_none_addresses(self):
|
||||
"""Test listing instances when addresses attribute is None."""
|
||||
provider = set_mocked_openstack_provider()
|
||||
|
||||
mock_server = MagicMock()
|
||||
mock_server.id = "instance-1"
|
||||
mock_server.name = "Instance With None Addresses"
|
||||
mock_server.status = "ACTIVE"
|
||||
mock_server.flavor = {"id": "flavor-1"}
|
||||
mock_server.security_groups = [{"name": "default"}]
|
||||
mock_server.is_locked = False
|
||||
mock_server.locked_reason = ""
|
||||
mock_server.key_name = "test-key"
|
||||
mock_server.user_id = "user-123"
|
||||
mock_server.access_ipv4 = ""
|
||||
mock_server.access_ipv6 = ""
|
||||
mock_server.public_v4 = ""
|
||||
mock_server.public_v6 = ""
|
||||
mock_server.private_v4 = ""
|
||||
mock_server.private_v6 = ""
|
||||
mock_server.addresses = None # This is the key test case
|
||||
mock_server.has_config_drive = False
|
||||
mock_server.metadata = {}
|
||||
mock_server.user_data = ""
|
||||
mock_server.trusted_image_certificates = []
|
||||
|
||||
provider.connection.compute.servers.return_value = [mock_server]
|
||||
|
||||
compute = Compute(provider)
|
||||
|
||||
assert len(compute.instances) == 1
|
||||
assert compute.instances[0].id == "instance-1"
|
||||
assert compute.instances[0].networks == {} # Should default to empty dict
|
||||
Reference in new issue
Block a user