Merge pull request #14746 from jmchilton/installed_repository_manager_cleanup

Cleanup installed_repository_manager.py and related code a bit more.
This commit is contained in:
Aysam Guerler
2022-10-06 07:39:02 -04:00
committed by GitHub
3 changed files with 20 additions and 237 deletions
@@ -15,7 +15,10 @@ from typing import (
)
from galaxy import util
from galaxy.model.tool_shed_install import ToolShedRepository
from galaxy.model.tool_shed_install import (
ToolDependency,
ToolShedRepository,
)
from galaxy.structured_app import MinimalManagerApp
from galaxy.tool_shed.galaxy_install.metadata.installed_repository_metadata_manager import (
InstalledRepositoryMetadataManager,
@@ -102,7 +105,7 @@ class InstalledRepositoryManager:
self.app, repository
)
repository.deleted = False
repository.status = self.install_model.ToolShedRepository.installation_status.INSTALLED
repository.status = ToolShedRepository.installation_status.INSTALLED
if repository.includes_tools_for_display_in_tool_panel:
repository_clone_url = common_util.generate_clone_url_for_installed_repository(self.app, repository)
tpm = tool_panel_manager.ToolPanelManager(self.app)
@@ -139,8 +142,8 @@ class InstalledRepositoryManager:
repository,
repository_tools_tups,
)
self.install_model.session.add(repository)
self.install_model.session.flush()
self.context.add(repository)
self.context.flush()
def add_entry_to_installed_repository_dependencies_of_installed_repositories(
self, repository: ToolShedRepository
@@ -153,7 +156,7 @@ class InstalledRepositoryManager:
repository_tup = self.get_repository_tuple_for_installed_repository_manager(repository)
tool_shed, name, owner, installed_changeset_revision = repository_tup
# Get the list of repository dependencies for this repository.
status = self.install_model.ToolShedRepository.installation_status.INSTALLED
status = ToolShedRepository.installation_status.INSTALLED
repository_dependency_tups = self.get_repository_dependency_tups_for_installed_repository(
repository, status=status
)
@@ -199,9 +202,7 @@ class InstalledRepositoryManager:
def get_containing_repository_for_tool_dependency(self, tool_dependency_tup: tuple) -> ToolShedRepository:
tool_shed_repository_id, name, version, type = tool_dependency_tup
return self.app.install_model.context.query(self.app.install_model.ToolShedRepository).get(
tool_shed_repository_id
)
return self.context.query(ToolShedRepository).get(tool_shed_repository_id)
def get_dependencies_for_repository(
self,
@@ -364,7 +365,7 @@ class InstalledRepositoryManager:
tsr.id,
tsr.status,
]
if tsr.status == self.app.install_model.ToolShedRepository.installation_status.INSTALLED:
if tsr.status == ToolShedRepository.installation_status.INSTALLED:
installed_rd_tups.append(rd_tup)
else:
# We'll only add the rd_tup to the missing_rd_tups list if the received repository
@@ -458,7 +459,7 @@ class InstalledRepositoryManager:
repository.id,
repository.status,
]
if repository.status == self.install_model.ToolShedRepository.installation_status.INSTALLED:
if repository.status == ToolShedRepository.installation_status.INSTALLED:
if new_rd_tup not in installed_rd_tups:
installed_rd_tups.append(new_rd_tup)
else:
@@ -519,7 +520,7 @@ class InstalledRepositoryManager:
tmp_tool_dependencies_dict: dict = copy.deepcopy(tool_dependencies_dict)
for td_key, val in tmp_tool_dependencies_dict.items():
# Default the status to NEVER_INSTALLED.
tool_dependency_status = self.install_model.ToolDependency.installation_status.NEVER_INSTALLED
tool_dependency_status = ToolDependency.installation_status.NEVER_INSTALLED
if td_key == "set_environment":
# Set environment tool dependencies are a list.
assert isinstance(val, list)
@@ -541,7 +542,7 @@ class InstalledRepositoryManager:
tool_dependency_status = tool_dependency.status
requirement_dict["status"] = tool_dependency_status
new_val.append(requirement_dict)
if tool_dependency_status in [self.install_model.ToolDependency.installation_status.INSTALLED]:
if tool_dependency_status in [ToolDependency.installation_status.INSTALLED]:
if td_key in installed_tool_dependencies:
installed_tool_dependencies[td_key].extend(new_val)
else:
@@ -565,7 +566,7 @@ class InstalledRepositoryManager:
if tool_dependency:
tool_dependency_status = tool_dependency.status
val["status"] = tool_dependency_status
if tool_dependency_status in [self.install_model.ToolDependency.installation_status.INSTALLED]:
if tool_dependency_status in [ToolDependency.installation_status.INSTALLED]:
installed_tool_dependencies[td_key] = val
else:
missing_tool_dependencies[td_key] = val
@@ -688,151 +689,14 @@ class InstalledRepositoryManager:
errors = f"{errors} {error_message}"
repository.deleted = True
if remove_from_disk:
repository.status = self.app.install_model.ToolShedRepository.installation_status.UNINSTALLED
repository.status = ToolShedRepository.installation_status.UNINSTALLED
repository.error_message = None
else:
repository.status = self.app.install_model.ToolShedRepository.installation_status.DEACTIVATED
self.app.install_model.session.add(repository)
self.app.install_model.session.flush()
repository.status = ToolShedRepository.installation_status.DEACTIVATED
self.context.add(repository)
self.context.flush()
return errors
def purge_repository(self, repository: ToolShedRepository) -> Tuple[str, str]:
"""Purge a repository with status New (a white ghost) from the database."""
sa_session = self.app.model.session
status = "ok"
message = ""
purged_tool_versions = 0
purged_tool_dependencies = 0
purged_required_repositories = 0
purged_orphan_repository_repository_dependency_association_records = 0
purged_orphan_repository_dependency_records = 0
if repository.is_new:
# Purge this repository's associated tool versions.
if repository.tool_versions:
for tool_version in repository.tool_versions:
if tool_version.parent_tool_association:
for tool_version_association in tool_version.parent_tool_association:
try:
sa_session.delete(tool_version_association)
sa_session.flush()
except Exception as e:
status = "error"
message = (
"Error attempting to purge tool_versions for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
if tool_version.child_tool_association:
for tool_version_association in tool_version.child_tool_association:
try:
sa_session.delete(tool_version_association)
sa_session.flush()
except Exception as e:
status = "error"
message = (
"Error attempting to purge tool_versions for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
try:
sa_session.delete(tool_version)
sa_session.flush()
purged_tool_versions += 1
except Exception as e:
status = "error"
message = (
"Error attempting to purge tool_versions for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
# Purge this repository's associated tool dependencies.
if repository.tool_dependencies:
for tool_dependency in repository.tool_dependencies:
try:
sa_session.delete(tool_dependency)
sa_session.flush()
purged_tool_dependencies += 1
except Exception as e:
status = "error"
message = (
"Error attempting to purge tool_dependencies for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
# Purge this repository's associated required repositories.
if repository.required_repositories:
for rrda in repository.required_repositories:
try:
sa_session.delete(rrda)
sa_session.flush()
purged_required_repositories += 1
except Exception as e:
status = "error"
message = (
"Error attempting to purge required_repositories for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
# Purge any "orphan" repository_dependency records associated with the repository, but not with any
# repository_repository_dependency_association records.
for orphan_repository_dependency in sa_session.query(self.app.install_model.RepositoryDependency).filter(
self.app.install_model.RepositoryDependency.table.c.tool_shed_repository_id == repository.id
):
# Purge any repository_repository_dependency_association records whose repository_dependency_id is
# the id of the orphan repository_dependency record.
for orphan_rrda in sa_session.query(
self.app.install_model.RepositoryRepositoryDependencyAssociation
).filter(
self.app.install_model.RepositoryRepositoryDependencyAssociation.table.c.repository_dependency_id
== orphan_repository_dependency.id
):
try:
sa_session.delete(orphan_rrda)
sa_session.flush()
purged_orphan_repository_repository_dependency_association_records += 1
except Exception as e:
status = "error"
message = "Error attempting to purge repository_repository_dependency_association records associated with "
message += (
"an orphan repository_dependency record for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
try:
sa_session.delete(orphan_repository_dependency)
sa_session.flush()
purged_orphan_repository_dependency_records += 1
except Exception as e:
status = "error"
message = (
"Error attempting to purge orphan repository_dependency records for the repository named %s with status %s: %s."
% (str(repository.name), str(repository.status), str(e))
)
return status, message
# Purge the repository.
sa_session.delete(repository)
sa_session.flush()
message = f"The repository named <b>{repository.name}</b> with status <b>{repository.status}</b> has been purged.<br/>"
message += "Total associated tool_version records purged: %d<br/>" % purged_tool_versions
message += "Total associated tool_dependency records purged: %d<br/>" % purged_tool_dependencies
message += (
"Total associated repository_repository_dependency_association records purged: %d<br/>"
% purged_required_repositories
)
message += (
"Total associated orphan repository_repository_dependency_association records purged: %d<br/>"
% purged_orphan_repository_repository_dependency_association_records
)
message += (
"Total associated orphan repository_dependency records purged: %d<br/>"
% purged_orphan_repository_dependency_records
)
else:
status = "error"
message = "A repository must have the status <b>New</b> in order to be purged. This repository has "
message += f" the status {repository.status}."
return status, message
def remove_entry_from_installed_repository_dependencies_of_installed_repositories(
self, repository: ToolShedRepository
):
@@ -992,7 +856,7 @@ class InstalledRepositoryManager:
dependency_install_dir
)
if removed_from_disk:
context = self.app.install_model.context
context = self.context
new_dependency_name = None
new_dependency_type = None
new_dependency_version = None
@@ -1017,7 +881,7 @@ class InstalledRepositoryManager:
)
tool_dependency.type = new_dependency_type
tool_dependency.version = new_dependency_version
tool_dependency.status = self.app.install_model.ToolDependency.installation_status.UNINSTALLED
tool_dependency.status = ToolDependency.installation_status.UNINSTALLED
tool_dependency.error_message = None
context.add(tool_dependency)
context.flush()
@@ -166,13 +166,6 @@ class InstalledRepositoryGrid(grids.Grid):
target="center",
url_args=dict(controller="admin_toolshed", action="restore_repository"),
),
grids.GridOperation(
label="Purge",
condition=(lambda item: item.is_new),
allow_multiple=False,
target="center",
url_args=dict(controller="admin_toolshed", action="purge_repository"),
),
]
default_filter = dict(deleted="False")
num_rows_per_page = 50
@@ -1,74 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/admin/tool_shed_repository/repository_actions_menu.mako" import="*" />
<%def name="stylesheets()">
${parent.stylesheets()}
${h.css( "library" )}
</%def>
<%def name="javascripts()">
${parent.javascripts()}
</%def>
${render_galaxy_repository_actions( repository )}
%if message:
${render_msg( message, status )}
%endif
<div class="warningmessage">
<p>
Purging the repository named <b>${repository.name|h}</b> will result in deletion of all records for the
following associated items from the database. Click the <b>Purge</b> button to purge this repository
and its associated items.
</p>
</div>
<div class="card">
<div class="card-header">Purge tool shed repository <b>${repository.name|h}</b></div>
<form name="purge_repository" id="purge_repository" action="${h.url_for( controller='admin_toolshed', action='purge_repository', id=trans.security.encode_id( repository.id ) )}" method="post" >
<%
tool_versions = 0
tool_dependencies = 0
required_repositories = 0
orphan_repository_repository_dependency_association_records = 0
orphan_repository_dependency_records = 0
# Count this repository's tool version lineage chain links that will be purged.
for tool_version in repository.tool_versions:
for tool_version_association in tool_version.parent_tool_association:
tool_versions += 1
for tool_version_association in tool_version.child_tool_association:
tool_versions += 1
tool_versions += 1
# Count this repository's associated tool dependencies that will be purged.
for tool_dependency in repository.tool_dependencies:
tool_dependencies += 1
# Count this repository's associated required repositories that will be purged.
for rrda in repository.required_repositories:
required_repositories += 1
# Count any "orphan" repository_dependency records associated with the repository but not with any
# repository_repository_dependency_association records that will be purged.
for orphan_repository_dependency in \
trans.sa_session.query( trans.app.install_model.RepositoryDependency ) \
.filter( trans.app.install_model.RepositoryDependency.table.c.tool_shed_repository_id == repository.id ):
for orphan_rrda in \
trans.sa_session.query( trans.app.install_model.RepositoryRepositoryDependencyAssociation ) \
.filter( trans.app.install_model.RepositoryRepositoryDependencyAssociation.table.c.repository_dependency_id == orphan_repository_dependency.id ):
orphan_repository_repository_dependency_association_records += 1
orphan_repository_dependency_records += 1
%>
<table class="grid">
<tr><td>Tool version records</td><td>${tool_versions|h}</td><tr>
<tr><td>Tool dependency records</td><td>${tool_dependencies|h}</td><tr>
<tr><td>Repository dependency records</td><td>${required_repositories|h}</td><tr>
<tr><td>Orphan repository_repository_dependency_association records</td><td>${orphan_repository_repository_dependency_association_records|h}</td><tr>
<tr><td>Orphan repository_dependency records</td><td>${orphan_repository_dependency_records|h}</td><tr>
</table>
<div style="clear: both"></div>
<div class="form-row">
<input type="submit" name="purge_repository_button" value="Purge"/>
</div>
</form>
</div>
</div>