瀏覽代碼

Merge pull request #256 from mavenugo/dup_endpoint

duplicate endpoint error handling
aboch 10 年之前
父節點
當前提交
3e160cb896
共有 2 個文件被更改,包括 49 次插入0 次删除
  1. 44 0
      libnetwork/libnetwork_test.go
  2. 5 0
      libnetwork/network.go

+ 44 - 0
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)()

+ 5 - 0
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