From d970813c20120a55fc10068e7e7a98e60abff770 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Fri, 3 Dec 2021 19:30:07 +0100 Subject: [PATCH] Support consul enterprise namespaces in consul catalog provider Co-authored-by: Romain --- docs/content/providers/consul-catalog.md | 29 +++++++++++++++++++ .../reference/static-configuration/cli-ref.md | 3 ++ .../reference/static-configuration/env-ref.md | 3 ++ .../reference/static-configuration/file.toml | 1 + .../reference/static-configuration/file.yaml | 1 + pkg/provider/consulcatalog/consul_catalog.go | 7 +++-- 6 files changed, 42 insertions(+), 2 deletions(-) diff --git a/docs/content/providers/consul-catalog.md b/docs/content/providers/consul-catalog.md index 1e4a1bedb..e7295e51e 100644 --- a/docs/content/providers/consul-catalog.md +++ b/docs/content/providers/consul-catalog.md @@ -694,3 +694,32 @@ providers: ``` For additional information, refer to [Restrict the Scope of Service Discovery](./overview.md#restrict-the-scope-of-service-discovery). + +### `namespace` + +_Optional, Default=""_ + +The `namespace` option defines the namespace in which the consul catalog services will be discovered. + +!!! warning + + The namespace option only works with [Consul Enterprise](https://www.consul.io/docs/enterprise), + which provides the [Namespaces](https://www.consul.io/docs/enterprise/namespaces) feature. + +```yaml tab="File (YAML)" +providers: + consulCatalog: + namespace: "production" + # ... +``` + +```toml tab="File (TOML)" +[providers.consulCatalog] + namespace = "production" + # ... +``` + +```bash tab="CLI" +--providers.consulcatalog.namespace=production +# ... +``` diff --git a/docs/content/reference/static-configuration/cli-ref.md b/docs/content/reference/static-configuration/cli-ref.md index 1048193aa..70d78c0e8 100644 --- a/docs/content/reference/static-configuration/cli-ref.md +++ b/docs/content/reference/static-configuration/cli-ref.md @@ -432,6 +432,9 @@ Token is used to provide a per-request ACL token which overrides the agent's def `--providers.consulcatalog.exposedbydefault`: Expose containers by default. (Default: ```true```) +`--providers.consulcatalog.namespace`: +Sets the namespace used to discover services (Consul Enterprise only). + `--providers.consulcatalog.prefix`: Prefix for consul service tags. Default 'traefik' (Default: ```traefik```) diff --git a/docs/content/reference/static-configuration/env-ref.md b/docs/content/reference/static-configuration/env-ref.md index f29d8263d..f19173582 100644 --- a/docs/content/reference/static-configuration/env-ref.md +++ b/docs/content/reference/static-configuration/env-ref.md @@ -405,6 +405,9 @@ Token is used to provide a per-request ACL token which overrides the agent's def `TRAEFIK_PROVIDERS_CONSULCATALOG_EXPOSEDBYDEFAULT`: Expose containers by default. (Default: ```true```) +`TRAEFIK_PROVIDERS_CONSULCATALOG_NAMESPACE`: +Sets the namespace used to discover services (Consul Enterprise only). + `TRAEFIK_PROVIDERS_CONSULCATALOG_PREFIX`: Prefix for consul service tags. Default 'traefik' (Default: ```traefik```) diff --git a/docs/content/reference/static-configuration/file.toml b/docs/content/reference/static-configuration/file.toml index fd4c77461..815871b5f 100644 --- a/docs/content/reference/static-configuration/file.toml +++ b/docs/content/reference/static-configuration/file.toml @@ -148,6 +148,7 @@ cache = true exposedByDefault = true defaultRule = "foobar" + namespace = "foobar" [providers.consulCatalog.endpoint] address = "foobar" scheme = "foobar" diff --git a/docs/content/reference/static-configuration/file.yaml b/docs/content/reference/static-configuration/file.yaml index e875055eb..618a9a071 100644 --- a/docs/content/reference/static-configuration/file.yaml +++ b/docs/content/reference/static-configuration/file.yaml @@ -160,6 +160,7 @@ providers: cache: true exposedByDefault: true defaultRule: foobar + namespace: foobar endpoint: address: foobar scheme: foobar diff --git a/pkg/provider/consulcatalog/consul_catalog.go b/pkg/provider/consulcatalog/consul_catalog.go index 3ae86aee3..f7af2bc06 100644 --- a/pkg/provider/consulcatalog/consul_catalog.go +++ b/pkg/provider/consulcatalog/consul_catalog.go @@ -55,6 +55,7 @@ type Provider struct { ConnectAware bool `description:"Enable Consul Connect support." json:"connectAware,omitempty" toml:"connectAware,omitempty" yaml:"connectAware,omitempty" export:"true"` ConnectByDefault bool `description:"Consider every service as Connect capable by default." json:"connectByDefault,omitempty" toml:"connectByDefault,omitempty" yaml:"connectByDefault,omitempty" export:"true"` ServiceName string `description:"Name of the Traefik service in Consul Catalog (needs to be registered via the orchestrator or manually)." json:"serviceName,omitempty" toml:"serviceName,omitempty" yaml:"serviceName,omitempty" export:"true"` + Namespace string `description:"Sets the namespace used to discover services (Consul Enterprise only)." json:"namespace,omitempty" toml:"namespace,omitempty" yaml:"namespace,omitempty" export:"true"` client *api.Client defaultRuleTpl *template.Template @@ -202,7 +203,9 @@ func (p *Provider) loadConfiguration(ctx context.Context, certInfo *connectCert, func (p *Provider) getConsulServicesData(ctx context.Context) ([]itemData, error) { // The query option "Filter" is not supported by /catalog/services. // https://www.consul.io/api/catalog.html#list-services - opts := &api.QueryOptions{AllowStale: p.Stale, RequireConsistent: p.RequireConsistent, UseCache: p.Cache} + opts := &api.QueryOptions{AllowStale: p.Stale, RequireConsistent: p.RequireConsistent, UseCache: p.Cache, Namespace: p.Namespace} + opts = opts.WithContext(ctx) + serviceNames, _, err := p.client.Catalog().Services(opts) if err != nil { return nil, err @@ -293,7 +296,7 @@ func (p *Provider) fetchService(ctx context.Context, name string, connectEnabled tagFilter = p.Prefix + ".enable=true" } - opts := &api.QueryOptions{AllowStale: p.Stale, RequireConsistent: p.RequireConsistent, UseCache: p.Cache} + opts := &api.QueryOptions{AllowStale: p.Stale, RequireConsistent: p.RequireConsistent, UseCache: p.Cache, Namespace: p.Namespace} opts = opts.WithContext(ctx) catalogFunc := p.client.Catalog().Service