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

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) ===
This PR introduces the `ovn.ovs_bridge` bridge network setting. It is used by OVN networks that specify the bridge network as its parent `network` in order to create an OVS uplink bridge using the setting's name (and as a name prefix for the associated veth interfaces). 

This is being introduced to work around an issue when joining an node to an existing cluster that has an OVN network, because previously the internal DB network row ID was used as part of the OVS bridge name. However this caused issues during the pre-join phase because potentially a different local network ID would be used to create the OVS bridge than is used in the rest of the cluster.

This removes the use of internal DB IDs for interface names and uses config setting instead, which will be used in the pre-join phase of network creation too.
From 9807ba8fa2bb45e171d3a1b583f79fd5944ce2de Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 11:17:57 +0100
Subject: [PATCH 1/9] lxd/network/driver/ovn: Removes unnecessary dnsmasq logic
 in deleteParentPortBridge

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_ovn.go | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 1904ee7f78..3c13ec5672 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -17,7 +17,6 @@ import (
 
        "github.com/lxc/lxd/lxd/cluster"
        "github.com/lxc/lxd/lxd/db"
-       "github.com/lxc/lxd/lxd/dnsmasq"
        "github.com/lxc/lxd/lxd/locking"
        "github.com/lxc/lxd/lxd/network/openvswitch"
        "github.com/lxc/lxd/lxd/project"
@@ -506,6 +505,7 @@ func (n *ovn) parentOperationLockName(parentNet Network) 
string {
 
 // parentPortBridgeVars returns the parent port bridge variables needed for 
port start/stop.
 func (n *ovn) parentPortBridgeVars(parentNet Network) *ovnParentPortBridgeVars 
{
+
        ovsBridge := fmt.Sprintf("lxdovn%d", parentNet.ID())
 
        return &ovnParentPortBridgeVars{
@@ -629,18 +629,7 @@ func (n *ovn) deleteParentPort() error {
 
 // deleteParentPortBridge deletes the dnsmasq static lease and removes parent 
uplink OVS bridge if not in use.
 func (n *ovn) deleteParentPortBridge(parentNet Network) error {
-       err := dnsmasq.RemoveStaticEntry(parentNet.Name(), project.Default, 
n.getNetworkPrefix())
-       if err != nil {
-               return err
-       }
-
-       // Reload dnsmasq.
-       err = dnsmasq.Kill(parentNet.Name(), true)
-       if err != nil {
-               return err
-       }
-
-       // Lock parent network so we don;t race each other networks using the 
OVS uplink bridge.
+       // Lock parent network so we don't race each other networks using the 
OVS uplink bridge.
        unlock := locking.Lock(n.parentOperationLockName(parentNet))
        defer unlock()
 

From 1e793a8c9f2728d6d695bf372e04d13b96f435b7 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 12:23:38 +0100
Subject: [PATCH 2/9] lxd/device/device/utils/network: Removes
 networkRandomDevName

Moving to network package.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/device/device_utils_network.go | 17 -----------------
 1 file changed, 17 deletions(-)

diff --git a/lxd/device/device_utils_network.go 
b/lxd/device/device_utils_network.go
index 9556bfda9c..7ca4f3efc5 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -1,8 +1,6 @@
 package device
 
 import (
-       "crypto/rand"
-       "encoding/hex"
        "fmt"
        "io/ioutil"
        "strconv"
@@ -210,21 +208,6 @@ func networkRestorePhysicalNic(hostName string, volatile 
map[string]string) erro
        return nil
 }
 
-// networkRandomDevName returns a random device name with prefix.
-// If the random string combined with the prefix exceeds 13 characters then 
empty string is returned.
-// This is to ensure we support buggy dhclient applications: 
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=858580
-func networkRandomDevName(prefix string) string {
-       // Return a new random veth device name
-       randBytes := make([]byte, 4)
-       rand.Read(randBytes)
-       iface := prefix + hex.EncodeToString(randBytes)
-       if len(iface) > 13 {
-               return ""
-       }
-
-       return iface
-}
-
 // networkCreateVethPair creates and configures a veth pair. It will set the 
hwaddr and mtu settings
 // in the supplied config to the newly created peer interface. If mtu is not 
specified, but parent
 // is supplied in config, then the MTU of the new peer interface will inherit 
the parent MTU.

From 9a2348ae4283109bf0c128136914f50146de5cf9 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 12:24:09 +0100
Subject: [PATCH 3/9] lxd/network/network/utils: Adds RandomDevName function

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/network_utils.go | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index 36ea1420b8..6e56eebdde 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -68,6 +68,21 @@ func networkValidPort(value string) error {
        return nil
 }
 
+// RandomDevName returns a random device name with prefix.
+// If the random string combined with the prefix exceeds 13 characters then 
empty string is returned.
+// This is to ensure we support buggy dhclient applications: 
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=858580
+func RandomDevName(prefix string) string {
+       // Return a new random veth device name.
+       randBytes := make([]byte, 4)
+       rand.Read(randBytes)
+       iface := prefix + hex.EncodeToString(randBytes)
+       if len(iface) > 13 {
+               return ""
+       }
+
+       return iface
+}
+
 // IsInUseByInstance indicates if network is referenced by an instance's NIC 
devices.
 // Checks if the device's parent or network properties match the network name.
 func IsInUseByInstance(s *state.State, c instance.Instance, networkName 
string) (bool, error) {

From 1371927f2c9db61d5a880115eaa9e047417ccf0d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 12:25:33 +0100
Subject: [PATCH 4/9] lxd/device: network.RandomDevName usage

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/device/device_utils_network.go | 2 +-
 lxd/device/nic_bridged.go          | 4 ++--
 lxd/device/nic_macvlan.go          | 2 +-
 lxd/device/nic_ovn.go              | 4 ++--
 lxd/device/nic_p2p.go              | 5 +++--
 lxd/device/nic_routed.go           | 2 +-
 6 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/lxd/device/device_utils_network.go 
b/lxd/device/device_utils_network.go
index 7ca4f3efc5..0f1852403c 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -213,7 +213,7 @@ func networkRestorePhysicalNic(hostName string, volatile 
map[string]string) erro
 // is supplied in config, then the MTU of the new peer interface will inherit 
the parent MTU.
 // Accepts the name of the host side interface as a parameter and returns the 
peer interface name.
 func networkCreateVethPair(hostName string, m deviceConfig.Device) (string, 
error) {
-       peerName := networkRandomDevName("veth")
+       peerName := network.RandomDevName("veth")
 
        _, err := shared.RunCommand("ip", "link", "add", "dev", hostName, 
"type", "veth", "peer", "name", peerName)
        if err != nil {
diff --git a/lxd/device/nic_bridged.go b/lxd/device/nic_bridged.go
index b30ba66d91..ef852fbc5e 100644
--- a/lxd/device/nic_bridged.go
+++ b/lxd/device/nic_bridged.go
@@ -247,12 +247,12 @@ func (d *nicBridged) Start() (*deviceConfig.RunConfig, 
error) {
        // Create veth pair and configure the peer end with custom hwaddr and 
mtu if supplied.
        if d.inst.Type() == instancetype.Container {
                if saveData["host_name"] == "" {
-                       saveData["host_name"] = networkRandomDevName("veth")
+                       saveData["host_name"] = network.RandomDevName("veth")
                }
                peerName, err = networkCreateVethPair(saveData["host_name"], 
d.config)
        } else if d.inst.Type() == instancetype.VM {
                if saveData["host_name"] == "" {
-                       saveData["host_name"] = networkRandomDevName("tap")
+                       saveData["host_name"] = network.RandomDevName("tap")
                }
                peerName = saveData["host_name"] // VMs use the host_name to 
link to the TAP FD.
                err = networkCreateTap(saveData["host_name"], d.config)
diff --git a/lxd/device/nic_macvlan.go b/lxd/device/nic_macvlan.go
index 788584f2cd..35e1eb25de 100644
--- a/lxd/device/nic_macvlan.go
+++ b/lxd/device/nic_macvlan.go
@@ -120,7 +120,7 @@ func (d *nicMACVLAN) Start() (*deviceConfig.RunConfig, 
error) {
        actualParentName := network.GetHostDevice(d.config["parent"], 
d.config["vlan"])
 
        // Record the temporary device name used for deletion later.
-       saveData["host_name"] = networkRandomDevName("mac")
+       saveData["host_name"] = network.RandomDevName("mac")
 
        // Create VLAN parent device if needed.
        statusDev, err := networkCreateVlanDeviceIfNeeded(d.state, 
d.config["parent"], actualParentName, d.config["vlan"])
diff --git a/lxd/device/nic_ovn.go b/lxd/device/nic_ovn.go
index 4b6db95bcd..e7a85d3e00 100644
--- a/lxd/device/nic_ovn.go
+++ b/lxd/device/nic_ovn.go
@@ -183,12 +183,12 @@ func (d *nicOVN) Start() (*deviceConfig.RunConfig, error) 
{
        // Create veth pair and configure the peer end with custom hwaddr and 
mtu if supplied.
        if d.inst.Type() == instancetype.Container {
                if saveData["host_name"] == "" {
-                       saveData["host_name"] = networkRandomDevName("veth")
+                       saveData["host_name"] = network.RandomDevName("veth")
                }
                peerName, err = networkCreateVethPair(saveData["host_name"], 
d.config)
        } else if d.inst.Type() == instancetype.VM {
                if saveData["host_name"] == "" {
-                       saveData["host_name"] = networkRandomDevName("tap")
+                       saveData["host_name"] = network.RandomDevName("tap")
                }
                peerName = saveData["host_name"] // VMs use the host_name to 
link to the TAP FD.
                err = networkCreateTap(saveData["host_name"], d.config)
diff --git a/lxd/device/nic_p2p.go b/lxd/device/nic_p2p.go
index 5f5b7ef089..c0a08df59c 100644
--- a/lxd/device/nic_p2p.go
+++ b/lxd/device/nic_p2p.go
@@ -6,6 +6,7 @@ import (
        deviceConfig "github.com/lxc/lxd/lxd/device/config"
        "github.com/lxc/lxd/lxd/instance"
        "github.com/lxc/lxd/lxd/instance/instancetype"
+       "github.com/lxc/lxd/lxd/network"
        "github.com/lxc/lxd/lxd/revert"
        "github.com/lxc/lxd/shared"
 )
@@ -73,12 +74,12 @@ func (d *nicP2P) Start() (*deviceConfig.RunConfig, error) {
        // Create veth pair and configure the peer end with custom hwaddr and 
mtu if supplied.
        if d.inst.Type() == instancetype.Container {
                if saveData["host_name"] == "" {
-                       saveData["host_name"] = networkRandomDevName("veth")
+                       saveData["host_name"] = network.RandomDevName("veth")
                }
                peerName, err = networkCreateVethPair(saveData["host_name"], 
d.config)
        } else if d.inst.Type() == instancetype.VM {
                if saveData["host_name"] == "" {
-                       saveData["host_name"] = networkRandomDevName("tap")
+                       saveData["host_name"] = network.RandomDevName("tap")
                }
                peerName = saveData["host_name"] // VMs use the host_name to 
link to the TAP FD.
                err = networkCreateTap(saveData["host_name"], d.config)
diff --git a/lxd/device/nic_routed.go b/lxd/device/nic_routed.go
index 460993e639..ca056a4dac 100644
--- a/lxd/device/nic_routed.go
+++ b/lxd/device/nic_routed.go
@@ -193,7 +193,7 @@ func (d *nicRouted) Start() (*deviceConfig.RunConfig, 
error) {
 
        hostName := d.config["host_name"]
        if hostName == "" {
-               hostName = networkRandomDevName("veth")
+               hostName = network.RandomDevName("veth")
        }
        saveData["host_name"] = hostName
 

From b212605957e14def26aeb9da35f5318bae257d27 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 14:13:41 +0100
Subject: [PATCH 5/9] lxd/network: Adds Description function

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_common.go     | 5 +++++
 lxd/network/network_interface.go | 1 +
 2 files changed, 6 insertions(+)

diff --git a/lxd/network/driver_common.go b/lxd/network/driver_common.go
index 41197225f6..62be2bb808 100644
--- a/lxd/network/driver_common.go
+++ b/lxd/network/driver_common.go
@@ -109,6 +109,11 @@ func (n *common) Name() string {
        return n.name
 }
 
+// Description returns the network description.
+func (n *common) Description() string {
+       return n.description
+}
+
 // Status returns the network status.
 func (n *common) Status() string {
        return n.status
diff --git a/lxd/network/network_interface.go b/lxd/network/network_interface.go
index 69e787a14a..f8f0dabaf3 100644
--- a/lxd/network/network_interface.go
+++ b/lxd/network/network_interface.go
@@ -21,6 +21,7 @@ type Network interface {
        ID() int64
        Name() string
        Type() string
+       Description() string
        Status() string
        Config() map[string]string
        IsUsed() (bool, error)

From bc55a7aab15b34287836706635838d4f432fee14 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 14:29:55 +0100
Subject: [PATCH 6/9] api: Adds network_bridge_ovn_bridge API extension

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 doc/api-extensions.md | 7 +++++++
 shared/version/api.go | 1 +
 2 files changed, 8 insertions(+)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index 7ca5f9831e..ba8dcff0d2 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -1151,3 +1151,10 @@ Also introduces two new global config keys that apply to 
all `ovn` networks and
 
  - network.ovn.integration\_bridge - the OVS integration bridge to use.
  - network.ovn.northbound\_connection - the OVN northbound database connection 
string.
+
+## network\_bridge\_ovn\_bridge
+Adds the `ovn.ovs_bridge` setting to `bridge` networks to allow the `ovn` 
networks that use it as their parent
+`network` to access the name of the OVS bridge (and prefix for the related 
veth pair interfaces).
+
+If missing, the first `ovn` network to specify a `bridge` network as its 
parent `network` will cause the
+setting to be populated with a random interface name prefixed with "ovn".
diff --git a/shared/version/api.go b/shared/version/api.go
index 1288a75238..4771c18f21 100644
--- a/shared/version/api.go
+++ b/shared/version/api.go
@@ -224,6 +224,7 @@ var APIExtensions = []string{
        "network_type_sriov",
        "container_syscall_intercept_bpf_devices",
        "network_type_ovn",
+       "network_bridge_ovn_bridge",
 }
 
 // APIExtensionsCount returns the number of available API extensions.

From 0632782fa73855bac2f0a02abb5d4f690bd8937d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 14:14:45 +0100
Subject: [PATCH 7/9] lxd/network/driver/ovn: Updates parentPortBridgeVars to
 use ovn.ovs_bridge from parent network

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_ovn.go | 46 ++++++++++++++++++++++++++++++---------
 1 file changed, 36 insertions(+), 10 deletions(-)

diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 3c13ec5672..8414132368 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -19,7 +19,6 @@ import (
        "github.com/lxc/lxd/lxd/db"
        "github.com/lxc/lxd/lxd/locking"
        "github.com/lxc/lxd/lxd/network/openvswitch"
-       "github.com/lxc/lxd/lxd/project"
        "github.com/lxc/lxd/lxd/revert"
        "github.com/lxc/lxd/lxd/util"
        "github.com/lxc/lxd/shared"
@@ -35,6 +34,10 @@ const ovnChassisPriorityMax = 32767
 const ovnVolatileParentIPv4 = "volatile.network.ipv4.address"
 const ovnVolatileParentIPv6 = "volatile.network.ipv6.address"
 
+// ovnParentOVSBridge setting on the parent network indicating the name to use 
for the OVS bridge and prefix for
+// associated veth interfaces when using the parent network as an OVN uplink.
+const ovnParentOVSBridge = "ovn.ovs_bridge"
+
 // ovnParentVars OVN object variables derived from parent network.
 type ovnParentVars struct {
        // Router.
@@ -504,21 +507,40 @@ func (n *ovn) parentOperationLockName(parentNet Network) 
string {
 }
 
 // parentPortBridgeVars returns the parent port bridge variables needed for 
port start/stop.
-func (n *ovn) parentPortBridgeVars(parentNet Network) *ovnParentPortBridgeVars 
{
+func (n *ovn) parentPortBridgeVars(parentNet Network) 
(*ovnParentPortBridgeVars, error) {
+       parentConfig := parentNet.Config()
+       if parentConfig[ovnParentOVSBridge] == "" {
+               // Generate random OVS bridge name for parent uplink.
+               parentConfig[ovnParentOVSBridge] = RandomDevName("ovn")
 
-       ovsBridge := fmt.Sprintf("lxdovn%d", parentNet.ID())
+               // Store in parent config.
+               err := n.state.Cluster.Transaction(func(tx *db.ClusterTx) error 
{
+                       err := tx.UpdateNetwork(parentNet.ID(), 
parentNet.Description(), parentConfig)
+                       if err != nil {
+                               return errors.Wrapf(err, "Failed saving parent 
network OVN OVS bridge name")
+                       }
 
-       return &ovnParentPortBridgeVars{
-               ovsBridge: ovsBridge,
-               parentEnd: fmt.Sprintf("%sa", ovsBridge),
-               ovsEnd:    fmt.Sprintf("%sb", ovsBridge),
+                       return nil
+               })
+               if err != nil {
+                       return nil, err
+               }
        }
+
+       return &ovnParentPortBridgeVars{
+               ovsBridge: parentConfig[ovnParentOVSBridge],
+               parentEnd: fmt.Sprintf("%sa", parentConfig[ovnParentOVSBridge]),
+               ovsEnd:    fmt.Sprintf("%sb", parentConfig[ovnParentOVSBridge]),
+       }, nil
 }
 
 // startParentPortBridge creates veth pair (if doesn't exist), creates OVS 
bridge (if doesn't exist) and
 // connects veth pair to parent bridge and OVS bridge.
 func (n *ovn) startParentPortBridge(parentNet Network) error {
-       vars := n.parentPortBridgeVars(parentNet)
+       vars, err := n.parentPortBridgeVars(parentNet)
+       if err != nil {
+               return err
+       }
 
        // Lock parent network so that if multiple OVN networks are trying to 
connect to the same parent we don't
        // race each other setting up the connection.
@@ -540,7 +562,7 @@ func (n *ovn) startParentPortBridge(parentNet Network) 
error {
        }
 
        // Ensure correct sysctls are set on uplink veth interfaces to avoid 
getting IPv6 link-local addresses.
-       _, err := shared.RunCommand("sysctl",
+       _, err = shared.RunCommand("sysctl",
                fmt.Sprintf("net.ipv6.conf.%s.disable_ipv6=1", vars.parentEnd),
                fmt.Sprintf("net.ipv6.conf.%s.disable_ipv6=1", vars.ovsEnd),
                fmt.Sprintf("net.ipv6.conf.%s.forwarding=0", vars.parentEnd),
@@ -635,7 +657,11 @@ func (n *ovn) deleteParentPortBridge(parentNet Network) 
error {
 
        // Check OVS uplink bridge exists, if it does, check how many ports it 
has.
        removeVeths := false
-       vars := n.parentPortBridgeVars(parentNet)
+       vars, err := n.parentPortBridgeVars(parentNet)
+       if err != nil {
+               return err
+       }
+
        if shared.PathExists(fmt.Sprintf("/sys/class/net/%s", vars.ovsBridge)) {
                ovs := openvswitch.NewOVS()
                ports, err := ovs.BridgePortList(vars.ovsBridge)

From 06425c9f62cc4365d568bb6f692b40466c5525b8 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 14:13:59 +0100
Subject: [PATCH 8/9] lxd/network/driver/bridge: Adds ovn.ovs_bridge config key
 for OVN networks using bridge as parent

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/network/driver_bridge.go | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/lxd/network/driver_bridge.go b/lxd/network/driver_bridge.go
index 8ef1e612e4..c00a75af4a 100644
--- a/lxd/network/driver_bridge.go
+++ b/lxd/network/driver_bridge.go
@@ -226,6 +226,8 @@ func (n *bridge) Validate(config map[string]string) error {
 
                "raw.dnsmasq": validate.IsAny,
 
+               ovnParentOVSBridge: validate.Optional(validInterfaceName),
+
                "maas.subnet.ipv4": validate.IsAny,
                "maas.subnet.ipv6": validate.IsAny,
        }

From cada30dcb200ab19d0d02a28d0327b4dee6bde62 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Wed, 2 Sep 2020 14:48:48 +0100
Subject: [PATCH 9/9] doc/api: Removes underscore escaping when used inside
 backticks

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 doc/api-extensions.md | 48 +++++++++++++++++++++----------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index ba8dcff0d2..fa749cb371 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -577,7 +577,7 @@ This introduces the new candid.api.url config option and 
removes
 core.macaroon.endpoint.
 
 ## backup\_compression
-This introduces a new backups.compression\_algorithm config key which
+This introduces a new `backups.compression_algorithm` config key which
 allows configuration of backup compression.
 
 ## candid\_config
@@ -680,9 +680,9 @@ option `snapshots.expiry` takes an expression in the form 
of `1M 2H 3d 4w 5m
 parts have to be used.
 
 Snapshots which are then created will be given an expiry date based on the
-expression. This expiry date, defined by `expires\_at`, can be manually edited
+expression. This expiry date, defined by `expires_at`, can be manually edited
 using the API or `lxc config edit`. Snapshots with a valid expiry date will be
-removed when the task in run. Expiry can be disabled by setting `expires\_at` 
to
+removed when the task in run. Expiry can be disabled by setting `expires_at` to
 an empty string or `0001-01-01T00:00:00Z` (zero time). This is the default if
 `snapshots.expiry` is not set.
 
@@ -717,7 +717,7 @@ used to track the current mapping for the container.
 
 This effectively gives us:
 
- - `volatile.last\_state.idmap` => On-disk idmap
+ - `volatile.last_state.idmap` => On-disk idmap
  - `volatile.idmap.current` => Current kernel map
  - `volatile.idmap.next` => Next on-disk idmap
 
@@ -760,7 +760,7 @@ by a container that a registered syscall has been 
performed. LXD can then
 decide to trigger various actions.
 
 ## lxc\_features
-This introduces the `lxc\_features` section output from the `lxc info` command
+This introduces the `lxc_features` section output from the `lxc info` command
 via the `GET /1.0/` route. It outputs the result of checks for key features 
being present in the
 underlying LXC library.
 
@@ -768,7 +768,7 @@ underlying LXC library.
 This introduces the `ipvlan` "nic" device type.
 
 ## network\_vlan\_sriov
-This introduces VLAN (`vlan`) and MAC filtering (`security.mac\_filtering`) 
support for SR-IOV devices.
+This introduces VLAN (`vlan`) and MAC filtering (`security.mac_filtering`) 
support for SR-IOV devices.
 
 ## storage\_cephfs
 Add support for CEPHFS as a storage pool driver. This can only be used
@@ -776,7 +776,7 @@ for custom volumes, images and containers should be on CEPH 
(RBD)
 instead.
 
 ## container\_nic\_ipfilter
-This introduces container IP filtering (`security.ipv4\_filtering` and 
`security.ipv6\_filtering`) support for `bridged` nic devices.
+This introduces container IP filtering (`security.ipv4_filtering` and 
`security.ipv6_filtering`) support for `bridged` nic devices.
 
 ## resources\_v2
 Rework the resources API at /1.0/resources, especially:
@@ -822,8 +822,8 @@ This makes use of shiftfs as an overlay filesystem.
 Export infiniband character device information (issm, umad, uverb) as part of 
the resources API.
 
 ## daemon\_storage
-This introduces two new configuration keys `storage.images\_volume` and
-`storage.backups\_volume` to allow for a storage volume on an existing
+This introduces two new configuration keys `storage.images_volume` and
+`storage.backups_volume` to allow for a storage volume on an existing
 pool be used for storing the daemon-wide images and backups artifacts.
 
 ## instances
@@ -853,15 +853,15 @@ This allows for editing of the expiry date on images.
 Adds a FirmwareVersion field to network card entries.
 
 ## backup\_compression\_algorithm
-This adds support for a `compression\_algorithm` property when creating a 
backup (`POST /1.0/containers/<name>/backups`).
+This adds support for a `compression_algorithm` property when creating a 
backup (`POST /1.0/containers/<name>/backups`).
 
-Setting this property overrides the server default value 
(`backups.compression\_algorithm`).
+Setting this property overrides the server default value 
(`backups.compression_algorithm`).
 
 ## ceph\_data\_pool\_name
-This adds support for an optional argument (`ceph.osd.data\_pool\_name`) when 
creating
+This adds support for an optional argument (`ceph.osd.data_pool_name`) when 
creating
 storage pools using Ceph RBD, when this argument is used the pool will store 
it's
-actual data in the pool specified with `data\_pool\_name` while keeping the 
metadata
-in the pool specified by `pool\_name`.
+actual data in the pool specified with `data_pool_name` while keeping the 
metadata
+in the pool specified by `pool_name`.
 
 ## container\_syscall\_intercept\_mount
 Adds the `security.syscalls.intercept.mount`,
@@ -918,7 +918,7 @@ This allows it to inherit some of the network's settings 
and allows better valid
 
 ## clustering\_sizing
 Support specifying a custom values for database voters and standbys.
-The new cluster.max\_voters and cluster.max\_standby configuration keys were 
introduced
+The new `cluster.max_voters` and `cluster.max_standby` configuration keys were 
introduced
 to specify to the ideal number of database voter and standbys.
 
 ## firewall\_driver
@@ -965,7 +965,7 @@ configuration keys: `snapshots.schedule` and
 
 ## trust\_ca\_certificates
 This allows for checking client certificates trusted by the provided CA 
(`server.ca`).
-It can be enabled by setting `core.trust\_ca\_certificates` to true.
+It can be enabled by setting `core.trust_ca_certificates` to true.
 If enabled, it will perform the check, and bypass the trusted password if true.
 An exception will be made if the connecting client certificate is in the 
provided CRL (`ca.crl`).
 In this case, it will ask for the password.
@@ -977,17 +977,17 @@ This adds a new `size` field to the output of 
`/1.0/instances/<name>/snapshots/<
 This adds a writable endpoint for cluster members, allowing the editing of 
their roles.
 
 ## container\_nic\_routed\_host\_address
-This introduces the `ipv4.host\_address` and `ipv6.host\_address` NIC config 
keys that can be used to control the
+This introduces the `ipv4.host_address` and `ipv6.host_address` NIC config 
keys that can be used to control the
 host-side veth interface's IP addresses. This can be useful when using 
multiple routed NICs at the same time and
 needing a predictable next-hop address to use.
 
 This also alters the behaviour of `ipv4.gateway` and `ipv6.gateway` NIC config 
keys. When they are set to "auto"
-the container will have its default gateway set to the value of 
`ipv4.host\_address` or `ipv6.host\_address` respectively.
+the container will have its default gateway set to the value of 
`ipv4.host_address` or `ipv6.host_address` respectively.
 
 The default values are:
 
-`ipv4.host\_address`: 169.254.0.1
-`ipv6.host\_address`: fe80::1
+`ipv4.host_address`: 169.254.0.1
+`ipv6.host_address`: fe80::1
 
 This is backward compatible with the previous default behaviour.
 
@@ -1007,19 +1007,19 @@ rather than per core as some hardware apparently puts 
threads in
 different NUMA domains.
 
 ## resources\_cpu\_core\_die
-Exposes the die\_id information on each core.
+Exposes the `die_id` information on each core.
 
 ## api\_os
-This introduces two new fields in `/1.0`, `os` and `os\_version`.
+This introduces two new fields in `/1.0`, `os` and `os_version`.
 
 Those are taken from the os-release data on the system.
 
 ## container\_nic\_routed\_host\_table
-This introduces the `ipv4.host\_table` and `ipv6.host\_table` NIC config keys 
that can be used to add static routes
+This introduces the `ipv4.host_table` and `ipv6.host_table` NIC config keys 
that can be used to add static routes
 for the instance's IPs to a custom policy routing table by ID.
 
 ## container\_nic\_ipvlan\_host\_table
-This introduces the `ipv4.host\_table` and `ipv6.host\_table` NIC config keys 
that can be used to add static routes
+This introduces the `ipv4.host_table` and `ipv6.host_table` NIC config keys 
that can be used to add static routes
 for the instance's IPs to a custom policy routing table by ID.
 
 ## container\_nic\_ipvlan\_mode
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to