Last active
August 29, 2015 14:03
-
-
Save dpwrussell/6aa271b5c88a106c6f4a to your computer and use it in GitHub Desktop.
Working graph test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from omero.gateway import BlitzGateway | |
from omero.sys import Parameters, ParametersI | |
from omero.model import * | |
from omero.rtypes import * | |
from omero import ValidationException | |
import ConfigParser | |
from omero.model import ExperimenterI, ProjectI, DatasetI, ImageI, \ | |
ScreenI, PlateI, \ | |
ProjectDatasetLinkI, DatasetImageLinkI, \ | |
ScreenPlateLinkI | |
# OMERO Detail Config | |
omero_details = '/Users/dpwrussell/Checkout/Gists/omero_basics/omero_details.cfg' | |
config = ConfigParser.RawConfigParser() | |
config.read(omero_details) | |
HOST = config.get('OMERODetails', 'host') | |
PORT = config.getint('OMERODetails', 'port') | |
USERNAME = config.get('OMERODetails', 'username') | |
PASSWORD = config.get('OMERODetails', 'password') | |
conn = BlitzGateway(USERNAME, PASSWORD, host=HOST, port=PORT) | |
connected = conn.connect() | |
params = ParametersI() | |
if not connected: | |
import sys | |
sys.stderr.write("Error: Connection not available, please check your user name and password.\n") | |
sys.exit(1) | |
images = [x._obj for x in conn.getObjects('Image')] | |
print('Images remaining: ', len(images)) | |
# datasetId = datasetObj.getId().getValue() | |
stop = False | |
other_group_id = 3 | |
def mkP(name): | |
project = ProjectI() | |
project.setName(rstring(name)) | |
return conn.getUpdateService().saveAndReturnObject(project) | |
def mkD(name): | |
dataset = DatasetI() | |
dataset.setName(rstring(name)) | |
return conn.getUpdateService().saveAndReturnObject(dataset) | |
def lnk(x, y): | |
if isinstance(x, ProjectI): | |
if isinstance(y, DatasetI): | |
link = ProjectDatasetLinkI() | |
elif isinstance(x, DatasetI): | |
if isinstance(y, ImageI): | |
link = DatasetImageLinkI() | |
link.setParent(x) | |
link.setChild(y) | |
conn.getUpdateService().saveObject(link) | |
def rm(x): | |
if isinstance(x[0], ProjectI): | |
t = 'Project' | |
elif isinstance(x[0], DatasetI): | |
t = 'Dataset' | |
elif isinstance(x[0], ImageI): | |
t = 'Image' | |
handle = conn.deleteObjects(t, [i.getId().getValue() for i in x], True, False) | |
conn._waitOnCmd(handle) | |
def cg(x, cid=None): | |
if isinstance(x[0], ProjectI): | |
t = 'Project' | |
elif isinstance(x[0], DatasetI): | |
t = 'Dataset' | |
elif isinstance(x[0], ImageI): | |
t = 'Image' | |
handle = conn.chgrpObjects(t, [i.getId().getValue() for i in x], other_group_id, cid) | |
conn._waitOnCmd(handle) | |
def get(x): | |
if isinstance(x, ProjectI): | |
t = 'Project' | |
elif isinstance(x, DatasetI): | |
t = 'Dataset' | |
elif isinstance(x, ImageI): | |
t = 'Image' | |
return conn.getObject(t, x.getId().getValue()) | |
def getpriass(**kwargs): | |
for k, v in kwargs.iteritems(): | |
val = get(v) | |
print(k, val) | |
if stop: | |
assert(val == None) | |
print('---------') | |
# Clean up Containers | |
def cleanup(): | |
# Doing this from the gateway is a complete pigs ear so fall back on HQL | |
eid = conn.getUser().getId() | |
params = omero.sys.ParametersI() | |
params.add('eid', rlong(eid)) | |
qs = conn.getQueryService() | |
# Unlink all images | |
q = """ | |
from DatasetImageLink dilink | |
where dilink.details.owner.id = :eid | |
""" | |
res = qs.findAllByQuery(q, params, conn.SERVICE_OPTS) | |
for r in res: | |
conn.deleteObjectDirect(r) | |
# Remove all datasets | |
q = """ | |
from Dataset dataset | |
where dataset.details.owner.id = :eid | |
""" | |
res = qs.findAllByQuery(q, params, conn.SERVICE_OPTS) | |
for r in res: | |
conn.deleteObjectDirect(r) | |
# Remove all projects | |
q = """ | |
from Project project | |
where project.details.owner.id = :eid | |
""" | |
res = qs.findAllByQuery(q, params, conn.SERVICE_OPTS) | |
for r in res: | |
conn.deleteObjectDirect(r) | |
group = conn.getGroupFromContext() | |
print "Current group: ", group.getName(), group.getId() | |
conn.SERVICE_OPTS.setOmeroGroup(group.getId()) | |
omerogroup = conn.SERVICE_OPTS.getOmeroGroup() | |
print "OMERO group: ", omerogroup | |
print('\n\n') | |
# If not using cleanup at the start and stopping on errors, images will be | |
# reused between runs which have already been put into a container hierarchy | |
# This can lead to an unexpected failure. | |
# Beware that cleanup removes all DatsetImageLinks, Datasets and Projects | |
# that belong to the current user in the current group. | |
# cleanup() | |
# P1->D1 | |
# Delete P1 | |
# P1 is deleted, D1 becomes an orphan. FAIL | |
p1 = mkP('P1') | |
d1 = mkD('D1') | |
lnk(p1, d1) | |
rm([p1]) | |
getpriass(p1=p1, d1=d1) | |
# P1->D1 | |
# P2->D1 | |
# Delete P1 | |
# D1 is not deleted and link P2->D1 remains. FAIL | |
p1 = mkP('P1') | |
p2 = mkP('P2') | |
d1 = mkD('D1') | |
lnk(p1, d1) | |
lnk(p2, d1) | |
rm([p1]) | |
getpriass(p1=p1, d1=d1) | |
# P1->D1->I1 | |
# P2->D1->I1 | |
# Delete P1 | |
# D1 is not deleted, link P2->D1 remains, but I1 is deleted. FAIL | |
p1 = mkP('P1') | |
p2 = mkP('P2') | |
d1 = mkD('D1') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(p2, d1) | |
lnk(d1, i1) | |
rm([p1]) | |
getpriass(p1=p1, d1=d1, i1=i1) | |
# P1->D1->I1 | |
# P2->D1->I1 | |
# Delete D1 | |
# I1 is deleted. OK | |
p1 = mkP('P1') | |
p2 = mkP('P2') | |
d1 = mkD('D1') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(p2, d1) | |
lnk(d1, i1) | |
rm([d1]) | |
getpriass(d1=d1, i1=i1) | |
# D1->I1 | |
# D2->I1 | |
# Delete D1 | |
# Exception is thrown: FAIL - For some reason not throwing exception here | |
# but does from webclient and it looks exactly the same!?! | |
d1 = mkD('D1') | |
d2 = mkD('D2') | |
i1 = images.pop() | |
lnk(d1, i1) | |
lnk(d2, i1) | |
try: | |
rm([d1]) | |
except Exception as e: | |
print(e) | |
if stop: | |
raise(e) | |
getpriass(d1=d1, i1=i1) | |
# D1->I1 | |
# ChGrp D1 | |
# D1 Hierarchy moved entirely: OK | |
d1 = mkD('D1') | |
i1 = images.pop() | |
lnk(d1, i1) | |
cg([d1]) | |
getpriass(d1=d1, i1=i1) | |
# P1->D1->I1 | |
# ChGrp P1 | |
# P1 : FAIL: Except that it does not fail in the webclient!!?? | |
p1 = mkP('P1') | |
d1 = mkD('D1') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(d1, i1) | |
cg([p1]) | |
getpriass(p1=p1, d1=d1, i1=i1) | |
# D1->I1 | |
# D2->I1 | |
# ChGrp D1 | |
# Exception (1): FAIL. Good to see that something fails the same | |
d1 = mkD('D1') | |
d2 = mkD('D2') | |
i1 = images.pop() | |
lnk(d1, i1) | |
lnk(d2, i1) | |
try: | |
cg([d1]) | |
except omero.CmdError, e: | |
print('Exception thrown') | |
if stop: | |
print(e.err) | |
exit(1) | |
getpriass(d1=d1, i1=i1) | |
# P1->D1->I1 | |
# D2->I1 | |
# ChGrp P1 | |
# P1 moved, Image moved but orphaned, D1 not moved and orphaned: FAIL. Again | |
# differet from webclient, this time, image is not moved either. | |
p1 = mkP('P1') | |
d1 = mkD('D1') | |
d2 = mkD('D2') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(d1, i1) | |
lnk(d2, i1) | |
cg([p1]) | |
getpriass(p1=p1, d1=d1, i1=i1) | |
# P1->D1->I1 | |
# P2->D1->I1 | |
# ChGrp D1 | |
# D1 Hierarchy moved entirely: OK | |
p1 = mkP('P1') | |
p2 = mkP('P2') | |
d1 = mkD('D1') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(p2, d1) | |
lnk(d1, i1) | |
cg([d1]) | |
getpriass(d1=d1, i1=i1) | |
# P1->D1->I1 | |
# P2->D1->I1 | |
# ChGrp P1 | |
# P1 moved, Image moved but orphaned, D1 not moved, but not orphaned as in P2: FAIL | |
# Different from webclient, image not moved either here. | |
p1 = mkP('P1') | |
p2 = mkP('P2') | |
d1 = mkD('D1') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(p2, d1) | |
lnk(d1, i1) | |
cg([p1]) | |
getpriass(p1=p1, d1=d1, i1=i1) | |
# P1->D1 | |
# P2->D1 | |
# ChGrp P1 | |
# P1 moved, D1 not moved, but not orphaned as in P2: FAIL | |
p1 = mkP('P1') | |
p2 = mkP('P2') | |
d1 = mkD('D1') | |
lnk(p1, d1) | |
lnk(p2, d1) | |
cg([p1]) | |
getpriass(p1=p1, d1=d1) | |
# P1->D1->I1 | |
# P1->D2->I1 | |
# ChGrp P1 | |
# P1 Hierarchy moved entirely: OK. Not ok here, fails. p1 is moved but nothing | |
# else | |
p1 = mkP('P1') | |
d1 = mkD('D1') | |
d2 = mkD('D2') | |
i1 = images.pop() | |
lnk(p1, d1) | |
lnk(p1, d2) | |
lnk(d1, i1) | |
lnk(d2, i1) | |
cg([p1]) | |
getpriass(p1=p1, d1=d1, d2=d2, i1=i1) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment