From 031e09d888692441988e60854d944658231e183e Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Thu, 4 Jun 2015 09:41:42 -0700 Subject: [PATCH] duplicate endpoint error handling Signed-off-by: Madhu Venugopal --- libnetwork/libnetwork_test.go | 44 +++++++++++++++++++++++++++++++++++ libnetwork/network.go | 5 ++++ 2 files changed, 49 insertions(+) diff --git a/libnetwork/libnetwork_test.go b/libnetwork/libnetwork_test.go index d33e206126..bdde275aed 100644 --- a/libnetwork/libnetwork_test.go +++ b/libnetwork/libnetwork_test.go @@ -627,6 +627,50 @@ func TestNetworkEndpointsWalkers(t *testing.T) { } } +func TestDuplicateEndpoint(t *testing.T) { + if !netutils.IsRunningInContainer() { + defer netutils.SetupTestNetNS(t)() + } + + n, err := controller.NewNetwork(bridgeNetType, "testnetwork", nil) + if err != nil { + t.Fatal(err) + } + defer func() { + if err := n.Delete(); err != nil { + t.Fatal(err) + } + }() + + ep, err := n.CreateEndpoint("ep1") + if err != nil { + t.Fatal(err) + } + defer func() { + if err := ep.Delete(); err != nil { + t.Fatal(err) + } + }() + + ep2, err := n.CreateEndpoint("ep1") + defer func() { + // Cleanup ep2 as well, else network cleanup might fail for failure cases + if ep2 != nil { + if err := ep2.Delete(); err != nil { + t.Fatal(err) + } + } + }() + + if err == nil { + t.Fatal("Expected to fail. But instead succeeded") + } + + if _, ok := err.(types.ForbiddenError); !ok { + t.Fatalf("Did not fail with expected error. Actual error: %v", err) + } +} + func TestControllerQuery(t *testing.T) { if !netutils.IsRunningInContainer() { defer netutils.SetupTestNetNS(t)() diff --git a/libnetwork/network.go b/libnetwork/network.go index 8a25b845b2..e4684b99b5 100644 --- a/libnetwork/network.go +++ b/libnetwork/network.go @@ -195,6 +195,11 @@ func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoi if name == "" { return nil, ErrInvalidName(name) } + + if _, err := n.EndpointByName(name); err == nil { + return nil, types.ForbiddenErrorf("service endpoint with name %s already exists", name) + } + ep := &endpoint{name: name, iFaces: []*endpointInterface{}, generic: make(map[string]interface{})} ep.id = types.UUID(stringid.GenerateRandomID()) ep.network = n