E9F81B77CBCEA87E383DBF0 $ˆl–äY>”Êe¶¥2 ^¸Ó·˜´oÄ „ n´ÃÂÁ=}# SPDX-License-Identifier: LGPL-2.1-or-later # # Copyright (C) 2011-2023 Red Hat, Inc. # # Author: Tony Asleson # Gris Ge from lsm import (uri_parse, VERSION, Capabilities, INfs, IStorageAreaNetwork, search_property, Client, LsmError, ErrorNumber) from sim_plugin.simarray import SimArray class SimPlugin(INfs, IStorageAreaNetwork): """ Simple class that implements enough to allow the framework to be exercised. """ def __init__(self): self.uri = None self.password = None self.sim_array = None def plugin_register(self, uri, password, timeout, flags=0): self.uri = uri self.password = password # The caller may want to start clean, so we allow the caller to specify # a file to store and retrieve individual state. qp = uri_parse(uri) if 'parameters' in qp and 'statefile' in qp['parameters'] \ and qp['parameters']['statefile'] is not None: self.sim_array = SimArray(qp['parameters']['statefile'], timeout) else: self.sim_array = SimArray(None, timeout) return None def plugin_unregister(self, flags=0): pass def job_status(self, job_id, flags=0): return self.sim_array.job_status(job_id, flags) def job_free(self, job_id, flags=0): return self.sim_array.job_free(job_id, flags) @staticmethod def _sim_data_2_lsm(sim_data): """ Fake converter. SimArray already do SimData to LSM data convert. We move data convert to SimArray to make this sample plugin looks clean. But in real world, data converting is often handled by plugin itself rather than array. """ return sim_data def time_out_set(self, ms, flags=0): self.sim_array.time_out_set(ms, flags) return None def time_out_get(self, flags=0): return self.sim_array.time_out_get(flags) def capabilities(self, system, flags=0): rc = Capabilities() rc.enable_all() rc.set(Capabilities.POOLS_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.VOLUMES_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.DISKS_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.FS_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.ACCESS_GROUPS_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.NFS_EXPORTS_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.TARGET_PORTS_QUICK_SEARCH, Capabilities.UNSUPPORTED) rc.set(Capabilities.VOLUME_PHYSICAL_DISK_CACHE_UPDATE_SYSTEM_LEVEL, Capabilities.UNSUPPORTED) rc.set(Capabilities.VOLUME_WRITE_CACHE_POLICY_UPDATE_IMPACT_READ, Capabilities.UNSUPPORTED) rc.set(Capabilities.VOLUME_WRITE_CACHE_POLICY_UPDATE_WB_IMPACT_OTHER, Capabilities.UNSUPPORTED) rc.set(Capabilities.VOLUME_READ_CACHE_POLICY_UPDATE_IMPACT_WRITE, Capabilities.UNSUPPORTED) return rc def plugin_info(self, flags=0): return "Storage simulator", VERSION def systems(self, flags=0): sim_syss = self.sim_array.systems() return [SimPlugin._sim_data_2_lsm(s) for s in sim_syss] def system_read_cache_pct_update(self, system, read_pct, flags=0): return self.sim_array.system_read_cache_pct_update(system, read_pct) def pools(self, search_key=None, search_value=None, flags=0): sim_pools = self.sim_array.pools(flags) return search_property( [SimPlugin._sim_data_2_lsm(p) for p in sim_pools], search_key, search_value) def volumes(self, search_key=None, search_value=None, flags=0): sim_vols = self.sim_array.volumes() return search_property( [SimPlugin._sim_data_2_lsm(v) for v in sim_vols], search_key, search_value