@@ -819,8 +819,7 @@ def capture(self, instance_id, name, additional_disks=False, notes=None):
819819 return self .guest .createArchiveTransaction (
820820 name , disks_to_capture , notes , id = instance_id )
821821
822- def upgrade (self , instance_id , cpus = None , memory = None , nic_speed = None , public = True , preset = None ,
823- disk = None , add = None ):
822+ def upgrade (self , instance_id , cpus = None , memory = None , nic_speed = None , public = True , preset = None , disk = None ):
824823 """Upgrades a VS instance.
825824
826825 Example::
@@ -853,10 +852,7 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
853852 if memory is not None and preset is not None :
854853 raise ValueError ("Do not use memory, private or cpu if you are using flavors" )
855854 data ['memory' ] = memory
856- if disk is not None :
857- data ['disk' ] = disk .get ('capacity' )
858- elif add is not None :
859- data ['disk' ] = add
855+
860856 maintenance_window = datetime .datetime .now (utils .UTC ())
861857 order = {
862858 'complexType' : 'SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade' ,
@@ -867,6 +863,35 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
867863 'virtualGuests' : [{'id' : int (instance_id )}],
868864 }
869865
866+ if disk :
867+ disk_number = 0
868+ vsi_disk = self .get_instance (instance_id )
869+ for item in vsi_disk .get ('billingItem' ).get ('children' ):
870+ if item .get ('categoryCode' ).__contains__ ('guest_disk' ):
871+ if disk_number < int ("" .join (filter (str .isdigit , item .get ('categoryCode' )))):
872+ disk_number = int ("" .join (filter (str .isdigit , item .get ('categoryCode' ))))
873+ for disk_guest in disk :
874+ if disk_guest .get ('number' ) > 0 :
875+ price_id = self ._get_price_id_for_upgrade_option (upgrade_prices , 'disk' ,
876+ disk_guest .get ('capacity' ),
877+ public )
878+ disk_number = disk_guest .get ('number' )
879+
880+ else :
881+ price_id = self ._get_price_id_for_upgrade_option (upgrade_prices , 'disk' ,
882+ disk_guest .get ('capacity' ),
883+ public )
884+ disk_number = disk_number + 1
885+
886+ category = {'categories' : [{
887+ 'categoryCode' : 'guest_disk' + str (disk_number ),
888+ 'complexType' : "SoftLayer_Product_Item_Category" }],
889+ 'complexType' : 'SoftLayer_Product_Item_Price' ,
890+ 'id' : price_id }
891+
892+ prices .append (category )
893+ order ['prices' ] = prices
894+
870895 for option , value in data .items ():
871896 if not value :
872897 continue
@@ -879,28 +904,7 @@ def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=Tr
879904 raise exceptions .SoftLayerError (
880905 "Unable to find %s option with value %s" % (option , value ))
881906
882- if disk is not None :
883- category = {'categories' : [{
884- 'categoryCode' : 'guest_disk' + str (disk .get ('number' )),
885- 'complexType' : "SoftLayer_Product_Item_Category"
886- }], 'complexType' : 'SoftLayer_Product_Item_Price' }
887- prices .append (category )
888- prices [0 ]['id' ] = price_id
889- elif add :
890- vsi_disk = self .get_instance (instance_id )
891- disk_number = 0
892- for item in vsi_disk .get ('billingItem' ).get ('children' ):
893- if item .get ('categoryCode' ).__contains__ ('guest_disk' ):
894- if disk_number < int ("" .join (filter (str .isdigit , item .get ('categoryCode' )))):
895- disk_number = int ("" .join (filter (str .isdigit , item .get ('categoryCode' ))))
896- category = {'categories' : [{
897- 'categoryCode' : 'guest_disk' + str (disk_number + 1 ),
898- 'complexType' : "SoftLayer_Product_Item_Category"
899- }], 'complexType' : 'SoftLayer_Product_Item_Price' }
900- prices .append (category )
901- prices [0 ]['id' ] = price_id
902- else :
903- prices .append ({'id' : price_id })
907+ prices .append ({'id' : price_id })
904908
905909 order ['prices' ] = prices
906910 if preset is not None :
@@ -1024,6 +1028,7 @@ def _get_price_id_for_upgrade_option(self, upgrade_prices, option, value, public
10241028 'disk' : 'guest_disk'
10251029 }
10261030 category_code = option_category .get (option )
1031+
10271032 for price in upgrade_prices :
10281033 if price .get ('categories' ) is None or price .get ('item' ) is None :
10291034 continue
@@ -1034,7 +1039,7 @@ def _get_price_id_for_upgrade_option(self, upgrade_prices, option, value, public
10341039
10351040 for category in price .get ('categories' ):
10361041 if option == 'disk' :
1037- if not (category_code == ('' .join ([i for i in category .get ('categoryCode' ) if not i .isdigit ()]))
1042+ if (category_code == ('' .join ([i for i in category .get ('categoryCode' ) if not i .isdigit ()]))
10381043 and str (product .get ('capacity' )) == str (value )):
10391044 return price .get ('id' )
10401045
@@ -1052,8 +1057,6 @@ def _get_price_id_for_upgrade_option(self, upgrade_prices, option, value, public
10521057 elif option == 'nic_speed' :
10531058 if 'Public' in product .get ('description' ):
10541059 return price .get ('id' )
1055- elif option == 'disk' :
1056- return price .get ('id' )
10571060 else :
10581061 return price .get ('id' )
10591062
0 commit comments