docs: def upgrade(self, instance_id, cpus=None, memory=None, nic_speed=None, public=True, preset=None):
          """Upgrades a VS instance.
  
          Example::
  
             # Upgrade instance 12345 to 4 CPUs and 4 GB of memory
             import SoftLayer
             client = SoftLayer.create_client_from_env()
             mgr = SoftLayer.VSManager(client)
             mgr.upgrade(12345, cpus=4, memory=4)
  
          :param int instance_id: Instance id of the VS to be upgraded
          :param int cpus: The number of virtual CPUs to upgrade to
                              of a VS instance.
          :param string preset: preset assigned to the vsi
          :param int memory: RAM of the VS to be upgraded to.
          :param int nic_speed: The port speed to set
          :param bool public: CPU will be in Private/Public Node.
  
          :returns: bool
          """
          upgrade_prices = self._get_upgrade_prices(instance_id)
          prices = []
  
          data = {'nic_speed': nic_speed}
  
          if cpus is not None and preset is not None:
              raise ValueError("Do not use cpu, private and memory if you are using flavors")
          data['cpus'] = cpus
  
          if memory is not None and preset is not None:
              raise ValueError("Do not use memory, private or cpu if you are using flavors")
          data['memory'] = memory
  
          maintenance_window = datetime.datetime.now(utils.UTC())
          order = {
              'complexType': 'SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade',
              'properties': [{
                  'name': 'MAINTENANCE_WINDOW',
                  'value': maintenance_window.strftime("%Y-%m-%d %H:%M:%S%z")
              }],
              'virtualGuests': [{'id': int(instance_id)}],
          }
  
          for option, value in data.items():
              if not value:
                  continue
              price_id = self._get_price_id_for_upgrade_option(upgrade_prices,
                                                               option,
                                                               value,
                                                               public)
              if not price_id:
                  # Every option provided is expected to have a price
                  raise exceptions.SoftLayerError(
                      "Unable to find %s option with value %s" % (option, value))
  
              prices.append({'id': price_id})
          order['prices'] = prices
  
          if preset is not None:
              vs_object = self.get_instance(instance_id)['billingItem']['package']
              order['presetId'] = self.ordering_manager.get_preset_by_key(vs_object['keyName'], preset)['id']
  
          if prices or preset:
              self.client['Product_Order'].placeOrder(order)
              return True
          return False