func()

in pkg/cloud/rgraph/rnode/backendservice/node.go [41:95]


func (n *backendServiceNode) Diff(gotNode rnode.Node) (*rnode.PlanDetails, error) {
	got, ok := gotNode.(*backendServiceNode)
	if !ok {
		return nil, fmt.Errorf("BackendServiceNode: invalid type to Diff: %T", gotNode)
	}
	diff, err := got.resource.Diff(n.resource)
	if err != nil {
		return nil, fmt.Errorf("BackendServiceNode: Diff %w", err)
	}

	if !diff.HasDiff() {
		return &rnode.PlanDetails{
			Operation: rnode.OpNothing,
			Why:       "No diff between got and want",
		}, nil
	}

	var (
		needsRecreate bool
		details       []string
	)

	planRecreate := func(s string, args ...any) {
		details = append(details, fmt.Sprintf(s, args...))
		needsRecreate = true
	}
	planUpdate := func(s string, args ...any) {
		details = append(details, fmt.Sprintf(s, args...))
	}

	for _, delta := range diff.Items {
		// These fields cannot be changed in place and require the
		// resource to be recreated.
		switch {
		case delta.Path.Equal(api.Path{}.Pointer().Field("LoadBalancingScheme")),
			delta.Path.Equal(api.Path{}.Pointer().Field("Network")):
			planRecreate("LoadBalancingScheme change: '%v' -> '%v'", delta.A, delta.B)
		default:
			planUpdate("%s change: '%v' -> '%v'", delta.Path, delta.A, delta.B)
		}
	}

	if needsRecreate {
		return &rnode.PlanDetails{
			Operation: rnode.OpRecreate,
			Why:       "BackendService needs to be recreated: " + strings.Join(details, ", "),
			Diff:      diff,
		}, nil
	}
	return &rnode.PlanDetails{
		Operation: rnode.OpUpdate,
		Why:       "BackendService needs to be updated: " + strings.Join(details, ", "),
		Diff:      diff,
	}, nil
}