def test_loaded_module_no_stats(self):
        """Loaded modules with no stats files should be skipped."""
        # An easily-repeatable example of when this happens is when
        # lnet.ko is loaded but LNet is stopped.
        os.makedirs(os.path.join(self.test_root, "proc/sys/lnet"))

        f = open(os.path.join(self.test_root, "proc/modules"), "w+")
        f.write("""
lnet 233888 3 ptlrpc,ksocklnd,obdclass, Live 0xffffffffa076e000
        """)
        f.close()

        # Create dummy nodestats files
        f = open(os.path.join(self.test_root, "proc/meminfo"), "w")
        f.write("MemTotal:        3991680 kB\n")
        f.close()
        f = open(os.path.join(self.test_root, "proc/stat"), "w")
        f.write("cpu  24601 2 33757 3471279 10892 6 676 0 0\n")
        f.close()

        audit = LocalAudit()
        assert LnetAudit in audit.audit_classes()

        # this shouldn't raise a runtime error
        audit.metrics()
    def test_no_lustre_modules_loaded(self):
        """Audit shouldn't fail if there are no Lustre modules loaded."""

        # Create a modules file with no Lustre modules in it.
        f = open(os.path.join(self.test_root, "proc/modules"), "w+")
        f.write("""
lockd 74268 1 nfs, Live 0xffffffffa0105000
fscache 46761 1 nfs, Live 0xffffffffa00ef000 (T)
nfs_acl 2613 1 nfs, Live 0xffffffffa00e9000
auth_rpcgss 44925 1 nfs, Live 0xffffffffa00d6000
sunrpc 242277 18 nfs,lockd,nfs_acl,auth_rpcgss, Live 0xffffffffa0082000
sd_mod 38196 6 - Live 0xffffffffa006b000
crc_t10dif 1507 1 sd_mod, Live 0xffffffffa0065000
e1000 167605 0 - Live 0xffffffffa0030000
ahci 40197 5 - Live 0xffffffffa001e000
dm_mod 75539 2 dm_mirror,dm_log, Live 0xffffffffa0000000
        """)
        f.close()

        # Create dummy nodestats files
        f = open(os.path.join(self.test_root, "proc/meminfo"), "w")
        f.write("MemTotal:        3991680 kB\n")
        f.close()
        f = open(os.path.join(self.test_root, "proc/stat"), "w")
        f.write("cpu  24601 2 33757 3471279 10892 6 676 0 0\n")
        f.close()

        audit = LocalAudit()
        # FIXME: this gethostname() should probably be stubbed out
        import socket
        self.assertEqual(audit.metrics(), {'raw': {'node': {'hostname': socket.gethostname(), 'cpustats': {'iowait': 10892, 'idle': 3471279, 'total': 3540537, 'user': 24601, 'system': 33763}, 'meminfo': {'MemTotal': 3991680}}}})
    def test_missing_brw_stats(self):
        """Catch a race where brw_stats hasn't been created yet."""
        os.makedirs(os.path.join(self.test_root, "sys/kernel/debug/lustre"))

        f = open(os.path.join(self.test_root, "proc/modules"), "w+")
        f.write("obdfilter 265823 4 - Live 0xffffffffa06b5000")
        f.close()

        f = open(os.path.join(self.test_root, "sys/kernel/debug/lustre/devices"), "w+")
        f.write("  2 UP obdfilter test-OST0000 test-OST0000_UUID 5")
        f.close()

        # Create dummy nodestats files
        f = open(os.path.join(self.test_root, "proc/meminfo"), "w")
        f.write("MemTotal:        3991680 kB\n")
        f.close()
        f = open(os.path.join(self.test_root, "proc/stat"), "w")
        f.write("cpu  24601 2 33757 3471279 10892 6 676 0 0\n")
        f.close()

        audit = LocalAudit()
        assert ObdfilterAudit in audit.audit_classes()

        # this shouldn't raise a runtime error
        audit.metrics()
