Skip to content

Unexpected 500 on /services/haproxy/runtime/ssl_certs when resource already exists #400

@mpenny-github

Description

@mpenny-github

Expected behaviour

Per https://www.haproxy.com/documentation/dataplaneapi/community/?v=v3#post-/services/haproxy/runtime/ssl_certs post /services/haproxy/runtime/ssl_certs should return a 409 if "the specified resource already exists".

Actual behavior

Returns a 500 instead:

curl -s --unix-socket "/data/run/dataplaneapi.sock" "http://localhost/v3/services/haproxy/runtime/ssl_certs"   -v'                    
*   Trying /data/run/dataplaneapi.sock:0...
* Connected to localhost (/data/run/dataplaneapi.sock) port 80 (#0)
> GET /v3/services/haproxy/runtime/ssl_certs HTTP/1.1
> Host: localhost
> User-Agent: curl/7.86.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Configuration-Version: 1
< Content-Type: application/json
< Vary: Origin
< Date: Fri, 23 Jan 2026 13:40:44 GMT
< Content-Length: 1381
< 
{ [1381 bytes data]
* Connection #0 to host localhost left intact
[{"description":"example.com","storage_name":"/data/haproxy/ssl/example.com"}]
curl -s --unix-socket "/data/run/dataplaneapi.sock" "http://localhost/v3/services/haproxy/runtime/ssl_certs"  -X POST -F "file_upload=@/data/haproxy/ssl/example.com"  -v'
*   Trying /data/run/dataplaneapi.sock:0...
* Connected to localhost (/data/run/dataplaneapi.sock) port 80 (#0)
> POST /v3/services/haproxy/runtime/ssl_certs HTTP/1.1
> Host: localhost
> User-Agent: curl/7.86.0
> Accept: */*
> Content-Length: 3480
> Content-Type: multipart/form-data; boundary=------------------------914ee16b89929b78
> 
} [3480 bytes data]
* We are completely uploaded and fine
* Mark bundle as not supporting multiuse
< HTTP/1.1 500 Internal Server Error
< Configuration-Version: 1
< Content-Type: application/json
< Vary: Origin
< Date: Fri, 23 Jan 2026 13:40:20 GMT
< Content-Length: 153
< 
{ [153 bytes data]
* Connection #0 to host localhost left intact
{"code":500,"message":"/tmp/admin.sock [3]  Certificate 'example.com' already exists! [new ssl cert example.com] general error"}

Additional information

haproxy.cfg:

global
  stats socket /tmp/admin.sock mode 600 level admin


defaults www_defaults
  mode http

userlist haproxy-dataplaneapi

resolvers docker
  nameserver dnsmasq 127.0.0.11:53

frontend www from www_defaults
  bind *:8888
  bind *:8443 ssl crt /data/haproxy/ssl/

  http-request set-var(txn.path_config) path,map_reg(opt@/data/haproxy/maps/path_percentage_routing.map)
  http-request set-var(txn.backend_key) var(txn.path_config),field(2,|) 
  acl has_dynamic_backend var(txn.backend_key) -m found

  use_backend %[var(txn.backend_key)] if has_dynamic_backend

  default_backend legacy

backend legacy from www_defaults
  server app app:8001 check resolvers docker resolve-prefer ipv4

backend backend1 from www_defaults
  http-request return status 200 content-type "text/plain" lf-string "200 OK" hdr "X-Backend" "backend1"

backend backend2 from www_defaults
  http-request return status 200 content-type "text/plain" lf-string "200 OK" hdr "X-Backend" "backend2"

dataplaneapi.yaml:

config_version: 2
name: 40a1dac72c2f
dataplaneapi:
  show_system_info: true
  socket_path: /data/run/dataplaneapi.sock
  host: 127.0.0.1
  disable_inotify: true
  advertised:
    api_address: ""
    api_port: 0
  scheme:
  - unix
  userlist:
    userlist: controller
    userlist_file: ""
  transaction:
    transaction_dir: /data/dataplaneapi/transactions
    backups_number: 10
    backups_dir: /data/dataplaneapi/backups
    max_open_transactions: 10
  resources:
    maps_dir: /data/haproxy/maps
    ssl_certs_dir: /data/haproxy/ssl
    general_storage_dir: /data/dataplaneapi/general
    dataplane_storage_dir: /data/dataplaneapi/dataplane
    spoe_dir: /data/dataplaneapi/spoe
haproxy:
  config_file: /data/haproxy/haproxy.cfg
  haproxy_bin: /usr/sbin/haproxy
  reload:
    reload_delay: 5
    service_name: /run/service/haproxy
    reload_strategy: s6
log_targets:
- log_to: stdout
  log_level: debug
  log_format: text
  log_types:
  - app
  - access

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions