~cprov/core-image-publisher/flake8

« back to all changes in this revision

Viewing changes to core_image_publisher/worker.py

  • Committer: Ubuntu CI Bot
  • Author(s): Thomi Richards
  • Date: 2015-03-30 20:28:34 UTC
  • mfrom: (12.1.10 trunk-upload-to-glance)
  • Revision ID: ubuntu_ci_bot-20150330202834-jwwf5jnulpd28kt6
Add code to push converted images into glance. [r=Celso Providelo]

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
import os
22
22
import subprocess
23
23
import tempfile
24
 
from core_image_publisher.queue import enqueue_message
 
24
 
 
25
from core_image_publisher.queue import (
 
26
    enqueue_message,
 
27
    MessageActions,
 
28
)
 
29
from core_image_publisher.cloud import get_glance_client
 
30
from core_image_publisher.utils import check_call
25
31
 
26
32
logger = logging.getLogger(__name__)
27
33
 
28
34
 
29
 
def logging_worker(message):
30
 
    logger.info("Got %r", message.payload, extra=message.payload)
31
 
    payload = message.payload
32
 
    try:
33
 
        image_name = payload['image_name']
34
 
        channel = payload['channel']
35
 
        device = payload['device']
36
 
    except KeyError as e:
37
 
        logger.error(
38
 
            "Unable to deserialize message payload - rejecting message: %s",
39
 
            e,
40
 
            extra=payload
41
 
        )
42
 
        message.requeue()
43
 
        return
44
 
 
45
 
    with tempfile.TemporaryDirectory as tmpdir:
46
 
        try:
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)
50
 
            message.requeue()
51
 
            return
52
 
        try:
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,
56
 
                extra=payload)
57
 
            message.requeue()
58
 
            return
59
 
        glance_image_name = upload_image_to_glance(nova_image_path)
60
 
 
61
 
    payload['nova_image'] = glance_image_name
62
 
    enqueue_message(payload)
63
 
    message.ack()
 
35
class ImagePublisherWorker(object):
 
36
 
 
37
    """A worker callable that contains all our main logic."""
 
38
 
 
39
    def __init__(self, config):
 
40
        self._config = config
 
41
 
 
42
    def __call__(self, payload):
 
43
        logger.info("Got %r", payload, extra=payload)
 
44
        try:
 
45
            image_name = payload['image_name']
 
46
            channel = payload['channel']
 
47
            device = payload['device']
 
48
        except KeyError as e:
 
49
            logger.error(
 
50
                "Unable to deserialize message payload - rejecting message: %s",
 
51
                e,
 
52
                extra=payload
 
53
            )
 
54
            return MessageActions.Retry
 
55
 
 
56
        with tempfile.TemporaryDirectory() as tmpdir:
 
57
            logger.info("Beginning image download.", extra=payload)
 
58
            try:
 
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)
 
64
 
 
65
            try:
 
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,
 
69
                    extra=payload)
 
70
                return MessageActions.Retry
 
71
            logger.info("Image converted to qcow2 OK.", extra=payload)
 
72
 
 
73
            try:
 
74
                logger.info("Beginning image upload to glance...")
 
75
                glance_image_name = upload_image_to_glance(
 
76
                    nova_image_path,
 
77
                    self._config
 
78
                )
 
79
            except Exception as e:
 
80
                logger.error("Unable to upload image to glance: %s", e,
 
81
                    extra=payload)
 
82
                return MessageActions.Retry
 
83
            logger.info("Image uploaded to glance OK.", extra=payload)
 
84
 
 
85
        payload['nova_image'] = glance_image_name
 
86
        enqueue_message(payload)
 
87
        logger.info("Processing completed.", extra=payload)
 
88
        return MessageActions.Acknowledge
64
89
 
65
90
 
66
91
def download_image(name, channel, device, tmpdir):
70
95
           'ubuntu-device-flash',
71
96
           '--revision', name,
72
97
           'core',
73
 
           '--device', generic_amd64,
 
98
           '--device', device,
74
99
           '--channel', channel,
75
100
           '--size', '3',
76
101
           '-o', image_path,
77
102
           '--developer-mode',
78
103
           '--cloud']
79
 
    subprocess.check_call(cmd)
 
104
    check_call(cmd)
80
105
    return image_path
81
106
 
82
107
 
91
116
           '-O', 'qcow2',
92
117
           image_path,
93
118
           converted_image_path]
94
 
    subprocess.check_call(cmd)
 
119
    check_call(cmd)
95
120
    return converted_image_path
96
121
 
97
122
 
98
 
def upload_image_to_glance(nova_image_path):
 
123
def upload_image_to_glance(nova_image_path, config):
99
124
    """
100
125
    Upload the nova image to glance, returning the name of the image in glance.
101
126
    """
 
127
    glance = get_glance_client(config)
 
128
    image_name = os.path.basename(nova_image_path)
 
129
    image = glance.images.create(
 
130
        name=image_name,
 
131
        data=open(nova_image_path, 'rb'),
 
132
        disk_format='qcow2',
 
133
        container_format='bare',
 
134
    )
 
135
    return image_name
 
136