Beispiel #4
0
 def setUp(self):
     tests = os.path.join(os.path.dirname(__file__), "..")
     self.test_root = os.path.join(
         tests, "data/lustre_versions/2.9.58_86_g2383a62/mds_mgs"
     )
     super(TestLocalAudit, self).setUp()
     self.audit = LocalAudit()
    def test_oss_metrics(self):
        """Test that the various OSS metrics are collected and aggregated."""
        self.test_root = os.path.join(self.tests,
                                      "data/lustre_versions/2.9.58_86_g2383a62/oss")

        audit = LocalAudit()
        metrics = audit.metrics()['raw']['lustre']
        self.assertEqual(metrics['target']['testfs-OST0000']['filesfree'], 655061)
        self.assertEqual(metrics['lnet']['recv_count'], 50072)
        self.assertEqual(len(metrics['target']), 1)
Beispiel #6
0
    def test_oss_metrics(self):
        """Test that the various OSS metrics are collected and aggregated."""
        self.test_root = os.path.join(self.tests,
                                      "data/lustre_versions/2.0.66/oss")

        audit = LocalAudit()
        metrics = audit.metrics()['raw']['lustre']
        self.assertEqual(metrics['target']['lustre-OST0000']['filesfree'],
                         127575)
        self.assertEqual(metrics['lnet']['recv_count'], 547181)
    def test_stats(self):
        """ Test that expected values are provided for certain stats used by the UI. """
        self.test_root = os.path.join(self.tests,
                                      "data/lustre_versions/2.9.58_86_g2383a62/oss")

        audit = LocalAudit()
        metrics = audit.metrics()['raw']['lustre']
        self.assertEqual(metrics['target']['testfs-OST0000']['stats']['read_bytes']['units'], "bytes")
        self.assertEqual(metrics['target']['testfs-OST0000']['stats']['read_bytes']['sum'], 0)
        self.assertEqual(metrics['target']['testfs-OST0000']['stats']['write_bytes']['count'], 2)
        self.assertEqual(metrics['target']['testfs-OST0000']['stats']['write_bytes']['sum'], 2468000)
Beispiel #8
0
    def test_24_oss_metrics(self):
        """Test that the various OSS metrics are collected and aggregated (2.4+)."""
        self.test_root = os.path.join(self.tests,
                                      "data/lustre_versions/2.5.0/oss")

        audit = LocalAudit()
        metrics = audit.metrics()['raw']['lustre']
        self.assertEqual(metrics['target']['lustre-OST0000']['filesfree'],
                         524040)
        self.assertEqual(metrics['lnet']['recv_count'], 156747)
        self.assertEqual(len(metrics['target']), 7)
    def test_mdsmgs_metrics(self):
        """ Test that the various MGS/MDS metrics are collected and aggregated. """
        self.test_root = os.path.join(self.tests,
                                      "data/lustre_versions/2.9.58_86_g2383a62/mds_mgs")

        audit = LocalAudit()

        self.add_command(CMD, stdout=lctl_output)

        metrics = audit.metrics()['raw']['lustre']
        self.assertEqual(metrics['target']['testfs-MDT0000']['filesfree'], 4194037)
        self.assertEqual(metrics['target']['MGS']['num_exports'], 6)
        self.assertEqual(metrics['lnet']['send_count'], 12868)
    def test_mdt_hsm_metrics(self):
        """ Test that the HSM metrics are collected and aggregated. """
        self.test_root = os.path.join(self.tests,
                                      "data/lustre_versions/2.9.58_86_g2383a62/mds_mgs")

        audit = LocalAudit()

        self.add_command(CMD, stdout=lctl_output)

        metrics = audit.metrics()['raw']['lustre']['target']['testfs-MDT0000']['hsm']
        self.assertEqual(metrics['agents']['idle'], 1)
        self.assertEqual(metrics['agents']['busy'], 1)
        self.assertEqual(metrics['agents']['total'], 2)

        self.assertEqual(metrics['actions']['waiting'], 1)
        self.assertEqual(metrics['actions']['running'], 1)
        self.assertEqual(metrics['actions']['succeeded'], 1)
        self.assertEqual(metrics['actions']['errored'], 0)
