Ejemplo n.º 1
0
    def reload(self):
        def match(x, rel):
            field_name = rel.remote_object_field
            x_value = getattr(x, field_name, "None")
            return x_value == rel.local_fk_value
        if self.data is not None:
            return
        data = database_driver.get_driver().getall(self.rel.remote_object_tablename, [[self.rel.remote_object_field, self.rel.local_fk_value]])

        if len(data) == 0:
            from lib.rome.core.orm.query import Query
            self.query = Query(self.rel.remote_class)
            self.query = self.query.filter(getattr(self.rel.remote_class, self.rel.remote_object_field)==self.rel.local_fk_value)
            if self.request_uuid:
                data = self.query.all(request_uuid=self.request_uuid) #if self.rel.to_many else self.query.first()data
            else:
                data = self.query.all() #if self.rel.to_many else self.query.first()data
        else:
            from lib.rome.core.lazy import LazyValue
            data = map(lambda x: LazyValue(x, self.request_uuid), data)
        self.__dict__["data"] = data
        self.data = filter(lambda x: match(x, self.rel), self.data)
        if not self.rel.to_many:
            if len(self.data) > 0:
                self.data = self.data[0]
            else:
                self.data = None
        self.is_loaded = True
Ejemplo n.º 2
0
    def update_nova_model(self, obj):
        """Update the fields of the given object."""
        key = self.get_key()
        current_model = self.cache[key]

        if obj is None:
            return current_model

        # Check if obj is simplified or not
        if "simplify_strategy" in obj:
            obj = database_driver.get_driver().get(obj["tablename"], obj["id"])
        # For each value of obj, set the corresponding attributes.
        for key in obj:
            simplified_value = self.deconverter.desimplify(obj[key])
            try:
                if simplified_value is not None:
                    value = self.deconverter.desimplify(obj[key])
                    current_model[key] = value
                else:
                    current_model[key] = obj[key]
            except Exception as e:
                if "None is not list-like" in str(e):
                    setattr(current_model, key, [])
                else:
                    traceback.print_exc()
                    pass
        if hasattr(current_model, "user_id") and obj.has_key("user_id"):
            current_model.user_id = obj["user_id"]
        if hasattr(current_model, "project_id") and obj.has_key("project_id"):
            current_model.project_id = obj["project_id"]
        return current_model
Ejemplo n.º 3
0
    def update_nova_model(self, obj):
        """Update the fields of the given object."""
        key = self.get_key()
        current_model = self.cache[key]

        if obj is None:
            return current_model

        # Check if obj is simplified or not
        if "simplify_strategy" in obj:
            obj = database_driver.get_driver().get(obj["tablename"], obj["id"])
        # For each value of obj, set the corresponding attributes.
        for key in obj:
            simplified_value = self.deconverter.desimplify(obj[key])
            try:
                if simplified_value is not None:
                    value = self.deconverter.desimplify(obj[key])
                    current_model[key] = value
                else:
                    current_model[key] = obj[key]
            except Exception as e:
                if "None is not list-like" in str(e):
                    setattr(current_model, key, [])
                else:
                    traceback.print_exc()
                    pass
        if hasattr(current_model, "user_id") and obj.has_key("user_id"):
            current_model.user_id = obj["user_id"]
        if hasattr(current_model, "project_id") and obj.has_key("project_id"):
            current_model.project_id = obj["project_id"]
        return current_model
Ejemplo n.º 4
0
def erase_fixture_data():
    print("erase data stored in database")
    tablenames = ["services", "compute_nodes"]
    driver = database_driver.get_driver()
    for tablename in tablenames:
        for key in driver.keys(tablename):
            driver.remove_key(tablename, key)
    pass
Ejemplo n.º 5
0
def erase_fixture_data():
    print("erase data stored in database")
    tablenames = ["services", "compute_nodes"]
    driver = database_driver.get_driver()
    for tablename in tablenames:
        for key in driver.keys(tablename):
            driver.remove_key(tablename, key)
    pass
Ejemplo n.º 6
0
Archivo: utils.py Proyecto: Gayout/rome
def get_objects(tablename, desimplify=True, request_uuid=None, skip_loading=False, hints=[]):
    data = database_driver.get_driver().getall(tablename, hints=hints)
    # if skip_loading:
    #     return data
    # else:
    #     # from lib.rome.core.dataformat.deconverter import JsonDeconverter
    #     # object_deconverter = JsonDeconverter(request_uuid=request_uuid)
    #     # result = map(lambda x: transform(x, object_deconverter, skip_loading), data)
    #     return result
    return data
Ejemplo n.º 7
0
 def load(self, data=None):
     """Load the referenced object from the database. The result will be
     cached, so that next call will not create any database request."""
     self.version = 0
     key = self.get_key()
     first_load = data is None
     if first_load:
         data = database_driver.get_driver().get(self.base, self.id)
     self.spawn_empty_model(data)
     self.update_nova_model(data)
     # if first_load and "aggregate" in self.base:
     if first_load:
         self.get_complex_ref().load_relationships()
         # self.update_nova_model(data)
     if self._session is not None:
         self.cache[key]._session = self._session
     return self.cache[key]
Ejemplo n.º 8
0
 def load(self, data=None):
     """Load the referenced object from the database. The result will be
     cached, so that next call will not create any database request."""
     self.version = 0
     key = self.get_key()
     first_load = data is None
     if first_load:
         data = database_driver.get_driver().get(self.base, self.id)
     self.spawn_empty_model(data)
     self.update_nova_model(data)
     # if first_load and "aggregate" in self.base:
     if first_load:
         self.get_complex_ref().load_relationships()
         # self.update_nova_model(data)
     if self._session is not None:
         self.cache[key]._session = self._session
     return self.cache[key]
Ejemplo n.º 9
0
def get_single_object(tablename, id, desimplify=True, request_uuid=None, skip_loading=False):
    from lib.rome.core.dataformat import get_decoder

    if isinstance(id, int):
        object_deconverter = get_decoder(request_uuid=request_uuid)
        data = database_driver.get_driver().get(tablename, id)
        if desimplify:
            try:
                model_object = object_deconverter.desimplify(data)
                if not skip_loading:
                    model_object.load(data=data)
                return model_object
            except Exception as e:
                traceback.print_exc()
                return None
        else:
            return data
    else:
        return None
Ejemplo n.º 10
0
def get_single_object(tablename,
                      id,
                      desimplify=True,
                      request_uuid=None,
                      skip_loading=False):
    from lib.rome.core.dataformat import get_decoder

    if isinstance(id, int):
        object_deconverter = get_decoder(request_uuid=request_uuid)
        data = database_driver.get_driver().get(tablename, id)
        if desimplify:
            try:
                model_object = object_deconverter.desimplify(data)
                if not skip_loading:
                    model_object.load(data=data)
                return model_object
            except Exception as e:
                traceback.print_exc()
                return None
        else:
            return data
    else:
        return None
Ejemplo n.º 11
0
    def reload(self):
        def match(x, rel):
            field_name = rel.remote_object_field
            x_value = getattr(x, field_name, "None")
            return x_value == rel.local_fk_value

        if self.data is not None:
            return
        data = database_driver.get_driver().getall(
            self.rel.remote_object_tablename,
            [[self.rel.remote_object_field, self.rel.local_fk_value]])

        if len(data) == 0:
            from lib.rome.core.orm.query import Query
            self.query = Query(self.rel.remote_class)
            self.query = self.query.filter(
                getattr(self.rel.remote_class, self.rel.remote_object_field) ==
                self.rel.local_fk_value)
            if self.request_uuid:
                data = self.query.all(
                    request_uuid=self.request_uuid
                )  #if self.rel.to_many else self.query.first()data
            else:
                data = self.query.all(
                )  #if self.rel.to_many else self.query.first()data
        else:
            from lib.rome.core.lazy import LazyValue
            data = map(lambda x: LazyValue(x, self.request_uuid), data)
        self.__dict__["data"] = data
        self.data = filter(lambda x: match(x, self.rel), self.data)
        if not self.rel.to_many:
            if len(self.data) > 0:
                self.data = self.data[0]
            else:
                self.data = None
        self.is_loaded = True
Ejemplo n.º 12
0
def get_objects(tablename, desimplify=True, request_uuid=None, skip_loading=False, hints=[]):
    return database_driver.get_driver().getall(tablename, hints=hints)
Ejemplo n.º 13
0
    def save(self, session=None, request_uuid=uuid.uuid1(), force=False, no_nested_save=False, increase_version=True, session_saving=None):

        if session is not None and not force:
            session.add(self)
            session.flush()
            return

        object_key = "%s:%s" % (self.__tablename__, self.id)

        if session_saving and self.id and object_key in session_saving.already_saved:
            return

        # self.update_foreign_keys()

        target = self
        table_name = self.__tablename__

        self._set_default_values()

        """Check if the current object has an value associated with the "id"
        field. If this is not the case, following code will generate an unique
        value, and store it in the "id" field."""
        if not self.already_in_database():
            self.id = database_driver.get_driver().next_key(table_name)
            logging.debug("booking the id %s in table %s" % (self.id, self.__tablename__))

        """Before keeping the object in database, we simplify it: the object is
        converted into "JSON like" representation, and nested objects are
        extracted. It results in a list of object that will be stored in the
        database."""
        object_converter = get_encoder(request_uuid)
        object_converter.simplify(self)

        saving_candidates = object_converter.complex_cache

        if no_nested_save:
            key = object_converter.get_cache_key(self)
            saving_candidates = {
                key: saving_candidates[key]
            }

        for key in [key for key in saving_candidates if "x" in key]:

            candidate = saving_candidates[key]
            default_classname = "_".join(key.split("_")[0:-1])
            classname = candidate.get("_metadata_novabase_classname", default_classname)
            table_name = get_model_tablename_from_classname(classname)

            simplified_object = object_converter.simple_cache[key]
            complex_object = object_converter.complex_cache[key]
            target_object = object_converter.target_cache[key]

            if simplified_object["id"] is not None:
                continue

            """Find a new_id for this object"""
            new_id = database_driver.get_driver().next_key(table_name)

            """Assign this id to the object"""
            simplified_object["id"] = new_id
            complex_object["id"] = new_id
            target_object.id = new_id

            pass

        for key in saving_candidates:

            candidate = saving_candidates[key]
            default_classname = "_".join(key.split("_")[0:-1])
            classname = candidate.get("_metadata_novabase_classname", default_classname)
            table_name = get_model_tablename_from_classname(classname)

            current_object = object_converter.complex_cache[key]

            current_object["_nova_classname"] = table_name

            if not "id" in current_object or current_object["id"] is None:
                current_object["id"] = self.next_key(table_name)
            else:

                current_object_key = "%s:%s" % (table_name, current_object["id"])

                if session_saving and current_object_key in session_saving.already_saved:
                    continue

                model_class = get_model_class_from_name(classname)
                existing_object = database_driver.get_driver().get(table_name, current_object["id"])

                if not same_version(existing_object, current_object, model_class):
                    current_object = merge_dict(existing_object, current_object)
                else:
                    continue

            if current_object["id"] == -1:
                logging.debug("skipping the storage of object %s" % (current_object["id"]))
                # continue
                break

            object_converter_datetime = get_encoder(request_uuid)

            if (current_object.has_key("created_at") and current_object[
                "created_at"] is None) or not current_object.has_key("created_at"):
                current_object["created_at"] = object_converter_datetime.simplify(datetime.datetime.utcnow())
            current_object["updated_at"] = object_converter_datetime.simplify(datetime.datetime.utcnow())
            current_object["deleted_at"] = None

            logging.debug("starting the storage of %s" % (current_object))

            try:
                local_object_converter = get_encoder(request_uuid)
                corrected_object = local_object_converter.simplify(current_object)
                if target.__tablename__ == corrected_object["_nova_classname"] and target.id == corrected_object["id"]:
                    corrected_object["_session"] = getattr(target, "_session", None)
                if increase_version:
                    if "_rome_version_number" in corrected_object:
                        self._rome_version_number = corrected_object["_rome_version_number"]
                    if hasattr(self, "_rome_version_number"):
                        self._rome_version_number += 1
                    else:
                        self._rome_version_number = 0
                corrected_object["_rome_version_number"] = self._rome_version_number
                database_driver.get_driver().put(table_name, current_object["id"], corrected_object, secondary_indexes=getattr(model_class, "_secondary_indexes", []))
                database_driver.get_driver().add_key(table_name, current_object["id"])
            except Exception as e:
                import traceback
                traceback.print_exc()
                logging.error("Failed to store following object: %s because of %s, becoming %s" % (
                current_object, e, corrected_object))
                pass
            logging.debug("finished the storage of %s" % (current_object))

            if session_saving:
                session_saving.already_saved += [current_object_key]
        # self.load_relationships()

        candidates = []
        # Handle associated objects: they may be saved!
        for associated_object in self.get_associated_objects():
            candidates += [associated_object]

        # As every associated_object are going to be saved, associated_objects may be reset
        self.reset_associated_objects()

        for c in candidates:
            try:
                # object_converter.simplify(c)
                c.save(request_uuid=request_uuid, force=force, no_nested_save=no_nested_save, increase_version=increase_version, session_saving=session_saving)
            except:
                import traceback
                traceback.print_exc()
                pass

        return self
Ejemplo n.º 14
0
 def delete(self, session=None):
     # <HARD DELETE IMPLEMENTATION>
     if session is not None:
         session.delete(self)
         return
     database_driver.get_driver().remove_key(self.__tablename__, self.id)
Ejemplo n.º 15
0
def get_objects(tablename,
                desimplify=True,
                request_uuid=None,
                skip_loading=False,
                hints=[]):
    return database_driver.get_driver().getall(tablename, hints=hints)
Ejemplo n.º 16
0
    def save(self,
             session=None,
             request_uuid=uuid.uuid1(),
             force=False,
             no_nested_save=False,
             increase_version=True,
             session_saving=None):

        if session is not None and not force:
            session.add(self)
            session.flush()
            return

        object_key = "%s:%s" % (self.__tablename__, self.id)

        if session_saving and self.id and object_key in session_saving.already_saved:
            return

        # self.update_foreign_keys()

        target = self
        table_name = self.__tablename__

        self._set_default_values()
        """Check if the current object has an value associated with the "id"
        field. If this is not the case, following code will generate an unique
        value, and store it in the "id" field."""
        if not self.already_in_database():
            self.id = database_driver.get_driver().next_key(table_name)
            logging.debug("booking the id %s in table %s" %
                          (self.id, self.__tablename__))
        """Before keeping the object in database, we simplify it: the object is
        converted into "JSON like" representation, and nested objects are
        extracted. It results in a list of object that will be stored in the
        database."""
        object_converter = get_encoder(request_uuid)
        object_converter.simplify(self)

        saving_candidates = object_converter.complex_cache

        if no_nested_save:
            key = object_converter.get_cache_key(self)
            saving_candidates = {key: saving_candidates[key]}

        for key in [key for key in saving_candidates if "x" in key]:

            candidate = saving_candidates[key]
            default_classname = "_".join(key.split("_")[0:-1])
            classname = candidate.get("_metadata_novabase_classname",
                                      default_classname)
            table_name = get_model_tablename_from_classname(classname)

            simplified_object = object_converter.simple_cache[key]
            complex_object = object_converter.complex_cache[key]
            target_object = object_converter.target_cache[key]

            if simplified_object["id"] is not None:
                continue
            """Find a new_id for this object"""
            new_id = database_driver.get_driver().next_key(table_name)
            """Assign this id to the object"""
            simplified_object["id"] = new_id
            complex_object["id"] = new_id
            target_object.id = new_id

            pass

        for key in saving_candidates:

            candidate = saving_candidates[key]
            default_classname = "_".join(key.split("_")[0:-1])
            classname = candidate.get("_metadata_novabase_classname",
                                      default_classname)
            table_name = get_model_tablename_from_classname(classname)

            current_object = object_converter.complex_cache[key]

            current_object["_nova_classname"] = table_name

            if not "id" in current_object or current_object["id"] is None:
                current_object["id"] = self.next_key(table_name)
            else:

                current_object_key = "%s:%s" % (table_name,
                                                current_object["id"])

                if session_saving and current_object_key in session_saving.already_saved:
                    continue

                model_class = get_model_class_from_name(classname)
                existing_object = database_driver.get_driver().get(
                    table_name, current_object["id"])

                if not same_version(existing_object, current_object,
                                    model_class):
                    current_object = merge_dict(existing_object,
                                                current_object)
                else:
                    continue

            if current_object["id"] == -1:
                logging.debug("skipping the storage of object %s" %
                              (current_object["id"]))
                # continue
                break

            object_converter_datetime = get_encoder(request_uuid)

            if (current_object.has_key("created_at")
                    and current_object["created_at"] is None
                ) or not current_object.has_key("created_at"):
                current_object[
                    "created_at"] = object_converter_datetime.simplify(
                        datetime.datetime.utcnow())
            current_object["updated_at"] = object_converter_datetime.simplify(
                datetime.datetime.utcnow())
            current_object["deleted_at"] = None

            logging.debug("starting the storage of %s" % (current_object))

            try:
                local_object_converter = get_encoder(request_uuid)
                corrected_object = local_object_converter.simplify(
                    current_object)
                if target.__tablename__ == corrected_object[
                        "_nova_classname"] and target.id == corrected_object[
                            "id"]:
                    corrected_object["_session"] = getattr(
                        target, "_session", None)
                if increase_version:
                    if "_rome_version_number" in corrected_object:
                        self._rome_version_number = corrected_object[
                            "_rome_version_number"]
                    if hasattr(self, "_rome_version_number"):
                        self._rome_version_number += 1
                    else:
                        self._rome_version_number = 0
                corrected_object[
                    "_rome_version_number"] = self._rome_version_number
                database_driver.get_driver().put(table_name,
                                                 current_object["id"],
                                                 corrected_object,
                                                 secondary_indexes=getattr(
                                                     model_class,
                                                     "_secondary_indexes", []))
                database_driver.get_driver().add_key(table_name,
                                                     current_object["id"])
            except Exception as e:
                import traceback
                traceback.print_exc()
                logging.error(
                    "Failed to store following object: %s because of %s, becoming %s"
                    % (current_object, e, corrected_object))
                pass
            logging.debug("finished the storage of %s" % (current_object))

            if session_saving:
                session_saving.already_saved += [current_object_key]
        # self.load_relationships()

        candidates = []
        # Handle associated objects: they may be saved!
        for associated_object in self.get_associated_objects():
            candidates += [associated_object]

        # As every associated_object are going to be saved, associated_objects may be reset
        self.reset_associated_objects()

        for c in candidates:
            try:
                # object_converter.simplify(c)
                c.save(request_uuid=request_uuid,
                       force=force,
                       no_nested_save=no_nested_save,
                       increase_version=increase_version,
                       session_saving=session_saving)
            except:
                import traceback
                traceback.print_exc()
                pass

        return self
Ejemplo n.º 17
0
 def delete(self, session=None):
     # <HARD DELETE IMPLEMENTATION>
     if session is not None:
         session.delete(self)
         return
     database_driver.get_driver().remove_key(self.__tablename__, self.id)