The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/5790

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Also clears volatile host_name keys when container stops.

Signed-off-by: Thomas Parrott <[email protected]>
From b27eeadb7df294928441afaf00a41f14ef7aed78 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <[email protected]>
Date: Wed, 22 May 2019 19:02:45 +0100
Subject: [PATCH] container/lxc: Moves volatile host_name enrichment into
 fillNetworkDevice

Also clears volatile host_name keys when container stops.

Signed-off-by: Thomas Parrott <[email protected]>
---
 lxd/container_lxc.go | 51 +++++++++++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 20 deletions(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 93e255d162..305500f62d 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -3102,10 +3102,10 @@ func (c *containerLXC) OnStop(target string) error {
                logger.Error("Failed to set container state", 
log.Ctx{"container": c.Name(), "err": err})
        }
 
-       // Clean up networking routes
-       err = c.cleanupNetworkRoutes()
+       // Clean up networking veth devices
+       err = c.cleanupHostVethDevices()
        if err != nil {
-               logger.Error("Failed to cleanup network routes: ", 
log.Ctx{"container": c.Name(), "err": err})
+               logger.Error("Failed to cleanup veth devices: ", 
log.Ctx{"container": c.Name(), "err": err})
        }
 
        go func(c *containerLXC, target string, op *lxcContainerOperation) {
@@ -3163,19 +3163,38 @@ func (c *containerLXC) OnStop(target string) error {
        return nil
 }
 
-// cleanupNetworkRoutes removes any static routes added on the host for nic 
devices.
-func (c *containerLXC) cleanupNetworkRoutes() error {
+// cleanupHostVethDevices removes host side configuration for veth devices.
+func (c *containerLXC) cleanupHostVethDevices() error {
+       volatileNics := make([]string, 0)
+
        for _, k := range c.expandedDevices.DeviceNames() {
                m := c.expandedDevices[k]
                if m["type"] != "nic" {
                        continue
                }
 
-               // Remove any static veth routes
+               m, err := c.fillNetworkDevice(k, m)
+               if err != nil {
+                       continue
+               }
+
+               // Remove any static host side veth routes
                if shared.StringInSlice(m["nictype"], []string{"bridged", 
"p2p"}) {
                        c.removeNetworkRoutes(k, m)
+                       volatileNics = append(volatileNics, k) // Record for 
volatile removal
                }
+       }
+
+       // Clear host side config from volatile nics
+       volatile := make(map[string]string)
+       for _, deviceName := range volatileNics {
+               hostNameKey := fmt.Sprintf("volatile.%s.host_name", deviceName)
+               volatile[hostNameKey] = "" // Remove volatile host_name for 
device
+       }
 
+       err := c.VolatileSet(volatile)
+       if err != nil {
+               return err
        }
 
        return nil
@@ -3206,12 +3225,6 @@ func (c *containerLXC) OnNetworkUp(deviceName string, 
hostName string) error {
 
 // setupHostVethDevice configures a nic device's host side veth settings.
 func (c *containerLXC) setupHostVethDevice(deviceName string, device 
types.Device, oldDevice types.Device) error {
-       // If not populated already, check if volatile data contains the most 
recently added host_name.
-       if device["host_name"] == "" {
-               hostNameKey := fmt.Sprintf("volatile.%s.host_name", deviceName)
-               device["host_name"] = c.localConfig[hostNameKey]
-       }
-
        // Check whether host device resolution succeeded.
        if device["host_name"] == "" {
                return fmt.Errorf("Failed to find host side veth name for 
device \"%s\"", deviceName)
@@ -5103,7 +5116,11 @@ func (c *containerLXC) Update(args db.ContainerArgs, 
userRequested bool) error {
                                                return err
                                        }
 
-                                       err = c.setupHostVethDevice(k, m, 
oldExpandedDevices[k])
+                                       // We're updating the same device, so 
copy enriched host_name
+                                       // into oldDevice config for veth host 
device setup.
+                                       oldDevice := oldExpandedDevices[k]
+                                       oldDevice["host_name"] = m["host_name"]
+                                       err = c.setupHostVethDevice(k, m, 
oldDevice)
                                        if err != nil {
                                                return err
                                        }
@@ -8135,7 +8152,7 @@ func (c *containerLXC) fillNetworkDevice(name string, m 
types.Device) (types.Dev
        }
 
        // Fill in the host name (but don't generate a static one ourselves)
-       if m["host_name"] == "" && shared.StringInSlice(m["nictype"], 
[]string{"sriov"}) {
+       if m["host_name"] == "" && shared.StringInSlice(m["nictype"], 
[]string{"bridged", "p2p", "sriov"}) {
                configKey := fmt.Sprintf("volatile.%s.host_name", name)
                newDevice["host_name"] = c.localConfig[configKey]
        }
@@ -8860,12 +8877,6 @@ func (c *containerLXC) setNetworkRoutes(deviceName 
string, m types.Device, oldDe
 // removeNetworkRoutes removes any routes created for this device on the host 
that were first added
 // with setNetworkRoutes(). Expects to be passed the device config from the 
oldExpandedDevices.
 func (c *containerLXC) removeNetworkRoutes(deviceName string, m types.Device) {
-       // If not populated already, check if volatile data contains the most 
recently added host_name.
-       if m["host_name"] == "" {
-               hostNameKey := fmt.Sprintf("volatile.%s.host_name", deviceName)
-               m["host_name"] = c.localConfig[hostNameKey]
-       }
-
        // Decide whether the route should point to the veth parent or the 
bridge parent
        routeDev := m["host_name"]
        if m["nictype"] == "bridged" {
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to