Skip to content

Commit

Permalink
Update network/api.go
Browse files Browse the repository at this point in the history
- Add the new AddExternalConnectivity(), RevokeExternalConnectivity() methods

Signed-off-by: Alessandro Boch <[email protected]>
  • Loading branch information
aboch committed Mar 21, 2016
1 parent 28d1161 commit 602166a
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 0 deletions.
47 changes: 47 additions & 0 deletions network/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ const (
leavePath = "/NetworkDriver.Leave"
discoverNewPath = "/NetworkDriver.DiscoverNew"
discoverDeletePath = "/NetworkDriver.DiscoverDelete"
programExtConnPath = "/NetworkDriver.ProgramExternalConnectivity"
revokeExtConnPath = "/NetworkDriver.RevokeExternalConnectivity"
)

// Driver represent the interface a driver must fulfill.
Expand All @@ -38,6 +40,8 @@ type Driver interface {
Leave(*LeaveRequest) error
DiscoverNew(*DiscoveryNotification) error
DiscoverDelete(*DiscoveryNotification) error
ProgramExternalConnectivity(*ProgramExternalConnectivityRequest) error
RevokeExternalConnectivity(*RevokeExternalConnectivityRequest) error
}

// CapabilitiesResponse returns whether or not this network is global or local
Expand Down Expand Up @@ -151,6 +155,21 @@ type DiscoveryNotification struct {
DiscoveryData interface{}
}

// ProgramExternalConnectivityRequest specifies the L4 data
// and the endpoint for which programming has to be done
type ProgramExternalConnectivityRequest struct {
NetworkID string
EndpointID string
Options map[string]interface{}
}

// RevokeExternalConnectivityRequest specifies the endpoint
// for which the L4 programming has to be removed
type RevokeExternalConnectivityRequest struct {
NetworkID string
EndpointID string
}

// NewErrorResponse creates an ErrorResponse with the provided message
func NewErrorResponse(msg string) *ErrorResponse {
return &ErrorResponse{Err: msg}
Expand Down Expand Up @@ -308,4 +327,32 @@ func (h *Handler) initMux() {
}
sdk.EncodeResponse(w, make(map[string]string), "")
})
h.HandleFunc(programExtConnPath, func(w http.ResponseWriter, r *http.Request) {
req := &ProgramExternalConnectivityRequest{}
err := sdk.DecodeRequest(w, r, req)
if err != nil {
return
}
err = h.driver.ProgramExternalConnectivity(req)
if err != nil {
msg := err.Error()
sdk.EncodeResponse(w, NewErrorResponse(msg), msg)
return
}
sdk.EncodeResponse(w, make(map[string]string), "")
})
h.HandleFunc(revokeExtConnPath, func(w http.ResponseWriter, r *http.Request) {
req := &RevokeExternalConnectivityRequest{}
err := sdk.DecodeRequest(w, r, req)
if err != nil {
return
}
err = h.driver.RevokeExternalConnectivity(req)
if err != nil {
msg := err.Error()
sdk.EncodeResponse(w, NewErrorResponse(msg), msg)
return
}
sdk.EncodeResponse(w, make(map[string]string), "")
})
}
36 changes: 36 additions & 0 deletions network/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,26 @@ func (t *TestDriver) Leave(r *LeaveRequest) error {
return nil
}

func (t *TestDriver) ProgramExternalConnectivity(r *ProgramExternalConnectivityRequest) error {
i := r.Options["com.docker.network.endpoint.exposedports"]
epl, ok := i.([]interface{})
if !ok {
return fmt.Errorf("invalid data in request: %v (%T)", i, i)
}
ep, ok := epl[0].(map[string]interface{})
if !ok {
return fmt.Errorf("invalid data in request: %v (%T)", epl[0], epl[0])
}
if ep["Proto"].(float64) != 6 || ep["Port"].(float64) != 70 {
return fmt.Errorf("Unexpected exposed ports in request: %v", ep)
}
return nil
}

func (t *TestDriver) RevokeExternalConnectivity(r *RevokeExternalConnectivityRequest) error {
return nil
}

type ErrDriver struct {
Driver
}
Expand Down Expand Up @@ -153,3 +173,19 @@ func TestCreateNetworkError(t *testing.T) {
t.Fatalf("Expected %s, got %s\n", "{\"Err\":\"I CAN HAZ ERRORZ\"}\n", string(body))
}
}

func TestProgramExternalConnectivity(t *testing.T) {
request := `{"NetworkID":"d76cfa51738e8a12c5eca71ee69e9d65010a4b48eaad74adab439be7e61b9aaf","EndpointID":"abccfa51738e8a12c5eca71ee69e9d65010a4b48eaad74adab439be7e61b9aaf","Options":{"com.docker.network.endpoint.exposedports":[{"Proto":6,"Port":70}],"com.docker.network.portmap":[{"Proto":6,"IP":"","Port":70,"HostIP":"","HostPort":7000,"HostPortEnd":7000}]}}`
response, err := http.Post("http://localhost:32234/NetworkDriver.ProgramExternalConnectivity",
sdk.DefaultContentTypeV1_1,
strings.NewReader(request))
if err != nil {
t.Fatal(err)
}
defer response.Body.Close()

if response.StatusCode != http.StatusOK {
body, _ := ioutil.ReadAll(response.Body)
t.Fatalf("Expected %d, got %d: %s\n", http.StatusOK, response.StatusCode, string(body))
}
}

0 comments on commit 602166a

Please sign in to comment.