def clone(self, dbg, sr, key, mode): log.debug("%s: xcpng.volume.Volume.clone: SR: %s Key: %s Mode: %s" % (dbg, sr, key, mode)) orig_uri = "%s/%s" % (sr, key) try: orig_meta = self.MetadataHandler.get_vdi_meta(dbg, orig_uri) if SNAPSHOT_OF_TAG in orig_meta[CUSTOM_KEYS_TAG]: base_uri = orig_meta[PARENT_URI_TAG][0] base_meta = self.MetadataHandler.get_vdi_meta(dbg, base_uri) else: base_meta = deepcopy(orig_meta) if ACTIVE_ON_TAG in base_meta: current_host = get_current_host_uuid() if base_meta[ACTIVE_ON_TAG] != current_host: log.debug("%s: librbd.Volume.clone: SR: %s Key: %s Can not snapshot on %s as VDI already active on %s" % (dbg, sr, base_meta[VDI_UUID_TAG], current_host, base_meta[ACTIVE_ON_TAG])) raise Activated_on_another_host(base_meta[ACTIVE_ON_TAG]) return self._clone(dbg, sr, key, mode, base_meta) except Exception as e: log.error("%s: xcpng.volume.Volume.set: Failed to clone volume: key %s: SR: %s" % (dbg, key, sr)) raise Exception(e)
def activate(self, dbg, uri, domain): log.debug("%s: xcpng.datapath.Datapath.activate: uri: %s domain: %s" % (dbg, uri, domain)) # TODO: Check that VDI is not active on other host try: self._activate(dbg, uri, domain) image_meta = {ACTIVE_ON_TAG: get_current_host_uuid()} self.MetadataHandler.update_vdi_meta(dbg, uri, image_meta) except Exception as e: log.error( "%s: xcpng.datapath.Datapath.activate: Failed to activate datapath for volume: uri: %s" % (dbg, uri)) try: self._deactivate(dbg, uri, domain) except: pass raise Exception(e)