Exemplo n.º 1
0
    def create_root_volume(self, defaults):
        """
        Create a root volume for the vFiler if one hasn't
        been manually defined
        """
        log.debug("No manually defined root volume. Creating one...")
        ns = self.populate_namespace()
        try:
            volname = defaults.get('vfiler', 'root_volume_name') % ns
        except (NoSectionError, NoOptionError):
            volname = '%s_root' % self.name
            pass

        # FIXME: This can probably be improved somehow
        usable = float(defaults.get('vfiler', 'root_volume_usable'))
        aggr = self.get_root_aggregate()
        log.debug("got root aggr")
        xmldata = """<volume type="root" name="%s" usable="%s" raw="%s" />
        """ % (volname, usable, usable)
        node = etree.fromstring(xmldata)
        vol = Volume()
        vol.configure_from_node(node, defaults, aggr)

        vol.snapreserve = int(defaults.get('vfiler',
                                           'root_volume_snapreserve'))
        vol.space_guarantee = 'volume'

        if defaults.getboolean('vfiler', 'backup_root_volume'):
            log.warn("Request to back up vfiler root volume")

        log.debug("Root volume: %s", vol)
        # Add the volume as a child of the root aggregate
        aggr.add_child(vol)
        pass
Exemplo n.º 2
0
    def create_root_volume(self, defaults):
        """
        Create a root volume for the vFiler if one hasn't
        been manually defined
        """
        log.debug("No manually defined root volume. Creating one...")
        ns = self.populate_namespace()
        try:
            volname = defaults.get("vfiler", "root_volume_name") % ns
        except (NoSectionError, NoOptionError):
            volname = "%s_root" % self.name
            pass

        # FIXME: This can probably be improved somehow
        usable = float(defaults.get("vfiler", "root_volume_usable"))
        aggr = self.get_root_aggregate()
        log.debug("got root aggr")
        xmldata = """<volume type="root" name="%s" usable="%s" raw="%s" />
        """ % (
            volname,
            usable,
            usable,
        )
        node = etree.fromstring(xmldata)
        vol = Volume()
        vol.configure_from_node(node, defaults, aggr)

        vol.snapreserve = int(defaults.get("vfiler", "root_volume_snapreserve"))
        vol.space_guarantee = "volume"

        if defaults.getboolean("vfiler", "backup_root_volume"):
            log.warn("Request to back up vfiler root volume")

        log.debug("Root volume: %s", vol)
        # Add the volume as a child of the root aggregate
        aggr.add_child(vol)
        pass
Exemplo n.º 3
0
    def create_snapvaults_for(self, srcvol, defaults):
        """
        Create snapvault volumes for a source volume.
        """
        log.debug("Attempting to create snapvault for srcvol: %s", srcvol)
        # get the snapvaultset for the volume

        # If the volume is of certain types, don't back them up
