class Site(unittest.TestCase): """ Test various site 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="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate name="aggr01"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) def test_empty_site(self): """ Test the simplest possible site configuration """ xmldata = """ <site/> """ node = etree.fromstring(xmldata)
def test_create_project_1_site(self): xmlfile = os.path.join(XML_FILE_LOCATION, "project_1_site.xml") tree = etree.parse(xmlfile) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None) # see if the convenience functions are set correctly self.failUnlessEqual(len(project.get_sites()), 1)
def test_create_project_1_site(self): xmlfile = os.path.join(XML_FILE_LOCATION, "project_1_site.xml") tree = etree.parse(xmlfile) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None) # see if the convenience functions are set correctly self.failUnlessEqual( len(project.get_sites()), 1)
class ExampleTest(unittest.TestCase): def setUp(self): """ Prepare for a configuration parse test """ 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_working(self): self.failUnlessEqual(1, 1) def test_basic_example(self): """ Test the general example file """ xmlfile = os.path.join(XML_FILE_LOCATION, "EXAMPLE.project-definition.xml") tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None) def test_multi_network_example(self): """ Test the general example file """ xmlfile = os.path.join(XML_FILE_LOCATION, "EXAMPLE.multi-network-vlan.project-definition.xml") tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None)
class VolumeTest(unittest.TestCase): """ Test various volume 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="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate type="root" name="aggr0"/> <aggregate name="aggr01"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.sitea = self.project.get_sites()[0] self.filer1 = self.sitea.get_filers()[0] self.vfiler1 = self.filer1.get_vfilers()[0] self.aggr1 = self.vfiler1.get_aggregates()[0] def test_line_volume(self): """ Test the simplest possible volume configuration """ xmldata = """ <volume> </volume> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_01") def test_simple_volume(self): """ Test the simplest possible volume configuration """ xmldata = """ <filer name='testfiler1'> <aggregate name='testaggr01'> <volume> </volume> </aggregate> </filer> """ node = etree.fromstring(xmldata) volnode = node.xpath('*/volume')[0] volume.create_volume_from_node(volnode, self.defaults, self.aggr1)
def test_create_project_1_site_3_hosts(self): xmlfile = os.path.join(XML_FILE_LOCATION, "project_1_site_3_hosts.xml") tree = etree.parse(xmlfile) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None) self.failUnlessEqual( len(project.get_sites()), 1) site = project.get_sites()[0] hosts = project.get_sites()[0].get_hosts() self.failUnlessEqual( len(hosts), 3)
def test_parse_clustered_nearstore(self): """ Test parsing of clustered nearstore syntax """ xmlfile = "clustered_nearstore.xml" filepath = os.path.join(XML_FILE_LOCATION, xmlfile) tree = etree.parse(filepath) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None)
def test_parse_drhostexports(self): """ Test parsing of dr host exports syntax """ xmlfile = "drhostexport_test.xml" filepath = os.path.join(XML_FILE_LOCATION, xmlfile) tree = etree.parse(filepath) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None)
def test_parse_minimal(self): """ Test parsing of minimal XML file """ xmlfile = "minimal_parsable_config.xml" filepath = os.path.join(XML_FILE_LOCATION, xmlfile) tree = etree.parse(filepath) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None)
def test_create_project_1_site_3_hosts(self): xmlfile = os.path.join(XML_FILE_LOCATION, "project_1_site_3_hosts.xml") tree = etree.parse(xmlfile) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None) self.failUnlessEqual(len(project.get_sites()), 1) site = project.get_sites()[0] hosts = project.get_sites()[0].get_hosts() self.failUnlessEqual(len(hosts), 3)
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 VFilerTest(unittest.TestCase): """ Test the VFiler class """ 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="demo" code="3"> <site name="one" type="primary" location="somewhere"> <vlan number="3001" type="project"/> <filer name="testfiler1" type="filer"> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.site = self.project.get_sites()[0] self.filer = self.site.get_filers()[0] def test_create_vfiler_bare(self): """ A bare vfiler with full default options """ xmldata = """ <vfiler /> """ node = etree.fromstring(xmldata) vfiler = VFiler() vfiler.configure_from_node(node, self.defaults, self.filer) self.failUnlessEqual( vfiler.name, "vfdemo" ) rootaggr = vfiler.get_root_aggregate() self.failUnlessEqual( rootaggr.name, "rootaggr" ) def test_create_vfiler_minimal(self): xmldata = """ <vfiler name="vftest01" /> """ node = etree.fromstring(xmldata) vfiler = VFiler() vfiler.configure_from_node(node, self.defaults, self.filer) self.failUnlessEqual( vfiler.name, "vftest01" ) rootaggr = vfiler.get_root_aggregate() self.failUnlessEqual( rootaggr.name, "rootaggr" )
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 AggregateTest(unittest.TestCase): """ Test various aggregate 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="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate type="root" name="aggr0"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.sitea = self.project.get_sites()[0] self.filer1 = self.sitea.get_filers()[0] self.vfiler1 = self.filer1.get_vfilers()[0] def test_bare_aggregate(self): """ Test the simplest single aggregate node """ xmldata = """ <aggregate> </aggregate> """ node = etree.fromstring(xmldata) self.failUnlessRaises(KeyError, aggregate.create_aggregate_from_node, node, self.defaults, self.vfiler1)
class AggregateTest(unittest.TestCase): """ Test various aggregate 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="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate type="root" name="aggr0"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.sitea = self.project.get_sites()[0] self.filer1 = self.sitea.get_filers()[0] self.vfiler1 = self.filer1.get_vfilers()[0] def test_bare_aggregate(self): """ Test the simplest single aggregate node """ xmldata = """ <aggregate> </aggregate> """ node = etree.fromstring(xmldata) self.failUnlessRaises(KeyError, aggregate.create_aggregate_from_node, node, self.defaults, self.vfiler1)
class NetAppTestBase(unittest.TestCase): """ Common basecode setup for testing NetApp commands output """ 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.outfile = StringIO() def load_testfile(self, filename): """ Load a test file for verifying functionality """ filepath = os.path.join(XML_FILE_LOCATION, filename) tree = etree.parse(filepath) self.project = Project() self.project.configure_from_node(tree.getroot(), self.defaults, None) self.docgenerator = NetAppCommandsGenerator(self.project, self.defaults)
class ExampleTest(unittest.TestCase): def setUp(self): """ Prepare for a configuration parse test """ 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_working(self): self.failUnlessEqual(1, 1) def test_basic_example(self): """ Test the general example file """ xmlfile = os.path.join(XML_FILE_LOCATION, "EXAMPLE.project-definition.xml") tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None) def test_multi_network_example(self): """ Test the general example file """ xmlfile = os.path.join( XML_FILE_LOCATION, "EXAMPLE.multi-network-vlan.project-definition.xml") tree = etree.parse(xmlfile) self.project.configure_from_node(tree.getroot(), self.defaults, None)
class Site(unittest.TestCase): """ Test various site 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="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate name="aggr01"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) def test_empty_site(self): """ Test the simplest possible site configuration """ xmldata = """ <site/> """ node = etree.fromstring(xmldata)
# Load configuration file defaults = RawConfigParser() parsedfiles = defaults.read(optparser.options.configfile) if len(parsedfiles) == 0: raise ValueError("Cannot load configuration file: %s" % optparser.options.configfile) # Load the document generation plugins doc_plugins = load_doc_plugins(defaults) try: # load the configuration from a config file proj = Project() tree = etree.parse(optparser.options.definitionfile) proj.configure_from_node(tree.getroot(), defaults, None) except: log.critical("Cannot load configuration. Unhandled error condition:") import traceback traceback.print_exc() sys.exit(1) pass # Use the '-d' option to determine which document to generate docgen = doc_plugins[optparser.options.doctype](proj, defaults) #raise NotImplementedError("DocType of '%s' is not handled yet." % optparser.options.doctype) if optparser.options.outfile is not None: outf = open(optparser.options.outfile, "w") docgen.emit(outf, ns=ns) outf.close()
ns = {} # Load configuration file defaults = RawConfigParser() parsedfiles = defaults.read(optparser.options.configfile) if len(parsedfiles) == 0: raise ValueError("Cannot load configuration file: %s" % optparser.options.configfile) # Load the document generation plugins doc_plugins = load_doc_plugins(defaults) try: # load the configuration from a config file proj = Project() tree = etree.parse(optparser.options.definitionfile) proj.configure_from_node(tree.getroot(), defaults, None) except: log.critical("Cannot load configuration. Unhandled error condition:") import traceback traceback.print_exc() sys.exit(1) pass # Use the '-d' option to determine which document to generate docgen = doc_plugins[optparser.options.doctype](proj, defaults) #raise NotImplementedError("DocType of '%s' is not handled yet." % optparser.options.doctype) if optparser.options.outfile is not None: outf = open(optparser.options.outfile, "w") docgen.emit(outf, ns=ns) outf.close()
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 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 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 VolumeTest(unittest.TestCase): """ Test various volume 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="sitea" type="primary" location="testlab"> <filer name="filer1" type="filer"> <vfiler name="vftest01"> <aggregate type="root" name="aggr0"/> <aggregate name="aggr01"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.sitea = self.project.get_sites()[0] self.filer1 = self.sitea.get_filers()[0] self.vfiler1 = self.filer1.get_vfilers()[0] self.aggr1 = self.vfiler1.get_aggregates()[0] def test_line_volume(self): """ Test the simplest possible volume configuration """ xmldata = """ <volume> </volume> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_01") def test_simple_volume(self): """ Test the simplest possible volume configuration """ xmldata = """ <filer name='testfiler1'> <aggregate name='testaggr01'> <volume> </volume> </aggregate> </filer> """ node = etree.fromstring(xmldata) volnode = node.xpath('*/volume')[0] volume.create_volume_from_node(volnode, self.defaults, self.aggr1)
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 SnapVaultSetTest(unittest.TestCase): """ Test SnapVaultSet 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"> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) def test_bare_snapvaultset(self): """ Test a bare snapvaultset node """ xmldata = """ <snapvaultset /> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() self.failUnlessRaises(KeyError, sr.configure_from_node, node, self.defaults, self.project) def test_snapvaultset_id(self): """ Test a snapvaultset with an id """ xmldata = """ <snapvaultset name="default" /> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() self.failUnlessRaises(KeyError, sr.configure_from_node, node, self.defaults, self.project) def test_snapvaultset_targetfiler(self): """ Test a snapvaultset with targetfiler, but no targetaggregate """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" /> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() self.failUnlessRaises(KeyError, sr.configure_from_node, node, self.defaults, self.project) def test_snapvaultset_targetaggr(self): """ Test a snapvaultset with targetfiler and targetaggregate """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" targetaggregate="aggr02"/> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() sr.configure_from_node(node, self.defaults, self.project) self.failUnlessEqual(sr.name, 'default') self.failUnlessEqual(sr.targetfiler, 'filer01') self.failUnlessEqual(sr.targetaggregate, 'aggr02') self.failUnlessEqual(sr.targetvolume, None) def test_snapvaultset_targetvolume(self): """ Test a snapvaultset with targetfiler and targetvolume """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" targetvolume="testvol03"/> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() sr.configure_from_node(node, self.defaults, self.project) self.failUnlessEqual(sr.name, 'default') self.failUnlessEqual(sr.targetfiler, 'filer01') self.failUnlessEqual(sr.targetaggregate, None) self.failUnlessEqual(sr.targetvolume, 'testvol03') def test_snapvaultset_multiplier(self): """ Test setting a custom multipler for the snapvaultset """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" targetaggregate="aggr02" multiplier="3.4"/> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() sr.configure_from_node(node, self.defaults, self.project) self.failUnlessEqual(sr.name, 'default') self.failUnlessEqual(sr.multiplier, 3.4)
def test_create_project_bare(self): xmlfile = os.path.join(XML_FILE_LOCATION, "project_bare.xml") tree = etree.parse(xmlfile) project = Project() project.configure_from_node(tree.getroot(), self.defaults, None)
class ExportTest(unittest.TestCase): """ Test various export 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="sitea" type="primary" location="testlab"> <host name="sitea_host01" operatingsystem="linux" /> <host name="sitea_host02" operatingsystem="windows" /> <host name="sitea_host03" operatingsystem="solaris" /> <vlan type="project" number="3001"> <network number="10.20.30.1/26" gateway="10.20.30.254"/> </vlan> <filer name="filer1" type="filer"> <vfiler name="vftest01" rootaggr="aggr0"> <ipaddress type="primary" ip="10.20.30.1"/> <aggregate name="aggr01"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.sitea = self.project.get_sites()[0] self.filer1 = self.sitea.get_filers()[0] self.vfiler1 = self.filer1.get_vfilers()[0] self.aggr1 = self.vfiler1.get_aggregates()[0] def test_default_exports(self): """ Test a single volume and the default exports. """ xmldata = """ <volume> </volume> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_01") self.project.setup_exports(self.defaults) # check the exports are set up correctly for qtree in self.vfiler1.get_qtrees(): exports = qtree.get_exports() log.debug("exports: %s", [str(x) for x in exports]) self.failUnlessEqual(len(exports), 3) self.failUnlessEqual(exports[0].fromip, '10.20.30.1') def test_default_exports_2(self): """ Test a two volumes and the default exports. """ xmldata = """ <volume/> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_02") self.project.setup_exports(self.defaults) # check the exports are set up correctly for qtree in self.vfiler1.get_qtrees(): exports = qtree.get_exports() log.debug("exports: %s", [str(x) for x in exports]) self.failUnlessEqual(len(exports), 3) self.failUnlessEqual(exports[0].fromip, '10.20.30.1') def test_qtree_default(self): """ Test a single volume and the default exports. """ xmldata = """ <volume> <qtree name="blahblah"/> </volume> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_01") self.project.setup_exports(self.defaults) # check the exports are set up correctly for qtree in self.vfiler1.get_qtrees(): exports = qtree.get_exports() log.debug("exports: %s", [str(x) for x in exports]) self.failUnlessEqual(len(exports), 3) self.failUnlessEqual(exports[0].fromip, '10.20.30.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 SnapVaultSetTest(unittest.TestCase): """ Test SnapVaultSet 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"> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) def test_bare_snapvaultset(self): """ Test a bare snapvaultset node """ xmldata = """ <snapvaultset /> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() self.failUnlessRaises( KeyError, sr.configure_from_node, node, self.defaults, self.project) def test_snapvaultset_id(self): """ Test a snapvaultset with an id """ xmldata = """ <snapvaultset name="default" /> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() self.failUnlessRaises( KeyError, sr.configure_from_node, node, self.defaults, self.project) def test_snapvaultset_targetfiler(self): """ Test a snapvaultset with targetfiler, but no targetaggregate """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" /> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() self.failUnlessRaises( KeyError, sr.configure_from_node, node, self.defaults, self.project) def test_snapvaultset_targetaggr(self): """ Test a snapvaultset with targetfiler and targetaggregate """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" targetaggregate="aggr02"/> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() sr.configure_from_node(node, self.defaults, self.project) self.failUnlessEqual( sr.name, 'default') self.failUnlessEqual( sr.targetfiler, 'filer01') self.failUnlessEqual( sr.targetaggregate, 'aggr02') self.failUnlessEqual( sr.targetvolume, None) def test_snapvaultset_targetvolume(self): """ Test a snapvaultset with targetfiler and targetvolume """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" targetvolume="testvol03"/> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() sr.configure_from_node(node, self.defaults, self.project) self.failUnlessEqual( sr.name, 'default') self.failUnlessEqual( sr.targetfiler, 'filer01') self.failUnlessEqual( sr.targetaggregate, None) self.failUnlessEqual( sr.targetvolume, 'testvol03') def test_snapvaultset_multiplier(self): """ Test setting a custom multipler for the snapvaultset """ xmldata = """ <snapvaultset name="default" targetfiler="filer01" targetaggregate="aggr02" multiplier="3.4"/> """ node = etree.fromstring(xmldata) sr = SnapVaultSet() sr.configure_from_node(node, self.defaults, self.project) self.failUnlessEqual( sr.name, 'default') self.failUnlessEqual( sr.multiplier, 3.4)
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 ExportTest(unittest.TestCase): """ Test various export 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="sitea" type="primary" location="testlab"> <host name="sitea_host01" operatingsystem="linux" /> <host name="sitea_host02" operatingsystem="windows" /> <host name="sitea_host03" operatingsystem="solaris" /> <vlan type="project" number="3001"> <network number="10.20.30.1/26" gateway="10.20.30.254"/> </vlan> <filer name="filer1" type="filer"> <vfiler name="vftest01" rootaggr="aggr0"> <ipaddress type="primary" ip="10.20.30.1"/> <aggregate name="aggr01"/> </vfiler> </filer> </site> </project> """ node = etree.fromstring(xmldata) self.project = Project() self.project.configure_from_node(node, self.defaults, None) self.sitea = self.project.get_sites()[0] self.filer1 = self.sitea.get_filers()[0] self.vfiler1 = self.filer1.get_vfilers()[0] self.aggr1 = self.vfiler1.get_aggregates()[0] def test_default_exports(self): """ Test a single volume and the default exports. """ xmldata = """ <volume> </volume> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_01") self.project.setup_exports(self.defaults) # check the exports are set up correctly for qtree in self.vfiler1.get_qtrees(): exports = qtree.get_exports() log.debug("exports: %s", [ str(x) for x in exports ]) self.failUnlessEqual( len(exports), 3 ) self.failUnlessEqual( exports[0].fromip, '10.20.30.1' ) def test_default_exports_2(self): """ Test a two volumes and the default exports. """ xmldata = """ <volume/> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_02") self.project.setup_exports(self.defaults) # check the exports are set up correctly for qtree in self.vfiler1.get_qtrees(): exports = qtree.get_exports() log.debug("exports: %s", [ str(x) for x in exports ]) self.failUnlessEqual( len(exports), 3 ) self.failUnlessEqual( exports[0].fromip, '10.20.30.1' ) def test_qtree_default(self): """ Test a single volume and the default exports. """ xmldata = """ <volume> <qtree name="blahblah"/> </volume> """ node = etree.fromstring(xmldata) vol = volume.create_volume_from_node(node, self.defaults, self.aggr1) self.aggr1.add_child(vol) self.failUnlessEqual(vol.name, "filer1_vftest01_fs_01") self.project.setup_exports(self.defaults) # check the exports are set up correctly for qtree in self.vfiler1.get_qtrees(): exports = qtree.get_exports() log.debug("exports: %s", [ str(x) for x in exports ]) self.failUnlessEqual( len(exports), 3 ) self.failUnlessEqual( exports[0].fromip, '10.20.30.1' )