crossplane-tools icon indicating copy to clipboard operation
crossplane-tools copied to clipboard

implement helper angryjet functions

Open ldalorion opened this issue 9 months ago • 4 comments

Description of your changes

The removal of the pointer helper methods in crossplane-runtime v1.19.0 will now make angryjet generate invalid code. https://github.com/crossplane/crossplane-runtime/pull/780/files

Fixes # https://github.com/crossplane/crossplane-runtime/issues/762

I have:

  • [x] Read and followed Crossplane's contribution process.
  • [x] Run make reviewable test to ensure this PR is ready for review.

How has this code been tested

Updated go.mod file of provider-upbound to point to my changes locally

replace github.com/crossplane/crossplane-tools => /Users/dajohnson/projects/crossplane-tools

ran the go commands to pull the changes into the environment

go mod tidy
go mod vendor
make build
make reviewable test

deployed the changes to my local kind cluster

make dev

applied resources to the cluster and verified that they eventually were synced and ready.

(base) {25-03-15 21:24}~/20250314-provider-upbound-integration-test ➭ k get managed
NAME                                   READY   SYNCED   EXTERNAL-NAME                          AGE
robot.iam.upbound.io/dalorions-robot   True    True     419bb021-83e2-4783-928a-ad6847e90260   102s

NAME                                READY   SYNCED   EXTERNAL-NAME                          AGE
team.iam.upbound.io/dalorion-team   True    True     f726ad76-adf6-45d1-a6b2-f68f7b945d17   102s

NAME                                         READY   SYNCED   EXTERNAL-NAME                          AGE
token.iam.upbound.io/dalorions-robot-token   True    True     79e2daa0-1e42-4c5f-8cbb-5d0b98bfc8ef   102s

NAME                                         READY   SYNCED   EXTERNAL-NAME   AGE
permission.repository.upbound.io/alper-dev   True    True                     102s

NAME                                                READY   SYNCED   EXTERNAL-NAME      AGE
repository.repository.upbound.io/provider-upbound   True    True     provider-upbound   102s

~~TODO: apply changes to local provider-upjet-gcp and run uptest locally~~

Ran uptest against provider-upjet-gcp with it pointing to my changes. Did the same setup for provider-upbound but ran make uptest against the storage bucket example.

export UPTEST_EXAMPLE_LIST="examples/storage/v1beta2/bucket.yaml"

