diff --git a/agent/consul/state/config_entry.go b/agent/consul/state/config_entry.go index adc6d4e354..18110e9e5b 100644 --- a/agent/consul/state/config_entry.go +++ b/agent/consul/state/config_entry.go @@ -360,7 +360,7 @@ func validateProposedConfigEntryInGraph( } case structs.ServiceIntentions: case structs.MeshConfig: - case structs.ServiceExports: + case structs.PartitionExports: default: return fmt.Errorf("unhandled kind %q during validation of %q", kindName.Kind, kindName.Name) } diff --git a/agent/consul/usagemetrics/usagemetrics_oss_test.go b/agent/consul/usagemetrics/usagemetrics_oss_test.go index 80fe3057f1..94be9f6327 100644 --- a/agent/consul/usagemetrics/usagemetrics_oss_test.go +++ b/agent/consul/usagemetrics/usagemetrics_oss_test.go @@ -177,12 +177,12 @@ func TestUsageReporter_emitNodeUsage_OSS(t *testing.T) { {Name: "kind", Value: "terminating-gateway"}, }, }, - "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=service-exports": { + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=partition-exports": { Name: "consul.usage.test.consul.state.config_entries", Value: 0, Labels: []metrics.Label{ {Name: "datacenter", Value: "dc1"}, - {Name: "kind", Value: "service-exports"}, + {Name: "kind", Value: "partition-exports"}, }, }, }, @@ -362,12 +362,12 @@ func TestUsageReporter_emitNodeUsage_OSS(t *testing.T) { {Name: "kind", Value: "terminating-gateway"}, }, }, - "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=service-exports": { + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=partition-exports": { Name: "consul.usage.test.consul.state.config_entries", Value: 0, Labels: []metrics.Label{ {Name: "datacenter", Value: "dc1"}, - {Name: "kind", Value: "service-exports"}, + {Name: "kind", Value: "partition-exports"}, }, }, }, @@ -575,12 +575,12 @@ func TestUsageReporter_emitServiceUsage_OSS(t *testing.T) { {Name: "kind", Value: "terminating-gateway"}, }, }, - "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=service-exports": { + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=partition-exports": { Name: "consul.usage.test.consul.state.config_entries", Value: 0, Labels: []metrics.Label{ {Name: "datacenter", Value: "dc1"}, - {Name: "kind", Value: "service-exports"}, + {Name: "kind", Value: "partition-exports"}, }, }, }, @@ -802,12 +802,12 @@ func TestUsageReporter_emitServiceUsage_OSS(t *testing.T) { {Name: "kind", Value: "terminating-gateway"}, }, }, - "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=service-exports": { + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=partition-exports": { Name: "consul.usage.test.consul.state.config_entries", Value: 0, Labels: []metrics.Label{ {Name: "datacenter", Value: "dc1"}, - {Name: "kind", Value: "service-exports"}, + {Name: "kind", Value: "partition-exports"}, }, }, }, @@ -1006,12 +1006,12 @@ func TestUsageReporter_emitKVUsage_OSS(t *testing.T) { {Name: "kind", Value: "terminating-gateway"}, }, }, - "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=service-exports": { + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=partition-exports": { Name: "consul.usage.test.consul.state.config_entries", Value: 0, Labels: []metrics.Label{ {Name: "datacenter", Value: "dc1"}, - {Name: "kind", Value: "service-exports"}, + {Name: "kind", Value: "partition-exports"}, }, }, }, @@ -1200,12 +1200,12 @@ func TestUsageReporter_emitKVUsage_OSS(t *testing.T) { {Name: "kind", Value: "terminating-gateway"}, }, }, - "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=service-exports": { + "consul.usage.test.consul.state.config_entries;datacenter=dc1;kind=partition-exports": { Name: "consul.usage.test.consul.state.config_entries", Value: 0, Labels: []metrics.Label{ {Name: "datacenter", Value: "dc1"}, - {Name: "kind", Value: "service-exports"}, + {Name: "kind", Value: "partition-exports"}, }, }, }, diff --git a/agent/structs/config_entry.go b/agent/structs/config_entry.go index 0bf603eead..4b68bec81a 100644 --- a/agent/structs/config_entry.go +++ b/agent/structs/config_entry.go @@ -27,7 +27,7 @@ const ( TerminatingGateway string = "terminating-gateway" ServiceIntentions string = "service-intentions" MeshConfig string = "mesh" - ServiceExports string = "service-exports" + PartitionExports string = "partition-exports" ProxyConfigGlobal string = "global" MeshConfigMesh string = "mesh" @@ -45,7 +45,7 @@ var AllConfigEntryKinds = []string{ TerminatingGateway, ServiceIntentions, MeshConfig, - ServiceExports, + PartitionExports, } // ConfigEntry is the interface for centralized configuration stored in Raft. @@ -532,8 +532,8 @@ func MakeConfigEntry(kind, name string) (ConfigEntry, error) { return &ServiceIntentionsConfigEntry{Name: name}, nil case MeshConfig: return &MeshConfigEntry{}, nil - case ServiceExports: - return &ServiceExportsConfigEntry{Partition: name}, nil + case PartitionExports: + return &PartitionExportsConfigEntry{Name: name}, nil default: return nil, fmt.Errorf("invalid config entry kind: %s", kind) } diff --git a/agent/structs/config_entry_exports.go b/agent/structs/config_entry_exports.go index 5b06983009..48490b6ca5 100644 --- a/agent/structs/config_entry_exports.go +++ b/agent/structs/config_entry_exports.go @@ -6,10 +6,10 @@ import ( "github.com/hashicorp/consul/acl" ) -// ServiceExportsConfigEntry is the top-level struct for exporting a service to be exposed +// PartitionExportsConfigEntry is the top-level struct for exporting a service to be exposed // across other admin partitions. -type ServiceExportsConfigEntry struct { - Partition string +type PartitionExportsConfigEntry struct { + Name string // Services is a list of services to be exported and the list of partitions // to expose them to. @@ -39,7 +39,7 @@ type ServiceConsumer struct { Partition string } -func (e *ServiceExportsConfigEntry) Clone() *ServiceExportsConfigEntry { +func (e *PartitionExportsConfigEntry) Clone() *PartitionExportsConfigEntry { e2 := *e e2.Services = make([]ExportedService, len(e.Services)) for _, svc := range e.Services { @@ -54,32 +54,30 @@ func (e *ServiceExportsConfigEntry) Clone() *ServiceExportsConfigEntry { return &e2 } -func (e *ServiceExportsConfigEntry) GetKind() string { - return ServiceExports +func (e *PartitionExportsConfigEntry) GetKind() string { + return PartitionExports } -func (e *ServiceExportsConfigEntry) GetName() string { +func (e *PartitionExportsConfigEntry) GetName() string { if e == nil { return "" } - return e.Partition + return e.Name } -func (e *ServiceExportsConfigEntry) GetMeta() map[string]string { +func (e *PartitionExportsConfigEntry) GetMeta() map[string]string { if e == nil { return nil } return e.Meta } -func (e *ServiceExportsConfigEntry) Normalize() error { +func (e *PartitionExportsConfigEntry) Normalize() error { if e == nil { return fmt.Errorf("config entry is nil") } - - meta := DefaultEnterpriseMetaInPartition(e.Partition) - e.EnterpriseMeta.Merge(meta) + e.EnterpriseMeta = *DefaultEnterpriseMetaInPartition(e.Name) e.EnterpriseMeta.Normalize() for i := range e.Services { @@ -89,12 +87,12 @@ func (e *ServiceExportsConfigEntry) Normalize() error { return nil } -func (e *ServiceExportsConfigEntry) Validate() error { - if e.Partition == "" { - return fmt.Errorf("Partition is required") +func (e *PartitionExportsConfigEntry) Validate() error { + if e.Name == "" { + return fmt.Errorf("Name is required") } - if e.Partition == WildcardSpecifier { - return fmt.Errorf("service-exports Partition must be the name of a partition, and not a wildcard") + if e.Name == WildcardSpecifier { + return fmt.Errorf("partition-exports Name must be the name of a partition, and not a wildcard") } validationErr := validateConfigEntryMeta(e.Meta) @@ -116,19 +114,19 @@ func (e *ServiceExportsConfigEntry) Validate() error { return validationErr } -func (e *ServiceExportsConfigEntry) CanRead(authz acl.Authorizer) bool { +func (e *PartitionExportsConfigEntry) CanRead(authz acl.Authorizer) bool { var authzContext acl.AuthorizerContext e.FillAuthzContext(&authzContext) return authz.MeshRead(&authzContext) == acl.Allow } -func (e *ServiceExportsConfigEntry) CanWrite(authz acl.Authorizer) bool { +func (e *PartitionExportsConfigEntry) CanWrite(authz acl.Authorizer) bool { var authzContext acl.AuthorizerContext e.FillAuthzContext(&authzContext) return authz.MeshWrite(&authzContext) == acl.Allow } -func (e *ServiceExportsConfigEntry) GetRaftIndex() *RaftIndex { +func (e *PartitionExportsConfigEntry) GetRaftIndex() *RaftIndex { if e == nil { return &RaftIndex{} } @@ -136,7 +134,7 @@ func (e *ServiceExportsConfigEntry) GetRaftIndex() *RaftIndex { return &e.RaftIndex } -func (e *ServiceExportsConfigEntry) GetEnterpriseMeta() *EnterpriseMeta { +func (e *PartitionExportsConfigEntry) GetEnterpriseMeta() *EnterpriseMeta { if e == nil { return nil } diff --git a/agent/structs/config_entry_test.go b/agent/structs/config_entry_test.go index 92202d5cc0..1711e8306b 100644 --- a/agent/structs/config_entry_test.go +++ b/agent/structs/config_entry_test.go @@ -1665,10 +1665,10 @@ func TestDecodeConfigEntry(t *testing.T) { }, }, { - name: "service-exports", + name: "partition-exports", snake: ` - kind = "service-exports" - partition = "foo" + kind = "partition-exports" + name = "foo" meta { "foo" = "bar" "gir" = "zim" @@ -1698,8 +1698,8 @@ func TestDecodeConfigEntry(t *testing.T) { ] `, camel: ` - Kind = "service-exports" - Partition = "foo" + Kind = "partition-exports" + Name = "foo" Meta { "foo" = "bar" "gir" = "zim" @@ -1728,8 +1728,8 @@ func TestDecodeConfigEntry(t *testing.T) { } ] `, - expect: &ServiceExportsConfigEntry{ - Partition: "foo", + expect: &PartitionExportsConfigEntry{ + Name: "foo", Meta: map[string]string{ "foo": "bar", "gir": "zim", @@ -1757,7 +1757,6 @@ func TestDecodeConfigEntry(t *testing.T) { }, }, }, - EnterpriseMeta: NewEnterpriseMetaWithPartition("foo", ""), }, }, } { diff --git a/api/config_entry.go b/api/config_entry.go index db231735c2..dc6646f442 100644 --- a/api/config_entry.go +++ b/api/config_entry.go @@ -22,7 +22,7 @@ const ( TerminatingGateway string = "terminating-gateway" ServiceIntentions string = "service-intentions" MeshConfig string = "mesh" - ServiceExports string = "service-exports" + PartitionExports string = "partition-exports" ProxyConfigGlobal string = "global" MeshConfigMesh string = "mesh" @@ -277,8 +277,8 @@ func makeConfigEntry(kind, name string) (ConfigEntry, error) { return &ServiceIntentionsConfigEntry{Kind: kind, Name: name}, nil case MeshConfig: return &MeshConfigEntry{}, nil - case ServiceExports: - return &ServiceExportsConfigEntry{Partition: name}, nil + case PartitionExports: + return &PartitionExportsConfigEntry{Name: name}, nil default: return nil, fmt.Errorf("invalid config entry kind: %s", kind) } diff --git a/api/config_entry_exports.go b/api/config_entry_exports.go index d2b68eeae5..0b66501074 100644 --- a/api/config_entry_exports.go +++ b/api/config_entry_exports.go @@ -2,10 +2,15 @@ package api import "encoding/json" -// ServiceExportsConfigEntry manages the exported services for a single admin partition. +// PartitionExportsConfigEntry manages the exported services for a single admin partition. // Admin Partitions are a Consul Enterprise feature. -type ServiceExportsConfigEntry struct { - // Partition is the partition the ServiceExportsConfigEntry applies to. +type PartitionExportsConfigEntry struct { + // Name is the name of the partition the PartitionExportsConfigEntry applies to. + // Partitioning is a Consul Enterprise feature. + Name string `json:",omitempty"` + + // Partition is the partition where the PartitionExportsConfigEntry is stored. + // If the partition does not match the name, the name will overwrite the partition. // Partitioning is a Consul Enterprise feature. Partition string `json:",omitempty"` @@ -44,23 +49,23 @@ type ServiceConsumer struct { Partition string } -func (e *ServiceExportsConfigEntry) GetKind() string { return ServiceExports } -func (e *ServiceExportsConfigEntry) GetName() string { return e.Partition } -func (e *ServiceExportsConfigEntry) GetPartition() string { return e.Partition } -func (e *ServiceExportsConfigEntry) GetNamespace() string { return IntentionDefaultNamespace } -func (e *ServiceExportsConfigEntry) GetMeta() map[string]string { return e.Meta } -func (e *ServiceExportsConfigEntry) GetCreateIndex() uint64 { return e.CreateIndex } -func (e *ServiceExportsConfigEntry) GetModifyIndex() uint64 { return e.ModifyIndex } +func (e *PartitionExportsConfigEntry) GetKind() string { return PartitionExports } +func (e *PartitionExportsConfigEntry) GetName() string { return e.Name } +func (e *PartitionExportsConfigEntry) GetPartition() string { return e.Name } +func (e *PartitionExportsConfigEntry) GetNamespace() string { return IntentionDefaultNamespace } +func (e *PartitionExportsConfigEntry) GetMeta() map[string]string { return e.Meta } +func (e *PartitionExportsConfigEntry) GetCreateIndex() uint64 { return e.CreateIndex } +func (e *PartitionExportsConfigEntry) GetModifyIndex() uint64 { return e.ModifyIndex } // MarshalJSON adds the Kind field so that the JSON can be decoded back into the // correct type. -func (e *ServiceExportsConfigEntry) MarshalJSON() ([]byte, error) { - type Alias ServiceExportsConfigEntry +func (e *PartitionExportsConfigEntry) MarshalJSON() ([]byte, error) { + type Alias PartitionExportsConfigEntry source := &struct { Kind string *Alias }{ - Kind: ServiceExports, + Kind: PartitionExports, Alias: (*Alias)(e), } return json.Marshal(source) diff --git a/command/config/write/config_write_test.go b/command/config/write/config_write_test.go index 6496f837ae..5e145b51f8 100644 --- a/command/config/write/config_write_test.go +++ b/command/config/write/config_write_test.go @@ -2722,10 +2722,10 @@ func TestParseConfigEntry(t *testing.T) { }, }, { - name: "service-exports", + name: "partition-exports", snake: ` - kind = "service-exports" - partition = "foo" + kind = "partition-exports" + name = "foo" meta { "foo" = "bar" "gir" = "zim" @@ -2755,8 +2755,8 @@ func TestParseConfigEntry(t *testing.T) { ] `, camel: ` - Kind = "service-exports" - Partition = "foo" + Kind = "partition-exports" + Name = "foo" Meta { "foo" = "bar" "gir" = "zim" @@ -2787,8 +2787,8 @@ func TestParseConfigEntry(t *testing.T) { `, snakeJSON: ` { - "kind": "service-exports", - "partition": "foo", + "kind": "partition-exports", + "name": "foo", "meta": { "foo": "bar", "gir": "zim" @@ -2820,8 +2820,8 @@ func TestParseConfigEntry(t *testing.T) { `, camelJSON: ` { - "Kind": "service-exports", - "Partition": "foo", + "Kind": "partition-exports", + "Name": "foo", "Meta": { "foo": "bar", "gir": "zim" @@ -2851,8 +2851,8 @@ func TestParseConfigEntry(t *testing.T) { ] } `, - expect: &api.ServiceExportsConfigEntry{ - Partition: "foo", + expect: &api.PartitionExportsConfigEntry{ + Name: "foo", Meta: map[string]string{ "foo": "bar", "gir": "zim",