Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions pkg/apis/serving/v1alpha1/route_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package v1alpha1

import (
"encoding/json"
"fmt"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -206,3 +207,76 @@ func (rs *RouteStatus) RemoveCondition(t RouteConditionType) {
}
rs.Conditions = conditions
}

func (rs *RouteStatus) InitializeConditions() {
if rc := rs.GetCondition(RouteConditionAllTrafficAssigned); rc == nil {
rs.SetCondition(&RouteCondition{
Type: RouteConditionAllTrafficAssigned,
Status: corev1.ConditionUnknown,
})
}
if rc := rs.GetCondition(RouteConditionIngressReady); rc == nil {
rs.SetCondition(&RouteCondition{
Type: RouteConditionIngressReady,
Status: corev1.ConditionUnknown,
})
}
if rc := rs.GetCondition(RouteConditionReady); rc == nil {
rs.SetCondition(&RouteCondition{
Type: RouteConditionReady,
Status: corev1.ConditionUnknown,
})
}
}

func (rs *RouteStatus) MarkTrafficAssigned() {
rs.SetCondition(&RouteCondition{
Type: RouteConditionAllTrafficAssigned,
Status: corev1.ConditionTrue,
})
rs.checkAndMarkReady()
}

func (rs *RouteStatus) MarkTrafficNotAssigned(kind, name string) {
reason := kind + "Missing"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Doing this makes it difficult to grep for e.g. "RevisionMissing" if I'm trying to debug what's going on.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(surfacing offline convo) We don't expect "Reason" to have limited cardinality, or this would be an enumeration and we'd simply pass in the appropriate constant (like "Type"). Ack the grep difficulty, but I'm biasing towards not duplicating such sparsely used code.

msg := fmt.Sprintf("Referenced %s %q not found", kind, name)
rs.SetCondition(&RouteCondition{
Type: RouteConditionAllTrafficAssigned,
Status: corev1.ConditionFalse,
Reason: reason,
Message: msg,
})
rs.SetCondition(&RouteCondition{
Type: RouteConditionReady,
Status: corev1.ConditionFalse,
Reason: reason,
Message: msg,
})
}

func (rs *RouteStatus) MarkIngressReady() {
rs.SetCondition(&RouteCondition{
Type: RouteConditionIngressReady,
Status: corev1.ConditionTrue,
})
rs.checkAndMarkReady()
}

func (rs *RouteStatus) checkAndMarkReady() {
ata := rs.GetCondition(RouteConditionAllTrafficAssigned)
if ata == nil || ata.Status != corev1.ConditionTrue {
return
}
ir := rs.GetCondition(RouteConditionIngressReady)
if ir == nil || ir.Status != corev1.ConditionTrue {
return
}
rs.markReady()
}

func (rs *RouteStatus) markReady() {
rs.SetCondition(&RouteCondition{
Type: RouteConditionReady,
Status: corev1.ConditionTrue,
})
}
101 changes: 6 additions & 95 deletions pkg/controller/route/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ func (c *Controller) updateRouteEvent(key string) error {
}
// Don't modify the informers copy
route = route.DeepCopy()
addMissingConditions(route)
route.Status.InitializeConditions()

logger.Infof("Reconciling route :%v", route)

Expand Down Expand Up @@ -318,95 +318,6 @@ func (c *Controller) reconcileIngress(ctx context.Context, route *v1alpha1.Route
return nil
}

func addMissingConditions(route *v1alpha1.Route) {
if rc := route.Status.GetCondition(v1alpha1.RouteConditionAllTrafficAssigned); rc == nil {
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionAllTrafficAssigned,
Status: corev1.ConditionUnknown,
})
}
if rc := route.Status.GetCondition(v1alpha1.RouteConditionIngressReady); rc == nil {
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionIngressReady,
Status: corev1.ConditionUnknown,
})
}
if rc := route.Status.GetCondition(v1alpha1.RouteConditionReady); rc == nil {
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionReady,
Status: corev1.ConditionUnknown,
})
}
}

func markRouteTrafficAssigned(route *v1alpha1.Route) {
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionAllTrafficAssigned,
Status: corev1.ConditionTrue,
})
checkAndMarkReady(route)
}

func markRouteIngressReady(route *v1alpha1.Route) {
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionIngressReady,
Status: corev1.ConditionTrue,
})
checkAndMarkReady(route)
}

func checkAndMarkReady(route *v1alpha1.Route) {
ata := route.Status.GetCondition(v1alpha1.RouteConditionAllTrafficAssigned)
if ata == nil || ata.Status != corev1.ConditionTrue {
return
}
ir := route.Status.GetCondition(v1alpha1.RouteConditionIngressReady)
if ir == nil || ir.Status != corev1.ConditionTrue {
return
}
markRouteReady(route)
}

func markRouteReady(route *v1alpha1.Route) {
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionReady,
Status: corev1.ConditionTrue,
})
}

func markConfigurationMissingCondition(route *v1alpha1.Route, configName string) {
msg := fmt.Sprintf("Configuration '%s' referenced in traffic not found", configName)
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionAllTrafficAssigned,
Status: corev1.ConditionFalse,
Reason: "ConfigurationMissing",
Message: msg,
})
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionReady,
Status: corev1.ConditionFalse,
Reason: "ConfigurationMissing",
Message: msg,
})
}

