def extend_arakoon(cluster_name, master_storagerouter_ip, storagerouter_ip, cluster_basedir, service_type=ServiceType.ARAKOON_CLUSTER_TYPES.FWK, clustered_nodes=None): """ Adds a external arakoon to a storagerouter :param cluster_name: name of the already existing arakoon cluster :type cluster_name: str :param master_storagerouter_ip: master ip address of the existing arakoon cluster e.g. 10.100.199.11 :type master_storagerouter_ip: str :param storagerouter_ip: ip of a new storagerouter to extend to e.g. 10.100.199.12 :type storagerouter_ip: str :param cluster_basedir: absolute path for the new arakoon cluster :type cluster_basedir: str :param service_type: type of plugin for arakoon (DEFAULT=ServiceType.ARAKOON_CLUSTER_TYPES.FWK) * FWK * ABM * NSM :type service_type: ovs.dal.hybrids.ServiceType.ARAKOON_CLUSTER_TYPES :param clustered_nodes: nodes who are available for the arakoon (including the to be extended_arakoon) e.g. ['10.100.199.11', '10.100.199.12'] (DEFAULT=[]) :type clustered_nodes: list :return: is created or not :rtype: bool """ if clustered_nodes is None: clustered_nodes = [] client = SSHClient(storagerouter_ip, username='******') # create required directories if not client.dir_exists(cluster_basedir): client.dir_create(cluster_basedir) ArakoonSetup.LOGGER.info( "Starting extending arakoon cluster with name `{0}`, master_ip `{1}`, slave_ip `{2}`, base_dir `{3}`" .format(cluster_name, master_storagerouter_ip, storagerouter_ip, cluster_basedir)) arakoon_installer = ArakoonInstaller(cluster_name) arakoon_installer.load() arakoon_installer.extend_cluster( new_ip=storagerouter_ip, base_dir=cluster_basedir, locked=False, log_sinks=Logger.get_sink_path('automation_lib_arakoon_server'), crash_log_sinks=Logger.get_sink_path( 'automation_lib_arakoon_server_crash')) if service_type == ServiceType.ARAKOON_CLUSTER_TYPES.ABM: client.run([ 'ln', '-s', '/usr/lib/alba/albamgr_plugin.cmxs', '{0}/arakoon/{1}/db'.format(cluster_basedir, cluster_name) ]) elif service_type == ServiceType.ARAKOON_CLUSTER_TYPES.NSM: client.run([ 'ln', '-s', '/usr/lib/alba/nsm_host_plugin.cmxs', '{0}/arakoon/{1}/db'.format(cluster_basedir, cluster_name) ]) # checking if we need to restart the given nodes if len(clustered_nodes) != 0: ArakoonSetup.LOGGER.info( "Trying to restart all given nodes of arakoon: {0}".format( clustered_nodes, cluster_name)) arakoon_installer.restart_cluster_after_extending( new_ip=storagerouter_ip) ArakoonSetup.LOGGER.info( "Finished restarting all given nodes of arakoon: {0}".format( clustered_nodes, cluster_name)) ArakoonSetup.LOGGER.info( "Finished extending arakoon cluster with name `{0}`, master_ip `{1}`, slave_ip `{2}`, base_dir `{3}`" .format(cluster_name, master_storagerouter_ip, storagerouter_ip, cluster_basedir))
def add_arakoon(cluster_name, storagerouter_ip, cluster_basedir, service_type=ServiceType.ARAKOON_CLUSTER_TYPES.FWK): """ Adds a external arakoon to a storagerouter :param cluster_name: name of the new arakoon cluster :type cluster_name: str :param service_type: type of plugin for arakoon (DEFAULT=ServiceType.ARAKOON_CLUSTER_TYPES.FWK) * FWK * ABM * NSM :type service_type: ovs.dal.hybrids.ServiceType.ARAKOON_CLUSTER_TYPES :param storagerouter_ip: ip of a storagerouter :type storagerouter_ip: str :param cluster_basedir: absolute path for the new arakoon cluster :type cluster_basedir: str :return: """ client = SSHClient(storagerouter_ip, username='******') # create required directories if not client.dir_exists(cluster_basedir): client.dir_create(cluster_basedir) # determine plugin if service_type == ServiceType.ARAKOON_CLUSTER_TYPES.FWK: plugins = None elif service_type == ServiceType.ARAKOON_CLUSTER_TYPES.ABM: plugins = { AlbaController.ABM_PLUGIN: AlbaController.ALBA_VERSION_GET } elif service_type == ServiceType.ARAKOON_CLUSTER_TYPES.NSM: plugins = { AlbaController.NSM_PLUGIN: AlbaController.ALBA_VERSION_GET } else: raise RuntimeError( "Incompatible Arakoon cluster type selected: {0}".format( service_type)) ArakoonSetup.LOGGER.info( "Starting creation of new arakoon cluster with name `{0}`, servicetype `{1}`, ip `{2}`, base_dir `{3}`" .format(cluster_name, service_type, storagerouter_ip, cluster_basedir)) arakoon_installer = ArakoonInstaller(cluster_name) arakoon_installer.create_cluster( cluster_type=service_type, ip=storagerouter_ip, base_dir=cluster_basedir, plugins=plugins, locked=False, internal=False, log_sinks=Logger.get_sink_path('automation_lib_arakoon_server'), crash_log_sinks=Logger.get_sink_path( 'automation_lib_arakoon_server_crash')) if service_type == ServiceType.ARAKOON_CLUSTER_TYPES.ABM: client.run([ 'ln', '-s', '/usr/lib/alba/albamgr_plugin.cmxs', '{0}/arakoon/{1}/db'.format(cluster_basedir, cluster_name) ]) elif service_type == ServiceType.ARAKOON_CLUSTER_TYPES.NSM: client.run([ 'ln', '-s', '/usr/lib/alba/nsm_host_plugin.cmxs', '{0}/arakoon/{1}/db'.format(cluster_basedir, cluster_name) ]) arakoon_installer.start_cluster() arakoon_installer.unclaim_cluster() ArakoonSetup.LOGGER.info( "Finished creation of new arakoon cluster with name `{0}`, servicetype `{1}`, ip `{2}`, base_dir `{3}`" .format(cluster_name, service_type, storagerouter_ip, cluster_basedir))
def start_services(self): """ Start all services related to the Storagedriver :return: None :rtype: NoneType """ if self.sr_installer is None: raise RuntimeError('No StorageRouterInstaller instance found') vpool = self.vp_installer.vpool root_client = self.sr_installer.root_client storagerouter = self.sr_installer.storagerouter alba_pkg_name, alba_version_cmd = PackageFactory.get_package_and_version_cmd_for(component=PackageFactory.COMP_ALBA) voldrv_pkg_name, voldrv_version_cmd = PackageFactory.get_package_and_version_cmd_for(component=PackageFactory.COMP_SD) # Add/start watcher volumedriver service if not self.service_manager.has_service(name=ServiceFactory.SERVICE_WATCHER_VOLDRV, client=root_client): self.service_manager.add_service(name=ServiceFactory.SERVICE_WATCHER_VOLDRV, client=root_client) self.service_manager.start_service(name=ServiceFactory.SERVICE_WATCHER_VOLDRV, client=root_client) # Add/start DTL service self.service_manager.add_service(name=self.SERVICE_TEMPLATE_DTL, params={'DTL_PATH': self.storagedriver_partition_dtl.path, 'DTL_ADDRESS': self.storagedriver.storage_ip, 'DTL_PORT': str(self.storagedriver.ports['dtl']), 'DTL_TRANSPORT': StorageDriverClient.VPOOL_DTL_TRANSPORT_MAP[self.dtl_transport], 'LOG_SINK': Logger.get_sink_path('storagedriver-dtl_{0}'.format(self.storagedriver.storagedriver_id)), 'VOLDRV_PKG_NAME': voldrv_pkg_name, 'VOLDRV_VERSION_CMD': voldrv_version_cmd}, client=root_client, target_name=self.dtl_service) self.service_manager.start_service(name=self.dtl_service, client=root_client) # Add/start ALBA proxy services for proxy in self.storagedriver.alba_proxies: alba_proxy_service = 'ovs-{0}'.format(proxy.service.name) self.service_manager.add_service(name=self.SERVICE_TEMPLATE_PROXY, params={'VPOOL_NAME': vpool.name, 'LOG_SINK': Logger.get_sink_path(proxy.service.name), 'CONFIG_PATH': Configuration.get_configuration_path('/ovs/vpools/{0}/proxies/{1}/config/main'.format(vpool.guid, proxy.guid)), 'ALBA_PKG_NAME': alba_pkg_name, 'ALBA_VERSION_CMD': alba_version_cmd}, client=root_client, target_name=alba_proxy_service) self.service_manager.start_service(name=alba_proxy_service, client=root_client) # Add/start StorageDriver service self.service_manager.add_service(name=self.SERVICE_TEMPLATE_SD, params={'KILL_TIMEOUT': '30', 'VPOOL_NAME': vpool.name, 'VPOOL_MOUNTPOINT': self.storagedriver.mountpoint, 'CONFIG_PATH': StorageDriverConfiguration(vpool_guid=vpool.guid, storagedriver_id=self.storagedriver.storagedriver_id).remote_path, 'OVS_UID': root_client.run(['id', '-u', 'ovs']).strip(), 'OVS_GID': root_client.run(['id', '-g', 'ovs']).strip(), 'LOG_SINK': Logger.get_sink_path('storagedriver_{0}'.format(self.storagedriver.storagedriver_id)), 'VOLDRV_PKG_NAME': voldrv_pkg_name, 'VOLDRV_VERSION_CMD': voldrv_version_cmd, 'METADATASTORE_BITS': 5}, client=root_client, target_name=self.sd_service) current_startup_counter = self.storagedriver.startup_counter self.service_manager.start_service(name=self.sd_service, client=root_client) tries = 60 while self.storagedriver.startup_counter == current_startup_counter and tries > 0: self._logger.debug('Waiting for the StorageDriver to start up for vPool {0} on StorageRouter {1} ...'.format(vpool.name, storagerouter.name)) if self.service_manager.get_service_status(name=self.sd_service, client=root_client) != 'active': raise RuntimeError('StorageDriver service failed to start (service not running)') tries -= 1 time.sleep(60 - tries) self.storagedriver.discard() if self.storagedriver.startup_counter == current_startup_counter: raise RuntimeError('StorageDriver service failed to start (got no event)') self._logger.debug('StorageDriver running')