jenkins-job-builder/jenkins_jobs/cli/subcommand/update.py

138 lines
4.5 KiB
Python

#!/usr/bin/env python
# Copyright (C) 2015 Wayne Warren
#
# 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 logging
import sys
from jenkins_jobs.errors import JenkinsJobsException
import jenkins_jobs.cli.subcommand.base as base
logger = logging.getLogger(__name__)
class UpdateSubCommand(base.JobsSubCommand):
def parse_arg_path(self, parser):
parser.add_argument(
"path",
nargs="?",
default=sys.stdin,
help="colon-separated list of paths to YAML files " "or directories",
)
def parse_arg_names(self, parser):
parser.add_argument("names", help="name(s) of job(s)", nargs="*")
def parse_args(self, subparser):
update = subparser.add_parser("update")
self.parse_option_recursive_exclude(update)
self.parse_arg_path(update)
self.parse_arg_names(update)
update.add_argument(
"--delete-old",
action="store_true",
dest="delete_old",
default=False,
help="delete obsolete jobs",
)
update.add_argument(
"-p",
"--plugin-info",
dest="plugins_info_path",
default=None,
help="path to plugin info YAML file. Can be used to provide "
"previously retrieved plugins info when connecting credentials "
"don't have permissions to query.",
)
update.add_argument(
"--workers",
type=int,
default=1,
dest="n_workers",
help="number of workers to use, 0 for autodetection and 1 "
"for just one worker.",
)
update.add_argument(
"--existing-only",
action="store_true",
default=False,
dest="existing_only",
help="update existing jobs only",
)
update_type = update.add_mutually_exclusive_group()
update_type.add_argument(
"-j",
"--jobs-only",
action="store_const",
dest="update",
const="jobs",
help="update only jobs",
)
update_type.add_argument(
"-v",
"--views-only",
action="store_const",
dest="update",
const="views",
help="update only views",
)
def execute(self, options, jjb_config):
if options.n_workers < 0:
raise JenkinsJobsException(
"Number of workers must be equal or greater than 0"
)
builder, xml_jobs, xml_views = self.make_jobs_and_views_xml(
jjb_config, options.path, options.names
)
if options.update == "jobs":
jobs, num_updated_jobs = builder.update_jobs(
xml_jobs,
n_workers=options.n_workers,
existing_only=options.existing_only,
)
logger.info("Number of jobs updated: %d", num_updated_jobs)
elif options.update == "views":
views, num_updated_views = builder.update_views(
xml_views,
n_workers=options.n_workers,
existing_only=options.existing_only,
)
logger.info("Number of views updated: %d", num_updated_views)
else:
jobs, num_updated_jobs = builder.update_jobs(
xml_jobs,
n_workers=options.n_workers,
existing_only=options.existing_only,
)
logger.info("Number of jobs updated: %d", num_updated_jobs)
views, num_updated_views = builder.update_views(
xml_views,
n_workers=options.n_workers,
existing_only=options.existing_only,
)
logger.info("Number of views updated: %d", num_updated_views)
keep_jobs = [job.name for job in xml_jobs]
if options.delete_old:
n = builder.delete_old_managed(keep=keep_jobs)
logger.info("Number of jobs deleted: %d", n)