8000 hashing struct values to represent equality is not straightforward · Issue #3969 · cue-lang/cue · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
hashing struct values to represent equality is not straightforward #3969
Open
@mxey

Description

@mxey

What version of CUE are you using (cue version)?

$ cue version
cue version v0.13.1

go version go1.24.4
      -buildmode exe
       -compiler gc
       -trimpath true
     CGO_ENABLED 0
          GOARCH arm64
            GOOS darwin
         GOARM64 v8.0
cue.lang.version v0.13.0

Does this issue reproduce with the latest stable release?

v0.13.1 is the latest stable

What did you do?

We generate our K8s ConfigMap names based on their data. We then refer to the metadata.name field to get the right generated name.

With evalv3, cue cmd build generates YAML output where the two fields do not match, despite being a straight reference. Curiously, this only happens in cue cmd. cue export works fine.

This does not happen with evalv2. The generated name is different with evalv2 from evalv3, but it's identical in all the fields.

It also seemed to me that having multiple CUE files made a difference here.

testscript:

exec cue version

env CUE_EXPERIMENT=evalv3=0
exec cue export --out=text -e app.objects.ConfigMap.app.metadata.name
stdout app-72a88d09e6
exec cue export --out=text -e app.objects.Deployment.app.spec.template.spec.containers[0].envFrom[0].configMapRef.name
stdout app-72a88d09e6
exec cue cmd build
grep -count=2 app-72a88d09e6 output.yaml

env CUE_EXPERIMENT=evalv3=1
exec cue export --out=text -e app.objects.ConfigMap.app.metadata.name
stdout app-843db6c1f5
exec cue export --out=text -e app.objects.Deployment.app.spec.template.spec.containers[0].envFrom[0].configMapRef.name
stdout app-843db6c1f5
exec cue cmd build
grep -count=2 app-843db6c1f5 output.yaml

-- build_tool.cue --
package foo

import (
	"encoding/yaml"
	"tool/file"
)

command: build: task: {
	build: file.Create & {
		$after:   task.prepare
		filename: "output.yaml"
		contents: yaml.MarshalStream(app.objectList)
	}
}


-- instance_staging.cue --
package foo

app: {

	objects: ConfigMap: app: data: {
		KEY_JWT_ACCESS_SIGN: "foo"
	}

	objects: ConfigMap: app: data: SIGNING_KEY: "foobar"
}
-- kubernetes.cue --
package foo

import (
	"crypto/sha256"
	"strings"
	"encoding/json"
	"encoding/hex"
)

#ConfigMap: {
	apiVersion: "v1"
	kind:       "ConfigMap"

	data: [string]: string
	immutable: *true | false

	metadata: {
		#basename: string
		if immutable {
			let hash = hex.Encode(sha256.Sum256(json.Marshal([data]))[0:5])
			name: "\(#basename)-\(hash)"
		}
		if !immutable {
			name: #basename
		}
	}
}

app: {
	objectList: [
		for kind, objs in objects for name, obj in objs {
			obj
		},
	]

	objects: [KIND=string]: [NAME=string]: {
		kind: KIND
		metadata: {
			name: *NAME | strings.HasPrefix(NAME+"-")
		}
	}

	objects: ConfigMap: [NAME=string]: #ConfigMap & {metadata: #basename: NAME}

	objects: Deployment: app: spec: template: spec: containers: [{
		envFrom: [
			{configMapRef: name: objects.ConfigMap["app"].metadata.name},
		]
	}, ...]
	objects: ConfigMap: app: {
		data: {
			SIGNING_KEY!:         string
			KEY_JWT_ACCESS_SIGN!: string
		}
	}

}

What did you expect to see?

PASS

What did you see instead?

> exec cue version
[stdout]
cue version v0.13.1

go version go1.24.4
      -buildmode exe
       -compiler gc
       -trimpath true
     CGO_ENABLED 0
          GOARCH arm64
            GOOS darwin
         GOARM64 v8.0
cue.lang.version v0.13.0
> env CUE_EXPERIMENT=evalv3=0
> exec cue export --out=text -e app.objects.ConfigMap.app.metadata.name
[stdout]
app-72a88d09e6
> stdout app-72a88d09e6
> exec cue export --out=text -e app.objects.Deployment.app.spec.template.spec.containers[0].envFrom[0].configMapRef.name
[stdout]
app-72a88d09e6
> stdout app-72a88d09e6
> exec cue cmd build
> grep -count=2 app-72a88d09e6 output.yaml
> env CUE_EXPERIMENT=evalv3=1
> exec cue export --out=text -e app.objects.ConfigMap.app.metadata.name
[stdout]
app-843db6c1f5
> stdout app-843db6c1f5
> exec cue export --out=text -e app.objects.Deployment.app.spec.template.spec.containers[0].envFrom[0].configMapRef.name
[stdout]
app-843db6c1f5
> stdout app-843db6c1f5
> exec cue cmd build
> grep -count=2 app-843db6c1f5 output.yaml
[output.yaml]
apiVersion: v1
kind: ConfigMap
data:
  SIGNING_KEY: foobar
  KEY_JWT_ACCESS_SIGN: foo
immutable: true
metadata:
  name: app-72a88d09e6
---
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - envFrom:
            - configMapRef:
                name: app-843db6c1f5

FAIL: <stdin>:17: have 1 matches for `app-843db6c1f5`, want 2
failed run

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0