test passed

 logger.go:42: 17:48:55 | case/2-import | running command: [sh -c echo "Dump MR manifests for the import assertion step:"; ${KUBECTL} get managed -o yaml]
    logger.go:42: 17:48:55 | case/2-import | Dump MR manifests for the import assertion step:
    logger.go:42: 17:49:00 | case/2-import | apiVersion: v1
    logger.go:42: 17:49:00 | case/2-import | items:
    logger.go:42: 17:49:00 | case/2-import | - apiVersion: storage.gcp.upbound.io/v1beta2
    logger.go:42: 17:49:00 | case/2-import |   kind: Bucket
    logger.go:42: 17:49:00 | case/2-import |   metadata:
    logger.go:42: 17:49:00 | case/2-import |     annotations:
    logger.go:42: 17:49:00 | case/2-import |       crossplane.io/external-create-failed: "2025-03-20T22:48:05Z"
    logger.go:42: 17:49:00 | case/2-import |       crossplane.io/external-create-pending: "2025-03-20T22:48:05Z"
    logger.go:42: 17:49:00 | case/2-import |       crossplane.io/external-create-succeeded: "2025-03-20T22:44:04Z"
    logger.go:42: 17:49:00 | case/2-import |       crossplane.io/external-name: bucket-op-u4keh593
    logger.go:42: 17:49:00 | case/2-import |       crossplane.io/paused: "false"
    logger.go:42: 17:49:00 | case/2-import |       meta.upbound.io/example-id: storage/v1beta2/bucket
    logger.go:42: 17:49:00 | case/2-import |       upjet.upbound.io/test: "true"
    logger.go:42: 17:49:00 | case/2-import |       uptest-old-id: bucket-op-u4keh593
    logger.go:42: 17:49:00 | case/2-import |     creationTimestamp: "2025-03-20T22:42:03Z"
    logger.go:42: 17:49:00 | case/2-import |     finalizers:
    logger.go:42: 17:49:00 | case/2-import |     - finalizer.managedresource.crossplane.io
    logger.go:42: 17:49:00 | case/2-import |     generation: 2
    logger.go:42: 17:49:00 | case/2-import |     labels:
    logger.go:42: 17:49:00 | case/2-import |       testing.upbound.io/example-name: bucket
    logger.go:42: 17:49:00 | case/2-import |     name: bucket-op-u4keh593
    logger.go:42: 17:49:00 | case/2-import |     resourceVersion: "6180"
    logger.go:42: 17:49:00 | case/2-import |     uid: c95290df-d4bf-43ab-8b90-dd426bf39271
    logger.go:42: 17:49:00 | case/2-import |   spec:
    logger.go:42: 17:49:00 | case/2-import |     deletionPolicy: Delete
    logger.go:42: 17:49:00 | case/2-import |     forProvider:
    logger.go:42: 17:49:00 | case/2-import |       cors:
    logger.go:42: 17:49:00 | case/2-import |       - maxAgeSeconds: 3600
    logger.go:42: 17:49:00 | case/2-import |         method:
    logger.go:42: 17:49:00 | case/2-import |         - GET
    logger.go:42: 17:49:00 | case/2-import |         - HEAD
    logger.go:42: 17:49:00 | case/2-import |         - PUT
    logger.go:42: 17:49:00 | case/2-import |         - POST
    logger.go:42: 17:49:00 | case/2-import |         - DELETE
    logger.go:42: 17:49:00 | case/2-import |         origin:
    logger.go:42: 17:49:00 | case/2-import |         - http://image-store.com
    logger.go:42: 17:49:00 | case/2-import |         responseHeader:
    logger.go:42: 17:49:00 | case/2-import |         - '*'
    logger.go:42: 17:49:00 | case/2-import |       forceDestroy: true
    logger.go:42: 17:49:00 | case/2-import |       location: US
    logger.go:42: 17:49:00 | case/2-import |       project: official-provider-testing
    logger.go:42: 17:49:00 | case/2-import |       publicAccessPrevention: inherited
    logger.go:42: 17:49:00 | case/2-import |       rpo: DEFAULT
    logger.go:42: 17:49:00 | case/2-import |       softDeletePolicy:
    logger.go:42: 17:49:00 | case/2-import |         retentionDurationSeconds: 604800
    logger.go:42: 17:49:00 | case/2-import |       storageClass: STANDARD
    logger.go:42: 17:49:00 | case/2-import |       uniformBucketLevelAccess: true
    logger.go:42: 17:49:00 | case/2-import |       website:
    logger.go:42: 17:49:00 | case/2-import |         mainPageSuffix: index.html
    logger.go:42: 17:49:00 | case/2-import |         notFoundPage: 404.html
    logger.go:42: 17:49:00 | case/2-import |     initProvider: {}
    logger.go:42: 17:49:00 | case/2-import |     managementPolicies:
    logger.go:42: 17:49:00 | case/2-import |     - '*'
    logger.go:42: 17:49:00 | case/2-import |     providerConfigRef:
    logger.go:42: 17:49:00 | case/2-import |       name: default
    logger.go:42: 17:49:00 | case/2-import |   status:
    logger.go:42: 17:49:00 | case/2-import |     atProvider:
    logger.go:42: 17:49:00 | case/2-import |       cors:
    logger.go:42: 17:49:00 | case/2-import |       - maxAgeSeconds: 3600
    logger.go:42: 17:49:00 | case/2-import |         method:
    logger.go:42: 17:49:00 | case/2-import |         - GET
    logger.go:42: 17:49:00 | case/2-import |         - HEAD
    logger.go:42: 17:49:00 | case/2-import |         - PUT
    logger.go:42: 17:49:00 | case/2-import |         - POST
    logger.go:42: 17:49:00 | case/2-import |         - DELETE
    logger.go:42: 17:49:00 | case/2-import |         origin:
    logger.go:42: 17:49:00 | case/2-import |         - http://image-store.com
    logger.go:42: 17:49:00 | case/2-import |         responseHeader:
    logger.go:42: 17:49:00 | case/2-import |         - '*'
    logger.go:42: 17:49:00 | case/2-import |       defaultEventBasedHold: false
    logger.go:42: 17:49:00 | case/2-import |       enableObjectRetention: false
    logger.go:42: 17:49:00 | case/2-import |       forceDestroy: true
    logger.go:42: 17:49:00 | case/2-import |       id: bucket-op-u4keh593
    logger.go:42: 17:49:00 | case/2-import |       location: US
    logger.go:42: 17:49:00 | case/2-import |       project: official-provider-testing
    logger.go:42: 17:49:00 | case/2-import |       projectNumber: 990150596479
    logger.go:42: 17:49:00 | case/2-import |       publicAccessPrevention: inherited
    logger.go:42: 17:49:00 | case/2-import |       requesterPays: false
    logger.go:42: 17:49:00 | case/2-import |       rpo: DEFAULT
    logger.go:42: 17:49:00 | case/2-import |       selfLink: https://www.googleapis.com/storage/v1/b/bucket-op-u4keh593
    logger.go:42: 17:49:00 | case/2-import |       softDeletePolicy:
    logger.go:42: 17:49:00 | case/2-import |         effectiveTime: "2025-03-20T22:48:06.850Z"
    logger.go:42: 17:49:00 | case/2-import |         retentionDurationSeconds: 604800
    logger.go:42: 17:49:00 | case/2-import |       storageClass: STANDARD
    logger.go:42: 17:49:00 | case/2-import |       uniformBucketLevelAccess: true
    logger.go:42: 17:49:00 | case/2-import |       url: gs://bucket-op-u4keh593
    logger.go:42: 17:49:00 | case/2-import |       website:
    logger.go:42: 17:49:00 | case/2-import |         mainPageSuffix: index.html
    logger.go:42: 17:49:00 | case/2-import |         notFoundPage: 404.html
    logger.go:42: 17:49:00 | case/2-import |     conditions:
    logger.go:42: 17:49:00 | case/2-import |     - lastTransitionTime: "2025-03-20T22:48:49Z"
    logger.go:42: 17:49:00 | case/2-import |       reason: ReconcileSuccess
    logger.go:42: 17:49:00 | case/2-import |       status: "True"
    logger.go:42: 17:49:00 | case/2-import |       type: Synced
    logger.go:42: 17:49:00 | case/2-import |     - lastTransitionTime: "2025-03-20T22:48:49Z"
    logger.go:42: 17:49:00 | case/2-import |       reason: Available
    logger.go:42: 17:49:00 | case/2-import |       status: "True"
    logger.go:42: 17:49:00 | case/2-import |       type: Ready
    logger.go:42: 17:49:00 | case/2-import |     - lastTransitionTime: "2025-03-20T22:48:49Z"
    logger.go:42: 17:49:00 | case/2-import |       reason: UpToDate
    logger.go:42: 17:49:00 | case/2-import |       status: "True"
    logger.go:42: 17:49:00 | case/2-import |       type: Test
    logger.go:42: 17:49:00 | case/2-import |     - lastTransitionTime: "2025-03-20T22:48:49Z"
    logger.go:42: 17:49:00 | case/2-import |       reason: Success
    logger.go:42: 17:49:00 | case/2-import |       status: "True"
    logger.go:42: 17:49:00 | case/2-import |       type: LastAsyncOperation
    logger.go:42: 17:49:00 | case/2-import | kind: List
    logger.go:42: 17:49:00 | case/2-import | metadata:
    logger.go:42: 17:49:00 | case/2-import |   resourceVersion: ""
    logger.go:42: 17:49:00 | case/2-import | running command: [/Users/dajohnson/projects/provider-upjet-gcp/.cache/tools/darwin_arm64/kubectl-v1.24.3 wait bucket.storage.gcp.upbound.io/bucket-op-u4keh593 --for=condition=Test --timeout 10s]
    logger.go:42: 17:49:02 | case/2-import | bucket.storage.gcp.upbound.io/bucket-op-u4keh593 condition met
    logger.go:42: 17:49:02 | case/2-import | running command: [sh -c new_id="$(${KUBECTL} get bucket.storage.gcp.upbound.io/bucket-op-u4keh593 -o=jsonpath='{.status.atProvider.id}')" && old_id="$(${KUBECTL} get bucket.storage.gcp.upbound.io/bucket-op-u4keh593 -o=jsonpath='{.metadata.annotations.uptest-old-id}')" && [ "$new_id" = "$old_id" ]]
    logger.go:42: 17:49:06 | case/2-import | test step completed 2-import
    logger.go:42: 17:49:06 | case/3-delete | starting test step 3-delete
    logger.go:42: 17:49:06 | case/3-delete | running command: [/Users/dajohnson/projects/provider-upjet-gcp/.cache/tools/darwin_arm64/kubectl-v1.24.3 delete bucket.storage.gcp.upbound.io/bucket-op-u4keh593 --wait=false --ignore-not-found]
    logger.go:42: 17:49:09 | case/3-delete | bucket.storage.gcp.upbound.io "bucket-op-u4keh593" deleted
