예제 #1
0
    def _resize(self, dbg, sr, key, new_size):
        log.debug("%s: xcpng.volume.QCOW2Volume._resize: SR: %s Key: %s New_size: %s"
                  % (dbg, sr, key, new_size))

        uri = "%s/%s" % (sr, key)
        datapath = get_vdi_datapath_by_uri(dbg, uri)

        try:
            super(QCOW2Volume, self)._resize(dbg, sr, key, new_size)

            self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, uri)

            call(dbg, ["/usr/lib64/qemu-dp/bin/qemu-img",
                       "resize",
                       self.Datapathes[datapath].DatapathOpsHandler.gen_vol_path(dbg, uri),
                       str(new_size)])

            self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, uri)
        except Exception as e:
            log.error("%s: xcpng.volume.QCOW2Volume._resize: Failed to resize volume: key %s: SR: %s" %
                      (dbg, key, sr))
            try:
                self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, uri)
            except:
                pass
            raise Exception(e)
    def deactivate(self, dbg, uri, domain):
        log.debug(
            "%s: xcpng.datapath.Implementation.deactivate: uri: %s domain: %s"
            % (dbg, uri, domain))

        self.Datapathes[get_vdi_datapath_by_uri(dbg, uri)]().deactivate(
            dbg, uri, domain)
예제 #3
0
    def _create(self, dbg, sr, name, description, size, sharable, image_meta):
        log.debug("%s: xcpng.volume.QCOW2Volume._create: SR: %s Name: %s Description: %s Size: %s"
                  % (dbg, sr, name, description, size))

        uri = image_meta[URI_TAG][0]
        datapath = get_vdi_datapath_by_uri(dbg, uri)

        try:
            super(QCOW2Volume, self)._create(dbg, sr, name, description, size, sharable, image_meta)

            self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, uri)

            call(dbg, ["/usr/lib64/qemu-dp/bin/qemu-img",
                       "create",
                       "-f", image_meta[TYPE_TAG],
                       self.Datapathes[datapath].DatapathOpsHandler.gen_vol_path(dbg, uri),
                       str(size)])

            self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, uri)

            return image_meta
        except Exception as e:
            log.error("%s: xcpng.volume.QCOW2Volume._create: Failed to create volume: key %s: SR: %s" %
                      (dbg, image_meta[VDI_UUID_TAG], sr))
            try:
                self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, uri)
            except:
                pass
            raise Exception(e)
    def attach(self, dbg, uri, domain):
        log.debug(
            "%s: xcpng.datapath.Implementation.attach: uri: %s domain: %s" %
            (dbg, uri, domain))

        return self.Datapathes[get_vdi_datapath_by_uri(dbg, uri)]().attach(
            dbg, uri, domain)
    def open(self, dbg, uri, persistent):
        log.debug(
            "%s: xcpng.datapath.Implementation.open: uri: %s persistent: %s" %
            (dbg, uri, persistent))

        self.Datapathes[get_vdi_datapath_by_uri(dbg, uri)]().open(
            dbg, uri, persistent)
예제 #6
0
    def _commit_offline(self, dbg, sr, child, parent):
        datapath = get_vdi_datapath_by_uri(dbg, sr)

        self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, child, chained=None)
        self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, parent, chained=None)

        call(dbg, ['/usr/lib64/qemu-dp/bin/qemu-img',
                   'commit',
                   '-t', 'none'
                   '-b', self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, parent),
                   '-d',
                   self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, child)])

        self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, child, chained=None)
        self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, parent, chained=None)
