1 package cushion
2
3 import (
4 "flag"
5 "fmt"
6 "os"
7 "time"
8
9 metaApi "edge-infra.dev/pkg/edge/apis/meta"
10 "edge-infra.dev/pkg/edge/datasync/couchdb"
11
12 "github.com/peterbourgon/ff/v3"
13 )
14
15 type Config struct {
16 Port int
17
18
19 BannerBSLID string
20 BannerEdgeID string
21 ProjectID string
22 Subscription string
23 Topic string
24 MaxMessages int
25
26
27 CouchURL string
28 CouchPort string
29 CouchUsername string
30 CouchPassword string
31
32 BulkSize int
33 MaxWaitInterval time.Duration
34
35 CouchNamespace string
36 }
37
38 func NewConfig() (*Config, error) {
39 cfg := &Config{}
40
41 fs := flag.NewFlagSet("couchctl", flag.ExitOnError)
42
43 cfg.BindFlags(fs)
44
45 if err := ff.Parse(fs, os.Args[1:], ff.WithEnvVarNoPrefix(), ff.WithIgnoreUndefined(true)); err != nil {
46 return cfg, err
47 }
48
49 if err := cfg.Validate(); err != nil {
50 return cfg, err
51 }
52
53 return cfg, nil
54 }
55
56 func (c *Config) BindFlags(fs *flag.FlagSet) {
57 fs.IntVar(
58 &c.Port,
59 "Port",
60 8082,
61 "Metrics port",
62 )
63
64 fs.StringVar(
65 &c.BannerBSLID,
66 "banner-id",
67 "",
68 "BSL Banner ID",
69 )
70
71 fs.StringVar(
72 &c.BannerEdgeID,
73 "banner-edge-id",
74 "",
75 "Banner Edge ID",
76 )
77
78 fs.StringVar(
79 &c.ProjectID,
80 "foreman-id",
81 "",
82 "the foreman gcp project id",
83 )
84
85 fs.StringVar(
86 &c.Subscription,
87 "subscription-id",
88 "",
89 "the pubsub subscription id",
90 )
91
92 fs.StringVar(
93 &c.Topic,
94 "topic-id",
95 "data-sync-c2e",
96 "the pubsub topic id",
97 )
98
99 fs.IntVar(
100 &c.MaxMessages,
101 "max-mess",
102 500,
103 "Maximum messages to pull at once",
104 )
105
106 fs.StringVar(
107 &c.CouchURL,
108 "couch-url",
109 couchdb.URI,
110 "Couch URL to ingest data into",
111 )
112
113 fs.StringVar(
114 &c.CouchPort,
115 "couch-port",
116 couchdb.Port,
117 "Couch DB port to ingest data into",
118 )
119
120 fs.StringVar(
121 &c.CouchUsername,
122 "couch-username",
123 "",
124 "Couch DB username to ingest data into",
125 )
126
127 fs.StringVar(
128 &c.CouchPassword,
129 "couch-password",
130 "",
131 "Couch DB password to ingest data into",
132 )
133
134 fs.IntVar(&c.BulkSize,
135 "bulk-size",
136 1000,
137 "couchdb bulk document size",
138 )
139
140 fs.DurationVar(&c.MaxWaitInterval,
141 "max-wait-interval",
142 5*time.Second,
143 "how long to wait for bulk insert",
144 )
145
146 fs.StringVar(
147 &c.CouchNamespace,
148 "couch-namespace",
149 "data-sync-couchdb",
150 "Couch DB namespace",
151 )
152 }
153
154 func (c *Config) Validate() error {
155 if c.Port == 0 {
156 return fmt.Errorf("missing PORT environment variable")
157 }
158
159 if c.BannerEdgeID == "" {
160 return fmt.Errorf("missing BANNER_EDGE_ID environment variable")
161 }
162
163 if c.ProjectID == "" {
164 return fmt.Errorf("missing FOREMAN_ID environment variable")
165 }
166
167 if c.Subscription == "" {
168 return fmt.Errorf("missing SUBSCRIPTION_ID environment variable")
169 }
170
171 if c.Topic == "" {
172 return fmt.Errorf("missing TOPIC_ID environment variable")
173 }
174
175 if c.MaxMessages == 0 {
176 return fmt.Errorf("missing MAX_MESS environment variable")
177 }
178
179 if c.CouchURL == "" {
180 return fmt.Errorf("missing COUCH_URL environment variable")
181 }
182
183 if c.CouchPort == "" {
184 return fmt.Errorf("missing COUCH_PORT environment variable")
185 }
186
187 if c.CouchUsername == "" {
188 return fmt.Errorf("missing COUCH_USERNAME environment variable")
189 }
190
191 if c.CouchPassword == "" {
192 return fmt.Errorf("missing COUCH_PASSWORD environment variable")
193 }
194
195 if c.BulkSize == 0 {
196 return fmt.Errorf("missing BULK_SIZE environment variable")
197 }
198
199 if c.MaxWaitInterval == 0 {
200 return fmt.Errorf("missing MAX_WAIT_INTERVAL environment variable")
201 }
202
203 if c.CouchNamespace == "" {
204 return fmt.Errorf("missing COUCH_NAMESPACE environment variable")
205 }
206 return nil
207 }
208
209 func (c *Config) ReplicationDB() string {
210 return couchdb.ReplicationDBPrefix + metaApi.Hash(c.BannerEdgeID)
211 }
212
View as plain text