I0320 17:49:10.250890   96041 request.go:655] Throttling request took 1.045592792s, request: GET:https://127.0.0.1:52511/apis/pkg.crossplane.io/v1?timeout=32s
    logger.go:42: 17:49:16 | case/3-delete | running command: [sh -c echo "Dump MR manifests for the delete assertion step:"; ${KUBECTL} get managed -o yaml]
    logger.go:42: 17:49:16 | case/3-delete | Dump MR manifests for the delete assertion step:
    logger.go:42: 17:49:20 | case/3-delete | apiVersion: v1
    logger.go:42: 17:49:20 | case/3-delete | items: []
    logger.go:42: 17:49:20 | case/3-delete | kind: List
    logger.go:42: 17:49:20 | case/3-delete | metadata:
    logger.go:42: 17:49:20 | case/3-delete |   resourceVersion: ""
    logger.go:42: 17:49:20 | case/3-delete | running command: [sh -c echo "Dump Claim manifests for the delete assertion step:" || ${KUBECTL} get claim --all-namespaces -o yaml]
    logger.go:42: 17:49:20 | case/3-delete | Dump Claim manifests for the delete assertion step:
    logger.go:42: 17:49:20 | case/3-delete | running command: [/Users/dajohnson/projects/provider-upjet-gcp/.cache/tools/darwin_arm64/kubectl-v1.24.3 wait bucket.storage.gcp.upbound.io/bucket-op-u4keh593 --for=delete --timeout 10s]
    logger.go:42: 17:49:23 | case/3-delete | running command: [/Users/dajohnson/projects/provider-upjet-gcp/.cache/tools/darwin_arm64/kubectl-v1.24.3 wait managed --all --for=delete --timeout 10s]
    logger.go:42: 17:49:27 | case/3-delete | test step completed 3-delete
