istio/istio · error

path not found at element %s in path %s

Error message

path not found at element %s in path %s

What it means

During map traversal in strict mode (createMissing=false), a missing intermediate key with more than one path segment remaining cannot be auto-created, so getPathContext fails naming the missing element and the full path. (The same check repeats just below for map[string]any trees.) Leaf creation (remainPath length 1) is allowed even in this mode.

Source

Thrown at operator/pkg/tpath/tree.go:235

				nc.KeyToChild = idx
				return getPathContext(nn, fullPath, remainPath[1:], createMissing)
			}
		}
		return nil, false, fmt.Errorf("path %s: element %s not found", fullPath, pe)
	}

	if util.IsMap(ncNode) {
		scope.Debug("map type")
		var nn any
		if m, ok := ncNode.(map[any]any); ok {
			nn, ok = m[pe]
			if !ok {
				// remainPath == 1 means the patch is creation of a new leaf.
				if createMissing || len(remainPath) == 1 {
					m[pe] = make(map[any]any)
					nn = m[pe]
				} else {
					return nil, false, fmt.Errorf("path not found at element %s in path %s", pe, fullPath)
				}
			}
		}
		if reflect.ValueOf(ncNode).IsNil() {
			ncNode = make(map[string]any)
			nc.Node = ncNode
		}
		if m, ok := ncNode.(map[string]any); ok {
			nn, ok = m[pe]
			if !ok {
				// remainPath == 1 means the patch is creation of a new leaf.
				if createMissing || len(remainPath) == 1 {
					nextElementNPath := len(remainPath) > 1 && util.IsNPathElement(remainPath[1])
					if nextElementNPath {
						scope.Debug("map type, slice child")
						m[pe] = make([]any, 0)
					} else {
						scope.Debug("map type, map child")

View on GitHub (pinned to 8dc789c5cf)

Solutions

  1. Treat as 'not found': check existence level by level before the strict read
  2. Ensure the base values/profile defines the intermediate maps, or create them via a write API (SetPath) first
  3. Fix the path typo at the reported element
Defensive patterns

Strategy: validation

Validate before calling

func walkExists(root any, segs []string) bool {
    cur := root
    for i, s := range segs {
        switch m := cur.(type) {
        case map[string]any:
            v, ok := m[s]
            if !ok || v == nil { return false }
            cur = v
        case map[any]any:
            v, ok := m[s]
            if !ok || v == nil { return false }
            cur = v
        default:
            return false
        }
        _ = i
    }
    return true
}

Type guard

func asMap(v any) (map[string]any, bool) {
    m, ok := v.(map[string]any)
    return m, ok
}

Prevention

When it happens

Trigger: Reading a.b.c with createMissing=false when b does not exist in the map[any]any tree — e.g. tpath.GetPathContext on spec.values.x.y before spec.values.x is set.

Common situations: Code querying optional config subtrees (components not present in the profile, values unset by the base); path typos in the middle segment; trees where an earlier step nulled the intermediate map.

Related errors


AI-assisted analysis of istio/istio@8dc789c5cf (2026-08-15). Data as JSON: /api/errors/43840ccda0a9aa29. Report an issue: GitHub.