Skip to content

Instantly share code, notes, and snippets.

@dpwrussell
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dpwrussell/6aa271b5c88a106c6f4a to your computer and use it in GitHub Desktop.
Save dpwrussell/6aa271b5c88a106c6f4a to your computer and use it in GitHub Desktop.
Working graph test
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