1"""Get details for an image.""" 2# :license: MIT, see LICENSE for more details. 3 4import click 5 6import SoftLayer 7from SoftLayer.CLI import environment 8from SoftLayer.CLI import formatting 9from SoftLayer.CLI import helpers 10from SoftLayer.CLI import image as image_mod 11from SoftLayer import utils 12 13 14@click.command() 15@click.argument('identifier') 16@environment.pass_env 17def cli(env, identifier): 18 """Get details for an image.""" 19 20 image_mgr = SoftLayer.ImageManager(env.client) 21 image_id = helpers.resolve_id(image_mgr.resolve_ids, identifier, 'image') 22 image = image_mgr.get_image(image_id, mask=image_mod.DETAIL_MASK) 23 24 children_images = image.get('children') 25 total_size = utils.lookup(image, 'firstChild', 'blockDevicesDiskSpaceTotal') or 0 26 27 table = formatting.KeyValueTable(['name', 'value']) 28 table.align['name'] = 'r' 29 table.align['value'] = 'l' 30 31 table.add_row(['id', image['id']]) 32 table.add_row(['global_identifier', 33 image.get('globalIdentifier', formatting.blank())]) 34 table.add_row(['name', image['name'].strip()]) 35 table.add_row(['status', formatting.FormattedItem( 36 utils.lookup(image, 'status', 'keyname'), 37 utils.lookup(image, 'status', 'name'), 38 )]) 39 40 table.add_row([ 41 'active_transaction', 42 formatting.listing(_get_transaction_groups(children_images), separator=','), 43 ]) 44 table.add_row(['account', image.get('accountId', formatting.blank())]) 45 table.add_row(['visibility', 46 image_mod.PUBLIC_TYPE if image['publicFlag'] 47 else image_mod.PRIVATE_TYPE]) 48 table.add_row(['type', 49 formatting.FormattedItem( 50 utils.lookup(image, 'imageType', 'keyName'), 51 utils.lookup(image, 'imageType', 'name'), 52 )]) 53 table.add_row(['flex', image.get('flexImageFlag')]) 54 table.add_row(['note', image.get('note')]) 55 table.add_row(['created', image.get('createDate')]) 56 table.add_row(['total_size', formatting.b_to_gb(total_size)]) 57 table.add_row(['datacenters', _get_datacenter_table(children_images)]) 58 59 env.fout(table) 60 61 62def _get_datacenter_table(children_images): 63 """Returns image details as datacenter, size, and transaction within a formatting table. 64 65 :param children_images: A list of images. 66 """ 67 table_datacenter = formatting.Table(['DC', 'size', 'transaction']) 68 for child in children_images: 69 table_datacenter.add_row([ 70 utils.lookup(child, 'datacenter', 'name'), 71 formatting.b_to_gb(child.get('blockDevicesDiskSpaceTotal', 0)), 72 formatting.transaction_status(child.get('transaction')) 73 ]) 74 75 return table_datacenter 76 77 78def _get_transaction_groups(children_images): 79 """Returns a Set of transaction groups. 80 81 :param children_images: A list of images. 82 """ 83 transactions = set() 84 for child in children_images: 85 transactions.add(utils.lookup(child, 'transaction', 'transactionGroup', 'name')) 86 87 return transactions 88