def status(self): """Find the source's availability status.""" # Get the source billing_source, whether it's named bucket if self.source.billing_source.get('bucket'): source_billing_source = self.source.billing_source.get('bucket') elif self.source.billing_source.get('data_source'): source_billing_source = self.source.billing_source.get( 'data_source') else: source_billing_source = {} # Get the source authentication if self.source.authentication.get('resource_name'): source_authentication = self.source.authentication.get( 'resource_name') elif self.source.authentication.get('credentials'): source_authentication = self.source.authentication.get( 'credentials') else: source_authentication = {} provider = self.source.source_type interface = ProviderAccessor(provider) availability_status = interface.availability_status( source_authentication, source_billing_source) return availability_status
def test_availability_status_bad_provider(self): """Test availability_status for bad provider.""" provider_name = "BAD" interface = ProviderAccessor(provider_name) self.assertIsNone(interface.service) credential = "arn:aws:s3:::my_s3_bucket" source_name = "my_s3_bucket" error_msg = "Unknown source." status = interface.availability_status(credential, source_name) self.assertEquals(status.get("availability_status"), "unavailable") self.assertEquals(status.get("availability_status_error"), error_msg)
def test_availability_status(self): """Get availability_status for a provider.""" provider = Provider.PROVIDER_AWS interface = ProviderAccessor(provider) credential = "arn:aws:s3:::my_s3_bucket" source_name = "my_s3_bucket" with patch.object(AWSProvider, "cost_usage_source_is_reachable", return_value=True): status = interface.availability_status(credential, source_name) self.assertEquals(status.get("availability_status"), "available") self.assertEquals(status.get("availability_status_error"), "")
def test_availability_status(self): """Get availability_status for a provider.""" provider = 'AWS' interface = ProviderAccessor(provider) credential = 'arn:aws:s3:::my_s3_bucket' source_name = 'my_s3_bucket' with patch.object(AWSProvider, 'cost_usage_source_is_reachable', return_value=True): status = interface.availability_status(credential, source_name) self.assertEquals(status.get('availability_status'), 'available') self.assertEquals(status.get('availability_status_error'), '')
def source_status(request): """ Source availability status endpoint for Platform Sources to get cost management source status. Parameter: source_id corresponds to the table api_sources Returns: status (Dict): {'availability_status': 'unavailable/available', 'availability_status_error': ValidationError-detail} """ source_id = request.query_params.get('source_id', None) if source_id is None: return Response(data='Missing query parameter source_id', status=status.HTTP_400_BAD_REQUEST) try: int(source_id) except ValueError: # source_id must be an integer return Response(data='source_id must be an integer', status=status.HTTP_400_BAD_REQUEST) try: source = Sources.objects.get(source_id=source_id) except ObjectDoesNotExist: # Source isn't in our database, return 404. return Response(status=status.HTTP_404_NOT_FOUND) # Get the source billing_source, whether it's named bucket if source.billing_source.get('bucket'): source_billing_source = source.billing_source.get('bucket') elif source.billing_source.get('data_source'): source_billing_source = source.billing_source.get('data_source') else: source_billing_source = {} # Get the source authentication if source.authentication.get('resource_name'): source_authentication = source.authentication.get('resource_name') elif source.authentication.get('credentials'): source_authentication = source.authentication.get('credentials') else: source_authentication = {} provider = source.source_type interface = ProviderAccessor(provider) availability_status = interface.availability_status( source_authentication, source_billing_source) return Response(availability_status, status=status.HTTP_200_OK)
def test_availability_status_unavailable(self): """Get availability_status for a provider that is unavailable.""" def error_obj(key, message): """Create an error object.""" error = {key: [_(message)]} return error detail_msg = "Error Msg" mock_error = ValidationError(error_obj("err.key", detail_msg)) provider = Provider.PROVIDER_AWS interface = ProviderAccessor(provider) credential = "arn:aws:s3:::my_s3_bucket" source_name = "my_s3_bucket" with patch.object(AWSProvider, "cost_usage_source_is_reachable", side_effect=mock_error): status = interface.availability_status(credential, source_name) self.assertEquals(status.get("availability_status"), "unavailable") self.assertEquals(status.get("availability_status_error"), detail_msg)
def test_availability_status_unavailable(self): """Get availability_status for a provider that is unavailable.""" def error_obj(key, message): """Create an error object.""" error = {key: [_(message)]} return error detail_msg = 'Error Msg' mock_error = ValidationError(error_obj('err.key', detail_msg)) provider = 'AWS' interface = ProviderAccessor(provider) credential = 'arn:aws:s3:::my_s3_bucket' source_name = 'my_s3_bucket' with patch.object(AWSProvider, 'cost_usage_source_is_reachable', side_effect=mock_error): status = interface.availability_status(credential, source_name) self.assertEquals(status.get('availability_status'), 'unavailable') self.assertEquals(status.get('availability_status_error'), detail_msg)