예제 #1
0
    def test_group_metadata(self):
        group_name = "test_group"

        # group should not be already present
        with self.assertRaises(UserGroupDoesNotExist):
            self.sess.user_groups.get(group_name)

        group = None

        try:
            # create group
            group = self.sess.user_groups.create(group_name)

            # add metadata to group
            triple = ['key', 'value', 'unit']
            group.metadata[triple[0]] = iRODSMeta(*triple)

            result = self.sess.query(UserMeta, UserGroup).filter(
                UserGroup.name == group_name, UserMeta.name == 'key').one()

            self.assertTrue([
                result[k]
                for k in (UserMeta.name, UserMeta.value, UserMeta.units)
            ] == triple)

        finally:
            if group:
                group.remove()
                helpers.remove_unused_metadata(self.sess)
예제 #2
0
        def __exit__(self,*_): # - clean up after context block

            if self.test_collection is not None:
                self.test_collection.remove(recurse=True, force=True)

            if self.nAVUs > 0 and self.num_objects > 0:
                helpers.remove_unused_metadata(self.session)            # delete unused AVU's
예제 #3
0
 def test_query_on_AVU_times(self):
     test_collection_path = '/{zone}/home/{user}/test_collection'.format( zone = self.sess.zone, user = self.sess.username)
     testColl = helpers.make_test_collection(self.sess, test_collection_path, obj_count = 1)
     testData =  testColl.data_objects[0]
     testResc =  self.sess.resources.get('demoResc')
     testUser =  self.sess.users.get(self.sess.username)
     objects =    { 'r': testResc, 'u': testUser, 'c':testColl, 'd':testData }
     object_IDs = { sfx:obj.id for sfx,obj in objects.items() }
     tables =  { 'r': (Resource, ResourceMeta),
                 'u': (User, UserMeta),
                 'd': (DataObject, DataObjectMeta),
                 'c': (Collection, CollectionMeta)  }
     try:
         str_number_incr = lambda str_numbers : str(1+max([0]+[int(n) if n.isdigit() else 0 for n in str_numbers]))
         AVU_unique_incr = lambda obj,suffix='' : ( 'a_'+suffix,
                                                    'v_'+suffix,
                                                    str_number_incr(avu.units for avu in obj.metadata.items()) )
         before = datetime.utcnow()
         time.sleep(1.5)
         for suffix,obj in objects.items(): obj.metadata.add( *AVU_unique_incr(obj,suffix) )
         after = datetime.utcnow()
         for suffix, tblpair in tables.items():
             self.sess.query( *tblpair ).filter(tblpair[1].modify_time <= after )\
                                        .filter(tblpair[1].modify_time > before )\
                                        .filter(tblpair[0].id == object_IDs[suffix] ).one()
             self.sess.query( *tblpair ).filter(tblpair[1].create_time <= after )\
                                        .filter(tblpair[1].create_time > before )\
                                        .filter(tblpair[0].id == object_IDs[suffix] ).one()
     finally:
         for obj in objects.values():
             for avu in obj.metadata.items(): obj.metadata.remove(avu)
         testColl.remove(recurse=True,force=True)
         helpers.remove_unused_metadata( self.sess )
예제 #4
0
    def test_add_user_metadata(self):
        user_name = "testuser"
        user = None

        try:
            # create user
            user = self.sess.users.create(user_name, 'rodsuser')

            user.metadata.add('key0', 'value0')
            user.metadata.add('key1', 'value1', 'unit1')
            user.metadata.add('key2', 'value2a', 'unit2')
            user.metadata.add('key2', 'value2b', 'unit2')

            meta0 = user.metadata.get_all('key0')
            self.assertEqual(len(meta0), 1)
            self.assertEqual(meta0[0].name, 'key0')
            self.assertEqual(meta0[0].value, 'value0')

            meta1 = user.metadata.get_all('key1')
            self.assertEqual(len(meta1), 1)
            self.assertEqual(meta1[0].name, 'key1')
            self.assertEqual(meta1[0].value, 'value1')
            self.assertEqual(meta1[0].units, 'unit1')

            meta2 = sorted(user.metadata.get_all('key2'),
                           key=lambda AVU: AVU.value)
            self.assertEqual(len(meta2), 2)
            self.assertEqual(meta2[0].name, 'key2')
            self.assertEqual(meta2[0].value, 'value2a')
            self.assertEqual(meta2[0].units, 'unit2')
            self.assertEqual(meta2[1].name, 'key2')
            self.assertEqual(meta2[1].value, 'value2b')
            self.assertEqual(meta2[1].units, 'unit2')

            user.metadata.remove('key1', 'value1', 'unit1')
            metadata = user.metadata.items()
            self.assertEqual(len(metadata), 3)

            user.metadata.remove('key2', 'value2a', 'unit2')
            metadata = user.metadata.items()
            self.assertEqual(len(metadata), 2)

        finally:
            if user:
                user.remove()
                helpers.remove_unused_metadata(self.sess)
