base_dir = os.path.dirname(cgi_bin_dir)
special_chars_re = re.compile(r'[^a-z0-9_\-]', re.IGNORECASE)
+ dev_re = re.compile(r'^dev')
mail_bodies = {
'special_chars': "Received special characters in module name",
self.ignore_projects = []
+ self.error_data = []
+
self.default_parent_dir = '/www/data'
self.default_email = DEFAULT_EMAIL
self.mail_to_addresses = []
try:
self.json_data = json.loads(self.data)
except Exception as e:
- LOG.error("Got a {n} reading input data as JSON: {e}".format(
- n=e.__class__.__name__, e=e))
- LOG.error("Input data: {!r}".format(self.data))
- sys.exit(0)
-
- LOG.debug("Got JSON data:\n{}".format(pp(self.json_data)))
-
- try:
- self.perform()
- except Exception as e:
- LOG.error("Got a {n} performing the deploy: {e}".format(
- n=e.__class__.__name__, e=e))
- LOG.error("Traceback:\n{}".format(traceback.format_exc()))
+ msg = "Got a {n} reading input data as JSON: {e}".format(n=e.__class__.__name__, e=e)
+ msg += "\nInput data: {!r}".format(self.data)
+ LOG.error(msg)
+ error_data.append(msg)
+ else:
- LOG.info("Finished.")
- sys.exit(0)
+ LOG.debug("Got JSON data:\n{}".format(pp(self.json_data)))
+
+ try:
+ self.perform()
+ except Exception as e:
+ msg = "Got a {n} performing the deploy: {e}".format(n=e.__class__.__name__, e=e)
+ msg += "\n\nTraceback:\n{}".format(traceback.format_exc())
+ error_data.append(msg)
+ LOG.error(msg)
+ finally:
+ LOG.info("Finished.")
+ sys.exit(0)
# -------------------------------------------------------------------------
def perform(self):
return True
if self.special_chars_re.search(self.name):
- LOG.error(("Project {!r}: " + self.mail_bodies['special_chars']).format(
- self.full_name))
+ msg = "Project {!r}: ".format(self.full_name) + self.mail_bodies['special_chars']
+ LOG.error(msg)
+ error_data.append(msg)
return True
committers = []
if self.full_name == full_name:
return self.deploy(cfg)
- LOG.error("Could not find a definition for project {!r}.".format(self.full_name))
+ msg = "Could not find a definition for project {!r}.".format(self.full_name)
+ error_data.append(msg)
+ LOG.error(msg)
return True
LOG.info("Deploying Hiera working directory ...")
- return True
+ ns = 'puppet'
+ pname = 'hiera'
+ full_name = ns + '/' + pname
+ parent_dir = '/www/data/puppet-hiera'
+ if 'parent_dir' in cfg and cfg['parent_dir']:
+ parent_dir = cfg['parent_dir']
+ workdir = pname
+ if 'workdir' in cfg and cfg['workdir']:
+ workdir = cfg['workdir']
+
+ full_path = os.path.join(parent_dir, workdir)
+
+ LOG.info("Deploying working directory {!r} for Hiera ...".format(full_path))
+
+ if not os.access(parent_dir, os.F_OK):
+ msg = "Parent directory {!r} for Hiera does not exists.".format(parent_dir)
+ LOG.error(msg)
+ error_data.append(msg)
+ return True
+
+ if not os.path.isdir(parent_dir):
+ msg = "Path of parent directory {!r} for Hiera is not a directory.".format(parent_dir)
+ LOG.error(msg)
+ error_data.append(msg)
+ return True
+
+ return self.ensure_workingdir(parent_dir, workdir)
# -------------------------------------------------------------------------
def deploy_puppet_modules(self):
LOG.info("Deploying puppet modules working directory ...")
- return True
+ ns = 'puppet'
+ pname = cfg['name']
+ full_name = ns + '/' + pname
+ parent_dir = self.default_parent_dir
+ if 'parent_dir' in cfg and cfg['parent_dir']:
+ parent_dir = cfg['parent_dir']
+
+ if not os.access(parent_dir, os.F_OK):
+ msg = "Parent directory {d!r} of project {p!r} does not exists.".format(
+ d=parent_dir, p=full_name)
+ LOG.error(msg)
+ error_data.append(msg)
+ return True
+
+ if not os.path.isdir(parent_dir):
+ msg = ("Path for parent directory {d!r} for project {p!r} "
+ "is not a directory.").format(d=parent_dir, p=full_name)
+ LOG.error(msg)
+ error_data.append(msg)
+ return True
+
+ env_branch = 'undefined'
+ if self.dev_re.match(self.ref):
+ env_branch = 'development'
+ elif self.ref == 'master':
+ env_branch = 'test'
+ full_path_branch = os.path.join(parent_dir, env_branch)
+ if not os.access(full_path_branch, os.F_OK):
+ msg = "Branch directory {d!r} of project {p!r} does not exists.".format(
+ d=full_path_branch, p=full_name)
+ LOG.error(msg)
+ error_data.append(msg)
+ return True
+
+ modules_dir = os.path.join(full_path_branch, 'modules')
+ if not os.access(modules_dir, os.F_OK):
+ msg = "Modules directory {d!r} of project {p!r} does not exists.".format(
+ d=modules_dir, p=full_name)
+ LOG.error(msg)
+ error_data.append(msg)
+ return True
+
+ branc2clone = None
+ if env_branch =='test':
+ branc2clone = 'master'
+
+ return self.ensure_workingdir(parent_dir=modules_dir, workdir=pname, branch=branc2clone)
# -------------------------------------------------------------------------
def deploy(self, cfg):
f=full_path, p=full_name))
if not os.access(parent_dir, os.F_OK):
- LOG.error("Parent directory {d!r} for project {p!r} does not exists.".format(
- d=parent_dir, p=full_name))
+ msg = "Parent directory {d!r} of project {p!r} does not exists.".format(
+ d=parent_dir, p=full_name)
+ LOG.error(msg)
+ error_data.append(msg)
return True
if not os.path.isdir(parent_dir):
- LOG.error((
+ msg = (
"Path for parent directory {d!r} for project {p!r} "
- "is not a directory.").format(d=parent_dir, p=full_name))
+ "is not a directory.").format(d=parent_dir, p=full_name)
+ LOG.error(msg)
+ error_data.append(msg)
return True
return self.ensure_workingdir(parent_dir, workdir, branch)
# -------------------------------------------------------------------------
def ensure_workingdir(self, parent_dir, workdir, branch=None):
- os.chdir(parent_dir)
- cmd = []
- if self.do_sudo:
- cmd = ['sudo', '-n']
- if os.access(workdir, os.F_OK):
- os.chdir(workdir)
- cmd += ['git', 'pull']
- else:
- cmd += ['git', 'clone', self.git_ssh_url, workdir]
- if branch:
- cmd += ['-b', branch]
- if self.verbose > 2:
- LOG.debug("Cmd: {}".format(pp(cmd)))
- cmd_str = ' '.join(map(lambda x: pipes.quote(x), cmd))
- LOG.debug("Executing: {}".format(cmd_str))
-
- git = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- (stdoutdata, stderrdata) = git.communicate()
- ret_val = git.wait()
-
- LOG.debug("Return value: {}".format(ret_val))
- if stdoutdata:
- msg = "Output:\n{}".format(to_str(stdoutdata))
- LOG.debug(msg)
- self.print_out(msg)
- else:
- LOG.debug("No output.")
- if stderrdata:
- msg = "Error messages on '{c}':\n{e}".format(c=cmd_str, e=to_str(stderrdata))
- LOG.warn(msg)
- self.print_out(msg)
+ cur_dir = os.getcwd()
+
+ try:
+ os.chdir(parent_dir)
+ cmd = []
+ if self.do_sudo:
+ cmd = ['sudo', '-n']
+ if os.access(workdir, os.F_OK):
+ os.chdir(workdir)
+ cmd += ['git', 'pull']
+ else:
+ cmd += ['git', 'clone', self.git_ssh_url, workdir]
+ if branch:
+ cmd += ['-b', branch]
+ if self.verbose > 2:
+ LOG.debug("Cmd: {}".format(pp(cmd)))
+ cmd_str = ' '.join(map(lambda x: pipes.quote(x), cmd))
+ LOG.debug("Executing: {}".format(cmd_str))
+
+ git = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (stdoutdata, stderrdata) = git.communicate()
+ ret_val = git.wait()
+
+ LOG.debug("Return value: {}".format(ret_val))
+ if stdoutdata:
+ msg = "Output:\n{}".format(to_str(stdoutdata))
+ LOG.debug(msg)
+ self.print_out(msg)
+ else:
+ LOG.debug("No output.")
+ if stderrdata:
+ msg = "Error messages on '{c}':\n{e}".format(c=cmd_str, e=to_str(stderrdata))
+ LOG.warn(msg)
+ error_data.append(msg)
+ self.print_out(msg)
+ finally:
+ os.chdir(cur_dir)
# =============================================================================