Fix ConfigEntryResponse binary marshaller and ensure we watch the chan in ConfigEntry.Get even when no entry exists. (#5773)
This commit is contained in:
parent
d1dd6716fd
commit
26708570c5
|
@ -92,10 +92,10 @@ func (s *Store) ConfigEntry(ws memdb.WatchSet, kind, name string) (uint64, struc
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, nil, fmt.Errorf("failed config entry lookup: %s", err)
|
return 0, nil, fmt.Errorf("failed config entry lookup: %s", err)
|
||||||
}
|
}
|
||||||
|
ws.Add(watchCh)
|
||||||
if existing == nil {
|
if existing == nil {
|
||||||
return idx, nil, nil
|
return idx, nil, nil
|
||||||
}
|
}
|
||||||
ws.Add(watchCh)
|
|
||||||
|
|
||||||
conf, ok := existing.(structs.ConfigEntry)
|
conf, ok := existing.(structs.ConfigEntry)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|
|
@ -479,12 +479,19 @@ func (c *ConfigEntryResponse) MarshalBinary() (data []byte, err error) {
|
||||||
bs := make([]byte, 128)
|
bs := make([]byte, 128)
|
||||||
enc := codec.NewEncoderBytes(&bs, msgpackHandle)
|
enc := codec.NewEncoderBytes(&bs, msgpackHandle)
|
||||||
|
|
||||||
|
if c.Entry != nil {
|
||||||
if err := enc.Encode(c.Entry.GetKind()); err != nil {
|
if err := enc.Encode(c.Entry.GetKind()); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := enc.Encode(c.Entry); err != nil {
|
if err := enc.Encode(c.Entry); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if err := enc.Encode(""); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if err := enc.Encode(c.QueryMeta); err != nil {
|
if err := enc.Encode(c.QueryMeta); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -500,6 +507,7 @@ func (c *ConfigEntryResponse) UnmarshalBinary(data []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if kind != "" {
|
||||||
entry, err := MakeConfigEntry(kind, "")
|
entry, err := MakeConfigEntry(kind, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -509,6 +517,9 @@ func (c *ConfigEntryResponse) UnmarshalBinary(data []byte) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
c.Entry = entry
|
c.Entry = entry
|
||||||
|
} else {
|
||||||
|
c.Entry = nil
|
||||||
|
}
|
||||||
|
|
||||||
if err := dec.Decode(&c.QueryMeta); err != nil {
|
if err := dec.Decode(&c.QueryMeta); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -143,3 +143,45 @@ func TestServiceConfigResponse_MsgPack(t *testing.T) {
|
||||||
|
|
||||||
require.Equal(t, a, b)
|
require.Equal(t, a, b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConfigEntryResponseMarshalling(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
cases := map[string]ConfigEntryResponse{
|
||||||
|
"nil entry": ConfigEntryResponse{},
|
||||||
|
"proxy-default entry": ConfigEntryResponse{
|
||||||
|
Entry: &ProxyConfigEntry{
|
||||||
|
Kind: ProxyDefaults,
|
||||||
|
Name: ProxyConfigGlobal,
|
||||||
|
Config: map[string]interface{}{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"service-default entry": ConfigEntryResponse{
|
||||||
|
Entry: &ServiceConfigEntry{
|
||||||
|
Kind: ServiceDefaults,
|
||||||
|
Name: "foo",
|
||||||
|
Protocol: "tcp",
|
||||||
|
// Connect: ConnectConfiguration{SideCarProxy: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, tcase := range cases {
|
||||||
|
name := name
|
||||||
|
tcase := tcase
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
data, err := tcase.MarshalBinary()
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, data)
|
||||||
|
|
||||||
|
var resp ConfigEntryResponse
|
||||||
|
require.NoError(t, resp.UnmarshalBinary(data))
|
||||||
|
|
||||||
|
require.Equal(t, tcase, resp)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue