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)
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
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 )
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)
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)
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)
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()