func()

in pkg/controller/direct/networkconnectivity/internalrange_controller.go [177:241]


func (a *internalRangeAdapter) Update(ctx context.Context, updateOp *directbase.UpdateOperation) error {
	log := klog.FromContext(ctx)
	log.V(2).Info("updating networkconnectivity internalrange", "name", a.id)
	mapCtx := &direct.MapContext{}

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

	paths := []string{}
	if desired.Spec.Description != nil && !reflect.DeepEqual(resource.Description, a.actual.Description) {
		paths = append(paths, "description")
	}
	if desired.Spec.IPCIDRRange != nil && !reflect.DeepEqual(resource.IpCidrRange, a.actual.IpCidrRange) {
		paths = append(paths, "ipCidrRange")
	}
	if desired.Spec.Labels != nil && !reflect.DeepEqual(resource.Labels, a.actual.Labels) {
		paths = append(paths, "labels")
	}
	if desired.Spec.Peering != nil && !reflect.DeepEqual(resource.Peering, a.actual.Peering) {
		paths = append(paths, "peering")
	}
	if desired.Spec.PrefixLength != nil && !reflect.DeepEqual(resource.PrefixLength, a.actual.PrefixLength) {
		paths = append(paths, "prefixLength")
	}
	if desired.Spec.TargetCIDRRange != nil && !reflect.DeepEqual(resource.TargetCidrRange, a.actual.TargetCidrRange) {
		paths = append(paths, "targetCidrRange")
	}
	if desired.Spec.Usage != nil && !reflect.DeepEqual(resource.Usage, a.actual.Usage) {
		paths = append(paths, "usage")
	}

	if len(paths) > 0 {
		resource.Name = a.id.String() // we need to set the name so that GCP API can identify the resource
		req := &api.InternalRange{}
		if err := convertProtoToAPI(resource, req); err != nil {
			return err
		}
		fqn := a.id.String()
		op, err := a.gcpClient.Projects.Locations.InternalRanges.Patch(fqn, req).UpdateMask(strings.Join(paths, ",")).Context(ctx).Do()
		if err != nil {
			return fmt.Errorf("updating networkconnectivity internalrange %s: %w", fqn, err)
		}
		if err := a.waitForOperation(ctx, op); err != nil {
			return fmt.Errorf("waiting for update of internalrange %q: %w", fqn, err)
		}
		log.V(2).Info("successfully updated networkconnectivity internalrange", "name", fqn)
		updatedAPI, err := a.gcpClient.Projects.Locations.InternalRanges.Get(fqn).Context(ctx).Do()
		if err != nil {
			return fmt.Errorf("getting updated internalrange %q: %w", fqn, err)
		}
		if err := convertAPIToProto(updatedAPI, &a.actual); err != nil {
			return err
		}
	}

	status := &krm.NetworkConnectivityInternalRangeStatus{}
	status.ObservedState = NetworkConnectivityInternalRangeObservedState_FromProto(mapCtx, a.actual)
	if mapCtx.Err() != nil {
		return mapCtx.Err()
	}
	return updateOp.UpdateStatus(ctx, status, nil)
}