func()

in pkg/controller/direct/vmwareengine/networkpeering_controller.go [158:233]


func (a *networkPeeringAdapter) Update(ctx context.Context, updateOp *directbase.UpdateOperation) error {
	log := klog.FromContext(ctx)
	log.V(2).Info("updating vmwareengine networkpeering", "name", a.id)

	if err := a.normalizeReferenceFields(ctx); err != nil {
		return err
	}

	mapCtx := &direct.MapContext{}
	desired := a.desired.DeepCopy()
	resource := VMwareEngineNetworkPeeringSpec_ToProto(mapCtx, &desired.Spec)
	if mapCtx.Err() != nil {
		return mapCtx.Err()
	}

	var paths []string
	if desired.Spec.Description != nil && !reflect.DeepEqual(resource.Description, a.actual.Description) {
		paths = append(paths, "description")
	}
	if desired.Spec.PeerNetwork != nil && !reflect.DeepEqual(resource.PeerNetwork, a.actual.PeerNetwork) {
		paths = append(paths, "peer_network")
	}
	if desired.Spec.PeerNetworkType != nil && !reflect.DeepEqual(resource.PeerNetworkType, a.actual.PeerNetworkType) {
		paths = append(paths, "peer_network_type")
	}
	if desired.Spec.ExportCustomRoutes != nil && !reflect.DeepEqual(resource.ExportCustomRoutes, a.actual.ExportCustomRoutes) {
		paths = append(paths, "export_custom_routes")
	}
	if desired.Spec.ImportCustomRoutes != nil && !reflect.DeepEqual(resource.ImportCustomRoutes, a.actual.ImportCustomRoutes) {
		paths = append(paths, "import_custom_routes")
	}
	if desired.Spec.ExchangeSubnetRoutes != nil && !reflect.DeepEqual(resource.ExchangeSubnetRoutes, a.actual.ExchangeSubnetRoutes) {
		paths = append(paths, "exchange_subnet_routes")
	}
	if desired.Spec.ExportCustomRoutesWithPublicIP != nil && !reflect.DeepEqual(resource.ExportCustomRoutesWithPublicIp, a.actual.ExportCustomRoutesWithPublicIp) {
		paths = append(paths, "export_custom_routes_with_public_ip")
	}
	if desired.Spec.ImportCustomRoutesWithPublicIP != nil && !reflect.DeepEqual(resource.ImportCustomRoutesWithPublicIp, a.actual.ImportCustomRoutesWithPublicIp) {
		paths = append(paths, "import_custom_routes_with_public_ip")
	}
	if desired.Spec.PeerMTU != nil && !reflect.DeepEqual(resource.PeerMtu, a.actual.PeerMtu) {
		paths = append(paths, "peer_mtu")
	}
	if desired.Spec.VMwareEngineNetworkRef != nil && !reflect.DeepEqual(resource.VmwareEngineNetwork, a.actual.VmwareEngineNetwork) {
		paths = append(paths, "vmware_engine_network")
	}

	var updated *pb.NetworkPeering
	if len(paths) == 0 {
		log.V(2).Info("no field needs update", "name", a.id)
		updated = a.actual
	} else {
		resource.Name = a.id.String() // we need to set the name so that GCP API can identify the resource
		req := &pb.UpdateNetworkPeeringRequest{
			NetworkPeering: resource,
			UpdateMask:     &fieldmaskpb.FieldMask{Paths: paths},
		}
		op, err := a.gcpClient.UpdateNetworkPeering(ctx, req)
		if err != nil {
			return fmt.Errorf("updating vmwareengine networkpeering %s: %w", a.id.String(), err)
		}
		updated, err = op.Wait(ctx)
		if err != nil {
			return fmt.Errorf("vmwareengine networkpeering %s waiting for update: %w", a.id, err)
		}
		log.V(2).Info("successfully updated vmwareengine networkpeering", "name", a.id)
	}

	status := &krm.VMwareEngineNetworkPeeringStatus{}
	status.ObservedState = VMwareEngineNetworkPeeringObservedState_FromProto(mapCtx, updated)
	if mapCtx.Err() != nil {
		return mapCtx.Err()
	}
	status.ExternalRef = direct.LazyPtr(a.id.String())
	return updateOp.UpdateStatus(ctx, status, nil)
}