Skip to content

Commit 4fd6fa1

Browse files
author
Dimy Jeannot
committed
feat: adding support to generate unified go sdk clients
1 parent b3526b0 commit 4fd6fa1

File tree

24 files changed

+701
-99
lines changed

24 files changed

+701
-99
lines changed

go/oeco-sdk/v2beta/CHANGELOG.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,25 @@
22

33
### 🩹 Fixes
44

5-
- removing the nats server name random digits. Needs to be predictable when in cluster mode ([921bbe6](https://github.com/openecosystems/ecosystem/commit/921bbe6))
5+
- removing the nats server name random digits. Needs to be predictable when in cluster mode ([921bbe6](https://github.com/openecosystems/ecosystem/commit/921bbe6))
66

77
### ❤️ Thank You
88

9-
- Dimy Jeannot
9+
- Dimy Jeannot
1010

1111
## 0.22.0 (2025-10-08)
1212

1313
### 🚀 Features
1414

15-
- adding conditional support for nats clustering; better logging; ([e179b70](https://github.com/openecosystems/ecosystem/commit/e179b70))
15+
- adding conditional support for nats clustering; better logging; ([e179b70](https://github.com/openecosystems/ecosystem/commit/e179b70))
1616

1717
### 🩹 Fixes
1818

19-
- removing the nats server name random digits. Needs to be predictable when in cluster mode ([8556170](https://github.com/openecosystems/ecosystem/commit/8556170))
19+
- removing the nats server name random digits. Needs to be predictable when in cluster mode ([8556170](https://github.com/openecosystems/ecosystem/commit/8556170))
2020

2121
### ❤️ Thank You
2222

23-
- Dimy Jeannot
23+
- Dimy Jeannot
2424

2525
## 0.21.2 (2025-10-03)
2626

go/oeco-sdk/v2beta/bindings/nats/listener.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ func ListenForMultiplexedRequests(_ context.Context, listener SpecEventListener)
130130
}
131131

132132
// RespondToMultiplexedRequest processes an inbound message, modifies the provided message, and sends a response through NATS.
133-
func RespondToMultiplexedRequest(_ context.Context, message *ListenerMessage) {
133+
func RespondToMultiplexedRequest(ctx context.Context, message *ListenerMessage) {
134134
log := *zaploggerv1.Bound.Logger
135-
jsc := *Bound.JetStreamContext
135+
js := *Bound.JetStream
136136
nm := *message.NatsMessage
137137

138138
if message.Spec == nil {
@@ -197,12 +197,13 @@ func RespondToMultiplexedRequest(_ context.Context, message *ListenerMessage) {
197197
}
198198

199199
go func() {
200-
_, err = jsc.Publish(subject, specBytes)
200+
_, err = js.Publish(ctx, subject, specBytes)
201201
if err != nil {
202202
message.Spec.SpecError = sdkv2betalib.ErrServerInternal.WithSpecDetail(message.Spec).WithInternalErrorDetail(errors.New("found error when publishing to jetstream subject: "+subject), err).ToStatus()
203203
respond(&nm, message.Spec)
204204
return
205205
}
206+
log.Info("Published to jetstream subject: " + subject)
206207
}()
207208

208209
respond(&nm, message.Spec)

go/oeco-sdk/v2beta/bindings/nats/registry.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"reflect"
78
"time"
89

910
"github.com/nats-io/nats.go"
@@ -49,6 +50,57 @@ func RegisterEventStreams(environmentName string, streams []jetstream.StreamConf
4950
}
5051
}
5152

53+
func createOrUpdateStream2(cfg jetstream.StreamConfig) error {
54+
js := *Bound.JetStream
55+
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
56+
defer cancel()
57+
58+
info, err := js.Stream(ctx, cfg.Name)
59+
if err != nil {
60+
// Stream not found — create new
61+
if errors.Is(err, jetstream.ErrStreamNotFound) {
62+
fmt.Println("Creating stream:", cfg.Name)
63+
if _, err := js.CreateOrUpdateStream(ctx, cfg); err != nil {
64+
return fmt.Errorf("failed to create stream %s: %w", cfg.Name, err)
65+
}
66+
return nil
67+
}
68+
// Any other error
69+
return fmt.Errorf("error fetching stream info for %s: %w", cfg.Name, err)
70+
}
71+
72+
// Compare existing config with desired config
73+
_cfg := info.CachedInfo().Config
74+
if !streamConfigsEqual(&_cfg, &cfg) {
75+
fmt.Printf("Updating stream %s (config has changed)\n", cfg.Name)
76+
if _, err := js.CreateOrUpdateStream(ctx, cfg); err != nil {
77+
return fmt.Errorf("failed to update stream %s: %w", cfg.Name, err)
78+
}
79+
} else {
80+
fmt.Printf("Stream %s is up to date, no changes needed\n", cfg.Name)
81+
}
82+
83+
return nil
84+
}
85+
86+
func streamConfigsEqual(a, b *jetstream.StreamConfig) bool {
87+
// ignore zero values (JetStream may fill defaults)
88+
cleanA := normalizeStreamConfig(a)
89+
cleanB := normalizeStreamConfig(b)
90+
return reflect.DeepEqual(cleanA, cleanB)
91+
}
92+
93+
func normalizeStreamConfig(cfg *jetstream.StreamConfig) *jetstream.StreamConfig {
94+
c := *cfg
95+
if c.MaxAge == 0 {
96+
c.MaxAge = 0
97+
}
98+
if c.MaxMsgs == 0 {
99+
c.MaxMsgs = -1
100+
}
101+
return &c
102+
}
103+
52104
// createOrUpdateStream creates a new stream or updates an existing one using the provided StreamConfig.
53105
func createOrUpdateStream(cfg jetstream.StreamConfig) error {
54106
// Check if stream exists

go/oeco-sdk/v2beta/configuration.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ import (
2020
"github.com/iancoleman/strcase"
2121
"github.com/joho/godotenv"
2222
"github.com/mitchellh/mapstructure"
23-
"github.com/spf13/viper"
24-
"google.golang.org/protobuf/proto"
25-
2623
specv2pb "github.com/openecosystems/ecosystem/go/oeco-sdk/v2beta/gen/platform/spec/v2"
2724
typev2pb "github.com/openecosystems/ecosystem/go/oeco-sdk/v2beta/gen/platform/type/v2"
25+
"github.com/spf13/viper"
2826
)
2927

3028
const (
@@ -211,13 +209,13 @@ func initializeConfigurer(opts ...ConfigurationProviderOption) (*Configurer, err
211209
ctx = strings.TrimSpace(string(file))
212210

213211
if ctx == "" {
214-
// Set the oeco workspace in the "default" file
215-
err = filesystem.WriteFile(DefaultContextFile, []byte(OecoContextFileName), os.ModePerm)
212+
// Set the adino workspace in the "default" file
213+
err = filesystem.WriteFile(DefaultContextFile, []byte(AdinoContextFileName), os.ModePerm)
216214
if err != nil {
217215
return nil, errors.New("internal error: Cannot create default context")
218216
}
219217

220-
_, err = createDefaultContextSettings(OecoContextFileName, DefaultCIDR)
218+
_, err = createDefaultContextSettings(AdinoContextFileName, DefaultCIDR)
221219
if err != nil {
222220
return nil, err
223221
}
@@ -237,15 +235,12 @@ func initializeConfigurer(opts ...ConfigurationProviderOption) (*Configurer, err
237235
func createDefaultContextSettings(ecosystemName string, cidr string) (*specv2pb.SpecSettings, error) {
238236
// TODO: Sanitize ecosystemName
239237

240-
ip, ipnet, err := net.ParseCIDR(cidr)
238+
_, _, err := net.ParseCIDR(cidr)
241239
if err != nil {
242240
fmt.Println("SpecError:", err)
243241
return nil, err
244242
}
245243

246-
fmt.Println("IP:", ip.String())
247-
fmt.Println("Subnet Mask:", ipnet.Mask)
248-
249244
fs := NewFileSystem()
250245
contextFile := filepath.Join(ContextDirectory, ecosystemName)
251246

@@ -302,12 +297,12 @@ func createDefaultContextSettings(ecosystemName string, cidr string) (*specv2pb.
302297
Systems: []*specv2pb.SpecSystem{&configurationSystem, &iamSystem},
303298
}
304299

305-
settingBytes, err := proto.Marshal(&settings)
300+
yaml, err := ProtoToYAML(&settings)
306301
if err != nil {
307302
return nil, err
308303
}
309304

310-
err = fs.WriteFile(OecoContextFile+"."+ConfigurationExtension, settingBytes, os.ModePerm)
305+
err = fs.WriteFile(AdinoContextFile+"."+ConfigurationExtension, []byte(yaml), os.ModePerm)
311306
if err != nil {
312307
return nil, errors.New("internal error: Cannot write ecosystem settings file")
313308
}

go/oeco-sdk/v2beta/filesystem.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ type FileSystem struct {
3939
// ConfigurationDirectoryName specifies the directory name for configuration storage.
4040
// ConnectorDirectoryName specifies the directory name for connector storage.
4141
const (
42-
HomeDirectoryName = ".config/oeco"
42+
HomeDirectoryName = ".config/adino"
4343
ConfigurationName = "config"
4444
ConfigurationExtension = "yaml"
4545
LogDirectoryName = "logs"
4646
LogExtension = "log"
4747
TmpDirectoryName = "tmp"
4848
ContextDirectoryName = "context"
49-
OecoContextFileName = "oeco"
49+
AdinoContextFileName = "adino"
5050
DefaultContextFileName = "default"
5151
CredentialDirectoryName = "credentials"
5252
RegistryDirectoryName = "registry"
@@ -80,9 +80,9 @@ var (
8080
ConfigurationDirectory = filepath.Join(HomeDirectory, ConfigurationDirectoryName)
8181
ConnectorDirectory = filepath.Join(HomeDirectory, ConnectorDirectoryName)
8282
RegistryCacheDirectory = filepath.Join(RegistryDirectory, RegistryCacheDirectoryName)
83-
OecoContextFile = filepath.Join(ContextDirectory, OecoContextFileName)
83+
AdinoContextFile = filepath.Join(ContextDirectory, AdinoContextFileName)
8484
DefaultContextFile = filepath.Join(ContextDirectory, DefaultContextFileName)
85-
OecoLogFile = filepath.Join(LogDirectory, OecoContextFileName+"."+LogExtension)
85+
OecoLogFile = filepath.Join(LogDirectory, AdinoContextFileName+"."+LogExtension)
8686
Filesystem *FileSystem
8787
)
8888

go/oeco-sdk/v2beta/gen/platform/spec/v2/spec_settings.pb.go

Lines changed: 2 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go/oeco-sdk/v2beta/server.go

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ type Server struct {
4141
NetListener *net.Listener
4242

4343
options *serverOptions
44-
publicGRPCServer *http.Server
4544
publicHTTPServer *http.Server
4645
meshHTTPServer *http.Server
4746
// err error
@@ -215,7 +214,6 @@ func (server *Server) listenAndServe(ln *net.Listener) (httpServerErr chan error
215214
return
216215
}
217216

218-
publicGrpcEndpoint := settings.Platform.GetGrpcEndpoint()
219217
publicEndpoint := settings.Platform.GetEndpoint()
220218
meshEndpoint := settings.Platform.Mesh.GetEndpoint()
221219

@@ -252,16 +250,6 @@ func (server *Server) listenAndServe(ln *net.Listener) (httpServerErr chan error
252250
server.MeshHTTPServerHandler = meshMux
253251
meshMux.Handle("/", server.MeshServiceHandler)
254252

255-
publicGRPCServer := &http.Server{
256-
Addr: publicGrpcEndpoint,
257-
// Use h2c so we can serve HTTP/2 without TLS.
258-
Handler: h2c.NewHandler(edgeRouter(publicMux), server.PublicConnectHTTPServer),
259-
ReadTimeout: 5 * time.Second, // Time allowed to read the request
260-
WriteTimeout: 10 * time.Second, // Time allowed to write the response
261-
IdleTimeout: 15 * time.Second, // Time for keep-alive connections
262-
}
263-
server.publicGRPCServer = publicGRPCServer
264-
265253
publicHTTPServer := &http.Server{
266254
Addr: publicEndpoint,
267255
// Use h2c so we can serve HTTP/2 without TLS.
@@ -288,12 +276,7 @@ func (server *Server) listenAndServe(ln *net.Listener) (httpServerErr chan error
288276
go func() {
289277
_httpServerErr <- server.publicHTTPServer.ListenAndServe()
290278
}()
291-
fmt.Println("Public HTTP1.1/HTTP2.0/Connect listening on " + settings.Platform.Endpoint)
292-
293-
go func() {
294-
_httpServerErr <- server.publicGRPCServer.ListenAndServe()
295-
}()
296-
fmt.Println("Public gRPC listening on " + settings.Platform.GrpcEndpoint)
279+
fmt.Println("Public HTTP1.1/HTTP2.0/gRPC/gRPC-Web/Connect listening on " + settings.Platform.Endpoint)
297280
}
298281

299282
if server.MeshConnectHTTPServer != nil {
@@ -338,10 +321,6 @@ func (server *Server) Shutdown() {
338321
if err := server.publicHTTPServer.Shutdown(ctx); err != nil {
339322
fmt.Println("Public server shutdown error:", err)
340323
}
341-
342-
if err := server.publicGRPCServer.Shutdown(ctx); err != nil {
343-
fmt.Println("Public gRPC server shutdown error:", err)
344-
}
345324
}
346325

347326
if server.MeshConnectHTTPServer != nil {

0 commit comments

Comments
 (0)