diff --git a/lib/galaxy/jobs/handler.py b/lib/galaxy/jobs/handler.py index eaf93a8a5c7..a385b74c940 100644 --- a/lib/galaxy/jobs/handler.py +++ b/lib/galaxy/jobs/handler.py @@ -96,10 +96,11 @@ class ItemGrabber: HANDLER_ASSIGNMENT_METHODS.DB_TRANSACTION_ISOLATION, HANDLER_ASSIGNMENT_METHODS.DB_SKIP_LOCKED, } - try: - return [m for m in handler_assignment_methods if m in grabbable_methods][0] - except IndexError: - return + if handler_assignment_methods: + try: + return [m for m in handler_assignment_methods if m in grabbable_methods][0] + except IndexError: + return def grab_unhandled_items(self): """ diff --git a/lib/galaxy/jobs/runners/kubernetes.py b/lib/galaxy/jobs/runners/kubernetes.py index df134422324..90c9eb339db 100644 --- a/lib/galaxy/jobs/runners/kubernetes.py +++ b/lib/galaxy/jobs/runners/kubernetes.py @@ -6,7 +6,6 @@ import logging import math import os import re -from time import sleep import yaml @@ -20,11 +19,12 @@ from galaxy.jobs.runners.util.pykube_util import ( DEFAULT_JOB_API_VERSION, ensure_pykube, find_job_object_by_name, + find_pod_object_by_name, galaxy_instance_id, Job, job_object_dict, Pod, - produce_unique_k8s_job_name, + produce_k8s_job_prefix, pull_policy, pykube_client_from_dict, stop_job, @@ -88,7 +88,10 @@ class KubernetesJobRunner(AsynchronousJobRunner): self.setup_volumes() def setup_volumes(self): - volume_claims = dict(volume.split(":") for volume in self.runner_params['k8s_persistent_volume_claims'].split(',')) + if self.runner_params.get('k8s_persistent_volume_claims'): + volume_claims = dict(volume.split(":") for volume in self.runner_params['k8s_persistent_volume_claims'].split(',')) + else: + volume_claims = {} mountable_volumes = [{'name': claim_name, 'persistentVolumeClaim': {'claimName': claim_name}} for claim_name in volume_claims] self.runner_params['k8s_mountable_volumes'] = mountable_volumes volume_mounts = [{'name': claim_name, 'mountPath': mount_path} for claim_name, mount_path in volume_claims.items()] @@ -120,45 +123,21 @@ class KubernetesJobRunner(AsynchronousJobRunner): return # Construction of the Kubernetes Job object follows: http://kubernetes.io/docs/user-guide/persistent-volumes/ - k8s_job_name = self.__produce_unique_k8s_job_name(job_wrapper.get_id_tag()) + k8s_job_prefix = self.__produce_k8s_job_prefix() k8s_job_obj = job_object_dict( self.runner_params, - k8s_job_name, + k8s_job_prefix, self.__get_k8s_job_spec(ajs) ) - # Checks if job exists and is trusted, or if it needs re-creation. job = Job(self._pykube_api, k8s_job_obj) - job_exists = job.exists() - if job_exists and not self._galaxy_instance_id: - # if galaxy instance id is not set, then we don't trust matching jobs and we simply delete and - # re-create the job - log.debug("Matching job exists, but Job is not trusted, so it will be deleted and a new one created.") - job.delete() - elapsed_seconds = 0 - while job.exists(): - sleep(3) - elapsed_seconds += 3 - if elapsed_seconds > self.runner_params['k8s_timeout_seconds_job_deletion']: - log.debug( - "Timed out before k8s could delete existing untrusted job %s, not queuing associated Galaxy job." - % k8s_job_name) - return - log.debug("Waiting for job to be deleted " + k8s_job_name) - - Job(self._pykube_api, k8s_job_obj).create() - elif job_exists and self._galaxy_instance_id: - # The job exists and we trust the identifier. - log.debug("Matching job exists, but Job is trusted, so we simply use the existing one for " + k8s_job_name) - # We simply leave the k8s job to be handled later on by check_watched_item(). - else: - # Creates the Kubernetes Job if it doesn't exist. - job.create() + job.create() + job_id = job.metadata['name'] # define job attributes in the AsyncronousJobState for follow-up - ajs.job_id = k8s_job_name + ajs.job_id = job_id # store runner information for tracking if Galaxy restarts - job_wrapper.set_external_id(k8s_job_name) + job_wrapper.set_external_id(job_id) self.monitor_queue.put(ajs) def __get_pull_policy(self): @@ -206,10 +185,9 @@ class KubernetesJobRunner(AsynchronousJobRunner): """Parse the ID of the Galaxy instance from runner params.""" return galaxy_instance_id(self.runner_params) - def __produce_unique_k8s_job_name(self, galaxy_internal_job_id): - # wrapper.get_id_tag() instead of job_id for compatibility with TaskWrappers. + def __produce_k8s_job_prefix(self): instance_id = self._galaxy_instance_id or '' - return produce_unique_k8s_job_name(app_prefix='gxy', instance_id=instance_id, job_id=galaxy_internal_job_id) + return produce_k8s_job_prefix(app_prefix='gxy', instance_id=instance_id) def __get_k8s_job_spec(self, ajs): """Creates the k8s Job spec. For a Job spec, the only requirement is to have a .spec.template. @@ -227,7 +205,21 @@ class KubernetesJobRunner(AsynchronousJobRunner): (see pod selector) and an appropriate restart policy.""" k8s_spec_template = { "metadata": { - "labels": {"app": self.__produce_unique_k8s_job_name(ajs.job_wrapper.get_id_tag())[:-5]} + "labels": { + "app.kubernetes.io/name": ajs.job_wrapper.tool.old_id, + "app.kubernetes.io/instance": self.__produce_k8s_job_prefix(), + "app.kubernetes.io/version": ajs.job_wrapper.tool.version, + "app.kubernetes.io/component": "tool", + "app.kubernetes.io/part-of": "galaxy", + "app.kubernetes.io/managed-by": "galaxy", + "app.galaxyproject.org/job_id": ajs.job_wrapper.get_id_tag(), + "app.galaxyproject.org/instance": self._galaxy_instance_id or "", + "app.galaxyproject.org/handler": self.app.config.server_name, + "app.galaxyproject.org/destination": ajs.job_wrapper.job_destination.id, + }, + "annotations": { + "app.galaxyproject.org/tool_id": ajs.job_wrapper.tool.id, + } }, "spec": { "volumes": self.runner_params['k8s_mountable_volumes'], @@ -401,8 +393,8 @@ class KubernetesJobRunner(AsynchronousJobRunner): def check_watched_item(self, job_state): """Checks the state of a job already submitted on k8s. Job state is an AsynchronousJobState""" - jobs = Job.objects(self._pykube_api).filter(selector="app=" + job_state.job_id, - namespace=self.runner_params['k8s_namespace']) + jobs = find_job_object_by_name(self._pykube_api, job_state.job_id, self.runner_params['k8s_namespace']) + if len(jobs.response['items']) == 1: job = Job(self._pykube_api, jobs.response['items'][0]) job_destination = job_state.job_wrapper.job_destination @@ -506,8 +498,7 @@ class KubernetesJobRunner(AsynchronousJobRunner): marks the job for resubmission (resubmit logic is part of destinations). """ - pods = Pod.objects(self._pykube_api).filter(selector="app=%s" % job_state.job_id, - namespace=self.runner_params['k8s_namespace']) + pods = find_pod_object_by_name(self._pykube_api, job_state.job_id, self.runner_params['k8s_namespace']) if not pods.response['items']: return False @@ -522,17 +513,16 @@ class KubernetesJobRunner(AsynchronousJobRunner): """Attempts to delete a dispatched job to the k8s cluster""" job = job_wrapper.get_job() try: - name = job.job_runner_external_id - namespace = self.runner_params['k8s_namespace'] - job_to_delete = find_job_object_by_name(self._pykube_api, name, namespace) - if job_to_delete: - self.__cleanup_k8s_job(job_to_delete) + job_to_delete = find_job_object_by_name(self._pykube_api, job.get_job_runner_external_id(), self.runner_params['k8s_namespace']) + if job_to_delete and len(job_to_delete.response['items']) > 0: + k8s_job = Job(self._pykube_api, job_to_delete.response['items'][0]) + self.__cleanup_k8s_job(k8s_job) # TODO assert whether job parallelism == 0 # assert not job_to_delete.exists(), "Could not delete job,"+job.job_runner_external_id+" it still exists" log.debug(f"({job.id}/{job.job_runner_external_id}) Terminated at user's request") except Exception as e: log.exception("({}/{}) User killed running job, but error encountered during termination: {}".format( - job.id, job.job_runner_external_id, e)) + job.id, job.get_job_runner_external_id(), e)) def recover(self, job, job_wrapper): """Recovers jobs stuck in the queued/running state when Galaxy started""" @@ -561,8 +551,7 @@ class KubernetesJobRunner(AsynchronousJobRunner): def finish_job(self, job_state): super().finish_job(job_state) - jobs = Job.objects(self._pykube_api).filter(selector="app=" + job_state.job_id, - namespace=self.runner_params['k8s_namespace']) + jobs = find_job_object_by_name(self._pykube_api, job_state.job_id, self.runner_params['k8s_namespace']) if len(jobs.response['items']) != 1: log.warning("More than one job matches selector. Possible configuration error" " in job id '%s'", job_state.job_id) diff --git a/lib/galaxy/jobs/runners/util/pykube_util.py b/lib/galaxy/jobs/runners/util/pykube_util.py index 8c00c75b445..bee2ae3920a 100644 --- a/lib/galaxy/jobs/runners/util/pykube_util.py +++ b/lib/galaxy/jobs/runners/util/pykube_util.py @@ -2,7 +2,6 @@ import logging import os import re -import uuid try: from pykube.config import KubeConfig @@ -46,18 +45,9 @@ def pykube_client_from_dict(params): return pykube_client -def produce_unique_k8s_job_name(app_prefix=None, instance_id=None, job_id=None): - if job_id is None: - job_id = str(uuid.uuid4()) - - job_name = "" - if app_prefix: - job_name += "%s-" % app_prefix - - if instance_id and len(instance_id) > 0: - job_name += "%s-" % instance_id - - return "{}{}-{}".format(job_name, job_id, uuid.uuid4())[-63:] +def produce_k8s_job_prefix(app_prefix=None, instance_id=None): + job_name_elems = [app_prefix or "", instance_id or ""] + return '-'.join(elem for elem in job_name_elems if elem) def pull_policy(params): @@ -69,23 +59,13 @@ def pull_policy(params): def find_job_object_by_name(pykube_api, job_name, namespace=None): - return _find_object_by_name(Job, pykube_api, job_name, namespace=namespace) + if not job_name: + raise ValueError("job name must not be empty") + return Job.objects(pykube_api).filter(field_selector={"metadata.name": job_name}, namespace=namespace) -def find_pod_object_by_name(pykube_api, pod_name, namespace=None): - return _find_object_by_name(Pod, pykube_api, pod_name, namespace=namespace) - - -def _find_object_by_name(clazz, pykube_api, object_name, namespace=None): - filter_kwd = dict(selector="app=%s" % object_name) - if namespace is not None: - filter_kwd["namespace"] = namespace - - objs = clazz.objects(pykube_api).filter(**filter_kwd) - obj = None - if len(objs.response['items']) > 0: - obj = clazz(pykube_api, objs.response['items'][0]) - return obj +def find_pod_object_by_name(pykube_api, job_name, namespace=None): + return Pod.objects(pykube_api).filter(selector="job-name=" + job_name, namespace=namespace) def stop_job(job, cleanup="always"): @@ -106,16 +86,13 @@ def stop_job(job, cleanup="always"): job.api.raise_for_status(r) -def job_object_dict(params, job_name, spec): +def job_object_dict(params, job_prefix, spec): k8s_job_obj = { "apiVersion": params.get('k8s_job_api_version', DEFAULT_JOB_API_VERSION), "kind": "Job", "metadata": { - # metadata.name is the name of the pod resource created, and must be unique - # http://kubernetes.io/docs/user-guide/configuring-containers/ - "name": job_name, + "generateName": job_prefix + "-", "namespace": params.get('k8s_namespace', DEFAULT_NAMESPACE), - "labels": {"app": job_name} }, "spec": spec, } @@ -152,7 +129,7 @@ __all__ = ( "Job", "job_object_dict", "Pod", - "produce_unique_k8s_job_name", + "produce_k8s_job_prefix", "pull_policy", "pykube_client_from_dict", "stop_job", diff --git a/lib/galaxy/web_stack/__init__.py b/lib/galaxy/web_stack/__init__.py index 8855280a8fe..832327aa6ba 100644 --- a/lib/galaxy/web_stack/__init__.py +++ b/lib/galaxy/web_stack/__init__.py @@ -548,7 +548,7 @@ class WeblessApplicationStack(ApplicationStack): for m in remove_methods: try: job_config.handler_assignment_methods.remove(m) - log.debug("%s: Removed '%s' from handler assignment methods due to use of mules", conf_class_name, m) + log.debug("%s: Removed '%s' from handler assignment methods due to use of --attach-to-pool", conf_class_name, m) except ValueError: pass if add_method not in job_config.handler_assignment_methods: diff --git a/lib/galaxy/workflow/scheduling_manager.py b/lib/galaxy/workflow/scheduling_manager.py index 031950cfba4..46764ec3815 100644 --- a/lib/galaxy/workflow/scheduling_manager.py +++ b/lib/galaxy/workflow/scheduling_manager.py @@ -267,19 +267,18 @@ class WorkflowRequestMonitor(Monitors): self.workflow_scheduling_manager = workflow_scheduling_manager self._init_monitor_thread(name="WorkflowRequestMonitor.monitor_thread", target=self.__monitor, config=app.config) self.invocation_grabber = None - if self.workflow_scheduling_manager.handler_assignment_methods_configured: - self_handler_tags = set(self.app.job_config.self_handler_tags) - self_handler_tags.add(self.workflow_scheduling_manager.default_handler_id) - handler_assignment_method = ItemGrabber.get_grabbable_handler_assignment_method(self.workflow_scheduling_manager.handler_assignment_methods) - if handler_assignment_method: - self.invocation_grabber = ItemGrabber( - app=app, - grab_type='WorkflowInvocation', - handler_assignment_method=handler_assignment_method, - max_grab=self.workflow_scheduling_manager.handler_max_grab, - self_handler_tags=self_handler_tags, - handler_tags=self_handler_tags, - ) + self_handler_tags = set(self.app.job_config.self_handler_tags) + self_handler_tags.add(self.workflow_scheduling_manager.default_handler_id) + handler_assignment_method = ItemGrabber.get_grabbable_handler_assignment_method(self.workflow_scheduling_manager.handler_assignment_methods) + if handler_assignment_method: + self.invocation_grabber = ItemGrabber( + app=app, + grab_type='WorkflowInvocation', + handler_assignment_method=handler_assignment_method, + max_grab=self.workflow_scheduling_manager.handler_max_grab, + self_handler_tags=self_handler_tags, + handler_tags=self_handler_tags, + ) def __monitor(self): to_monitor = self.workflow_scheduling_manager.active_workflow_schedulers diff --git a/packages/app/HISTORY.rst b/packages/app/HISTORY.rst index 72090ac4c88..47e0dd9ab2c 100644 --- a/packages/app/HISTORY.rst +++ b/packages/app/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/app/galaxy/project_galaxy_app.py b/packages/app/galaxy/project_galaxy_app.py index 79551179878..95ba0d02e25 100644 --- a/packages/app/galaxy/project_galaxy_app.py +++ b/packages/app/galaxy/project_galaxy_app.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-app" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/auth/HISTORY.rst b/packages/auth/HISTORY.rst index 72090ac4c88..47e0dd9ab2c 100644 --- a/packages/auth/HISTORY.rst +++ b/packages/auth/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/auth/galaxy/project_galaxy_auth.py b/packages/auth/galaxy/project_galaxy_auth.py index c5c2788809f..871f2a8a1a3 100644 --- a/packages/auth/galaxy/project_galaxy_auth.py +++ b/packages/auth/galaxy/project_galaxy_auth.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-auth" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/data/HISTORY.rst b/packages/data/HISTORY.rst index 4f7ba0c7b9d..243f3eeb0c4 100644 --- a/packages/data/HISTORY.rst +++ b/packages/data/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) diff --git a/packages/data/galaxy/project_galaxy_data.py b/packages/data/galaxy/project_galaxy_data.py index fcf5ad6a643..4b02e611c68 100644 --- a/packages/data/galaxy/project_galaxy_data.py +++ b/packages/data/galaxy/project_galaxy_data.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-data" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/job_execution/HISTORY.rst b/packages/job_execution/HISTORY.rst index 72090ac4c88..47e0dd9ab2c 100644 --- a/packages/job_execution/HISTORY.rst +++ b/packages/job_execution/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/job_execution/galaxy/project_galaxy_job_execution.py b/packages/job_execution/galaxy/project_galaxy_job_execution.py index 5550022e71c..0f550a86ba5 100644 --- a/packages/job_execution/galaxy/project_galaxy_job_execution.py +++ b/packages/job_execution/galaxy/project_galaxy_job_execution.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-job-execution" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/job_metrics/HISTORY.rst b/packages/job_metrics/HISTORY.rst index 7879816905a..08c9654f4a5 100644 --- a/packages/job_metrics/HISTORY.rst +++ b/packages/job_metrics/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/job_metrics/galaxy/project_galaxy_job_metrics.py b/packages/job_metrics/galaxy/project_galaxy_job_metrics.py index baa6ec1f58b..53b6d10f091 100644 --- a/packages/job_metrics/galaxy/project_galaxy_job_metrics.py +++ b/packages/job_metrics/galaxy/project_galaxy_job_metrics.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-job-metrics" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/objectstore/HISTORY.rst b/packages/objectstore/HISTORY.rst index 7879816905a..08c9654f4a5 100644 --- a/packages/objectstore/HISTORY.rst +++ b/packages/objectstore/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/objectstore/galaxy/project_galaxy_objectstore.py b/packages/objectstore/galaxy/project_galaxy_objectstore.py index ebc289f6a81..38b63150b72 100644 --- a/packages/objectstore/galaxy/project_galaxy_objectstore.py +++ b/packages/objectstore/galaxy/project_galaxy_objectstore.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-objectstore" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/selenium/HISTORY.rst b/packages/selenium/HISTORY.rst index 72090ac4c88..47e0dd9ab2c 100644 --- a/packages/selenium/HISTORY.rst +++ b/packages/selenium/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/selenium/galaxy/project_galaxy_selenium.py b/packages/selenium/galaxy/project_galaxy_selenium.py index 93c998c015a..7951b3154ff 100644 --- a/packages/selenium/galaxy/project_galaxy_selenium.py +++ b/packages/selenium/galaxy/project_galaxy_selenium.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-selenium" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/test_api/HISTORY.rst b/packages/test_api/HISTORY.rst index 7cb67f838f8..3647c319467 100644 --- a/packages/test_api/HISTORY.rst +++ b/packages/test_api/HISTORY.rst @@ -6,7 +6,14 @@ History .. to_doc --------------------- -20.1.0.dev0 +20.9.1.dev0 --------------------- -* Initial import from dev branch of Galaxy during 20.01 development cycle. + + +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* Initial import from dev branch of Galaxy during 20.09 branch of Galaxy. + diff --git a/packages/test_api/galaxy/project_galaxy_test_api.py b/packages/test_api/galaxy/project_galaxy_test_api.py index dc603510b51..4bf45a21246 100644 --- a/packages/test_api/galaxy/project_galaxy_test_api.py +++ b/packages/test_api/galaxy/project_galaxy_test_api.py @@ -1,4 +1,6 @@ -__version__ = '20.1.0.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-test-api" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/test_api/requirements.txt b/packages/test_api/requirements.txt index e548169079b..735bffa9c07 100644 --- a/packages/test_api/requirements.txt +++ b/packages/test_api/requirements.txt @@ -1,2 +1 @@ -galaxy-test-driver - +galaxy-test-base diff --git a/packages/test_base/HISTORY.rst b/packages/test_base/HISTORY.rst index b8a2e6045e6..bd4cac54775 100644 --- a/packages/test_base/HISTORY.rst +++ b/packages/test_base/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* Initial release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/test_base/galaxy/project_galaxy_test_base.py b/packages/test_base/galaxy/project_galaxy_test_base.py index 49df2622d8e..a097ea2ee86 100644 --- a/packages/test_base/galaxy/project_galaxy_test_base.py +++ b/packages/test_base/galaxy/project_galaxy_test_base.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-test-base" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/test_driver/HISTORY.rst b/packages/test_driver/HISTORY.rst index 72090ac4c88..47e0dd9ab2c 100644 --- a/packages/test_driver/HISTORY.rst +++ b/packages/test_driver/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/test_driver/galaxy/project_galaxy_test_driver.py b/packages/test_driver/galaxy/project_galaxy_test_driver.py index 0c175ff8e55..ae493cf5a6f 100644 --- a/packages/test_driver/galaxy/project_galaxy_test_driver.py +++ b/packages/test_driver/galaxy/project_galaxy_test_driver.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-test-driver" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/test_selenium/HISTORY.rst b/packages/test_selenium/HISTORY.rst index 7cb67f838f8..135ed311ff6 100644 --- a/packages/test_selenium/HISTORY.rst +++ b/packages/test_selenium/HISTORY.rst @@ -6,7 +6,13 @@ History .. to_doc --------------------- -20.1.0.dev0 +20.9.1.dev0 --------------------- -* Initial import from dev branch of Galaxy during 20.01 development cycle. + + +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. diff --git a/packages/test_selenium/galaxy/project_galaxy_test_selenium.py b/packages/test_selenium/galaxy/project_galaxy_test_selenium.py index c61a016369b..a93c6364399 100644 --- a/packages/test_selenium/galaxy/project_galaxy_test_selenium.py +++ b/packages/test_selenium/galaxy/project_galaxy_test_selenium.py @@ -1,4 +1,6 @@ -__version__ = '20.1.0.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-test-selenium" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/test_selenium/requirements.txt b/packages/test_selenium/requirements.txt index e8566b22706..95f090dd641 100644 --- a/packages/test_selenium/requirements.txt +++ b/packages/test_selenium/requirements.txt @@ -1,4 +1,3 @@ -galaxy-data -nose -pytest +galaxy-test-base + diff --git a/packages/tool_util/HISTORY.rst b/packages/tool_util/HISTORY.rst index 6969c9bae0b..c4d31a3e8bb 100644 --- a/packages/tool_util/HISTORY.rst +++ b/packages/tool_util/HISTORY.rst @@ -5,10 +5,17 @@ History .. to_doc +--------------------- +20.9.1.dev0 +--------------------- + + + --------------------- 20.9.0.dev2 --------------------- +* First release from the 20.09 branch of Galaxy. --------------------- 20.5.0 (2020-07-04) diff --git a/packages/tool_util/galaxy/project_galaxy_tool_util.py b/packages/tool_util/galaxy/project_galaxy_tool_util.py index 71ea6d90210..6fe3c30709c 100644 --- a/packages/tool_util/galaxy/project_galaxy_tool_util.py +++ b/packages/tool_util/galaxy/project_galaxy_tool_util.py @@ -1,4 +1,6 @@ -__version__ = '20.9.0.dev3' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-tool-util" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/util/HISTORY.rst b/packages/util/HISTORY.rst index 2816300aea2..f1ec00b6172 100644 --- a/packages/util/HISTORY.rst +++ b/packages/util/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-03) --------------------- diff --git a/packages/util/galaxy/project_galaxy_util.py b/packages/util/galaxy/project_galaxy_util.py index d4afb078cf5..b62c1d55160 100644 --- a/packages/util/galaxy/project_galaxy_util.py +++ b/packages/util/galaxy/project_galaxy_util.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-util" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/packages/web_framework/HISTORY.rst b/packages/web_framework/HISTORY.rst index 72090ac4c88..47e0dd9ab2c 100644 --- a/packages/web_framework/HISTORY.rst +++ b/packages/web_framework/HISTORY.rst @@ -6,11 +6,17 @@ History .. to_doc --------------------- -20.5.1.dev0 +20.9.1.dev0 --------------------- +--------------------- +20.9.0 (2020-10-15) +--------------------- + +* First release from the 20.09 branch of Galaxy. + --------------------- 20.5.0 (2020-07-04) --------------------- diff --git a/packages/web_framework/galaxy/project_galaxy_web_framework.py b/packages/web_framework/galaxy/project_galaxy_web_framework.py index 7038abdff4f..d54f2c6cf71 100644 --- a/packages/web_framework/galaxy/project_galaxy_web_framework.py +++ b/packages/web_framework/galaxy/project_galaxy_web_framework.py @@ -1,4 +1,6 @@ -__version__ = '20.5.1.dev0' +# -*- coding: utf-8 -*- + +__version__ = '20.9.1.dev0' PROJECT_NAME = "galaxy-web-framework" PROJECT_OWNER = PROJECT_USERAME = "galaxyproject" diff --git a/test/integration/test_workflow_handler_configuration.py b/test/integration/test_workflow_handler_configuration.py index 088ed5de5c7..3b59278f2e1 100644 --- a/test/integration/test_workflow_handler_configuration.py +++ b/test/integration/test_workflow_handler_configuration.py @@ -42,6 +42,19 @@ WORKFLOW_HANDLER_JOB_CONFIG_TEMPLATE = string.Template(""" """) +POOL_JOB_CONFIG_TEMPLATE = string.Template(""" + + + + + + + + + + +""") + WORKFLOW_SCHEDULERS_CONFIG_TEMPLATE = string.Template(""" @@ -220,6 +233,15 @@ class JobHandlerAsWorkflowHandlerWithDbSkipLocked(BaseWorkflowHandlerConfigurati assert self.is_app_workflow_scheduler +class JobHandlerAsWorkflowHandlerWithDbSkipLockedAttachToPool(JobHandlerAsWorkflowHandlerWithDbSkipLocked): + + @classmethod + def handle_galaxy_config_kwds(cls, config): + config["job_config_file"] = config_file(POOL_JOB_CONFIG_TEMPLATE, assign_with=cls.assign_with) + config["server_name"] = "handler0" + config["attach_to_pools"] = ["job-handlers"] + + class DefaultWorkflowHandlerIfJobHandlerOffTestCase(BaseWorkflowHandlerConfigurationTestCase): @classmethod