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"