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)
}