class ValidationTestCase(unittest.TestCase):
    """ Test validation of -o options on create """
    @unittest.skipIf(not vsan_info.get_vsan_datastore(),
                     "VSAN is not found - skipping vsan_info tests")
    def setUp(self):
        """ Create a bunch of policies """
        self.policy_names = ['name1', 'name2', 'name3']
        self.policy_content = ('(("proportionalCapacity" i50) '
                               '("hostFailuresToTolerate" i0))')
        self.path = vsan_info.get_vsan_datastore().info.url
        for n in self.policy_names:
            result = vsan_policy.create(n, self.policy_content)
            self.assertEquals(None, result,
                              "failed creating policy %s (%s)" % (n, result))

    def tearDown(self):
        for n in self.policy_names:
            try:
                vsan_policy.delete(n)
            except:
                pass

    def test_success(self):
        sizes = ['2gb', '200tb', '200mb', '5kb']
        sizes.extend([s.upper() for s in sizes])

        for s in sizes:
            for p in self.policy_names:
                for d in volume_kv.VALID_ALLOCATION_FORMATS:
                    # An exception should not be raised
                    vmdk_ops.validate_opts(
                        {
                            volume_kv.SIZE: s,
                            volume_kv.VSAN_POLICY_NAME: p,
                            volume_kv.DISK_ALLOCATION_FORMAT: d
                        }, self.path)
                    vmdk_ops.validate_opts({volume_kv.SIZE: s}, self.path)
                    vmdk_ops.validate_opts({volume_kv.VSAN_POLICY_NAME: p},
                                           self.path)
                    vmdk_ops.validate_opts(
                        {volume_kv.DISK_ALLOCATION_FORMAT: d}, self.path)

    def test_failure(self):
        bad = [{
            volume_kv.SIZE: '2'
        }, {
            volume_kv.VSAN_POLICY_NAME: 'bad-policy'
        }, {
            volume_kv.DISK_ALLOCATION_FORMAT: 'thiN'
        }, {
            volume_kv.SIZE: 'mb'
        }, {
            'bad-option': '4'
        }, {
            'bad-option': 'what',
            volume_kv.SIZE: '4mb'
        }]
        for opts in bad:
            with self.assertRaises(vmdk_ops.ValidationError):
                vmdk_ops.validate_opts(opts, self.path)
 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_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 setUp(self):
     """ Create a bunch of policies """
     self.policy_names = ['name1', 'name2', 'name3']
     self.policy_content = ('(("proportionalCapacity" i50) '
                            '("hostFailuresToTolerate" i0))')
     self.path = vsan_info.get_vsan_datastore().info.url
     for n in self.policy_names:
         result = vsan_policy.create(n, self.policy_content)
         self.assertEquals(None, result,
                           "failed creating policy %s (%s)" % (n, result))
def get_vsan_dockvols_path():
    """
    Return the VSAN datastore dockvols path for a given cluster. Default to the
    first datastore for now, so we can test without VSAN.
    """
    datastore = vsan_info.get_vsan_datastore()
    if datastore:
        return os.path.join(datastore.info.url, 'dockvols')
    else:
        return None
 def setUp(self):
     """ Create a bunch of policies """
     self.policy_names = ['name1', 'name2', 'name3']
     self.policy_content = ('(("proportionalCapacity" i50) '
                            '("hostFailuresToTolerate" i0))')
     self.path = vsan_info.get_vsan_datastore().info.url
     for n in self.policy_names:
         result = vsan_policy.create(n, self.policy_content)
         self.assertEquals(None, result,
                           "failed creating policy %s (%s)" % (n, result))
def get_vsan_dockvols_path():
    """
    Return the VSAN datastore dockvols path for a given cluster. Default to the
    first datastore for now, so we can test without VSAN.
    """
    datastore = vsan_info.get_vsan_datastore()
    if datastore:
        return os.path.join(datastore.info.url, 'dockvols')
    else:
        return None
Example #8
0
class TestVsanPolicy(unittest.TestCase):
    """ Test VSAN Policy code """
    @unittest.skipIf(not vsan_info.get_vsan_datastore(),
                     "VSAN is not found - skipping vsan_info tests")
    def setUp(self):
        self.policy_path = os.path.join(vsan_info.get_vsan_dockvols_path(),
                                        'policies/test_policy')
        self.name = 'test_policy'
        self.content = ('(("proportionalCapacity" i50) '
                        '("hostFailuresToTolerate" i0))')

    def tearDown(self):
        try:
            os.remove(self.policy_path)
        except:
            pass

    def assertPoliciesEqual(self):
        with open(self.policy_path) as f:
            content = f.read()
        # Remove the added newline
        self.assertEqual(content[:-1], self.content)

    def test_create(self):
        self.assertEqual(None, vsan_policy.create(self.name, self.content))
        self.assertPoliciesEqual()

    def test_double_create_fails(self):
        self.assertEqual(None, vsan_policy.create(self.name, self.content))
        self.assertNotEqual(None, vsan_policy.create(self.name, self.content))
        self.assertPoliciesEqual()

    def test_create_delete(self):
        self.assertEqual(None, vsan_policy.create(self.name, self.content))
        self.assertPoliciesEqual()
        self.assertEqual(None, vsan_policy.delete(self.name))
        self.assertFalse(os.path.isfile(self.policy_path))

    def test_delete_nonexistent_policy_fails(self):
        log = log_config.get_logger('Delete_nonexistent_policy')
        log.info(
            "\nThis is a negative test to delete a non-existent vsan policy.\n"
            "Test is expected to raise exception log - Failed to remove the policy file error. \n"
        )
        self.assertNotEqual(None, vsan_policy.delete(self.name))

    def test_create_list(self):
        self.assertEqual(None, vsan_policy.create(self.name, self.content))
        policies = vsan_policy.get_policies()
        self.assertTrue(self.content + '\n', policies[self.name])
