Ejemplo n.º 1
0
def get_policy(vmdk_path):
    """
    Returns VSAN policy string for VSAN object backing <vmdk_path>
    Throws exception if the path is not found or it is not a VSAN object
    """
    uuid = vmdk_ops.get_vsan_uuid(vmdk_path)
    rc, out = vmdk_ops.RunCommand(OBJTOOL_GET_ATTR.format(uuid))
    if rc != 0:
        logging.warning("Failed to get policy for %s : %s", vmdk_path, out)
        return None
    policy = json.loads(out)['Policy']
    return policy
Ejemplo n.º 2
0
def set_policy(vmdk_path, policy_string):
    """
    Sets policy for an object backing <vmdk_path> to <policy>.
    Returns True on success
    """
    uuid = vmdk_ops.getVMDKUuid(vmdk_path)
    rc, out = vmdk_ops.RunCommand(
        OBJTOOL_SET_POLICY.format(uuid, policy_string))
    if rc != 0:
        logging.warning("Failed to set policy for %s : %s", vmdk_path, out)
        return False
    return True
Ejemplo n.º 3
0
def set_policy(vmdk_path, policy_string):
    """
    Sets policy for an object backing <vmdk_path> to <policy>.
    Returns None on success else return the output error. This can be
    displayed at the client
    """
    uuid = vmdk_ops.get_vsan_uuid(vmdk_path)
    rc, out = vmdk_ops.RunCommand(
        OBJTOOL_SET_POLICY.format(uuid, policy_string))
    if rc != 0:
        logging.warning("Failed to set policy for %s : %s", vmdk_path, out)
        return out
    return None
def log_volume_lsof(vol_name):
    """Log volume open file descriptors"""
    rc, out = vmdk_ops.RunCommand(LSOF_CMD)
    if rc != 0:
        logging.error("Error running lsof for %s: %s", vol_name, out)
        return
    for line in out.splitlines():
        # Make sure we only match the lines pertaining to that volume files.
        if re.search(r".*/vmfs/volumes/.*{0}.*".format(vol_name), line):
            cartel, name, ftype, fd, desc = line.split()
            msg = "cartel={0}, name={1}, type={2}, fd={3}, desc={4}".format(
                cartel, name, ftype, fd, desc)
            logging.info("Volume open descriptor: %s", msg)
class TestVsanInfo(unittest.TestCase):
    """ Test VSAN Info API """

    VM_NAME = "test-vm"
    VSAN_DS = "/vmfs/volumes/vsanDatastore"
    TEST_DIR = os.path.join(VSAN_DS, "vsan_info_test")
    TEST_VOL = "test_policy_vol"
    VMDK_PATH = os.path.join(TEST_DIR, TEST_VOL + ".vmdk")
    NON_VSAN_VMDK = "/vmfs/volumes/datastore/eek/other.vmdk"

    # make sure dir is there, failure "already exits" is OK here
    vmdk_ops.RunCommand("/usr/lib/vmware/osfs/bin/osfs-mkdir " + TEST_DIR)

    def __init__(self, *args, **kwargs):
        super(TestVsanInfo, self).__init__(*args, **kwargs)
        self.si = None

    def setUp(self):
        """create a vmdk before each test (method) in this class"""
        self.si = vmdk_ops.connectLocal()
        # create VMDK
        err = vmdk_ops.createVMDK(self.VM_NAME, self.VMDK_PATH,
                                  "test_policy_vol")
        self.assertEqual(err, None, err)

    def tearDown(self):
        """clean up after each test (method) in this class"""
        err = vmdk_ops.removeVMDK(self.VMDK_PATH)
        self.assertEqual(err, None, err)
        pyVim.connect.Disconnect(self.si)

    def test_ds(self):
        self.assertNotEqual(vsan_info.get_vsan_datastore(), None,
                            "Failed to find VSAN datastore")
        self.assertTrue(vsan_info.is_on_vsan(self.VMDK_PATH),
                        "is_on_vsan can't find file %s" % self.VMDK_PATH)
        self.assertFalse(
            vsan_info.is_on_vsan(self.NON_VSAN_VMDK),
            "is_on_vsan is mistaken about the file %s" % self.NON_VSAN_VMDK)

    def test_policy(self):
        # check it's on VSAN
        self.assertTrue(vsan_info.is_on_vsan(self.VMDK_PATH),
                        "is_on_vsan can't find file %s" % self.VMDK_PATH)
        # set policy
        policy_string = \
            '(("hostFailuresToTolerate" i0) ("forceProvisioning" i1))'
        # same policy content with different space/tabs:
        same_policy = \
            ' ((  "hostFailuresToTolerate"    \ti0) ("forceProvisioning" i1))'
        # different content:
        notsame_policy = \
            '(("hostFailuresToTolerate" i0) ("forceProvisioning" i0))'
        self.assertTrue(vsan_info.set_policy(self.VMDK_PATH, policy_string),
                        "failed to set")
        # get policy and check it
        p = vsan_info.get_policy(self.VMDK_PATH)
        self.assertTrue(vsan_info.same_policy(self.VMDK_PATH, p),
                        "failed to compare with get_policy")
        self.assertTrue(vsan_info.same_policy(self.VMDK_PATH, policy_string),
                        "failed to compare with original policy")
        self.assertTrue(vsan_info.same_policy(self.VMDK_PATH, same_policy),
                        "failed to compare with same policy, different tabs")
        self.assertFalse(vsan_info.same_policy(self.VMDK_PATH, notsame_policy),
                         "failed to compare with different policy")