code: func (c *ClientManager) WaitInstanceUntilReady(id int, until time.Time) error {
  	for {
  		virtualGuest, found, err := c.GetInstance(id, "id, lastOperatingSystemReload[id,modifyDate], activeTransaction[id,transactionStatus.name], provisionDate, powerState.keyName")
  		if err != nil {
  			return err
  		}
  		if !found {
  			return bosherr.WrapErrorf(err, "SoftLayer virtual guest '%d' does not exist", id)
  		}
  
  		lastReload := virtualGuest.LastOperatingSystemReload
  		activeTxn := virtualGuest.ActiveTransaction
  		provisionDate := virtualGuest.ProvisionDate
  
  		// if lastReload != nil && lastReload.ModifyDate != nil {
  		// 	fmt.Println("lastReload: ", (*lastReload.ModifyDate).Format(time.RFC3339))
  		// }
  		// if activeTxn != nil && activeTxn.TransactionStatus != nil && activeTxn.TransactionStatus.Name != nil {
  		// 	fmt.Println("activeTxn: ", *activeTxn.TransactionStatus.Name)
  		// }
  		// if provisionDate != nil {
  		// 	fmt.Println("provisionDate: ", (*provisionDate).Format(time.RFC3339))
  		// }
  
  		reloading := activeTxn != nil && lastReload != nil && *activeTxn.Id == *lastReload.Id
  		if provisionDate != nil && !reloading {
  			// fmt.Println("power state:", *virtualGuest.PowerState.KeyName)
  			if *virtualGuest.PowerState.KeyName == "RUNNING" {
  				return nil
  			}
  		}
  
  		now := time.Now()
  		if now.After(until) {
  			return bosherr.Errorf("Power on virtual guest with id %d Time Out!", *virtualGuest.Id)
  		}
  
  		min := math.Min(float64(10.0), float64(until.Sub(now)))
  		time.Sleep(time.Duration(min) * time.Second)
  	}
  }
docs: // Check the virtual server instance is ready for use