Advertisement
Guest User

Untitled

a guest
May 30th, 2015
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.07 KB | None | 0 0
  1. from __future__ import print_function
  2.  
  3. import sys
  4. import os.path
  5. import argparse
  6.  
  7. db_shell_path = __file__
  8. new_path = [ os.path.join( os.path.dirname( db_shell_path ), os.path.pardir, "lib" ) ]
  9. new_path.extend( sys.path[1:] ) # remove scripts/ from the path
  10. sys.path = new_path
  11.  
  12. from galaxy.model.orm.scripts import get_config
  13. db_url = get_config( sys.argv )['db_url']
  14.  
  15. from galaxy.model.tool_shed_install.mapping import init
  16. sa_session = init( db_url ).context
  17. from galaxy.model.tool_shed_install import *
  18.  
  19.  
  20. def get_tool(names):
  21. query = sa_session.query(ToolShedRepository).filter(
  22. ToolShedRepository.name.in_(names),
  23. ToolShedRepository.deleted==True,
  24. ToolShedRepository.uninstalled==True,
  25. ).order_by(
  26. ToolShedRepository.tool_shed,
  27. ToolShedRepository.name,
  28. ToolShedRepository.owner,
  29. ToolShedRepository.changeset_revision,
  30. )
  31.  
  32. return query
  33.  
  34.  
  35. def get_uninstalled_tools():
  36. query = sa_session.query(ToolShedRepository).filter(
  37. ToolShedRepository.deleted==True,
  38. ToolShedRepository.uninstalled==True,
  39. ).order_by(
  40. ToolShedRepository.tool_shed,
  41. ToolShedRepository.name,
  42. ToolShedRepository.owner,
  43. ToolShedRepository.changeset_revision,
  44. )
  45.  
  46. return query
  47.  
  48.  
  49. def print_tool(tool):
  50. print(
  51. "\033[1mToolshed\033[0m", tool.tool_shed,
  52. " \033[1mName\033[0m", tool.name,
  53. " \033[1mOwner\033[0m", tool.owner,
  54. " \033[1mRevision\033[0m", tool.changeset_revision,
  55. " \033[1mLastChange\033[0m", tool.update_time,
  56. )
  57.  
  58. def prompt_removal(default_msg="Remove this tool? (y/N) "):
  59. YES = ("y", "Y", "yes", "Yes")
  60. NO = ("n", "N", "no", "No", "")
  61.  
  62. while True:
  63. remove = raw_input(default_msg)
  64. if not (remove in YES or remove in NO):
  65. print("Invalid choice, enter Yes or No")
  66. continue
  67. else:
  68. remove = remove in YES
  69. break
  70.  
  71. return remove
  72.  
  73.  
  74. def purge_from_db(tool, args, counter):
  75. def do_action(model, *element):
  76. counter.action += 1
  77.  
  78.  
  79. if args.dryrun:
  80. if args.verbose:
  81. print("Would have purged", model, "with id:", *element)
  82.  
  83. return False
  84. else:
  85. if args.verbose:
  86. print("Purging", model, "id:", *element)
  87.  
  88. return True
  89.  
  90. print_tool(tool)
  91.  
  92. if args.prompt:
  93. if not prompt_removal():
  94. # Response was negative so not removing
  95. # Don't count the tool as purged either
  96. print("\033[1mNot removing.\033[0m")
  97. return
  98.  
  99. # Relations between ToolShedRepository and other models
  100. #
  101. # ToolShedRepository.id:
  102. # ToolDependency.tool_shed_repository_id
  103. # RepositoryDependency.tool_shed_repository_id
  104. # RepositoryRepositoryDependencyAssociation.tool_shed_repository_id
  105. # ToolVersion.tool_shed_repository_id
  106. #
  107. # ToolVersion.id
  108. # ToolVersionAssociation.tool_id
  109. # ToolVersionAssociation.parent_id
  110. #
  111. # RepositoryDependency.id
  112. # RepositoryRepositoryDependencyAssociation.repository_dependency_id
  113.  
  114. tool_versions = (sa_session.query(ToolVersion)
  115. .filter(ToolVersion.tool_shed_repository_id==ToolShedRepository.id)
  116. .filter(ToolShedRepository.id==tool.id)
  117. )
  118.  
  119. previous_associations = set()
  120.  
  121. for tool_version in tool_versions:
  122. # Deleting based on ToolVersionAssociation.parent_id and based on ToolVersionAssociation.tool_id
  123. associations = (sa_session.query(ToolVersionAssociation)
  124. .filter(
  125. (ToolVersionAssociation.parent_id==ToolVersion.id) |
  126. (ToolVersionAssociation.tool_id==ToolVersion.id)
  127. )
  128. .filter(ToolVersion.id==tool_version.id)
  129. )
  130.  
  131. for association in associations:
  132. if association not in previous_associations:
  133. # Keep track of deleted objects so we don't try to remove them multiple times
  134. previous_associations.add(association)
  135.  
  136. if do_action("ToolVersionAssociation", association.id):
  137. sa_session.delete(association)
  138.  
  139. # Deleting based on ToolVersion.tool_shed_repository_id
  140. if do_action("ToolVersion", tool_version.id):
  141. sa_session.delete(tool_version)
  142.  
  143. repository_deps = (sa_session.query(RepositoryDependency)
  144. .filter(RepositoryDependency.tool_shed_repository_id==ToolShedRepository.id)
  145. .filter(ToolShedRepository.id==tool.id)
  146. )
  147.  
  148. for repo_dep in repository_deps:
  149. repo_repo_dep_associations = (sa_session.query(RepositoryRepositoryDependencyAssociation)
  150. .filter(RepositoryRepositoryDependencyAssociation.repository_dependency_id==RepositoryDependency.id)
  151. .filter(RepositoryDependency.id==repo_dep.id)
  152. )
  153.  
  154. # Deleting based on RepositoryRepositoryDependencyAssociation.repository_dependency_id
  155. for rrda in repo_repo_dep_associations:
  156. if do_action("RepositoryRepositoryDependencyAssociation", rrda.id):
  157. sa_session.delete(rrda)
  158.  
  159. # Deleting based on RepositoryDependency.tool_shed_repository_id
  160. if do_action("RepositoryDependency", repo_dep.id):
  161. sa_session.delete(repo_dep)
  162.  
  163.  
  164. tool_deps = (sa_session.query(ToolDependency)
  165. .filter(ToolDependency.tool_shed_repository_id==ToolShedRepository.id)
  166. .filter(ToolShedRepository.id==tool.id)
  167. )
  168.  
  169. # Deleting based on ToolDependency.tool_shed_repository_id
  170. for tool_dep in tool_deps:
  171. if do_action("ToolDependency", tool_dep.id, tool_dep.name):
  172. sa_session.delete(tool_dep)
  173.  
  174. # Deleting the ToolShedRepository itself
  175. if do_action("ToolShedRepository", tool.id, tool.name):
  176. sa_session.delete(tool)
  177.  
  178. # Ensure changes are pushed to DB
  179. sa_session.flush()
  180.  
  181. counter.tool += 1
  182. return
  183.  
  184.  
  185. def parse_args():
  186. parser = argparse.ArgumentParser(description="This script can be used to remove/purge "
  187. "tools/dependencies from the DB that are in uninstalled state")
  188. parser.add_argument("tool_names", nargs="*",
  189. help="Name of the tool(s) as shown in the admin interface")
  190. parser.add_argument("--dryrun", action="store_true",
  191. help="Run without changing the database")
  192. parser.add_argument("--noprompt", dest="prompt", action="store_false",
  193. help="Do not ask confirmation before deleting (know what you are doing!)")
  194. parser.add_argument("--verbose", action="store_true",
  195. help="Print more information about what is being done")
  196.  
  197. return parser.parse_args()
  198.  
  199.  
  200. class Counter(object):
  201. def __init__(self):
  202. self.tool = 0
  203. self.action = 0
  204.  
  205.  
  206. def main():
  207. args = parse_args()
  208.  
  209. if not args.prompt:
  210. print("Running in no-prompt mode")
  211.  
  212. if args.dryrun:
  213. print("Running in dry-run mode (and forcing no-prompt mode)")
  214. args.prompt = False
  215.  
  216. if args.tool_names:
  217. tools = get_tool(args.tool_names)
  218. else:
  219. if args.prompt:
  220. if not prompt_removal("\033[1mWarning no tool specified, are you sure you want to purge all uninstalled tools?\033[0m (y/N) "):
  221. print("\033[1mNot removing anything.\033[0m")
  222. return
  223.  
  224. tools = get_uninstalled_tools()
  225.  
  226. counter = Counter()
  227.  
  228. for tool in tools:
  229. purge_from_db(tool, args=args, counter=counter)
  230.  
  231. if args.dryrun:
  232. print("\033[1mWould have purged", counter.tool, "tool(s) totalling",
  233. counter.action, "database deletion(s).\033[0m")
  234. else:
  235. print("\033[1mPurged", counter.tool, "tool(s) totalling",
  236. counter.action, "database deletion(s).\033[0m")
  237.  
  238.  
  239. if __name__ == "__main__":
  240. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement