connect: Add support for ConsulResolver to specifies a filter expression (#15659)
* connect: Add support for ConsulResolver to specifies a filter expression
This commit is contained in:
parent
62df6a7513
commit
97b859a690
|
@ -0,0 +1,3 @@
|
||||||
|
```release-note:improvement
|
||||||
|
connect: Add support for ConsulResolver to specifies a filter expression
|
||||||
|
```
|
|
@ -78,6 +78,9 @@ type ConsulResolver struct {
|
||||||
|
|
||||||
// Datacenter to resolve in, empty indicates agent's local DC.
|
// Datacenter to resolve in, empty indicates agent's local DC.
|
||||||
Datacenter string
|
Datacenter string
|
||||||
|
|
||||||
|
// Specifies the expression used to filter the queries results prior to returning the data.
|
||||||
|
Filter string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve performs service discovery against the local Consul agent and returns
|
// Resolve performs service discovery against the local Consul agent and returns
|
||||||
|
@ -173,6 +176,7 @@ func (cr *ConsulResolver) queryOptions(ctx context.Context) *api.QueryOptions {
|
||||||
|
|
||||||
// For prepared queries
|
// For prepared queries
|
||||||
Connect: true,
|
Connect: true,
|
||||||
|
Filter: cr.Filter,
|
||||||
}
|
}
|
||||||
return q.WithContext(ctx)
|
return q.WithContext(ctx)
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,9 @@ func TestConsulResolver_Resolve(t *testing.T) {
|
||||||
Proxy: &api.AgentServiceConnectProxyConfig{
|
Proxy: &api.AgentServiceConnectProxyConfig{
|
||||||
DestinationServiceName: "web",
|
DestinationServiceName: "web",
|
||||||
},
|
},
|
||||||
|
Meta: map[string]string{
|
||||||
|
"MetaKey": "MetaValue",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
err = client.Agent().ServiceRegister(regProxy)
|
err = client.Agent().ServiceRegister(regProxy)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
@ -75,6 +78,7 @@ func TestConsulResolver_Resolve(t *testing.T) {
|
||||||
// And another proxy so we can test handling with multiple endpoints returned
|
// And another proxy so we can test handling with multiple endpoints returned
|
||||||
regProxy.Port = 9091
|
regProxy.Port = 9091
|
||||||
regProxy.ID = "web-proxy-2"
|
regProxy.ID = "web-proxy-2"
|
||||||
|
regProxy.Meta = map[string]string{}
|
||||||
err = client.Agent().ServiceRegister(regProxy)
|
err = client.Agent().ServiceRegister(regProxy)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
@ -110,6 +114,7 @@ func TestConsulResolver_Resolve(t *testing.T) {
|
||||||
Name string
|
Name string
|
||||||
Type int
|
Type int
|
||||||
Datacenter string
|
Datacenter string
|
||||||
|
Filter string
|
||||||
}
|
}
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
@ -145,6 +150,32 @@ func TestConsulResolver_Resolve(t *testing.T) {
|
||||||
wantCertURI: connect.TestSpiffeIDServiceWithHost(t, "db", ""),
|
wantCertURI: connect.TestSpiffeIDServiceWithHost(t, "db", ""),
|
||||||
wantErr: false,
|
wantErr: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "service discovery with filter",
|
||||||
|
fields: fields{
|
||||||
|
Namespace: "default",
|
||||||
|
Name: "web",
|
||||||
|
Type: ConsulResolverTypeService,
|
||||||
|
Filter: "Service.Meta[`MetaKey`] == `MetaValue`",
|
||||||
|
},
|
||||||
|
// Want empty host since we don't enforce trust domain outside of TLS and
|
||||||
|
// don't need to load the current one this way.
|
||||||
|
wantCertURI: connect.TestSpiffeIDServiceWithHost(t, "web", ""),
|
||||||
|
wantErr: false,
|
||||||
|
addrs: []string{
|
||||||
|
agent.Config.AdvertiseAddrLAN.String() + ":9090",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "service discovery with filter",
|
||||||
|
fields: fields{
|
||||||
|
Namespace: "default",
|
||||||
|
Name: "web",
|
||||||
|
Type: ConsulResolverTypeService,
|
||||||
|
Filter: "`AnotherMetaValue` in Service.Meta.MetaKey",
|
||||||
|
},
|
||||||
|
wantErr: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "Bad Type errors",
|
name: "Bad Type errors",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
|
@ -206,6 +237,7 @@ func TestConsulResolver_Resolve(t *testing.T) {
|
||||||
Name: tt.fields.Name,
|
Name: tt.fields.Name,
|
||||||
Type: tt.fields.Type,
|
Type: tt.fields.Type,
|
||||||
Datacenter: tt.fields.Datacenter,
|
Datacenter: tt.fields.Datacenter,
|
||||||
|
Filter: tt.fields.Filter,
|
||||||
}
|
}
|
||||||
// WithCancel just to have a cancel func in scope to assign in the if
|
// WithCancel just to have a cancel func in scope to assign in the if
|
||||||
// clause.
|
// clause.
|
||||||
|
|
Loading…
Reference in New Issue