Claus Ibsen created CAMEL-26240:
-----------------------------------

             Summary: camel-kubernetes - custom-resources ignores the crd* 
endpoint options, and scale fails with a NullPointerException when the resource 
has no status yet
                 Key: CAMEL-26240
                 URL: https://issues.apache.org/jira/browse/CAMEL-26240
             Project: Camel
          Issue Type: Bug
          Components: camel-kubernetes
            Reporter: Claus Ibsen
             Fix For: 4.24.0


Found while adding the catalog body types of the kubernetes components 
(CAMEL-24961, PR #28399 and PR #28400). The openshift-* components are in a 
separate issue.

h4. 1. kubernetes-custom-resources producer ignores the crd* endpoint options

{{KubernetesCustomResourcesProducer.getCRDContext}} (main 2a465aa4814c, lines 
226-255) checks the {{crdName}}, {{crdGroup}}, {{crdScope}}, {{crdVersion}} and 
{{crdPlural}} options (else the headers), but builds the context from the 
headers only (lines 257-262). With only the endpoint options set, every 
operation fails; listCustomResources fails with "Neither kind nor plural was 
set". Checked on 4.24.0-SNAPSHOT with the fabric8 Kubernetes mock server in 
CRUD mode.

Proposed: build the context from the resolved values.

h4. 2. kubernetes-custom-resources getCustomResource of a missing name fails

{{doGet}} (line 152) calls {{.require()}}, which throws a 
{{ResourceNotFoundException}} that the 404 catch (lines 155-160) does not 
handle, so a missing name fails the exchange instead of returning the empty 
JsonObject the code means to return. Checked on 4.24.0-SNAPSHOT with the 
fabric8 Kubernetes mock server in CRUD mode.

Proposed: use {{.get()}} and return the empty JsonObject (or null) when it is 
null.

h4. 3. kubernetes-custom-resources create/update: a 409 is swallowed

{{doCreateOrUpdate}} (lines 208-214) catches a 409 Conflict, logs it at INFO, 
and sets an empty {{GenericKubernetesResource}} as the body, so the exchange 
succeeds although nothing was created or updated. Checked on 4.24.0-SNAPSHOT 
with the fabric8 Kubernetes mock server in CRUD mode.

Proposed: let the conflict fail the exchange (or set a header that says so).

h4. 4. kubernetes-custom-resources consumer: inverted namespace check

{{KubernetesCustomResourcesConsumer}} (lines 87-88) logs "namespace is not 
specified." at ERROR when a namespace IS set ({{isNotEmpty}}). Checked on 
4.24.0-SNAPSHOT with the fabric8 Kubernetes mock server in CRUD mode.

Proposed: invert the check.

h4. 5. scale fails when the resource has no status yet (deployments, 
replication-controllers)

{{KubernetesDeploymentsProducer}} scaleDeployment (line 235) and 
{{KubernetesReplicationControllersProducer}} scaleReplicationController (line 
229) return {{getStatus().getReplicas()}}: when the returned resource has no 
status yet this is a NullPointerException, and otherwise it is the current 
count, which may lag behind the requested one. Checked on 4.24.0-SNAPSHOT with 
the fabric8 Kubernetes mock server in CRUD mode.

Proposed: return the requested replicas (or {{getSpec().getReplicas()}}) and 
guard against a null status.

h4. 6. persistent-volumes listPersistentVolumesByLabels without labels

{{KubernetesPersistentVolumesProducer}} (line 80) passes the labels header to 
{{withLabels(labels)}}; without it this fails with a NullPointerException '"m" 
is null'. Checked on 4.24.0-SNAPSHOT with the fabric8 Kubernetes mock server in 
CRUD mode.

Proposed: fail with a message that the labels header is required (or list all 
when it is missing).

h4. 7. The namespace URI option is used only by consumers

The producers checked in PR #28400 (persistent-volumes-claims, 
replication-controllers, resources-quota, secrets, service-accounts, services, 
and the openshift ones) read the namespace from 
{{CamelKubernetesNamespaceName}} only (for example 
{{KubernetesServicesProducer}} line 90); the {{namespace}} endpoint option is 
ignored. In main only {{KubernetesCustomResourcesProducer}} reads the option. 
Checked on 4.24.0-SNAPSHOT with the fabric8 Kubernetes mock server in CRUD mode.

Proposed: fall back to the {{namespace}} option when the header is not set, in 
all producers.

h4. 8. kubernetes-secrets: the annotations header mutates the Secret header

{{KubernetesSecretsProducer.doCreateOrUpdateSecret}} (lines 159-160) sets the 
annotations on the {{Secret}} from the {{CamelKubernetesSecret}} header in 
place, so the caller's object is changed, and a Secret without metadata fails 
with a NullPointerException. Read in the code, not run.

Proposed: copy the Secret (or its metadata) before adding the annotations, and 
create the metadata when it is missing.

h4. 9. Docs: kubernetes-services misses updateService

The producer operation list of {{kubernetes-services-component.adoc}} (lines 
35-36) has createService and deleteService but not updateService. Not fixed in 
the PR.

Proposed: add updateService.

_Claude Code on behalf of davsclaus_



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to