From 6489b9d8f52a834e0a21a7fe8d9ac8755992ca38 Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Tue, 10 Feb 2015 01:54:06 +0000 Subject: [PATCH 1/2] Added delete container support Signed-off-by: Jana Radhakrishnan --- adapters.yml | 2 ++ daemon/bridge.go | 1 + daemon/powerstrip.go | 57 +++++++++++++++++++++++++++++++------------- 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/adapters.yml b/adapters.yml index 589c273..c165416 100644 --- a/adapters.yml +++ b/adapters.yml @@ -4,5 +4,7 @@ endpoints: pre: [socketplane] "POST /*/containers/*/start": post: [socketplane] + "DELETE /*/containers/*": + post: [socketplane] adapters: socketplane: http://localhost:6675/adapter diff --git a/daemon/bridge.go b/daemon/bridge.go index a3d3dd0..346d4d2 100644 --- a/daemon/bridge.go +++ b/daemon/bridge.go @@ -196,6 +196,7 @@ func ConnectionRPCHandler(d *Daemon) { case ConnectionDelete: DeleteConnection(c.Connection.ConnectionDetails) delete(d.Connections, c.Connection.ContainerID) + c.Result <- c.Connection } } } diff --git a/daemon/powerstrip.go b/daemon/powerstrip.go index 0f4d140..aa6da39 100644 --- a/daemon/powerstrip.go +++ b/daemon/powerstrip.go @@ -49,7 +49,7 @@ func psAdapterPreHook(d *Daemon, reqParams adapterRequest) *adapterPreResponse { jsonBody := &dockerclient.ContainerConfig{} err := json.Unmarshal([]byte(reqParams.ClientRequest.Body), &jsonBody) if err != nil { - fmt.Println("Body JSON unmarsall failed", err) + fmt.Println("Body JSON unmarshall failed", err) } jsonBody.HostConfig.NetworkMode = "none" @@ -68,36 +68,59 @@ func psAdapterPreHook(d *Daemon, reqParams adapterRequest) *adapterPreResponse { } func psAdapterPostHook(d *Daemon, reqParams adapterRequest) *adapterPostResponse { + if reqParams.ClientRequest.Method != "POST" && + reqParams.ClientRequest.Method != "DELETE" { + fmt.Println("Invalid method: ", reqParams.ClientRequest.Method) + return nil + } + if reqParams.ClientRequest.Request != "" { // start api looks like this //containers//start s := regexp.MustCompile("/").Split(reqParams.ClientRequest.Request, 5) cid := s[3] - docker, _ := dockerclient.NewDockerClient( - "unix:///var/run/docker.sock", nil) - info, err := docker.InspectContainer(cid) - if err != nil { - fmt.Println("InspectContainer failed", err) - } + var cfg = &Connection{} + var op = ConnectionAdd + + switch reqParams.ClientRequest.Method { + case "POST": + docker, _ := dockerclient.NewDockerClient( + "unix:///var/run/docker.sock", nil) + info, err := docker.InspectContainer(cid) + if err != nil { + fmt.Println("InspectContainer failed", err) + return nil + } - cfg := &Connection{} + cfg.ContainerID = string(cid) + cfg.ContainerName = info.Name + cfg.ContainerPID = strconv.Itoa(info.State.Pid) + cfg.Network = DefaultNetworkName + for _, env := range info.Config.Env { + val := regexp.MustCompile("=").Split(env, 3) + if val[0] == "SP_NETWORK" { + cfg.Network = strings.Trim(val[1], " ") + } + } + + op = ConnectionAdd + case "DELETE": - cfg.ContainerID = string(cid) - cfg.ContainerName = info.Name - cfg.ContainerPID = strconv.Itoa(info.State.Pid) - cfg.Network = DefaultNetworkName - for _, env := range info.Config.Env { - val := regexp.MustCompile("=").Split(env, 3) - if val[0] == "SP_NETWORK" { - cfg.Network = strings.Trim(val[1], " ") + var ok bool + if cfg, ok = d.Connections[cid]; !ok { + fmt.Println("Couldn't find the connection", cid) + return nil } + + op = ConnectionDelete } context := &ConnectionContext{ - ConnectionAdd, + op, cfg, make(chan *Connection), } + d.cC <- context <-context.Result From 9f94bd0e149549f0b6d00bb46fffd9398b9d1192 Mon Sep 17 00:00:00 2001 From: Jana Radhakrishnan Date: Tue, 10 Feb 2015 02:19:07 +0000 Subject: [PATCH 2/2] Added proper error response Signed-off-by: Jana Radhakrishnan --- daemon/powerstrip.go | 45 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/daemon/powerstrip.go b/daemon/powerstrip.go index aa6da39..a883447 100644 --- a/daemon/powerstrip.go +++ b/daemon/powerstrip.go @@ -44,7 +44,13 @@ type adapterPostResponse struct { } } -func psAdapterPreHook(d *Daemon, reqParams adapterRequest) *adapterPreResponse { +func psAdapterPreHook(d *Daemon, reqParams adapterRequest) (preResp *adapterPreResponse) { + preResp = &adapterPreResponse{} + preResp.PowerstripProtocolVersion = reqParams.PowerstripProtocolVersion + preResp.ModifiedClientRequest.Method = reqParams.ClientRequest.Method + preResp.ModifiedClientRequest.Request = reqParams.ClientRequest.Request + preResp.ModifiedClientRequest.Body = reqParams.ClientRequest.Body + if reqParams.ClientRequest.Body != "" { jsonBody := &dockerclient.ContainerConfig{} err := json.Unmarshal([]byte(reqParams.ClientRequest.Body), &jsonBody) @@ -54,24 +60,26 @@ func psAdapterPreHook(d *Daemon, reqParams adapterRequest) *adapterPreResponse { jsonBody.HostConfig.NetworkMode = "none" - preResp := &adapterPreResponse{} - preResp.PowerstripProtocolVersion = reqParams.PowerstripProtocolVersion - preResp.ModifiedClientRequest.Method = reqParams.ClientRequest.Method - preResp.ModifiedClientRequest.Request = reqParams.ClientRequest.Request - body, _ := json.Marshal(jsonBody) preResp.ModifiedClientRequest.Body = string(body) - return preResp } - return nil + + return } -func psAdapterPostHook(d *Daemon, reqParams adapterRequest) *adapterPostResponse { +func psAdapterPostHook(d *Daemon, reqParams adapterRequest) (postResp *adapterPostResponse) { + postResp = &adapterPostResponse{} + postResp.PowerstripProtocolVersion = reqParams.PowerstripProtocolVersion + postResp.ModifiedServerResponse.ContentType = "application/json" + postResp.ModifiedServerResponse.Body = reqParams.ServerResponse.Body + postResp.ModifiedServerResponse.Code = reqParams.ServerResponse.Code + if reqParams.ClientRequest.Method != "POST" && reqParams.ClientRequest.Method != "DELETE" { fmt.Println("Invalid method: ", reqParams.ClientRequest.Method) - return nil + postResp.ModifiedServerResponse.Code = 500 + return } if reqParams.ClientRequest.Request != "" { @@ -89,7 +97,8 @@ func psAdapterPostHook(d *Daemon, reqParams adapterRequest) *adapterPostResponse info, err := docker.InspectContainer(cid) if err != nil { fmt.Println("InspectContainer failed", err) - return nil + postResp.ModifiedServerResponse.Code = 404 + return } cfg.ContainerID = string(cid) @@ -105,11 +114,11 @@ func psAdapterPostHook(d *Daemon, reqParams adapterRequest) *adapterPostResponse op = ConnectionAdd case "DELETE": - var ok bool if cfg, ok = d.Connections[cid]; !ok { fmt.Println("Couldn't find the connection", cid) - return nil + postResp.ModifiedServerResponse.Code = 500 + return } op = ConnectionDelete @@ -124,17 +133,9 @@ func psAdapterPostHook(d *Daemon, reqParams adapterRequest) *adapterPostResponse d.cC <- context <-context.Result - - postResp := &adapterPostResponse{} - postResp.PowerstripProtocolVersion = reqParams.PowerstripProtocolVersion - postResp.ModifiedServerResponse.ContentType = "application/json" - postResp.ModifiedServerResponse.Body = reqParams.ServerResponse.Body - postResp.ModifiedServerResponse.Code = reqParams.ServerResponse.Code - - return postResp } - return nil + return } func psAdapter(d *Daemon, w http.ResponseWriter, r *http.Request) *apiError {