Skip to content

Commit 8c0140c

Browse files
committed
moved all global variables into single
1 parent d40e330 commit 8c0140c

File tree

4 files changed

+89
-52
lines changed

4 files changed

+89
-52
lines changed

build/docker/Dockerfile

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
FROM golang:1.18 as build
1+
FROM golang:1.19-bullseye as build
22

33
WORKDIR /go/app
44
COPY go.mod go.sum ./
55
RUN go mod download
66
COPY . /go/app/
7-
RUN CGO_ENABLED=0 go build -o prom-dns-http-sd ./cmd/app/main.go
7+
RUN go build -o prom-dns-http-sd ./cmd/app/main.go
88

9-
FROM scratch
109

10+
FROM debian:bullseye
11+
12+
RUN apt update \
13+
&& apt install -y ca-certificates \
14+
&& rm -rf /var/lib/apt/lists/*
1115
COPY --from=build /go/app/prom-dns-http-sd /usr/local/bin/prom-dns-http-sd
1216

1317
USER 1000:1000

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/sputnik-systems/prom-dns-http-sd
22

3-
go 1.18
3+
go 1.19
44

55
require (
66
github.com/fsnotify/fsnotify v1.5.5-0.20220810173357-fb07f82ddf75

internal/app/main.go

+79-31
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"time"
1414

1515
"github.com/fsnotify/fsnotify"
16+
ycsdk "github.com/yandex-cloud/go-sdk"
17+
"github.com/yandex-cloud/go-sdk/iamkey"
1618

1719
"github.com/sputnik-systems/prom-dns-http-sd/pkg/storage"
1820
"github.com/sputnik-systems/prom-dns-http-sd/pkg/storage/yandexcloud"
@@ -25,21 +27,33 @@ type SDConfig struct {
2527

2628
type SDConfigs []SDConfig
2729

28-
var mu sync.Mutex
29-
var config *storage.Config
30-
var client storage.Client
31-
var responseData map[string]SDConfigs
30+
type params struct {
31+
mu sync.Mutex
32+
config *storage.Config
33+
client storage.Client
34+
responseData map[string]SDConfigs
3235

33-
var configFilePath = flag.String("config-path", "", "application config file path")
34-
var ycAuthJsonFilePath = flag.String("yc-auth-json-file-path", "", "Yandex.Cloud iam.json file path")
35-
var dataUpdateInterval = flag.String("data-update-interval", "5m", "Interval between targets data updating")
36+
flags flags
37+
}
38+
39+
type flags struct {
40+
configFilePath, ycAuthJsonFilePath, dataUpdateInterval *string
41+
}
42+
43+
var p = params{
44+
flags: flags{
45+
configFilePath: flag.String("config-path", "", "application config file path"),
46+
ycAuthJsonFilePath: flag.String("yc-auth-json-file-path", "", "Yandex.Cloud iam.json file path"),
47+
dataUpdateInterval: flag.String("data-update-interval", "1h", "Interval between targets data updating"),
48+
},
49+
}
3650

3751
func Run() error {
3852
flag.Parse()
3953

4054
ctx := context.Background()
4155

42-
interval, err := time.ParseDuration(*dataUpdateInterval)
56+
interval, err := time.ParseDuration(*p.flags.dataUpdateInterval)
4357
if err != nil {
4458
return errors.New("incorrect duration format")
4559
}
@@ -51,13 +65,17 @@ func Run() error {
5165
go configFileUpdater(ctx)
5266
}
5367

68+
http.HandleFunc("/healthz", healthCheck)
5469
http.HandleFunc("/", giveResponse)
5570

5671
return http.ListenAndServe(":8080", nil)
5772
}
5873

74+
func healthCheck(w http.ResponseWriter, r *http.Request) {
75+
}
76+
5977
func giveResponse(w http.ResponseWriter, r *http.Request) {
60-
if body, ok := responseData[r.URL.Path]; ok {
78+
if body, ok := p.responseData[r.URL.Path]; ok {
6179
resp, err := json.Marshal(body)
6280
if err != nil {
6381
w.WriteHeader(404)
@@ -80,7 +98,7 @@ func configFileUpdater(ctx context.Context) {
8098
}
8199
defer watcher.Close()
82100

83-
err = watcher.Add(*configFilePath)
101+
err = watcher.Add(*p.flags.configFilePath)
84102
if err != nil {
85103
log.Fatal(err)
86104
}
@@ -95,15 +113,10 @@ func configFileUpdater(ctx context.Context) {
95113
if event.Has(fsnotify.Write) {
96114
log.Println("modified file:", event.Name)
97115

98-
config, err = storage.GetConfig(*configFilePath)
99-
if err != nil {
100-
log.Printf("failed to get config: %s", err)
116+
if err := updateConfigAndClient(ctx); err != nil {
117+
log.Printf("failed to update config and client: %s", err)
101118
}
102119

103-
client, err = yandexcloud.NewClient(ctx, "./iam.json", config)
104-
if err != nil {
105-
log.Printf("failed to initialize client: %s", err)
106-
}
107120
}
108121
case err, ok := <-watcher.Errors:
109122
if !ok {
@@ -116,13 +129,13 @@ func configFileUpdater(ctx context.Context) {
116129
}
117130

118131
func responseDataUpdater(ctx context.Context) {
119-
zones, err := client.ListZones(ctx, config.Zones...)
132+
zones, err := p.client.ListZones(ctx, p.config.Zones...)
120133
if err != nil {
121134
log.Printf("failed to list zones: %s", err)
122135
}
123136

124137
sds := make(map[string]SDConfigs)
125-
for _, rule := range config.Rules {
138+
for _, rule := range p.config.Rules {
126139
if _, ok := sds[rule.Path]; !ok {
127140
sds[rule.Path] = make(SDConfigs, 0)
128141
}
@@ -145,24 +158,17 @@ func responseDataUpdater(ctx context.Context) {
145158
}
146159
}
147160

148-
mu.Lock()
149-
responseData = sds
150-
mu.Unlock()
161+
p.mu.Lock()
162+
p.responseData = sds
163+
p.mu.Unlock()
151164
}
152165

153166
func responseDataUpdateTicker(ctx context.Context, interval time.Duration) {
154167
ticker := time.NewTicker(interval)
155168
defer ticker.Stop()
156169

157-
var err error
158-
config, err = storage.GetConfig(*configFilePath)
159-
if err != nil {
160-
log.Printf("failed to get config: %s", err)
161-
}
162-
163-
client, err = yandexcloud.NewClient(ctx, *ycAuthJsonFilePath, config)
164-
if err != nil {
165-
log.Printf("failed to initialize client: %s", err)
170+
if err := updateConfigAndClient(ctx); err != nil {
171+
log.Printf("failed to update config and client: %s", err)
166172
}
167173

168174
responseDataUpdater(ctx)
@@ -174,3 +180,45 @@ func responseDataUpdateTicker(ctx context.Context, interval time.Duration) {
174180
}
175181
}
176182
}
183+
184+
func updateConfigAndClient(ctx context.Context) error {
185+
var err error
186+
187+
p.mu.Lock()
188+
189+
p.config, err = storage.GetConfig(*p.flags.configFilePath)
190+
if err != nil {
191+
return fmt.Errorf("failed to get config: %w", err)
192+
}
193+
194+
var creds ycsdk.Credentials
195+
switch {
196+
case *p.flags.ycAuthJsonFilePath != "":
197+
key, err := iamkey.ReadFromJSONFile(*p.flags.ycAuthJsonFilePath)
198+
if err != nil {
199+
return err
200+
}
201+
202+
if creds, err = ycsdk.ServiceAccountKey(key); err != nil {
203+
return err
204+
}
205+
default:
206+
creds = ycsdk.InstanceServiceAccount()
207+
}
208+
209+
sdk, err := ycsdk.Build(ctx, ycsdk.Config{
210+
Credentials: creds,
211+
})
212+
if err != nil {
213+
return fmt.Errorf("failed to build yc sdk: %w", err)
214+
}
215+
216+
p.client, err = yandexcloud.NewClient(ctx, sdk, p.config)
217+
if err != nil {
218+
return fmt.Errorf("failed to initialize client: %w", err)
219+
}
220+
221+
p.mu.Unlock()
222+
223+
return nil
224+
}

pkg/storage/yandexcloud/main.go

+2-17
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ import (
66
"regexp"
77

88
dnsv1 "github.com/yandex-cloud/go-genproto/yandex/cloud/dns/v1"
9-
"github.com/yandex-cloud/go-sdk"
9+
ycsdk "github.com/yandex-cloud/go-sdk"
1010
"github.com/yandex-cloud/go-sdk/gen/dns"
11-
"github.com/yandex-cloud/go-sdk/iamkey"
1211

1312
"github.com/sputnik-systems/prom-dns-http-sd/pkg/storage"
1413
)
@@ -29,26 +28,12 @@ type Record struct {
2928
record *dnsv1.RecordSet
3029
}
3130

32-
func NewClient(ctx context.Context, filepath string, config *storage.Config) (storage.Client, error) {
31+
func NewClient(ctx context.Context, sdk *ycsdk.SDK, config *storage.Config) (storage.Client, error) {
3332
folderIds, err := getConfigFolderIds(config)
3433
if err != nil {
3534
return nil, err
3635
}
3736

38-
key, err := iamkey.ReadFromJSONFile(filepath)
39-
if err != nil {
40-
return nil, err
41-
}
42-
43-
creds, err := ycsdk.ServiceAccountKey(key)
44-
if err != nil {
45-
return nil, err
46-
}
47-
48-
sdk, err := ycsdk.Build(ctx, ycsdk.Config{
49-
Credentials: creds,
50-
})
51-
5237
return &Client{
5338
folderIds: folderIds,
5439
dns: sdk.DNS(),

0 commit comments

Comments
 (0)