Stop using pkg_dir all over and correctly uninstall clients.

Fixes bug: #1192379

Change-Id: I66e0925120809a2e39f71fdab8b1f6c50d4abdef
This commit is contained in:
Joshua Harlow 2013-06-18 16:16:11 -07:00
parent 4f682ab484
commit 31c762941e
3 changed files with 86 additions and 56 deletions

View File

@ -112,8 +112,9 @@ class Component(object):
names.add(pack["name"]) names.add(pack["name"])
except (AttributeError, KeyError): except (AttributeError, KeyError):
pass pass
daemon_to_package = self.distro._components[self.name].get( daemon_to_package = self.get_option("daemon_to_package")
"daemon_to_package", {}) if not daemon_to_package:
daemon_to_package = {}
for key in self.subsystem_names(): for key in self.subsystem_names():
try: try:
names.add(daemon_to_package[key]) names.add(daemon_to_package[key])

View File

@ -22,6 +22,7 @@ import rpm
from anvil import colorizer from anvil import colorizer
from anvil import env from anvil import env
from anvil import exceptions as excp
from anvil import log as logging from anvil import log as logging
from anvil.packaging import base from anvil.packaging import base
from anvil.packaging.helpers import pip_helper from anvil.packaging.helpers import pip_helper
@ -115,7 +116,7 @@ class YumDependencyHandler(base.DependencyHandler):
else: else:
app_dir = instance.get_option("app_dir") app_dir = instance.get_option("app_dir")
if sh.isdir(app_dir): if sh.isdir(app_dir):
self._build_openstack_package(app_dir) self._build_openstack_package(instance)
self._move_rpms("anvil") self._move_rpms("anvil")
def package_finish(self): def package_finish(self):
@ -207,10 +208,6 @@ class YumDependencyHandler(base.DependencyHandler):
utils.log_iterable(sorted(repos[r]), logger=LOG, header=header) utils.log_iterable(sorted(repos[r]), logger=LOG, header=header)
return pips_to_download return pips_to_download
@staticmethod
def _get_component_name(pkg_dir):
return sh.basename(sh.dirname(pkg_dir))
def _build_dependencies(self): def _build_dependencies(self):
(pips_downloaded, package_files) = self.download_dependencies() (pips_downloaded, package_files) = self.download_dependencies()
@ -273,9 +270,11 @@ class YumDependencyHandler(base.DependencyHandler):
quiet=True) quiet=True)
p_bar.update(i + 1) p_bar.update(i + 1)
def _write_spec_file(self, pkg_dir, rpm_name, template_name, params): def _write_spec_file(self, app_dir, rpm_name, template_name, params):
egg_details = pip_helper.get_directory_details(pkg_dir) requires_what = []
requires_what = egg_details['dependencies'] if sh.isfile(sh.joinpths(app_dir, "setup.py")):
egg_info = pip_helper.get_directory_details(app_dir)
requires_what = egg_info['dependencies']
params['requires'] = self._convert_names_python2rpm(requires_what) params['requires'] = self._convert_names_python2rpm(requires_what)
params["epoch"] = self.OPENSTACK_EPOCH params["epoch"] = self.OPENSTACK_EPOCH
content = utils.load_template(self.SPEC_TEMPLATE_DIR, template_name)[1] content = utils.load_template(self.SPEC_TEMPLATE_DIR, template_name)[1]
@ -304,20 +303,20 @@ class YumDependencyHandler(base.DependencyHandler):
sh.write_file(target_filename, sh.write_file(target_filename,
utils.expand_template(common_init_content, params)) utils.expand_template(common_init_content, params))
def _copy_sources(self, pkg_dir): def _copy_sources(self, instance):
component_name = self._get_component_name(pkg_dir)
other_sources_dir = sh.joinpths(settings.TEMPLATE_DIR, other_sources_dir = sh.joinpths(settings.TEMPLATE_DIR,
"packaging/sources", component_name) "packaging", "sources", instance.name)
if sh.isdir(other_sources_dir): if sh.isdir(other_sources_dir):
for filename in sh.listdir(other_sources_dir, files_only=True): for filename in sh.listdir(other_sources_dir, files_only=True):
sh.copy(filename, self.rpm_sources_dir) sh.copy(filename, self.rpm_sources_dir)
def _build_from_spec(self, pkg_dir, spec_filename): def _build_from_spec(self, instance, spec_filename):
if sh.isfile(sh.joinpths(pkg_dir, "setup.py")): app_dir = instance.get_option('app_dir')
self._write_python_tarball(pkg_dir) if sh.isfile(sh.joinpths(app_dir, "setup.py")):
self._write_python_tarball(app_dir)
else: else:
self._write_git_tarball(pkg_dir, spec_filename) self._write_git_tarball(app_dir, spec_filename)
self._copy_sources(pkg_dir) self._copy_sources(instance)
self._copy_startup_scripts(spec_filename) self._copy_startup_scripts(spec_filename)
cmdline = [ cmdline = [
self.rpmbuild_executable, self.rpmbuild_executable,
@ -363,48 +362,65 @@ class YumDependencyHandler(base.DependencyHandler):
] ]
sh.execute(cmdline, cwd=pkg_dir) sh.execute(cmdline, cwd=pkg_dir)
def _build_openstack_package(self, pkg_dir): @staticmethod
component_name = self._get_component_name(pkg_dir) def _is_client(instance_name, egg_name):
params = {} for i in [instance_name, egg_name]:
if i and i.endswith("client"):
return True
return False
def _get_template_and_rpm_name(self, instance):
rpm_name = None rpm_name = None
template_name = None template_name = None
if sh.isfile(sh.joinpths(pkg_dir, "setup.py")): app_dir = instance.get_option('app_dir')
egg_info = pip_helper.get_directory_details(pkg_dir) if sh.isfile(sh.joinpths(app_dir, "setup.py")):
name = egg_info['name'] egg_info = pip_helper.get_directory_details(app_dir)
params["version"] = egg_info["version"] egg_name = egg_info['name']
if component_name.endswith("client"): if self._is_client(instance.name, egg_name):
clientname = utils.strip_prefix_suffix(name, rpm_name = egg_name
"python-", "client")
if not clientname:
LOG.error("Bad client package name %s", name)
return
params["clientname"] = clientname
params["apiname"] = self.API_NAMES.get(clientname,
clientname.title())
rpm_name = name
template_name = "python-commonclient.spec" template_name = "python-commonclient.spec"
elif component_name in self.SERVER_NAMES: elif instance.name in self.SERVER_NAMES:
rpm_name = "openstack-%s" % name rpm_name = "openstack-%s" % (egg_name)
else: else:
rpm_name = self.TRANSLATION_NAMES.get(component_name) rpm_name = self.TRANSLATION_NAMES.get(instance.name)
else: else:
rpm_name = component_name rpm_name = instance.name
template_name = "%s.spec" % rpm_name template_name = "%s.spec" % rpm_name
return (rpm_name, template_name)
def _build_openstack_package(self, instance):
params = {}
(rpm_name, template_name) = self._get_template_and_rpm_name(instance)
app_dir = instance.get_option('app_dir')
if sh.isfile(sh.joinpths(app_dir, "setup.py")):
egg_info = pip_helper.get_directory_details(app_dir)
egg_name = egg_info['name']
params["version"] = egg_info["version"]
if self._is_client(instance.name, egg_name):
client_name = utils.strip_prefix_suffix(egg_name,
"python-", "client")
if not client_name:
msg = "Bad client package name %s" % (egg_name)
raise excp.PackageException(msg)
params["clientname"] = client_name
params["apiname"] = self.API_NAMES.get(client_name,
client_name.title())
else:
spec_filename = sh.joinpths(settings.TEMPLATE_DIR, spec_filename = sh.joinpths(settings.TEMPLATE_DIR,
self.SPEC_TEMPLATE_DIR, template_name) self.SPEC_TEMPLATE_DIR, template_name)
if not sh.isfile(spec_filename): if not sh.isfile(spec_filename):
rpm_name = None rpm_name = None
if rpm_name: if rpm_name:
template_name = template_name or "%s.spec" % rpm_name template_name = template_name or "%s.spec" % rpm_name
spec_filename = self._write_spec_file(pkg_dir, rpm_name, spec_filename = self._write_spec_file(app_dir, rpm_name,
template_name, params) template_name, params)
self._build_from_spec(pkg_dir, spec_filename) self._build_from_spec(instance, spec_filename)
else: else:
cmdline = self.py2rpm_start_cmdline() + ["--", pkg_dir] cmdline = self.py2rpm_start_cmdline() + ["--", app_dir]
sh.execute_save_output(cmdline, sh.execute_save_output(cmdline,
cwd=pkg_dir, cwd=app_dir,
out_filename=sh.joinpths(self.log_dir, out_filename=sh.joinpths(self.log_dir,
component_name), instance.name),
quiet=True) quiet=True)
def _convert_names_python2rpm(self, python_names): def _convert_names_python2rpm(self, python_names):
@ -456,8 +472,6 @@ class YumDependencyHandler(base.DependencyHandler):
if rpm_names: if rpm_names:
cmdline = ["yum", "install", "-y"] + sorted(set(rpm_names)) cmdline = ["yum", "install", "-y"] + sorted(set(rpm_names))
sh.execute(cmdline, stdout_fh=sys.stdout, stderr_fh=sys.stderr) sh.execute(cmdline, stdout_fh=sys.stdout, stderr_fh=sys.stderr)
for name in rpm_names:
self.tracewriter.package_installed(name)
def uninstall(self): def uninstall(self):
super(YumDependencyHandler, self).uninstall() super(YumDependencyHandler, self).uninstall()
@ -465,11 +479,21 @@ class YumDependencyHandler(base.DependencyHandler):
# Don't take out packages that anvil requires to run... # Don't take out packages that anvil requires to run...
no_remove = env.get_key('REQUIRED_PACKAGES', '').split() no_remove = env.get_key('REQUIRED_PACKAGES', '').split()
no_remove = sorted(set(no_remove)) no_remove = sorted(set(no_remove))
rpm_names = []
scan_packages = []
for inst in self.instances: for inst in self.instances:
for p in inst.package_names(): scan_packages.extend(inst.package_names())
if self.helper.is_installed(p) and p not in no_remove: (rpm_name, _template_name) = self._get_template_and_rpm_name(inst)
rpm_names.append(p) scan_packages.append(rpm_name)
rpm_names = []
for p in scan_packages:
if not p:
continue
if p in no_remove:
continue
if self.helper.is_installed(p):
rpm_names.append(p)
if rpm_names: if rpm_names:
cmdline = ["yum", "remove", "--remove-leaves", "-y"] cmdline = ["yum", "remove", "--remove-leaves", "-y"]

