Skip to content

Commit ab5ba93

Browse files
author
Ryan Rossiter
committed
Add ordering APIs and commands
This change adds a new command, and 5 new subcommands: slcli order - command for interacting with the ordering API slcli order category-list -- subcommand for listing categories in a package slcli order item-list -- subcommand for listing items in a package slcli order package-list -- subcommand for listing available packages slcli order place -- subcommand for verifying/placing orders slcli order preset-list -- subcommand for listing presets of a package API functions in SoftLayer.managers.ordering.OrderingManager were also added to programmatically interact with all of these functions as well. The place_order() and verify_order() commands are built to pass a package keyname, a location, and a list of item keynames. It then transforms the keynames into IDs, which the place/verifyOrder APIs accept.
1 parent dc97e7e commit ab5ba93

File tree

8 files changed

+423
-6
lines changed

8 files changed

+423
-6
lines changed

SoftLayer/CLI/order/__init__.py

Whitespace-only changes.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""List package categories."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
from SoftLayer.CLI import environment
7+
from SoftLayer.CLI import formatting
8+
from SoftLayer.managers import ordering
9+
10+
COLUMNS = ['name', 'categoryCode', 'isRequired']
11+
12+
13+
@click.command()
14+
@click.argument('package_keyname')
15+
@click.option('--required',
16+
is_flag=True,
17+
help="List only the required categories for the package")
18+
@environment.pass_env
19+
def cli(env, package_keyname, required):
20+
"""List package categories."""
21+
client = env.client
22+
manager = ordering.OrderingManager(client)
23+
table = formatting.Table(COLUMNS)
24+
25+
categories = manager.list_categories(package_keyname)
26+
27+
if required:
28+
categories = [cat for cat in categories if cat['isRequired']]
29+
30+
for cat in categories:
31+
table.add_row([
32+
cat['itemCategory']['name'],
33+
cat['itemCategory']['categoryCode'],
34+
'Y' if cat['isRequired'] else 'N'
35+
])
36+
37+
env.fout(table)

