blob: b2dc9460fd3aa6cd3d155964eda87b287a348b4f [file] [log] [blame]
package mesh
import (
"fmt"
"regexp"
"strconv"
"strings"
"time"
)
import (
mesh_proto "github.com/apache/dubbo-kubernetes/api/mesh/v1alpha1"
)
func (m *MeshResource) HasPrometheusMetricsEnabled() bool {
return m != nil && m.GetEnabledMetricsBackend().GetType() == mesh_proto.MetricsPrometheusType
}
func (m *MeshResource) GetEnabledMetricsBackend() *mesh_proto.MetricsBackend {
// TODO: support this!
return nil
}
func (m *MeshResource) GetMetricsBackend(name string) *mesh_proto.MetricsBackend {
// TODO: support this!
return nil
}
func (m *MeshResource) MTLSEnabled() bool {
return m != nil && m.Spec.GetMtls().GetEnabledBackend() != ""
}
// ZoneEgress works only when mTLS is enabled.
// Configuration of mTLS is validated on Mesh configuration
// change and when zoneEgress is enabled.
func (m *MeshResource) ZoneEgressEnabled() bool {
return m != nil && m.Spec.GetRouting().GetZoneEgress()
}
func (m *MeshResource) LocalityAwareLbEnabled() bool {
return m != nil && m.Spec.GetRouting().GetLocalityAwareLoadBalancing()
}
func (m *MeshResource) GetLoggingBackend(name string) *mesh_proto.LoggingBackend {
backends := map[string]*mesh_proto.LoggingBackend{}
for _, backend := range m.Spec.GetLogging().GetBackends() {
backends[backend.Name] = backend
}
if name == "" {
return backends[m.Spec.GetLogging().GetDefaultBackend()]
}
return backends[name]
}
func (m *MeshResource) GetTracingBackend(name string) *mesh_proto.TracingBackend {
backends := map[string]*mesh_proto.TracingBackend{}
for _, backend := range m.Spec.GetTracing().GetBackends() {
backends[backend.Name] = backend
}
if name == "" {
return backends[m.Spec.GetTracing().GetDefaultBackend()]
}
return backends[name]
}
// GetLoggingBackends will return logging backends as comma separated strings
// if empty return empty string
func (m *MeshResource) GetLoggingBackends() string {
var backends []string
for _, backend := range m.Spec.GetLogging().GetBackends() {
backend := fmt.Sprintf("%s/%s", backend.GetType(), backend.GetName())
backends = append(backends, backend)
}
return strings.Join(backends, ", ")
}
// GetTracingBackends will return tracing backends as comma separated strings
// if empty return empty string
func (m *MeshResource) GetTracingBackends() string {
var backends []string
for _, backend := range m.Spec.GetTracing().GetBackends() {
backend := fmt.Sprintf("%s/%s", backend.GetType(), backend.GetName())
backends = append(backends, backend)
}
return strings.Join(backends, ", ")
}
func (m *MeshResource) GetEnabledCertificateAuthorityBackend() *mesh_proto.CertificateAuthorityBackend {
return m.GetCertificateAuthorityBackend(m.Spec.GetMtls().GetEnabledBackend())
}
func (m *MeshResource) GetCertificateAuthorityBackend(name string) *mesh_proto.CertificateAuthorityBackend {
for _, backend := range m.Spec.GetMtls().GetBackends() {
if backend.Name == name {
return backend
}
}
return nil
}
var durationRE = regexp.MustCompile("^([0-9]+)(y|w|d|h|m|s|ms)$")
// ParseDuration parses a string into a time.Duration
func ParseDuration(durationStr string) (time.Duration, error) {
// Allow 0 without a unit.
if durationStr == "0" {
return 0, nil
}
matches := durationRE.FindStringSubmatch(durationStr)
if len(matches) != 3 {
return 0, fmt.Errorf("not a valid duration string: %q", durationStr)
}
var (
n, _ = strconv.Atoi(matches[1])
dur = time.Duration(n) * time.Millisecond
)
switch unit := matches[2]; unit {
case "y":
dur *= 1000 * 60 * 60 * 24 * 365
case "w":
dur *= 1000 * 60 * 60 * 24 * 7
case "d":
dur *= 1000 * 60 * 60 * 24
case "h":
dur *= 1000 * 60 * 60
case "m":
dur *= 1000 * 60
case "s":
dur *= 1000
case "ms":
// Value already correct
default:
return 0, fmt.Errorf("invalid time unit in duration string: %q", unit)
}
return dur, nil
}
func (ml *MeshResourceList) MarshalLog() interface{} {
maskedList := make([]*MeshResource, 0, len(ml.Items))
for _, mesh := range ml.Items {
maskedList = append(maskedList, mesh.MarshalLog().(*MeshResource))
}
return MeshResourceList{
Items: maskedList,
Pagination: ml.Pagination,
}
}
func (m *MeshResource) MarshalLog() interface{} {
// TODO: support this!
return nil
}