Ejemplo n.º 1
0
    def add_site(self, args):
        """
        Add a site to the database.

        :param args: parser arguments
        :return: None
        """
        token = UserCommand._get_token(args.token)
        if token:
            site_info = {
                key: value
                for (key, value) in vars(args).iteritems()
                if value is not None and key not in ('func', 'token', 'config',
                                                     'verbosity',
                                                     'service_ca_cert',
                                                     'user_ca_cert')
            }
            if args.user_ca_cert:
                user_cert = UserCommand._get_cert(args.user_ca_cert)
                if user_cert:
                    site_info['user_ca_cert'] = user_cert
                else:
                    return None
            if args.service_ca_cert:
                service_cert = UserCommand._get_cert(args.service_ca_cert)
                if service_cert:
                    site_info['service_ca_cert'] = service_cert
                else:
                    return None
            print site_info
            site_client = SiteClient()
            site_client.set_token(token)
            site_client.add_site(site_info)
        return None
Ejemplo n.º 2
0
 def _get_site_id(name, token):
     site_client = SiteClient()
     site_client.set_token(token)
     sitelist = site_client.get_sites()
     site_id = [
         elem['site_id'] for elem in sitelist if elem['site_name'] == name
     ]
     if site_id:
         return site_client, site_id[0]
     return site_client, None
Ejemplo n.º 3
0
    def _get_site_name(site_id, token):
        """
        Get site name from site id. Requires a token. If site name cannot be resolved an
        empty string is returned.

        :param site_id: site id
        :param token: user token
        :return: site name
        """
        site_name = 'Unknown'
        if token and site_id is not None:
            _site_client = SiteClient()
            _site_client.set_token(token)
            site_name = _site_client.get_site(site_id)['site_name']
        return site_name
Ejemplo n.º 4
0
class TransferClient(object):
    """
    Transfer management client API. To list, copy and remove files from remote site.
    """
    def __init__(self, user_token):
        """
        Constructor initialises all service clients involved in the transfer management:
        EndpointService, CredService and finally the WorkqueueService.

        :param user_token: user token
        """

        self.__user_token = user_token
        # endpoint
        self.__site_client = SiteClient()
        self.__site_client.set_token(user_token)
        self.__sitelist = self.__site_client.get_sites()
        # get user id
        self.__user_id = HRService.get_token_userid(user_token)
        # work queue client
        self.__wq_client = WorkqueueClient()
        self.__wq_client.set_token(user_token)

    def list(self, src_site, src_filepath, **kwargs):
        """
        List a given path. As for all client calls it need a user token set in a request beforehand.

        Args:
            src_site (string): The name of the site containing the path to be listed.
            src_filepath (str): The path to list.
            kwargs: keyword arguments containing: protocol, max_tries and priority
        Returns:
            dict: The Python dictionary representing the list of files.
        """
        # sort out the site ID first:
        src_siteid = [
            elem['site_id'] for elem in self.__sitelist
            if elem['site_name'] == src_site
        ]
        if src_siteid:
            response = self.__wq_client.list(src_siteid[0], src_filepath,
                                             **kwargs)
            # max_tries, priority, protocol=JobProtocol.GRIDFTP)
            return response
        return src_siteid  # an empty list

    def output(self, job_id, element_id=None, attempt=None):
        """
        Get job output.

        :param job_id: job id
        :return: output as specified by workqueue client
        """
        response = self.__wq_client.output(job_id,
                                           element_id=element_id,
                                           attempt=attempt)
        return response

    def status(self, job_id, element_id=None):
        """
        Return status of a job.

        :param job_id: job id to get the status of.
        :return: forward response from :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.status`.
        """
        response = self.__wq_client.status(job_id, element_id)
        return response

    def list_sites(self):
        """
        Get list of sites.

        :return: list of dictionaries with all keys but 'site_id'.
        """
        filtered_sites = deepcopy(self.__sitelist)
        for elem in filtered_sites:
            elem.pop('site_id', None)
        return filtered_sites

    def copy(
            self,
            src_site,
            src_filepath,
            dst_site,  # pylint: disable=too-many-arguments
            dst_filepath,
            **kwargs):
        """
        Copy files between sites.

        :param src_site: source site
        :param src_filepath: source site path
        :param dst_site: destination site
        :param dst_filepath: destination site path
        :param kwargs: * max_tries: maximum number of attempts
                       * priority: priority
                       * protocol: protocol used,  see: :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.copy`
        :return: forward response from :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.copy`
         or *None* if either of the sites exists.
        """

        src_siteid = [
            elem['site_id'] for elem in self.__sitelist
            if elem['site_name'] == src_site
        ]
        dst_siteid = [
            elem['site_id'] for elem in self.__sitelist
            if elem['site_name'] == dst_site
        ]

        if not (src_siteid and dst_siteid):
            return None

        response = self.__wq_client.copy(
            src_siteid[0],
            src_filepath,
            dst_siteid[0],
            # pylint: disable=too-many-arguments
            dst_filepath,
            **kwargs)

        return response

    def remove(self, src_site, src_filepath, **kwargs):
        """
        Remove files from a given site.

        :param src_site: the site to contact
        :param src_filepath: the path to be removed
        :param kwargs: * max_tries: maximum number of attempts
                       * priority: priority
                       * protocol: protocol used
        :return: forward response from :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.remove`
         or *None* if the source site does not exist.
        """

        src_siteid = [
            elem['site_id'] for elem in self.__sitelist
            if elem['site_name'] == src_site
        ]

        if not src_siteid:
            return None

        response = self.__wq_client.remove(
            src_siteid[0],
            src_filepath,
            # pylint: disable=too-many-arguments
            **kwargs)
        return response

    def mkdir(self, site, dirpath, **kwargs):
        """
        Create a new directory at a site.

        :param site:  site name
        :param dirpath: directory path
        :param kwargs: * max_tries: maximum number of attempts
                       * priority: priority
                       * protocol: protocol used,\
                         see: :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.copy`
        :return: forward response from :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.mkdir`
         or *None* if the site does not exist.
        """

        src_siteid = [
            elem['site_id'] for elem in self.__sitelist
            if elem['site_name'] == site
        ]
        if not src_siteid:
            return None

        response = self.__wq_client.mkdir(
            src_siteid[0],
            dirpath,
            # pylint: disable=too-many-arguments
            **kwargs)
        return response

    def rename(self, site, oldname, newname, **kwargs):
        """
        Rename a file or directory within site.

        :param site: site name
        :param oldname: old file name
        :param newname: new file name
        :param kwargs: * max_tries: maximum number of attempts
                       * priority: priority
                       * protocol: protocol used
        :return: forward response from :func:`pdm.workqueue.WorkqueueClient.WorkqueueClient.rename`
         or *None* if the site does not exist.
        """

        src_siteid = [
            elem['site_id'] for elem in self.__sitelist
            if elem['site_name'] == site
        ]
        if not src_siteid:
            return None

        response = self.__wq_client.rename(src_siteid[0], oldname, newname,
                                           **kwargs)

        return response

    def jobs(self):
        """
        Get user jobs' info.

        :return: forwarded response from \
        :func:`WorkqueueClient.jobs() <pdm.workqueue.WorkqueueClient.WorkqueueClient.jobs>`.
        """
        response = self.__wq_client.jobs()
        return response

    def elements(self, job_id):
        """
        Get job elements information.

        :param job_id: job id
        :return: forwarded response from \
        :func:`WorkqueueClient.jobs() <pdm.workqueue.WorkqueueClient.WorkqueueClient.jobs>`.
        """

        response = self.__wq_client.elements(job_id)
        return response