From cc96f30a504aa32030eafefdba69d635869c7949 Mon Sep 17 00:00:00 2001 From: Alexis de Talhouët Date: Thu, 18 Apr 2019 16:27:20 -0400 Subject: Add support for Ansible packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rework how to provide packages - support proxy as parameters Change-Id: I1d10d921ead0837aa0f74b965cadf985424ceedc Issue-ID: CCCSDK-1215 Signed-off-by: Alexis de Talhouët --- .../src/main/python/command_executor_handler.py | 79 ++++++++++++++++++---- 1 file changed, 66 insertions(+), 13 deletions(-) (limited to 'ms/command-executor/src/main/python/command_executor_handler.py') diff --git a/ms/command-executor/src/main/python/command_executor_handler.py b/ms/command-executor/src/main/python/command_executor_handler.py index 4ae575b0f..248e44308 100644 --- a/ms/command-executor/src/main/python/command_executor_handler.py +++ b/ms/command-executor/src/main/python/command_executor_handler.py @@ -13,32 +13,51 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from builtins import Exception, open, dict +from subprocess import CalledProcessError, PIPE + import logging import os import subprocess import virtualenv import venv -from builtins import Exception, open, dict -from subprocess import CalledProcessError, PIPE - import utils +import proto.CommandExecutor_pb2 as CommandExecutor_pb2 -class CommandExecutorHandler: +class CommandExecutorHandler(): def __init__(self, request): + self.request = request self.logger = logging.getLogger(self.__class__.__name__) self.blueprint_id = utils.get_blueprint_id(request) self.venv_home = '/opt/app/onap/blueprints/deploy/' + self.blueprint_id + self.installed = self.venv_home + '/.installed' - def prepare_env(self, request, results): - self.create_venv() - if not self.activate_venv(): + def is_installed(self): + if os.path.exists(self.installed): + return True + else: return False - for package in request.packages: - if not self.install(package, results): + def prepare_env(self, request, results): + if not self.is_installed(): + self.create_venv() + if not self.activate_venv(): + return False + + f = open(self.installed, "w+") + if not self.install_packages(request, CommandExecutor_pb2.PYTHON, f, results): + return False + f.write("\r\n") + results.append("\n") + if not self.install_packages(request, CommandExecutor_pb2.ANSIBLE, f, results): return False + f.close() + else: + f = open(self.installed, "r") + results.append(f.read()) + f.close() # deactivate_venv(blueprint_id) return True @@ -57,16 +76,50 @@ class CommandExecutorHandler: # deactivate_venv(blueprint_id) return True - def install(self, package, results): - self.logger.info("{} - Install package({}) in Python Virtual Environment".format(self.blueprint_id, package)) + def install_packages(self, request, type, f, results): + for package in request.packages: + if package.type == type: + f.write("Installed %s packages:\r\n" % CommandExecutor_pb2.PackageType.Name(type)) + for python_package in package.package: + f.write(" %s\r\n" % python_package) + if package.type == CommandExecutor_pb2.PYTHON: + success = self.install_python_packages(python_package, results) + else: + success = self.install_ansible_packages(python_package, results) + if not success: + f.close() + os.remove(self.installed) + return False + return True + + def install_python_packages(self, package, results): + self.logger.info( + "{} - Install Python package({}) in Python Virtual Environment".format(self.blueprint_id, package)) command = ["pip", "install", package] env = dict(os.environ) - # fixme - parameterize - # env['https_proxy'] = "https://fastweb.int.bell.ca:8083" + env['https_proxy'] = os.environ['https_proxy'] + + try: + results.append(subprocess.run(command, check=True, stdout=PIPE, stderr=PIPE, env=env).stdout.decode()) + results.append("\n") + return True + except CalledProcessError as e: + results.append(e.stderr.decode()) + return False + + def install_ansible_packages(self, package, results): + self.logger.info( + "{} - Install Ansible Role package({}) in Python Virtual Environment".format(self.blueprint_id, package)) + command = ["ansible-galaxy", "install", package, "-p", "Scripts/ansible/roles"] + + env = dict(os.environ) + # ansible galaxy uses https_proxy environment variable, but requires it to be set with http proxy value. + env['https_proxy'] = os.environ['http_proxy'] try: results.append(subprocess.run(command, check=True, stdout=PIPE, stderr=PIPE, env=env).stdout.decode()) + results.append("\n") return True except CalledProcessError as e: results.append(e.stderr.decode()) -- cgit 1.2.3-korg