def test_deny_delete_referred_component(self):

        hosts = ComponentFactory(name='Hosts', alias='hosts')

        database = ComponentFactory(name='Database', alias='database')

        update_settings(environment=self.base,
                        component=hosts,
                        data={'db': 'localhost'})

        update_settings(environment=self.base,
                        component=database,
                        data={
                            'host': '${hosts.db}',
                            'port': 3567,
                            'user': '******',
                            'password': '',
                            'database': ''
                        })

        with pytest.raises(ComponentDeleteError) as exc_info:
            delete_component(hosts)

        assert str(
            exc_info.value
        ) == 'Component `database` is referring to component `hosts.db` key(s).'
Beispiel #2
0
    def test_get_all_settings(self):

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': ''
                        })

        update_settings(environment=self.dev,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': '******'
                        })

        data = get_all_settings()

        assert data == {
            'base': {
                'db': {
                    'user': '******',
                    'pass': ''
                }
            },
            'dev': {
                'db': {
                    'user': '******',
                    'pass': '******'
                }
            }
        }
Beispiel #3
0
    def test_get_undefined_environment_settings(self):

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': ''
                        })

        data = get_settings(environment=self.dev, component=self.db)

        assert data == {'user': '******', 'pass': ''}
Beispiel #4
0
    def test_validate_settings_invalid_json_schema(self):

        self.db.require_schema = True
        self.db.schema = {
            '$schema': 'http://json-schema.org/draft-04/schema#',
            'type': 'object',
            'properties': {
                'host': {
                    'type': 'string'
                },
                'port': {
                    'type': 'integer'
                },
                'user': {
                    'type': 'string'
                },
                'password': {
                    'type': 'string'
                },
                'database': {
                    'type': 'string'
                }
            },
            'required': [
                'host',
                'port',
                'user',
                'password',
                'database',
            ]
        }
        self.db.save()

        update_settings(environment=self.base,
                        component=self.hosts,
                        data={'db': {
                            'host': 'mysql-db',
                            'port': '3567'
                        }})

        with pytest.raises(InvalidSettingsError) as exc_info:
            validate_settings(environment=self.base,
                              component=self.db,
                              data={
                                  'host': '${hosts.db.host}',
                                  'port': '${hosts.db.port}',
                                  'user': '******',
                                  'password': '',
                                  'database': ''
                              })

        assert exc_info.value.message == 'Invalid settings schema: \'3567\' is not of type \'integer\'.'
Beispiel #5
0
def component_alias_changed_handler(sender, component: Component,
                                    old_alias: str, **kwargs):

    for environment in Environment.objects.all():

        data_copy = copy.deepcopy(
            get_settings(
                environment=environment,
                component=old_alias,
            ))

        update_settings(environment=environment,
                        component=component,
                        data=data_copy,
                        validate=False)
    def test_delete_component(self):

        hosts = ComponentFactory(name='Hosts', alias='hosts')

        update_settings(environment=self.base,
                        component=hosts,
                        data={'db': 'localhost'})

        assert Config.objects.filter(environment=self.base.alias,
                                     component=hosts.alias).exists()

        delete_component(hosts)

        assert not Config.objects.filter(environment=self.base,
                                         component=hosts).exists()
Beispiel #7
0
    def test_get_missing_fallback_environment_settings(self):

        staging = EnvironmentFactory(alias='stag',
                                     name='Staging',
                                     fallback=self.dev)

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'host': 'localhost',
                            'port': 3452
                        })

        data = get_settings(environment=staging, component=self.db)

        assert data == {'host': 'localhost', 'port': 3452}
Beispiel #8
0
    def test_validate_settings_invalid_key_reference(self):

        update_settings(environment=self.base,
                        component=self.hosts,
                        data={'db': 'localhost'})

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'host': '${hosts.db}',
                            'port': 3567,
                            'user': '******',
                            'password': '',
                            'database': ''
                        })

        with pytest.raises(InvalidSettingsError) as exc_info:
            validate_settings(environment=self.base,
                              component=self.hosts,
                              data={'db1': 'mysql-base'})

        assert exc_info.value.message == 'Component `db` refers to changed key `hosts.db`.'
Beispiel #9
0
    def test_get_inject_settings_keys(self):

        update_settings(environment=self.base,
                        component=self.users,
                        data={'db': 'admin'})

        update_settings(environment=self.base,
                        component=self.hosts,
                        data={'db': 'test-db.hostname.com'})

        update_settings(environment=self.base,
                        component=self.credentials,
                        data={
                            'username': '******',
                            'password': '******'
                        })

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'host': '${hosts.db}',
                            'port': 3567,
                            'user': '******',
                            'pass': '******'
                        })

        inject_keys = get_settings_inject_keys(environment=self.base)

        assert inject_keys == {
            'credentials': {'users.db'},
            'db': {'hosts.db', 'credentials.password', 'credentials.username'}
        }

        inject_keys = get_settings_inject_keys(
            environment=self.base,
            override_settings={
                self.db.alias: {
                    'host': 'localhost',
                    'port': 3567,
                    'user': '******',
                    'pass': '******'
                }
            })

        assert inject_keys == {
            'credentials': {'users.db'},
            'db': {'credentials.password', 'credentials.username'}
        }
Beispiel #10
0
    def test_validate_settings_invalid_remove_key(self):

        self.db.require_schema = False
        self.db.strict_keys = True
        self.db.save()

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'host': 'localhost',
                            'port': 3567,
                        })

        with pytest.raises(InvalidSettingsError) as exc_info:
            validate_settings(environment=self.dev,
                              component=self.db,
                              data={
                                  'host': 'mysql-dev',
                              })

        assert exc_info.value.message == (
            'Cannot remove keys from environment configuration. Removed key(s): <b>port</b>.'
        )
