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
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
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)
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
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)
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