Migrated extension to Fuel 9.1 support

* Added new decorators to handler
* Pipeline updated with method from node deployment info
* Fixed clone via ssh procedure. GIT_SSH_COMMAND is supported noly by
  git 2.3+ but 1.8 is installed on master node

Change-Id: Icfefa281ce8fa549412a6b219f28abb8d84c6dd8
This commit is contained in:
Dmitry Ukov 2016-09-19 12:04:23 +03:00
parent 8368289a69
commit 78fec444ad
3 changed files with 48 additions and 29 deletions

View File

@ -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

View File

@ -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.

View File

@ -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):