Skip to content

Commit 4df0866

Browse files
d-w-moorealanking
authored andcommitted
[#459] respect the default_resource setting for replication
1 parent dd2a9d1 commit 4df0866

3 files changed

Lines changed: 49 additions & 5 deletions

File tree

irods/data_object.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,10 +113,8 @@ def unregister(self, **options):
113113
def truncate(self, size):
114114
self.manager.truncate(self.path, size)
115115

116-
def replicate(self, resource=None, **options):
117-
if resource:
118-
options[kw.DEST_RESC_NAME_KW] = resource
119-
self.manager.replicate(self.path, **options)
116+
def replicate(self, resource = None, **options):
117+
self.manager.replicate(self.path, resource = resource, **options)
120118

121119

122120
class iRODSDataObjectFileRaw(io.RawIOBase):

irods/manager/data_object_manager.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,9 +628,13 @@ def truncate(self, path, size, **options):
628628
response = conn.recv()
629629

630630

631-
def replicate(self, path, resource=None, **options):
631+
def replicate(self, path, resource = None, **options):
632632
if resource:
633633
options[kw.DEST_RESC_NAME_KW] = resource
634+
else:
635+
def_resc = getattr(self.sess,'default_resource',None)
636+
if def_resc:
637+
options[kw.DEF_RESC_NAME_KW] = def_resc
634638

635639
message_body = FileOpenRequest(
636640
objPath=path,

irods/test/data_obj_test.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,48 @@ def create_resc_hierarchy (self, Root, Leaf = None):
128128
self.sess.resources.remove(Leaf)
129129
self.sess.resources.remove(Root)
130130

131+
132+
def _helper_for_testing_that_replicate_obeys_default_resource_setting__issue_459(self, get_session_function):
133+
with self.create_simple_resc() as newResc1:
134+
with self.create_simple_resc() as newResc2:
135+
number_of_replicas_on_resc = lambda d,resc: len([r for r in d.replicas if r.resource_name == resc])
136+
session = get_session_function(default_resource = newResc2)
137+
try:
138+
d = session.data_objects.create('/tempZone/home/rods/thingie2', resource = newResc1)
139+
self.assertEqual (number_of_replicas_on_resc (session.data_objects.get(d.path), newResc1), 1)
140+
self.assertEqual (number_of_replicas_on_resc (session.data_objects.get(d.path), newResc2), 0)
141+
d.replicate()
142+
self.assertEqual (number_of_replicas_on_resc (session.data_objects.get(d.path), newResc2), 1)
143+
finally:
144+
if d: session.data_objects.unlink(d.path, force = True)
145+
146+
def test_with_session_cloned_in_core_that_replicate_obeys_default_resource_setting__issue_459(self):
147+
self._helper_for_testing_that_replicate_obeys_default_resource_setting__issue_459(self._session_cloned_from_existing)
148+
149+
def test_with_session_spawned_from_client_environment_that_replicate_obeys_default_resource_setting__issue_459(self):
150+
self._helper_for_testing_that_replicate_obeys_default_resource_setting__issue_459(self._session_from_client_environment)
151+
152+
def _session_cloned_from_existing(self, default_resource):
153+
sess = self.sess.clone()
154+
if default_resource:
155+
sess.default_resource = default_resource
156+
return sess
157+
158+
def _session_from_client_environment(self, default_resource):
159+
env_file = getattr(self.sess, 'env_file')
160+
if env_file is None:
161+
self.skipTest('no environment file to modify')
162+
with helpers.file_backed_up(env_file):
163+
with open(env_file,'r+') as fp:
164+
j = json.load(fp)
165+
if default_resource:
166+
j['irods_default_resource'] = default_resource
167+
fp.seek(0)
168+
json.dump(j,fp)
169+
fp.truncate()
170+
return helpers.make_session()
171+
172+
131173
def test_data_write_stales_other_repls__ref_irods_5548(self):
132174
test_data = 'irods_5548_testfile'
133175
test_coll = '/{0.zone}/home/{0.username}'.format(self.sess)

0 commit comments

Comments
 (0)