diff --git a/fuel_external_git/extension.py b/fuel_external_git/extension.py index 4a10bc6..fe0d213 100644 --- a/fuel_external_git/extension.py +++ b/fuel_external_git/extension.py @@ -28,7 +28,7 @@ from nailgun.logger import logger class OpenStackConfigPipeline(BasePipeline): # TODO(dukov) add cluster remove callback @classmethod - def process_deployment(cls, data, cluster, nodes, **kwargs): + def process_deployment_for_node(cls, node, node_data): """Updating deployment info Genereate OpenStack configuration hash based on configuration files @@ -46,9 +46,9 @@ class OpenStackConfigPipeline(BasePipeline): DEFAULT/crypt_strength: value: 6000 """ - repo = GitRepo.get_by_cluster_id(cluster.id) + repo = GitRepo.get_by_cluster_id(node.cluster_id) if not repo: - return data + return node_data GitRepo.checkout(repo) repo_path = os.path.join(const.REPOS_DIR, repo.repo_name) resource_mapping = ExternalGit.ext_settings['resource_mapping'] @@ -86,23 +86,22 @@ class OpenStackConfigPipeline(BasePipeline): logger.debug("Override configs {}".format(override_configs)) - for node_config in data: - common = copy.deepcopy(global_config) - roles = node_config['roles'] - uid = node_config['uid'] - logger.debug("Node {0} roles {1}".format(uid, roles)) - for role in roles: - utils.deep_merge(common, - override_configs['roles'].get(role, {})) - - logger.debug("Config Node {0} with roles {1}".format(uid, common)) - + common = copy.deepcopy(global_config) + roles = node_data['roles'] + uid = node_data['uid'] + logger.debug("Node {0} roles {1}".format(uid, roles)) + for role in roles: utils.deep_merge(common, - override_configs['nodes'].get(uid, {})) + override_configs['roles'].get(role, {})) - node_config['configuration'] = common - logger.info("Node {0} config from git {1}".format(uid, common)) - return data + logger.debug("Config Node {0} with roles {1}".format(uid, common)) + + utils.deep_merge(common, + override_configs['nodes'].get(uid, {})) + + node_data['configuration'] = common + logger.info("Node {0} config from git {1}".format(uid, common)) + return node_data # TODO(dukov) Remove decorator extension management is available diff --git a/fuel_external_git/handlers.py b/fuel_external_git/handlers.py index 989f477..1ff4bdd 100644 --- a/fuel_external_git/handlers.py +++ b/fuel_external_git/handlers.py @@ -16,10 +16,12 @@ from fuel_external_git.objects import GitRepoCollection from nailgun.api.v1.handlers.base import BaseHandler from nailgun.api.v1.handlers.base import CollectionHandler -from nailgun.api.v1.handlers.base import content +from nailgun.api.v1.handlers.base import handle_errors +from nailgun.api.v1.handlers.base import serialize from nailgun.api.v1.handlers.base import SingleHandler +from nailgun.api.v1.handlers.base import validate from nailgun.api.v1.validators import base -from nailgun.errors import errors +from nailgun import errors from nailgun import objects REPOS_DIR = '/var/lib/fuel_repos' @@ -63,6 +65,9 @@ class GitRepoHandler(SingleHandler): single = GitRepo validator = GitRepoValidator + @handle_errors + @validate + @serialize def GET(self, cluster_id, obj_id): """:returns: JSONized REST object. @@ -74,7 +79,9 @@ class GitRepoHandler(SingleHandler): obj = self.get_object_or_404(self.single, obj_id) return self.single.to_json(obj) - @content + @handle_errors + @validate + @serialize def PUT(self, cluster_id, obj_id): """:returns: JSONized REST object. @@ -100,7 +107,8 @@ class GitRepoHandler(SingleHandler): """ return self.PUT(cluster_id, obj_id) - @content + @handle_errors + @serialize def DELETE(self, cluster_id, obj_id): """:returns: JSONized REST object. @@ -114,7 +122,9 @@ class GitRepoHandler(SingleHandler): class GitRepoInit(BaseHandler): - @content + @handle_errors + @validate + @serialize def PUT(self, env_id, obj_id): """:returns: JSONized REST object. diff --git a/fuel_external_git/objects.py b/fuel_external_git/objects.py index 21550cb..1be0bfd 100644 --- a/fuel_external_git/objects.py +++ b/fuel_external_git/objects.py @@ -23,7 +23,7 @@ from git import exc from git import Repo from nailgun.db import db -from nailgun.errors import errors +from nailgun import errors from nailgun.logger import logger from nailgun.objects import Cluster from nailgun.objects import NailgunCollection @@ -57,7 +57,7 @@ class GitRepo(NailgunObject): except exc.NoSuchPathError: logger.debug("Repo folder does not exist. Cloning repo") self._create_key_file(instance.repo_name, instance.user_key) - os.environ['GIT_SSH_COMMAND'] = \ + os.environ['GIT_SSH'] = \ self._get_ssh_cmd(instance.repo_name) repo_path = os.path.join(const.REPOS_DIR, instance.repo_name) @@ -75,7 +75,7 @@ class GitRepo(NailgunObject): shutil.rmtree(repo_path) self._create_key_file(data['repo_name'], data['user_key']) - os.environ['GIT_SSH_COMMAND'] = self._get_ssh_cmd(data['repo_name']) + os.environ['GIT_SSH'] = self._get_ssh_cmd(data['repo_name']) repo = Repo.clone_from(data['git_url'], repo_path) instance = super(GitRepo, self).create(data) @@ -97,7 +97,7 @@ class GitRepo(NailgunObject): logger.debug('Key file does not exist. Creating...') self._create_key_file(instance.repo_name) - with instance.repo.git.custom_environment(GIT_SSH_COMMAND=ssh_cmd): + with instance.repo.git.custom_environment(GIT_SSH=ssh_cmd): commit = instance.repo.remotes.origin.fetch(refspec=instance.ref) commit = commit[0].commit instance.repo.head.reference = commit @@ -141,7 +141,7 @@ class GitRepo(NailgunObject): ssh_cmd = self._get_ssh_cmd(instance.repo_name) with instance.repo.git.custom_environment( - GIT_SSH_COMMAND=ssh_cmd): + GIT_SSH=ssh_cmd): res = instance.repo.remotes.origin.push( refspec='HEAD:' + instance.ref) logger.debug("Push result {}".format(res[0].flags)) @@ -166,7 +166,17 @@ class GitRepo(NailgunObject): @classmethod def _get_ssh_cmd(self, repo_name): key_path = self._get_key_path(repo_name) - return 'ssh -o StrictHostKeyChecking=no -i ' + key_path + git_ssh_file = os.path.join(const.REPOS_DIR, repo_name + '.sh') + with open(git_ssh_file, 'w') as ssh_wrap: + ssh_wrap.write("#!/bin/bash\n") + ssh_wrap.write(( + "exec /usr/bin/ssh " + "-o UserKnownHostsFile=/dev/null " + "-o StrictHostKeyChecking=no " + "-i {0} \"$@\"".format(key_path) + )) + os.chmod(git_ssh_file, 0o755) + return git_ssh_file class GitRepoCollection(NailgunCollection):