24
from core_image_publisher.queue import enqueue_message
25
from core_image_publisher.queue import (
29
from core_image_publisher.cloud import get_glance_client
30
from core_image_publisher.utils import check_call
26
32
logger = logging.getLogger(__name__)
29
def logging_worker(message):
30
logger.info("Got %r", message.payload, extra=message.payload)
31
payload = message.payload
33
image_name = payload['image_name']
34
channel = payload['channel']
35
device = payload['device']
38
"Unable to deserialize message payload - rejecting message: %s",
45
with tempfile.TemporaryDirectory as tmpdir:
47
image_path = download_image(image_name, channel, device, tmpdir)
48
except subprocess.CalledProcessError as e:
49
logger.error("Unable to download core image: %s", e, extra=payload)
53
nova_image_path = convert_nova_image(image_path)
54
except subprocess.CalledProcessError as e:
55
logger.error("Unable to convert core image to qcow2 image: %s", e,
59
glance_image_name = upload_image_to_glance(nova_image_path)
61
payload['nova_image'] = glance_image_name
62
enqueue_message(payload)
35
class ImagePublisherWorker(object):
37
"""A worker callable that contains all our main logic."""
39
def __init__(self, config):
42
def __call__(self, payload):
43
logger.info("Got %r", payload, extra=payload)
45
image_name = payload['image_name']
46
channel = payload['channel']
47
device = payload['device']
50
"Unable to deserialize message payload - rejecting message: %s",
54
return MessageActions.Retry
56
with tempfile.TemporaryDirectory() as tmpdir:
57
logger.info("Beginning image download.", extra=payload)
59
image_path = download_image(image_name, channel, device, tmpdir)
60
except subprocess.CalledProcessError as e:
61
logger.error("Unable to download core image: %s", e, extra=payload)
62
return MessageActions.Retry
63
logger.info("Ubuntu Core image downloaded OK.", extra=payload)
66
nova_image_path = convert_nova_image(image_path)
67
except subprocess.CalledProcessError as e:
68
logger.error("Unable to convert core image to qcow2 image: %s", e,
70
return MessageActions.Retry
71
logger.info("Image converted to qcow2 OK.", extra=payload)
74
logger.info("Beginning image upload to glance...")
75
glance_image_name = upload_image_to_glance(
79
except Exception as e:
80
logger.error("Unable to upload image to glance: %s", e,
82
return MessageActions.Retry
83
logger.info("Image uploaded to glance OK.", extra=payload)
85
payload['nova_image'] = glance_image_name
86
enqueue_message(payload)
87
logger.info("Processing completed.", extra=payload)
88
return MessageActions.Acknowledge
66
91
def download_image(name, channel, device, tmpdir):
93
118
converted_image_path]
94
subprocess.check_call(cmd)
95
120
return converted_image_path
98
def upload_image_to_glance(nova_image_path):
123
def upload_image_to_glance(nova_image_path, config):
100
125
Upload the nova image to glance, returning the name of the image in glance.
127
glance = get_glance_client(config)
128
image_name = os.path.basename(nova_image_path)
129
image = glance.images.create(
131
data=open(nova_image_path, 'rb'),
133
container_format='bare',