Beispiel #11
0
    def test_stats(self):
        """ Test that expected values are provided for certain stats used by the UI. """
        self.test_root = os.path.join(
            self.tests, "data/lustre_versions/2.9.58_86_g2383a62/oss")

        audit = LocalAudit()
        metrics = audit.metrics()["raw"]["lustre"]
        self.assertEqual(
            metrics["target"]["testfs-OST0000"]["stats"]["read_bytes"]
            ["units"], "bytes")
        self.assertEqual(
            metrics["target"]["testfs-OST0000"]["stats"]["read_bytes"]["sum"],
            0)
        self.assertEqual(
            metrics["target"]["testfs-OST0000"]["stats"]["write_bytes"]
            ["count"], 2)
        self.assertEqual(
            metrics["target"]["testfs-OST0000"]["stats"]["write_bytes"]["sum"],
            2468000)
Beispiel #12
0
    def test_mdt_hsm_metrics(self):
        """ Test that the HSM metrics are collected and aggregated. """
        self.test_root = os.path.join(
            self.tests, "data/lustre_versions/2.9.58_86_g2383a62/mds_mgs")

        audit = LocalAudit()

        self.add_command(CMD, stdout=lctl_output)

        metrics = audit.metrics(
        )["raw"]["lustre"]["target"]["testfs-MDT0000"]["hsm"]
        self.assertEqual(metrics["agents"]["idle"], 1)
        self.assertEqual(metrics["agents"]["busy"], 1)
        self.assertEqual(metrics["agents"]["total"], 2)

        self.assertEqual(metrics["actions"]["waiting"], 1)
        self.assertEqual(metrics["actions"]["running"], 1)
        self.assertEqual(metrics["actions"]["succeeded"], 1)
        self.assertEqual(metrics["actions"]["errored"], 0)
Beispiel #13
0
class TestLocalAudit(PatchedContextTestCase):
    def setUp(self):
        tests = os.path.join(os.path.dirname(__file__), '..')
        self.test_root = os.path.join(tests,
                                      "data/lustre_versions/2.0.66/mds_mgs")
        super(TestLocalAudit, self).setUp()
        self.audit = LocalAudit()

    def test_localaudit_audit_classes(self):
        """LocalAudit.audit_classes() should return a list of classes."""
        self.assertEqual(self.audit.audit_classes(),
                         [LnetAudit, MdtAudit, MgsAudit, NodeAudit])
    def test_loaded_module_no_device(self):
        """Loaded module with no device entry should be skipped."""
        # We can hit this case fairly readily simply by unmounting
        # targets and leaving modules loaded.  We can simulate it
        # by creating a /proc/modules file with one of our Audit
        # classes' modules in it and an empty devices
        # file.
        os.makedirs(os.path.join(self.test_root, "sys/kernel/debug/lustre"))

        # Create a modules file with...  I dunno, lnet and mgs entries.
        f = open(os.path.join(self.test_root, "proc/modules"), "w+")
        f.write("""
lnet 233888 3 ptlrpc,ksocklnd,obdclass, Live 0xffffffffa076e000
exportfs 4202 1 fsfilt_ldiskfs, Live 0xffffffffa0d22000
mgs 153919 1 - Live 0xffffffffa0cfa000
mgc 50620 2 mgs, Live 0xffffffffa0a90000
        """)
        f.close()

        # Create an empty devices file
        open(os.path.join(self.test_root, "sys/kernel/debug/lustre/devices"), "w+").close()

        # Ideally, our audit aggregator should never instantiate the
        # audit in the first place.
        audit = LocalAudit()
        assert MgsAudit not in audit.audit_classes()

        # On the other hand, some modules don't have a corresponding
        # device entry, and therefore the audit should be instantiated.
        audit = LocalAudit()
        assert LnetAudit in audit.audit_classes()
Beispiel #15
0
 def setUp(self):
     tests = os.path.join(os.path.dirname(__file__), '..')
     self.test_root = os.path.join(tests,
                                   "data/lustre_versions/2.0.66/mds_mgs")
     super(TestLocalAudit, self).setUp()
     self.audit = LocalAudit()