Add view management functionality
- Adds the ability for JJB to work with views
- Views can be created, updated, and deleted.
- New modules for List view and Build Pipeline view are added
- New tests for testing the deletion of views
Example View configuration:
- view:
name: MyView
view-type: list
Change-Id: Idb29a4407bcc14593e10a4d951036cb04e8e6c27
Co-Authored-By: Brandon Leonard <brandon.leonard@rackspace.com>
Co-Authored-By: Joao Vale <jpvale@gmail.com>
Co-Authored-By: Lucas Dutra Nunes <ldnunes@ossystems.com.br>
Signed-off-by: Thanh Ha <thanh.ha@linuxfoundation.org>
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
|
||||
|
||||
from jenkins_jobs.builder import JenkinsManager
|
||||
from jenkins_jobs.errors import JenkinsJobsException
|
||||
from jenkins_jobs.parser import YamlParser
|
||||
from jenkins_jobs.registry import ModuleRegistry
|
||||
import jenkins_jobs.cli.subcommand.base as base
|
||||
@@ -36,10 +37,26 @@ class DeleteSubCommand(base.BaseSubCommand):
|
||||
default=None,
|
||||
help="colon-separated list of paths to YAML files "
|
||||
"or directories")
|
||||
delete.add_argument(
|
||||
'-j', '--jobs-only',
|
||||
action='store_true', dest='del_jobs',
|
||||
default=False,
|
||||
help='delete only jobs'
|
||||
)
|
||||
delete.add_argument(
|
||||
'-v', '--views-only',
|
||||
action='store_true', dest='del_views',
|
||||
default=False,
|
||||
help='delete only views'
|
||||
)
|
||||
|
||||
def execute(self, options, jjb_config):
|
||||
builder = JenkinsManager(jjb_config)
|
||||
|
||||
if options.del_jobs and options.del_views:
|
||||
raise JenkinsJobsException(
|
||||
'"--views-only" and "--jobs-only" cannot be used together.')
|
||||
|
||||
fn = options.path
|
||||
registry = ModuleRegistry(jjb_config, builder.plugins_list)
|
||||
parser = YamlParser(jjb_config)
|
||||
@@ -48,7 +65,15 @@ class DeleteSubCommand(base.BaseSubCommand):
|
||||
parser.load_files(fn)
|
||||
parser.expandYaml(registry, options.name)
|
||||
jobs = [j['name'] for j in parser.jobs]
|
||||
views = [v['name'] for v in parser.views]
|
||||
else:
|
||||
jobs = options.name
|
||||
views = options.name
|
||||
|
||||
builder.delete_jobs(jobs)
|
||||
if options.del_jobs:
|
||||
builder.delete_jobs(jobs)
|
||||
elif options.del_views:
|
||||
builder.delete_views(views)
|
||||
else:
|
||||
builder.delete_jobs(jobs)
|
||||
builder.delete_views(views)
|
||||
|
||||
@@ -19,6 +19,7 @@ import sys
|
||||
|
||||
from jenkins_jobs import utils
|
||||
from jenkins_jobs.builder import JenkinsManager
|
||||
from jenkins_jobs.errors import JenkinsJobsException
|
||||
import jenkins_jobs.cli.subcommand.base as base
|
||||
|
||||
|
||||
@@ -35,14 +36,43 @@ class DeleteAllSubCommand(base.BaseSubCommand):
|
||||
|
||||
self.parse_option_recursive_exclude(delete_all)
|
||||
|
||||
delete_all.add_argument(
|
||||
'-j', '--jobs-only',
|
||||
action='store_true', dest='del_jobs',
|
||||
default=False,
|
||||
help='delete only jobs'
|
||||
)
|
||||
delete_all.add_argument(
|
||||
'-v', '--views-only',
|
||||
action='store_true', dest='del_views',
|
||||
default=False,
|
||||
help='delete only views'
|
||||
)
|
||||
|
||||
def execute(self, options, jjb_config):
|
||||
builder = JenkinsManager(jjb_config)
|
||||
|
||||
reach = set()
|
||||
if options.del_jobs and options.del_views:
|
||||
raise JenkinsJobsException(
|
||||
'"--views-only" and "--jobs-only" cannot be used together.')
|
||||
elif options.del_jobs and not options.del_views:
|
||||
reach.add('jobs')
|
||||
elif options.del_views and not options.del_jobs:
|
||||
reach.add('views')
|
||||
else:
|
||||
reach.update(('jobs', 'views'))
|
||||
|
||||
if not utils.confirm(
|
||||
'Sure you want to delete *ALL* jobs from Jenkins '
|
||||
'Sure you want to delete *ALL* {} from Jenkins '
|
||||
'server?\n(including those not managed by Jenkins '
|
||||
'Job Builder)'):
|
||||
'Job Builder)'.format(" AND ".join(reach))):
|
||||
sys.exit('Aborted')
|
||||
|
||||
logger.info("Deleting all jobs")
|
||||
builder.delete_all_jobs()
|
||||
if options.del_jobs:
|
||||
logger.info("Deleting all jobs")
|
||||
builder.delete_all_jobs()
|
||||
|
||||
if options.del_views:
|
||||
logger.info("Deleting all views")
|
||||
builder.delete_all_views()
|
||||
|
||||
@@ -45,6 +45,8 @@ class TestSubCommand(update.UpdateSubCommand):
|
||||
|
||||
def execute(self, options, jjb_config):
|
||||
|
||||
builder, xml_jobs = self._generate_xmljobs(options, jjb_config)
|
||||
builder, xml_jobs, xml_views = self._generate_xmljobs(
|
||||
options, jjb_config)
|
||||
|
||||
builder.update_jobs(xml_jobs, output=options.output_dir, n_workers=1)
|
||||
builder.update_views(xml_views, output=options.output_dir, n_workers=1)
|
||||
|
||||
@@ -21,6 +21,7 @@ from jenkins_jobs.builder import JenkinsManager
|
||||
from jenkins_jobs.parser import YamlParser
|
||||
from jenkins_jobs.registry import ModuleRegistry
|
||||
from jenkins_jobs.xml_config import XmlJobGenerator
|
||||
from jenkins_jobs.xml_config import XmlViewGenerator
|
||||
from jenkins_jobs.errors import JenkinsJobsException
|
||||
import jenkins_jobs.cli.subcommand.base as base
|
||||
|
||||
@@ -75,21 +76,24 @@ class UpdateSubCommand(base.BaseSubCommand):
|
||||
# Generate XML
|
||||
parser = YamlParser(jjb_config)
|
||||
registry = ModuleRegistry(jjb_config, builder.plugins_list)
|
||||
xml_generator = XmlJobGenerator(registry)
|
||||
xml_job_generator = XmlJobGenerator(registry)
|
||||
xml_view_generator = XmlViewGenerator(registry)
|
||||
|
||||
parser.load_files(options.path)
|
||||
registry.set_parser_data(parser.data)
|
||||
|
||||
job_data_list = parser.expandYaml(registry, options.names)
|
||||
job_data_list, view_data_list = parser.expandYaml(
|
||||
registry, options.names)
|
||||
|
||||
xml_jobs = xml_generator.generateXML(job_data_list)
|
||||
xml_jobs = xml_job_generator.generateXML(job_data_list)
|
||||
xml_views = xml_view_generator.generateXML(view_data_list)
|
||||
|
||||
jobs = parser.jobs
|
||||
step = time.time()
|
||||
logging.debug('%d XML files generated in %ss',
|
||||
len(jobs), str(step - orig))
|
||||
|
||||
return builder, xml_jobs
|
||||
return builder, xml_jobs, xml_views
|
||||
|
||||
def execute(self, options, jjb_config):
|
||||
|
||||
@@ -97,12 +101,17 @@ class UpdateSubCommand(base.BaseSubCommand):
|
||||
raise JenkinsJobsException(
|
||||
'Number of workers must be equal or greater than 0')
|
||||
|
||||
builder, xml_jobs = self._generate_xmljobs(options, jjb_config)
|
||||
builder, xml_jobs, xml_views = self._generate_xmljobs(
|
||||
options, jjb_config)
|
||||
|
||||
jobs, num_updated_jobs = builder.update_jobs(
|
||||
xml_jobs, n_workers=options.n_workers)
|
||||
logger.info("Number of jobs updated: %d", num_updated_jobs)
|
||||
|
||||
views, num_updated_views = builder.update_views(
|
||||
xml_views, n_workers=options.n_workers)
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user