From 08853d5fa5d72853469d503e788164d17693be7e Mon Sep 17 00:00:00 2001 From: AKSHAT ANAND Date: Sun, 16 Nov 2025 18:59:29 +0000 Subject: [PATCH] Document registry_enabled limitation and add tests Fixes #433 The registry_enabled field is read-only in Kubernetes cluster responses and cannot be set during cluster creation. This is a limitation of the DigitalOcean API, not the pydo client. Changes: - Added comprehensive documentation in README explaining the correct approach for enabling container registry integration - Added integration test demonstrating the proper workflow: 1. Create cluster (registry_enabled defaults to False) 2. Call add_registry to enable integration 3. Verify registry_enabled is True 4. Call remove_registry to disable integration 5. Verify registry_enabled is False - Added mocked test showing the expected behavior - Both tests reference issue #433 for context The correct approach is to use the add_registry operation after cluster creation, rather than attempting to pass registry_enabled during creation. --- README.md | 31 +++++++++++++ tests/integration/test_kubernetes.py | 60 +++++++++++++++++++++++++ tests/mocked/test_kubernetes.py | 66 ++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) diff --git a/README.md b/README.md index 22049d46..4a4dbb0a 100644 --- a/README.md +++ b/README.md @@ -215,6 +215,37 @@ docker run -it --rm --name pydo -v $PWD/tests:/tests pydo:dev pytest tests/mocke >This selection lists the known issues of the client generator. +#### `kubernetes.create_cluster` does not accept `registry_enabled` parameter + +The `registry_enabled` field in Kubernetes cluster responses is read-only and cannot be set during cluster creation. To enable container registry integration with a Kubernetes cluster, you must use the `add_registry` operation after creating the cluster. + +**Correct approach:** + +```python +# Create cluster +cluster = client.kubernetes.create_cluster({ + 'name': 'my-cluster', + 'region': 'nyc3', + 'version': '1.32', + 'node_pools': [{ + 'size': 's-1vcpu-2gb', + 'count': 2, + 'name': 'worker-pool' + }] +}) + +cluster_id = cluster['kubernetes_cluster']['id'] + +# Enable registry integration +client.kubernetes.add_registry({'cluster_uuids': [cluster_id]}) + +# Verify registry is enabled +updated_cluster = client.kubernetes.get_cluster(cluster_id) +assert updated_cluster['kubernetes_cluster']['registry_enabled'] is True +``` + +See [issue #433](https://github.com/digitalocean/pydo/issues/433) for more details. + #### `kubernetes.get_kubeconfig` Does not serialize response content In the generated python client, when calling client.kubernetes.get_kubeconfig(clust_id), the deserialization logic raises an error when the response content-type is applicaiton/yaml. We need to determine if the spec/schema can be configured such that the generator results in functions that properly handle the content. We will likely need to report the issue upstream to request support for the content-type. diff --git a/tests/integration/test_kubernetes.py b/tests/integration/test_kubernetes.py index d170b97b..eb5a7c8f 100644 --- a/tests/integration/test_kubernetes.py +++ b/tests/integration/test_kubernetes.py @@ -312,3 +312,63 @@ def test_kubernetes_upgrade_cluster(integration_client: Client, existing_cluster cluster_id, {"version": next_version} ) assert resp is None + + +def test_kubernetes_cluster_registry_integration( + integration_client: Client, existing_cluster_id +): + """Tests container registry integration with Kubernetes cluster. + + This test demonstrates the correct approach for enabling container registry + integration with a Kubernetes cluster. The registry_enabled field is read-only + in the cluster response, so registry integration must be enabled using the + add_registry operation after cluster creation. + + This test covers: + 1. Creating a cluster (registry_enabled is False by default) + 2. Enabling registry integration using add_registry + 3. Verifying registry_enabled is True + 4. Removing registry integration + 5. Verifying registry_enabled is False + + Related to: https://github.com/digitalocean/pydo/issues/433 + """ + create_req = { + "name": f"{defaults.PREFIX}-registry-test-{uuid.uuid4().hex}", + "region": defaults.REGION, + "version": defaults.K8S_VERSION, + "node_pools": [{"size": defaults.K8S_NODE_SIZE, "count": 2, "name": "workers"}], + } + + with shared.with_test_kubernetes_cluster( + integration_client, + wait=True, + existing_cluster_id=existing_cluster_id, + **create_req, + ) as cluster: + cluster_id = cluster["kubernetes_cluster"]["id"] + assert cluster_id != "" + + # Verify registry is not enabled by default + cluster_details = integration_client.kubernetes.get_cluster(cluster_id) + assert ( + cluster_details["kubernetes_cluster"]["registry_enabled"] is False + ), "Registry should not be enabled by default" + + # Enable registry integration + integration_client.kubernetes.add_registry({"cluster_uuids": [cluster_id]}) + + # Verify registry is now enabled + cluster_details = integration_client.kubernetes.get_cluster(cluster_id) + assert ( + cluster_details["kubernetes_cluster"]["registry_enabled"] is True + ), "Registry should be enabled after add_registry call" + + # Disable registry integration + integration_client.kubernetes.remove_registry({"cluster_uuids": [cluster_id]}) + + # Verify registry is now disabled + cluster_details = integration_client.kubernetes.get_cluster(cluster_id) + assert ( + cluster_details["kubernetes_cluster"]["registry_enabled"] is False + ), "Registry should be disabled after remove_registry call" diff --git a/tests/mocked/test_kubernetes.py b/tests/mocked/test_kubernetes.py index 703ebb7c..9e7d937c 100644 --- a/tests/mocked/test_kubernetes.py +++ b/tests/mocked/test_kubernetes.py @@ -531,3 +531,69 @@ def test_kubernetes_remove_container_registry(mock_client: Client, mock_client_u } ) assert add_reg_resp is None + + +@responses.activate +def test_kubernetes_cluster_with_registry_integration( + mock_client: Client, mock_client_url +): + """Test demonstrating correct approach for registry integration. + + This test shows that registry_enabled cannot be set during cluster creation. + Instead, the add_registry operation must be used after cluster creation. + + Related to: https://github.com/digitalocean/pydo/issues/433 + """ + cluster_id = "bd5f5959-5e1e-4205-a714-a914373942af" + + # Create cluster - registry_enabled will be False by default + cluster_without_registry = data.CLUSTER.copy() + responses.add( + responses.POST, + f"{mock_client_url}/{BASE_PATH}", + json=cluster_without_registry, + status=201, + ) + + cluster = mock_client.kubernetes.create_cluster( + { + "name": "registry-test-cluster", + "region": "ams3", + "version": "1.32", + "node_pools": [ + { + "size": "s-1vcpu-2gb", + "count": 2, + "name": "worker-pool", + } + ], + } + ) + + # Verify cluster was created with registry_enabled=False + assert cluster["kubernetes_cluster"]["registry_enabled"] is False + + # Add registry integration + responses.add( + responses.POST, + f"{mock_client_url}/v2/kubernetes/registry", + status=204, + ) + + mock_client.kubernetes.add_registry({"cluster_uuids": [cluster_id]}) + + # Get cluster details - now registry should be enabled + cluster_with_registry = data.CLUSTER.copy() + cluster_with_registry["kubernetes_cluster"]["registry_enabled"] = True + + responses.add( + responses.GET, + f"{mock_client_url}/{BASE_PATH}/{cluster_id}", + json=cluster_with_registry, + status=200, + ) + + updated_cluster = mock_client.kubernetes.get_cluster(cluster_id) + assert ( + updated_cluster["kubernetes_cluster"]["registry_enabled"] is True + ), "Expected registry to be enabled after add_registry call"