Commit f959f05b authored by Dannon Baker's avatar Dannon Baker
Browse files

Merge remote-tracking branch 'upstream/release_22.01' into release_22.05

parents 5dc2c4f8 6f6e375b
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -2275,6 +2275,11 @@ $attribute_list::5
    </xs:annotation>
    <xs:attributeGroup ref="AssertAttributeN"/>
    <xs:attributeGroup ref="AssertAttributeNegate"/>
    <xs:attribute name="comment" type="xs:string">
      <xs:annotation>
        <xs:documentation xml:lang="en">Comment character(s) used to skip comment lines (which should not be used for counting columns)</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="AssertHasArchiveMember">
    <xs:annotation>
+24 −23
Original line number Diff line number Diff line
@@ -204,14 +204,15 @@ def administrative_delete_datasets(
    # We really only need the id column here, but sqlalchemy barfs when
    # trying to select only 1 column
    hda_ids_query = sa.select(
        (app.model.HistoryDatasetAssociation.table.c.id, app.model.HistoryDatasetAssociation.table.c.deleted),
        (app.model.HistoryDatasetAssociation.__table__.c.id,
         app.model.HistoryDatasetAssociation.__table__.c.deleted),
        whereclause=and_(
            app.model.Dataset.table.c.deleted == false(),
            app.model.HistoryDatasetAssociation.table.c.update_time < cutoff_time,
            app.model.HistoryDatasetAssociation.table.c.deleted == false(),
        ),
        from_obj=[sa.outerjoin(app.model.Dataset.table, app.model.HistoryDatasetAssociation.table)],
    )
            app.model.Dataset.__table__.c.deleted == false(),
            app.model.HistoryDatasetAssociation.__table__.c.update_time < cutoff_time,
            app.model.HistoryDatasetAssociation.__table__.c.deleted == false()),
        from_obj=[sa.outerjoin(
                  app.model.Dataset.__table__,
                  app.model.HistoryDatasetAssociation.__table__)])

    # Add all datasets associated with Histories to our list
    hda_ids = []
@@ -232,17 +233,19 @@ def administrative_delete_datasets(
    # Process each of the Dataset objects
    for hda_id in hda_ids:
        user_query = sa.select(
            [app.model.HistoryDatasetAssociation.table, app.model.History.table, app.model.User.table],
            whereclause=and_(app.model.HistoryDatasetAssociation.table.c.id == hda_id),
            from_obj=[
                sa.join(app.model.User.table, app.model.History.table).join(app.model.HistoryDatasetAssociation.table)
            ],
            use_labels=True,
        )
            [app.model.HistoryDatasetAssociation.__table__,
             app.model.History.__table__,
             app.model.User.__table__],
            whereclause=and_(
                app.model.HistoryDatasetAssociation.__table__.c.id == hda_id),
            from_obj=[sa.join(app.model.User.__table__,
                              app.model.History.__table__)
                      .join(app.model.HistoryDatasetAssociation.__table__)],
            use_labels=True)
        for result in app.sa_session.execute(user_query):
            user_notifications[result[app.model.User.table.c.email]].append(
                (result[app.model.HistoryDatasetAssociation.table.c.name], result[app.model.History.table.c.name])
            )
            user_notifications[result[app.model.User.__table__.c.email]].append(
                (result[app.model.HistoryDatasetAssociation.__table__.c.name],
                 result[app.model.History.__table__.c.name]))
            deleted_instance_count += 1
            if not info_only and not email_only:
                # Get the HistoryDatasetAssociation objects
@@ -279,12 +282,10 @@ def _get_tool_id_for_hda(app, hda_id):
    # TODO Some datasets don't seem to have an entry in jtod or a copied_from
    if hda_id is None:
        return None
    job = (
        app.sa_session.query(app.model.Job)
        .join(app.model.JobToOutputDatasetAssociation)
        .filter(app.model.JobToOutputDatasetAssociation.table.c.dataset_id == hda_id)
        .first()
    )
    job = app.sa_session.query(app.model.Job).\
        join(app.model.JobToOutputDatasetAssociation).\
        filter(app.model.JobToOutputDatasetAssociation.__table__.c.dataset_id
               == hda_id).first()
    if job is not None:
        return job.tool_id
    else:
