this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

cue: allow valid reference cycles in export

Fixes #58

Change-Id: Ic2e4d1f02c002a678d72f6ff45b207857f8971d2
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/3440
Reviewed-by: Marcel van Lohuizen <mpvl@golang.org>

+266 -137
+3 -5
cue/ast.go
··· 151 151 for _, a := range r.arcs { 152 152 if a.feature == label { 153 153 return &selectorExpr{newExpr(n), 154 - &nodeRef{baseValue: newExpr(n), node: r}, label} 154 + &nodeRef{baseValue: newExpr(n), node: r, label: label}, label} 155 155 } 156 156 } 157 157 if v.inSelector > 0 { ··· 486 486 ret = &nodeRef{baseValue: newExpr(n), node: n2} 487 487 ret = &selectorExpr{newExpr(n), ret, f} 488 488 } else { 489 + // Package or direct ancestor node. 489 490 n2 := v.mapScope(n.Node) 490 - ref := &nodeRef{baseValue: newExpr(n), node: n2} 491 + ref := &nodeRef{baseValue: newExpr(n), node: n2, label: f} 491 492 ret = ref 492 - if inst := v.ctx().getImportFromNode(n2); inst != nil { 493 - ref.short = f 494 - } 495 493 } 496 494 497 495 case *ast.BottomLit:
+3 -1
cue/binop.go
··· 1137 1137 max, ok := n.(*numLit) 1138 1138 if !ok || len(xa) < max.intValue(ctx) { 1139 1139 src := mkBin(ctx, src.Pos(), op, x.typ, y.typ) 1140 - typ = binOp(ctx, src, op, x.typ.(evaluated), y.typ.(evaluated)) 1140 + xt := x.typ.evalPartial(ctx) 1141 + yt := y.typ.evalPartial(ctx) 1142 + typ = binOp(ctx, src, op, xt, yt) 1141 1143 if isBottom(typ) { 1142 1144 return ctx.mkErr(src, "conflicting list element types: %v", typ) 1143 1145 }
+1 -1
cue/copy.go
··· 26 26 if node == x.node { 27 27 return x, false 28 28 } 29 - return &nodeRef{x.baseValue, node, x.short}, false 29 + return &nodeRef{x.baseValue, node, x.label}, false 30 30 31 31 case *structLit: 32 32 arcs := make(arcs, len(x.arcs))
+4 -5
cue/eval.go
··· 248 248 defer func() { ctx.debugPrint("result:", result) }() 249 249 } 250 250 n := x.len.evalPartial(ctx) 251 - t := x.typ.evalPartial(ctx) 252 - if err := firstBottom(n, t); err != nil { 253 - return err 251 + if isBottom(n) { 252 + return n 254 253 } 255 254 s := x.elem.evalPartial(ctx).(*structLit) 256 - if s == x.elem && n == x.len && t == x.typ { 255 + if s == x.elem && n == x.len { 257 256 return x 258 257 } 259 - return &list{x.baseValue, s, t, n} 258 + return &list{x.baseValue, s, x.typ, n} 260 259 } 261 260 262 261 func (x *listComprehension) evalPartial(ctx *context) evaluated {
+53 -18
cue/export.go
··· 226 226 return s 227 227 } 228 228 229 + func (p *exporter) isComplete(v value, all bool) bool { 230 + switch x := v.(type) { 231 + case *numLit, *stringLit, *bytesLit, *nullLit, *boolLit: 232 + return true 233 + case *list: 234 + return true 235 + case *structLit: 236 + return !all 237 + case *bottom: 238 + return !isIncomplete(x) 239 + } 240 + return false 241 + } 242 + 243 + func (p *exporter) recExpr(v value, e evaluated) ast.Expr { 244 + m := p.ctx.manifest(e) 245 + if !p.isComplete(m, false) && !p.mode.concrete { 246 + // TODO: do something more principled than this hack. 247 + // This likely requires disjunctions to keep track of original 248 + // values (so using arcs instead of values). 249 + p := &exporter{p.ctx, options{concrete: true, raw: true}, p.stack, p.top, p.imports, p.inDef} 250 + if _, ok := v.(*disjunction); ok || isBottom(e) { 251 + return p.expr(v) 252 + } 253 + return p.expr(e) 254 + } 255 + return p.expr(e) 256 + } 257 + 229 258 func (p *exporter) expr(v value) ast.Expr { 230 259 // TODO: use the raw expression for convert incomplete errors downstream 231 260 // as well. 232 - if doEval(p.mode) { 261 + if doEval(p.mode) || p.mode.concrete { 233 262 e := v.evalPartial(p.ctx) 234 263 x := p.ctx.manifest(e) 235 - if isIncomplete(x) { 264 + 265 + if !p.isComplete(x, true) { 236 266 if isBottom(e) { 237 267 p = &exporter{p.ctx, options{raw: true}, p.stack, p.top, p.imports, p.inDef} 238 268 return p.expr(v) 239 269 } 240 - v = e 270 + if doEval(p.mode) { 271 + v = e 272 + } 241 273 } else { 242 274 v = x 243 275 } ··· 258 290 return ast.NewSel(ast.NewIdent(short), x.Name) 259 291 260 292 case *nodeRef: 261 - if x.short == 0 { 293 + if x.label == 0 { 294 + // NOTE: this nodeRef is used within a selector. 262 295 return nil 263 296 } 264 - inst := p.ctx.getImportFromNode(x.node) 265 - if inst == nil { 266 - return nil // should not happen! 297 + short := p.ctx.labelStr(x.label) 298 + 299 + if inst := p.ctx.getImportFromNode(x.node); inst != nil { 300 + return ast.NewIdent(p.shortName(inst, short, inst.ImportPath)) 267 301 } 268 - short := p.ctx.labelStr(x.short) 269 - return ast.NewIdent(p.shortName(inst, short, inst.ImportPath)) 302 + 303 + // fix shadowed label. 304 + return ast.NewIdent(short) 270 305 271 306 case *selectorExpr: 272 307 n := p.expr(x.x) ··· 504 539 case *list: 505 540 list := &ast.ListLit{} 506 541 var expr ast.Expr = list 507 - for _, e := range x.elem.arcs { 508 - list.Elts = append(list.Elts, p.expr(e.v)) 542 + for i, a := range x.elem.arcs { 543 + if !doEval(p.mode) { 544 + list.Elts = append(list.Elts, p.expr(a.v)) 545 + } else { 546 + e := x.elem.at(p.ctx, i) 547 + list.Elts = append(list.Elts, p.recExpr(a.v, e)) 548 + } 509 549 } 510 550 max := maxNum(x.len) 511 551 num, ok := max.(*numLit) ··· 576 616 return nil, err 577 617 } 578 618 } 619 + 579 620 for _, a := range x.arcs { 580 621 p.stack = append(p.stack, remap{ 581 622 key: x, ··· 632 673 if !doEval(p.mode) { 633 674 f.Value = p.expr(a.v) 634 675 } else { 635 - e := x.at(p.ctx, i) 636 - if v := p.ctx.manifest(e); isIncomplete(v) && !p.mode.concrete && isBottom(e) { 637 - p := &exporter{p.ctx, options{raw: true}, p.stack, p.top, p.imports, p.inDef} 638 - f.Value = p.expr(a.v) 639 - } else { 640 - f.Value = p.expr(e) 641 - } 676 + f.Value = p.recExpr(a.v, x.at(p.ctx, i)) 642 677 } 643 678 p.inDef = oldInDef 644 679 if a.attrs != nil && !p.mode.omitAttrs {
+98 -2
cue/export_test.go
··· 198 198 }`, 199 199 out: unindent(` 200 200 { 201 - a: 1 | 2 202 - b: [1 | 2] 201 + a: 1 | 2 | *_|_ 202 + b: [1 | 2 | *_|_] 203 203 }`), 204 204 }, { 205 205 raw: true, ··· 446 446 } 447 447 448 448 } 449 + }`), 450 + }, { 451 + raw: true, 452 + eval: true, 453 + in: `{ 454 + Foo :: { 455 + Bar :: Foo | string 456 + } 457 + }`, 458 + out: unindent(` 459 + { 460 + Foo :: { 461 + Bar :: Foo | string 462 + } 463 + }`), 464 + }, { 465 + raw: true, 466 + eval: true, 467 + in: `{ 468 + FindInMap :: { 469 + "Fn::FindInMap" :: [string | FindInMap] 470 + } 471 + a: [...string] 472 + }`, 473 + out: unindent(` 474 + { 475 + FindInMap :: { 476 + "Fn::FindInMap" :: [string | FindInMap] 477 + } 478 + a: [] 479 + }`)}, { 480 + raw: true, 481 + eval: true, 482 + in: `{ 483 + And :: { 484 + "Fn::And": [...(3 | And)] 485 + } 486 + Ands: And & { 487 + "Fn::And" : [_] 488 + } 489 + }`, 490 + out: unindent(` 491 + { 492 + And :: { 493 + "Fn::And": [] 494 + } 495 + Ands "Fn::And": [3 | And] 496 + }`), 497 + }, { 498 + raw: true, 499 + eval: true, 500 + in: `{ 501 + Foo :: { 502 + sgl: Bar 503 + ref: null | Foo 504 + ext: Bar | null 505 + ref: null | Foo 506 + ref2: null | Foo.sgl 507 + ... 508 + } 509 + Foo :: { 510 + Foo: 2 511 + ... 512 + } 513 + Bar :: string 514 + }`, 515 + out: unindent(` 516 + { 517 + FOO = Foo 518 + FOO658221 = Foo 519 + Foo :: { 520 + Foo: 2 521 + sgl: string 522 + ref: null | { 523 + Foo: 2 524 + sgl: Bar 525 + ref: (null | FOO) & (null | FOO) 526 + ext: Bar | null 527 + ref2: null | FOO.sgl 528 + } 529 + ext: Bar | null 530 + ref2: null | FOO658221.sgl 531 + } 532 + Bar :: string 533 + }`), 534 + }, { 535 + raw: true, 536 + eval: true, 537 + in: `{ 538 + A: [uint] 539 + B: A & ([10] | [192]) 540 + }`, 541 + out: unindent(` 542 + { 543 + A: [>=0] 544 + B: [10] | [192] 449 545 }`), 450 546 }} 451 547 for _, tc := range testCases {
+1 -1
cue/rewrite_test.go
··· 80 80 case *list: 81 81 elm := rewriteRec(ctx, x.elem, x.elem, m).(*structLit) 82 82 len := rewriteRec(ctx, x.len, x.len.(evaluated), m) 83 - typ := rewriteRec(ctx, x.typ, x.typ.(evaluated), m) 83 + typ := rewriteRec(ctx, x.typ, x.typ.evalPartial(ctx), m) 84 84 return &list{x.baseValue, elm, typ, len} 85 85 default: 86 86 return eval
+2 -2
cue/value.go
··· 565 565 return arc{} 566 566 } 567 567 } 568 - return arc{cache: x.typ.(evaluated), v: x.typ} 568 + return arc{cache: x.typ.evalPartial(ctx), v: x.typ} 569 569 } 570 570 571 571 func (x *list) isOpen() bool { ··· 966 966 type nodeRef struct { 967 967 baseValue 968 968 node scope 969 - short label // only for packages, otherwise 0 969 + label label // for direct ancestor nodes 970 970 } 971 971 972 972 func (x *nodeRef) kind() kind {
-1
doc/cmd/cue.md
··· 260 260 ``` 261 261 --dryrun force overwriting existing files 262 262 --files force overwriting existing files 263 - --fix string apply given fix 264 263 -f, --force force overwriting existing files 265 264 -h, --help help for import 266 265 --list concatenate multiple objects into a list
+1 -1
doc/tutorial/basics/defaults.md
··· 29 29 `$ cue eval defaults.cue` 30 30 ``` 31 31 replicas: 1 32 - protocol: "tcp" | "udp" 32 + protocol: "tcp" | "udp" | *_|_ 33 33 ```
+1 -1
doc/tutorial/basics/lists.md
··· 39 39 `$ cue eval -i lists.cue` 40 40 ``` 41 41 IP: [uint8, uint8, uint8, uint8] 42 - PrivateIP: [10, uint8, uint8, uint8] | [192, 168, uint8, uint8] | [172, >=16 & <=32, uint8, uint8] 42 + PrivateIP: [10, uint8, uint8, uint8] | [192, 168, uint8, uint8] | [172, >=16 & <=32 & uint8, uint8, uint8] 43 43 myIP: [10, 2, 3, 4] 44 44 yourIP: _|_ // empty disjunction: [((10 & (int & >=0 & int & <=255)) & 11),((int & >=0 & int & <=255) & 1),((int & >=0 & int & <=255) & 2),((int & >=0 & int & <=255) & 3)] 45 45 ```
+99 -99
doc/tutorial/kubernetes/testdata/manual.out
··· 33 33 template: { 34 34 spec: _|_ // undefined field "volume" 35 35 metadata: { 36 - labels: label 36 + labels: X.label 37 37 } 38 38 } 39 39 } 40 40 metadata: { 41 - name: name 41 + name: X.name 42 42 labels: { 43 - component: label.component 43 + component: X.label.component 44 44 } 45 45 } 46 46 } ··· 83 83 template: { 84 84 spec: _|_ // undefined field "volume" 85 85 metadata: { 86 - labels: label 86 + labels: X.label 87 87 } 88 88 } 89 89 } 90 90 metadata: { 91 - name: name 91 + name: X.name 92 92 labels: { 93 - component: label.component 93 + component: X.label.component 94 94 } 95 95 } 96 96 } ··· 250 250 template: { 251 251 spec: _|_ // undefined field "volume" 252 252 metadata: { 253 - labels: label 253 + labels: X.label 254 254 } 255 255 } 256 256 } 257 257 metadata: { 258 - name: name 258 + name: X.name 259 259 labels: { 260 - component: label.component 260 + component: X.label.component 261 261 } 262 262 } 263 263 } ··· 419 419 template: { 420 420 spec: _|_ // undefined field "volume" 421 421 metadata: { 422 - labels: label 422 + labels: X.label 423 423 } 424 424 } 425 425 } 426 426 metadata: { 427 - name: name 427 + name: X.name 428 428 labels: { 429 - component: label.component 429 + component: X.label.component 430 430 } 431 431 } 432 432 } ··· 586 586 template: { 587 587 spec: _|_ // undefined field "volume" 588 588 metadata: { 589 - labels: label 589 + labels: X.label 590 590 } 591 591 } 592 592 } 593 593 metadata: { 594 - name: name 594 + name: X.name 595 595 labels: { 596 - component: label.component 596 + component: X.label.component 597 597 } 598 598 } 599 599 } ··· 753 753 template: { 754 754 spec: _|_ // undefined field "volume" 755 755 metadata: { 756 - labels: label 756 + labels: X.label 757 757 } 758 758 } 759 759 } 760 760 metadata: { 761 - name: name 761 + name: X.name 762 762 labels: { 763 - component: label.component 763 + component: X.label.component 764 764 } 765 765 } 766 766 } ··· 922 922 template: { 923 923 spec: _|_ // undefined field "volume" 924 924 metadata: { 925 - labels: label 925 + labels: X.label 926 926 } 927 927 } 928 928 } 929 929 metadata: { 930 - name: name 930 + name: X.name 931 931 labels: { 932 - component: label.component 932 + component: X.label.component 933 933 } 934 934 } 935 935 } ··· 1089 1089 template: { 1090 1090 spec: _|_ // undefined field "volume" 1091 1091 metadata: { 1092 - labels: label 1092 + labels: X.label 1093 1093 } 1094 1094 } 1095 1095 } 1096 1096 metadata: { 1097 - name: name 1097 + name: X.name 1098 1098 labels: { 1099 - component: label.component 1099 + component: X.label.component 1100 1100 } 1101 1101 } 1102 1102 } ··· 1258 1258 template: { 1259 1259 spec: _|_ // undefined field "volume" 1260 1260 metadata: { 1261 - labels: label 1261 + labels: X.label 1262 1262 } 1263 1263 } 1264 1264 } 1265 1265 metadata: { 1266 - name: name 1266 + name: X.name 1267 1267 labels: { 1268 - component: label.component 1268 + component: X.label.component 1269 1269 } 1270 1270 } 1271 1271 } ··· 1308 1308 template: { 1309 1309 spec: _|_ // undefined field "volume" 1310 1310 metadata: { 1311 - labels: label 1311 + labels: X.label 1312 1312 } 1313 1313 } 1314 1314 } 1315 1315 metadata: { 1316 - name: name 1316 + name: X.name 1317 1317 labels: { 1318 - component: label.component 1318 + component: X.label.component 1319 1319 } 1320 1320 } 1321 1321 } ··· 1461 1461 template: { 1462 1462 spec: _|_ // undefined field "volume" 1463 1463 metadata: { 1464 - labels: label 1464 + labels: X.label 1465 1465 } 1466 1466 } 1467 1467 } 1468 1468 metadata: { 1469 - name: name 1469 + name: X.name 1470 1470 labels: { 1471 - component: label.component 1471 + component: X.label.component 1472 1472 } 1473 1473 } 1474 1474 } ··· 1787 1787 template: { 1788 1788 spec: _|_ // undefined field "volume" 1789 1789 metadata: { 1790 - labels: label 1790 + labels: X.label 1791 1791 } 1792 1792 } 1793 1793 } 1794 1794 metadata: { 1795 - name: name 1795 + name: X.name 1796 1796 labels: { 1797 - component: label.component 1797 + component: X.label.component 1798 1798 } 1799 1799 } 1800 1800 } ··· 2009 2009 template: { 2010 2010 spec: _|_ // undefined field "volume" 2011 2011 metadata: { 2012 - labels: label 2012 + labels: X.label 2013 2013 } 2014 2014 } 2015 2015 } 2016 2016 metadata: { 2017 - name: name 2017 + name: X.name 2018 2018 labels: { 2019 - component: label.component 2019 + component: X.label.component 2020 2020 } 2021 2021 } 2022 2022 } ··· 2206 2206 template: { 2207 2207 spec: _|_ // undefined field "volume" 2208 2208 metadata: { 2209 - labels: label 2209 + labels: X.label 2210 2210 } 2211 2211 } 2212 2212 } 2213 2213 metadata: { 2214 - name: name 2214 + name: X.name 2215 2215 labels: { 2216 - component: label.component 2216 + component: X.label.component 2217 2217 } 2218 2218 } 2219 2219 } ··· 2377 2377 template: { 2378 2378 spec: _|_ // undefined field "volume" 2379 2379 metadata: { 2380 - labels: label 2380 + labels: X.label 2381 2381 } 2382 2382 } 2383 2383 } 2384 2384 metadata: { 2385 - name: name 2385 + name: X.name 2386 2386 labels: { 2387 - component: label.component 2387 + component: X.label.component 2388 2388 } 2389 2389 } 2390 2390 } ··· 2564 2564 template: { 2565 2565 spec: _|_ // undefined field "volume" 2566 2566 metadata: { 2567 - labels: label 2567 + labels: X.label 2568 2568 } 2569 2569 } 2570 2570 } 2571 2571 metadata: { 2572 - name: name 2572 + name: X.name 2573 2573 labels: { 2574 - component: label.component 2574 + component: X.label.component 2575 2575 } 2576 2576 } 2577 2577 } ··· 2614 2614 template: { 2615 2615 spec: _|_ // undefined field "volume" 2616 2616 metadata: { 2617 - labels: label 2617 + labels: X.label 2618 2618 } 2619 2619 } 2620 2620 } 2621 2621 metadata: { 2622 - name: name 2622 + name: X.name 2623 2623 labels: { 2624 - component: label.component 2624 + component: X.label.component 2625 2625 } 2626 2626 } 2627 2627 } ··· 2866 2866 template: { 2867 2867 spec: _|_ // undefined field "volume" 2868 2868 metadata: { 2869 - labels: label 2869 + labels: X.label 2870 2870 } 2871 2871 } 2872 2872 } 2873 2873 metadata: { 2874 - name: name 2874 + name: X.name 2875 2875 labels: { 2876 - component: label.component 2876 + component: X.label.component 2877 2877 } 2878 2878 } 2879 2879 } ··· 3115 3115 template: { 3116 3116 spec: _|_ // undefined field "volume" 3117 3117 metadata: { 3118 - labels: label 3118 + labels: X.label 3119 3119 } 3120 3120 } 3121 3121 } 3122 3122 metadata: { 3123 - name: name 3123 + name: X.name 3124 3124 labels: { 3125 - component: label.component 3125 + component: X.label.component 3126 3126 } 3127 3127 } 3128 3128 } ··· 3348 3348 template: { 3349 3349 spec: _|_ // undefined field "volume" 3350 3350 metadata: { 3351 - labels: label 3351 + labels: X.label 3352 3352 } 3353 3353 } 3354 3354 } 3355 3355 metadata: { 3356 - name: name 3356 + name: X.name 3357 3357 labels: { 3358 - component: label.component 3358 + component: X.label.component 3359 3359 } 3360 3360 } 3361 3361 } ··· 3580 3580 template: { 3581 3581 spec: _|_ // undefined field "volume" 3582 3582 metadata: { 3583 - labels: label 3583 + labels: X.label 3584 3584 } 3585 3585 } 3586 3586 } 3587 3587 metadata: { 3588 - name: name 3588 + name: X.name 3589 3589 labels: { 3590 - component: label.component 3590 + component: X.label.component 3591 3591 } 3592 3592 } 3593 3593 } ··· 3816 3816 template: { 3817 3817 spec: _|_ // undefined field "volume" 3818 3818 metadata: { 3819 - labels: label 3819 + labels: X.label 3820 3820 } 3821 3821 } 3822 3822 } 3823 3823 metadata: { 3824 - name: name 3824 + name: X.name 3825 3825 labels: { 3826 - component: label.component 3826 + component: X.label.component 3827 3827 } 3828 3828 } 3829 3829 } ··· 4052 4052 template: { 4053 4053 spec: _|_ // undefined field "volume" 4054 4054 metadata: { 4055 - labels: label 4055 + labels: X.label 4056 4056 } 4057 4057 } 4058 4058 } 4059 4059 metadata: { 4060 - name: name 4060 + name: X.name 4061 4061 labels: { 4062 - component: label.component 4062 + component: X.label.component 4063 4063 } 4064 4064 } 4065 4065 } ··· 4246 4246 template: { 4247 4247 spec: _|_ // undefined field "volume" 4248 4248 metadata: { 4249 - labels: label 4249 + labels: X.label 4250 4250 } 4251 4251 } 4252 4252 } 4253 4253 metadata: { 4254 - name: name 4254 + name: X.name 4255 4255 labels: { 4256 - component: label.component 4256 + component: X.label.component 4257 4257 } 4258 4258 } 4259 4259 } ··· 4305 4305 template: { 4306 4306 spec: _|_ // undefined field "volume" 4307 4307 metadata: { 4308 - labels: label 4308 + labels: X.label 4309 4309 } 4310 4310 } 4311 4311 } 4312 4312 metadata: { 4313 - name: name 4313 + name: X.name 4314 4314 labels: { 4315 - component: label.component 4315 + component: X.label.component 4316 4316 } 4317 4317 } 4318 4318 } ··· 4562 4562 template: { 4563 4563 spec: _|_ // undefined field "volume" 4564 4564 metadata: { 4565 - labels: label 4565 + labels: X.label 4566 4566 } 4567 4567 } 4568 4568 } 4569 4569 metadata: { 4570 - name: name 4570 + name: X.name 4571 4571 labels: { 4572 - component: label.component 4572 + component: X.label.component 4573 4573 } 4574 4574 } 4575 4575 } ··· 4788 4788 template: { 4789 4789 spec: _|_ // undefined field "volume" 4790 4790 metadata: { 4791 - labels: label 4791 + labels: X.label 4792 4792 } 4793 4793 } 4794 4794 } 4795 4795 metadata: { 4796 - name: name 4796 + name: X.name 4797 4797 labels: { 4798 - component: label.component 4798 + component: X.label.component 4799 4799 } 4800 4800 } 4801 4801 } ··· 5024 5024 template: { 5025 5025 spec: _|_ // undefined field "volume" 5026 5026 metadata: { 5027 - labels: label 5027 + labels: X.label 5028 5028 } 5029 5029 } 5030 5030 } 5031 5031 metadata: { 5032 - name: name 5032 + name: X.name 5033 5033 labels: { 5034 - component: label.component 5034 + component: X.label.component 5035 5035 } 5036 5036 } 5037 5037 } ··· 5716 5716 template: { 5717 5717 spec: _|_ // undefined field "volume" 5718 5718 metadata: { 5719 - labels: label 5719 + labels: X.label 5720 5720 } 5721 5721 } 5722 5722 } 5723 5723 metadata: { 5724 - name: name 5724 + name: X.name 5725 5725 labels: { 5726 - component: label.component 5726 + component: X.label.component 5727 5727 } 5728 5728 } 5729 5729 } ··· 5766 5766 template: { 5767 5767 spec: _|_ // undefined field "volume" 5768 5768 metadata: { 5769 - labels: label 5769 + labels: X.label 5770 5770 } 5771 5771 } 5772 5772 } 5773 5773 metadata: { 5774 - name: name 5774 + name: X.name 5775 5775 labels: { 5776 - component: label.component 5776 + component: X.label.component 5777 5777 } 5778 5778 } 5779 5779 } ··· 6057 6057 template: { 6058 6058 spec: _|_ // undefined field "volume" 6059 6059 metadata: { 6060 - labels: label 6060 + labels: X.label 6061 6061 } 6062 6062 } 6063 6063 } 6064 6064 metadata: { 6065 - name: name 6065 + name: X.name 6066 6066 labels: { 6067 - component: label.component 6067 + component: X.label.component 6068 6068 } 6069 6069 } 6070 6070 } ··· 6243 6243 template: { 6244 6244 spec: _|_ // undefined field "volume" 6245 6245 metadata: { 6246 - labels: label 6246 + labels: X.label 6247 6247 } 6248 6248 } 6249 6249 } 6250 6250 metadata: { 6251 - name: name 6251 + name: X.name 6252 6252 labels: { 6253 - component: label.component 6253 + component: X.label.component 6254 6254 } 6255 6255 } 6256 6256 } ··· 6858 6858 template: { 6859 6859 spec: _|_ // undefined field "volume" 6860 6860 metadata: { 6861 - labels: label 6861 + labels: X.label 6862 6862 } 6863 6863 } 6864 6864 } 6865 6865 metadata: { 6866 - name: name 6866 + name: X.name 6867 6867 labels: { 6868 - component: label.component 6868 + component: X.label.component 6869 6869 } 6870 6870 } 6871 6871 }