#         if srcvol.type in ['oraredo', 'oracm' ]:
#             log.info("Not backing up volume '%s' of type '%s'", srcvol.name, srcvol.type)
#             return

        # Create target volumes based on the snapvault definition
        for ref in srcvol.get_snapvault_setrefs():
            log.debug("Found reference: %s", ref.name)
            try:
                log.debug("snapvaultsets: %s", [x.name for x in self.get_snapvaultsets()] )
                setobj = [ x for x in self.get_snapvaultsets() if x.name == ref.name ][0]
            except IndexError:
                raise KeyError("Cannot find snapvaultset definition '%s'" % ref.name)

            # If a target volume has been pre-defined, we'll use that.
            # Otherwise, we'll invent one based on certain rules and settings.
            target_filername = setobj.targetfiler
            try:
                target_filer = [x for x in self.get_filers() if x.name == target_filername ][0]
                
            except IndexError:
                raise KeyError("SnapVault target is an unknown filer name: '%s'" % target_filername)

            # If the target volume name is specified, use that
            if setobj.targetvolume is not None:
                try:
                    targetvol = [ x for x in target_filer.get_volumes() if x.name == setobj.targetvolume ][0]
                except IndexError:
                    raise KeyError("SnapVault targetvolume '%s' does not exist" % setobj.targetvolume)
                log.debug("Found specific volume: %s", targetvol)

                # Set the type of the volume to be a snapvault destination
                targetvol.type='snapvaultdst'
                pass
            
            # otherwise, invent a target volume, and use that instead
            else:
                # Find the target aggregate for the snapvault
                targetaggr = self.find_target_aggr(target_filer, setobj.targetaggregate, defaults)

                # Figure out how much usable storage to allocate to the target volume
                if setobj.targetusable is None:
                    # iSCSI is special, again. Grr.
                    if srcvol.protocol == 'iscsi':
                        setobj.targetusable = srcvol.iscsi_usable * setobj.multiplier
                    else:
                        log.debug("usable: %f", srcvol.usable)
                        log.debug("multiplier: %f", setobj.multiplier)
                        setobj.targetusable = srcvol.usable * setobj.multiplier
                    pass
                
                # target volume name is the src volume name with a 'b' suffix
                xmldata = """
<volume name="%s%s" type="snapvaultdst"
        usable="%s"
        raw="%s"
        snapreserve="%s"
        protocol="%s" />""" % ( srcvol.name,
                                setobj.targetsuffix,
                                setobj.targetusable,
                                setobj.targetusable,
                                0,
                                srcvol.protocol,
                                )
        
            node = etree.fromstring(xmldata)
            targetvol = Volume()
            targetvol.configure_from_node(node, defaults, targetaggr)
            targetaggr.add_child(targetvol)
            # end determination of target volume
            log.debug("Created snapvault targetvol: %s", targetvol)

            # If the target volume or aggregate are actually defined in
            # the XML, and use those settings for autosize and autodelete.
            #targetvol = self.set_volume_autosize(targetvol, targetvol.filer.name, targetvol.aggregate)
            #targetvol = self.set_volume_autodelete(targetvol, targetvol.filer.name, targetvol.aggregate)

            # Add the snapvaults themselves
            if len(setobj.get_snapvaultdefs()) == 0:
                log.warn("No snapvault defininitions provided for snapvaultset")
                pass
            
            log.debug("snapdefs: %s", setobj.get_snapvaultdefs() )
            for svdef in setobj.get_snapvaultdefs():

                sv = SnapVault(srcvol, targetvol,
                               svdef.basename,
                               svdef.snapschedule,
                               svdef.snapvaultschedule,
                               )
                #srcvol.snapvaults.append(sv)
                #targetvol.snapvaults.append(sv)                
                log.debug("Added snapvault: %s", sv)
Exemplo n.º 4
0
    def create_snapmirrors_for(self, srcvol, defaults):
        """
        Create snapmirror volumes for a source volume.
        """
        log.debug("Attempting to create snapmirror for srcvol: %s", srcvol)
        # get the snapmirrorset for the volume
        for ref in srcvol.get_snapmirror_setrefs():
            log.debug("Found reference: %s", ref)

            # Check that the reference refers to a defined snapmirrorset
            try:
                setobj = [ x for x in self.get_snapmirrorsets() if x.name == ref.name ][0]
            except IndexError:
                log.error("Cannot find snapmirrorset definition '%s'" % ref)
                raise KeyError("snapmirrorset not defined: '%s'" % ref)

            target_filername = setobj.targetfiler
            if target_filername is None:
                # No target filer specified, so use the first primary at a site other than the source
                # This auto-created DR snapmirrors, but may not be what you mean.
                target_filername = self.tree.xpath("site[not(@type = '%s')]/filer[@type = 'primary']/@name" % srcvol.filer.site.type)[0]
                log.warn("No destination for snapmirror provided, using '%s'" % target_filername)
                pass

            try:
                target_filer = [x for x in self.get_filers() if x.name == target_filername ][0]
                
            except IndexError:
                raise KeyError("Snapmirror target is an unknown filer name: '%s'" % target_filername)

            # Find the target aggregate.
            targetaggr = self.find_target_aggr(target_filer, setobj.targetaggregate, defaults)

            # target volume name is the src volume name with a 'r' suffix
            xmldata = """
<volume name="%s%s" type="snapmirrordst"
        usable="%s"
        raw="%s"
        snapreserve="%s"
        protocol="%s" />""" % ( srcvol.name,
                                setobj.targetsuffix,
                                srcvol.usable,
                                srcvol.raw,
                                srcvol.snapreserve,
                                srcvol.protocol,
                                )

            node = etree.fromstring(xmldata)
            targetvol = Volume()
            targetvol.configure_from_node(node, defaults, targetaggr)
            targetaggr.add_child(targetvol)
        
            log.debug("Created snapmirror targetvol: %s", targetvol)
            
            for sched in setobj.get_snapmirrorschedules():

                sm = SnapMirror(srcvol, targetvol,
                                sched.minute,
                                sched.hour,
                                sched.dayofmonth,
                                sched.dayofweek,
                                )
                
                self.snapmirrors.append(sm)
                log.debug("added snapmirror: %s", sm)
                pass
