Add locking to git commands
Avoids conflicting attempts when multiple hosts check in at once.
This commit is contained in:
		@@ -22,6 +22,7 @@
 | 
			
		||||
import os.path
 | 
			
		||||
import git
 | 
			
		||||
import yaml
 | 
			
		||||
from filelock import FileLock
 | 
			
		||||
 | 
			
		||||
import pvcbootstrapd.lib.notifications as notifications
 | 
			
		||||
 | 
			
		||||
@@ -60,25 +61,33 @@ def pull_repository(config):
 | 
			
		||||
    """
 | 
			
		||||
    Pull (with rebase) the Ansible git repository
 | 
			
		||||
    """
 | 
			
		||||
    lockfile = "/tmp/pvcbootstrapd-git.lock"
 | 
			
		||||
    lock = FileLock(lockfile)
 | 
			
		||||
    with lock:
 | 
			
		||||
        logger.info(f"Updating local configuration repository {config['ansible_path']}")
 | 
			
		||||
        try:
 | 
			
		||||
            git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no"
 | 
			
		||||
            g = git.cmd.Git(f"{config['ansible_path']}")
 | 
			
		||||
            logger.debug("Performing git pull")
 | 
			
		||||
            g.pull(rebase=True, env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
 | 
			
		||||
            logger.debug("Performing git submodule update")
 | 
			
		||||
            g.submodule("update", "--init", env=dict(GIT_SSH_COMMAND=git_ssh_cmd))
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logger.warn(e)
 | 
			
		||||
            notifications.send_webhook(config, "failure", "Failed to update Git repository")
 | 
			
		||||
    logger.info("Completed repository synchonization")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def commit_repository(config):
 | 
			
		||||
    """
 | 
			
		||||
    Commit uncommitted changes to the Ansible git repository
 | 
			
		||||
    """
 | 
			
		||||
    lockfile = "/tmp/pvcbootstrapd-git.lock"
 | 
			
		||||
    lock = FileLock(lockfile)
 | 
			
		||||
    with lock:
 | 
			
		||||
        logger.info(
 | 
			
		||||
            f"Committing changes to local configuration repository {config['ansible_path']}"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            g = git.cmd.Git(f"{config['ansible_path']}")
 | 
			
		||||
            g.add("--all")
 | 
			
		||||
@@ -102,10 +111,12 @@ def push_repository(config):
 | 
			
		||||
    """
 | 
			
		||||
    Push changes to the default remote
 | 
			
		||||
    """
 | 
			
		||||
    lockfile = "/tmp/pvcbootstrapd-git.lock"
 | 
			
		||||
    lock = FileLock(lockfile)
 | 
			
		||||
    with lock:
 | 
			
		||||
        logger.info(
 | 
			
		||||
            f"Pushing changes from local configuration repository {config['ansible_path']}"
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            git_ssh_cmd = f"ssh -i {config['ansible_keyfile']} -o StrictHostKeyChecking=no"
 | 
			
		||||
            g = git.Repo(f"{config['ansible_path']}")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user