Example #1
0
def download_files(cmdfile):
    dds_client = DukeDSClient()
    download_list = DownloadList(cmdfile)
    items = download_list.items()
    click.echo("Downloading {} files.".format(len(items)))
    for key, dest in items:
        click.echo("Downloading file {} to {}.".format(key, dest))
        dds_file = dds_client.get_file_by_id(file_id=key)
        dds_file.download_to_path(dest)
Example #2
0
def main():
  project_id = '20c1b14c-91c6-4a30-ab5e-aec4d632ee65'
  client = Client()
  project_name = get_project_name(client, project_id)
  z = build_zip(client, project_id)
  with open('{}.zip'.format(project_name), 'wb') as f:
    for data in z:
      print('WRITE {}'.format(len(data)))
      f.write(data)
Example #3
0
def make_client(user):
    try:
        dds_credential = DDSUserCredential.objects.get(user=user)
        config = get_dds_config_for_credentials(dds_credential)
        return Client(config=config)
    except DDSUserCredential.DoesNotExist:
        # No DDSUserCredential configured for this user, fall back to OAuth
        # May raise an OAuthConfigurationException
        endpoint = get_default_dds_endpoint()
        config = Config()
        config.update_properties({
            Config.URL: endpoint.api_root,
        })
        authentication_service_id = endpoint.openid_provider_service_id

        def create_data_service_auth(config, set_status_msg=print):
            return CustomOAuthDataServiceAuth(user, authentication_service_id, config, set_status_msg=set_status_msg)

        return Client(config=config, create_data_service_auth=create_data_service_auth)
Example #4
0
def download(project_id):
  client = Client() # This assumes it can authenticate
  project_name = get_project_name(client, project_id)
  def generate():
    z = build_zip(client, project_id)
    for chunk in z:
      print('WRITE {}'.format(len(chunk)))
      yield chunk
  response = Response(generate(), mimetype='application/zip')
  response.headers['Content-Disposition'] = 'attachment; filename={}'.format('{}.zip'.format(project_name))
  print('RESPOND')
  return response
Example #5
0
class DDSFileUtil(object):
    def __init__(self):
        self.client = Client()

    def find_file_for_path(self, duke_ds_file_path):
        project_name, file_path = self.get_project_name_and_file_path(
            duke_ds_file_path)
        project = self.find_project_for_name(project_name)
        if project:
            try:
                return project.get_child_for_path(file_path)
            except ItemNotFound:
                raise FileDoesNotExistException(
                    "File does not exist: {}".format(duke_ds_file_path))
        else:
            raise ProjectDoesNotExistException(
                "Project does not exist: {}".format(duke_ds_file_path))

    @staticmethod
    def get_project_name_and_file_path(duke_ds_file_path):
        if not duke_ds_file_path.startswith(PATH_PREFIX):
            raise InvalidFilePathException("{}: {}".format(
                DUKEDS_FILE_PATH_MISSING_PREFIX, duke_ds_file_path))
        path = duke_ds_file_path.replace(PATH_PREFIX, '', 1)
        path_parts = path.split(os.sep)
        if len(path_parts) < 2:
            raise InvalidFilePathException("{}: {}".format(
                DUKEDS_FILE_PATH_MISSING_SLASH, duke_ds_file_path))
        project_name = path_parts[0]
        file_path = path.replace('{}/'.format(project_name), '', 1)
        return project_name, file_path

    def find_project_for_name(self, project_name):
        for project in self.client.get_projects():
            if project.name == project_name:
                return project
        return None

    def give_download_permissions(self, project_id, dds_user_id):
        self.client.dds_connection.data_service.set_user_project_permission(
            project_id, dds_user_id, auth_role='file_downloader')
Example #6
0
 def __init__(self, cmdfile):
     self.settings = Settings(cmdfile)
     self.dds_client = DukeDSClient()
     self.dds_config = self.dds_client.dds_connection.config
Example #7
0
class UploadUtil(object):
    def __init__(self, cmdfile):
        self.settings = Settings(cmdfile)
        self.dds_client = DukeDSClient()
        self.dds_config = self.dds_client.dds_connection.config

    def get_or_create_project(self):
        """
        Find or create a project with the name self.settings.destination
        :return: ddsc.sdk.client.Project
        """
        project_name = self.settings.destination
        for project in self.dds_client.get_projects():
            if project.name == project_name:
                return project
        return self.dds_client.create_project(project_name,
                                              description=project_name)

    def upload_files(self, project):
        """
        Upload files from local paths to the specified project
        :param project: ddsc.sdk.client.Project: project to upload files to
        :return: UploadedFileInfo: contains details about uploaded files
        """
        project_upload = ProjectUpload(
            self.dds_config,
            ProjectNameOrId.create_from_project_id(project.id),
            self.settings.paths)
        click.echo(project_upload.get_differences_summary())
        if project_upload.needs_to_upload():
            click.echo("Uploading")
            project_upload.run()
        return UploadedFilesInfo(project_upload.local_project)

    def create_provenance_activity(self, uploaded_files_info):
        """
        Create a provenance activity in DukeDS API for our project.
        :param uploaded_files_info: UploadedFilesInfo: contains details about uploaded files
        """
        activity = DukeDSActivity(self.dds_client, self.settings,
                                  uploaded_files_info)
        activity.create()

    def share_project(self, project):
        """
        Share the specified project with some users.
        :param project: ddsc.sdk.client.Project: project to share
        """
        remote_store = RemoteStore(self.dds_config)
        remote_project = remote_store.fetch_remote_project_by_id(project.id)
        d4s2_project = D4S2Project(self.dds_config,
                                   remote_store,
                                   print_func=print)
        for dds_user_id in self.settings.share_dds_user_ids:
            d4s2_project.share(remote_project,
                               remote_store.fetch_user(dds_user_id),
                               force_send=True,
                               auth_role=self.settings.share_auth_role,
                               user_message=self.settings.share_user_message)

    def create_annotate_project_details_script(self, project, outfile):
        """
        Create a script to annotat a pod with details about the uploaded project
        :param project: ddsc.sdk.client.Project: project to share
        :param outfile: output file to write script into
        """
        readme_file = project.get_child_for_path(
            self.settings.readme_file_path)
        click.echo(
            "Writing annotate project details script project_id:{} readme_file_id:{} to {}"
            .format(project.id, readme_file.id, outfile.name))
        contents = "kubectl annotate pod $MY_POD_NAME " \
                   "project_id={} readme_file_id={}".format(project.id, readme_file.id)
        outfile.write(contents)
        outfile.close()

    def create_json_project_details_file(self, project, outfile):
        readme_file = project.get_child_for_path(
            self.settings.readme_file_path)
        click.echo(
            "Writing JSON project details project_id:{} readme_file_id:{} to {}"
            .format(project.id, readme_file.id, outfile.name))
        outfile.write(
            json.dumps({
                "project_id": project.id,
                "readme_file_id": readme_file.id
            }))
Example #8
0
 def __init__(self):
     self.client = Client()