def create_attributes(cls, instance): """Create attributes for Node instance :param instance: Node instance :returns: NodeAttributes instance """ new_attributes = models.NodeAttributes() instance.attributes = new_attributes db().add(new_attributes) db().add(instance) db().flush() return new_attributes
def upload_fixture(fileobj, loader=None): db.expunge_all() fixture = load_fixture(fileobj, loader) queue = Queue.Queue() keys = {} for obj in fixture: pk = obj['pk'] model_name = obj["model"].split(".")[1] try: itertools.dropwhile(lambda m: not hasattr(models, m), [ model_name.capitalize(), "".join( map(lambda n: n.capitalize(), model_name.split("_"))) ]).next() except StopIteration: raise Exception("Couldn't find model {0}".format(model_name)) obj['model'] = getattr(models, capitalize_model_name(model_name)) keys[obj['model'].__tablename__] = {} # Check if it's already uploaded obj_from_db = db.query(obj['model']).get(pk) if obj_from_db: logger.info( "Fixture model '%s' with pk='%s' already" " uploaded. Skipping", model_name, pk) continue queue.put(obj) pending_objects = [] while True: try: obj = queue.get_nowait() except Exception: break new_obj = obj['model']() fk_fields = {} for field, value in obj["fields"].iteritems(): f = getattr(obj['model'], field) impl = getattr(f, 'impl', None) fk_model = None try: if hasattr(f.comparator.prop, "argument"): if hasattr(f.comparator.prop.argument, "__call__"): fk_model = f.comparator.prop.argument() else: fk_model = f.comparator.prop.argument.class_ except AttributeError: pass if fk_model: if value not in keys[fk_model.__tablename__]: if obj not in pending_objects: queue.put(obj) pending_objects.append(obj) continue else: logger.error(u"Can't resolve foreign key " "'{0}' for object '{1}'".format( field, obj["model"])) break else: value = keys[fk_model.__tablename__][value].id if isinstance(impl, orm.attributes.ScalarObjectAttributeImpl): if value: fk_fields[field] = (value, fk_model) elif isinstance(impl, orm.attributes.CollectionAttributeImpl): if value: fk_fields[field] = (value, fk_model) elif hasattr(f, 'property') and isinstance( f.property.columns[0].type, sqlalchemy.types.DateTime): if value: setattr(new_obj, field, datetime.strptime(value, "%d-%m-%Y %H:%M:%S")) else: setattr(new_obj, field, datetime.now()) else: setattr(new_obj, field, value) for field, data in fk_fields.iteritems(): if isinstance(data[0], int): setattr(new_obj, field, db.query(data[1]).get(data[0])) elif isinstance(data[0], list): for v in data[0]: getattr(new_obj, field).append(db.query(data[1]).get(v)) db.add(new_obj) db.commit() keys[obj['model'].__tablename__][obj["pk"]] = new_obj # UGLY HACK for testing if new_obj.__class__.__name__ == 'Node': new_obj.attributes = models.NodeAttributes() db.commit() new_obj.attributes.volumes = \ new_obj.volume_manager.gen_volumes_info() NetworkManager.update_interfaces_info(new_obj) db.commit()