def remove_storagedriver(storagedriver_guid): """ Removes a Storage Driver (and, if it was the last Storage Driver for a vPool, the vPool is removed as well) """ # Get objects & Make some checks storagedriver = StorageDriver(storagedriver_guid) storagerouter = storagedriver.storagerouter ip = storagerouter.ip pmachine = storagerouter.pmachine vmachines = VMachineList.get_customer_vmachines() pmachine_guids = [vm.pmachine_guid for vm in vmachines] vpools_guids = [vm.vpool_guid for vm in vmachines if vm.vpool_guid is not None] vpool = storagedriver.vpool if pmachine.guid in pmachine_guids and vpool.guid in vpools_guids: raise RuntimeError('There are still vMachines served from the given Storage Driver') if any(vdisk for vdisk in vpool.vdisks if vdisk.storagedriver_id == storagedriver.storagedriver_id): raise RuntimeError('There are still vDisks served from the given Storage Driver') services = ['volumedriver_{0}'.format(vpool.name), 'failovercache_{0}'.format(vpool.name)] storagedrivers_left = False # Stop services for current_storagedriver in vpool.storagedrivers: if current_storagedriver.guid != storagedriver_guid: storagedrivers_left = True client = SSHClient.load(current_storagedriver.storagerouter.ip) for service in services: System.exec_remote_python(client, """ from ovs.plugin.provider.service import Service if Service.has_service('{0}'): Service.disable_service('{0}') """.format(service)) System.exec_remote_python(client, """ from ovs.plugin.provider.service import Service if Service.has_service('{0}'): Service.stop_service('{0}') """.format(service)) # Unconfigure Cinder ovsdb = PersistentFactory.get_client() key = str('ovs_openstack_cinder_%s' % storagedriver.vpool_guid) if ovsdb.exists(key): cinder_password, cinder_user, tenant_name, controller_ip, _ = ovsdb.get(key) client = SSHClient.load(ip) System.exec_remote_python(client, """ from ovs.extensions.openstack.cinder import OpenStackCinder osc = OpenStackCinder(cinder_password = '******', cinder_user = '******', tenant_name = '{2}', controller_ip = '{3}') osc.unconfigure_vpool('{4}', '{5}', {6}) """.format(cinder_password, cinder_user, tenant_name, controller_ip, vpool.name, storagedriver.mountpoint, not storagedrivers_left)) if not storagedrivers_left: ovsdb.delete(key) # KVM pool client = SSHClient.load(ip) if pmachine.hvtype == 'KVM': if vpool.name in client.run('virsh pool-list'): client.run('virsh pool-destroy {0}'.format(vpool.name)) try: client.run('virsh pool-undefine {0}'.format(vpool.name)) except: pass # Ignore undefine errors, since that can happen on re-entrance # Remove services client = SSHClient.load(ip) for service in services: System.exec_remote_python(client, """ from ovs.plugin.provider.service import Service if Service.has_service('{0}'): Service.remove_service(domain='openvstorage', name='{0}') """.format(service)) configuration_dir = System.read_remote_config(client, 'ovs.core.cfgdir') voldrv_arakoon_cluster_id = str(System.read_remote_config(client, 'volumedriver.arakoon.clusterid')) voldrv_arakoon_cluster = ArakoonManagementEx().getCluster(voldrv_arakoon_cluster_id) voldrv_arakoon_client_config = voldrv_arakoon_cluster.getClientConfig() arakoon_node_configs = [] for arakoon_node in voldrv_arakoon_client_config.keys(): arakoon_node_configs.append(ArakoonNodeConfig(arakoon_node, voldrv_arakoon_client_config[arakoon_node][0][0], voldrv_arakoon_client_config[arakoon_node][1])) vrouter_clusterregistry = ClusterRegistry(str(vpool.guid), voldrv_arakoon_cluster_id, arakoon_node_configs) # Reconfigure volumedriver if storagedrivers_left: node_configs = [] for current_storagedriver in vpool.storagedrivers: if current_storagedriver.guid != storagedriver_guid: node_configs.append(ClusterNodeConfig(str(current_storagedriver.storagedriver_id), str(current_storagedriver.cluster_ip), current_storagedriver.ports[0], current_storagedriver.ports[1], current_storagedriver.ports[2])) vrouter_clusterregistry.set_node_configs(node_configs) else: try: storagedriver_client = LocalStorageRouterClient('{0}/voldrv_vpools/{1}.json'.format(configuration_dir, vpool.name)) storagedriver_client.destroy_filesystem() vrouter_clusterregistry.erase_node_configs() except RuntimeError as ex: print('Could not destroy filesystem or erase node configs due to error: {}'.format(ex)) # Cleanup directories client = SSHClient.load(ip) client.run('rm -rf {}/read1_{}'.format(storagedriver.mountpoint_readcache1, vpool.name)) if storagedriver.mountpoint_readcache2: client.run('rm -rf {}/read2_{}'.format(storagedriver.mountpoint_readcache2, vpool.name)) client.run('rm -rf {}/sco_{}'.format(storagedriver.mountpoint_writecache, vpool.name)) client.run('rm -rf {}/foc_{}'.format(storagedriver.mountpoint_foc, vpool.name)) client.run('rm -rf {}/fd_{}'.format(storagedriver.mountpoint_writecache, vpool.name)) client.run('rm -rf {}/metadata_{}'.format(storagedriver.mountpoint_md, vpool.name)) client.run('rm -rf {}/tlogs_{}'.format(storagedriver.mountpoint_md, vpool.name)) client.run('rm -rf /var/rsp/{}'.format(vpool.name)) # Remove files client.run('rm -f {0}/voldrv_vpools/{1}.json'.format(configuration_dir, vpool.name)) # Remove top directories client.run('if [ -d {0} ] && [ ! "$(ls -A {0})" ]; then rmdir {0}; fi'.format(storagedriver.mountpoint_readcache1)) if storagedriver.mountpoint_readcache2: client.run('if [ -d {0} ] && [ ! "$(ls -A {0})" ]; then rmdir {0}; fi'.format(storagedriver.mountpoint_readcache2)) client.run('if [ -d {0} ] && [ ! "$(ls -A {0})" ]; then rmdir {0}; fi'.format(storagedriver.mountpoint_writecache)) client.run('if [ -d {0} ] && [ ! "$(ls -A {0})" ]; then rmdir {0}; fi'.format(storagedriver.mountpoint_foc)) client.run('if [ -d {0} ] && [ ! "$(ls -A {0})" ]; then rmdir {0}; fi'.format(storagedriver.mountpoint_md)) client.run('if [ -d {0} ] && [ ! "$(ls -A {0})" ]; then rmdir {0}; fi'.format(storagedriver.mountpoint)) # First model cleanup storagedriver.delete(abandon=True) # Detach from the log entries if storagedrivers_left: # Restart leftover services for current_storagedriver in vpool.storagedrivers: if current_storagedriver.guid != storagedriver_guid: client = SSHClient.load(current_storagedriver.storagerouter.ip) for service in services: System.exec_remote_python(client, """ from ovs.plugin.provider.service import Service if Service.has_service('{0}'): Service.enable_service('{0}') """.format(service)) System.exec_remote_python(client, """ from ovs.plugin.provider.service import Service if Service.has_service('{0}'): Service.start_service('{0}') """.format(service)) else: # Final model cleanup vpool.delete()