def _api_rsc_auto_delete(self, rsc_name): with lin_drv(self.default_uri) as lin: if not lin.connected: lin.connect() rsc = linstor.Resource(str(rsc_name), self.default_uri) return rsc.delete()
def _api_rsc_is_diskless(self, rsc_name): with lin_drv(self.default_uri) as lin: if not lin.connected: lin.connect() rsc = linstor.Resource(str(rsc_name)) return rsc.is_diskless(self.host_name)
def destroy(self, dbg, sr, key): cfg = ConfigHelper._get_config() res = linstor.Resource(key, cfg.controller) res.delete() meta = {'key': key} SRHelper.delete_volume(sr, meta)
def close(self, dbg, uri): node_name = self._get_node(uri) res_name = self._get_res(uri) controller = self._get_controller(uri) res = linstor.Resource(res_name, controller) res.deactivate(node_name) return None
def _api_rsc_autoplace(self, rsc_name): with lin_drv(self.default_uri) as lin: if not lin.connected: lin.connect() new_rsc = linstor.Resource(name=rsc_name, uri=self.default_uri) new_rsc.placement.redundancy = self.ap_count new_rsc.placement.storage_pool = self.default_pool rsc_reply = new_rsc.autoplace() return rsc_reply
def attach(self, dbg, uri, domain): res_name = self._get_res(uri) controller = self._get_controller(uri) res = linstor.Resource(res_name, controller) return { 'implementations': [['BlockDevice', { 'path': res.volumes[0].device_path }]], }
def open(self, dbg, uri, persistent): node_name = self._get_node(uri) res_name = self._get_res(uri) controller = self._get_controller(uri) res = linstor.Resource(res_name, controller) # in linstor we call that step activate, that is fine, see comment in self.activate() res.activate(node_name) # raise xapi.storage.api.v5.volume.Volume_does_not_exist(u.path) return None
def _api_rsc_size(self, rsc_name): with lin_drv(self.default_uri) as lin: if not lin.connected: lin.connect() rsc = linstor.Resource(str(rsc_name)) if len(rsc.volumes): if "size" in rsc.volumes: return rsc.volumes[0].size else: return 0 else: return 0
def resize(self, dbg, sr, key, new_size): new_size = int(new_size) current_size = self._current_size(key) if new_size == current_size: return if new_size < current_size: # Raise SMAPIv1 error VDISize raise xapi.XenAPIException( "SR_BACKEND_FAILURE_79", ["VDI Invalid size", "shrinking not allowed"]) cfg = ConfigHelper._get_config() res = linstor.Resource(key, cfg.controller) res.volumes[0].size = current_size
def create(self, dbg, sr, name, description, size, sharable): # [djs55/xapi-storage#33] size = int(size) # bytes size = max(size, 4 * 1024 * 1024) # we have am 4M lower limit uuid_ = str(uuid.uuid4()) hostname = socket.gethostname() cfg = ConfigHelper._get_config() res = linstor.Resource(name, cfg.controller) res.volumes[0] = linstor.Volume(size) res.placement.redundancy = cfg.redundancy res.autoplace() controller = cfg.controller[len('linstor://'):] stat = { "key": name, "uuid": uuid_, "name": name, "sr": sr, "description": description, "read_write": True, "sharable": sharable, "virtual_size": size, "physical_utilisation": 0, "uri": [ '{}://{}/{};controller={}'.format(SCHEME, hostname, name, controller) ], "keys": {}, } SRHelper.add_volume(sr, stat) return stat
def _api_snapshot_resource_restore(self, src_rsc_name, src_snap_name, new_vol_name): lin = linstor.Resource(src_rsc_name, uri=self.default_uri) new_rsc = lin.restore_from_snapshot(src_snap_name, new_vol_name) # Adds an aux/property KV for synchronous return from snapshot restore with lin_drv(self.default_uri) as lin: if not lin.connected: lin.connect() aux_prop = {} aux_prop["Aux/restore"] = "done" lin.volume_dfn_modify(rsc_name=new_vol_name, volume_nr=0, set_properties=aux_prop) if new_rsc.name == new_vol_name: return True return False
def _current_size(cls, res_name): cfg = ConfigHelper._get_config() res = linstor.Resource(res_name, cfg.controller) return res.volumes[0].size
def _api_snapshot_delete(self, drbd_rsc_name, snapshot_name): lin = linstor.Resource(drbd_rsc_name, uri=self.default_uri) snap_reply = lin.snapshot_delete(snapshot_name) return snap_reply