Skip to content

Commit

Permalink
ServiceRouter support (hashicorp#332)
Browse files Browse the repository at this point in the history
* ServiceRouter support

* controllers => controller for logger name
  • Loading branch information
lkysow authored Sep 29, 2020
1 parent bd17a55 commit 90b9c80
Show file tree
Hide file tree
Showing 32 changed files with 2,119 additions and 168 deletions.
1 change: 1 addition & 0 deletions api/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const (
ServiceDefaults string = "servicedefaults"
ProxyDefaults string = "proxydefaults"
ServiceResolver string = "serviceresolver"
ServiceRouter string = "servicerouter"

Global string = "global"
DefaultConsulNamespace string = "default"
Expand Down
21 changes: 13 additions & 8 deletions api/v1alpha1/servicedefaults_types.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package v1alpha1

import (
"strings"

capi "github.com/hashicorp/consul/api"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -58,14 +56,14 @@ func (in *ServiceDefaults) GetObjectMeta() metav1.ObjectMeta {
return in.ObjectMeta
}

func (in *ServiceDefaults) AddFinalizer(f string) {
in.ObjectMeta.Finalizers = append(in.Finalizers(), f)
func (in *ServiceDefaults) AddFinalizer(name string) {
in.ObjectMeta.Finalizers = append(in.Finalizers(), name)
}

func (in *ServiceDefaults) RemoveFinalizer(f string) {
func (in *ServiceDefaults) RemoveFinalizer(name string) {
var newFinalizers []string
for _, oldF := range in.Finalizers() {
if oldF != f {
if oldF != name {
newFinalizers = append(newFinalizers, oldF)
}
}
Expand Down Expand Up @@ -94,11 +92,18 @@ func (in *ServiceDefaults) SetSyncedCondition(status corev1.ConditionStatus, rea

func (in *ServiceDefaults) SyncedCondition() (status corev1.ConditionStatus, reason string, message string) {
cond := in.Status.GetCondition(ConditionSynced)
if cond == nil {
return corev1.ConditionUnknown, "", ""
}
return cond.Status, cond.Reason, cond.Message
}

func (in *ServiceDefaults) SyncedConditionStatus() corev1.ConditionStatus {
return in.Status.GetCondition(ConditionSynced).Status
condition := in.Status.GetCondition(ConditionSynced)
if condition == nil {
return corev1.ConditionUnknown
}
return condition.Status
}

// +kubebuilder:object:root=true
Expand Down Expand Up @@ -236,7 +241,7 @@ func (e ExposeConfig) validate(path *field.Path) []*field.Error {
protocols := []string{"http", "http2"}
for i, pathCfg := range e.Paths {
indexPath := path.Child("paths").Index(i)
if pathCfg.Path != "" && !strings.HasPrefix(pathCfg.Path, "/") {
if invalidPathPrefix(pathCfg.Path) {
errs = append(errs, field.Invalid(
indexPath.Child("path"),
pathCfg.Path,
Expand Down
36 changes: 32 additions & 4 deletions api/v1alpha1/servicedefaults_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -807,8 +807,36 @@ func TestServiceDefaults_GetSyncedConditionStatus(t *testing.T) {
}
}

// Test that if status is empty then GetCondition returns nil.
func TestServiceDefaults_GetConditionWhenNil(t *testing.T) {
serviceDefaults := &ServiceDefaults{}
require.Nil(t, serviceDefaults.GetCondition(ConditionSynced))
func TestServiceDefaults_GetConditionWhenStatusNil(t *testing.T) {
require.Nil(t, (&ServiceDefaults{}).GetCondition(ConditionSynced))
}

func TestServiceDefaults_SyncedConditionStatusWhenStatusNil(t *testing.T) {
require.Equal(t, corev1.ConditionUnknown, (&ServiceDefaults{}).SyncedConditionStatus())
}

func TestServiceDefaults_SyncedConditionWhenStatusNil(t *testing.T) {
status, reason, message := (&ServiceDefaults{}).SyncedCondition()
require.Equal(t, corev1.ConditionUnknown, status)
require.Equal(t, "", reason)
require.Equal(t, "", message)
}

func TestServiceDefaults_ConsulKind(t *testing.T) {
require.Equal(t, capi.ServiceDefaults, (&ServiceDefaults{}).ConsulKind())
}

func TestServiceDefaults_KubeKind(t *testing.T) {
require.Equal(t, "servicedefaults", (&ServiceDefaults{}).KubeKind())
}

func TestServiceDefaults_ObjectMeta(t *testing.T) {
meta := metav1.ObjectMeta{
Name: "name",
Namespace: "namespace",
}
serviceDefaults := &ServiceDefaults{
ObjectMeta: meta,
}
require.Equal(t, meta, serviceDefaults.GetObjectMeta())
}
9 changes: 8 additions & 1 deletion api/v1alpha1/serviceresolver_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,18 @@ func (in *ServiceResolver) SetSyncedCondition(status corev1.ConditionStatus, rea

func (in *ServiceResolver) SyncedCondition() (status corev1.ConditionStatus, reason string, message string) {
cond := in.Status.GetCondition(ConditionSynced)
if cond == nil {
return corev1.ConditionUnknown, "", ""
}
return cond.Status, cond.Reason, cond.Message
}

func (in *ServiceResolver) SyncedConditionStatus() corev1.ConditionStatus {
return in.Status.GetCondition(ConditionSynced).Status
condition := in.Status.GetCondition(ConditionSynced)
if condition == nil {
return corev1.ConditionUnknown
}
return condition.Status
}

// ToConsul converts the entry into its Consul equivalent struct.
Expand Down
36 changes: 32 additions & 4 deletions api/v1alpha1/serviceresolver_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -503,10 +503,38 @@ func TestServiceResolver_GetSyncedConditionStatus(t *testing.T) {
}
}

// Test that if status is empty then GetCondition returns nil.
func TestServiceResolver_GetConditionWhenNil(t *testing.T) {
serviceResolver := &ServiceResolver{}
require.Nil(t, serviceResolver.GetCondition(ConditionSynced))
func TestServiceResolver_GetConditionWhenStatusNil(t *testing.T) {
require.Nil(t, (&ServiceResolver{}).GetCondition(ConditionSynced))
}

func TestServiceResolver_SyncedConditionStatusWhenStatusNil(t *testing.T) {
require.Equal(t, corev1.ConditionUnknown, (&ServiceResolver{}).SyncedConditionStatus())
}

func TestServiceResolver_SyncedConditionWhenStatusNil(t *testing.T) {
status, reason, message := (&ServiceResolver{}).SyncedCondition()
require.Equal(t, corev1.ConditionUnknown, status)
require.Equal(t, "", reason)
require.Equal(t, "", message)
}

func TestServiceResolver_ConsulKind(t *testing.T) {
require.Equal(t, capi.ServiceResolver, (&ServiceResolver{}).ConsulKind())
}

func TestServiceResolver_KubeKind(t *testing.T) {
require.Equal(t, "serviceresolver", (&ServiceResolver{}).KubeKind())
}

func TestServiceResolver_ObjectMeta(t *testing.T) {
meta := metav1.ObjectMeta{
Name: "name",
Namespace: "namespace",
}
serviceResolver := &ServiceResolver{
ObjectMeta: meta,
}
require.Equal(t, meta, serviceResolver.GetObjectMeta())
}

func TestServiceResolver_Validate(t *testing.T) {
Expand Down
3 changes: 1 addition & 2 deletions api/v1alpha1/serviceresolver_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ type ServiceResolverValidator struct {
// If it is updated, run code-gen, update subcommand/controller/command.go
// and the consul-helm value for the path to the webhook.
//
// NOTE: The below line cannot be combined with any other comment. If it is
// it will break the code generation.
// NOTE: The below line cannot be combined with any other comment. If it is it will break the code generation.
//
// +kubebuilder:webhook:verbs=create;update,path=/mutate-v1alpha1-serviceresolver,mutating=true,failurePolicy=fail,groups=consul.hashicorp.com,resources=serviceresolvers,versions=v1alpha1,name=mutate-serviceresolver.consul.hashicorp.com

Expand Down
Loading

0 comments on commit 90b9c80

Please sign in to comment.