View File

@ -70,6 +70,9 @@ components:
- name: hp3parclient - name: hp3parclient
daemon_to_package: daemon_to_package:
all: openstack-cinder all: openstack-cinder
volume: openstack-cinder
scheduler: openstack-cinder
api: openstack-cinder
cinder-client: cinder-client:
action_classes: action_classes:
install: anvil.components.base_install:PythonInstallComponent install: anvil.components.base_install:PythonInstallComponent
@ -211,13 +214,15 @@ components:
# other components actually can't use. This sucks... # other components actually can't use. This sucks...
- name: paramiko - name: paramiko
daemon_to_package: daemon_to_package:
api-metadata: openstack-nova-api api: openstack-nova-api
api-ec2: openstack-nova-api conductor: openstack-nova-conductor
api-os-compute: openstack-nova-api
dhcpbridge: openstack-nova-network
xvpvncproxy: openstack-nova-console
spicehtml5proxy: openstack-nova-console
consoleauth: openstack-nova-console consoleauth: openstack-nova-console
dhcpbridge: openstack-nova-network
network: openstack-nova-network
novncproxy: openstack-nova-novncproxy
scheduler: openstack-nova-scheduler
spicehtml5proxy: openstack-nova-console
xvpvncproxy: openstack-nova-console
nova-client: nova-client:
action_classes: action_classes:
install: anvil.components.base_install:PythonInstallComponent install: anvil.components.base_install:PythonInstallComponent