예제 #5
0
    def test_simultaneous_multiple_AVU_joins(self):
        objects = []
        decoys = []
        try:
            collection = self.coll_path
            filename = 'test_multiple_AVU_joins'
            file_path = '{collection}/{filename}'.format(**locals())
            for x in range(3, 9):
                obj = helpers.make_object(self.sess, file_path +
                                          '-{}'.format(x))  # with metadata
                objects.append(obj)
                obj.metadata.add('A_meta', '1{}'.format(x))
                obj.metadata.add('B_meta', '2{}'.format(x))
                decoys.append(
                    helpers.make_object(
                        self.sess,
                        file_path + '-dummy{}'.format(x)))  # without metadata
            self.assertTrue(len(objects) > 0)

            # -- test simple repeat of same column --
            q = self.sess.query(DataObject,DataObjectMeta).\
                                            filter(DataObjectMeta.name == 'A_meta', DataObjectMeta.value <  '20').\
                                            filter(DataObjectMeta.name == 'B_meta', DataObjectMeta.value >= '20')
            self.assertTrue(rows_returned(q) == len(objects))

            # -- test no-stomp of previous filter --
            self.assertTrue(('B_meta',
                             '28') in [(x.name, x.value)
                                       for x in objects[-1].metadata.items()])
            q = self.sess.query(DataObject,DataObjectMeta).\
                                            filter(DataObjectMeta.name == 'B_meta').filter(DataObjectMeta.value < '28').\
                                            filter(DataObjectMeta.name == 'B_meta').filter(Like(DataObjectMeta.value, '2_'))
            self.assertTrue(rows_returned(q) == len(objects) - 1)

            # -- test multiple AVU's by same attribute name --
            objects[-1].metadata.add('B_meta', '29')
            q = self.sess.query(DataObject,DataObjectMeta).\
                                            filter(DataObjectMeta.name == 'B_meta').filter(DataObjectMeta.value == '28').\
                                            filter(DataObjectMeta.name == 'B_meta').filter(DataObjectMeta.value == '29')
            self.assertTrue(rows_returned(q) == 1)
        finally:
            for x in (objects + decoys):
                x.unlink(force=True)
            helpers.remove_unused_metadata(self.sess)
예제 #6
0
    def test_user_metadata(self):
        user_name = "testuser"
        user = None

        try:
            user = self.sess.users.create(user_name, 'rodsuser')

            # metadata collection is the right type?
            self.assertIsInstance(user.metadata, iRODSMetaCollection)

            # add three AVUs, two having the same key
            user.metadata['key0'] = iRODSMeta('key0', 'value', 'units')
            sorted_triples = sorted([['key1', 'value0', 'units0'],
                                     ['key1', 'value1', 'units1']])
            for m in sorted_triples:
                user.metadata.add(iRODSMeta(*m))

            # general query gives the right results?
            result_0 =  self.sess.query(UserMeta, User)\
                         .filter( User.name == user_name, UserMeta.name == 'key0').one()

            self.assertTrue([
                result_0[k]
                for k in (UserMeta.name, UserMeta.value, UserMeta.units)
            ] == ['key0', 'value', 'units'])

            results_1 =  self.sess.query(UserMeta, User)\
                         .filter(User.name == user_name, UserMeta.name == 'key1')

            retrieved_triples = [[
                res[k] for k in (UserMeta.name, UserMeta.value, UserMeta.units)
            ] for res in results_1]

            self.assertTrue(sorted_triples == sorted(retrieved_triples))

        finally:
            if user:
                user.remove()
                helpers.remove_unused_metadata(self.sess)
예제 #7
0
 def tearDown(self):
     '''Remove test data and close connections
     '''
     self.coll.remove(recurse=True, force=True)
     helpers.remove_unused_metadata(self.sess)
     self.sess.cleanup()