55
66 :license: MIT, see LICENSE for more details.
77"""
8+ # pylint: disable=no-self-use
89
910from SoftLayer import exceptions
1011
@@ -380,7 +381,7 @@ def get_price_id_list(self, package_keyname, item_keynames):
380381
381382 return prices
382383
383- def verify_order (self , package_keyname , location , item_keynames ,
384+ def verify_order (self , package_keyname , location , item_keynames , complex_type = None ,
384385 hourly = True , preset_keyname = None , extras = None , quantity = 1 ):
385386 """Verifies an order with the given package and prices.
386387
@@ -392,6 +393,8 @@ def verify_order(self, package_keyname, location, item_keynames,
392393 :param list item_keynames: The list of item keyname strings to order. To see list of
393394 possible keynames for a package, use list_items()
394395 (or `slcli order item-list`)
396+ :param str complex_type: The complex type to send with the order. Typically begins
397+ with 'SoftLayer_Container_Product_Order_'.
395398 :param bool hourly: If true, uses hourly billing, otherwise uses monthly billing
396399 :param string preset_keyname: If needed, specifies a preset to use for that package.
397400 To see a list of possible keynames for a package, use
@@ -404,33 +407,13 @@ def verify_order(self, package_keyname, location, item_keynames,
404407 :param int quantity: The number of resources to order
405408
406409 """
407- order = {}
408- extras = extras or {}
409-
410- package = self .get_package_by_key (package_keyname , mask = 'id' )
411- if not package :
412- raise exceptions .SoftLayerError ("Package {} does not exist" .format (package_keyname ))
413-
414- # if there was extra data given for the order, add it to the order
415- # example: VSIs require hostname and domain set on the order, so
416- # extras will be {'virtualGuests': [{'hostname': 'test',
417- # 'domain': 'softlayer.com'}]}
418- order .update (extras )
419- order ['packageId' ] = package ['id' ]
420- order ['location' ] = location
421- order ['quantity' ] = quantity
422- order ['useHourlyPricing' ] = hourly
423-
424- if preset_keyname :
425- preset_id = self .get_preset_by_key (package_keyname , preset_keyname )['id' ]
426- order ['presetId' ] = preset_id
427-
428- price_ids = self .get_price_id_list (package_keyname , item_keynames )
429- order ['prices' ] = [{'id' : price_id } for price_id in price_ids ]
430-
410+ order = self .generate_order (package_keyname , location , item_keynames ,
411+ complex_type = complex_type , hourly = hourly ,
412+ preset_keyname = preset_keyname ,
413+ extras = extras , quantity = quantity )
431414 return self .order_svc .verifyOrder (order )
432415
433- def place_order (self , package_keyname , location , item_keynames ,
416+ def place_order (self , package_keyname , location , item_keynames , complex_type = None ,
434417 hourly = True , preset_keyname = None , extras = None , quantity = 1 ):
435418 """Places an order with the given package and prices.
436419
@@ -441,6 +424,40 @@ def place_order(self, package_keyname, location, item_keynames,
441424 :param list item_keynames: The list of item keyname strings to order. To see list of
442425 possible keynames for a package, use list_items()
443426 (or `slcli order item-list`)
427+ :param str complex_type: The complex type to send with the order. Typically begins
428+ with 'SoftLayer_Container_Product_Order_'.
429+ :param bool hourly: If true, uses hourly billing, otherwise uses monthly billing
430+ :param string preset_keyname: If needed, specifies a preset to use for that package.
431+ To see a list of possible keynames for a package, use
432+ list_preset() (or `slcli order preset-list`)
433+ :param dict extras: The extra data for the order in dictionary format.
434+ Example: A VSI order requires hostname and domain to be set, so
435+ extras will look like the following:
436+ {'virtualGuests': [{'hostname': 'test',
437+ 'domain': 'softlayer.com'}]}
438+ :param int quantity: The number of resources to order
439+
440+ """
441+ order = self .generate_order (package_keyname , location , item_keynames ,
442+ complex_type = complex_type , hourly = hourly ,
443+ preset_keyname = preset_keyname ,
444+ extras = extras , quantity = quantity )
445+ return self .order_svc .placeOrder (order )
446+
447+ def generate_order (self , package_keyname , location , item_keynames , complex_type = None ,
448+ hourly = True , preset_keyname = None , extras = None , quantity = 1 ):
449+ """Generates an order with the given package and prices.
450+
451+ This function takes in parameters needed for an order and generates an order
452+ dictionary. This dictionary can then be used in either verify or placeOrder().
453+
454+ :param str package_keyname: The keyname for the package being ordered
455+ :param str location: The datacenter location string for ordering (Ex: DALLAS13)
456+ :param list item_keynames: The list of item keyname strings to order. To see list of
457+ possible keynames for a package, use list_items()
458+ (or `slcli order item-list`)
459+ :param str complex_type: The complex type to send with the order. Typically begins
460+ with 'SoftLayer_Container_Product_Order_'.
444461 :param bool hourly: If true, uses hourly billing, otherwise uses monthly billing
445462 :param string preset_keyname: If needed, specifies a preset to use for that package.
446463 To see a list of possible keynames for a package, use
@@ -453,10 +470,31 @@ def place_order(self, package_keyname, location, item_keynames,
453470 :param int quantity: The number of resources to order
454471
455472 """
456- # verify the order, and if the order is valid, the proper prices will be filled
457- # into the order template, so we can just send that to placeOrder to order it
458- verified_order = self .verify_order (package_keyname , location , item_keynames ,
459- hourly = hourly ,
460- preset_keyname = preset_keyname ,
461- extras = extras , quantity = quantity )
462- return self .order_svc .placeOrder (verified_order )
473+ order = {}
474+ extras = extras or {}
475+
476+ package = self .get_package_by_key (package_keyname , mask = 'id' )
477+ if not package :
478+ raise exceptions .SoftLayerError ("Package {} does not exist" .format (package_keyname ))
479+
480+ # if there was extra data given for the order, add it to the order
481+ # example: VSIs require hostname and domain set on the order, so
482+ # extras will be {'virtualGuests': [{'hostname': 'test',
483+ # 'domain': 'softlayer.com'}]}
484+ order .update (extras )
485+ order ['packageId' ] = package ['id' ]
486+ order ['location' ] = location
487+ order ['quantity' ] = quantity
488+ order ['useHourlyPricing' ] = hourly
489+
490+ if preset_keyname :
491+ preset_id = self .get_preset_by_key (package_keyname , preset_keyname )['id' ]
492+ order ['presetId' ] = preset_id
493+
494+ if not complex_type :
495+ raise exceptions .SoftLayerError ("A complex type must be specified with the order" )
496+ order ['complexType' ] = complex_type
497+
498+ price_ids = self .get_price_id_list (package_keyname , item_keynames )
499+ order ['prices' ] = [{'id' : price_id } for price_id in price_ids ]
500+ return order
0 commit comments