def get_heartbeat_data(self): """ Returns heartbeat data """ data = {'cid': Configuration.get('/ovs/framework/cluster_id'), 'nid': System.get_my_machine_id(), 'metadata': {}, 'errors': []} try: # Versions data['metadata']['versions'] = PackageManager.get_installed_versions() # Fallback to check_output except Exception, ex: data['errors'].append(str(ex))
def get_package_information_core(client, package_info): """ Called by GenericController.refresh_package_information() every hour Retrieve information about the currently installed versions of the core packages Retrieve information about the versions to which each package can potentially be updated If installed version is different from candidate version --> store this information in model Additionally check the services with a 'run' file Verify whether the running version is up-to-date with the candidate version If different --> store this information in the model Result: Every package with updates or which requires services to be restarted is stored in the model :param client: Client on which to collect the version information :type client: SSHClient :param package_info: Dictionary passed in by the thread calling this function :type package_info: dict :return: Package information :rtype: dict """ try: if client.username != 'root': raise RuntimeError('Only the "root" user can retrieve the package information') binaries = PackageManager.get_binary_versions(client=client, package_names=UpdateController.core_packages_with_binaries) installed = PackageManager.get_installed_versions(client=client, package_names=UpdateController.all_core_packages) candidate = PackageManager.get_candidate_versions(client=client, package_names=UpdateController.all_core_packages) if set(installed.keys()) != set(UpdateController.all_core_packages) or set(candidate.keys()) != set(UpdateController.all_core_packages): raise RuntimeError('Failed to retrieve the installed and candidate versions for packages: {0}'.format(', '.join(UpdateController.all_core_packages))) # Retrieve Arakoon information framework_arakoons = [] storagedriver_arakoons = [] for cluster, arakoon_list in {'cacc': framework_arakoons, 'ovsdb': framework_arakoons, 'voldrv': storagedriver_arakoons}.iteritems(): cluster_name = ArakoonClusterConfig.get_cluster_name(cluster) if cluster_name is None: continue if cluster == 'cacc': arakoon_metadata = ArakoonInstaller.get_arakoon_metadata_by_cluster_name(cluster_name=cluster_name, filesystem=True, ip=client.ip) else: arakoon_metadata = ArakoonInstaller.get_arakoon_metadata_by_cluster_name(cluster_name=cluster_name) if arakoon_metadata['internal'] is True: arakoon_list.append(ArakoonInstaller.get_service_name_for_cluster(cluster_name=arakoon_metadata['cluster_name'])) storagerouter = StorageRouterList.get_by_ip(client.ip) alba_proxies = [] for service in storagerouter.services: if service.type.name == ServiceType.SERVICE_TYPES.ALBA_PROXY: alba_proxies.append(service.name) storagedriver_services = [] for sd in storagerouter.storagedrivers: storagedriver_services.append('ovs-dtl_{0}'.format(sd.vpool.name)) storagedriver_services.append('ovs-volumedriver_{0}'.format(sd.vpool.name)) default_entry = {'candidate': None, 'installed': None, 'services_to_restart': []} # component: package_name: services_with_run_file for component, info in {'framework': {'arakoon': framework_arakoons, 'openvstorage': []}, 'storagedriver': {'alba': alba_proxies, 'arakoon': storagedriver_arakoons, 'volumedriver-no-dedup-base': [], 'volumedriver-no-dedup-server': storagedriver_services}}.iteritems(): component_info = {} for package, services in info.iteritems(): for service in services: service = ExtensionToolbox.remove_prefix(service, 'ovs-') version_file = '/opt/OpenvStorage/run/{0}.version'.format(service) if not client.file_exists(version_file): UpdateController._logger.warning('{0}: Failed to find a version file in /opt/OpenvStorage/run for service {1}'.format(client.ip, service)) continue package_name = package running_versions = client.file_read(version_file).strip() for version in running_versions.split(';'): version = version.strip() running_version = None if '=' in version: package_name = version.split('=')[0] running_version = version.split('=')[1] elif version: running_version = version if package_name not in UpdateController.all_core_packages: raise ValueError('Unknown package dependency found in {0}'.format(version_file)) if package_name not in binaries: raise RuntimeError('Binary version for package {0} was not retrieved'.format(package_name)) if running_version is not None and running_version != binaries[package_name]: if package_name not in component_info: component_info[package_name] = copy.deepcopy(default_entry) component_info[package_name]['installed'] = running_version component_info[package_name]['candidate'] = binaries[package_name] component_info[package_name]['services_to_restart'].append('ovs-{0}'.format(service)) if installed[package] != candidate[package] and package not in component_info: component_info[package] = copy.deepcopy(default_entry) component_info[package]['installed'] = installed[package] component_info[package]['candidate'] = candidate[package] if component_info: if component not in package_info[client.ip]: package_info[client.ip][component] = {} package_info[client.ip][component].update(component_info) except Exception as ex: if 'errors' not in package_info[client.ip]: package_info[client.ip]['errors'] = [] package_info[client.ip]['errors'].append(ex) return package_info