def test_get_provider_from_provider_name_import(settings):
    with mock.patch.dict(settings.ADDON_PROVIDERS,
                         {'test_provider': {
                             'CLASS': 'doesnotexist'
                         }}):
        with pytest.raises(AddonProviderImportError):
            get_provider_from_provider_name('test_provider')
def test_get_provider_from_provider_name_import(settings):
    with mock.patch.dict(settings.ADDON_PROVIDERS, {
        'test_provider': {
            'CLASS': 'doesnotexist'
        }
    }):
        with pytest.raises(AddonProviderImportError):
            get_provider_from_provider_name('test_provider')
Example #3
0
def deprovision(addon_id):
    """A task that kicks off the deprovision process
    """
    logger = logging.getLogger(__name__)
    try:
        addon = Addon.objects.get(pk=addon_id)
    except Addon.DoesNotExist:
        logger.exception('Addon with ID {} does not exist.'.format(addon_id))
        raise

    manager = StateMachineManager()
    try:
        provider = get_provider_from_provider_name(addon.provider_name)
    except AddonProviderError:
        logger.exception('Addon ID {addon_id}: Could not get provider for {name}.'.format(
            addon_id=addon_id,
            name=addon.provider_name,
        ))
        # transition so this task doesn't get restarted needlessly
        with manager.transition(addon_id, AddonEvent.deprovision_failure):
            pass
        raise

    try:
        provider.deprovision(addon.provider_uuid)
    except AddonProviderError:
        # TODO retry?
        with manager.transition(addon_id, AddonEvent.deprovision_failure):
            pass
        return addon_id
    with manager.transition(addon_id, AddonEvent.deprovision_success):
        pass
    return addon_id
Example #4
0
def check_provision(self, addon_id):
    """A task that checks if provision is complete
    """
    logger = logging.getLogger(__name__)
    try:
        addon = Addon.objects.get(pk=addon_id)
    except Addon.DoesNotExist:
        logger.exception('Addon with ID {} does not exist.'.format(addon_id))
        raise
    if addon.state is not AddonState.waiting_for_provision:
        logger.warning('Addon ID {addon_id}: State {state} is invalid for check_provision task.'.format(
            addon_id=addon_id,
            state=addon.state,
        ))
        return addon_id
    manager = StateMachineManager()
    try:
        provider = get_provider_from_provider_name(addon.provider_name)
    except AddonProviderError:
        logger.exception('Addon ID {addon_id}: Could not get provider for {name}.'.format(
            addon_id=addon_id,
            name=addon.provider_name,
        ))
        # transition so this task doesn't get restarted needlessly
        with manager.transition(addon_id, AddonEvent.provision_failure):
            pass
        raise

    # check if provision is done
    try:
        ready, delay = provider.provision_complete(addon.provider_uuid)
    except AddonProviderError:
        with manager.transition(addon_id, AddonEvent.provision_failure):
            pass
        return addon_id
    if not ready:
        raise self.retry(countdown=delay)

    # provision is done, store result
    try:
        result = provider.get_config(
            addon.provider_uuid, config_customization=addon.config_customization)
    except AddonProviderError:
        with manager.transition(addon_id, AddonEvent.provision_failure):
            pass
        return addon_id

    if 'config' not in result or not _valid_config(result['config']):
        with manager.transition(addon_id, AddonEvent.provision_failure):
            pass
    else:
        with manager.transition(addon_id, AddonEvent.provision_success) as addon:
            addon.config = result['config']
    return addon_id
