Source code for prestoadmin.package
# -*- coding: utf-8 -*-
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Module for rpm package deploy and install using presto-admin
"""
import logging
from fabric.context_managers import settings, hide, shell_env
from fabric.decorators import task, runs_once
from fabric.operations import sudo, put, os, local
from fabric.state import env
from fabric.tasks import execute
from fabric.utils import abort
from prestoadmin.util import constants
from prestoadmin.standalone.config import StandaloneConfig
from prestoadmin.util.base_config import requires_config
from prestoadmin.util.fabricapi import get_host_list
_LOGGER = logging.getLogger(__name__)
__all__ = ['install', 'uninstall']
@task
@runs_once
@requires_config(StandaloneConfig)
[docs]def install(local_path):
"""
Install the rpm package on the cluster
Args:
local_path: Absolute path to the rpm to be installed
--nodeps (optional): Flag to indicate if rpm install
should ignore checking package dependencies. Equivalent
to adding --nodeps flag to rpm -i.
"""
check_if_valid_rpm(local_path)
return execute(deploy_install, local_path, hosts=get_host_list())
def check_if_valid_rpm(local_path):
_LOGGER.info("Checking rpm checksum to see if it is corrupted")
with settings(hide('warnings', 'stdout'), warn_only=True):
result = local('rpm -K --nosignature ' + local_path, capture=True)
if 'MD5 NOT OK' in result.stdout:
abort("Corrupted RPM. Try downloading the RPM again.")
elif result.stderr:
abort(result.stderr)
def deploy_install(local_path):
deploy_action(local_path, rpm_install)
def deploy_upgrade(local_path):
deploy_action(local_path, rpm_upgrade)
def deploy_action(local_path, rpm_action):
deploy(local_path)
rpm_action(os.path.basename(local_path))
def deploy(local_path=None):
if not os.path.isfile(local_path):
abort('RPM file not found at %s.' % local_path)
_LOGGER.info("Deploying rpm on %s..." % env.host)
print("Deploying rpm on %s..." % env.host)
sudo('mkdir -p ' + constants.REMOTE_PACKAGES_PATH)
ret_list = put(local_path, constants.REMOTE_PACKAGES_PATH, use_sudo=True)
if not ret_list.succeeded:
_LOGGER.warn("Failure during put. Now using /tmp as temp dir...")
ret_list = put(local_path, constants.REMOTE_PACKAGES_PATH,
use_sudo=True, temp_dir='/tmp')
if ret_list.succeeded:
print("Package deployed successfully on: " + env.host)
def _rpm_install(package_path):
nodeps = _nodeps_rpm_option()
if 'java8_home' not in env or env.java8_home is None:
return sudo('rpm -i %s%s' % (nodeps, package_path))
else:
with shell_env(JAVA8_HOME='%s' % env.java8_home):
return sudo('rpm -i %s%s' % (nodeps, package_path))
def _nodeps_rpm_option():
nodeps = ''
if env.nodeps:
nodeps = '--nodeps '
return nodeps
def rpm_install(rpm_name):
_LOGGER.info("Installing the rpm")
if _rpm_install(_rpm_path(rpm_name)).succeeded:
print("Package installed successfully on: " + env.host)
def _rpm_path(rpm_filename):
return os.path.join(constants.REMOTE_PACKAGES_PATH, rpm_filename)
def rpm_upgrade(rpm_name):
_LOGGER.info("Upgrading the rpm")
rpm_path = _rpm_path(rpm_name)
package_name = sudo('rpm -qp --queryformat \'%%{NAME}\' %s' % rpm_path,
quiet=True)
if not package_name.succeeded:
abort("Corrupted RPM file: %s" % rpm_path)
if _rpm_upgrade(rpm_path).succeeded:
print("Package upgraded successfully on: " + env.host)
def _rpm_upgrade(package_name):
return sudo('rpm -U %s%s' % (_nodeps_rpm_option(), package_name))
@task
@runs_once
@requires_config(StandaloneConfig)
[docs]def uninstall(rpm_name):
"""
Uninstall the rpm package from the cluster
Args:
rpm_name: Name of the rpm to be uninstalled
--nodeps (optional): Flag to indicate if rpm uninstall) should ignore checking package dependencies. Equivalent
to adding --nodeps flag to rpm -e.
--force (optional): Flag to indicate that rpm uninstall should not fail if package is not installed.
"""
return execute(rpm_uninstall, rpm_name, hosts=get_host_list())
def rpm_uninstall(package_name):
_LOGGER.info("Uninstalling the rpm")
if not is_rpm_installed(package_name):
if not env.force:
abort('Package is not installed: ' + package_name)
elif _rpm_uninstall(package_name).succeeded:
print("Package uninstalled successfully on: " + env.host)
def is_rpm_installed(package_name):
return sudo('rpm -qi %s' % package_name, quiet=True).succeeded
def _rpm_uninstall(package_name):
return sudo('rpm -e %s%s' % (_nodeps_rpm_option(), package_name))