# See the License for the specific language governing permissions and
# limitations under the License.#
#
# tests for vsan_info.py

import unittest
import log_config
import volume_kv as kv
import vmdk_ops
import os.path
import pyVim.connect

import vsan_info


@unittest.skipIf(not vsan_info.get_vsan_datastore(),
                "VSAN is not found - skipping vsan_info tests")
class TestVsanInfo(unittest.TestCase):
    """ Test VSAN Info API """

    VM_NAME = "test-vm"
    VSAN_DS = "/vmfs/volumes/"+vsan_info.get_vsan_datastore().info.name
    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):
# See the License for the specific language governing permissions and
# limitations under the License.#
#
# tests for vsan_info.py

import unittest
import log_config
import volume_kv as kv
import vmdk_ops
import os.path
import pyVim.connect

import vsan_info


@unittest.skipIf(not vsan_info.get_vsan_datastore(),
                 "VSAN is not found - skipping vsan_info tests")
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):
class VmdkCreateRemoveTestCase(unittest.TestCase):
    """Unit test for VMDK Create and Remove ops"""

    volName = "vol_UnitTest_Create"
    badOpts = {
        u'policy': u'good',
        volume_kv.SIZE: u'12unknown',
        volume_kv.DISK_ALLOCATION_FORMAT: u'5disk'
    }
    invalid_access_choice = {volume_kv.ACCESS: u'only-read'}
    invalid_access_opt = {u'acess': u'read-write'}
    valid_access_opt = {volume_kv.ACCESS: 'read-only'}
    name = ""
    vm_name = 'test-vm'

    def setUp(self):
        self.name = vmdk_utils.get_vmdk_path(path, self.volName)
        self.policy_names = ['good', 'impossible']
        self.orig_policy_content = ('(("proportionalCapacity" i0) '
                                    '("hostFailuresToTolerate" i0))')
        self.new_policy_content = '(("hostFailuresToTolerate" i0))'
        for n in self.policy_names:
            vsan_policy.create(n, self.orig_policy_content)

    def tearDown(self):
        vmdk_ops.removeVMDK(self.name)
        self.vmdk = None
        for n in self.policy_names:
            vsan_policy.delete(n)

    def testCreateDelete(self):
        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName)
        self.assertEqual(err, None, err)
        self.assertEqual(os.path.isfile(self.name), True,
                         "VMDK {0} is missing after create.".format(self.name))
        err = vmdk_ops.removeVMDK(self.name)
        self.assertEqual(err, None, err)
        self.assertEqual(
            os.path.isfile(self.name), False,
            "VMDK {0} is still present after delete.".format(self.name))

    def testBadOpts(self):
        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName,
                                  opts=self.badOpts)
        logging.info(err)
        self.assertNotEqual(err, None, err)

        err = vmdk_ops.removeVMDK(self.name)
        logging.info(err)
        self.assertNotEqual(err, None, err)

    def testAccessOpts(self):
        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName,
                                  opts=self.invalid_access_choice)
        logging.info(err)
        self.assertNotEqual(err, None, err)

        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName,
                                  opts=self.invalid_access_opt)
        logging.info(err)
        self.assertNotEqual(err, None, err)

        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName,
                                  opts=self.valid_access_opt)
        logging.info(err)
        self.assertEqual(err, None, err)

        err = vmdk_ops.removeVMDK(self.name)
        logging.info(err)
        self.assertEqual(err, None, err)

    @unittest.skipIf(not vsan_info.get_vsan_datastore(),
                     "VSAN is not found - skipping vsan_info tests")
    def testPolicyUpdate(self):
        path = vsan_info.get_vsan_dockvols_path()
        vmdk_path = vmdk_utils.get_vmdk_path(path, self.volName)
        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=vmdk_path,
                                  vol_name=self.volName,
                                  opts={'vsan-policy-name': 'good'})
        self.assertEqual(err, None, err)
        self.assertEqual(None,
                         vsan_policy.update('good', self.new_policy_content))
        # Setting an identical policy returns an error msg
        self.assertNotEqual(
            None, vsan_policy.update('good', self.new_policy_content))

        backup_policy_file = vsan_policy.backup_policy_filename(self.name)
        #Ensure there is no backup policy file
        self.assertFalse(os.path.isfile(backup_policy_file))

        # Fail to update because of a bad policy, and ensure there is no backup
        self.assertNotEqual(None, vsan_policy.update('good', 'blah'))
        self.assertFalse(os.path.isfile(backup_policy_file))

    @unittest.skipIf(not vsan_info.get_vsan_datastore(),
                     "VSAN is not found - skipping vsan_info tests")
    def testPolicy(self):
        # info for testPolicy
        testInfo = [
            #    size     policy   expected success?
            ["2000kb", "good", True, "zeroedthick"],
            ["14000pb", "good", False, "zeroedthick"],
            ["bad size", "good", False, "eagerzeroedthick"],
            ["100mb", "impossible", True, "eagerzeroedthick"],
            ["100mb", "good", True, "thin"],
        ]
        path = vsan_info.get_vsan_dockvols_path()
        i = 0
        for unit in testInfo:
            vol_name = '{0}{1}'.format(self.volName, i)
            vmdk_path = vmdk_utils.get_vmdk_path(path, vol_name)
            i = i + 1
            # create a volume with requests size/policy and check vs expected result
            err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                      vmdk_path=vmdk_path,
                                      vol_name=vol_name,
                                      opts={
                                          volume_kv.VSAN_POLICY_NAME: unit[1],
                                          volume_kv.SIZE: unit[0],
                                          volume_kv.DISK_ALLOCATION_FORMAT:
                                          unit[3]
                                      })
            self.assertEqual(err == None, unit[2], err)

            # clean up should fail if the created should have failed.
            err = vmdk_ops.removeVMDK(vmdk_path)
            self.assertEqual(err == None, unit[2], err)
