[lxc-devel] [lxd/master] network_linux: handle network retrieval smarter

brauner on Github lxc-bot at linuxcontainers.org
Thu Sep 20 09:08:55 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180920/0b0ccaea/attachment.bin>
-------------- next part --------------
From a03f30d569a684aa11af8b3ed1d4ed1a6a27e4d5 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Thu, 20 Sep 2018 11:05:04 +0200
Subject: [PATCH] network_linux: handle network retrieval smarter

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/container_lxc.go    | 48 ++++++++++++++++++++++-------------------
 shared/network_linux.go |  4 +++-
 2 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 1f4cc0677a..86176f3485 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -6066,33 +6066,37 @@ func (c *containerLXC) networkState() map[string]api.ContainerStateNetwork {
 	if c.state.OS.NetnsGetifaddrs {
 		nw, err := shared.NetnsGetifaddrs(int32(pid))
 		if err != nil {
-			logger.Error("Failed to retrieve network information via netlink", log.Ctx{"container": c.name, "pid": pid})
-			return result
+			if err != shared.NetnsIDsNotSupported {
+				logger.Error("Failed to retrieve network information via netlink", log.Ctx{"container": c.name, "pid": pid})
+				return result
+			}
+		} else {
+			networks = &nw
 		}
-		networks = &nw
-	} else {
+	}
 
-		// Get the network state from the container
-		out, err := shared.RunCommand(
-			c.state.OS.ExecPath,
-			"forknet",
-			"info",
-			fmt.Sprintf("%d", pid))
+	// Fallback to legay network retrieval.
 
-		// Process forkgetnet response
-		if err != nil {
-			logger.Error("Error calling 'lxd forkgetnet", log.Ctx{"container": c.name, "output": out, "pid": pid})
-			return result
-		}
+	// Get the network state from the container
+	out, err := shared.RunCommand(
+		c.state.OS.ExecPath,
+		"forknet",
+		"info",
+		fmt.Sprintf("%d", pid))
 
-		nw := map[string]api.ContainerStateNetwork{}
-		err = json.Unmarshal([]byte(out), &nw)
-		if err != nil {
-			logger.Error("Failure to read forkgetnet json", log.Ctx{"container": c.name, "err": err})
-			return result
-		}
-		networks = &nw
+	// Process forkgetnet response
+	if err != nil {
+		logger.Error("Error calling 'lxd forkgetnet", log.Ctx{"container": c.name, "output": out, "pid": pid})
+		return result
+	}
+
+	nw := map[string]api.ContainerStateNetwork{}
+	err = json.Unmarshal([]byte(out), &nw)
+	if err != nil {
+		logger.Error("Failure to read forkgetnet json", log.Ctx{"container": c.name, "err": err})
+		return result
 	}
+	networks = &nw
 
 	// Add HostName field
 	for netName, net := range *networks {
diff --git a/shared/network_linux.go b/shared/network_linux.go
index 90656a09ba..5e8e10f99f 100644
--- a/shared/network_linux.go
+++ b/shared/network_linux.go
@@ -20,6 +20,8 @@ import (
 */
 import "C"
 
+var NetnsIDsNotSupported error = fmt.Errorf("Netlink requests are not fully network namespace id aware")
+
 func NetnsGetifaddrs(initPID int32) (map[string]api.ContainerStateNetwork, error) {
 	var netnsid_aware C.bool
 	var ifaddrs *C.struct_netns_ifaddrs
@@ -47,7 +49,7 @@ func NetnsGetifaddrs(initPID int32) (map[string]api.ContainerStateNetwork, error
 	defer C.netns_freeifaddrs(ifaddrs)
 
 	if netnsID >= 0 && !netnsid_aware {
-		return nil, fmt.Errorf("Netlink requests are not fully network namespace id aware")
+		return nil, NetnsIDsNotSupported
 	}
 
 	// We're using the interface name as key here but we should really


More information about the lxc-devel mailing list