Beispiel #11
0
    def test_validate_settings_invalid_add_key(self):

        self.db.require_schema = False
        self.db.strict_keys = True
        self.db.save()

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'host': 'localhost',
                            'port': 3567,
                        })

        with pytest.raises(InvalidSettingsError) as exc_info:
            validate_settings(environment=self.dev,
                              component=self.db,
                              data={
                                  'host': 'mysql-dev',
                                  'port': 3567,
                                  'test': '123123'
                              })

        assert exc_info.value.message == 'Cannot add new keys to environment configuration. New key(s): <b>test</b>.'
Beispiel #12
0
    def test_get_component_settings(self):

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': ''
                        })

        update_settings(environment=self.dev,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': '******'
                        })

        data = get_settings(environment=self.base, component=self.db)

        assert data == {'user': '******', 'pass': ''}

        data = get_settings(environment=self.dev, component=self.db)

        assert data == {'user': '******', 'pass': '******'}
Beispiel #13
0
    def form_valid(self, form):

        component: Component = self.object

        old_settings = get_settings(
            environment=self.environment,
            component=component,
        )

        new_settings = form.cleaned_data['settings']

        # Update store settings
        update_settings(
            environment=self.environment,
            component=component,
            data=new_settings,
            validate=False
        )

        # Notify about updated component settings
        settings_updated.send(
            sender=Component,
            component=component,
            environment=self.environment,
            old_settings=old_settings,
            new_settings=new_settings,
            user=self.request.user
        )

        messages.success(
            self.request,
            _("Component %(component)s settings successfully updated.") % {
                'component': component.name
            }
        )

        return HttpResponseRedirect(self.success_url)
Beispiel #14
0
    def test_inject_settings_params(self):

        update_settings(environment=self.base,
                        component=self.users,
                        data={'db': 'admin'})

        update_settings(environment=self.base,
                        component=self.hosts,
                        data={'db': 'test-db.hostname.com'})

        update_settings(environment=self.base,
                        component=self.credentials,
                        data={
                            'username': '******',
                            'password': '******'
                        })

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'host': '${hosts.db}',
                            'port': 3567,
                            'user': '******',
                            'pass': '******'
                        })

        data = inject_settings(environment=self.base,
                               data=get_settings(environment=self.base,
                                                 component=self.db))

        assert data == {
            'host': 'test-db.hostname.com',
            'port': 3567,
            'user': '******',
            'pass': '******'
        }
Beispiel #15
0
    def test_create_and_load_backup(self):

        base = EnvironmentFactory(name='Base', alias='base')
        development = EnvironmentFactory(name='Development',
                                         alias='development')

        hosts = ComponentFactory(name='Hosts', alias='hosts')
        database = ComponentFactory(name='Database', alias='database')

        update_settings(environment=base,
                        component=hosts,
                        data={
                            'a': '1',
                            'b': '2',
                            'c': '3',
                        })

        update_settings(environment=development,
                        component=hosts,
                        data={
                            'a': '1!',
                            'b': '2!',
                            'c': '3!',
                        })

        update_settings(environment=base,
                        component=database,
                        data={
                            'user': '******',
                            'pass': '',
                            'host': 'mysql-base',
                        })

        update_settings(environment=development,
                        component=database,
                        data={
                            'user': '******',
                            'pass': '******',
                            'host': 'mysql-dev',
                        })

        backup = create_backup(comment='Test')

        # Delete all
        Environment.objects.all().delete()
        Component.objects.all().delete()
        Config.objects.all().delete()

        load_backup(backup)

        assert Environment.objects.filter(alias='base').exists()
        assert Environment.objects.filter(alias='development').exists()
        assert Component.objects.filter(alias='hosts').exists()
        assert Component.objects.filter(alias='database').exists()

        base_hosts_data = get_settings(environment=base, component=hosts)

        assert base_hosts_data == {
            'a': '1',
            'b': '2',
            'c': '3',
        }

        development_hosts_data = get_settings(environment=development,
                                              component=hosts)

        assert development_hosts_data == {
            'a': '1!',
            'b': '2!',
            'c': '3!',
        }

        base_database_data = get_settings(environment=base, component=database)

        assert base_database_data == {
            'user': '******',
            'pass': '',
            'host': 'mysql-base',
        }

        development_database_data = get_settings(environment=development,
                                                 component=database)

        assert development_database_data == {
            'user': '******',
            'pass': '******',
            'host': 'mysql-dev',
        }
Beispiel #16
0
    def test_get_env_settings(self):

        #########################
        # Base settings
        #########################
        update_settings(environment=self.base,
                        component=self.hosts,
                        data={
                            'db': 'localhost:5671',
                        })

        update_settings(environment=self.base,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': ''
                        })

        #########################
        # Dev settings
        #########################
        update_settings(environment=self.dev,
                        component=self.hosts,
                        data={
                            'db': 'dev.hostname.com:5671',
                        })

        update_settings(environment=self.dev,
                        component=self.db,
                        data={
                            'user': '******',
                            'pass': '******'
                        })

        data = get_environment_settings(self.dev)

        assert data == {
            'users': {},
            'hosts': {
                'db': 'dev.hostname.com:5671',
            },
            'credentials': {},
            'redis': {},
            'db': {
                'user': '******',
                'pass': '******'
            },
        }

        data = get_environment_settings(self.dev,
                                        components=[self.hosts, self.db])

        assert data == {
            'hosts': {
                'db': 'dev.hostname.com:5671',
            },
            'db': {
                'user': '******',
                'pass': '******'
            }
        }