|
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
|