From 464a66503803e08c4ab7405bf5ea7b7bfa1ca299 Mon Sep 17 00:00:00 2001 From: Terrell Russell Date: Wed, 22 Apr 2026 23:52:37 -0400 Subject: [PATCH] [#816] add connection info and comment columns to zone model --- irods/manager/zone_manager.py | 11 +++++++++ irods/models.py | 2 ++ irods/test/zone_test.py | 44 ++++++++++++++++++++++++++++++++--- irods/zone.py | 6 +++++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/irods/manager/zone_manager.py b/irods/manager/zone_manager.py index ad96b30fa..53a2f85c3 100644 --- a/irods/manager/zone_manager.py +++ b/irods/manager/zone_manager.py @@ -58,3 +58,14 @@ def zone_report(self): response = conn.recv() logger.debug(response.int_info) return response.get_json_encoded_struct() + + def modify(self, zone_name, attribute, value): + """Modify a zone attribute.""" + if attribute == "connection": + attribute = "conn" # server expects this string + message_body = GeneralAdminRequest("modify", "zone", zone_name, attribute, value) + request = iRODSMessage("RODS_API_REQ", msg=message_body, int_info=api_number["GENERAL_ADMIN_AN"]) + with self.sess.pool.get_connection() as conn: + conn.send(request) + response = conn.recv() + logger.debug(response.int_info) diff --git a/irods/models.py b/irods/models.py index 049aa2d48..5b87bb34d 100644 --- a/irods/models.py +++ b/irods/models.py @@ -49,6 +49,8 @@ class Zone(Model): id = Column(Integer, "ZONE_ID", 101) name = Column(String, "ZONE_NAME", 102) type = Column(String, "ZONE_TYPE", 103) + connection = Column(String, "ZONE_CONNECTION", 104) + comment = Column(String, "ZONE_COMMENT", 105) class User(Model): diff --git a/irods/test/zone_test.py b/irods/test/zone_test.py index 966ecf8bd..2e1049a1d 100644 --- a/irods/test/zone_test.py +++ b/irods/test/zone_test.py @@ -1,15 +1,15 @@ #! /usr/bin/env python -from datetime import datetime as _datetime import os import sys import unittest +from datetime import datetime as _datetime -from irods.models import User, Collection from irods.access import iRODSAccess from irods.collection import iRODSCollection from irods.exception import CollectionDoesNotExist -import irods.test.helpers as helpers +from irods.models import Collection, User, Zone +from irods.test import helpers class TestRemoteZone(unittest.TestCase): @@ -68,6 +68,44 @@ def test_create_common_username_remote_then_local__issue_764(self): if zone: zone.remove() + def test_create_remote_zone_and_update_properties__issue_816(self): + newzone = None + try: + # create new zone + newzonename = "zone816" + newzone = self.sess.zones.create(newzonename, "remote") + + # new values + new_connection = "apples:1247" + new_comment = "zone816 comment 1" + + # modify by method + newzone.modify("connection", new_connection) + newzone.modify("comment", new_comment) + + # confirm via get + refreshed_zone = self.sess.zones.get(newzonename) + self.assertEqual(refreshed_zone.connection, new_connection) + self.assertEqual(refreshed_zone.comment, new_comment) + + # new values again + new_connection = "bananas:1247" + new_comment = "zone816 comment 2" + + # modify by parameter + self.sess.zones.modify(newzonename, "connection", new_connection) + self.sess.zones.modify(newzonename, "conn", new_connection) + self.sess.zones.modify(newzonename, "comment", new_comment) + + # confirm via query + query_zone = self.sess.query(Zone).filter(Zone.name == newzonename).one() + self.assertEqual(query_zone[Zone.connection], new_connection) + self.assertEqual(query_zone[Zone.comment], new_comment) + + finally: + if newzone: + newzone.remove() + if __name__ == "__main__": # let the tests find the parent irods lib diff --git a/irods/zone.py b/irods/zone.py index bd40befe6..a3ee647bd 100644 --- a/irods/zone.py +++ b/irods/zone.py @@ -9,10 +9,16 @@ def __init__(self, manager, result=None): self.id = result[Zone.id] self.name = result[Zone.name] self.type = result[Zone.type] + self.connection = result[Zone.connection] + self.comment = result[Zone.comment] def remove(self): self.manager.remove(self.name) + def modify(self, attribute, value): + """Modify a zone attribute.""" + self.manager.modify(self.name, attribute, value) + def __repr__(self): """Render a user-friendly string representation for the iRODSZone object.""" return "".format(**vars(self))