Skip to content

Commit

Permalink
Make StatusManager zone-aware. It will only set accumulated status when
Browse files Browse the repository at this point in the history
all zones have reported their statuses.
To do so, ZoneTracker was added to StatusManager, which tracks
existing zones and notifies its subscriber about zones changes.
StatusManager will also cleanup status messages left by deleted zones.

Signed-off-by: Nadia Pinaeva <[email protected]>
  • Loading branch information
npinaeva committed Nov 23, 2023
1 parent cfb4377 commit 6c383e0
Show file tree
Hide file tree
Showing 13 changed files with 1,172 additions and 60 deletions.
48 changes: 33 additions & 15 deletions go-controller/pkg/clustermanager/status_manager/apbroute_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package status_manager

import (
"context"
"reflect"
"strings"

adminpolicybasedrouteapi "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/adminpolicybasedroute/v1"
Expand Down Expand Up @@ -30,28 +29,47 @@ func (m *apbRouteManager) get(namespace, name string) (*adminpolicybasedrouteapi
return m.lister.Get(name)
}

func (m *apbRouteManager) statusChanged(oldObj, newObj *adminpolicybasedrouteapi.AdminPolicyBasedExternalRoute) bool {
return !reflect.DeepEqual(oldObj.Status.Messages, newObj.Status.Messages)
func (m *apbRouteManager) getMessages(route *adminpolicybasedrouteapi.AdminPolicyBasedExternalRoute) []string {
return route.Status.Messages
}

func (m *apbRouteManager) updateStatus(route *adminpolicybasedrouteapi.AdminPolicyBasedExternalRoute, applyOpts *metav1.ApplyOptions) error {
if route == nil || len(route.Status.Messages) == 0 {
func (m *apbRouteManager) updateStatus(route *adminpolicybasedrouteapi.AdminPolicyBasedExternalRoute, applyOpts *metav1.ApplyOptions,
applyEmpty bool) error {
if route == nil {
return nil
}
newStatus := adminpolicybasedrouteapi.SuccessStatus
for _, message := range route.Status.Messages {
if strings.Contains(message, types.APBRouteErrorMsg) {
newStatus = adminpolicybasedrouteapi.FailStatus
break
var applyObj *adminpolicybasedrouteapply.AdminPolicyBasedExternalRouteApplyConfiguration
if applyEmpty {
if route.Status.Status == "" {
// already set to the same value
return nil
}
applyObj = adminpolicybasedrouteapply.AdminPolicyBasedExternalRoute(route.Name).
WithStatus(adminpolicybasedrouteapply.AdminPolicyBasedRouteStatus())
} else {
newStatus := adminpolicybasedrouteapi.SuccessStatus
for _, message := range route.Status.Messages {
if strings.Contains(message, types.APBRouteErrorMsg) {
newStatus = adminpolicybasedrouteapi.FailStatus
break
}
}
if route.Status.Status == newStatus {
// already set to the same value
return nil
}
applyObj = adminpolicybasedrouteapply.AdminPolicyBasedExternalRoute(route.Name).
WithStatus(adminpolicybasedrouteapply.AdminPolicyBasedRouteStatus().
WithStatus(newStatus))
}
if route.Status.Status == newStatus {
return nil
}

_, err := m.client.K8sV1().AdminPolicyBasedExternalRoutes().ApplyStatus(context.TODO(), applyObj, *applyOpts)
return err
}

func (m *apbRouteManager) cleanupStatus(route *adminpolicybasedrouteapi.AdminPolicyBasedExternalRoute, applyOpts *metav1.ApplyOptions) error {
applyObj := adminpolicybasedrouteapply.AdminPolicyBasedExternalRoute(route.Name).
WithStatus(adminpolicybasedrouteapply.AdminPolicyBasedRouteStatus().
WithStatus(newStatus))
WithStatus(adminpolicybasedrouteapply.AdminPolicyBasedRouteStatus())
_, err := m.client.K8sV1().AdminPolicyBasedExternalRoutes().ApplyStatus(context.TODO(), applyObj, *applyOpts)
return err
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package status_manager

import (
"context"
"reflect"
"strings"

egressfirewallapi "github.com/ovn-org/ovn-kubernetes/go-controller/pkg/crd/egressfirewall/v1"
Expand Down Expand Up @@ -30,28 +29,50 @@ func (m *egressFirewallManager) get(namespace, name string) (*egressfirewallapi.
return m.lister.EgressFirewalls(namespace).Get(name)
}

func (m *egressFirewallManager) statusChanged(oldObj, newObj *egressfirewallapi.EgressFirewall) bool {
return !reflect.DeepEqual(oldObj.Status.Messages, newObj.Status.Messages)
func (m *egressFirewallManager) getMessages(egressFirewall *egressfirewallapi.EgressFirewall) []string {
return egressFirewall.Status.Messages
}

func (m *egressFirewallManager) updateStatus(egressFirewall *egressfirewallapi.EgressFirewall, applyOpts *metav1.ApplyOptions) error {
if egressFirewall == nil || len(egressFirewall.Status.Messages) == 0 {
func (m *egressFirewallManager) updateStatus(egressFirewall *egressfirewallapi.EgressFirewall, applyOpts *metav1.ApplyOptions,
applyEmpty bool) error {
if egressFirewall == nil {
return nil
}
newStatus := "EgressFirewall Rules applied"
for _, message := range egressFirewall.Status.Messages {
if strings.Contains(message, types.EgressFirewallApplyError) {
newStatus = types.EgressFirewallApplyError
break

var applyObj *egressfirewallapply.EgressFirewallApplyConfiguration
if applyEmpty {
if egressFirewall.Status.Status == "" {
// already set to the same value
return nil
}
}
if egressFirewall.Status.Status == newStatus {
return nil
applyObj = egressfirewallapply.EgressFirewall(egressFirewall.Name, egressFirewall.Namespace).
WithStatus(egressfirewallapply.EgressFirewallStatus())
} else {
newStatus := "EgressFirewall Rules applied"
for _, message := range egressFirewall.Status.Messages {
if strings.Contains(message, types.EgressFirewallApplyError) {
newStatus = types.EgressFirewallApplyError
break
}
}
if egressFirewall.Status.Status == newStatus {
// already set to the same value
return nil
}

applyObj = egressfirewallapply.EgressFirewall(egressFirewall.Name, egressFirewall.Namespace).
WithStatus(egressfirewallapply.EgressFirewallStatus().
WithStatus(newStatus))
}

_, err := m.client.K8sV1().EgressFirewalls(egressFirewall.Namespace).ApplyStatus(context.TODO(), applyObj, *applyOpts)
return err
}

func (m *egressFirewallManager) cleanupStatus(egressFirewall *egressfirewallapi.EgressFirewall, applyOpts *metav1.ApplyOptions) error {
applyObj := egressfirewallapply.EgressFirewall(egressFirewall.Name, egressFirewall.Namespace).
WithStatus(egressfirewallapply.EgressFirewallStatus().
WithStatus(newStatus))
WithStatus(egressfirewallapply.EgressFirewallStatus())

_, err := m.client.K8sV1().EgressFirewalls(egressFirewall.Namespace).ApplyStatus(context.TODO(), applyObj, *applyOpts)
return err
}
Loading

0 comments on commit 6c383e0

Please sign in to comment.