// TODO: Remove missing Revision from traffic in status?
func markRevisionMissingCondition(route *v1alpha1.Route, revName string) {
msg := fmt.Sprintf("Revision '%s' referenced in traffic not found", revName)
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionAllTrafficAssigned,
Status: corev1.ConditionFalse,
Reason: "RevisionMissing",
Message: msg,
})
route.Status.SetCondition(&v1alpha1.RouteCondition{
Type: v1alpha1.RouteConditionReady,
Status: corev1.ConditionFalse,
Reason: "RevisionMissing",
Message: msg,
})
}

func (c *Controller) getDirectTrafficTargets(ctx context.Context, route *v1alpha1.Route) (
map[string]*v1alpha1.Configuration, map[string]*v1alpha1.Revision, error) {
logger := logging.FromContext(ctx)
Expand All @@ -423,7 +334,7 @@ func (c *Controller) getDirectTrafficTargets(ctx context.Context, route *v1alpha
if err != nil {
logger.Infof("Failed to fetch Configuration %q: %v", configName, err)
if apierrs.IsNotFound(err) {
markConfigurationMissingCondition(route, configName)
route.Status.MarkTrafficNotAssigned("Configuration", configName)
if _, err := c.updateStatus(ctx, route); err != nil {
// If we failed to update the status, return that error instead of the "config not found" error.
return nil, nil, err
Expand All @@ -438,7 +349,7 @@ func (c *Controller) getDirectTrafficTargets(ctx context.Context, route *v1alpha
if err != nil {
logger.Infof("Failed to fetch Revision %q: %v", revName, err)
if apierrs.IsNotFound(err) {
markRevisionMissingCondition(route, revName)
route.Status.MarkTrafficNotAssigned("Revision", revName)
if _, err := c.updateStatus(ctx, route); err != nil {
// If we failed to update the status, return that error instead of the "revision not found" error.
return nil, nil, err
Expand All @@ -449,7 +360,7 @@ func (c *Controller) getDirectTrafficTargets(ctx context.Context, route *v1alpha
revMap[revName] = rev
}
}
markRouteTrafficAssigned(route)
route.Status.MarkTrafficAssigned()

return configMap, revMap, nil
}
Expand Down Expand Up @@ -504,7 +415,7 @@ func (c *Controller) extendRevisionsWithIndirectTrafficTargets(
if err != nil {
logger.Errorf("Failed to fetch Revision %s: %s", revName, err)
if apierrs.IsNotFound(err) {
markRevisionMissingCondition(route, revName)
route.Status.MarkTrafficNotAssigned("Revision", revName)
if _, err := c.updateStatus(ctx, route); err != nil {
// If we failed to update the status, return that error instead of the "revision not found" error.
return err
Expand Down Expand Up @@ -1066,7 +977,7 @@ func (c *Controller) updateIngressEvent(old, new interface{}) {
if route.Status.IsReady() {
return
}
markRouteIngressReady(route)
route.Status.MarkIngressReady()

logger := loggerWithRouteInfo(c.Logger, ns, routeName)
ctx := logging.WithLogger(context.TODO(), logger)
Expand Down
8 changes: 4 additions & 4 deletions pkg/controller/route/route_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1248,15 +1248,15 @@ func TestCreateRouteRevisionMissingCondition(t *testing.T) {
Type: v1alpha1.RouteConditionAllTrafficAssigned,
Status: corev1.ConditionFalse,
Reason: "RevisionMissing",
Message: "Revision 'does-not-exist' referenced in traffic not found",
Message: `Referenced Revision "does-not-exist" not found`,
}, {
Type: v1alpha1.RouteConditionIngressReady,
Status: corev1.ConditionUnknown,
}, {
Type: v1alpha1.RouteConditionReady,
Status: corev1.ConditionFalse,
Reason: "RevisionMissing",
Message: "Revision 'does-not-exist' referenced in traffic not found",
Message: `Referenced Revision "does-not-exist" not found`,
}}
newRoute, _ := elaClient.ServingV1alpha1().Routes(route.Namespace).Get(route.Name, metav1.GetOptions{})
if diff := cmp.Diff(expectedConditions, newRoute.Status.Conditions, cmpopts.SortSlices(sortConditions)); diff != "" {
Expand Down Expand Up @@ -1297,15 +1297,15 @@ func TestCreateRouteConfigurationMissingCondition(t *testing.T) {
Type: v1alpha1.RouteConditionAllTrafficAssigned,
Status: corev1.ConditionFalse,
Reason: "ConfigurationMissing",
Message: "Configuration 'does-not-exist' referenced in traffic not found",
Message: `Referenced Configuration "does-not-exist" not found`,
}, {
Type: v1alpha1.RouteConditionIngressReady,
Status: corev1.ConditionUnknown,
}, {
Type: v1alpha1.RouteConditionReady,
Status: corev1.ConditionFalse,
Reason: "ConfigurationMissing",
Message: "Configuration 'does-not-exist' referenced in traffic not found",
Message: `Referenced Configuration "does-not-exist" not found`,
}}
newRoute, _ := elaClient.ServingV1alpha1().Routes(route.Namespace).Get(route.Name, metav1.GetOptions{})
if diff := cmp.Diff(expectedConditions, newRoute.Status.Conditions, cmpopts.SortSlices(sortConditions)); diff != "" {
Expand Down