Skip to content

Commit 6b6efb0

Browse files
committed
removed unnecessary code
1 parent 6b6cfc3 commit 6b6efb0

File tree

9 files changed

+636
-325
lines changed

9 files changed

+636
-325
lines changed

docs/using/etcd-reconfiguration.md

Lines changed: 61 additions & 273 deletions
Large diffs are not rendered by default.

server/internal/api/apiv1/pre_init_handlers.go

Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,14 @@ import (
44
"context"
55
"crypto/tls"
66
"crypto/x509"
7-
"encoding/base64"
87
"fmt"
98
"net/http"
109
"net/url"
1110
"os"
1211

1312
"github.com/google/uuid"
14-
goahttp "goa.design/goa/v3/http"
1513

1614
api "github.com/pgEdge/control-plane/api/apiv1/gen/control_plane"
17-
"github.com/pgEdge/control-plane/api/apiv1/gen/http/control_plane/client"
1815
"github.com/pgEdge/control-plane/server/internal/cluster"
1916
"github.com/pgEdge/control-plane/server/internal/config"
2017
"github.com/pgEdge/control-plane/server/internal/etcd"
@@ -93,20 +90,15 @@ func (s *PreInitHandlers) JoinCluster(ctx context.Context, token *api.ClusterJoi
9390
return ErrInvalidServerURL
9491
}
9592

96-
http_client, err := s.GetClient()
97-
93+
httpClient, err := s.GetClient()
9894
if err != nil {
9995
return err
10096
}
10197

102-
enc := goahttp.RequestEncoder
103-
dec := goahttp.ResponseDecoder //make our own
104-
c := client.NewClient(serverURL.Scheme, serverURL.Host, http_client, enc, dec, false)
105-
cli := &api.Client{
106-
GetJoinOptionsEndpoint: c.GetJoinOptions(),
107-
}
98+
// Use shared API client creation utility
99+
apiClient := etcd.CreateAPIClient(serverURL, httpClient)
108100

109-
opts, err := cli.GetJoinOptions(ctx, &api.ClusterJoinRequest{
101+
opts, err := apiClient.GetJoinOptions(ctx, &api.ClusterJoinRequest{
110102
HostID: api.Identifier(s.cfg.HostID),
111103
Hostname: s.cfg.Hostname,
112104
Ipv4Address: s.cfg.IPv4Address,
@@ -117,43 +109,13 @@ func (s *PreInitHandlers) JoinCluster(ctx context.Context, token *api.ClusterJoi
117109
return apiErr(err)
118110
}
119111

120-
caCert, err := base64.StdEncoding.DecodeString(opts.Credentials.CaCert)
121-
if err != nil {
122-
return apiErr(fmt.Errorf("failed to decode CA certificate: %w", err))
123-
}
124-
clientCert, err := base64.StdEncoding.DecodeString(opts.Credentials.ClientCert)
125-
if err != nil {
126-
return apiErr(fmt.Errorf("failed to decode client certificate: %w", err))
127-
}
128-
clientKey, err := base64.StdEncoding.DecodeString(opts.Credentials.ClientKey)
129-
if err != nil {
130-
return apiErr(fmt.Errorf("failed to decode client key: %w", err))
131-
}
132-
serverCert, err := base64.StdEncoding.DecodeString(opts.Credentials.ServerCert)
133-
if err != nil {
134-
return apiErr(fmt.Errorf("failed to decode server certificate: %w", err))
135-
}
136-
serverKey, err := base64.StdEncoding.DecodeString(opts.Credentials.ServerKey)
112+
// Decode credentials using shared utility
113+
joinOptions, err := etcd.DecodeJoinCredentials(opts)
137114
if err != nil {
138-
return apiErr(fmt.Errorf("failed to decode server key: %w", err))
115+
return apiErr(err)
139116
}
140117

141-
err = s.etcd.Join(ctx, etcd.JoinOptions{
142-
Leader: &etcd.ClusterMember{
143-
Name: opts.Leader.Name,
144-
PeerURLs: opts.Leader.PeerUrls,
145-
ClientURLs: opts.Leader.ClientUrls,
146-
},
147-
Credentials: &etcd.HostCredentials{
148-
Username: opts.Credentials.Username,
149-
Password: opts.Credentials.Password,
150-
CaCert: caCert,
151-
ClientCert: clientCert,
152-
ClientKey: clientKey,
153-
ServerCert: serverCert,
154-
ServerKey: serverKey,
155-
},
156-
})
118+
err = s.etcd.Join(ctx, *joinOptions)
157119
if err != nil {
158120
return apiErr(fmt.Errorf("failed to join existing cluster: %w", err))
159121
}

server/internal/etcd/embedded.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ func (e *EmbeddedEtcd) Start(ctx context.Context) error {
5353
e.mu.Lock()
5454
defer e.mu.Unlock()
5555

56+
if e.etcd != nil {
57+
return nil // already started
58+
}
59+
5660
initialized, err := e.IsInitialized()
5761
if err != nil {
5862
return err
@@ -292,6 +296,7 @@ func (e *EmbeddedEtcd) Shutdown() error {
292296
}
293297
if e.etcd != nil {
294298
e.etcd.Close()
299+
e.etcd = nil
295300
}
296301
return errors.Join(errs...)
297302
}

server/internal/etcd/provide.go

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package etcd
22

33
import (
4+
"context"
45
"fmt"
6+
"time"
57

68
"github.com/rs/zerolog"
79
"github.com/samber/do"
@@ -27,6 +29,18 @@ func provideClient(i *do.Injector) {
2729
})
2830
}
2931

32+
// newEtcdForMode creates an Etcd instance based on the specified mode.
33+
func newEtcdForMode(mode config.EtcdMode, cfg *config.Manager, logger zerolog.Logger) (Etcd, error) {
34+
switch mode {
35+
case config.EtcdModeServer:
36+
return NewEmbeddedEtcd(cfg, logger), nil
37+
case config.EtcdModeClient:
38+
return NewRemoteEtcd(cfg, logger), nil
39+
default:
40+
return nil, fmt.Errorf("invalid etcd mode: %s", mode)
41+
}
42+
}
43+
3044
func provideEtcd(i *do.Injector) {
3145
do.Provide(i, func(i *do.Injector) (Etcd, error) {
3246
cfg, err := do.Invoke[*config.Manager](i)
@@ -38,13 +52,47 @@ func provideEtcd(i *do.Injector) {
3852
return nil, err
3953
}
4054

41-
switch storageType := cfg.Config().EtcdMode; storageType {
42-
case config.EtcdModeServer:
43-
return NewEmbeddedEtcd(cfg, logger), nil
44-
case config.EtcdModeClient:
45-
return NewRemoteEtcd(cfg, logger), nil
55+
appCfg := cfg.Config()
56+
generated := cfg.GeneratedConfig()
57+
58+
oldMode := generated.EtcdMode
59+
newMode := appCfg.EtcdMode
60+
61+
logger.Info().
62+
Str("old_mode", string(oldMode)).
63+
Str("new_mode", string(newMode)).
64+
Bool("old_mode_empty", oldMode == "").
65+
Bool("modes_equal", oldMode == newMode).
66+
Msg("checking etcd mode for reconfiguration")
67+
68+
// First startup (no generated config yet) or no change: use the configured mode.
69+
if oldMode == "" || oldMode == newMode {
70+
logger.Info().
71+
Str("mode", string(newMode)).
72+
Bool("first_startup", oldMode == "").
73+
Msg("creating new etcd instance for mode (no reconfiguration needed)")
74+
return newEtcdForMode(newMode, cfg, logger)
75+
}
76+
77+
// Mode has changed - perform reconfiguration.
78+
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
79+
defer cancel()
80+
81+
logger.Info().
82+
Str("host_id", appCfg.HostID).
83+
Str("old_mode", string(oldMode)).
84+
Str("new_mode", string(newMode)).
85+
Msg("detected etcd_mode change, performing reconfiguration")
86+
87+
switch {
88+
case oldMode == config.EtcdModeServer && newMode == config.EtcdModeClient:
89+
return reconfigureServerToClient(ctx, cfg, logger)
90+
91+
case oldMode == config.EtcdModeClient && newMode == config.EtcdModeServer:
92+
return reconfigureClientToServer(ctx, cfg, logger)
93+
4694
default:
47-
return nil, fmt.Errorf("invalid storage type: %s", storageType)
95+
return nil, fmt.Errorf("unsupported etcd mode transition: %s -> %s", oldMode, newMode)
4896
}
4997
})
5098
}

server/internal/etcd/rbac.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ func writeHostCredentials(creds *HostCredentials, cfg *config.Manager) error {
354354
generatedCfg.EtcdUsername = creds.Username
355355
generatedCfg.EtcdPassword = creds.Password
356356
generatedCfg.EtcdMode = appCfg.EtcdMode
357+
357358
if err := cfg.UpdateGeneratedConfig(generatedCfg); err != nil {
358359
return fmt.Errorf("failed to update generated config: %w", err)
359360
}

0 commit comments

Comments
 (0)