-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
140 lines (114 loc) · 3.34 KB
/
main.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package main
import (
"context"
"errors"
"flag"
"fmt"
stdlog "log"
"net/http"
"os"
"os/signal"
"syscall"
"github.com/doomshrine/gocosi"
"github.com/go-logr/logr"
"github.com/go-logr/stdr"
"github.com/hellofresh/health-go/v5"
"github.com/johannesboyne/gofakes3/backend/s3mem"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0" // FIXME: this might need manual update
"golang.org/x/sync/errgroup"
"github.com/shanduur/cosi-driver-sample-s3-inmemory/internal/s3fake"
"github.com/shanduur/cosi-driver-sample-s3-inmemory/servers/identity"
"github.com/shanduur/cosi-driver-sample-s3-inmemory/servers/provisioner"
)
var (
ospName = "cosi.example.com" // FIXME: replace with your own OSP name
ospVersion = "v0.1.0" // FIXME: replace with your own OSP version
exporterKind = gocosi.HTTPExporter
log logr.Logger
healthcheck bool
s3URL string
)
func main() {
flag.BoolVar(&healthcheck, "healthcheck", false, "")
flag.StringVar(&s3URL, "healthcheck", "0.0.0.0:80", "")
flag.Parse()
// Setup your logger here.
// You can use one of multiple available implementation, like:
// - https://github.com/kubernetes/klog/tree/main/klogr
// - https://github.com/go-logr/logr/tree/master/slogr
// - https://github.com/go-logr/stdr
// - https://github.com/bombsimon/logrusr
stdr.SetVerbosity(10)
log = stdr.New(stdlog.New(os.Stdout, "", stdlog.LstdFlags))
gocosi.SetLogger(log)
if err := realMain(context.Background()); err != nil {
log.Error(err, "critical failure")
os.Exit(1)
}
}
func realMain(ctx context.Context) error {
ctx, cancel := signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM)
defer cancel()
if healthcheck {
return runHealthcheck(ctx)
}
return runOSP(ctx)
}
func runHealthcheck(ctx context.Context) error {
err := gocosi.HealthcheckFunc(ctx, gocosi.HealthcheckAddr)
if err != nil {
return fmt.Errorf("healthcheck call failed: %w", err)
}
return nil
}
func runOSP(ctx context.Context) error {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
res := resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName(ospName),
semconv.ServiceVersion(ospVersion),
)
// If there is any additional confifuration needed for your COSI Driver,
// put it below this line.
s3 := s3fake.NewS3Fake(log, s3URL, s3mem.New())
driver, err := gocosi.New(
identity.New(ospName, log),
provisioner.New(log, s3),
res,
gocosi.WithHealthcheck(
health.WithComponent(health.Component{
Name: ospName,
Version: ospVersion,
}),
),
gocosi.WithDefaultGRPCOptions(),
gocosi.WithDefaultMetricExporter(exporterKind),
gocosi.WithDefaultTraceExporter(exporterKind),
)
if err != nil {
return fmt.Errorf("failed to create COSI OSP: %w", err)
}
eg := new(errgroup.Group)
// Run the S3 server as separate goroutine
eg.Go(func() error {
log.V(3).Info("starting s3 server", "address", s3URL)
if err := s3.Run(ctx); err != nil && !errors.Is(err, http.ErrServerClosed) {
cancel()
log.Error(err, "s3 failure")
return fmt.Errorf("running S3 server failed: %w", err)
}
return nil
})
eg.Go(func() error {
log.V(3).Info("starting driver server")
if err := driver.Run(ctx); err != nil {
cancel()
log.Error(err, "driver failure")
return fmt.Errorf("failed to run COSI OSP: %w", err)
}
return nil
})
return eg.Wait()
}