def test_add_node(self): # Ensure previous node information is cleared uuid2 = uuidutils.generate_uuid() session = db.get_session() with session.begin(): db.Node(uuid=self.node.uuid).save(session) db.Node(uuid=uuid2).save(session) db.Attribute(name='mac', value='11:22:11:22:11:22', uuid=self.uuid).save(session) node = node_cache.add_node(self.node.uuid, mac=self.macs, bmc_address='1.2.3.4', foo=None) self.assertEqual(self.uuid, node.uuid) self.assertTrue(time.time() - 60 < node.started_at < time.time() + 60) self.assertFalse(node._locked) res = set(db.model_query(db.Node.uuid, db.Node.started_at).all()) expected = {(node.uuid, node.started_at), (uuid2, None)} self.assertEqual(expected, res) res = (db.model_query(db.Attribute.name, db.Attribute.value, db.Attribute.uuid).order_by( db.Attribute.name, db.Attribute.value).all()) self.assertEqual([('bmc_address', '1.2.3.4', self.uuid), ('mac', self.macs[0], self.uuid), ('mac', self.macs[1], self.uuid)], [(row.name, row.value, row.uuid) for row in res])
def add_attribute(self, name, value, session=None): """Store look up attribute for a node in the database. :param name: attribute name :param value: attribute value or list of possible values :param session: optional existing database session :raises: Error if attributes values are already in database """ if not isinstance(value, list): value = [value] with db.ensure_transaction(session) as session: try: for v in value: db.Attribute(name=name, value=v, uuid=self.uuid).save(session) except db_exc.DBDuplicateEntry as exc: LOG.error(_LE('Database integrity error %s during ' 'adding attributes'), exc, node_info=self) raise utils.Error( _('Some or all of %(name)s\'s %(value)s are already ' 'on introspection') % { 'name': name, 'value': value }, node_info=self) # Invalidate attributes so they're loaded on next usage self._attributes = None
def test_attributes(self): node_info = node_cache.add_node(self.uuid, istate.States.starting, bmc_address='1.2.3.4', mac=self.macs) self.assertEqual({ 'bmc_address': ['1.2.3.4'], 'mac': self.macs }, node_info.attributes) # check invalidation session = db.get_session() with session.begin(): db.Attribute(uuid=uuidutils.generate_uuid(), name='foo', value='bar', node_uuid=self.uuid).save(session) # still cached self.assertEqual({ 'bmc_address': ['1.2.3.4'], 'mac': self.macs }, node_info.attributes) node_info.invalidate_cache() self.assertEqual( { 'bmc_address': ['1.2.3.4'], 'mac': self.macs, 'foo': ['bar'] }, node_info.attributes)
def test_add_node(self): # Ensure previous node information is cleared session = db.get_session() with session.begin(): db.Node(uuid=self.node.uuid).save(session) db.Node(uuid='uuid2').save(session) db.Attribute(name='mac', value='11:22:11:22:11:22', uuid=self.uuid).save(session) res = node_cache.add_node(self.node.uuid, mac=self.macs, bmc_address='1.2.3.4', foo=None) self.assertEqual(self.uuid, res.uuid) self.assertTrue(time.time() - 60 < res.started_at < time.time() + 60) res = (db.model_query(db.Node.uuid, db.Node.started_at).order_by(db.Node.uuid).all()) self.assertEqual(['1a1a1a1a-2b2b-3c3c-4d4d-5e5e5e5e5e5e', 'uuid2'], [t.uuid for t in res]) self.assertTrue(time.time() - 60 < res[0].started_at < time.time() + 60) res = (db.model_query(db.Attribute.name, db.Attribute.value, db.Attribute.uuid). order_by(db.Attribute.name, db.Attribute.value).all()) self.assertEqual([('bmc_address', '1.2.3.4', self.uuid), ('mac', self.macs[0], self.uuid), ('mac', self.macs[1], self.uuid)], [(row.name, row.value, row.uuid) for row in res])
def setUp(self): super(TestNodeCacheCleanUp, self).setUp() self.started_at = 100.0 session = db.get_session() with session.begin(): db.Node(uuid=self.uuid, started_at=self.started_at).save(session) for v in self.macs: db.Attribute(name='mac', value=v, uuid=self.uuid).save(session) db.Option(uuid=self.uuid, name='foo', value='bar').save(session)
def test_add_node_duplicate_mac(self): session = db.get_session() with session.begin(): db.Node(uuid='another-uuid').save(session) db.Attribute(name='mac', value='11:22:11:22:11:22', uuid='another-uuid').save(session) self.assertRaises(utils.Error, node_cache.add_node, self.node.uuid, mac=['11:22:11:22:11:22'])
def test_active_macs(self): session = db.get_session() with session.begin(): db.Node(uuid=self.node.uuid).save(session) values = [('mac', '11:22:11:22:11:22', self.uuid), ('mac', '22:11:22:11:22:11', self.uuid)] for value in values: db.Attribute(name=value[0], value=value[1], uuid=value[2]).save(session) self.assertEqual({'11:22:11:22:11:22', '22:11:22:11:22:11'}, node_cache.active_macs())
def setUp(self): super(TestNodeCacheCleanUp, self).setUp() self.started_at = datetime.datetime.utcnow() session = db.get_session() with session.begin(): db.Node(uuid=self.uuid, state=istate.States.waiting, started_at=self.started_at).save(session) for v in self.macs: db.Attribute(uuid=uuidutils.generate_uuid(), name='mac', value=v, node_uuid=self.uuid).save(session) db.Option(uuid=self.uuid, name='foo', value='bar').save(session)
def test_active_macs(self): session = db.get_session() with session.begin(): db.Node(uuid=self.node.uuid, state=istate.States.starting).save(session) values = [('mac', '11:22:11:22:11:22', self.uuid), ('mac', '22:11:22:11:22:11', self.uuid)] for value in values: db.Attribute(uuid=uuidutils.generate_uuid(), name=value[0], value=value[1], node_uuid=value[2]).save(session) self.assertEqual({'11:22:11:22:11:22', '22:11:22:11:22:11'}, node_cache.active_macs())
def add_attribute(self, name, value, session=None): """Store look up attribute for a node in the database. :param name: attribute name :param value: attribute value or list of possible values :param session: optional existing database session """ if not isinstance(value, list): value = [value] with db.ensure_transaction(session) as session: for v in value: db.Attribute(uuid=uuidutils.generate_uuid(), name=name, value=v, node_uuid=self.uuid).save(session) # Invalidate attributes so they're loaded on next usage self._attributes = None
def test__delete_node(self): session = db.get_session() with session.begin(): db.Node(uuid=self.node.uuid).save(session) db.Attribute(name='mac', value='11:22:11:22:11:22', uuid=self.uuid).save(session) data = {'s': 'value', 'b': True, 'i': 42} encoded = json.dumps(data) db.Option(uuid=self.uuid, name='name', value=encoded).save(session) node_cache._delete_node(self.uuid) session = db.get_session() row_node = db.model_query(db.Node).filter_by(uuid=self.uuid).first() self.assertIsNone(row_node) row_attribute = db.model_query( db.Attribute).filter_by(uuid=self.uuid).first() self.assertIsNone(row_attribute) row_option = db.model_query( db.Option).filter_by(uuid=self.uuid).first() self.assertIsNone(row_option)