2023-08-11 13:12:13 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
|
2023-07-17 22:15:22 +00:00
|
|
|
package topology
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/api"
|
|
|
|
)
|
|
|
|
|
|
|
|
type NodeID struct {
|
|
|
|
Name string `json:",omitempty"`
|
|
|
|
Partition string `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewNodeID(name, partition string) NodeID {
|
|
|
|
id := NodeID{
|
|
|
|
Name: name,
|
|
|
|
Partition: partition,
|
|
|
|
}
|
|
|
|
id.Normalize()
|
|
|
|
return id
|
|
|
|
}
|
|
|
|
|
|
|
|
func (id *NodeID) Normalize() {
|
|
|
|
id.Partition = PartitionOrDefault(id.Partition)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (id NodeID) String() string {
|
|
|
|
return fmt.Sprintf("%s/%s", id.Partition, id.Name)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (id NodeID) ACLString() string {
|
|
|
|
return fmt.Sprintf("%s--%s", id.Partition, id.Name)
|
|
|
|
}
|
2023-11-02 19:25:48 +00:00
|
|
|
|
2023-07-17 22:15:22 +00:00
|
|
|
func (id NodeID) TFString() string {
|
|
|
|
return id.ACLString()
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
type ID struct {
|
2023-07-17 22:15:22 +00:00
|
|
|
Name string `json:",omitempty"`
|
|
|
|
Namespace string `json:",omitempty"`
|
|
|
|
Partition string `json:",omitempty"`
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func NewID(name, namespace, partition string) ID {
|
|
|
|
id := ID{
|
2023-07-17 22:15:22 +00:00
|
|
|
Name: name,
|
|
|
|
Namespace: namespace,
|
|
|
|
Partition: partition,
|
|
|
|
}
|
|
|
|
id.Normalize()
|
|
|
|
return id
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) Less(other ID) bool {
|
2023-07-17 22:15:22 +00:00
|
|
|
if id.Partition != other.Partition {
|
|
|
|
return id.Partition < other.Partition
|
|
|
|
}
|
|
|
|
if id.Namespace != other.Namespace {
|
|
|
|
return id.Namespace < other.Namespace
|
|
|
|
}
|
|
|
|
return id.Name < other.Name
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id *ID) Normalize() {
|
2023-07-17 22:15:22 +00:00
|
|
|
id.Namespace = NamespaceOrDefault(id.Namespace)
|
|
|
|
id.Partition = PartitionOrDefault(id.Partition)
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) String() string {
|
2023-07-17 22:15:22 +00:00
|
|
|
return fmt.Sprintf("%s/%s/%s", id.Partition, id.Namespace, id.Name)
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) ACLString() string {
|
2023-07-17 22:15:22 +00:00
|
|
|
return fmt.Sprintf("%s--%s--%s", id.Partition, id.Namespace, id.Name)
|
|
|
|
}
|
2023-11-02 19:25:48 +00:00
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) TFString() string {
|
2023-07-17 22:15:22 +00:00
|
|
|
return id.ACLString()
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) PartitionOrDefault() string {
|
2023-11-02 19:25:48 +00:00
|
|
|
return PartitionOrDefault(id.Partition)
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) NamespaceOrDefault() string {
|
2023-11-02 19:25:48 +00:00
|
|
|
return NamespaceOrDefault(id.Namespace)
|
|
|
|
}
|
|
|
|
|
2023-11-10 19:22:06 +00:00
|
|
|
func (id ID) QueryOptions() *api.QueryOptions {
|
2023-11-07 16:11:42 +00:00
|
|
|
return &api.QueryOptions{
|
|
|
|
Partition: DefaultToEmpty(id.Partition),
|
|
|
|
Namespace: DefaultToEmpty(id.Namespace),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-07-17 22:15:22 +00:00
|
|
|
func PartitionOrDefault(name string) string {
|
|
|
|
if name == "" {
|
|
|
|
return "default"
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
2023-11-02 19:25:48 +00:00
|
|
|
|
2023-07-17 22:15:22 +00:00
|
|
|
func NamespaceOrDefault(name string) string {
|
|
|
|
if name == "" {
|
|
|
|
return "default"
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
|
|
|
func DefaultToEmpty(name string) string {
|
|
|
|
if name == "default" {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return name
|
|
|
|
}
|
|
|
|
|
|
|
|
// PartitionQueryOptions returns an *api.QueryOptions with the given partition
|
|
|
|
// field set only if the partition is non-default. This helps when writing
|
2023-08-22 14:46:03 +00:00
|
|
|
// tests for joint use in CE and ENT.
|
2023-07-17 22:15:22 +00:00
|
|
|
func PartitionQueryOptions(partition string) *api.QueryOptions {
|
|
|
|
return &api.QueryOptions{
|
|
|
|
Partition: DefaultToEmpty(partition),
|
|
|
|
}
|
|
|
|
}
|