def _do_update(self, environment_id, levels,
                   resource_id_or_name, operation, storage_name):

        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(
            resource_id_or_name, environment_id)

        res_values = library.get_resource_values(environment, levels, res_def)
        result = self.perform_operation(
            operation, getattr(res_values, storage_name), flask.request.json)
        setattr(res_values, storage_name, result)
Пример #2
0
    def _do_update(self, environment_id, levels,
                   resource_id_or_name, operation, storage_name):

        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(
            resource_id_or_name, environment_id)

        res_values = library.get_resource_values(environment, levels, res_def)
        result = self.perform_operation(
            operation, getattr(res_values, storage_name), flask.request.json)
        setattr(res_values, storage_name, result)
Пример #3
0
    def test_get_resource_definition(self):
        self._fixture()
        res_name = 'resdef1'
        res_id = 5
        environment_id = 9
        component_id = 7

        # Creating resource definition with the same name in another
        # environment
        self.add_res_def_to_another_env(res_name)
        res = self.client.get('/resource_definitions')
        self.assertEqual(200, res.status_code)
        self.assertTrue(
            all(res_def['name'] == res_name for res_def in res.json))

        with self.app.app_context():
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, res_id, None)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, res_name, None)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, '',
                              environment_id)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, None, None)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, None,
                              environment_id)

            actual_res = library.get_resource_definition(
                res_id, environment_id)
            self.assertEqual(res_id, actual_res.id)
            self.assertEqual(res_name, actual_res.name)
            self.assertEqual(component_id, actual_res.component_id)

            actual_res = library.get_resource_definition(
                res_id, environment_id)
            self.assertEqual(res_id, actual_res.id)
            self.assertEqual(res_name, actual_res.name)
            self.assertEqual(component_id, actual_res.component_id)
Пример #4
0
    def test_get_resource_definition(self):
        self._fixture()
        res_name = 'resdef1'
        res_id = 5
        environment_id = 9
        component_id = 7

        # Creating resource definition with the same name in another
        # environment
        self.add_res_def_to_another_env(res_name)
        res = self.client.get('/resource_definitions')
        self.assertEqual(200, res.status_code)
        self.assertTrue(all(res_def['name'] == res_name
                            for res_def in res.json))

        with self.app.app_context():
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, res_id, None)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, res_name, None)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, '',
                              environment_id)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, None, None)
            self.assertRaises(errors.TuningboxNotFound,
                              library.get_resource_definition, None,
                              environment_id)

            actual_res = library.get_resource_definition(res_id,
                                                         environment_id)
            self.assertEqual(res_id, actual_res.id)
            self.assertEqual(res_name, actual_res.name)
            self.assertEqual(component_id, actual_res.component_id)

            actual_res = library.get_resource_definition(res_id,
                                                         environment_id)
            self.assertEqual(res_id, actual_res.id)
            self.assertEqual(res_name, actual_res.name)
            self.assertEqual(component_id, actual_res.component_id)
Пример #5
0
    def put(self, environment_id, levels, resource_id_or_name):
        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(
            resource_id_or_name, environment_id)

        level_value = hierarchy_levels.get_environment_level_value(
            environment, levels)
        esv = db.get_or_create(
            db.ResourceValues,
            environment=environment,
            resource_definition=res_def,
            level_value=level_value,
        )
        esv.values = flask.request.json
        return None, 204
Пример #6
0
    def get(self, environment_id, resource_id_or_name, levels):
        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(resource_id_or_name,
                                                  environment_id)

        level_value = hierarchy_levels.get_environment_level_value(
            environment, levels)
        res_values = db.ResourceValues.query.filter_by(
            resource_definition=res_def,
            environment=environment,
            level_value=level_value,
        ).one_or_none()
        if not res_values:
            return {}
        return res_values.overrides
Пример #7
0
    def put(self, environment_id, levels, resource_id_or_name):
        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(resource_id_or_name,
                                                  environment_id)

        level_value = hierarchy_levels.get_environment_level_value(
            environment, levels)
        esv = db.get_or_create(
            db.ResourceValues,
            environment=environment,
            resource_definition=res_def,
            level_value=level_value,
        )
        esv.overrides = flask.request.json
        return None, 204
Пример #8
0
    def get(self, environment_id, resource_id_or_name, levels):
        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(
            resource_id_or_name, environment_id)

        level_value = hierarchy_levels.get_environment_level_value(
            environment, levels)
        res_values = db.ResourceValues.query.filter_by(
            resource_definition=res_def,
            environment=environment,
            level_value=level_value,
        ).one_or_none()
        if not res_values:
            return {}
        return res_values.overrides
Пример #9
0
    def get(self, environment_id, resource_id_or_name, levels):
        app.logger.debug("Getting resource value. Env: %s, "
                         "resource: %s, levels: %s", environment_id,
                         resource_id_or_name, levels)

        effective = 'effective' in flask.request.args
        show_lookup = 'show_lookup' in flask.request.args

        if show_lookup and not effective:
            raise errors.RequestValidationError(
                "Lookup path tracing can be done only for effective values")

        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(
            resource_id_or_name, environment_id)

        level_values = list(hierarchy_levels.iter_environment_level_values(
            environment, levels))

        level_values_ids = [l.id for l in level_values]
        app.logger.debug("Got level values ids: %s", level_values_ids)

        if effective:
            app.logger.debug("Getting effective resource value. Env: %s, "
                             "resource: %s, levels: %s", environment_id,
                             resource_id_or_name, levels)
            resource_values = db.ResourceValues.query.filter(
                or_(
                    db.ResourceValues.level_value_id.in_(level_values_ids),
                    db.ResourceValues.level_value_id.is_(None)
                ),
                db.ResourceValues.resource_definition == res_def,
                db.ResourceValues.environment == environment
            ).all()
            app.logger.debug("Processing values for resource: %s, env: %s. "
                             "Loaded resource values: %s",
                             res_def.id, environment.id, len(resource_values))
            # Creating index of resource_values by level_value_id
            resource_values_idx = {r.level_value_id: r
                                   for r in resource_values}
            app.logger.debug("Resource values index size: %s",
                             len(resource_values_idx))

            result = {}
            lookup_path = '/'
            self._calculate_effective_values(
                result, None, resource_values_idx, show_lookup,
                lookup_path)

            for level_value in level_values:
                name = level_value.level.name
                value = level_value.value
                lookup_path += name + '/' + value + '/'

                self._calculate_effective_values(
                    result, level_value, resource_values_idx, show_lookup,
                    lookup_path)

            app.logger.debug("Effective values got for resource: "
                             "%s, env: %s", res_def.id, environment.id)
        else:
            if not level_values:
                level_value = None
            else:
                level_value = level_values[-1]
            resource_values = db.ResourceValues.query.filter_by(
                resource_definition=res_def,
                environment=environment,
                level_value=level_value,
            ).one_or_none()
            app.logger.debug("Values got for resource: "
                             "%s, env: %s", res_def.id, environment.id)
            if resource_values:
                result = resource_values.values
            else:
                result = {}
        return self._extract_keys_paths(result)
Пример #10
0
    def get(self, environment_id, resource_id_or_name, levels):
        app.logger.debug("Getting resource value. Env: %s, "
                         "resource: %s, levels: %s", environment_id,
                         resource_id_or_name, levels)
        environment = db.Environment.query.get_or_404(environment_id)
        res_def = library.get_resource_definition(
            resource_id_or_name, environment_id)

        level_values = list(hierarchy_levels.iter_environment_level_values(
            environment, levels))

        level_values_ids = [l.id for l in level_values]
        app.logger.debug("Got level values ids: %s", level_values_ids)

        if 'effective' in flask.request.args:
            app.logger.debug("Getting effective resource value. Env: %s, "
                             "resource: %s, levels: %s", environment_id,
                             resource_id_or_name, levels)
            show_lookup = 'show_lookup' in flask.request.args
            resource_values = db.ResourceValues.query.filter(
                or_(
                    db.ResourceValues.level_value_id.in_(level_values_ids),
                    db.ResourceValues.level_value_id.is_(None)
                ),
                db.ResourceValues.resource_definition == res_def,
                db.ResourceValues.environment == environment
            ).all()
            app.logger.debug("Processing values for resource: %s, env: %s. "
                             "Loaded resource values: %s",
                             res_def.id, environment.id, len(resource_values))
            # Creating index of resource_values by level_value_id
            resource_values_idx = {r.level_value_id: r
                                   for r in resource_values}
            app.logger.debug("Resource values index size: %s",
                             len(resource_values_idx))

            result = {}
            lookup_path = '/'
            self._calculate_effective_values(
                result, None, resource_values_idx, show_lookup,
                lookup_path)

            for level_value in level_values:
                name = level_value.level.name
                value = level_value.value
                lookup_path += name + '/' + value + '/'

                self._calculate_effective_values(
                    result, level_value, resource_values_idx, show_lookup,
                    lookup_path)

            app.logger.debug("Effective values got for resource: "
                             "%s, env: %s", res_def.id, environment.id)
            return result
        else:
            if not level_values:
                level_value = None
            else:
                level_value = level_values[-1]
            resource_values = db.ResourceValues.query.filter_by(
                resource_definition=res_def,
                environment=environment,
                level_value=level_value,
            ).one_or_none()
            app.logger.debug("Values got for resource: "
                             "%s, env: %s", res_def.id, environment.id)
            if not resource_values:
                return {}
            return resource_values.values