/
config.go
96 lines (86 loc) · 3.24 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package client
import (
"time"
"github.com/googleapis/gax-go/v2"
"google.golang.org/api/option"
"google.golang.org/grpc"
"google.golang.org/grpc/backoff"
)
// Config defines Provider Configuration
type Config struct {
ProjectFilter string `yaml:"project_filter,omitempty" hcl:"project_filter,optional"` // Deprecated
ProjectIDs []string `yaml:"project_ids,omitempty" hcl:"project_ids,optional"`
FolderIDs []string `yaml:"folder_ids,omitempty" hcl:"folder_ids,optional"`
FolderMaxDepth uint `yaml:"folders_max_depth,omitempty" hcl:"folders_max_depth,optional"`
ServiceAccountKeyJSON string `yaml:"service_account_key_json,omitempty" hcl:"service_account_key_json,optional"`
BaseDelay int `yaml:"backoff_base_delay,omitempty" hcl:"backoff_base_delay,optional" default:"-1"`
Multiplier float64 `yaml:"backoff_multiplier,omitempty" hcl:"backoff_multiplier,optional"`
MaxDelay int `yaml:"backoff_max_delay,omitempty" hcl:"backoff_max_delay,optional"`
Jitter float64 `yaml:"backoff_jitter,omitempty" hcl:"backoff_jitter,optional"`
MinConnectTimeout int `yaml:"backoff_min_connect_timeout,omitempty" hcl:"backoff_min_connect_timeout,optional"`
MaxRetries int `yaml:"max_retries,omitempty" hcl:"max_retries,optional" default:"3"`
}
type BackoffSettings struct {
Gax gax.Backoff
Backoff backoff.Config
MaxRetries int
}
func (Config) Example() string {
return `
Optional. List of folders to get projects from. Required permission: resourcemanager.projects.list
folder_ids:
- "organizations/<ORG_ID>"
- "folders/<FOLDER_ID>"
Optional. Maximum level of folders to recurse into
folders_max_depth: 5
Optional. If not specified either using all projects accessible.
project_ids:
- "<CHANGE_THIS_TO_YOUR_PROJECT_ID>"
Optional. ServiceAccountKeyJSON passed as value instead of a file path, can be passed also via env: CQ_SERVICE_ACCOUNT_KEY_JSON
service_account_key_json: <YOUR_JSON_SERVICE_ACCOUNT_KEY_DATA>
Optional. GRPC Retry/backoff configuration, time units in seconds. Documented in https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md
backoff_base_delay: 1
backoff_multiplier: 1.6
backoff_max_delay: 120
backoff_jitter: 0.2
backoff_min_connect_timeout = 0
Optional. Max amount of retries for retrier, defaults to max 3 retries.
max_retries: 3
`
}
func (c Config) ClientOptions() []option.ClientOption {
p := grpc.ConnectParams{
Backoff: c.Backoff().Backoff,
}
if c.MinConnectTimeout >= 0 {
p.MinConnectTimeout = time.Duration(c.MinConnectTimeout) * time.Second
}
return []option.ClientOption{
option.WithGRPCDialOption(grpc.WithConnectParams(p)),
}
}
func (c Config) Backoff() BackoffSettings {
b := BackoffSettings{
Backoff: backoff.DefaultConfig,
MaxRetries: 3,
}
if c.BaseDelay >= 0 {
b.Backoff.BaseDelay = time.Duration(c.BaseDelay) * time.Second
}
if c.Multiplier > 0 {
b.Backoff.Multiplier = c.Multiplier
}
if c.MaxDelay > 0 {
b.Backoff.MaxDelay = time.Duration(c.MaxDelay) * time.Second
}
if c.Jitter != 0 {
b.Backoff.Jitter = c.Jitter
}
if c.MaxRetries != 0 {
b.MaxRetries = c.MaxRetries
}
b.Gax.Initial = b.Backoff.BaseDelay
b.Gax.Max = b.Backoff.MaxDelay
b.Gax.Multiplier = b.Backoff.Multiplier
return b
}