in footmark/ecs/connection.py [0:0]
def create_image(self, snapshot_id=None, image_name=None, image_version=None, description=None,
instance_id=None, disk_mapping=None, client_token=None, wait=None,
wait_timeout=None):
"""
Create a user-defined image with snapshots of system disks.
The created image can be used to create a new ECS instance.
:type snapshot_id: string
:param snapshot_id: A user-defined image is created from the specified snapshot.
:type image_name: string
:param image_name: image name which is to be created
:type image_version: string
:param image_version: version of image
:type description: string
:param description: description of the image
:type instance_id: string
:param instance_id: the specified instance_id
:type disk_mapping: list
:param disk_mapping: An optional list of device hashes/dictionaries with custom configurations
:type client_token: string
:param client_token: An optional list of device hashes/dictionaries with custom configurations
:type wait: string
:param wait: An optional bool value indicating wait for instance to be running before running
:type wait_timeout: int
:param wait_timeout: An optional int value indicating how long to wait, default 300
:return: Image id
"""
params = {}
results = []
changed = False
image_id = ''
request_id = ''
# the snapshot id for creating image
if snapshot_id:
# Verifying progress of snapshot_id, snapshot_id should be 100% completed
snapshot_results, snapshot_progress, snapshot_changed = self.get_snapshot_image(snapshot_id)
if snapshot_results:
if 'error code' in str(snapshot_results).lower():
results = snapshot_results
return changed, image_id, results, request_id
if not snapshot_changed:
results.append({"Error Code": "Snapshot.NotReady", "Error Message": "snapshot is not ready"})
return changed, image_id, results, request_id
if snapshot_id:
self.build_list_params(params, snapshot_id, 'SnapshotId')
# set the image name
if image_name:
self.build_list_params(params, image_name, 'ImageName')
# set the image version
if image_version:
self.build_list_params(params, image_version, 'ImageVersion')
# set the description
if description:
self.build_list_params(params, description, 'Description')
# set the client token
if client_token:
self.build_list_params(params, client_token, 'ClientToken')
# specify the instance id
if instance_id:
self.build_list_params(params, instance_id, 'InstanceId')
# specify the disk device mapping, An optional list of device hashes/dictionaries with custom configurations
if disk_mapping:
mapping_no = 1
for mapping in disk_mapping:
if mapping:
if 'disk_size' in mapping:
self.build_list_params(params, mapping[
'disk_size'], 'DiskDeviceMapping.' + str(mapping_no) + '.Size')
if 'snapshot_id' in mapping:
self.build_list_params(params, mapping[
'snapshot_id'], 'DiskDeviceMapping.' + str(mapping_no) + '.SnapshotId')
snapshot_map_results, snapshot_map_progress, snapshot_map_changed \
= self.get_snapshot_image(mapping['snapshot_id'])
if snapshot_map_results:
if 'error code' in str(snapshot_map_results).lower():
results = snapshot_map_results
return changed, image_id, results, request_id
if not snapshot_map_changed:
results.append(
{"Error Code": "Snapshot.NotReady", "Error Message": "snapshot is not ready"})
return changed, image_id, results, request_id
mapping_no += 1
try:
response = self.get_object('CreateImage', params, ResultSet)
if response:
image_id = response.image_id
request_id = response.request_id
if wait:
if not wait_timeout:
wait_timeout = 300
time.sleep(wait_timeout)
results.append("Image creation successful")
changed = True
except ServerException as e:
results.append({"Error Code": e.error_code, "Error Message": e.message,
"RequestId": e.request_id, "Http Status": e.http_status})
except Exception as e:
results.append({"Error:": e})
return changed, image_id, results, request_id