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