# Copyright Members of the EMI Collaboration, 2013. # Copyright 2020 CERN # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys from .base import Base from fts3.rest.client import Submitter class JobCanceller(Base): def __init__(self): super(JobCanceller, self).__init__( extra_args="JOB_ID", description=""" This command can be used to cancel a running job. It returns the final state of the canceled job. Please, mind that if the job is already in a final state (FINISHEDDIRTY, FINISHED, FAILED), this command will return this state. You can additionally cancel only a subset appending a comma-separated list of file ids """, example=""" $ %(prog)s -s https://fts3-devel.cern.ch:8446 c079a636-c363-11e3-b7e5-02163e009f5a FINISHED $ %(prog)s -s https://fts3-devel.cern.ch:8446 c079a636-c363-11e3-b7e5-02163e009f5a:5658,5659,5670 CANCELED, CANCELED, CANCELED """, ) def validate(self): if len(self.args) == 0: self.logger.critical("Need a job id") sys.exit(1) def run(self): if ":" in self.args[0]: job_id, file_ids = self.args[0].split(":") file_ids = file_ids.split(",") else: job_id = self.args[0] file_ids = None context = self._create_context() submitter = Submitter(context) result = submitter.cancel(job_id, file_ids) if file_ids: if isinstance(result, str): self.logger.info(result) else: self.logger.info("\n".join(result)) else: self.logger.info(result["job_state"])