blob: f1bffb43330e3b9b62a9cac700a4431b2e1b0704 [file] [log] [blame]
Benjamin Copelanda445cf02020-08-11 16:32:21 +01001import argparse
2import yaml
3import os
4from jinja2 import FileSystemLoader, Environment
5import jenkins
6import logging
7
8
9class Loader(yaml.Loader):
10
11 def __init__(self, *args, **kwargs):
12 super(Loader, self).__init__(*args, **kwargs)
13 self.add_constructor('!include', type(self).construct_include)
14 try:
15 self._root = os.path.split(self)[0]
16 except AttributeError:
17 self._root = os.path.curdir
18
19 def construct_include(self, node):
20 if isinstance(node, yaml.ScalarNode):
21 return self.extractFile(self.construct_scalar(node))
22
23 elif isinstance(node, yaml.SequenceNode):
24 result = []
25 for filename in self.construct_sequence(node):
26 result += self.extractFile(filename)
27 return result
28
29 elif isinstance(node, yaml.MappingNode):
30 result = {}
31 for k,v in self.construct_mapping(node).iteritems():
32 result[k] = self.extractFile(v)
33 return result
34
35 else:
36 print "Error:: unrecognised node type in !include statement"
37 raise yaml.constructor.ConstructorError
38
39
40 def extractFile(self, filename):
41 filepath = os.path.join(self._root, filename)
42 with open(filepath, 'r') as f:
43 return yaml.load(f, Loader=Loader)
44
45
46def jinja2_from_template(directory, template_name, data, dryrun=False):
47 loader = FileSystemLoader(directory)
48 env = Environment(loader=loader)
49 template = env.get_template(template_name)
50 return template.render(hosts=data, dryrun=dryrun)
51
52
53def get_parser():
54 parser = argparse.ArgumentParser()
55 parser.add_argument('-u', '--username', type=str,
56 default=os.environ.get('JJB_USER'),
57 help='Username for Jenkins server')
58 parser.add_argument('-p', '--password', type=str,
59 default=os.environ.get('JJB_PASSWORD'),
60 help='Password for Jenkins server')
61 parser.add_argument('-s', '--server', type=str,
62 default='http://localhost:8080',
63 help='Jenkins server URL. e.g. http://localhost:8080')
64 parser.add_argument('-i', '--inventory', type=str, default='hosts',
65 help='specify inventory host path')
66 parser.add_argument('-l', '--loglevel', default='INFO',
67 help="Setting logging level, default: %(default)s")
68 parser.add_argument('--dryrun', action='store_true',
69 help='Do not publish to Jenkins')
70 parser.add_argument('--local', action='store_true',
71 help='Create tmp file only')
72 return parser
73
74
75if __name__ == '__main__':
76 parser = get_parser()
77 args = parser.parse_args()
78 logging.basicConfig(level=args.loglevel)
79 with open(args.inventory, 'r') as f:
80 data = yaml.load(f, Loader=Loader)
81 logging.debug(data)
82 template_output = jinja2_from_template(
83 './templates',
84 'configure-yadocker-cloud.groovy.j2', data)
85
86 if not args.local:
87 server = jenkins.Jenkins(args.server, username=args.username,
88 password=args.password)
89 if args.dryrun:
90 with open('/tmp/configure-yadocker-cloud.groovy', 'w') as fw:
91 fw.write(template_output)
92 template_output = jinja2_from_template(
93 './templates',
94 'configure-yadocker-cloud.groovy.j2', data, args.dryrun)
95 if not args.local:
96 publishdry = server.run_script(template_output)
97 if 'error' in publishdry:
98 logging.info(publishdry)
99 exit(1)
100 logging.info(publishdry)
101 else:
102 logging.info('Template file created at \
103 /tmp/configure-yadocker-cloud.groovy')
104 logging.debug(template_output)
105 else:
106 publish = server.run_script(template_output)
107 logging.info(publish)