Blame tests/cloud_tests/platforms/azurecloud/image.py

Packit Service a04d08
# This file is part of cloud-init. See LICENSE file for license information.
Packit Service a04d08
Packit Service a04d08
"""Azure Cloud image Base class."""
Packit Service a04d08
Packit Service a04d08
from tests.cloud_tests import LOG
Packit Service a04d08
Packit Service a04d08
from ..images import Image
Packit Service a04d08
from .snapshot import AzureCloudSnapshot
Packit Service a04d08
Packit Service a04d08
Packit Service a04d08
class AzureCloudImage(Image):
Packit Service a04d08
    """Azure Cloud backed image."""
Packit Service a04d08
Packit Service a04d08
    platform_name = 'azurecloud'
Packit Service a04d08
Packit Service a04d08
    def __init__(self, platform, config, image_id):
Packit Service a04d08
        """Set up image.
Packit Service a04d08
Packit Service a04d08
        @param platform: platform object
Packit Service a04d08
        @param config: image configuration
Packit Service a04d08
        @param image_id: image id used to boot instance
Packit Service a04d08
        """
Packit Service a04d08
        super(AzureCloudImage, self).__init__(platform, config)
Packit Service a04d08
        self.image_id = image_id
Packit Service 11b429
        self._img_instance = None
Packit Service a04d08
Packit Service a04d08
    @property
Packit Service a04d08
    def _instance(self):
Packit Service a04d08
        """Internal use only, returns a running instance"""
Packit Service 11b429
        LOG.debug('creating instance')
Packit Service a04d08
        if not self._img_instance:
Packit Service a04d08
            self._img_instance = self.platform.create_instance(
Packit Service a04d08
                self.properties, self.config, self.features,
Packit Service a04d08
                self.image_id, user_data=None)
Packit Service a04d08
        return self._img_instance
Packit Service a04d08
Packit Service a04d08
    def destroy(self):
Packit Service a04d08
        """Delete the instance used to create a custom image."""
Packit Service 11b429
        LOG.debug('deleting VM that was used to create image')
Packit Service a04d08
        if self._img_instance:
Packit Service 11b429
            LOG.debug('Deleting instance %s', self._img_instance.name)
Packit Service a04d08
            delete_vm = self.platform.compute_client.virtual_machines.delete(
Packit Service 11b429
                self.platform.resource_group.name, self.image_id)
Packit Service a04d08
            delete_vm.wait()
Packit Service a04d08
Packit Service a04d08
        super(AzureCloudImage, self).destroy()
Packit Service a04d08
Packit Service a04d08
    def _execute(self, *args, **kwargs):
Packit Service a04d08
        """Execute command in image, modifying image."""
Packit Service a04d08
        LOG.debug('executing commands on image')
Packit Service 11b429
        self._instance.start()
Packit Service a04d08
        return self._instance._execute(*args, **kwargs)
Packit Service a04d08
Packit Service a04d08
    def push_file(self, local_path, remote_path):
Packit Service a04d08
        """Copy file at 'local_path' to instance at 'remote_path'."""
Packit Service a04d08
        LOG.debug('pushing file to image')
Packit Service a04d08
        return self._instance.push_file(local_path, remote_path)
Packit Service a04d08
Packit Service a04d08
    def run_script(self, *args, **kwargs):
Packit Service a04d08
        """Run script in image, modifying image.
Packit Service a04d08
Packit Service a04d08
        @return_value: script output
Packit Service a04d08
        """
Packit Service a04d08
        LOG.debug('running script on image')
Packit Service a04d08
        self._instance.start()
Packit Service a04d08
        return self._instance.run_script(*args, **kwargs)
Packit Service a04d08
Packit Service a04d08
    def snapshot(self):
Packit Service a04d08
        """ Create snapshot (image) of instance, wait until done.
Packit Service a04d08
Packit Service a04d08
        If no instance has been booted, base image is returned.
Packit Service a04d08
        Otherwise runs the clean script, deallocates, generalizes
Packit Service a04d08
        and creates custom image from instance.
Packit Service a04d08
        """
Packit Service 11b429
        LOG.debug('creating image from VM')
Packit Service a04d08
        if not self._img_instance:
Packit Service a04d08
            return AzureCloudSnapshot(self.platform, self.properties,
Packit Service a04d08
                                      self.config, self.features,
Packit Service 11b429
                                      self.image_id, delete_on_destroy=False)
Packit Service a04d08
Packit Service a04d08
        if self.config.get('boot_clean_script'):
Packit Service a04d08
            self._img_instance.run_script(self.config.get('boot_clean_script'))
Packit Service a04d08
Packit Service a04d08
        deallocate = self.platform.compute_client.virtual_machines.deallocate(
Packit Service 11b429
            self.platform.resource_group.name, self.image_id)
Packit Service a04d08
        deallocate.wait()
Packit Service a04d08
Packit Service a04d08
        self.platform.compute_client.virtual_machines.generalize(
Packit Service 11b429
            self.platform.resource_group.name, self.image_id)
Packit Service a04d08
Packit Service a04d08
        image_params = {
Packit Service a04d08
            "location": self.platform.location,
Packit Service a04d08
            "properties": {
Packit Service a04d08
                "sourceVirtualMachine": {
Packit Service a04d08
                    "id": self._img_instance.instance.id
Packit Service a04d08
                }
Packit Service a04d08
            }
Packit Service a04d08
        }
Packit Service a04d08
        self.platform.compute_client.images.create_or_update(
Packit Service 11b429
            self.platform.resource_group.name, self.image_id,
Packit Service a04d08
            image_params)
Packit Service a04d08
Packit Service a04d08
        self.destroy()
Packit Service a04d08
Packit Service a04d08
        return AzureCloudSnapshot(self.platform, self.properties, self.config,
Packit Service 11b429
                                  self.features, self.image_id)
Packit Service a04d08
Packit Service a04d08
# vi: ts=4 expandtab