Skip to content

Commit 9257300

Browse files
authored
Merge pull request #4535 from hashicorp/ca-snapshot-fix
fsm: add missing CA config to snapshot/restore logic
2 parents efe1462 + e5e1f86 commit 9257300

File tree

4 files changed

+78
-2
lines changed

4 files changed

+78
-2
lines changed

agent/consul/fsm/fsm.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import (
1414
)
1515

1616
// msgpackHandle is a shared handle for encoding/decoding msgpack payloads
17-
var msgpackHandle = &codec.MsgpackHandle{}
17+
var msgpackHandle = &codec.MsgpackHandle{
18+
RawToString: true,
19+
}
1820

1921
// command is a command method on the FSM.
2022
type command func(buf []byte, index uint64) interface{}

agent/consul/fsm/snapshot_oss.go

+32
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func init() {
2323
registerRestorer(structs.IntentionRequestType, restoreIntention)
2424
registerRestorer(structs.ConnectCARequestType, restoreConnectCA)
2525
registerRestorer(structs.ConnectCAProviderStateType, restoreConnectCAProviderState)
26+
registerRestorer(structs.ConnectCAConfigType, restoreConnectCAConfig)
2627
}
2728

2829
func persistOSS(s *snapshot, sink raft.SnapshotSink, encoder *codec.Encoder) error {
@@ -56,6 +57,9 @@ func persistOSS(s *snapshot, sink raft.SnapshotSink, encoder *codec.Encoder) err
5657
if err := s.persistConnectCAProviderState(sink, encoder); err != nil {
5758
return err
5859
}
60+
if err := s.persistConnectCAConfig(sink, encoder); err != nil {
61+
return err
62+
}
5963
return nil
6064
}
6165

@@ -286,6 +290,23 @@ func (s *snapshot) persistConnectCA(sink raft.SnapshotSink,
286290
return err
287291
}
288292
}
293+
294+
return nil
295+
}
296+
297+
func (s *snapshot) persistConnectCAConfig(sink raft.SnapshotSink,
298+
encoder *codec.Encoder) error {
299+
config, err := s.state.CAConfig()
300+
if err != nil {
301+
return err
302+
}
303+
304+
if _, err := sink.Write([]byte{byte(structs.ConnectCAConfigType)}); err != nil {
305+
return err
306+
}
307+
if err := encoder.Encode(config); err != nil {
308+
return err
309+
}
289310
return nil
290311
}
291312

@@ -464,3 +485,14 @@ func restoreConnectCAProviderState(header *snapshotHeader, restore *state.Restor
464485
}
465486
return nil
466487
}
488+
489+
func restoreConnectCAConfig(header *snapshotHeader, restore *state.Restore, decoder *codec.Decoder) error {
490+
var req structs.CAConfiguration
491+
if err := decoder.Decode(&req); err != nil {
492+
return err
493+
}
494+
if err := restore.CAConfig(&req); err != nil {
495+
return err
496+
}
497+
return nil
498+
}

agent/consul/fsm/snapshot_oss_test.go

+42-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,27 @@ func TestFSM_SnapshotRestore_OSS(t *testing.T) {
2929
// Add some state
3030
fsm.state.EnsureNode(1, &structs.Node{Node: "foo", Address: "127.0.0.1"})
3131
fsm.state.EnsureNode(2, &structs.Node{Node: "baz", Address: "127.0.0.2", TaggedAddresses: map[string]string{"hello": "1.2.3.4"}, Meta: map[string]string{"testMeta": "testing123"}})
32-
fsm.state.EnsureService(3, "foo", &structs.NodeService{ID: "web", Service: "web", Tags: nil, Address: "127.0.0.1", Port: 80})
32+
33+
// Add a service instance with Connect config.
34+
connectConf := structs.ServiceConnect{
35+
Native: true,
36+
Proxy: &structs.ServiceDefinitionConnectProxy{
37+
Command: []string{"foo", "bar"},
38+
ExecMode: "a",
39+
Config: map[string]interface{}{
40+
"a": "qwer",
41+
"b": 4.3,
42+
},
43+
},
44+
}
45+
fsm.state.EnsureService(3, "foo", &structs.NodeService{
46+
ID: "web",
47+
Service: "web",
48+
Tags: nil,
49+
Address: "127.0.0.1",
50+
Port: 80,
51+
Connect: connectConf,
52+
})
3353
fsm.state.EnsureService(4, "foo", &structs.NodeService{ID: "db", Service: "db", Tags: []string{"primary"}, Address: "127.0.0.1", Port: 5000})
3454
fsm.state.EnsureService(5, "baz", &structs.NodeService{ID: "web", Service: "web", Tags: nil, Address: "127.0.0.2", Port: 80})
3555
fsm.state.EnsureService(6, "baz", &structs.NodeService{ID: "db", Service: "db", Tags: []string{"secondary"}, Address: "127.0.0.2", Port: 5000})
@@ -131,6 +151,18 @@ func TestFSM_SnapshotRestore_OSS(t *testing.T) {
131151
assert.Nil(err)
132152
assert.True(ok)
133153

154+
// CA Config
155+
caConfig := &structs.CAConfiguration{
156+
ClusterID: "foo",
157+
Provider: "consul",
158+
Config: map[string]interface{}{
159+
"foo": "asdf",
160+
"bar": 6.5,
161+
},
162+
}
163+
err = fsm.state.CASetConfig(17, caConfig)
164+
assert.Nil(err)
165+
134166
// Snapshot
135167
snap, err := fsm.Snapshot()
136168
if err != nil {
@@ -191,6 +223,10 @@ func TestFSM_SnapshotRestore_OSS(t *testing.T) {
191223
if fooSrv.Services["db"].Port != 5000 {
192224
t.Fatalf("Bad: %v", fooSrv)
193225
}
226+
connectSrv := fooSrv.Services["web"]
227+
if !reflect.DeepEqual(connectSrv.Connect, connectConf) {
228+
t.Fatalf("got: %v, want: %v", connectSrv.Connect, connectConf)
229+
}
194230

195231
_, checks, err := fsm2.state.NodeChecks(nil, "foo")
196232
if err != nil {
@@ -312,6 +348,11 @@ func TestFSM_SnapshotRestore_OSS(t *testing.T) {
312348
assert.Equal("foo", state.PrivateKey)
313349
assert.Equal("bar", state.RootCert)
314350

351+
// Verify CA configuration is restored.
352+
_, caConf, err := fsm2.state.CAConfig()
353+
assert.Nil(err)
354+
assert.Equal(caConfig, caConf)
355+
315356
// Snapshot
316357
snap, err = fsm2.Snapshot()
317358
if err != nil {

agent/structs/structs.go

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const (
4646
IntentionRequestType = 12
4747
ConnectCARequestType = 13
4848
ConnectCAProviderStateType = 14
49+
ConnectCAConfigType = 15 // FSM snapshots only.
4950
)
5051

5152
const (

0 commit comments

Comments
 (0)