class QtreeTest(unittest.TestCase): """ Test various qtree configurations """ def setUp(self): optparser = BaseOptions() optparser.parseOptions(["dummyfile.xml", "--debug=%s" % logging._levelNames[log.level].lower()]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) self.defaults.get("global", "dns_domain_name") xmldata = """ <project name="test" code="qtree"> <site name="sitea" type="primary" location="testlab"> <filer name="testfiler1" type="filer"> <vfiler name="vfiler01" rootaggr="aggr0"> <aggregate name="aggr01"> <volume name="testvol1"/> </aggregate> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.proj = Project() self.proj.configure_from_node(node, self.defaults, None) self.volume = self.proj.get_volumes()[0] def test_empty_qtree(self): """ Test an empty qtree node """ xmldata = """ <qtree /> """ node = etree.fromstring(xmldata) qtreeobj = qtree.create_qtree_from_node(node, self.defaults, self.volume) log.debug("qtree: %s", qtreeobj) def test_autocreate_qtree_oradata(self): """ Test a qtree that is autocreated for an oradata volume """ raise unittest.SkipTest("Oracle volume/qtree plugin not written yet.") volnode = etree.Element("volume") volnode.attrib["oracle"] = "ORASID" volume = Volume("testvol2", self.filer1, "aggr01", 100, type="oradata", volnode=volnode) self.proj.volumes.append(volume) self.proj.create_qtrees_for_volume(volume)
class DRHostExportTest(unittest.TestCase): def setUp(self): """ Load testing XML into a config instance. """ optparser = BaseOptions() optparser.parseOptions([ 'dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower() ]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) xmlfile = os.path.join(XML_FILE_LOCATION, "drhostexport_test.xml") tree = etree.parse(xmlfile) self.project = Project() self.project.configure_from_node(tree.getroot(), self.defaults, None) def test_working(self): self.failUnlessEqual(1, 1) def test_drhost_parse(self): """ Test that the drhost exports for a project are correctly done. """ raise unittest.SkipTest("DRhosts refactoring not yet complete.") # The list of drhosts for the first host should be 1 in length. testhost01 = self.project.get_host_byname('testhost01') self.failUnlessEqual(len(testhost01.get_drhosts()), 1) # Grab the test volume testvol = [ x for x in self.project.get_volumes() if x.name == 'testvol01' ][0] # Check that the target volume qtree is being exported to the dr testhost targethost = testvol.snapmirrors[0].targetvol.get_qtrees( )[0].get_rw_exports()[0] self.failUnlessEqual(targethost.name, 'dr_testhost01') def test_storage_design_secondary_qtrees(self): """ Test that the qtrees detected at the secondary site are correct. """ raise unittest.SkipTest("Test not yet defined.")
class DRHostExportTest(unittest.TestCase): def setUp(self): """ Load testing XML into a config instance. """ optparser = BaseOptions() optparser.parseOptions(['dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower()]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) xmlfile = os.path.join(XML_FILE_LOCATION, "drhostexport_test.xml") tree = etree.parse(xmlfile) self.project = Project() self.project.configure_from_node(tree.getroot(), self.defaults, None) def test_working(self): self.failUnlessEqual( 1, 1 ) def test_drhost_parse(self): """ Test that the drhost exports for a project are correctly done. """ raise unittest.SkipTest("DRhosts refactoring not yet complete.") # The list of drhosts for the first host should be 1 in length. testhost01 = self.project.get_host_byname('testhost01') self.failUnlessEqual( len(testhost01.get_drhosts()), 1 ) # Grab the test volume testvol = [x for x in self.project.get_volumes() if x.name == 'testvol01' ][0] # Check that the target volume qtree is being exported to the dr testhost targethost = testvol.snapmirrors[0].targetvol.get_qtrees()[0].get_rw_exports()[0] self.failUnlessEqual(targethost.name, 'dr_testhost01') def test_storage_design_secondary_qtrees(self): """ Test that the qtrees detected at the secondary site are correct. """ raise unittest.SkipTest("Test not yet defined.")
class SetRefTest(unittest.TestCase): """ Test SetRef objects """ def setUp(self): optparser = BaseOptions() optparser.parseOptions([ 'dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower() ]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) xmldata = """ <project name="testproj" code="01"> <site name="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate type="root" name="aggr0"/> <aggregate name="aggr01"> <volume name="blah"> </volume> </aggregate> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) def test_bare_setref(self): """ Test a bare setref node """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref /> """ node = etree.fromstring(xmldata) sr = SetRef() self.failUnlessRaises(KeyError, sr.configure_from_node, node, self.defaults, vol) def test_named_setref(self): """ Test a setref node with just a name """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() self.failUnlessRaises(KeyError, sr.configure_from_node, node, self.defaults, vol) def test_setref_bad_type(self): """ Test a setref node with an invalid type """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="blah" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() self.failUnlessRaises(ValueError, sr.configure_from_node, node, self.defaults, vol) def test_setref_snapshot_type(self): """ Test a setref node of type 'snapshot' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapshot" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual(sr.name, 'alan') self.failUnlessEqual(sr.type, 'snapshot') def test_setref_snapvault_type(self): """ Test a setref node of type 'snapshot' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapvault" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual(sr.name, 'alan') self.failUnlessEqual(sr.type, 'snapvault') def test_setref_snapmirror_type(self): """ Test a setref node of type 'snapmirror' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapmirror" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual(sr.name, 'alan') self.failUnlessEqual(sr.type, 'snapmirror') def test_setref_snapmirrorvault_type(self): """ Test a setref node of type 'snapmirrorvault' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapmirrorvault" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual(sr.name, 'alan') self.failUnlessEqual(sr.type, 'snapmirrorvault') def test_setref_snapmirrorvault_type(self): """ Test a setref node of type 'snapmirrorvault' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapvaultmirror" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual(sr.name, 'alan') self.failUnlessEqual(sr.type, 'snapvaultmirror')
class QtreeTest(unittest.TestCase): """ Test various qtree configurations """ def setUp(self): optparser = BaseOptions() optparser.parseOptions([ 'dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower() ]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) self.defaults.get('global', 'dns_domain_name') xmldata = """ <project name="test" code="qtree"> <site name="sitea" type="primary" location="testlab"> <filer name="testfiler1" type="filer"> <vfiler name="vfiler01" rootaggr="aggr0"> <aggregate name="aggr01"> <volume name="testvol1"/> </aggregate> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.proj = Project() self.proj.configure_from_node(node, self.defaults, None) self.volume = self.proj.get_volumes()[0] def test_empty_qtree(self): """ Test an empty qtree node """ xmldata = """ <qtree /> """ node = etree.fromstring(xmldata) qtreeobj = qtree.create_qtree_from_node(node, self.defaults, self.volume) log.debug("qtree: %s", qtreeobj) def test_autocreate_qtree_oradata(self): """ Test a qtree that is autocreated for an oradata volume """ raise unittest.SkipTest("Oracle volume/qtree plugin not written yet.") volnode = etree.Element('volume') volnode.attrib['oracle'] = 'ORASID' volume = Volume('testvol2', self.filer1, 'aggr01', 100, type='oradata', volnode=volnode) self.proj.volumes.append(volume) self.proj.create_qtrees_for_volume(volume)
class SnapVaultTest(unittest.TestCase): """ Test SnapVault configurations """ def setUp(self): optparser = BaseOptions() optparser.parseOptions(['dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower()]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) xmldata = """ <project name="testproj" code="01"> <site name="testprimary" type="primary"> <vlan type="project" number="3003"> <network number="10.240.4.0/26" gateway="10.240.4.254"/> </vlan> <filer type="filer" name="filer01"> <vfiler> <ipaddress type="primary" ip="10.240.4.1"/> <aggregate name="aggr01" type="root"/> <aggregate name="aggr02"> <volume> <setref type="snapvault" name="default_primary"/> </volume> </aggregate> </vfiler> </filer> <filer type="nearstore" name="nearstore01"> </filer> </site> <snapvaultset name="default_primary" targetfiler="nearstore01" targetaggregate="aggr02"> <snapvaultdef basename="sv_daily"> <snapschedule>1@1</snapschedule> <snapvaultschedule>8@2</snapvaultschedule> </snapvaultdef> <snapvaultdef basename="sv_weekly"> <snapvaultschedule>13@sun@3</snapvaultschedule> </snapvaultdef> </snapvaultset> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.docgen = NetAppCommandsGenerator(self.project, self.defaults) def test_aggregates_exist(self): """ Check that all the right aggregates exist """ aggregates = [] for filer in self.project.get_filers(): log.debug("adding aggregates on filer: %s: %s", filer, filer.get_aggregates()) aggregates.extend( filer.get_aggregates() ) pass self.failUnlessEqual( len(aggregates), 3) def test_volumes_exist(self): """ Test the snapvault volumes exist """ vols = self.project.get_volumes() log.debug("vols: %s", [x for x in vols]) for vol in vols: log.debug("snapvaults: %s", vol.snapvaults) for snap in vol.snapvaults: log.debug("snap: %s", snap) pass pass filer = [ x for x in self.project.get_filers() if x.name == 'nearstore01'][0] cmds = self.docgen.filer_snapvault_init_commands(filer) log.debug("cmds: %s", cmds) self.failUnlessEqual( len(cmds), 1 )
class SnapVaultTest(unittest.TestCase): """ Test SnapVault configurations """ def setUp(self): optparser = BaseOptions() optparser.parseOptions([ 'dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower() ]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) xmldata = """ <project name="testproj" code="01"> <site name="testprimary" type="primary"> <vlan type="project" number="3003"> <network number="10.240.4.0/26" gateway="10.240.4.254"/> </vlan> <filer type="filer" name="filer01"> <vfiler> <ipaddress type="primary" ip="10.240.4.1"/> <aggregate name="aggr01" type="root"/> <aggregate name="aggr02"> <volume> <setref type="snapvault" name="default_primary"/> </volume> </aggregate> </vfiler> </filer> <filer type="nearstore" name="nearstore01"> </filer> </site> <snapvaultset name="default_primary" targetfiler="nearstore01" targetaggregate="aggr02"> <snapvaultdef basename="sv_daily"> <snapschedule>1@1</snapschedule> <snapvaultschedule>8@2</snapvaultschedule> </snapvaultdef> <snapvaultdef basename="sv_weekly"> <snapvaultschedule>13@sun@3</snapvaultschedule> </snapvaultdef> </snapvaultset> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.docgen = NetAppCommandsGenerator(self.project, self.defaults) def test_aggregates_exist(self): """ Check that all the right aggregates exist """ aggregates = [] for filer in self.project.get_filers(): log.debug("adding aggregates on filer: %s: %s", filer, filer.get_aggregates()) aggregates.extend(filer.get_aggregates()) pass self.failUnlessEqual(len(aggregates), 3) def test_volumes_exist(self): """ Test the snapvault volumes exist """ vols = self.project.get_volumes() log.debug("vols: %s", [x for x in vols]) for vol in vols: log.debug("snapvaults: %s", vol.snapvaults) for snap in vol.snapvaults: log.debug("snap: %s", snap) pass pass filer = [ x for x in self.project.get_filers() if x.name == 'nearstore01' ][0] cmds = self.docgen.filer_snapvault_init_commands(filer) log.debug("cmds: %s", cmds) self.failUnlessEqual(len(cmds), 1)
class LUNTest(unittest.TestCase): """ Test various LUN configurations """ def setUp(self): optparser = BaseOptions() optparser.parseOptions(['dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower()]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) self.project = Project() def test_bare_lun(self): """ Test the simplest possible lun configuration """ xmlfile = os.path.join(XML_FILE_LOCATION, 'bare_lun.xml') tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None) # Find the lun vol = self.project.get_volumes()[1] lunobj = vol.get_luns()[0] self.assertEquals( lunobj.name, 'vftest01.lun00') self.assertEquals( lunobj.size, 100) self.assertEquals( lunobj.igroup.name, 'testproj00') def test_three_bare_luns(self): """ Test three bare luns in the same volume/qtree """ xmlfile = os.path.join(XML_FILE_LOCATION, 'bare_lun_three.xml') tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None) # Find the lun vol = self.project.get_volumes()[1] lunobj = vol.get_luns()[0] self.assertEquals( lunobj.name, 'vftest01.lun00') self.assertEquals( int(lunobj.size), 33) self.assertEquals( lunobj.igroup.name, 'testproj00') lunobj = vol.get_luns()[2] self.assertEquals( lunobj.name, 'vftest01.lun02') self.assertEquals( int(lunobj.size), 33) self.assertEquals( lunobj.igroup.name, 'testproj00') def test_2vols_1lun_each(self): """ 2 volumes, each with 1 lun """ xmlfile = os.path.join(XML_FILE_LOCATION, 'lun_2vols_1lun_each.xml') tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None) # Find the lun vols = self.project.get_volumes() log.debug("vols: %s", vols) lunobj = vols[2].get_luns()[0] self.assertEquals( lunobj.name, 'vftest01.lun01') self.assertEquals( int(lunobj.size), 100) self.assertEquals( lunobj.igroup.name, 'testproj00') def test_lun_3vols_multiple_luns(self): """ A more complex example with multiple aggregates, volumes, luns, qtrees """ xmlfile = os.path.join(XML_FILE_LOCATION, 'lun_3vols_multiple_luns.xml') tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None)
class SetRefTest(unittest.TestCase): """ Test SetRef objects """ def setUp(self): optparser = BaseOptions() optparser.parseOptions(['dummyfile.xml', '--debug=%s' % logging._levelNames[log.level].lower()]) self.defaults = RawConfigParser() configfiles = self.defaults.read(TESTCONF) xmldata = """ <project name="testproj" code="01"> <site name="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate type="root" name="aggr0"/> <aggregate name="aggr01"> <volume name="blah"> </volume> </aggregate> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) def test_bare_setref(self): """ Test a bare setref node """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref /> """ node = etree.fromstring(xmldata) sr = SetRef() self.failUnlessRaises( KeyError, sr.configure_from_node, node, self.defaults, vol) def test_named_setref(self): """ Test a setref node with just a name """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() self.failUnlessRaises( KeyError, sr.configure_from_node, node, self.defaults, vol) def test_setref_bad_type(self): """ Test a setref node with an invalid type """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="blah" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() self.failUnlessRaises( ValueError, sr.configure_from_node, node, self.defaults, vol) def test_setref_snapshot_type(self): """ Test a setref node of type 'snapshot' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapshot" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual( sr.name, 'alan' ) self.failUnlessEqual( sr.type, 'snapshot' ) def test_setref_snapvault_type(self): """ Test a setref node of type 'snapshot' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapvault" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual( sr.name, 'alan' ) self.failUnlessEqual( sr.type, 'snapvault' ) def test_setref_snapmirror_type(self): """ Test a setref node of type 'snapmirror' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapmirror" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual( sr.name, 'alan' ) self.failUnlessEqual( sr.type, 'snapmirror' ) def test_setref_snapmirrorvault_type(self): """ Test a setref node of type 'snapmirrorvault' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapmirrorvault" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual( sr.name, 'alan' ) self.failUnlessEqual( sr.type, 'snapmirrorvault' ) def test_setref_snapmirrorvault_type(self): """ Test a setref node of type 'snapmirrorvault' """ vol = [x for x in self.project.get_volumes() if x.name == 'blah'][0] xmldata = """ <setref type="snapvaultmirror" name="alan" /> """ node = etree.fromstring(xmldata) sr = SetRef() sr.configure_from_node(node, self.defaults, vol) self.failUnlessEqual( sr.name, 'alan' ) self.failUnlessEqual( sr.type, 'snapvaultmirror' )