예제 #7
0
    def _clone(self, dbg, sr, key, mode, base_meta):
        log.debug("%s: xcpng.volume.QCOW2Volume._clone: SR: %s Key: %s Mode: %s"
                  % (dbg, sr, key, mode))

        swapped = False
        clone_uri_for_exception = None
        new_base_uri_for_exception = None
        datapath = get_vdi_datapath_by_uri(dbg, sr)

        try:
            if base_meta[KEY_TAG] == key:
                # create clone
                clone_meta = self.create(dbg,
                                         sr,
                                         base_meta[NAME_TAG],
                                         base_meta[DESCRIPTION_TAG],
                                         base_meta[VIRTUAL_SIZE_TAG],
                                         base_meta[SHARABLE_TAG])

                clone_uri_for_exception = clone_meta[URI_TAG][0]

                # create new base
                new_base_meta = self.create(dbg,
                                            sr,
                                            base_meta[NAME_TAG],
                                            base_meta[DESCRIPTION_TAG],
                                            base_meta[VIRTUAL_SIZE_TAG],
                                            base_meta[SHARABLE_TAG])

                new_base_uri_for_exception = new_base_meta[URI_TAG][0]

                self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, clone_meta[URI_TAG][0], chained=None)
                self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, new_base_meta[URI_TAG][0], chained=None)

                call(dbg, ["/usr/lib64/qemu-dp/bin/qemu-img",
                           "rebase",
                           "-u",
                           "-f", base_meta[TYPE_TAG],
                           "-b", self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, base_meta[URI_TAG][0]),
                           self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, new_base_meta[URI_TAG][0])])

                call(dbg, ["/usr/lib64/qemu-dp/bin/qemu-img",
                           "rebase",
                           "-u",
                           "-f", clone_meta[TYPE_TAG],
                           "-b", self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, base_meta[URI_TAG][0]),
                           self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, clone_meta[URI_TAG][0])])

                self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, clone_meta[URI_TAG][0], chained=None)

                # swap backing images uuids for base vdi and new base vdi in metadata
                self.VolOpsHendler.swap(dbg, base_meta[URI_TAG][0], new_base_meta[URI_TAG][0])
                swapped = True
                base_meta = self.MetadataHandler.get_vdi_meta(dbg, base_meta[URI_TAG][0])
                new_base_meta = self.MetadataHandler.get_vdi_meta(dbg, new_base_meta[URI_TAG][0])
                clone_meta = self.MetadataHandler.get_vdi_meta(dbg, clone_meta[URI_TAG][0])

                merge(base_meta, new_base_meta, snap_merge_pattern)
                new_base_meta[NAME_TAG] = "(base) %s" % new_base_meta[NAME_TAG]
                new_base_meta[READ_WRITE_TAG] = False
                base_meta[PARENT_URI_TAG] = new_base_meta[URI_TAG]
                base_meta[REF_COUNT_TAG] = 1
                clone_parent = new_base_meta[URI_TAG]

                self.MetadataHandler.update_vdi_meta(dbg, new_base_meta[URI_TAG][0], new_base_meta)
                self.MetadataHandler.update_vdi_meta(dbg, base_meta[URI_TAG][0], base_meta)

                if ACTIVE_ON_TAG in base_meta:
                    base_meta[QEMU_IMAGE_URI_TAG] = self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, base_meta[URI_TAG][0])
                    self.MetadataHandler.update_vdi_meta(dbg, base_meta[URI_TAG][0], base_meta)
                    self.Datapathes[datapath].snapshot(dbg, base_meta[URI_TAG][0], base_meta[URI_TAG][0], 0)
                else:
                    self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, base_meta[URI_TAG][0], chained=None)

            else:
                # create clone
                clone_meta = self.create(dbg,
                                         sr,
                                         base_meta[NAME_TAG],
                                         base_meta[DESCRIPTION_TAG],
                                         base_meta[VIRTUAL_SIZE_TAG],
                                         base_meta[SHARABLE_TAG])

                clone_uri_for_exception = clone_meta[URI_TAG][0]

                self.Datapathes[datapath].DatapathOpsHandler.map_vol(dbg, clone_meta[URI_TAG][0], chained=None)

                call(dbg, ["/usr/lib64/qemu-dp/bin/qemu-img",
                           "rebase",
                           "-u",
                           "-f", base_meta[TYPE_TAG],
                           "-b", self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, base_meta[URI_TAG][0]),
                           self.Datapathes[datapath].DatapathOpsHandler.gen_vol_uri(dbg, clone_meta[URI_TAG][0])])

                self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, clone_meta[URI_TAG][0], chained=None)

                clone_parent = base_meta[URI_TAG]

            merge(base_meta, clone_meta, clone_merge_pattern)
            clone_meta[PARENT_URI_TAG] = clone_parent

            if mode is 'snapshot':
                clone_meta[READ_WRITE_TAG] = False
            elif mode is 'clone':
                clone_meta[READ_WRITE_TAG] = True

            self.MetadataHandler.update_vdi_meta(dbg, clone_meta[URI_TAG][0], clone_meta)

            return clone_meta
        except Exception as e:
            log.error("%s: xcpng.volume.QCOW2Volume._clone: Failed to clone/snapshot volume: key %s: SR: %s" %
                      (dbg, key, sr))
            try:
                if clone_uri_for_exception is not None:
                    self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, clone_uri_for_exception)
            except:
                pass

            if clone_uri_for_exception is not None:
                self.destroy(dbg, sr, get_vdi_uuid_by_uri(dbg, clone_uri_for_exception))

            if swapped is True:
                self.VolOpsHendler.swap(dbg, new_base_uri_for_exception, base_meta[URI_TAG][0])

            try:
                if new_base_uri_for_exception is not None:
                    self.Datapathes[datapath].DatapathOpsHandler.unmap_vol(dbg, new_base_uri_for_exception)
            except:
                pass

            if new_base_uri_for_exception is not None:
                self.destroy(dbg, sr, get_vdi_uuid_by_uri(dbg, new_base_uri_for_exception))

            raise Exception(e)
예제 #8
0
 def _commit_online(self, dbg, uri, child, parent):
     datapath = get_vdi_datapath_by_uri(dbg, uri)
     self.Datapathes[datapath].commit(dbg, uri, child, parent, 0)
    def close(self, dbg, uri):
        log.debug("%s: xcpng.datapath.Implementation.close: uri: %s" %
                  (dbg, uri))

        self.Datapathes[get_vdi_datapath_by_uri(dbg, uri)]().close(dbg, uri)
예제 #10
0
 def _commit_online(self, dbg, sr, child, parent):
     datapath = get_vdi_datapath_by_uri(dbg, sr)