Skip to content
This repository has been archived by the owner on Nov 9, 2020. It is now read-only.

Commit

Permalink
Fixes #427
Browse files Browse the repository at this point in the history
Added option for user to select disk allocation format. Example:

docker volume create --driver=vmdk --name=vol -o diskformat=eagerzeroedthick
format choices:
"zeroedthick", "thin" (default), "eagerzeroedthick"
  • Loading branch information
Abrar Shivani committed Jun 14, 2016
1 parent d2ebb47 commit d72b1dd
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 19 deletions.
30 changes: 23 additions & 7 deletions esx_service/vmdk_ops.py
Expand Up @@ -75,7 +75,7 @@
OBJ_TOOL_CMD = "/usr/lib/vmware/osfs/bin/objtool open -u "
OSFS_MKDIR_CMD = "/usr/lib/vmware/osfs/bin/osfs-mkdir -n "
MKFS_CMD = BIN_LOC + "/mkfs.ext4 -qF -L "
VMDK_CREATE_CMD = "/sbin/vmkfstools -d thin -c "
VMDK_CREATE_CMD = "/sbin/vmkfstools"
VMDK_DELETE_CMD = "/sbin/vmkfstools -U "

# Defaults
Expand Down Expand Up @@ -146,16 +146,22 @@ def make_create_cmd(opts, vmdk_path):
size = DEFAULT_DISK_SIZE
else:
size = str(opts["size"])
logging.debug("SETTING VMDK SIZE to %s for %s", size, vmdk_path)
logging.debug("Setting vmdk size to %s for %s", size, vmdk_path)

if not kv.DISK_ALLOCATION_FORMAT in opts:
format = kv.DEFAULT_ALLOCATION_FORMAT
else:
format = str(opts[kv.DISK_ALLOCATION_FORMAT])
logging.debug("Setting vmdk disk allocation format to %s for %s", format, vmdk_path)

if kv.VSAN_POLICY_NAME in opts:
# Note that the --policyFile option gets ignored if the
# datastore is not VSAN
policy_file = vsan_policy.policy_path(opts[kv.VSAN_POLICY_NAME])
return "{0} {1} --policyFile {2} {3}".format(VMDK_CREATE_CMD, size,
return "{0} -d {1} -c {2} --policyFile {3} {4}".format(VMDK_CREATE_CMD, format, size,
policy_file, vmdk_path)
else:
return "{0} {1} {2}".format(VMDK_CREATE_CMD, size, vmdk_path)
return "{0} -d {1} -c {2} {3}".format(VMDK_CREATE_CMD, format, size, vmdk_path)


def create_kv_store(vm_name, vmdk_path, opts):
Expand All @@ -172,20 +178,23 @@ def validate_opts(opts, vmdk_path):
Validate available options. Current options are:
* size - The size of the disk to create
* vsan-policy-name - The name of an existing policy to use
* diskformat - The allocation format of allocated disk
"""
valid_opts = [kv.SIZE, kv.VSAN_POLICY_NAME]
defaults = [DEFAULT_DISK_SIZE, kv.DEFAULT_VSAN_POLICY]
valid_opts = [kv.SIZE, kv.VSAN_POLICY_NAME, kv.DISK_ALLOCATION_FORMAT]
defaults = [DEFAULT_DISK_SIZE, kv.DEFAULT_VSAN_POLICY, kv.DEFAULT_ALLOCATION_FORMAT]
invalid = frozenset(opts.keys()).difference(valid_opts)
if len(invalid) != 0:
msg = 'Invalid options: {0} \n'.format(list(invalid)) \
+ 'Valid options and defaults: ' \
+ '{0}'.format(zip(list(valid_opts), defaults))
raise ValidationError(msg)

if kv.SIZE in opts:
validate_size(opts[kv.SIZE])
if kv.VSAN_POLICY_NAME in opts:
validate_vsan_policy_name(opts[kv.VSAN_POLICY_NAME], vmdk_path)
if kv.DISK_ALLOCATION_FORMAT in opts:
validate_disk_allocation_format(opts[kv.DISK_ALLOCATION_FORMAT])


def validate_size(size):
Expand All @@ -211,6 +220,13 @@ def validate_vsan_policy_name(policy_name, vmdk_path):
if not vsan_policy.policy_exists(policy_name):
raise ValidationError('Policy {0} does not exist'.format(policy_name))

def validate_disk_allocation_format(format):
"""
Ensure format is valid.
"""
if not format.lower() in kv.VALID_ALLOCATION_FORMATS :
raise ValidationError('Disk Allocation Format {0} does not exist. Valid options are: {1}'.format(format, kv.VALID_ALLOCATION_FORMATS))


def getVMDKUuid(vmdk_path):
f = open(vmdk_path)
Expand Down
31 changes: 19 additions & 12 deletions esx_service/vmdk_ops_test.py
Expand Up @@ -38,7 +38,7 @@ 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'}
badOpts = {u'policy': u'good', volume_kv.SIZE: u'12unknown', volume_kv.DISK_ALLOCATION_FORMAT: u'5disk'}
name = ""
vm_name = 'test-vm'

Expand Down Expand Up @@ -87,11 +87,11 @@ 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],
["2000kb", "good", True, "zeroedthick"],
["14000pb", "good", False, "zeroedthick"],
["bad size", "good", False, "eagerzeroedthick"],
["100mb", "impossible", True, "eagerzeroedthick"],
["100mb", "good", True, "thin"],
]
path = vmdk_utils.get_vsan_dockvols_path()
i = 0
Expand All @@ -104,7 +104,8 @@ def testPolicy(self):
vmdk_path=vmdk_path,
vol_name=vol_name,
opts={volume_kv.VSAN_POLICY_NAME: unit[1],
volume_kv.SIZE: unit[0]})
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.
Expand Down Expand Up @@ -139,17 +140,23 @@ def tearDown(self):
def test_success(self):
sizes = ['2gb', '200tb', '200mb', '5kb']
sizes.extend([s.upper() for s in sizes])

diskformats = ["zeroedthick", "thin", "eagerzeroedthick"]
diskformats.extend([diskformat.upper() for diskformat in diskformats])

for s in sizes:
for p in self.policy_names:
for d in diskformats:
# An exception should not be raised
vmdk_ops.validate_opts({volume_kv.SIZE: s, volume_kv.VSAN_POLICY_NAME: p},
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.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.SIZE: 'mb'}, {'bad-option': '4'}, {'bad-option': 'what',
bad = [{volume_kv.SIZE: '2'}, {volume_kv.VSAN_POLICY_NAME: 'bad-policy'},
{volume_kv.DISK_ALLOCATION_FORMAT: 'bad-format'}, {volume_kv.SIZE: 'mb'}, {'bad-option': '4'}, {'bad-option': 'what',
volume_kv.SIZE: '4mb'}]
for opts in bad:
with self.assertRaises(vmdk_ops.ValidationError):
Expand Down
9 changes: 9 additions & 0 deletions esx_service/volume_kv.py
Expand Up @@ -45,8 +45,17 @@
# The size of the volume
SIZE = 'size'

# The disk allocation format for vmdk
DISK_ALLOCATION_FORMAT = 'diskformat'

VALID_ALLOCATION_FORMATS = ["zeroedthick", "thin", "eagerzeroedthick"]

DEFAULT_ALLOCATION_FORMAT = 'thin'

## Values for given keys



## Value for VSAN_POLICY_NAME
DEFAULT_VSAN_POLICY = '[VSAN default]'

Expand Down

0 comments on commit d72b1dd

Please sign in to comment.