in controllers/daemon/podendpoint_controller.go [346:426]
func (r *PodEndpointReconciler) updateGatewayNodeStatus(
ctx context.Context,
peerConfigs []egressgatewayv1alpha1.PeerConfiguration,
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{
ReadyPeerConfigurations: peerConfigs,
},
}
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
peerMap := make(map[string]*egressgatewayv1alpha1.PeerConfiguration)
for _, peerConfig := range gwStatus.Spec.ReadyPeerConfigurations {
peerConfig := peerConfig
peerMap[peerConfig.PublicKey] = &peerConfig
}
for i, peerConfig := range peerConfigs {
if _, ok := peerMap[peerConfig.PublicKey]; ok {
if !add {
delete(peerMap, peerConfig.PublicKey)
changed = true
}
} else {
if add {
peerMap[peerConfig.PublicKey] = &peerConfigs[i]
changed = true
}
}
}
if changed {
var peers []egressgatewayv1alpha1.PeerConfiguration
for _, peerConfig := range peerMap {
peers = append(peers, *peerConfig)
}
gwStatus.Spec.ReadyPeerConfigurations = peers
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
}