Exemplo n.º 5
0
    def create_snapvaults_for(self, srcvol, defaults):
        """
        Create snapvault volumes for a source volume.
        """
        log.debug("Attempting to create snapvault for srcvol: %s", srcvol)
        # get the snapvaultset for the volume

        # If the volume is of certain types, don't back them up
        #         if srcvol.type in ['oraredo', 'oracm' ]:
        #             log.info("Not backing up volume '%s' of type '%s'", srcvol.name, srcvol.type)
        #             return

        # Create target volumes based on the snapvault definition
        for ref in srcvol.get_snapvault_setrefs():
            log.debug("Found reference: %s", ref.name)
            try:
                log.debug("snapvaultsets: %s",
                          [x.name for x in self.get_snapvaultsets()])
                setobj = [
                    x for x in self.get_snapvaultsets() if x.name == ref.name
                ][0]
            except IndexError:
                raise KeyError("Cannot find snapvaultset definition '%s'" %
                               ref.name)

            # If a target volume has been pre-defined, we'll use that.
            # Otherwise, we'll invent one based on certain rules and settings.
            target_filername = setobj.targetfiler
            try:
                target_filer = [
                    x for x in self.get_filers() if x.name == target_filername
                ][0]

            except IndexError:
                raise KeyError(
                    "SnapVault target is an unknown filer name: '%s'" %
                    target_filername)

            # If the target volume name is specified, use that
            if setobj.targetvolume is not None:
                try:
                    targetvol = [
                        x for x in target_filer.get_volumes()
                        if x.name == setobj.targetvolume
                    ][0]
                except IndexError:
                    raise KeyError(
                        "SnapVault targetvolume '%s' does not exist" %
                        setobj.targetvolume)
                log.debug("Found specific volume: %s", targetvol)

                # Set the type of the volume to be a snapvault destination
                targetvol.type = 'snapvaultdst'
                pass

            # otherwise, invent a target volume, and use that instead
            else:
                # Find the target aggregate for the snapvault
                targetaggr = self.find_target_aggr(target_filer,
                                                   setobj.targetaggregate,
                                                   defaults)

                # Figure out how much usable storage to allocate to the target volume
                if setobj.targetusable is None:
                    # iSCSI is special, again. Grr.
                    if srcvol.protocol == 'iscsi':
                        setobj.targetusable = srcvol.iscsi_usable * setobj.multiplier
                    else:
                        log.debug("usable: %f", srcvol.usable)
                        log.debug("multiplier: %f", setobj.multiplier)
                        setobj.targetusable = srcvol.usable * setobj.multiplier
                    pass

                # target volume name is the src volume name with a 'b' suffix
                xmldata = """
<volume name="%s%s" type="snapvaultdst"
        usable="%s"
        raw="%s"
        snapreserve="%s"
        protocol="%s" />""" % (
                    srcvol.name,
                    setobj.targetsuffix,
                    setobj.targetusable,
                    setobj.targetusable,
                    0,
                    srcvol.protocol,
                )

            node = etree.fromstring(xmldata)
            targetvol = Volume()
            targetvol.configure_from_node(node, defaults, targetaggr)
            targetaggr.add_child(targetvol)
            # end determination of target volume
            log.debug("Created snapvault targetvol: %s", targetvol)

            # If the target volume or aggregate are actually defined in
            # the XML, and use those settings for autosize and autodelete.
            #targetvol = self.set_volume_autosize(targetvol, targetvol.filer.name, targetvol.aggregate)
            #targetvol = self.set_volume_autodelete(targetvol, targetvol.filer.name, targetvol.aggregate)

            # Add the snapvaults themselves
            if len(setobj.get_snapvaultdefs()) == 0:
                log.warn(
                    "No snapvault defininitions provided for snapvaultset")
                pass

            log.debug("snapdefs: %s", setobj.get_snapvaultdefs())
            for svdef in setobj.get_snapvaultdefs():

                sv = SnapVault(
                    srcvol,
                    targetvol,
                    svdef.basename,
                    svdef.snapschedule,
                    svdef.snapvaultschedule,
                )
                #srcvol.snapvaults.append(sv)
                #targetvol.snapvaults.append(sv)
                log.debug("Added snapvault: %s", sv)