+65 −98
Original line number Diff line number Diff line
@@ -222,17 +222,14 @@ def delete_userless_histories(app, cutoff_time, info_only=False, force_retry=Fal
    history_count = 0
    start = time.time()
    if force_retry:
        histories = app.sa_session.query(app.model.History).filter(
            and_(app.model.History.table.c.user_id == null(), app.model.History.update_time < cutoff_time)
        )
        histories = app.sa_session.query(app.model.History) \
                                  .filter(and_(app.model.History.__table__.c.user_id == null(),
                                               app.model.History.update_time < cutoff_time))
    else:
        histories = app.sa_session.query(app.model.History).filter(
            and_(
                app.model.History.table.c.user_id == null(),
                app.model.History.table.c.deleted == false(),
                app.model.History.update_time < cutoff_time,
            )
        )
        histories = app.sa_session.query(app.model.History) \
                                  .filter(and_(app.model.History.__table__.c.user_id == null(),
                                               app.model.History.__table__.c.deleted == false(),
                                               app.model.History.update_time < cutoff_time))
    for history in histories:
        if not info_only:
            log.info("Deleting history id %d", history.id)
@@ -255,23 +252,16 @@ def purge_histories(app, cutoff_time, remove_from_disk, info_only=False, force_r
    history_count = 0
    start = time.time()
    if force_retry:
        histories = (
            app.sa_session.query(app.model.History)
            .filter(and_(app.model.History.table.c.deleted == true(), app.model.History.update_time < cutoff_time))
            .options(joinedload("datasets"))
        )
        histories = app.sa_session.query(app.model.History) \
                                  .filter(and_(app.model.History.__table__.c.deleted == true(),
                                               app.model.History.update_time < cutoff_time)) \
                                  .options(eagerload('datasets'))
    else:
        histories = (
            app.sa_session.query(app.model.History)
            .filter(
                and_(
                    app.model.History.table.c.deleted == true(),
                    app.model.History.table.c.purged == false(),
                    app.model.History.update_time < cutoff_time,
                )
            )
            .options(joinedload("datasets"))
        )
        histories = app.sa_session.query(app.model.History) \
                                  .filter(and_(app.model.History.__table__.c.deleted == true(),
                                               app.model.History.__table__.c.purged == false(),
                                               app.model.History.update_time < cutoff_time)) \
                                  .options(eagerload('datasets'))
    for history in histories:
        log.info("### Processing history id %d (%s)", history.id, unicodify(history.name))
        for dataset_assoc in history.datasets:
@@ -306,17 +296,14 @@ def purge_libraries(app, cutoff_time, remove_from_disk, info_only=False, force_r
    library_count = 0
    start = time.time()
    if force_retry:
        libraries = app.sa_session.query(app.model.Library).filter(
            and_(app.model.Library.table.c.deleted == true(), app.model.Library.table.c.update_time < cutoff_time)
        )
        libraries = app.sa_session.query(app.model.Library) \
                                  .filter(and_(app.model.Library.__table__.c.deleted == true(),
                                               app.model.Library.__table__.c.update_time < cutoff_time))
    else:
        libraries = app.sa_session.query(app.model.Library).filter(
            and_(
                app.model.Library.table.c.deleted == true(),
                app.model.Library.table.c.purged == false(),
                app.model.Library.table.c.update_time < cutoff_time,
            )
        )
        libraries = app.sa_session.query(app.model.Library) \
                                  .filter(and_(app.model.Library.__table__.c.deleted == true(),
                                               app.model.Library.__table__.c.purged == false(),
                                               app.model.Library.__table__.c.update_time < cutoff_time))
    for library in libraries:
        _purge_folder(library.root_folder, app, remove_from_disk, info_only=info_only)
        if not info_only:
@@ -340,20 +327,14 @@ def purge_folders(app, cutoff_time, remove_from_disk, info_only=False, force_ret
    folder_count = 0
    start = time.time()
    if force_retry:
        folders = app.sa_session.query(app.model.LibraryFolder).filter(
            and_(
                app.model.LibraryFolder.table.c.deleted == true(),
                app.model.LibraryFolder.table.c.update_time < cutoff_time,
            )
        )
        folders = app.sa_session.query(app.model.LibraryFolder) \
                                .filter(and_(app.model.LibraryFolder.__table__.c.deleted == true(),
                                             app.model.LibraryFolder.__table__.c.update_time < cutoff_time))
    else:
        folders = app.sa_session.query(app.model.LibraryFolder).filter(
            and_(
                app.model.LibraryFolder.table.c.deleted == true(),
                app.model.LibraryFolder.table.c.purged == false(),
                app.model.LibraryFolder.table.c.update_time < cutoff_time,
            )
        )
        folders = app.sa_session.query(app.model.LibraryFolder) \
                                .filter(and_(app.model.LibraryFolder.__table__.c.deleted == true(),
                                             app.model.LibraryFolder.__table__.c.purged == false(),
                                             app.model.LibraryFolder.__table__.c.update_time < cutoff_time))
    for folder in folders:
        _purge_folder(folder, app, remove_from_disk, info_only=info_only)
        folder_count += 1
@@ -367,36 +348,30 @@ def delete_datasets(app, cutoff_time, remove_from_disk, info_only=False, force_r
    # Marks datasets as deleted if associated items are all deleted.
    start = time.time()
    if force_retry:
        history_dataset_ids_query = sa.select(
            (app.model.Dataset.table.c.id, app.model.Dataset.table.c.state),
            whereclause=app.model.HistoryDatasetAssociation.table.c.update_time < cutoff_time,
            from_obj=[sa.outerjoin(app.model.Dataset.table, app.model.HistoryDatasetAssociation.table)],
        )
        library_dataset_ids_query = sa.select(
            (app.model.LibraryDataset.table.c.id, app.model.LibraryDataset.table.c.deleted),
            whereclause=app.model.LibraryDataset.table.c.update_time < cutoff_time,
            from_obj=[app.model.LibraryDataset.table],
        )
        history_dataset_ids_query = sa.select((app.model.Dataset.__table__.c.id,
                                               app.model.Dataset.__table__.c.state),
                                              whereclause=app.model.HistoryDatasetAssociation.__table__.c.update_time < cutoff_time,
                                              from_obj=[sa.outerjoin(app.model.Dataset.__table__,
                                                                     app.model.HistoryDatasetAssociation.__table__)])
        library_dataset_ids_query = sa.select((app.model.LibraryDataset.__table__.c.id,
                                               app.model.LibraryDataset.__table__.c.deleted),
                                              whereclause=app.model.LibraryDataset.__table__.c.update_time < cutoff_time,
                                              from_obj=[app.model.LibraryDataset.__table__])
    else:
        # We really only need the id column here, but sqlalchemy barfs when trying to select only 1 column
        history_dataset_ids_query = sa.select(
            (app.model.Dataset.table.c.id, app.model.Dataset.table.c.state),
            whereclause=and_(
                app.model.Dataset.table.c.deleted == false(),
                app.model.HistoryDatasetAssociation.table.c.update_time < cutoff_time,
                app.model.HistoryDatasetAssociation.table.c.deleted == true(),
            ),
            from_obj=[sa.outerjoin(app.model.Dataset.table, app.model.HistoryDatasetAssociation.table)],
        )
        library_dataset_ids_query = sa.select(
            (app.model.LibraryDataset.table.c.id, app.model.LibraryDataset.table.c.deleted),
            whereclause=and_(
                app.model.LibraryDataset.table.c.deleted == true(),
                app.model.LibraryDataset.table.c.purged == false(),
                app.model.LibraryDataset.table.c.update_time < cutoff_time,
            ),
            from_obj=[app.model.LibraryDataset.table],
        )
        history_dataset_ids_query = sa.select((app.model.Dataset.__table__.c.id,
                                               app.model.Dataset.__table__.c.state),
                                              whereclause=and_(app.model.Dataset.__table__.c.deleted == false(),
                                                               app.model.HistoryDatasetAssociation.__table__.c.update_time < cutoff_time,
                                                               app.model.HistoryDatasetAssociation.__table__.c.deleted == true()),
                                              from_obj=[sa.outerjoin(app.model.Dataset.__table__,
                                                                     app.model.HistoryDatasetAssociation.__table__)])
        library_dataset_ids_query = sa.select((app.model.LibraryDataset.__table__.c.id,
                                               app.model.LibraryDataset.__table__.c.deleted),
                                              whereclause=and_(app.model.LibraryDataset.__table__.c.deleted == true(),
                                                               app.model.LibraryDataset.__table__.c.purged == false(),
                                                               app.model.LibraryDataset.__table__.c.update_time < cutoff_time),
                                              from_obj=[app.model.LibraryDataset.__table__])
    deleted_dataset_count = 0
    deleted_instance_count = 0
    skip = []
@@ -469,22 +444,16 @@ def purge_datasets(app, cutoff_time, remove_from_disk, info_only=False, force_re
    disk_space = 0
    start = time.time()
    if force_retry:
        datasets = app.sa_session.query(app.model.Dataset).filter(
            and_(
                app.model.Dataset.table.c.deleted == true(),
                app.model.Dataset.table.c.purgable == true(),
                app.model.Dataset.table.c.update_time < cutoff_time,
            )
        )
        datasets = app.sa_session.query(app.model.Dataset) \
                                 .filter(and_(app.model.Dataset.__table__.c.deleted == true(),
                                              app.model.Dataset.__table__.c.purgable == true(),
                                              app.model.Dataset.__table__.c.update_time < cutoff_time))
    else:
        datasets = app.sa_session.query(app.model.Dataset).filter(
            and_(
                app.model.Dataset.table.c.deleted == true(),
                app.model.Dataset.table.c.purgable == true(),
                app.model.Dataset.table.c.purged == false(),
                app.model.Dataset.table.c.update_time < cutoff_time,
            )
        )
        datasets = app.sa_session.query(app.model.Dataset) \
                                 .filter(and_(app.model.Dataset.__table__.c.deleted == true(),
                                              app.model.Dataset.__table__.c.purgable == true(),
                                              app.model.Dataset.__table__.c.purged == false(),
                                              app.model.Dataset.__table__.c.update_time < cutoff_time))
    for dataset in datasets:
        file_size = dataset.file_size
        _purge_dataset(app, dataset, remove_from_disk, info_only=info_only)
@@ -554,14 +523,12 @@ def _delete_dataset(dataset, app, remove_from_disk, info_only=False, is_deletabl
        metadata_files = []
        # lets create a list of metadata files, then perform actions on them
        for hda in dataset.history_associations:
            for metadata_file in app.sa_session.query(app.model.MetadataFile).filter(
                app.model.MetadataFile.table.c.hda_id == hda.id
            ):
            for metadata_file in app.sa_session.query(app.model.MetadataFile) \
                                               .filter(app.model.MetadataFile.__table__.c.hda_id == hda.id):
                metadata_files.append(metadata_file)
        for ldda in dataset.library_associations:
            for metadata_file in app.sa_session.query(app.model.MetadataFile).filter(
                app.model.MetadataFile.table.c.lda_id == ldda.id
            ):
            for metadata_file in app.sa_session.query(app.model.MetadataFile) \
                                               .filter(app.model.MetadataFile.__table__.c.lda_id == ldda.id):
                metadata_files.append(metadata_file)
        for metadata_file in metadata_files:
            op_description = "marked as deleted"