Beispiel #1
0
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 []
Beispiel #2
0
    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 _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