Example #1
0
    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
Example #2
0
    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)
Example #3
0
    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"), "")
Example #4
0
    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'), '')
Example #5
0
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)
Example #6
0
    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)
Example #7
0
    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)