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