1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
from irods.models import Resource
from irods.manager import Manager
from irods.message import GeneralAdminRequest, iRODSMessage
from irods.exception import ResourceDoesNotExist, NoResultFound, OperationNotSupported
from irods.api_number import api_number
from irods.resource import iRODSResource
import logging
logger = logging.getLogger(__name__)
class ResourceManager(Manager):
@staticmethod
def serialize(context):
if isinstance(context, dict):
return ";".join(
"{}={}".format(key, value) for (key, value) in list(context.items())
)
return context
def get(self, name, zone=""):
query = self.sess.query(Resource).filter(Resource.name == name)
if len(zone) > 0:
query = query.filter(Resource.zone_name == zone)
try:
result = query.one()
except NoResultFound:
raise ResourceDoesNotExist()
return iRODSResource(self, result)
def create(
self,
name,
resource_type,
host="EMPTY_RESC_HOST",
path="EMPTY_RESC_PATH",
context="",
zone="",
resource_class="",
):
with self.sess.pool.get_connection() as conn:
# check server version
if conn.server_version < (4, 0, 0):
# make resource, iRODS 3 style
message_body = GeneralAdminRequest(
"add",
"resource",
name,
resource_type,
resource_class,
host,
path,
zone,
)
else:
message_body = GeneralAdminRequest(
"add",
"resource",
name,
resource_type,
host + ":" + path,
self.serialize(context),
zone,
)
request = iRODSMessage(
"RODS_API_REQ",
msg=message_body,
int_info=api_number["GENERAL_ADMIN_AN"],
)
conn.send(request)
response = conn.recv()
self.sess.cleanup()
# close connections to get new agents with up to
# date resource manager
logger.debug(response.int_info)
return self.get(name, zone)
def remove(self, name, test=False):
if test:
mode = "--dryrun"
else:
mode = ""
message_body = GeneralAdminRequest("rm", "resource", name, mode)
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()
self.sess.cleanup()
# close connections to get new agents with up to
# date resource manager
logger.debug(response.int_info)
def modify(self, name, attribute, value):
with self.sess.pool.get_connection() as conn:
message_body = GeneralAdminRequest(
"modify", "resource", name, attribute, self.serialize(value)
)
request = iRODSMessage(
"RODS_API_REQ",
msg=message_body,
int_info=api_number["GENERAL_ADMIN_AN"],
)
conn.send(request)
response = conn.recv()
self.sess.cleanup()
logger.debug(response.int_info)
return self.get(name)
def add_child(self, parent, child, context=""):
with self.sess.pool.get_connection() as conn:
# check server version
if conn.server_version < (4, 0, 0):
# No resource hierarchies before iRODS 4
raise OperationNotSupported
message_body = GeneralAdminRequest(
"add", "childtoresc", parent, child, context
)
request = iRODSMessage(
"RODS_API_REQ",
msg=message_body,
int_info=api_number["GENERAL_ADMIN_AN"],
)
conn.send(request)
response = conn.recv()
self.sess.cleanup()
# close connections to get new agents with up to
# date resource manager
logger.debug(response.int_info)
def remove_child(self, parent, child):
with self.sess.pool.get_connection() as conn:
# check server version
if conn.server_version < (4, 0, 0):
# No resource hierarchies before iRODS 4
raise OperationNotSupported
message_body = GeneralAdminRequest("rm", "childfromresc", parent, child)
request = iRODSMessage(
"RODS_API_REQ",
msg=message_body,
int_info=api_number["GENERAL_ADMIN_AN"],
)
conn.send(request)
response = conn.recv()
self.sess.cleanup()
# close connections to get new agents with up to
# date resource manager
logger.debug(response.int_info)
|