summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorRick Harris <rick.harris@rackspace.com>2011-02-15 18:50:40 +0000
committerRick Harris <rick.harris@rackspace.com>2011-02-15 18:50:40 +0000
commiteb603b5ec3d54b2b6c893f8d41e7d12bbaa49e57 (patch)
tree72a23ac02b60684391f3276f3077722658a94e66 /plugins
parentb4b1a7fbd55784157b3084016d4dfe2bd0120e51 (diff)
downloadnova-eb603b5ec3d54b2b6c893f8d41e7d12bbaa49e57.tar.gz
nova-eb603b5ec3d54b2b6c893f8d41e7d12bbaa49e57.tar.xz
nova-eb603b5ec3d54b2b6c893f8d41e7d12bbaa49e57.zip
Refactoring put_vdis
Diffstat (limited to 'plugins')
-rw-r--r--plugins/xenserver/xenapi/etc/xapi.d/plugins/glance136
1 files changed, 69 insertions, 67 deletions
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
index 0b270f5f9..3fe2d4059 100644
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
@@ -67,16 +67,6 @@ def _copy_kernel_vdi(dest,copy_args):
return filename
-def assert_process_success(proc, cmd):
- """Ensure that the process returned a zero exit code indicating success
- """
- out, err = proc.communicate()
- ret = proc.returncode
- if ret != 0:
- msg = "%(cmd)s returned non-zero exit code (%i): '%s'" % (ret, err)
- raise Exception(msg)
-
-
def get_vdi(session, args):
"""
"""
@@ -109,7 +99,7 @@ def get_vdi(session, args):
tar_proc.stdin.write(chunk)
chunk = resp.read(CHUNK_SIZE)
- assert_process_success(tar_proc, "tar")
+ _assert_process_success(tar_proc, "tar")
conn.close()
def fixup_vhds(sr_path, staging_path):
@@ -136,7 +126,7 @@ def get_vdi(session, args):
% locals())
modify_proc = subprocess.Popen(
modify_args, stderr=subprocess.PIPE)
- assert_process_success(modify_proc, "vhd-util")
+ _assert_process_success(modify_proc, "vhd-util")
image_path = os.path.join(staging_path, 'image')
@@ -161,13 +151,13 @@ def get_vdi(session, args):
move_into_sr(base_copy_path)
return vdi_uuid
- staging_path = make_staging_area(sr_path)
+ staging_path = _make_staging_area(sr_path)
try:
unbundle_xfer(sr_path, staging_path)
vdi_uuid = fixup_vhds(sr_path, staging_path)
return vdi_uuid
finally:
- cleanup_staging_area(staging_path)
+ _cleanup_staging_area(staging_path)
def put_vdis(session, args):
@@ -180,67 +170,69 @@ def put_vdis(session, args):
glance_port = params["glance_port"]
sr_path = params["sr_path"]
- def prepare_staging_area(sr_path, staging_path):
- """
- Explain preparing staging area here...
- """
- image_path = os.path.join(staging_path, 'image')
- os.mkdir(image_path)
- for name, uuid in vdi_uuids.items():
- source = os.path.join(sr_path, "%s.vhd" % uuid)
- link_name = os.path.join(image_path, "%s.vhd" % name)
- os.link(source, link_name)
-
- def bundle_xfer(staging_path):
- conn = httplib.HTTPConnection(glance_host, glance_port)
- #NOTE(sirp): httplib under python2.4 won't accept a file-like object
- # to request
- conn.putrequest('PUT', '/images/%s' % image_id)
-
- headers = {
- 'x-image-meta-store': 'file',
- 'x-image-meta-is_public': 'True',
- 'x-image-meta-type': 'raw',
- 'x-image-meta-property-disk-format': 'vhd',
- 'x-image-meta-property-container-format': 'tarball',
- 'transfer-encoding': "chunked",
- 'content-type': 'application/octet-stream',
- }
- for header, value in headers.iteritems():
- conn.putheader(header, value)
- conn.endheaders()
+ staging_path = _make_staging_area(sr_path)
+ try:
+ _prepare_staging_area_for_upload(sr_path, staging_path, vdi_uuids)
+ _bundle_xfer(staging_path, image_id, glance_host, glance_port)
+ finally:
+ _cleanup_staging_area(staging_path)
- tar_args = shlex.split(
- "tar -zc --directory=%(staging_path)s ." % locals())
- tar_proc = subprocess.Popen(
- tar_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ return ""
- chunk = tar_proc.stdout.read(CHUNK_SIZE)
- while chunk:
- conn.send("%x\r\n%s\r\n" % (len(chunk), chunk))
- chunk = tar_proc.stdout.read(CHUNK_SIZE)
- conn.send("0\r\n\r\n")
- assert_process_success(tar_proc, "tar")
+def _prepare_staging_area_for_upload(sr_path, staging_path, vdi_uuids):
+ """
+ Explain preparing staging area here...
+ """
+ image_path = os.path.join(staging_path, 'image')
+ os.mkdir(image_path)
+ for name, uuid in vdi_uuids.items():
+ source = os.path.join(sr_path, "%s.vhd" % uuid)
+ link_name = os.path.join(image_path, "%s.vhd" % name)
+ os.link(source, link_name)
- resp = conn.getresponse()
- #FIXME(sirp): should this be 201 Created?
- if resp.status != httplib.OK:
- raise Exception("Unexpected response from Glance %i" % res.status)
- conn.close()
+def _bundle_xfer(staging_path, image_id, glance_host, glance_port):
+ """
+ """
+ conn = httplib.HTTPConnection(glance_host, glance_port)
+ #NOTE(sirp): httplib under python2.4 won't accept a file-like object
+ # to request
+ conn.putrequest('PUT', '/images/%s' % image_id)
+
+ headers = {
+ 'x-image-meta-store': 'file',
+ 'x-image-meta-is_public': 'True',
+ 'x-image-meta-type': 'raw',
+ 'x-image-meta-property-disk-format': 'vhd',
+ 'x-image-meta-property-container-format': 'tarball',
+ 'transfer-encoding': "chunked",
+ 'content-type': 'application/octet-stream',
+ }
+ for header, value in headers.iteritems():
+ conn.putheader(header, value)
+ conn.endheaders()
+
+ tar_args = shlex.split(
+ "tar -zc --directory=%(staging_path)s ." % locals())
+ tar_proc = subprocess.Popen(
+ tar_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ chunk = tar_proc.stdout.read(CHUNK_SIZE)
+ while chunk:
+ conn.send("%x\r\n%s\r\n" % (len(chunk), chunk))
+ chunk = tar_proc.stdout.read(CHUNK_SIZE)
+ conn.send("0\r\n\r\n")
- staging_path = make_staging_area(sr_path)
- try:
- prepare_staging_area(sr_path, staging_path)
- bundle_xfer(staging_path)
- finally:
- cleanup_staging_area(staging_path)
+ _assert_process_success(tar_proc, "tar")
- return "" # FIXME(sirp): return anything useful here?
+ resp = conn.getresponse()
+ if resp.status != httplib.OK:
+ raise Exception("Unexpected response from Glance %i" % res.status)
+ conn.close()
-def make_staging_area(sr_path):
+def _make_staging_area(sr_path):
"""
Explain staging area here...
"""
@@ -249,10 +241,20 @@ def make_staging_area(sr_path):
return staging_path
-def cleanup_staging_area(staging_path):
+def _cleanup_staging_area(staging_path):
shutil.rmtree(staging_path)
+def _assert_process_success(proc, cmd):
+ """Ensure that the process returned a zero exit code indicating success
+ """
+ out, err = proc.communicate()
+ ret = proc.returncode
+ if ret != 0:
+ msg = "%(cmd)s returned non-zero exit code (%i): '%s'" % (ret, err)
+ raise Exception(msg)
+
+
if __name__ == '__main__':
XenAPIPlugin.dispatch({'put_vdis': put_vdis,
'get_vdi': get_vdi,