Exemplo n.º 6
0
    def create_snapmirrors_for(self, srcvol, defaults):
        """
        Create snapmirror volumes for a source volume.
        """
        log.debug("Attempting to create snapmirror for srcvol: %s", srcvol)
        # get the snapmirrorset for the volume
        for ref in srcvol.get_snapmirror_setrefs():
            log.debug("Found reference: %s", ref)

            # Check that the reference refers to a defined snapmirrorset
            try:
                setobj = [
                    x for x in self.get_snapmirrorsets() if x.name == ref.name
                ][0]
            except IndexError:
                log.error("Cannot find snapmirrorset definition '%s'" % ref)
                raise KeyError("snapmirrorset not defined: '%s'" % ref)

            target_filername = setobj.targetfiler
            if target_filername is None:
                # No target filer specified, so use the first primary at a site other than the source
                # This auto-created DR snapmirrors, but may not be what you mean.
                target_filername = self.tree.xpath(
                    "site[not(@type = '%s')]/filer[@type = 'primary']/@name" %
                    srcvol.filer.site.type)[0]
                log.warn("No destination for snapmirror provided, using '%s'" %
                         target_filername)
                pass

            try:
                target_filer = [
                    x for x in self.get_filers() if x.name == target_filername
                ][0]

            except IndexError:
                raise KeyError(
                    "Snapmirror target is an unknown filer name: '%s'" %
                    target_filername)

            # Find the target aggregate.
            targetaggr = self.find_target_aggr(target_filer,
                                               setobj.targetaggregate,
                                               defaults)

            # target volume name is the src volume name with a 'r' suffix
            xmldata = """
<volume name="%s%s" type="snapmirrordst"
        usable="%s"
        raw="%s"
        snapreserve="%s"
        protocol="%s" />""" % (
                srcvol.name,
                setobj.targetsuffix,
                srcvol.usable,
                srcvol.raw,
                srcvol.snapreserve,
                srcvol.protocol,
            )

            node = etree.fromstring(xmldata)
            targetvol = Volume()
            targetvol.configure_from_node(node, defaults, targetaggr)
            targetaggr.add_child(targetvol)

            log.debug("Created snapmirror targetvol: %s", targetvol)

            for sched in setobj.get_snapmirrorschedules():

                sm = SnapMirror(
                    srcvol,
                    targetvol,
                    sched.minute,
                    sched.hour,
                    sched.dayofmonth,
                    sched.dayofweek,
                )

                self.snapmirrors.append(sm)
                log.debug("added snapmirror: %s", sm)
                pass