Skip to content

Commit e7f4f57

Browse files
allmightyspiffacamacho82
authored andcommitted
Adding the base of 'slcli order quote' command, a new method was added on ordering manager.
1 parent 04f237d commit e7f4f57

File tree

3 files changed

+125
-1
lines changed

3 files changed

+125
-1
lines changed

SoftLayer/CLI/order/place.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def cli(env, package_keyname, location, preset, verify, billing, complex_type,
4343
can then be converted to be made programmatically by calling
4444
SoftLayer.OrderingManager.place_order() with the same keynames.
4545
46-
Packages for ordering can be retrived from `slcli order package-list`
46+
Packages for ordering can be retrieved from `slcli order package-list`
4747
Presets for ordering can be retrieved from `slcli order preset-list` (not all packages
4848
have presets)
4949

SoftLayer/CLI/order/quote.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
"""Save an order as quote"""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import json
5+
6+
import click
7+
8+
from SoftLayer.CLI import environment
9+
from SoftLayer.CLI import exceptions
10+
from SoftLayer.CLI import formatting
11+
from SoftLayer.managers import ordering
12+
13+
COLUMNS = ['keyName',
14+
'description',
15+
'cost', ]
16+
17+
@click.command()
18+
@click.argument('package_keyname')
19+
@click.argument('location')
20+
@click.option('--preset',
21+
help="The order preset (if required by the package)")
22+
@click.option('--name',
23+
help="Quote name (optional)")
24+
@click.option('--send-email',
25+
is_flag=True,
26+
help="Quote will be sent to the email address")
27+
@click.option('--complex-type', help=("The complex type of the order. This typically begins"
28+
" with 'SoftLayer_Container_Product_Order_'."))
29+
@click.option('--extras',
30+
help="JSON string denoting extra data that needs to be sent with the order")
31+
@click.argument('order_items', nargs=-1)
32+
@environment.pass_env
33+
def cli(env, package_keyname, location, preset, name, email, complex_type,
34+
extras, order_items):
35+
"""Save an order as quote.
36+
37+
This CLI command is used for saving an order in quote of the specified package in
38+
the given location (denoted by a datacenter's long name). Orders made via the CLI
39+
can then be converted to be made programmatically by calling
40+
SoftLayer.OrderingManager.place_order() with the same keynames.
41+
42+
Packages for ordering can be retrieved from `slcli order package-list`
43+
Presets for ordering can be retrieved from `slcli order preset-list` (not all packages
44+
have presets)
45+
46+
Items can be retrieved from `slcli order item-list`. In order to find required
47+
items for the order, use `slcli order category-list`, and then provide the
48+
--category option for each category code in `slcli order item-list`.
49+
50+
\b
51+
Example:
52+
# Order an hourly VSI with 4 CPU, 16 GB RAM, 100 GB SAN disk,
53+
# Ubuntu 16.04, and 1 Gbps public & private uplink in dal13
54+
slcli order quote --name " My quote name" --email CLOUD_SERVER DALLAS13 \\
55+
GUEST_CORES_4 \\
56+
RAM_16_GB \\
57+
REBOOT_REMOTE_CONSOLE \\
58+
1_GBPS_PUBLIC_PRIVATE_NETWORK_UPLINKS \\
59+
BANDWIDTH_0_GB_2 \\
60+
1_IP_ADDRESS \\
61+
GUEST_DISK_100_GB_SAN \\
62+
OS_UBUNTU_16_04_LTS_XENIAL_XERUS_MINIMAL_64_BIT_FOR_VSI \\
63+
MONITORING_HOST_PING \\
64+
NOTIFICATION_EMAIL_AND_TICKET \\
65+
AUTOMATED_NOTIFICATION \\
66+
UNLIMITED_SSL_VPN_USERS_1_PPTP_VPN_USER_PER_ACCOUNT \\
67+
NESSUS_VULNERABILITY_ASSESSMENT_REPORTING \\
68+
--extras '{"virtualGuests": [{"hostname": "test", "domain": "softlayer.com"}]}' \\
69+
--complex-type SoftLayer_Container_Product_Order_Virtual_Guest
70+
71+
"""
72+
manager = ordering.OrderingManager(env.client)
73+
74+
if extras:
75+
extras = json.loads(extras)
76+
77+
args = (package_keyname, location, order_items)
78+
kwargs = {'preset_keyname': preset,
79+
'extras': extras,
80+
'quantity': 1,
81+
'quoteName': name,
82+
'sendQuoteEmailFlag': email,
83+
'complex_type': complex_type}
84+
85+
order = manager.save_quote(*args, **kwargs)
86+
87+
table = formatting.KeyValueTable(['name', 'value'])
88+
table.align['name'] = 'r'
89+
table.align['value'] = 'l'
90+
table.add_row(['id', order['orderId']])
91+
table.add_row(['created', order['orderDate']])
92+
table.add_row(['status', order['placedOrder']['status']])
93+
env.fout(table)

SoftLayer/managers/ordering.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,37 @@ def place_order(self, package_keyname, location, item_keynames, complex_type=Non
430430
extras=extras, quantity=quantity)
431431
return self.order_svc.placeOrder(order)
432432

433+
def save_quote(self, package_keyname, location, item_keynames, complex_type=None,
434+
preset_keyname=None, extras=None, quantity=1):
435+
436+
"""Save an order as Quote with the given package and prices.
437+
438+
This function takes in parameters needed for an order and places the order.
439+
440+
:param str package_keyname: The keyname for the package being ordered
441+
:param str location: The datacenter location string for ordering (Ex: DALLAS13)
442+
:param list item_keynames: The list of item keyname strings to order. To see list of
443+
possible keynames for a package, use list_items()
444+
(or `slcli order item-list`)
445+
:param str complex_type: The complex type to send with the order. Typically begins
446+
with `SoftLayer_Container_Product_Order_`.
447+
:param string preset_keyname: If needed, specifies a preset to use for that package.
448+
To see a list of possible keynames for a package, use
449+
list_preset() (or `slcli order preset-list`)
450+
:param dict extras: The extra data for the order in dictionary format.
451+
Example: A VSI order requires hostname and domain to be set, so
452+
extras will look like the following:
453+
{'virtualGuests': [{'hostname': 'test', domain': 'softlayer.com'}]}
454+
:param int quantity: The number of resources to order
455+
456+
"""
457+
order = self.generate_order(package_keyname, location, item_keynames,
458+
complex_type=complex_type, hourly=False,
459+
preset_keyname=preset_keyname,
460+
extras=extras, quantity=quantity)
461+
return self.order_svc.placeOrder(order, True)
462+
463+
433464
def generate_order(self, package_keyname, location, item_keynames, complex_type=None,
434465
hourly=True, preset_keyname=None, extras=None, quantity=1):
435466
"""Generates an order with the given package and prices.

0 commit comments

Comments
 (0)