def test_get_provider_from_provider_name_config_type(settings):
    with mock.patch.dict(
            settings.ADDON_PROVIDERS,
        {
            'test_provider': {
                'CLASS':
                'api_server.addons.providers.base_provider.BaseAddonProvider',
                'ARGS': [1],
            }
        }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')

    with mock.patch.dict(
            settings.ADDON_PROVIDERS,
        {
            'test_provider': {
                'CLASS':
                'api_server.addons.providers.base_provider.BaseAddonProvider',
                'ARGS': 1
            }
        }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')

    with mock.patch.dict(
            settings.ADDON_PROVIDERS,
        {
            'test_provider': {
                'CLASS':
                'api_server.addons.providers.base_provider.BaseAddonProvider',
                'KWARGS': {
                    'test': '123'
                }
            }
        }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')

    with mock.patch.dict(
            settings.ADDON_PROVIDERS,
        {
            'test_provider': {
                'CLASS':
                'api_server.addons.providers.base_provider.BaseAddonProvider',
                'KWARGS': 1
            }
        }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')
Example #6
0
    def post(self, request, app_id):
        """Add a new addon for this application.

        The body of the request should be a JSON with the following format:
        {
            'provider_name': 'provider_name',
            'config_customization': 'optional, either a string or None'
        }

        Returns a JSON with the following format:
        {
            'message': 'message to be displayed to user',
            'addon': {
                (the addon object)
            }
        }

        :param django.http.HttpRequest request: the request object

        :rtype: django.http.HttpResponse
        """
        app = App.objects.get(app_id=app_id)  # make sure app exists first
        data = json.loads(request.body)
        provider_name = data['provider_name']
        provider = get_provider_from_provider_name(provider_name)

        config_customization = data.get('config_customization', None)
        if config_customization is not None and not _value_regexp.match(
                config_customization):
            raise ErrorResponse(
                message=
                'The customization string {} is invalid. Valid characters are {}.'
                .format(config_customization, _valid_chars),
                status=400)
        if config_customization is not None:
            config_customization = config_customization.upper()

        result = provider.begin_provision(app_id)
        addon = Addon.objects.create(
            provider_name=provider_name,
            provider_uuid=result['uuid'],
            app=app,
            state=AddonState.waiting_for_provision,
            user=request.user,
            config_customization=config_customization,
        )
        manager = StateMachineManager()
        manager.start_task(addon.id)
        return self.respond({
            'message': result['message'],
            'addon': addon.to_dict()
        })
    def delete(self, request, app_id, addon_name):
        """Return all the addons installed for this application.

        :param django.http.HttpRequest request: the request object
        :param str app_id: the ID of the app

        :rtype: django.http.HttpResponse
        """
        addon = Addon.objects.get(app__app_id=app_id, display_name=addon_name)
        provider = get_provider_from_provider_name(addon.provider_name)
        result = provider.deprovision(addon.provider_uuid)
        manager = StateMachineManager()
        with manager.transition(addon.id, AddonEvent.deprovision_success):
            pass
        manager.start_task(addon.id)
        return self.respond({'message': result['message']})
Example #8
0
    def post(self, request, app_id):
        """Add a new addon for this application.

        The body of the request should be a JSON with the following format:
        {
            'provider_name': 'provider_name',
            'config_customization': 'optional, either a string or None'
        }

        Returns a JSON with the following format:
        {
            'message': 'message to be displayed to user',
            'addon': {
                (the addon object)
            }
        }

        :param django.http.HttpRequest request: the request object

        :rtype: django.http.HttpResponse
        """
        app = App.objects.get(app_id=app_id)  # make sure app exists first
        data = json.loads(request.body)
        provider_name = data['provider_name']
        provider = get_provider_from_provider_name(provider_name)

        config_customization = data.get('config_customization', None)
        if config_customization is not None and not _value_regexp.match(config_customization):
            raise ErrorResponse(message='The customization string {} is invalid. Valid characters are {}.'.format(config_customization, _valid_chars), status=400)
        if config_customization is not None:
            config_customization = config_customization.upper()

        result = provider.begin_provision(app_id)
        addon = Addon.objects.create(
            provider_name=provider_name,
            provider_uuid=result['uuid'],
            app=app,
            state=AddonState.waiting_for_provision,
            user=request.user,
            config_customization=config_customization,
        )
        manager = StateMachineManager()
        manager.start_task(addon.id)
        return self.respond({'message': result['message'], 'addon': addon.to_dict()})
def test_get_provider_from_provider_name_config_type(settings):
    with mock.patch.dict(settings.ADDON_PROVIDERS, {
        'test_provider': {
            'CLASS': 'api_server.addons.providers.base_provider.BaseAddonProvider',
            'ARGS': [1],
        }
    }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')

    with mock.patch.dict(settings.ADDON_PROVIDERS, {
        'test_provider': {
            'CLASS': 'api_server.addons.providers.base_provider.BaseAddonProvider',
            'ARGS': 1
        }
    }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')

    with mock.patch.dict(settings.ADDON_PROVIDERS, {
        'test_provider': {
            'CLASS': 'api_server.addons.providers.base_provider.BaseAddonProvider',
            'KWARGS': {'test': '123'}
        }
    }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')

    with mock.patch.dict(settings.ADDON_PROVIDERS, {
        'test_provider': {
            'CLASS': 'api_server.addons.providers.base_provider.BaseAddonProvider',
            'KWARGS': 1
        }
    }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')
def test_get_provider_from_provider_name_config_missing(settings):
    with mock.patch.dict(settings.ADDON_PROVIDERS, {
        'test_provider': {}
    }):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')
def test_get_provider_from_provider_name_missing():
    with pytest.raises(AddonProviderMissingError):
        get_provider_from_provider_name('doesnotexist')
def test_get_provider_from_provider_name_simple():
    p = get_provider_from_provider_name('test_provider')
    assert type(p) == BaseAddonProvider
def test_get_provider_from_provider_name_config_missing(settings):
    with mock.patch.dict(settings.ADDON_PROVIDERS, {'test_provider': {}}):
        with pytest.raises(AddonProviderConfigError):
            get_provider_from_provider_name('test_provider')
def test_get_provider_from_provider_name_missing():
    with pytest.raises(AddonProviderMissingError):
        get_provider_from_provider_name('doesnotexist')
def test_get_provider_from_provider_name_simple():
    p = get_provider_from_provider_name('test_provider')
    assert type(p) == BaseAddonProvider