alpine-zdt-images/alpine-cloud-images/clouds/interfaces/adapter.py

83 lines
2.5 KiB
Python

# vim: ts=4 et:
import logging
from subprocess import Popen, PIPE
class CloudAdapterInterface:
CONVERT_CMD = {
'qcow2': ['ln', '-f'],
'vhd': ['qemu-img', 'convert', '-f', 'qcow2', '-O', 'vpc', '-o', 'force_size=on'],
}
def __init__(self, cloud, cred_provider=None):
self._sdk = None
self._sessions = {}
self._clients = {}
self.cloud = cloud
self.cred_provider = cred_provider
self._default_region = None
@property
def sdk(self):
raise NotImplementedError
@property
def regions(self):
raise NotImplementedError
@property
def default_region(self):
raise NotImplementedError
def credentials(self, region=None):
raise NotImplementedError
def session(self, region=None):
raise NotImplementedError
def client(self, client, region=None):
raise NotImplementedError
# get information about the latest released image
def latest_build_image(self, project, image_key):
raise NotImplementedError
# convert local QCOW2 to format appropriate for a cloud
def convert_image(self, ic):
log = logging.getLogger('import')
local_path = ic.local_path
image_path = ic.local_dir / ic.image_file
log.info('Converting %s to %s', image_path, image_path)
p = Popen(self.CONVERT_CMD[ic.image_format] + [ic.local_path, ic.image_path], stdout=PIPE, stdin=PIPE, encoding='utf8')
out, err = p.communicate()
if p.returncode:
log.error('Unable to convert %s to %s format (%s)', ic.local_path, ic.image_path, p.returncode)
log.error('EXIT: %d', p.returncode)
log.error('STDOUT:\n%s', out)
log.error('STDERR:\n%s', err)
raise RuntimeError
# import local image to cloud provider
def import_image(self, config):
raise NotImplementedError
# remove unpublished image from cloud provider
def remove_image(self, config, image_id):
raise NotImplementedError
# upload cloud image for testing, if upload_path
def upload_image(self, config):
raise NotImplementedError
# TODO: implement here
# publish image to cloud provider regions
def publish_image(self, config):
raise NotImplementedError
# generate image checksum, save metadata, sign image, make downloadable, if download_path
def release_image(self, config):
raise NotImplementedError
# TODO: implement here!