00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 from lsm import (uri_parse, VERSION, Capabilities, INfs,
00019 IStorageAreaNetwork, search_property)
00020
00021 from simarray import SimArray
00022
00023
00024 class SimPlugin(INfs, IStorageAreaNetwork):
00025 """
00026 Simple class that implements enough to allow the framework to be exercised.
00027 """
00028 def __init__(self):
00029 self.uri = None
00030 self.password = None
00031 self.sim_array = None
00032
00033 def plugin_register(self, uri, password, timeout, flags=0):
00034 self.uri = uri
00035 self.password = password
00036
00037
00038
00039 qp = uri_parse(uri)
00040 if 'parameters' in qp and 'statefile' in qp['parameters'] \
00041 and qp['parameters']['statefile'] is not None:
00042 self.sim_array = SimArray(qp['parameters']['statefile'], timeout)
00043 else:
00044 self.sim_array = SimArray(None, timeout)
00045
00046 return None
00047
00048 def plugin_unregister(self, flags=0):
00049 pass
00050
00051 def job_status(self, job_id, flags=0):
00052 return self.sim_array.job_status(job_id, flags)
00053
00054 def job_free(self, job_id, flags=0):
00055 return self.sim_array.job_free(job_id, flags)
00056
00057 @staticmethod
00058 def _sim_data_2_lsm(sim_data):
00059 """
00060 Fake converter. SimArray already do SimData to LSM data convert.
00061 We move data convert to SimArray to make this sample plugin looks
00062 clean.
00063 But in real world, data converting is often handled by plugin itself
00064 rather than array.
00065 """
00066 return sim_data
00067
00068 def time_out_set(self, ms, flags=0):
00069 self.sim_array.time_out_set(ms, flags)
00070 return None
00071
00072 def time_out_get(self, flags=0):
00073 return self.sim_array.time_out_get(flags)
00074
00075 def capabilities(self, system, flags=0):
00076 rc = Capabilities()
00077 rc.enable_all()
00078 rc.set(Capabilities.POOLS_QUICK_SEARCH, Capabilities.UNSUPPORTED)
00079 rc.set(Capabilities.VOLUMES_QUICK_SEARCH, Capabilities.UNSUPPORTED)
00080 rc.set(Capabilities.DISKS_QUICK_SEARCH, Capabilities.UNSUPPORTED)
00081 rc.set(Capabilities.FS_QUICK_SEARCH, Capabilities.UNSUPPORTED)
00082 rc.set(Capabilities.ACCESS_GROUPS_QUICK_SEARCH,
00083 Capabilities.UNSUPPORTED)
00084 rc.set(Capabilities.NFS_EXPORTS_QUICK_SEARCH, Capabilities.UNSUPPORTED)
00085 rc.set(Capabilities.TARGET_PORTS_QUICK_SEARCH,
00086 Capabilities.UNSUPPORTED)
00087 return rc
00088
00089 def plugin_info(self, flags=0):
00090 return "Storage simulator", VERSION
00091
00092 def systems(self, flags=0):
00093 sim_syss = self.sim_array.systems()
00094 return [SimPlugin._sim_data_2_lsm(s) for s in sim_syss]
00095
00096 def pools(self, search_key=None, search_value=None, flags=0):
00097 sim_pools = self.sim_array.pools(flags)
00098 return search_property(
00099 [SimPlugin._sim_data_2_lsm(p) for p in sim_pools],
00100 search_key, search_value)
00101
00102 def volumes(self, search_key=None, search_value=None, flags=0):
00103 sim_vols = self.sim_array.volumes()
00104 return search_property(
00105 [SimPlugin._sim_data_2_lsm(v) for v in sim_vols],
00106 search_key, search_value)
00107
00108 def disks(self, search_key=None, search_value=None, flags=0):
00109 sim_disks = self.sim_array.disks()
00110 return search_property(
00111 [SimPlugin._sim_data_2_lsm(d) for d in sim_disks],
00112 search_key, search_value)
00113
00114 def volume_create(self, pool, volume_name, size_bytes, provisioning,
00115 flags=0):
00116 sim_vol = self.sim_array.volume_create(
00117 pool.id, volume_name, size_bytes, provisioning, flags)
00118 return SimPlugin._sim_data_2_lsm(sim_vol)
00119
00120 def volume_delete(self, volume, flags=0):
00121 return self.sim_array.volume_delete(volume.id, flags)
00122
00123 def volume_resize(self, volume, new_size_bytes, flags=0):
00124 sim_vol = self.sim_array.volume_resize(
00125 volume.id, new_size_bytes, flags)
00126 return SimPlugin._sim_data_2_lsm(sim_vol)
00127
00128 def volume_replicate(self, pool, rep_type, volume_src, name, flags=0):
00129 dst_pool_id = None
00130
00131 if pool is not None:
00132 dst_pool_id = pool.id
00133 else:
00134 dst_pool_id = volume_src.pool_id
00135 return self.sim_array.volume_replicate(
00136 dst_pool_id, rep_type, volume_src.id, name, flags)
00137
00138 def volume_replicate_range_block_size(self, system, flags=0):
00139 return self.sim_array.volume_replicate_range_block_size(
00140 system.id, flags)
00141
00142 def volume_replicate_range(self, rep_type, volume_src, volume_dest,
00143 ranges, flags=0):
00144 return self.sim_array.volume_replicate_range(
00145 rep_type, volume_src.id, volume_dest.id, ranges, flags)
00146
00147 def volume_enable(self, volume, flags=0):
00148 return self.sim_array.volume_enable(volume.id, flags)
00149
00150 def volume_disable(self, volume, flags=0):
00151 return self.sim_array.volume_disable(volume.id, flags)
00152
00153 def access_groups(self, search_key=None, search_value=None, flags=0):
00154 sim_ags = self.sim_array.ags()
00155 return search_property(
00156 [SimPlugin._sim_data_2_lsm(a) for a in sim_ags],
00157 search_key, search_value)
00158
00159 def access_group_create(self, name, init_id, init_type, system,
00160 flags=0):
00161 sim_ag = self.sim_array.access_group_create(
00162 name, init_id, init_type, system.id, flags)
00163 return SimPlugin._sim_data_2_lsm(sim_ag)
00164
00165 def access_group_delete(self, access_group, flags=0):
00166 return self.sim_array.access_group_delete(access_group.id, flags)
00167
00168 def access_group_initiator_add(self, access_group, init_id, init_type,
00169 flags=0):
00170 sim_ag = self.sim_array.access_group_initiator_add(
00171 access_group.id, init_id, init_type, flags)
00172 return SimPlugin._sim_data_2_lsm(sim_ag)
00173
00174 def access_group_initiator_delete(self, access_group, init_id, init_type,
00175 flags=0):
00176 sim_ag = self.sim_array.access_group_initiator_delete(
00177 access_group.id, init_id, init_type, flags)
00178 return SimPlugin._sim_data_2_lsm(sim_ag)
00179
00180 def volume_mask(self, access_group, volume, flags=0):
00181 return self.sim_array.volume_mask(
00182 access_group.id, volume.id, flags)
00183
00184 def volume_unmask(self, access_group, volume, flags=0):
00185 return self.sim_array.volume_unmask(
00186 access_group.id, volume.id, flags)
00187
00188 def volumes_accessible_by_access_group(self, access_group, flags=0):
00189 sim_vols = self.sim_array.volumes_accessible_by_access_group(
00190 access_group.id, flags)
00191 return [SimPlugin._sim_data_2_lsm(v) for v in sim_vols]
00192
00193 def access_groups_granted_to_volume(self, volume, flags=0):
00194 sim_vols = self.sim_array.access_groups_granted_to_volume(
00195 volume.id, flags)
00196 return [SimPlugin._sim_data_2_lsm(v) for v in sim_vols]
00197
00198 def iscsi_chap_auth(self, init_id, in_user, in_password,
00199 out_user, out_password, flags=0):
00200 return self.sim_array.iscsi_chap_auth(
00201 init_id, in_user, in_password, out_user, out_password, flags)
00202
00203 def volume_child_dependency(self, volume, flags=0):
00204 return self.sim_array.volume_child_dependency(volume.id, flags)
00205
00206 def volume_child_dependency_rm(self, volume, flags=0):
00207 return self.sim_array.volume_child_dependency_rm(volume.id, flags)
00208
00209 def fs(self, search_key=None, search_value=None, flags=0):
00210 sim_fss = self.sim_array.fs()
00211 return search_property(
00212 [SimPlugin._sim_data_2_lsm(f) for f in sim_fss],
00213 search_key, search_value)
00214
00215 def fs_create(self, pool, name, size_bytes, flags=0):
00216 sim_fs = self.sim_array.fs_create(pool.id, name, size_bytes)
00217 return SimPlugin._sim_data_2_lsm(sim_fs)
00218
00219 def fs_delete(self, fs, flags=0):
00220 return self.sim_array.fs_delete(fs.id, flags)
00221
00222 def fs_resize(self, fs, new_size_bytes, flags=0):
00223 sim_fs = self.sim_array.fs_resize(
00224 fs.id, new_size_bytes, flags)
00225 return SimPlugin._sim_data_2_lsm(sim_fs)
00226
00227 def fs_clone(self, src_fs, dest_fs_name, snapshot=None, flags=0):
00228 if snapshot is None:
00229 return self.sim_array.fs_clone(
00230 src_fs.id, dest_fs_name, None, flags)
00231 return self.sim_array.fs_clone(
00232 src_fs.id, dest_fs_name, snapshot.id, flags)
00233
00234 def fs_file_clone(self, fs, src_file_name, dest_file_name, snapshot=None,
00235 flags=0):
00236 if snapshot is None:
00237 return self.sim_array.fs_file_clone(
00238 fs.id, src_file_name, dest_file_name, None, flags)
00239
00240 return self.sim_array.fs_file_clone(
00241 fs.id, src_file_name, dest_file_name, snapshot.id, flags)
00242
00243 def fs_snapshots(self, fs, flags=0):
00244 sim_snaps = self.sim_array.fs_snapshots(fs.id, flags)
00245 return [SimPlugin._sim_data_2_lsm(s) for s in sim_snaps]
00246
00247 def fs_snapshot_create(self, fs, snapshot_name, flags=0):
00248 return self.sim_array.fs_snapshot_create(
00249 fs.id, snapshot_name, flags)
00250
00251 def fs_snapshot_delete(self, fs, snapshot, flags=0):
00252 return self.sim_array.fs_snapshot_delete(
00253 fs.id, snapshot.id, flags)
00254
00255 def fs_snapshot_restore(self, fs, snapshot, files, restore_files,
00256 all_files=False, flags=0):
00257 return self.sim_array.fs_snapshot_restore(
00258 fs.id, snapshot.id, files, restore_files, all_files, flags)
00259
00260 def fs_child_dependency(self, fs, files, flags=0):
00261 return self.sim_array.fs_child_dependency(fs.id, files, flags)
00262
00263 def fs_child_dependency_rm(self, fs, files, flags=0):
00264 return self.sim_array.fs_child_dependency_rm(fs.id, files, flags)
00265
00266 def export_auth(self, flags=0):
00267
00268 return ["simple"]
00269
00270 def exports(self, search_key=None, search_value=None, flags=0):
00271 sim_exps = self.sim_array.exports(flags)
00272 return search_property(
00273 [SimPlugin._sim_data_2_lsm(e) for e in sim_exps],
00274 search_key, search_value)
00275
00276 def export_fs(self, fs_id, export_path, root_list, rw_list, ro_list,
00277 anon_uid, anon_gid, auth_type, options, flags=0):
00278 sim_exp = self.sim_array.fs_export(
00279 fs_id, export_path, root_list, rw_list, ro_list,
00280 anon_uid, anon_gid, auth_type, options, flags=0)
00281 return SimPlugin._sim_data_2_lsm(sim_exp)
00282
00283 def export_remove(self, export, flags=0):
00284 return self.sim_array.fs_unexport(export.id, flags)
00285
00286 def target_ports(self, search_key=None, search_value=None, flags=0):
00287 sim_tgts = self.sim_array.target_ports()
00288 return search_property(
00289 [SimPlugin._sim_data_2_lsm(t) for t in sim_tgts],
00290 search_key, search_value)
00291
00292 def volume_raid_info(self, volume, flags=0):
00293 return self.sim_array.volume_raid_info(volume)
00294
00295 def pool_member_info(self, pool, flags=0):
00296 return self.sim_array.pool_member_info(pool)
00297
00298 def volume_raid_create_cap_get(self, system, flags=0):
00299 return self.sim_array.volume_raid_create_cap_get(system)
00300
00301 def volume_raid_create(self, name, raid_type, disks, strip_size,
00302 flags=0):
00303 return self.sim_array.volume_raid_create(
00304 name, raid_type, disks, strip_size)