Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added SoftLayer/CLI/order/__init__.py
Empty file.
54 changes: 54 additions & 0 deletions SoftLayer/CLI/order/category_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"""List package categories."""
# :license: MIT, see LICENSE for more details.

import click

from SoftLayer.CLI import environment
from SoftLayer.CLI import formatting
from SoftLayer.managers import ordering

COLUMNS = ['name', 'categoryCode', 'isRequired']


@click.command()
@click.argument('package_keyname')
@click.option('--required',
is_flag=True,
help="List only the required categories for the package")
@environment.pass_env
def cli(env, package_keyname, required):
"""List the categories of a package.

Package keynames can be retrieved from `slcli order package-list`

\b
Example:
# List the categories of Bare Metal servers
slcli order category-list BARE_METAL_SERVER

When using the --required flag, it will list out only the categories
that are required for ordering that package (see `slcli order item-list`)

\b
Example:
# List the required categories for Bare Metal servers
slcli order category-list BARE_METAL_SERVER --required

"""
client = env.client
manager = ordering.OrderingManager(client)
table = formatting.Table(COLUMNS)

categories = manager.list_categories(package_keyname)

if required:
categories = [cat for cat in categories if cat['isRequired']]

for cat in categories:
table.add_row([
cat['itemCategory']['name'],
cat['itemCategory']['categoryCode'],
'Y' if cat['isRequired'] else 'N'
])

env.fout(table)
60 changes: 60 additions & 0 deletions SoftLayer/CLI/order/item_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"""List package items."""
# :license: MIT, see LICENSE for more details.

import click

from SoftLayer.CLI import environment
from SoftLayer.CLI import formatting
from SoftLayer.managers import ordering

COLUMNS = ['keyName',
'description', ]


@click.command()
@click.argument('package_keyname')
@click.option('--keyword',
help="A word (or string) used to filter item names.")
@click.option('--category',
help="Category code to filter items by")
@environment.pass_env
def cli(env, package_keyname, keyword, category):
"""List package items used for ordering.

The items listed can be used with `slcli order place` to specify
the items that are being ordered in the package.

Package keynames can be retrieved using `slcli order package-list`

\b
Example:
# List all items in the VSI package
slcli order item-list CLOUD_SERVER

The --keyword option is used to filter items by name.
The --category option is used to filter items by category.
Both --keyword and --category can be used together.

\b
Example:
# List Ubuntu OSes from the os category of the Bare Metal package
slcli order item-list BARE_METAL_SERVER --category os --keyword ubuntu

"""
table = formatting.Table(COLUMNS)
manager = ordering.OrderingManager(env.client)

_filter = {'items': {}}
if keyword:
_filter['items']['description'] = {'operation': '*= %s' % keyword}
if category:
_filter['items']['categories'] = {'categoryCode': {'operation': '_= %s' % category}}

items = manager.list_items(package_keyname, filter=_filter)

for item in items:
table.add_row([
item['keyName'],
item['description'],
])
env.fout(table)
50 changes: 50 additions & 0 deletions SoftLayer/CLI/order/package_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""List packages."""
# :license: MIT, see LICENSE for more details.

import click

from SoftLayer.CLI import environment
from SoftLayer.CLI import formatting
from SoftLayer.managers import ordering

COLUMNS = ['name',
'keyName', ]


@click.command()
@click.option('--keyword',
help="A word (or string) used to filter package names.")
@environment.pass_env
def cli(env, keyword):
"""List packages that can be ordered via the placeOrder API.

\b
Example:
# List out all packages for ordering
slcli order package-list


Keywords can also be used for some simple filtering functionality
to help find a package easier.

\b
Example:
# List out all packages with "server" in the name
slcli order package-list --keyword server

"""
manager = ordering.OrderingManager(env.client)
table = formatting.Table(COLUMNS)

_filter = {}
if keyword:
_filter = {'name': {'operation': '*= %s' % keyword}}

packages = manager.list_packages(filter=_filter)

for package in packages:
table.add_row([
package['name'],
package['keyName'],
])
env.fout(table)
112 changes: 112 additions & 0 deletions SoftLayer/CLI/order/place.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
"""Verify or place an order."""
# :license: MIT, see LICENSE for more details.

import json

import click

from SoftLayer.CLI import environment
from SoftLayer.CLI import exceptions
from SoftLayer.CLI import formatting
from SoftLayer.managers import ordering

COLUMNS = ['keyName',
'description',
'cost', ]


@click.command()
@click.argument('package_keyname')
@click.argument('location')
@click.option('--preset',
help="The order preset (if required by the package)")
@click.option('--verify',
is_flag=True,
help="Flag denoting whether or not to only verify the order, not place it")
@click.option('--billing',
type=click.Choice(['hourly', 'monthly']),
default='hourly',
show_default=True,
help="Billing rate")
@click.option('--complex-type', help=("The complex type of the order. This typically begins"
" with 'SoftLayer_Container_Product_Order_'."))
@click.option('--extras',
help="JSON string denoting extra data that needs to be sent with the order")
@click.argument('order_items', nargs=-1)
@environment.pass_env
def cli(env, package_keyname, location, preset, verify, billing, complex_type,
extras, order_items):
"""Place or verify an order.

