TypeError wrong type parsing cert_requests

Bug #2058095 reported by Gaetan Gouzi
10
This bug affects 2 people
Affects Status Importance Assigned to Milestone
Kubernetes API Load Balancer
New
Undecided
Unassigned
Kubernetes Control Plane Charm
New
Undecided
Unassigned
Kubernetes Worker Charm
New
Undecided
Unassigned

Bug Description

When deploying k8s on top of Openstack using fce, everything is smooth until I want to attach a floating IP to the kubernetes-control-plane unit.

channel: latest/stable

From then, the unit goes in blocking state
`kubernetes-control-plane/0* blocked idle 3 172.27.47.194 6443/tcp Failed to reconcile, see debug-log`

The associated error is
```
unit-kubernetes-control-plane-0: 07:09:03 ERROR unit.kubernetes-control-plane/0.juju-log 'str' object does not support item assignment
Traceback (most recent call last):
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-0/charm/venv/charms/reconciler.py", line 34, in reconcile
    result = self.reconcile_function(event)
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-0/charm/./src/charm.py", line 486, in reconcile
    self.request_certificates()
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-0/charm/./src/charm.py", line 577, in request_certificates
    self.certificates.request_server_cert(cn=common_name, sans=sans)
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-0/charm/venv/ops/interface_tls_certificates/requires.py", line 160, in request_server_cert
    requests[cn] = {"sans": sans or []}
TypeError: 'str' object does not support item assignment
```

The error is located in the `ops/interface_tls_certificates/requires.py` file

```
requests = data.get("cert_requests", {})
requests[cn] = {"sans": sans or []}
data["cert_requests"] = json.dumps(requests)
```

When the `cert_requests` variable is not empty, it is assumed to be a dict.
But in the databag of the juju relation, it is clearly a string

jhack utils show-relation kubernetes-control-plane/0:certificates vault/0:certificates --format json

```
...
"units_data": {
        "0": {
          "cert_requests": "{\"172.27.47.194\": {\"sans\": [\"10.152.183.1\", \"127.0.0.1\", \"172.27.47.194\", \"192.168.0.103\", \"192.168.0.160\", \"juju-44208a-kubernetes-3\", \"juju-44208a-kubernetes-3.openstack.orangebox.lan\",
\"kubernetes\", \"kubernetes.cluster.local\", \"kubernetes.default\", \"kubernetes.default.svc\", \"kubernetes.default.svc.cluster.local\"]}}",
          "certificate_name": "6f1ad40e-56f9-4a8c-ba35-60ff6fe84a03",
          "client_cert_requests": "{\"system:kube-apiserver\": {\"sans\": null}}",
          "common_name": "192.168.0.160",
          "sans": "[\"10.152.183.1\", \"127.0.0.1\", \"192.168.0.103\", \"192.168.0.160\", \"juju-44208a-kubernetes-3\", \"juju-44208a-kubernetes-3.openstack.orangebox.lan\", \"kubernetes\", \"kubernetes.cluster.local\",
\"kubernetes.default\", \"kubernetes.default.svc\", \"kubernetes.default.svc.cluster.local\"]",
          "unit_name": "kubernetes-control-plane_0"
        }
      },
```

Current workaround is to edit the charm and force type casting of requests into a dict
```
requests = data.get("cert_requests", {})
import json
requests = json.loads(requests)
requests[cn] = {"sans": sans or []}
data["cert_requests"] = json.dumps(requests)
```

Unit is now active/idle

Revision history for this message
Gaetan Gouzi (ggouzi) wrote :
affects: charm-kubernetes-master → charm-kubeapi-load-balancer
Revision history for this message
Jeff Rivero (jeffrm2) wrote :

WE also have the same issue
unit-kubernetes-control-plane-1: 19:58:46 ERROR unit.kubernetes-control-plane/1.juju-log 'str' object does not support item assignment
Traceback (most recent call last):
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-1/charm/venv/charms/reconciler.py", line 34, in reconcile
    result = self.reconcile_function(event)
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-1/charm/./src/charm.py", line 499, in reconcile
    self.request_certificates()
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-1/charm/./src/charm.py", line 592, in request_certificates
    self.certificates.request_server_cert(cn=common_name, sans=sans)
  File "/var/lib/juju/agents/unit-kubernetes-control-plane-1/charm/venv/ops/interface_tls_certificates/requires.py", line 160, in request_server_cert
    requests[cn] = {"sans": sans or []}
TypeError: 'str' object does not support item assignment

This also affects the control plane and all workers
the same patch works
```
requests = data.get("cert_requests", {})
import json
requests = json.loads(requests)
requests[cn] = {"sans": sans or []}
data["cert_requests"] = json.dumps(requests)
```

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.