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
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
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
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
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
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
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]
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]
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
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
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
def get_objects(tablename, desimplify=True, request_uuid=None, skip_loading=False, hints=[]): return database_driver.get_driver().getall(tablename, hints=hints)
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
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)
def get_objects(tablename, desimplify=True, request_uuid=None, skip_loading=False, hints=[]): return database_driver.get_driver().getall(tablename, hints=hints)
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
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)