This CLI command is used for placing/verifying an order of the specified package in
the given location (denoted by a datacenter's long name). Orders made via the CLI
can then be converted to be made programmatically by calling
SoftLayer.OrderingManager.place_order() with the same keynames.

Packages for ordering can be retrived from `slcli order package-list`
Presets for ordering can be retrieved from `slcli order preset-list` (not all packages
have presets)

Items can be retrieved from `slcli order item-list`. In order to find required
items for the order, use `slcli order category-list`, and then provide the
--category option for each category code in `slcli order item-list`.

\b
Example:
# Order an hourly VSI with 4 CPU, 16 GB RAM, 100 GB SAN disk,
# Ubuntu 16.04, and 1 Gbps public & private uplink in dal13
slcli order place --billing hourly CLOUD_SERVER DALLAS13 \\
GUEST_CORES_4 \\
RAM_16_GB \\
REBOOT_REMOTE_CONSOLE \\
1_GBPS_PUBLIC_PRIVATE_NETWORK_UPLINKS \\
BANDWIDTH_0_GB_2 \\
1_IP_ADDRESS \\
GUEST_DISK_100_GB_SAN \\
OS_UBUNTU_16_04_LTS_XENIAL_XERUS_MINIMAL_64_BIT_FOR_VSI \\
MONITORING_HOST_PING \\
NOTIFICATION_EMAIL_AND_TICKET \\
AUTOMATED_NOTIFICATION \\
UNLIMITED_SSL_VPN_USERS_1_PPTP_VPN_USER_PER_ACCOUNT \\
NESSUS_VULNERABILITY_ASSESSMENT_REPORTING \\
--extras '{"virtualGuests": [{"hostname": "test", "domain": "softlayer.com"}]}' \\
--complex-type SoftLayer_Container_Product_Order_Virtual_Guest

"""
manager = ordering.OrderingManager(env.client)

if extras:
extras = json.loads(extras)

args = (package_keyname, location, order_items)
kwargs = {'preset_keyname': preset,
'extras': extras,
'quantity': 1,
'complex_type': complex_type,
'hourly': True if billing == 'hourly' else False}

if verify:
table = formatting.Table(COLUMNS)
order_to_place = manager.verify_order(*args, **kwargs)
for price in order_to_place['prices']:
cost_key = 'hourlyRecurringFee' if billing == 'hourly' else 'recurringFee'
table.add_row([
price['item']['keyName'],
price['item']['description'],
price[cost_key] if cost_key in price else formatting.blank()
])

else:
if not (env.skip_confirmations or formatting.confirm(
"This action will incur charges on your account. Continue?")):
raise exceptions.CLIAbort("Aborting order.")

order = manager.place_order(*args, **kwargs)

table = formatting.KeyValueTable(['name', 'value'])
table.align['name'] = 'r'
table.align['value'] = 'l'
table.add_row(['id', order['orderId']])
table.add_row(['created', order['orderDate']])
table.add_row(['status', order['placedOrder']['status']])
env.fout(table)
54 changes: 54 additions & 0 deletions SoftLayer/CLI/order/preset_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"""List package presets."""
# :license: MIT, see LICENSE for more details.

import click

from SoftLayer.CLI import environment
from SoftLayer.CLI import formatting
from SoftLayer.managers import ordering

COLUMNS = ['name',
'keyName',
'description', ]


@click.command()
@click.argument('package_keyname')
@click.option('--keyword',
help="A word (or string) used to filter preset names.")
@environment.pass_env
def cli(env, package_keyname, keyword):
"""List package presets.

Package keynames can be retrieved from `slcli order package-list`.
Some packages do not have presets.

\b
Example:
# List the presets for Bare Metal servers
slcli order preset-list BARE_METAL_SERVER

The --keyword option can also be used for additional filtering on
the returned presets.

\b
Example:
# List the Bare Metal server presets that include a GPU
slcli order preset-list BARE_METAL_SERVER --keyword gpu

"""
table = formatting.Table(COLUMNS)
manager = ordering.OrderingManager(env.client)

_filter = {}
if keyword:
_filter = {'activePresets': {'name': {'operation': '*= %s' % keyword}}}
presets = manager.list_presets(package_keyname, filter=_filter)

for preset in presets:
table.add_row([
preset['name'],
preset['keyName'],
preset['description']
])
env.fout(table)
7 changes: 7 additions & 0 deletions SoftLayer/CLI/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,13 @@
('object-storage:endpoints',
'SoftLayer.CLI.object_storage.list_endpoints:cli'),

('order', 'SoftLayer.CLI.order'),
('order:category-list', 'SoftLayer.CLI.order.category_list:cli'),
('order:item-list', 'SoftLayer.CLI.order.item_list:cli'),
('order:package-list', 'SoftLayer.CLI.order.package_list:cli'),
('order:place', 'SoftLayer.CLI.order.place:cli'),
('order:preset-list', 'SoftLayer.CLI.order.preset_list:cli'),

('rwhois', 'SoftLayer.CLI.rwhois'),
('rwhois:edit', 'SoftLayer.CLI.rwhois.edit:cli'),
('rwhois:show', 'SoftLayer.CLI.rwhois.show:cli'),
Expand Down
Loading