in controllers/daemon/staticgatewayconfiguration_controller.go [1036:1116]
func (r *StaticGatewayConfigurationReconciler) updateGatewayNodeStatus(
ctx context.Context,
gwConfig egressgatewayv1alpha1.GatewayConfiguration,
add bool,
) error {
log := log.FromContext(ctx)
gwStatusKey := types.NamespacedName{
Namespace: os.Getenv(consts.PodNamespaceEnvKey),
Name: os.Getenv(consts.NodeNameEnvKey),
}
gwStatus := &egressgatewayv1alpha1.GatewayStatus{}
if err := r.Get(ctx, gwStatusKey, gwStatus); err != nil {
if !apierrors.IsNotFound(err) {
log.Error(err, "failed to get existing gateway status object %s/%s", gwStatusKey.Namespace, gwStatusKey.Name)
return err
} else {
if !add {
// ignore creating object during cleanup
return nil
}
// gwStatus does not exist, create a new one
log.Info(fmt.Sprintf("Creating new gateway status(%s/%s)", gwStatusKey.Namespace, gwStatusKey.Name))
node := &corev1.Node{}
if err := r.Get(ctx, types.NamespacedName{Name: os.Getenv(consts.NodeNameEnvKey)}, node); err != nil {
return fmt.Errorf("failed to get current node: %w", err)
}
gwStatus := &egressgatewayv1alpha1.GatewayStatus{
ObjectMeta: metav1.ObjectMeta{
Name: gwStatusKey.Name,
Namespace: gwStatusKey.Namespace,
},
Spec: egressgatewayv1alpha1.GatewayStatusSpec{
ReadyGatewayConfigurations: []egressgatewayv1alpha1.GatewayConfiguration{gwConfig},
},
}
if err := controllerutil.SetOwnerReference(node, gwStatus, r.Client.Scheme()); err != nil {
return fmt.Errorf("failed to set gwStatus owner reference to node: %w", err)
}
log.Info("Creating new gateway status object")
if err := r.Create(ctx, gwStatus); err != nil {
return fmt.Errorf("failed to create gwStatus object: %w", err)
}
}
} else {
changed := false
found := false
for i, gwConf := range gwStatus.Spec.ReadyGatewayConfigurations {
if gwConf.InterfaceName == gwConfig.InterfaceName {
if !add {
changed = true
gwStatus.Spec.ReadyGatewayConfigurations = append(gwStatus.Spec.ReadyGatewayConfigurations[:i], gwStatus.Spec.ReadyGatewayConfigurations[i+1:]...)
}
found = true
break
}
}
if add && !found {
gwStatus.Spec.ReadyGatewayConfigurations = append(gwStatus.Spec.ReadyGatewayConfigurations, gwConfig)
changed = true
}
if !add {
for i := len(gwStatus.Spec.ReadyPeerConfigurations) - 1; i >= 0; i = i - 1 {
if gwStatus.Spec.ReadyPeerConfigurations[i].InterfaceName == gwConfig.InterfaceName {
changed = true
gwStatus.Spec.ReadyPeerConfigurations = append(gwStatus.Spec.ReadyPeerConfigurations[:i], gwStatus.Spec.ReadyPeerConfigurations[i+1:]...)
}
}
}
if changed {
log.Info("Updating gateway status object")
if err := r.Update(ctx, gwStatus); err != nil {
return fmt.Errorf("failed to update gwStatus object: %w", err)
}
}
}
return nil
}