I0320 17:49:28.943696   96041 request.go:655] Throttling request took 1.044696708s, request: GET:https://127.0.0.1:52511/apis/bigquery.gcp.upbound.io/v1beta2?timeout=32s
    logger.go:42: 17:49:34 | case | Failed to collect events for case in ns kuttl-test-intimate-rooster: no matches for kind "Event" in version "events.k8s.io/v1beta1"
    logger.go:42: 17:49:34 | case | Trying with events eventsv1 API...
    logger.go:42: 17:49:34 | case | case events from ns kuttl-test-intimate-rooster:
    logger.go:42: 17:49:34 | case | Deleting namespace: kuttl-test-intimate-rooster
=== CONT  kuttl
    harness.go:402: run tests finished
    harness.go:511: cleaning up
    harness.go:553: skipping cluster tear down
    harness.go:554: to connect to the cluster, run: export KUBECONFIG="/Users/dajohnson/projects/provider-upjet-gcp/kubeconfig"
--- PASS: kuttl (486.62s)
    --- PASS: kuttl/harness (0.00s)
        --- PASS: kuttl/harness/case (465.58s)

ldalorion avatar Mar 13 '25 20:03 ldalorion

Thanks @ldalorion!

I know in a lot of places we've started using https://pkg.go.dev/k8s.io/utils/ptr instead of the pointer utils that used to be in crossplane-runtime. Do you think we could use that library here in crossplane-tools?

negz avatar Mar 21 '25 18:03 negz

Yes! Started to make changes using that utility but replacing the functions that looped through each pointer and floating numbers was not as straightforward. So I just did a straight copypasta from crossplane-runtime first. I wanted to make sure that I was on the right path before investing anymore time and effort.

ldalorion avatar Mar 21 '25 22:03 ldalorion

@negz Soooo i tried to use them as much as possible but since we're converting strings to numbers (floats/ints) and back there's not much that the utility can replace. 😬

ldalorion avatar Mar 25 '25 18:03 ldalorion

@negz Added an additional change to update the generated code to not use the now deprecated helper functions FromPtrValue and ToPtrValue. I reran my upjet test case pointing to my local angryjet changes and everything passed.

--- PASS: kuttl (687.59s)
    --- PASS: kuttl/harness (0.00s)
        --- PASS: kuttl/harness/case (665.81s)
PASS
16:54:39 [ OK ] running automated tests

ldalorion avatar Mar 25 '25 21:03 ldalorion

Is there anything blocking this?

Duologic avatar Apr 18 '25 10:04 Duologic