forked from softlayer/softlayer-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathduplicate.py
107 lines (96 loc) · 4.83 KB
/
duplicate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
"""Order a duplicate file storage volume."""
# :license: MIT, see LICENSE for more details.
import click
import SoftLayer
from SoftLayer.CLI import environment
from SoftLayer.CLI import exceptions
from SoftLayer.CLI import formatting
CONTEXT_SETTINGS = {'token_normalize_func': lambda x: x.upper()}
@click.command(cls=SoftLayer.CLI.command.SLCommand, context_settings=CONTEXT_SETTINGS)
@click.argument('origin-volume-id')
@click.option('--origin-snapshot-id', '-o',
type=int,
help="ID of an origin volume snapshot to use for duplcation.")
@click.option('--duplicate-size', '-c',
type=int,
help='Size of duplicate file volume in GB. '
'***If no size is specified, the size of '
'the origin volume will be used.***\n'
'Minimum: [the size of the origin volume]')
@click.option('--duplicate-iops', '-i',
type=int,
help='Performance Storage IOPS, between 100 and 6000 in '
'multiples of 100 [only used for performance volumes] '
'***If no IOPS value is specified, the IOPS value of the '
'origin volume will be used.***\n'
'Requirements: [If IOPS/GB for the origin volume is less '
'than 0.3, IOPS/GB for the duplicate must also be less '
'than 0.3. If IOPS/GB for the origin volume is greater '
'than or equal to 0.3, IOPS/GB for the duplicate must '
'also be greater than or equal to 0.3.]')
@click.option('--duplicate-tier', '-t',
help='Endurance Storage Tier (IOPS per GB) [only used for '
'endurance volumes] ***If no tier is specified, the tier '
'of the origin volume will be used.***\n'
'Requirements: [If IOPS/GB for the origin volume is 0.25, '
'IOPS/GB for the duplicate must also be 0.25. If IOPS/GB '
'for the origin volume is greater than 0.25, IOPS/GB '
'for the duplicate must also be greater than 0.25.]',
type=click.Choice(['0.25', '2', '4', '10']))
@click.option('--duplicate-snapshot-size', '-s',
type=int,
help='The size of snapshot space to order for the duplicate. '
'***If no snapshot space size is specified, the snapshot '
'space size of the origin file volume will be used.***\n'
'Input "0" for this parameter to order a duplicate volume '
'with no snapshot space.')
@click.option('--billing',
type=click.Choice(['hourly', 'monthly']),
default='monthly',
help="Optional parameter for Billing rate (default to monthly)")
@click.option('--dependent-duplicate',
type=click.BOOL,
default=False,
show_default=True,
help='Whether or not this duplicate will be a dependent duplicate'
'of the origin volume.')
@click.option('--force', default=False, is_flag=True, help="Force modify")
@environment.pass_env
def cli(env, origin_volume_id, origin_snapshot_id, duplicate_size,
duplicate_iops, duplicate_tier, duplicate_snapshot_size, billing,
dependent_duplicate, force):
"""Order a duplicate file storage volume.
EXAMPLE::
slcli file volume-duplicate 12345678
This command shows order a new volume by duplicating the volume with ID 12345678.
"""
file_manager = SoftLayer.FileStorageManager(env.client)
hourly_billing_flag = False
if billing.lower() == "hourly":
hourly_billing_flag = True
if duplicate_tier is not None:
duplicate_tier = float(duplicate_tier)
if not force:
if not (env.skip_confirmations or formatting.confirm("This action will incur charges on your account."
"Continue?")):
raise exceptions.CLIAbort('Aborted.')
try:
order = file_manager.order_duplicate_volume(
origin_volume_id,
origin_snapshot_id=origin_snapshot_id,
duplicate_size=duplicate_size,
duplicate_iops=duplicate_iops,
duplicate_tier_level=duplicate_tier,
duplicate_snapshot_size=duplicate_snapshot_size,
hourly_billing_flag=hourly_billing_flag,
dependent_duplicate=dependent_duplicate
)
except ValueError as ex:
raise exceptions.ArgumentError(str(ex))
if 'placedOrder' in order.keys():
click.echo(f"Order #{order['placedOrder']['id']} placed successfully!")
for item in order['placedOrder']['items']:
click.echo(" > %s" % item['description'])
else:
click.echo("Order could not be placed! Please verify your options " +
"and try again.")