class VmdkCreateRemoveTestCase(unittest.TestCase):
    """Unit test for VMDK Create and Remove ops"""

    volName = "vol_UnitTest_Create"
    badOpts = {u'policy': u'good', volume_kv.SIZE: u'12unknown'}
    name = ""
    vm_name = 'test-vm'

    def setUp(self):
        self.name = vmdk_ops.getVmdkName(path, self.volName)
        self.policy_names = ['good', 'impossible']
        policy_content = ('(("proportionalCapacity" i50) '
                          '("hostFailuresToTolerate" i0))')
        for n in self.policy_names:
            vsan_policy.create(n, policy_content)

    def tearDown(self):
        self.vmdk = None
        for n in self.policy_names:
            vsan_policy.delete(n)

    def testCreateDelete(self):
        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName)
        self.assertEqual(err, None, err)
        self.assertEqual(
            os.path.isfile(self.name), True,
            "VMDK {0} is missing after create.".format(self.name))
        err = vmdk_ops.removeVMDK(self.name)
        self.assertEqual(err, None, err)
        self.assertEqual(
            os.path.isfile(self.name), False,
            "VMDK {0} is still present after delete.".format(self.name))

    def testBadOpts(self):
        err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                  vmdk_path=self.name,
                                  vol_name=self.volName,
                                  opts=self.badOpts)
        logging.info(err)
        self.assertNotEqual(err, None, err)

        err = vmdk_ops.removeVMDK(self.name)
        logging.info(err)
        self.assertNotEqual(err, None, err)

    @unittest.skipIf(not vsan_info.get_vsan_datastore(),
                    "VSAN is not found - skipping vsan_info tests")
    def testPolicy(self):
        # info for testPolicy
        testInfo = [
            #    size     policy   expected success?
            ["2000kb", "good", True],
            ["14000pb", "good", False],
            ["bad size", "good", False],
            ["100mb", "impossible", True],
            ["100mb", "good", True],
        ]
        path = vmdk_utils.get_vsan_dockvols_path()
        i = 0
        for unit in testInfo:
            vol_name = '{0}{1}'.format(self.volName, i)
            vmdk_path = vmdk_ops.getVmdkName(path,vol_name)
            i = i+1
            # create a volume with requestes size/policy and check vs expected result
            err = vmdk_ops.createVMDK(vm_name=self.vm_name,
                                      vmdk_path=vmdk_path,
                                      vol_name=vol_name,
                                      opts={volume_kv.VSAN_POLICY_NAME: unit[1],
                                            volume_kv.SIZE: unit[0]})
            self.assertEqual(err == None, unit[2], err)

            # clean up should fail if the created should have failed.
            err = vmdk_ops.removeVMDK(vmdk_path)
            self.assertEqual(err == None, unit[2], err)
class TestVsanInfo(unittest.TestCase):
    """ Test VSAN Info API """

    VM_NAME = "test-vm"
    VSAN_DS = "/vmfs/volumes/" + vsan_info.get_vsan_datastore().info.name
    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"""
        si = vmdk_ops.get_si()

        # create VMDK
        err = vmdk_ops.createVMDK(vmdk_path=self.VMDK_PATH,
                                  vm_name=self.VM_NAME,
                                  vol_name="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))'
        err = vsan_info.set_policy(self.VMDK_PATH, policy_string)
        self.assertEqual(err, None, "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")