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])
Beispiel #2
0
    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)