def test_fire_callback_on_node_create(self, get_m): node = mock.MagicMock() fire_callback_on_node_create(node) for ext in get_m.return_value: ext.on_node_create.assert_called_once_with(node)
def upload_fixture(fileobj, loader=None): 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': objects.Node.create_attributes(new_obj) objects.Node.update_interfaces(new_obj) fire_callback_on_node_create(new_obj) db().commit()
def create(cls, data): """Create Node instance with specified parameters in DB. This includes: * generating its name by MAC (if name is not specified in data) * adding node to Cluster (if cluster_id is not None in data) \ (see :func:`add_into_cluster`) with specified roles \ (see :func:`update_roles` and :func:`update_pending_roles`) * creating interfaces for Node in DB (see :func:`update_interfaces`) * creating default Node attributes (see :func:`create_attributes`) * creating Notification about newly discovered Node \ (see :func:`create_discover_notification`) :param data: dictionary of key-value pairs as object fields :returns: Node instance """ if "name" not in data: data["name"] = "Untitled ({0})".format( data['mac'][-5:].lower() ) data["timestamp"] = datetime.now() data.pop("id", None) # TODO(enchantner): fix this temporary hack in clients if "cluster_id" not in data and "cluster" in data: cluster_id = data.pop("cluster", None) data["cluster_id"] = cluster_id roles = data.pop("roles", None) pending_roles = data.pop("pending_roles", None) primary_roles = data.pop("primary_roles", None) new_node_meta = data.pop("meta", {}) new_node_cluster_id = data.pop("cluster_id", None) new_node = super(Node, cls).create(data) new_node.create_meta(new_node_meta) if 'hostname' not in data: new_node.hostname = \ cls.get_unique_hostname(new_node, new_node_cluster_id) db().flush() # Add interfaces for node from 'meta'. if new_node.meta and new_node.meta.get('interfaces'): cls.update_interfaces(new_node) # adding node into cluster if new_node_cluster_id: cls.add_into_cluster(new_node, new_node_cluster_id) # updating roles if roles is not None: cls.update_roles(new_node, roles) if pending_roles is not None: cls.update_pending_roles(new_node, pending_roles) if primary_roles is not None: cls.update_primary_roles(new_node, primary_roles) # creating attributes cls.create_attributes(new_node) cls.create_discover_notification(new_node) if new_node.ip: cls.check_ip_belongs_to_any_admin_network(new_node) fire_callback_on_node_create(new_node) return new_node
def upload_fixture(fileobj, loader=None): 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 six.iteritems(obj["fields"]): 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 six.iteritems(fk_fields): 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': objects.Node.update_interfaces(new_obj) objects.Node.update_interfaces_offloading_modes(new_obj) fire_callback_on_node_create(new_obj) db().commit() if new_obj.__class__.__name__ == 'Release': objects.Release.create_tags(new_obj)
def create(cls, data): """Create Node instance with specified parameters in DB. This includes: * generating its name by MAC (if name is not specified in data) * adding node to Cluster (if cluster_id is not None in data) \ (see :func:`add_into_cluster`) with specified roles \ (see :func:`update_roles` and :func:`update_pending_roles`) * creating interfaces for Node in DB (see :func:`update_interfaces`) * creating default Node attributes (see :func:`create_attributes`) * creating Notification about newly discovered Node \ (see :func:`create_discover_notification`) :param data: dictionary of key-value pairs as object fields :returns: Node instance """ if "name" not in data: data["name"] = "Untitled ({0})".format(data['mac'][-5:].lower()) data["timestamp"] = datetime.now() data.pop("id", None) # TODO(enchantner): fix this temporary hack in clients if "cluster_id" not in data and "cluster" in data: cluster_id = data.pop("cluster", None) data["cluster_id"] = cluster_id roles = data.pop("roles", None) pending_roles = data.pop("pending_roles", None) primary_roles = data.pop("primary_roles", None) new_node_meta = data.pop("meta", {}) new_node_cluster_id = data.pop("cluster_id", None) new_node = super(Node, cls).create(data) new_node.create_meta(new_node_meta) if 'hostname' not in data: new_node.hostname = \ cls.get_unique_hostname(new_node, new_node_cluster_id) db().flush() # Add interfaces for node from 'meta'. if new_node.meta and new_node.meta.get('interfaces'): cls.update_interfaces(new_node) # adding node into cluster if new_node_cluster_id: cls.add_into_cluster(new_node, new_node_cluster_id) # updating roles if roles is not None: cls.update_roles(new_node, roles) if pending_roles is not None: cls.update_pending_roles(new_node, pending_roles) if primary_roles is not None: cls.update_primary_roles(new_node, primary_roles) # creating attributes cls.create_attributes(new_node) cls.create_discover_notification(new_node) fire_callback_on_node_create(new_node) return new_node