caller.go raw

   1  // Copyright 2022-2025 The sacloud/iaas-api-go Authors
   2  //
   3  // Licensed under the Apache License, Version 2.0 (the "License");
   4  // you may not use this file except in compliance with the License.
   5  // You may obtain a copy of the License at
   6  //
   7  //      http://www.apache.org/licenses/LICENSE-2.0
   8  //
   9  // Unless required by applicable law or agreed to in writing, software
  10  // distributed under the License is distributed on an "AS IS" BASIS,
  11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12  // See the License for the specific language governing permissions and
  13  // limitations under the License.
  14  
  15  package api
  16  
  17  import (
  18  	"strings"
  19  	"time"
  20  
  21  	client "github.com/sacloud/api-client-go"
  22  	"github.com/sacloud/iaas-api-go"
  23  	"github.com/sacloud/iaas-api-go/defaults"
  24  	"github.com/sacloud/iaas-api-go/fake"
  25  	"github.com/sacloud/iaas-api-go/trace"
  26  )
  27  
  28  func NewCaller() (iaas.APICaller, error) {
  29  	clientOpts, err := client.DefaultOption()
  30  	if err != nil {
  31  		return nil, err
  32  	}
  33  	return NewCallerWithOptions(&CallerOptions{Options: clientOpts}), nil
  34  }
  35  
  36  // NewCallerWithOptions 指定のオプションでiaas.APICallerを構築して返す
  37  func NewCallerWithOptions(opts *CallerOptions) iaas.APICaller {
  38  	return newCaller(opts)
  39  }
  40  
  41  func newCaller(opts *CallerOptions) iaas.APICaller {
  42  	if opts.UserAgent == "" {
  43  		opts.UserAgent = iaas.DefaultUserAgent
  44  	}
  45  
  46  	caller := iaas.NewClientWithOptions(opts.Options)
  47  
  48  	defaults.DefaultStatePollingTimeout = 72 * time.Hour
  49  
  50  	if opts.TraceAPI {
  51  		// note: exact once
  52  		trace.AddClientFactoryHooks()
  53  	}
  54  
  55  	if opts.FakeMode {
  56  		if opts.FakeStorePath != "" {
  57  			fake.DataStore = fake.NewJSONFileStore(opts.FakeStorePath)
  58  		}
  59  		// note: exact once
  60  		fake.SwitchFactoryFuncToFake()
  61  
  62  		SetupFakeDefaults()
  63  	}
  64  
  65  	if opts.DefaultZone != "" {
  66  		iaas.APIDefaultZone = opts.DefaultZone
  67  	}
  68  
  69  	if len(opts.Zones) > 0 {
  70  		iaas.SakuraCloudZones = opts.Zones
  71  	}
  72  
  73  	if opts.APIRootURL != "" {
  74  		if strings.HasSuffix(opts.APIRootURL, "/") {
  75  			opts.APIRootURL = strings.TrimRight(opts.APIRootURL, "/")
  76  		}
  77  		iaas.SakuraCloudAPIRoot = opts.APIRootURL
  78  	}
  79  
  80  	return caller
  81  }
  82  
  83  func SetupFakeDefaults() {
  84  	defaultInterval := 10 * time.Millisecond
  85  
  86  	// update default polling intervals: libsacloud/sacloud
  87  	defaults.DefaultStatePollingInterval = defaultInterval
  88  	defaults.DefaultDBStatusPollingInterval = defaultInterval
  89  
  90  	// update default polling intervals: libsacloud/helper/setup
  91  	// update default polling intervals: libsacloud/helper/builder
  92  	defaults.DefaultNICUpdateWaitDuration = defaultInterval
  93  	// update default timeouts and span: libsacloud/helper/power
  94  	defaults.DefaultPowerHelperBootRetrySpan = defaultInterval
  95  	defaults.DefaultPowerHelperShutdownRetrySpan = defaultInterval
  96  	defaults.DefaultPowerHelperInitialRequestRetrySpan = defaultInterval
  97  	defaults.DefaultPowerHelperInitialRequestTimeout = defaultInterval * 100
  98  
  99  	fake.PowerOnDuration = time.Millisecond
 100  	fake.PowerOffDuration = time.Millisecond
 101  	fake.DiskCopyDuration = time.Millisecond
 102  }
 103