(in-package #:nekod.docker) (defun list-networks (sock) "List all Docker networks on this host. Returns JSON body as a string." (multiple-value-bind (status body) (docker-get sock "/networks") (if (= status 200) body (error 'nekod:docker-api-error :message body :status-code status :endpoint "/networks")))) (defun inspect-network (sock id) "Inspect a Docker network by ID or name. Returns full JSON metadata as a string." (multiple-value-bind (status body) (docker-get sock (format nil "/networks/~a" id)) (if (= status 200) body (error 'nekod:docker-api-error :message body :status-code status :endpoint (format nil "/networks/~a" id))))) (defun create-network (sock name &key (driver "bridge") (internal nil) labels) "Create a Docker network. name — network name driver — network driver: \"bridge\", \"host\", \"overlay\", \"none\" internal — restrict external access when t labels — alist of string key-value pairs Returns JSON body (contains network ID) as a string." (let ((body (format nil "{\"Name\":~s,\"Driver\":~s,\"Internal\":~a,\"Labels\":{~{~s:~s~^,~}}}" name driver (if internal "true" "false") (loop for (k . v) in (or labels '()) nconc (list k v))))) (multiple-value-bind (status resp) (docker-post sock "/networks/create" body) (if (= status 201) resp (error 'nekod:docker-api-error :message resp :status-code status :endpoint "/networks/create"))))) (defun remove-network (sock id) "Remove a Docker network by ID or name. The network must have no active endpoints. Returns t on success." (multiple-value-bind (status body) (docker-delete sock (format nil "/networks/~a" id)) (if (= status 204) t (error 'nekod:docker-api-error :message body :status-code status :endpoint (format nil "/networks/~a" id))))) (defun connect-container-to-network (sock network-id container-id) "Connect a running container to a network. Returns t on success." (let ((body (format nil "{\"Container\":~s}" container-id))) (multiple-value-bind (status resp) (docker-post sock (format nil "/networks/~a/connect" network-id) body) (if (= status 200) t (error 'nekod:docker-api-error :message resp :status-code status :endpoint (format nil "/networks/~a/connect" network-id)))))) (defun disconnect-container-from-network (sock network-id container-id &optional (force nil)) "Disconnect a container from a network. force — force disconnect even if the container is still running. Returns t on success." (let ((body (format nil "{\"Container\":~s,\"Force\":~a}" container-id (if force "true" "false")))) (multiple-value-bind (status resp) (docker-post sock (format nil "/networks/~a/disconnect" network-id) body) (if (= status 200) t (error 'nekod:docker-api-error :message resp :status-code status :endpoint (format nil "/networks/~a/disconnect" network-id)))))) (defun prune-networks (sock) "Remove all unused Docker networks. Returns JSON summary as a string." (multiple-value-bind (status body) (docker-post sock "/networks/prune") (if (= status 200) body (error 'nekod:docker-api-error :message body :status-code status :endpoint "/networks/prune"))))