SoftLayer/CLI/order/item_list.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""List package items."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
from SoftLayer.CLI import environment
7+
from SoftLayer.CLI import formatting
8+
from SoftLayer.managers import ordering
9+
10+
COLUMNS = ['keyName',
11+
'description', ]
12+
13+
14+
@click.command()
15+
@click.argument('package_keyname')
16+
@click.option('--keyword',
17+
help="A word (or string) used to filter item names.")
18+
@click.option('--category',
19+
help="Category code to filter items by")
20+
@environment.pass_env
21+
def cli(env, package_keyname, keyword, category):
22+
"""List package items."""
23+
table = formatting.Table(COLUMNS)
24+
manager = ordering.OrderingManager(env.client)
25+
26+
_filter = {'items': {}}
27+
if keyword:
28+
_filter['items']['description'] = {'operation': '*= %s' % keyword}
29+
if category:
30+
_filter['items']['categories'] = {'categoryCode': {'operation': '_= %s' % category}}
31+
32+
items = manager.list_items(package_keyname, filter=_filter)
33+
34+
for item in items:
35+
table.add_row([
36+
item['keyName'],
37+
item['description'],
38+
])
39+
env.fout(table)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"""List package presets."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
from SoftLayer.CLI import environment
7+
from SoftLayer.CLI import formatting
8+
from SoftLayer.managers import ordering
9+
10+
COLUMNS = ['name',
11+
'keyName', ]
12+
13+
14+
@click.command()
15+
@click.option('--keyword',
16+
help="A word (or string) used to filter package names.")
17+
@environment.pass_env
18+
def cli(env, keyword):
19+
"""List package presets."""
20+
manager = ordering.OrderingManager(env.client)
21+
table = formatting.Table(COLUMNS)
22+
23+
_filter = {}
24+
if keyword:
25+
_filter = {'name': {'operation': '*= %s' % keyword}}
26+
27+
packages = manager.list_packages(filter=_filter)
28+
29+
for package in packages:
30+
table.add_row([
31+
package['name'],
32+
package['keyName'],
33+
])
34+
env.fout(table)

SoftLayer/CLI/order/place.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
"""Verify or place an order."""
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+
18+
@click.command()
19+
@click.argument('package_keyname')
20+
@click.argument('location')
21+
@click.option('--preset',
22+
help="The order preset (if required by the package)")
23+
@click.option('--verify',
24+
is_flag=True,
25+
help="Flag denoting whether or not to only verify the order, not place it")
26+
@click.option('--billing',
27+
type=click.Choice(['hourly', 'monthly']),
28+
default='hourly',
29+
show_default=True,
30+
help="Billing rate")
31+
@click.option('--extras',
32+
help="JSON string denoting extra data that needs to be sent with the order")
33+
@click.argument('order_items', nargs=-1)
34+
@environment.pass_env
35+
def cli(env, package_keyname, location, preset, verify, billing, extras, order_items):
36+
"""Place or verify an order."""
37+
manager = ordering.OrderingManager(env.client)
38+
39+
if extras:
40+
extras = json.loads(extras)
41+
42+
args = (package_keyname, location, order_items)
43+
kwargs = {'preset_keyname': preset,
44+
'extras': extras,
45+
'quantity': 1,
46+
'hourly': True if billing == 'hourly' else False}
47+
48+
if verify:
49+
table = formatting.Table(COLUMNS)
50+
order_to_place = manager.verify_order(*args, **kwargs)
51+
for price in order_to_place['prices']:
52+
cost_key = 'hourlyRecurringFee' if billing == 'hourly' else 'recurringFee'
53+
table.add_row([
54+
price['item']['keyName'],
55+
price['item']['description'],
56+
price[cost_key] if cost_key in price else formatting.blank()
57+
])
58+
59+
else:
60+
if not (env.skip_confirmations or formatting.confirm(
61+
"This action will incur charges on your account. Continue?")):
62+
raise exceptions.CLIAbort("Aborting order.")
63+
64+
order = manager.place_order(*args, **kwargs)
65+
66+
table = formatting.KeyValueTable(['name', 'value'])
67+
table.align['name'] = 'r'
68+
table.align['value'] = 'l'
69+
table.add_row(['id', order['orderId']])
70+
table.add_row(['created', order['orderDate']])
71+
table.add_row(['status', order['placedOrder']['status']])
72+
env.fout(table)

SoftLayer/CLI/order/preset_list.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"""List package presets."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
from SoftLayer.CLI import environment
7+
from SoftLayer.CLI import formatting
8+
from SoftLayer.managers import ordering
9+
10+
COLUMNS = ['name',
11+
'keyName',
12+
'description', ]
13+
14+
15+
@click.command()
16+
@click.argument('package_keyname')
17+
@click.option('--keyword',
18+
help="A word (or string) used to filter preset names.")
19+
@environment.pass_env
20+
def cli(env, package_keyname, keyword):
21+
"""List package presets."""
22+
table = formatting.Table(COLUMNS)
23+
manager = ordering.OrderingManager(env.client)
24+
25+
_filter = {}
26+
if keyword:
27+
_filter = {'presets': {'name': {'operation': '*= %s' % keyword}}}
28+
presets = manager.list_presets(package_keyname, filter=_filter)
29+
30+
for preset in presets:
31+
table.add_row([
32+
preset['name'],
33+
preset['keyName'],
34+
preset['description']
35+
])
36+
env.fout(table)

SoftLayer/CLI/routes.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,13 @@
191191
('object-storage:endpoints',
192192
'SoftLayer.CLI.object_storage.list_endpoints:cli'),
193193

194+
('order', 'SoftLayer.CLI.order'),
195+
('order:category-list', 'SoftLayer.CLI.order.category_list:cli'),
196+
('order:item-list', 'SoftLayer.CLI.order.item_list:cli'),
197+
('order:package-list', 'SoftLayer.CLI.order.package_list:cli'),
198+
('order:place', 'SoftLayer.CLI.order.place:cli'),
199+
('order:preset-list', 'SoftLayer.CLI.order.preset_list:cli'),
200+
194201
('rwhois', 'SoftLayer.CLI.rwhois'),
195202
('rwhois:edit', 'SoftLayer.CLI.rwhois.edit:cli'),
196203
('rwhois:show', 'SoftLayer.CLI.rwhois.show:cli'),

0 commit comments

Comments
 (0)