Browse code

Include Endpoint List for Shared Endpoints Do not allow sharing of container network with hyperv containers

Signed-off-by: Madhan Raj Mookkandy <madhanm@microsoft.com>

Madhan Raj Mookkandy authored on 2017/06/13 07:20:23
Showing 6 changed files
... ...
@@ -107,7 +107,8 @@ type Container struct {
107 107
 	NoNewPrivileges bool
108 108
 
109 109
 	// Fields here are specific to Windows
110
-	NetworkSharedContainerID string
110
+	NetworkSharedContainerID string   `json:"-"`
111
+	SharedEndpointList       []string `json:"-"`
111 112
 }
112 113
 
113 114
 // NewBaseContainer creates a new container with its
... ...
@@ -886,7 +886,12 @@ func (daemon *Daemon) initializeNetworking(container *container.Container) error
886 886
 		if err != nil {
887 887
 			return err
888 888
 		}
889
-		initializeNetworkingPaths(container, nc)
889
+
890
+		err = daemon.initializeNetworkingPaths(container, nc)
891
+		if err != nil {
892
+			return err
893
+		}
894
+
890 895
 		container.Config.Hostname = nc.Config.Hostname
891 896
 		container.Config.Domainname = nc.Config.Domainname
892 897
 		return nil
... ...
@@ -42,5 +42,6 @@ func setupPathsAndSandboxOptions(container *container.Container, sboxOptions *[]
42 42
 	return nil
43 43
 }
44 44
 
45
-func initializeNetworkingPaths(container *container.Container, nc *container.Container) {
45
+func (daemon *Daemon) initializeNetworkingPaths(container *container.Container, nc *container.Container) error {
46
+	return nil
46 47
 }
... ...
@@ -349,8 +349,9 @@ func setupPathsAndSandboxOptions(container *container.Container, sboxOptions *[]
349 349
 	return nil
350 350
 }
351 351
 
352
-func initializeNetworkingPaths(container *container.Container, nc *container.Container) {
352
+func (daemon *Daemon) initializeNetworkingPaths(container *container.Container, nc *container.Container) error {
353 353
 	container.HostnamePath = nc.HostnamePath
354 354
 	container.HostsPath = nc.HostsPath
355 355
 	container.ResolvConfPath = nc.ResolvConfPath
356
+	return nil
356 357
 }
... ...
@@ -160,6 +160,43 @@ func setupPathsAndSandboxOptions(container *container.Container, sboxOptions *[]
160 160
 	return nil
161 161
 }
162 162
 
163
-func initializeNetworkingPaths(container *container.Container, nc *container.Container) {
163
+func (daemon *Daemon) initializeNetworkingPaths(container *container.Container, nc *container.Container) error {
164
+
165
+	if nc.HostConfig.Isolation.IsHyperV() {
166
+		return fmt.Errorf("sharing of hyperv containers network is not supported")
167
+	}
168
+
164 169
 	container.NetworkSharedContainerID = nc.ID
170
+
171
+	if nc.NetworkSettings != nil {
172
+		for n := range nc.NetworkSettings.Networks {
173
+			sn, err := daemon.FindNetwork(n)
174
+			if err != nil {
175
+				continue
176
+			}
177
+
178
+			ep, err := nc.GetEndpointInNetwork(sn)
179
+			if err != nil {
180
+				continue
181
+			}
182
+
183
+			data, err := ep.DriverInfo()
184
+			if err != nil {
185
+				continue
186
+			}
187
+
188
+			if data["GW_INFO"] != nil {
189
+				gwInfo := data["GW_INFO"].(map[string]interface{})
190
+				if gwInfo["hnsid"] != nil {
191
+					container.SharedEndpointList = append(container.SharedEndpointList, gwInfo["hnsid"].(string))
192
+				}
193
+			}
194
+
195
+			if data["hnsid"] != nil {
196
+				container.SharedEndpointList = append(container.SharedEndpointList, data["hnsid"].(string))
197
+			}
198
+		}
199
+	}
200
+
201
+	return nil
165 202
 }
... ...
@@ -150,7 +150,11 @@ func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Contain
150 150
 	var networkSharedContainerID string
151 151
 	if container.HostConfig.NetworkMode.IsContainer() {
152 152
 		networkSharedContainerID = container.NetworkSharedContainerID
153
+		for _, ep := range container.SharedEndpointList {
154
+			epList = append(epList, ep)
155
+		}
153 156
 	}
157
+
154 158
 	createOptions = append(createOptions, &libcontainerd.NetworkEndpointsOption{
155 159
 		Endpoints:                epList,
156 160
 		AllowUnqualifiedDNSQuery: AllowUnqualifiedDNSQuery,