From 11a0477dbbd6e9677e69f6290ca6caedd744eb36 Mon Sep 17 00:00:00 2001 From: Shreya Date: Wed, 10 Feb 2021 16:15:17 +0530 Subject: [PATCH] Rename test functions, add 404 response tests, and other tiny changes --- monkey/common/cloud/aws/aws_instance.py | 3 +- monkey/common/cloud/aws/test_aws_instance.py | 150 +++++++++++------- monkey/common/cloud/azure/azure_instance.py | 2 +- .../common/cloud/azure/test_azure_instance.py | 20 +++ monkey/common/cloud/gcp/test_gcp_instance.py | 14 ++ 5 files changed, 132 insertions(+), 57 deletions(-) diff --git a/monkey/common/cloud/aws/aws_instance.py b/monkey/common/cloud/aws/aws_instance.py index f667f3fb2..75dee4ce9 100644 --- a/monkey/common/cloud/aws/aws_instance.py +++ b/monkey/common/cloud/aws/aws_instance.py @@ -32,7 +32,8 @@ class AwsInstance(CloudInstance): self.account_id = None try: - self.instance_id = requests.get(AWS_LATEST_METADATA_URI_PREFIX + 'meta-data/instance-id', timeout=2).text + response = requests.get(AWS_LATEST_METADATA_URI_PREFIX + 'meta-data/instance-id', timeout=2) + self.instance_id = response.text if response else None self.region = self._parse_region( requests.get(AWS_LATEST_METADATA_URI_PREFIX + 'meta-data/placement/availability-zone').text) except (requests.RequestException, IOError) as e: diff --git a/monkey/common/cloud/aws/test_aws_instance.py b/monkey/common/cloud/aws/test_aws_instance.py index d458e11a8..0353a0b9f 100644 --- a/monkey/common/cloud/aws/test_aws_instance.py +++ b/monkey/common/cloud/aws/test_aws_instance.py @@ -98,63 +98,63 @@ def test_get_account_id_good_data(good_data_mock_instance): # 'region' bad data @pytest.fixture -def bad_data_mock_instance_1(): +def bad_region_data_mock_instance(): return get_test_aws_instance(text={'instance_id': INSTANCE_ID_RESPONSE, 'region': 'in-a-different-world', 'account_id': INSTANCE_IDENTITY_DOCUMENT_RESPONSE}) -def test_is_instance_bad_data_1(bad_data_mock_instance_1): - assert bad_data_mock_instance_1.is_instance() +def test_is_instance_bad_region_data(bad_region_data_mock_instance): + assert bad_region_data_mock_instance.is_instance() -def test_get_cloud_provider_name_bad_data_1(bad_data_mock_instance_1): - assert bad_data_mock_instance_1.get_cloud_provider_name() == Environment.AWS +def test_get_cloud_provider_name_bad_region_data(bad_region_data_mock_instance): + assert bad_region_data_mock_instance.get_cloud_provider_name() == Environment.AWS -def test_get_instance_id_bad_data_1(bad_data_mock_instance_1): - assert bad_data_mock_instance_1.get_instance_id() == EXPECTED_INSTANCE_ID +def test_get_instance_id_bad_region_data(bad_region_data_mock_instance): + assert bad_region_data_mock_instance.get_instance_id() == EXPECTED_INSTANCE_ID -def test_get_region_bad_data_1(bad_data_mock_instance_1): - assert bad_data_mock_instance_1.get_region() is None +def test_get_region_bad_region_data(bad_region_data_mock_instance): + assert bad_region_data_mock_instance.get_region() is None -def test_get_account_id_bad_data_1(bad_data_mock_instance_1): - assert bad_data_mock_instance_1.get_account_id() == EXPECTED_ACCOUNT_ID +def test_get_account_id_bad_region_data(bad_region_data_mock_instance): + assert bad_region_data_mock_instance.get_account_id() == EXPECTED_ACCOUNT_ID # 'account_id' bad data @pytest.fixture -def bad_data_mock_instance_2(): +def bad_account_id_data_mock_instance(): return get_test_aws_instance(text={'instance_id': INSTANCE_ID_RESPONSE, 'region': AVAILABILITY_ZONE_RESPONSE, 'account_id': 'who-am-i'}) -def test_is_instance_bad_data_2(bad_data_mock_instance_2): - assert bad_data_mock_instance_2.is_instance() +def test_is_instance_bad_account_id_data(bad_account_id_data_mock_instance): + assert bad_account_id_data_mock_instance.is_instance() -def test_get_cloud_provider_name_bad_data_2(bad_data_mock_instance_2): - assert bad_data_mock_instance_2.get_cloud_provider_name() == Environment.AWS +def test_get_cloud_provider_name_bad_account_id_data(bad_account_id_data_mock_instance): + assert bad_account_id_data_mock_instance.get_cloud_provider_name() == Environment.AWS -def test_get_instance_id_bad_data_2(bad_data_mock_instance_2): - assert bad_data_mock_instance_2.get_instance_id() == EXPECTED_INSTANCE_ID +def test_get_instance_id_bad_account_id_data(bad_account_id_data_mock_instance): + assert bad_account_id_data_mock_instance.get_instance_id() == EXPECTED_INSTANCE_ID -def test_get_region_bad_data_2(bad_data_mock_instance_2): - assert bad_data_mock_instance_2.get_region() == EXPECTED_REGION +def test_get_region_bad_account_id_data(bad_account_id_data_mock_instance): + assert bad_account_id_data_mock_instance.get_region() == EXPECTED_REGION -def test_get_account_id_bad_data_2(bad_data_mock_instance_2): - assert bad_data_mock_instance_2.get_account_id() is None +def test_get_account_id_data_bad_account_id_data(bad_account_id_data_mock_instance): + assert bad_account_id_data_mock_instance.get_account_id() is None # 'instance_id' bad requests @pytest.fixture -def bad_request_mock_instance_1(instance_id_exception): +def bad_instance_id_request_mock_instance(instance_id_exception): return get_test_aws_instance(text={'instance_id': None, 'region': AVAILABILITY_ZONE_RESPONSE, 'account_id': INSTANCE_IDENTITY_DOCUMENT_RESPONSE}, @@ -164,33 +164,33 @@ def bad_request_mock_instance_1(instance_id_exception): @pytest.mark.parametrize('instance_id_exception', [requests.RequestException, IOError]) -def test_is_instance_bad_request_1(bad_request_mock_instance_1): - assert bad_request_mock_instance_1.is_instance() is False +def test_is_instance_bad_instance_id_request(bad_instance_id_request_mock_instance): + assert bad_instance_id_request_mock_instance.is_instance() is False @pytest.mark.parametrize('instance_id_exception', [requests.RequestException, IOError]) -def test_get_cloud_provider_name_bad_request_1(bad_request_mock_instance_1): - assert bad_request_mock_instance_1.get_cloud_provider_name() == Environment.AWS +def test_get_cloud_provider_name_bad_instance_id_request(bad_instance_id_request_mock_instance): + assert bad_instance_id_request_mock_instance.get_cloud_provider_name() == Environment.AWS @pytest.mark.parametrize('instance_id_exception', [requests.RequestException, IOError]) -def test_get_instance_id_bad_request_1(bad_request_mock_instance_1): - assert bad_request_mock_instance_1.get_instance_id() is None +def test_get_instance_id_bad_instance_id_request(bad_instance_id_request_mock_instance): + assert bad_instance_id_request_mock_instance.get_instance_id() is None @pytest.mark.parametrize('instance_id_exception', [requests.RequestException, IOError]) -def test_get_region_bad_request_1(bad_request_mock_instance_1): - assert bad_request_mock_instance_1.get_region() is None +def test_get_region_bad_instance_id_request(bad_instance_id_request_mock_instance): + assert bad_instance_id_request_mock_instance.get_region() is None @pytest.mark.parametrize('instance_id_exception', [requests.RequestException, IOError]) -def test_get_account_id_bad_request_1(bad_request_mock_instance_1): - assert bad_request_mock_instance_1.get_account_id() == EXPECTED_ACCOUNT_ID +def test_get_account_id_bad_instance_id_request(bad_instance_id_request_mock_instance): + assert bad_instance_id_request_mock_instance.get_account_id() == EXPECTED_ACCOUNT_ID # 'region' bad requests @pytest.fixture -def bad_request_mock_instance_2(region_exception): +def bad_region_request_mock_instance(region_exception): return get_test_aws_instance(text={'instance_id': INSTANCE_ID_RESPONSE, 'region': None, 'account_id': INSTANCE_IDENTITY_DOCUMENT_RESPONSE}, @@ -200,33 +200,33 @@ def bad_request_mock_instance_2(region_exception): @pytest.mark.parametrize('region_exception', [requests.RequestException, IOError]) -def test_is_instance_bad_request_2(bad_request_mock_instance_2): - assert bad_request_mock_instance_2.is_instance() +def test_is_instance_bad_region_request(bad_region_request_mock_instance): + assert bad_region_request_mock_instance.is_instance() @pytest.mark.parametrize('region_exception', [requests.RequestException, IOError]) -def test_get_cloud_provider_name_bad_request_2(bad_request_mock_instance_2): - assert bad_request_mock_instance_2.get_cloud_provider_name() == Environment.AWS +def test_get_cloud_provider_name_bad_region_request(bad_region_request_mock_instance): + assert bad_region_request_mock_instance.get_cloud_provider_name() == Environment.AWS @pytest.mark.parametrize('region_exception', [requests.RequestException, IOError]) -def test_get_instance_id_bad_request_2(bad_request_mock_instance_2): - assert bad_request_mock_instance_2.get_instance_id() == EXPECTED_INSTANCE_ID +def test_get_instance_id_bad_region_request(bad_region_request_mock_instance): + assert bad_region_request_mock_instance.get_instance_id() == EXPECTED_INSTANCE_ID @pytest.mark.parametrize('region_exception', [requests.RequestException, IOError]) -def test_get_region_bad_request_2(bad_request_mock_instance_2): - assert bad_request_mock_instance_2.get_region() is None +def test_get_region_bad_region_request(bad_region_request_mock_instance): + assert bad_region_request_mock_instance.get_region() is None @pytest.mark.parametrize('region_exception', [requests.RequestException, IOError]) -def test_get_account_id_bad_request_2(bad_request_mock_instance_2): - assert bad_request_mock_instance_2.get_account_id() == EXPECTED_ACCOUNT_ID +def test_get_account_id_bad_region_request(bad_region_request_mock_instance): + assert bad_region_request_mock_instance.get_account_id() == EXPECTED_ACCOUNT_ID # 'account_id' bad requests @pytest.fixture -def bad_request_mock_instance_3(account_id_exception): +def bad_account_id_request_mock_instance(account_id_exception): return get_test_aws_instance(text={'instance_id': INSTANCE_ID_RESPONSE, 'region': AVAILABILITY_ZONE_RESPONSE, 'account_id': None}, @@ -236,25 +236,65 @@ def bad_request_mock_instance_3(account_id_exception): @pytest.mark.parametrize('account_id_exception', [requests.RequestException, IOError]) -def test_is_instance_bad_request_3(bad_request_mock_instance_3): - assert bad_request_mock_instance_3.is_instance() +def test_is_instance_bad_account_id_request(bad_account_id_request_mock_instance): + assert bad_account_id_request_mock_instance.is_instance() @pytest.mark.parametrize('account_id_exception', [requests.RequestException, IOError]) -def test_get_cloud_provider_name_bad_request_3(bad_request_mock_instance_3): - assert bad_request_mock_instance_3.get_cloud_provider_name() == Environment.AWS +def test_get_cloud_provider_name_bad_account_id_request(bad_account_id_request_mock_instance): + assert bad_account_id_request_mock_instance.get_cloud_provider_name() == Environment.AWS @pytest.mark.parametrize('account_id_exception', [requests.RequestException, IOError]) -def test_get_instance_id_bad_request_3(bad_request_mock_instance_3): - assert bad_request_mock_instance_3.get_instance_id() == EXPECTED_INSTANCE_ID +def test_get_instance_id_bad_account_id_request(bad_account_id_request_mock_instance): + assert bad_account_id_request_mock_instance.get_instance_id() == EXPECTED_INSTANCE_ID @pytest.mark.parametrize('account_id_exception', [requests.RequestException, IOError]) -def test_get_region_bad_request_3(bad_request_mock_instance_3): - assert bad_request_mock_instance_3.get_region() == EXPECTED_REGION +def test_get_region_bad_account_id_request(bad_account_id_request_mock_instance): + assert bad_account_id_request_mock_instance.get_region() == EXPECTED_REGION @pytest.mark.parametrize('account_id_exception', [requests.RequestException, IOError]) -def test_get_account_id_bad_request_3(bad_request_mock_instance_3): - assert bad_request_mock_instance_3.get_account_id() is None +def test_get_account_id_bad_account_id_request(bad_account_id_request_mock_instance): + assert bad_account_id_request_mock_instance.get_account_id() is None + + +# not found request +@pytest.fixture +def not_found_request_mock_instance(): + with requests_mock.Mocker() as m: + # request made to get instance_id + url = f'{AWS_LATEST_METADATA_URI_PREFIX}meta-data/instance-id' + m.get(url, status_code=404) + + # request made to get region + url = f'{AWS_LATEST_METADATA_URI_PREFIX}meta-data/placement/availability-zone' + m.get(url) + + # request made to get account_id + url = f'{AWS_LATEST_METADATA_URI_PREFIX}dynamic/instance-identity/document' + m.get(url) + + not_found_aws_instance_object = AwsInstance() + return not_found_aws_instance_object + + +def test_is_instance_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.is_instance() is False + + +def test_get_cloud_provider_name_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.get_cloud_provider_name() == Environment.AWS + + +def test_get_instance_id_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.get_instance_id() is None + + +def test_get_region_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.get_region() is None + + +def test_get_account_id_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.get_account_id() is None diff --git a/monkey/common/cloud/azure/azure_instance.py b/monkey/common/cloud/azure/azure_instance.py index 79e6b24da..969e4a8ca 100644 --- a/monkey/common/cloud/azure/azure_instance.py +++ b/monkey/common/cloud/azure/azure_instance.py @@ -44,7 +44,7 @@ class AzureInstance(CloudInstance): logger.debug("Trying to parse Azure metadata.") self.try_parse_response(response) else: - logger.warning(f"On Azure, but metadata response not ok: {response.status_code}") + logger.warning(f"Metadata response not ok: {response.status_code}") except requests.RequestException: logger.debug("Failed to get response from Azure metadata service: This instance is not on Azure.") diff --git a/monkey/common/cloud/azure/test_azure_instance.py b/monkey/common/cloud/azure/test_azure_instance.py index 0894205c1..680af90ed 100644 --- a/monkey/common/cloud/azure/test_azure_instance.py +++ b/monkey/common/cloud/azure/test_azure_instance.py @@ -177,3 +177,23 @@ def test_instance_attributes_bad_request(bad_request_mock_instance): assert bad_request_mock_instance.instance_name is None assert bad_request_mock_instance.instance_id is None assert bad_request_mock_instance.location is None + + +# not found request +@pytest.fixture +def not_found_request_mock_instance(): + return get_test_azure_instance(AZURE_METADATA_SERVICE_URL, status_code=404) + + +def test_is_instance_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.is_instance() is False + + +def test_get_cloud_provider_name_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.get_cloud_provider_name() == Environment.AZURE + + +def test_instance_attributes_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.instance_name is None + assert not_found_request_mock_instance.instance_id is None + assert not_found_request_mock_instance.location is None diff --git a/monkey/common/cloud/gcp/test_gcp_instance.py b/monkey/common/cloud/gcp/test_gcp_instance.py index 46620f339..9170b81c5 100644 --- a/monkey/common/cloud/gcp/test_gcp_instance.py +++ b/monkey/common/cloud/gcp/test_gcp_instance.py @@ -39,3 +39,17 @@ def test_is_instance_bad_request(bad_request_mock_instance): def test_get_cloud_provider_name_bad_request(bad_request_mock_instance): assert bad_request_mock_instance.get_cloud_provider_name() == Environment.GCP + + +# not found request +@pytest.fixture +def not_found_request_mock_instance(): + return get_test_gcp_instance(GCP_METADATA_SERVICE_URL, status_code=404) + + +def test_is_instance_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.is_instance() is False + + +def test_get_cloud_provider_name_not_found_request(not_found_request_mock_instance): + assert not_found_request_mock_instance.get_cloud_provider_name() == Environment.GCP