def _post_experiment(self, experiment, site_owners, site_settings): uid = self.generate_exp_uid(experiment) url = site_settings['url'] username = site_settings['username'] password = site_settings['password'] protocol = site_settings['fileProtocol'] # Create the form with simple fields mpform = MultiPartForm() mpform.add_field('username', username) mpform.add_field('password', password) mpform.add_field('from_url', settings.MYTARDIS_SITE_URL) mpform.add_field('originid', uid) for owner in site_owners: mpform.add_field('experiment_owner', owner) # export METS file filename = 'mets_expid_%i_%s' % (experiment.id, protocol) logger.debug('=== extracting mets file for experiment %s ' % uid) from tardis.tardis_portal.metsexporter import MetsExporter exporter = MetsExporter() if protocol: # translate vbl:// into tardis:// url for datafiles metsfile = exporter.export(experimentId=experiment.id, replace_protocols={'vbl': protocol}, filename=filename, export_images=False) else: metsfile = exporter.export(experimentId=experiment.id, filename=filename, export_images=False) logger.debug('=== extraction done, filename = %s' % metsfile) f = open(metsfile, "r") mpform.add_file('xmldata', 'METS.xml', fileHandle=f) body = str(mpform) logger.debug('about to send register request to site %s' % url) # build the request headers = { 'User-agent': 'MyTardis', 'Content-type': mpform.get_content_type(), } # This should be made into a background task. # Or rather- the processing on the other end should be. h = Http(timeout=9999, disable_ssl_certificate_validation=True) h.force_exception_to_status_code = True resp, content = h.request(url, 'POST', headers=headers, body=body) f.close() if resp.status != 200: logger.error('Posting experiment to %s failed:' % url) logger.error('%s: %s' % (resp.status, resp.reason)) logger.debug('SERVER RESPONSE: ' + content) return False return True
def _register_file_transfer(request, cleaned_data, expid): """ ingests meta-data and transfers data to experiment owner's mytardis instance at the home institute :keyword request: Django request :keyword cleaned_data: cleaned form data :keyword expid: id of experiment to be transfered """ # sites which will receive a copy of the data sites = [] # check if the experiment exists locally at all try: experiment = models.Experiment.objects.get(pk=expid) except models.Experiment.DoesNotExist: logger.error('experiment %i does not exist' % expid) return # register at home institute owners = re.compile(r'\s+').split(cleaned_data['experiment_owner']) for owner in owners: if owner == '': continue # get list of site from master tardis instance (Monash) # TODO: might be better to store these sites in Django's # sites table! url = settings.MYTARDIS_SITES_URL logger.debug('fetching mytardis sites from %s' % url) try: sites_username = settings.MYTARDIS_SITES_USERNAME sites_password = settings.MYTARDIS_SITES_PASSWORD except AttributeError: # maybe we get the site list from a file... sites_username = '' sites_password = '' # username and password must be set if another site is contacted sp = SiteParser(url, sites_username, sites_password) # loop over sites for name in sp.getSiteNames(): url = sp.getSiteSettingsURL(name) # fetch a MyTARDIS site's config logger.debug('fetching site config for %s from %s' % (name, url)) try: ssp = SiteSettingsParser(url, sp.getSiteSettingsUsername(name), sp.getSiteSettingsPassword(name)) except: logger.exception('fetching site config from %s FAILED' % url) continue # is the email domain of the experiment's owner registered # by any site? siteOwners = [] for owner in owners: for domain in ssp.getEmailEndswith(): if owner.endswith(domain): siteOwners.append(owner) # register meta-data and file transfer request at another # MyTARDIS instance if siteOwners: # Create the form with simple fields mpform = MultiPartForm() mpform.add_field('username', ssp.getRegisterSetting('username')) mpform.add_field('password', ssp.getRegisterSetting('password')) mpform.add_field('from_url', request.build_absolute_uri()) mpform.add_field('originid', str(expid)) for siteOwner in siteOwners: mpform.add_field('experiment_owner', siteOwner) protocol = ssp.getRegisterSetting('fileProtocol') # export METS file filename = 'mets_expid_%i_%s' % (experiment.id, protocol) logger.debug('=== extracting mets file for experiment %i ' % expid) from tardis.tardis_portal.metsexporter import MetsExporter exporter = MetsExporter() if protocol: # translate vbl:// into tardis:// url for datafiles metsfile = exporter.export(experimentId=experiment.id, replace_protocols={'vbl': protocol}, filename=filename, export_images=False) else: metsfile = exporter.export(experimentId=experiment.id, filename=filename, export_images=False) logger.debug('=== extraction done, filename = %s' % metsfile) f = open(metsfile, "r") mpform.add_file('xmldata', 'METS.xml', fileHandle=f) ws = ssp.getRegisterSetting('url') logger.debug('about to send register request to site %s' % ws) # build the request requestmp = urllib2.Request(ws) requestmp.add_header('User-agent', 'PyMOTW (http://www.doughellmann.com/PyMOTW/)') body = str(mpform) requestmp.add_header('Content-type', mpform.get_content_type()) requestmp.add_header('Content-length', len(body)) # logger.debug('OUTGOING DATA: ' + body) logger.debug('SERVER RESPONSE: ' + urllib2.urlopen(requestmp, body, 99999).read()) f.close() sites.append(url) # return a list of registered sites return sites return []