[libvirt] [PATCH 0/3] Rebase LXC network definition to support version 3.0

The series propose a new way to define NICs inside LXC native. It is needed because LXC version 3.X uses indexes to define NICs and the current algorithm is not able to support them. At least, if you consider settings defined using a random logic. Julio Faracco (3): lxc: refactoring LXC network definition with a sparse array. tests: Change legacy network configs to version 3.0 with indexes. tests: Include a random network testcase to test indexes. src/lxc/lxc_native.c | 191 ++++++++++++------ .../lxcconf2xml-ethernet-v3.config | 16 +- .../lxcconf2xml-fstab-v3.config | 10 +- .../lxcconf2xml-macvlannetwork-v3.config | 10 +- .../lxcconf2xml-miscnetwork-v3.config | 38 ++-- .../lxcconf2xml-physnetwork-v3.config | 14 +- .../lxcconf2xml-randomnetwork-v3.config | 21 ++ .../lxcconf2xml-randomnetwork.xml | 45 +++++ .../lxcconf2xml-simple-v3.config | 18 +- .../lxcconf2xml-vlannetwork-v3.config | 10 +- tests/lxcconf2xmltest.c | 1 + 11 files changed, 249 insertions(+), 125 deletions(-) create mode 100644 tests/lxcconf2xmldata/lxcconf2xml-randomnetwork-v3.config create mode 100644 tests/lxcconf2xmldata/lxcconf2xml-randomnetwork.xml -- 2.19.1

LXC was using a single data structure to define all LXC NICs. In terms of optimization it is very interesting, but it is not useful when you use a index to define networks. After major release 3.0, LXC adopted indexes for network definitions. So, this commit adds a sparse vector to handle network indexes. Now, networks can be defined in sequence using the legacy config. Or using a sparse array, using version 3 with indexes. Signed-off-by: Julio Faracco <jcfaracco@gmail.com> --- src/lxc/lxc_native.c | 191 ++++++++++++++++++++++++++++--------------- 1 file changed, 124 insertions(+), 67 deletions(-) diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 1eee3fc2bb..860cf87227 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -22,6 +22,7 @@ #include <config.h> #include "internal.h" +#include "c-ctype.h" #include "lxc_container.h" #include "lxc_native.h" #include "util/viralloc.h" @@ -409,8 +410,9 @@ lxcCreateHostdevDef(int mode, int type, const char *data) return hostdev; } -typedef struct { - virDomainDefPtr def; +typedef struct _lxcNetworkParseData lxcNetworkParseData; +typedef lxcNetworkParseData *lxcNetworkParseDataPtr; +struct _lxcNetworkParseData { char *type; char *link; char *mac; @@ -422,9 +424,13 @@ typedef struct { size_t nips; char *gateway_ipv4; char *gateway_ipv6; - bool privnet; - size_t networks; -} lxcNetworkParseData; + size_t index; +}; + +typedef struct { + lxcNetworkParseDataPtr *data; + int networks; +} lxcNetworkParseArray; static int lxcAddNetworkRouteDefinition(const char *address, @@ -464,7 +470,7 @@ lxcAddNetworkRouteDefinition(const char *address, } static int -lxcAddNetworkDefinition(lxcNetworkParseData *data) +lxcAddNetworkDefinition(virDomainDefPtr def, lxcNetworkParseData *data) { virDomainNetDefPtr net = NULL; virDomainHostdevDefPtr hostdev = NULL; @@ -512,9 +518,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) &hostdev->source.caps.u.net.ip.nroutes) < 0) goto error; - if (VIR_EXPAND_N(data->def->hostdevs, data->def->nhostdevs, 1) < 0) + if (VIR_EXPAND_N(def->hostdevs, def->nhostdevs, 1) < 0) goto error; - data->def->hostdevs[data->def->nhostdevs - 1] = hostdev; + def->hostdevs[def->nhostdevs - 1] = hostdev; } else { if (!(net = lxcCreateNetDef(data->type, data->link, data->mac, data->flag, data->macvlanmode, @@ -536,9 +542,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) &net->guestIP.nroutes) < 0) goto error; - if (VIR_EXPAND_N(data->def->nets, data->def->nnets, 1) < 0) + if (VIR_EXPAND_N(def->nets, def->nnets, 1) < 0) goto error; - data->def->nets[data->def->nnets - 1] = net; + def->nets[def->nnets - 1] = net; } return 1; @@ -552,51 +558,89 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) return -1; } +#define lxcNetworkHasIndex(entry) \ + (STRPREFIX(entry, "lxc.net.") && c_isdigit(entry[8])) + +#define lxcNetworkIndexHasType(entry, type) \ + (lxcNetworkHasIndex(entry) && virFileHasSuffix(entry, type)) + static int lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) { - lxcNetworkParseData *parseData = data; - int status; + lxcNetworkParseArray *parseData = data; + size_t index; + + /* Managing memory and indexes for version 3.0 */ + if (lxcNetworkHasIndex(name)) { + sscanf(name, "lxc.net.%zu", &index); + + if (index >= parseData->networks) { + if (!parseData->data) { + if (VIR_ALLOC_N(parseData->data, index + 1) < 0) + return -1; + } else { + if (VIR_REALLOC_N(parseData->data, index + 1) < 0) + return -1; + } - if (STREQ(name, "lxc.network.type")) { - virDomainDefPtr def = parseData->def; - size_t networks = parseData->networks; - bool privnet = parseData->privnet; + parseData->networks = index + 1; + } - /* Store the previous NIC */ - status = lxcAddNetworkDefinition(parseData); + if (!parseData->data[index]) { + if (VIR_ALLOC(parseData->data[index]) < 0) + return -1; + } + } else { + /* Indexes can be 0 when a network is defined */ + index = parseData->networks - 1; + } - if (status < 0) - return -1; - else if (status > 0) - networks++; - else if (parseData->type != NULL && STREQ(parseData->type, "none")) - privnet = false; + if (STREQ(name, "lxc.network.type")) { + /* A new NIC will be added */ + index = parseData->networks; - /* clean NIC to store a new one */ - memset(parseData, 0, sizeof(*parseData)); + if (!parseData->data) { + if (VIR_ALLOC_N(parseData->data, index + 1) < 0) + return -1; + } else { + if (VIR_REALLOC_N(parseData->data, index + 1) < 0) + return -1; + } - parseData->def = def; - parseData->networks = networks; - parseData->privnet = privnet; + if (VIR_ALLOC(parseData->data[index]) < 0) + return -1; /* Keep the new value */ - parseData->type = value->str; + parseData->data[index]->type = value->str; + parseData->data[index]->index = index; + + /* Network interface added */ + parseData->networks++; } - else if (STREQ(name, "lxc.network.link")) - parseData->link = value->str; - else if (STREQ(name, "lxc.network.hwaddr")) - parseData->mac = value->str; - else if (STREQ(name, "lxc.network.flags")) - parseData->flag = value->str; - else if (STREQ(name, "lxc.network.macvlan.mode")) - parseData->macvlanmode = value->str; - else if (STREQ(name, "lxc.network.vlan.id")) - parseData->vlanid = value->str; - else if (STREQ(name, "lxc.network.name")) - parseData->name = value->str; - else if (STREQ(name, "lxc.network.ipv4") || - STREQ(name, "lxc.network.ipv6")) { + else if (lxcNetworkIndexHasType(name, ".type")) + parseData->data[index]->type = value->str; + else if (STREQ(name, "lxc.network.link") || + lxcNetworkIndexHasType(name, ".link")) + parseData->data[index]->link = value->str; + else if (STREQ(name, "lxc.network.hwaddr") || + lxcNetworkIndexHasType(name, ".hwaddr")) + parseData->data[index]->mac = value->str; + else if (STREQ(name, "lxc.network.flags") || + lxcNetworkIndexHasType(name, ".flags")) + parseData->data[index]->flag = value->str; + else if (STREQ(name, "lxc.network.macvlan.mode") || + lxcNetworkIndexHasType(name, ".macvlan.mode")) + parseData->data[index]->macvlanmode = value->str; + else if (STREQ(name, "lxc.network.vlan.id") || + lxcNetworkIndexHasType(name, ".vlan.id")) + parseData->data[index]->vlanid = value->str; + else if (STREQ(name, "lxc.network.name") || + lxcNetworkIndexHasType(name, ".name")) + parseData->data[index]->name = value->str; + else if ((STREQ(name, "lxc.network.ipv4") || + STREQ(name, "lxc.network.ipv6")) || + (lxcNetworkIndexHasType(name, ".ipv4") || + lxcNetworkIndexHasType(name, ".ipv6"))) { int family = AF_INET; char **ipparts = NULL; virNetDevIPAddrPtr ip = NULL; @@ -604,7 +648,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) if (VIR_ALLOC(ip) < 0) return -1; - if (STREQ(name, "lxc.network.ipv6")) + if (STREQ(name, "lxc.network.ipv6") || + lxcNetworkIndexHasType(name, ".ipv6")) family = AF_INET6; ipparts = virStringSplit(value->str, "/", 2); @@ -622,15 +667,19 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) virStringListFree(ipparts); - if (VIR_APPEND_ELEMENT(parseData->ips, parseData->nips, ip) < 0) { + if (VIR_APPEND_ELEMENT(parseData->data[index]->ips, + parseData->data[index]->nips, ip) < 0) { VIR_FREE(ip); return -1; } - } else if (STREQ(name, "lxc.network.ipv4.gateway")) { - parseData->gateway_ipv4 = value->str; - } else if (STREQ(name, "lxc.network.ipv6.gateway")) { - parseData->gateway_ipv6 = value->str; - } else if (STRPREFIX(name, "lxc.network")) { + } else if (STREQ(name, "lxc.network.ipv4.gateway") || + lxcNetworkIndexHasType(name, ".ipv4.gateway")) { + parseData->data[index]->gateway_ipv4 = value->str; + } else if (STREQ(name, "lxc.network.ipv6.gateway") || + lxcNetworkIndexHasType(name, ".ipv6.gateway")) { + parseData->data[index]->gateway_ipv6 = value->str; + } else if (STRPREFIX(name, "lxc.network") || + lxcNetworkHasIndex(name)) { VIR_WARN("Unhandled network property: %s = %s", name, value->str); @@ -645,25 +694,29 @@ lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) int status; int result = -1; size_t i; - lxcNetworkParseData data = {def, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, 0, - NULL, NULL, true, 0}; + bool privnet = true; + lxcNetworkParseArray nets = {NULL, 0}; - if (virConfWalk(properties, lxcNetworkWalkCallback, &data) < 0) + if (virConfWalk(properties, lxcNetworkWalkCallback, &nets) < 0) goto error; + for (i = 0; i < nets.networks; i++) { + lxcNetworkParseDataPtr data = nets.data[i]; - /* Add the last network definition found */ - status = lxcAddNetworkDefinition(&data); + /* It needs to guarantee that index exists. */ + /* Since there is a sparse array. */ + if (data) { + /* Add network definitions */ + status = lxcAddNetworkDefinition(def, data); - if (status < 0) - goto error; - else if (status > 0) - data.networks++; - else if (data.type != NULL && STREQ(data.type, "none")) - data.privnet = false; + if (status < 0) + goto error; + else if (data->type != NULL && STREQ(data->type, "none")) + privnet = false; + } + } - if (data.networks == 0 && data.privnet) { + if (nets.networks == 0 && privnet) { /* When no network type is provided LXC only adds loopback */ def->features[VIR_DOMAIN_FEATURE_PRIVNET] = VIR_TRISTATE_SWITCH_ON; } @@ -672,9 +725,13 @@ lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) return result; error: - for (i = 0; i < data.nips; i++) - VIR_FREE(data.ips[i]); - VIR_FREE(data.ips); + for (i = 0; i <= nets.networks; i++) { + for (i = 0; i < nets.data[i]->nips; i++) + VIR_FREE(nets.data[i]->ips[i]); + VIR_FREE(nets.data[i]->ips); + } + for (i = 0; i <= nets.networks; i++) + VIR_FREE(nets.data[i]); return -1; } -- 2.19.1

On 12/28/18 8:01 PM, Julio Faracco wrote:
LXC was using a single data structure to define all LXC NICs. In terms of optimization it is very interesting, but it is not useful when you use a index to define networks. After major release 3.0, LXC adopted indexes for network definitions. So, this commit adds a sparse vector to handle network indexes. Now, networks can be defined in sequence using the legacy config. Or using a sparse array, using version 3 with indexes.
Signed-off-by: Julio Faracco <jcfaracco@gmail.com> --- src/lxc/lxc_native.c | 191 ++++++++++++++++++++++++++++--------------- 1 file changed, 124 insertions(+), 67 deletions(-)
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 1eee3fc2bb..860cf87227 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -22,6 +22,7 @@ #include <config.h>
#include "internal.h" +#include "c-ctype.h" #include "lxc_container.h" #include "lxc_native.h" #include "util/viralloc.h" @@ -409,8 +410,9 @@ lxcCreateHostdevDef(int mode, int type, const char *data) return hostdev; }
-typedef struct { - virDomainDefPtr def; +typedef struct _lxcNetworkParseData lxcNetworkParseData; +typedef lxcNetworkParseData *lxcNetworkParseDataPtr; +struct _lxcNetworkParseData { char *type; char *link; char *mac; @@ -422,9 +424,13 @@ typedef struct { size_t nips; char *gateway_ipv4; char *gateway_ipv6; - bool privnet; - size_t networks; -} lxcNetworkParseData; + size_t index; +}; + +typedef struct { + lxcNetworkParseDataPtr *data; + int networks;
This is in fact an array and its size. For that we tend to use X name for array and 'nX' for the size. So how about 'networks' and 'nnetworks'? Also, s/int/size_t/.
+} lxcNetworkParseArray;
static int lxcAddNetworkRouteDefinition(const char *address, @@ -464,7 +470,7 @@ lxcAddNetworkRouteDefinition(const char *address, }
static int -lxcAddNetworkDefinition(lxcNetworkParseData *data) +lxcAddNetworkDefinition(virDomainDefPtr def, lxcNetworkParseData *data) { virDomainNetDefPtr net = NULL; virDomainHostdevDefPtr hostdev = NULL; @@ -512,9 +518,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) &hostdev->source.caps.u.net.ip.nroutes) < 0) goto error;
- if (VIR_EXPAND_N(data->def->hostdevs, data->def->nhostdevs, 1) < 0) + if (VIR_EXPAND_N(def->hostdevs, def->nhostdevs, 1) < 0) goto error; - data->def->hostdevs[data->def->nhostdevs - 1] = hostdev; + def->hostdevs[def->nhostdevs - 1] = hostdev; } else { if (!(net = lxcCreateNetDef(data->type, data->link, data->mac, data->flag, data->macvlanmode, @@ -536,9 +542,9 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) &net->guestIP.nroutes) < 0) goto error;
- if (VIR_EXPAND_N(data->def->nets, data->def->nnets, 1) < 0) + if (VIR_EXPAND_N(def->nets, def->nnets, 1) < 0) goto error; - data->def->nets[data->def->nnets - 1] = net; + def->nets[def->nnets - 1] = net; }
return 1; @@ -552,51 +558,89 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data) return -1; }
+#define lxcNetworkHasIndex(entry) \ + (STRPREFIX(entry, "lxc.net.") && c_isdigit(entry[8])) + +#define lxcNetworkIndexHasType(entry, type) \ + (lxcNetworkHasIndex(entry) && virFileHasSuffix(entry, type))
I rather see these as inline functions.
+ static int lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) { - lxcNetworkParseData *parseData = data; - int status; + lxcNetworkParseArray *parseData = data; + size_t index; + + /* Managing memory and indexes for version 3.0 */ + if (lxcNetworkHasIndex(name)) { + sscanf(name, "lxc.net.%zu", &index); + + if (index >= parseData->networks) { + if (!parseData->data) { + if (VIR_ALLOC_N(parseData->data, index + 1) < 0) + return -1; + } else { + if (VIR_REALLOC_N(parseData->data, index + 1) < 0) + return -1;
This is allocated but released only on 'error'.
+ }
- if (STREQ(name, "lxc.network.type")) { - virDomainDefPtr def = parseData->def; - size_t networks = parseData->networks; - bool privnet = parseData->privnet; + parseData->networks = index + 1; + }
- /* Store the previous NIC */ - status = lxcAddNetworkDefinition(parseData); + if (!parseData->data[index]) { + if (VIR_ALLOC(parseData->data[index]) < 0) + return -1; + } + } else { + /* Indexes can be 0 when a network is defined */ + index = parseData->networks - 1; + }
- if (status < 0) - return -1; - else if (status > 0) - networks++; - else if (parseData->type != NULL && STREQ(parseData->type, "none")) - privnet = false; + if (STREQ(name, "lxc.network.type")) { + /* A new NIC will be added */ + index = parseData->networks;
- /* clean NIC to store a new one */ - memset(parseData, 0, sizeof(*parseData)); + if (!parseData->data) { + if (VIR_ALLOC_N(parseData->data, index + 1) < 0) + return -1; + } else { + if (VIR_REALLOC_N(parseData->data, index + 1) < 0) + return -1; + }
- parseData->def = def; - parseData->networks = networks; - parseData->privnet = privnet; + if (VIR_ALLOC(parseData->data[index]) < 0) + return -1;
/* Keep the new value */ - parseData->type = value->str; + parseData->data[index]->type = value->str; + parseData->data[index]->index = index; + + /* Network interface added */ + parseData->networks++; } - else if (STREQ(name, "lxc.network.link")) - parseData->link = value->str; - else if (STREQ(name, "lxc.network.hwaddr")) - parseData->mac = value->str; - else if (STREQ(name, "lxc.network.flags")) - parseData->flag = value->str; - else if (STREQ(name, "lxc.network.macvlan.mode")) - parseData->macvlanmode = value->str; - else if (STREQ(name, "lxc.network.vlan.id")) - parseData->vlanid = value->str; - else if (STREQ(name, "lxc.network.name")) - parseData->name = value->str; - else if (STREQ(name, "lxc.network.ipv4") || - STREQ(name, "lxc.network.ipv6")) { + else if (lxcNetworkIndexHasType(name, ".type")) + parseData->data[index]->type = value->str; + else if (STREQ(name, "lxc.network.link") || + lxcNetworkIndexHasType(name, ".link")) + parseData->data[index]->link = value->str; + else if (STREQ(name, "lxc.network.hwaddr") || + lxcNetworkIndexHasType(name, ".hwaddr")) + parseData->data[index]->mac = value->str; + else if (STREQ(name, "lxc.network.flags") || + lxcNetworkIndexHasType(name, ".flags")) + parseData->data[index]->flag = value->str; + else if (STREQ(name, "lxc.network.macvlan.mode") || + lxcNetworkIndexHasType(name, ".macvlan.mode")) + parseData->data[index]->macvlanmode = value->str; + else if (STREQ(name, "lxc.network.vlan.id") || + lxcNetworkIndexHasType(name, ".vlan.id")) + parseData->data[index]->vlanid = value->str; + else if (STREQ(name, "lxc.network.name") || + lxcNetworkIndexHasType(name, ".name")) + parseData->data[index]->name = value->str; + else if ((STREQ(name, "lxc.network.ipv4") || + STREQ(name, "lxc.network.ipv6")) || + (lxcNetworkIndexHasType(name, ".ipv4") || + lxcNetworkIndexHasType(name, ".ipv6"))) { int family = AF_INET; char **ipparts = NULL; virNetDevIPAddrPtr ip = NULL; @@ -604,7 +648,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data) if (VIR_ALLOC(ip) < 0) return -1;
- if (STREQ(name, "lxc.network.ipv6")) + if (STREQ(name, "lxc.network.ipv6") || + lxcNetworkIndexHasType(name, ".ipv6")) family = AF_INET6;
ipparts = virStringSplit(value->str, "/", 2); @@ -622,15 +667,19 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
virStringListFree(ipparts);
- if (VIR_APPEND_ELEMENT(parseData->ips, parseData->nips, ip) < 0) { + if (VIR_APPEND_ELEMENT(parseData->data[index]->ips, + parseData->data[index]->nips, ip) < 0) { VIR_FREE(ip); return -1; } - } else if (STREQ(name, "lxc.network.ipv4.gateway")) { - parseData->gateway_ipv4 = value->str; - } else if (STREQ(name, "lxc.network.ipv6.gateway")) { - parseData->gateway_ipv6 = value->str; - } else if (STRPREFIX(name, "lxc.network")) { + } else if (STREQ(name, "lxc.network.ipv4.gateway") || + lxcNetworkIndexHasType(name, ".ipv4.gateway")) { + parseData->data[index]->gateway_ipv4 = value->str; + } else if (STREQ(name, "lxc.network.ipv6.gateway") || + lxcNetworkIndexHasType(name, ".ipv6.gateway")) { + parseData->data[index]->gateway_ipv6 = value->str; + } else if (STRPREFIX(name, "lxc.network") || + lxcNetworkHasIndex(name)) { VIR_WARN("Unhandled network property: %s = %s", name, value->str); @@ -645,25 +694,29 @@ lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) int status; int result = -1; size_t i; - lxcNetworkParseData data = {def, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, 0, - NULL, NULL, true, 0}; + bool privnet = true; + lxcNetworkParseArray nets = {NULL, 0};
- if (virConfWalk(properties, lxcNetworkWalkCallback, &data) < 0) + if (virConfWalk(properties, lxcNetworkWalkCallback, &nets) < 0) goto error;
+ for (i = 0; i < nets.networks; i++) { + lxcNetworkParseDataPtr data = nets.data[i];
- /* Add the last network definition found */ - status = lxcAddNetworkDefinition(&data); + /* It needs to guarantee that index exists. */ + /* Since there is a sparse array. */ + if (data) { + /* Add network definitions */ + status = lxcAddNetworkDefinition(def, data);
- if (status < 0) - goto error; - else if (status > 0) - data.networks++; - else if (data.type != NULL && STREQ(data.type, "none")) - data.privnet = false; + if (status < 0) + goto error; + else if (data->type != NULL && STREQ(data->type, "none")) + privnet = false; + } + }
- if (data.networks == 0 && data.privnet) { + if (nets.networks == 0 && privnet) { /* When no network type is provided LXC only adds loopback */ def->features[VIR_DOMAIN_FEATURE_PRIVNET] = VIR_TRISTATE_SWITCH_ON; } @@ -672,9 +725,13 @@ lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties) return result;
error: - for (i = 0; i < data.nips; i++) - VIR_FREE(data.ips[i]); - VIR_FREE(data.ips); + for (i = 0; i <= nets.networks; i++) {
There is no reason to go to including nets.networks. In fact, there should be nothing at nets.networks index as it is past allocated array possibly leading to a crash.
+ for (i = 0; i < nets.data[i]->nips; i++) + VIR_FREE(nets.data[i]->ips[i]); + VIR_FREE(nets.data[i]->ips); + } + for (i = 0; i <= nets.networks; i++) + VIR_FREE(nets.data[i]); return -1; }
The rest of the patches look okay. Michal

This commit only change the legacy network settings ("lxc.network.") inside v3 tests to the new format ("lxc.net.X.") adopted in version 3.0. It enhaces some test cases to cover other scenarions. Signed-off-by: Julio Faracco <jcfaracco@gmail.com> --- .../lxcconf2xml-ethernet-v3.config | 16 ++++---- .../lxcconf2xml-fstab-v3.config | 10 ++--- .../lxcconf2xml-macvlannetwork-v3.config | 10 ++--- .../lxcconf2xml-miscnetwork-v3.config | 38 +++++++++---------- .../lxcconf2xml-physnetwork-v3.config | 14 +++---- .../lxcconf2xml-simple-v3.config | 18 ++++----- .../lxcconf2xml-vlannetwork-v3.config | 10 ++--- 7 files changed, 58 insertions(+), 58 deletions(-) diff --git a/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config index 630cb2ebb6..0a641549f3 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-ethernet-v3.config @@ -1,14 +1,14 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = veth -lxc.network.flags = up -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.name = eth0 -lxc.network.ipv4 = 192.168.122.2/24 -lxc.network.ipv4.gateway = 192.168.122.1 -lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 -lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.0.type = veth +lxc.net.0.flags = up +lxc.net.0.hwaddr = 02:00:15:8f:05:c1 +lxc.net.0.name = eth0 +lxc.net.0.ipv4 = 192.168.122.2/24 +lxc.net.0.ipv4.gateway = 192.168.122.1 +lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 #remove next line if host DNS configuration should not be available to container lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config index 8b62818657..315ad45ad1 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-fstab-v3.config @@ -1,11 +1,11 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = veth -lxc.network.flags = up -lxc.network.link = virbr0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.name = eth0 +lxc.net.1.type = veth +lxc.net.1.flags = up +lxc.net.1.link = virbr0 +lxc.net.1.hwaddr = 02:00:15:8f:05:c1 +lxc.net.1.name = eth0 #remove next line if host DNS configuration should not be available to container lxc.mount.fstab = /var/lib/lxc/migrate_test/fstab diff --git a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config index 631f07ecca..ab8d85361f 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-macvlannetwork-v3.config @@ -1,11 +1,11 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = macvlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.macvlan.mode = vepa +lxc.net.0.type = macvlan +lxc.net.0.flags = up +lxc.net.0.link = eth0 +lxc.net.0.hwaddr = 02:00:15:8f:05:c1 +lxc.net.0.macvlan.mode = vepa #remove next line if host DNS configuration should not be available to container lxc.rootfs.path = /var/lib/lxc/migrate_test/rootfs diff --git a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config index b46cb3ee7d..3034e4d1ca 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-miscnetwork-v3.config @@ -1,23 +1,23 @@ -lxc.network.type = phys -lxc.network.link = eth0 -lxc.network.name = eth1 -lxc.network.ipv4 = 192.168.122.2/24 -lxc.network.ipv4.gateway = 192.168.122.1 -lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 -lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.0.type = phys +lxc.net.0.link = eth0 +lxc.net.0.name = eth1 +lxc.net.0.ipv4 = 192.168.122.2/24 +lxc.net.0.ipv4.gateway = 192.168.122.1 +lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 -lxc.network.type = vlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.vlan.id = 2 +lxc.net.2.type = macvlan +lxc.net.2.flags = up +lxc.net.2.link = eth0 +lxc.net.2.hwaddr = 02:00:15:8f:05:c1 +lxc.net.2.macvlan.mode = vepa -lxc.network.type = macvlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.macvlan.mode = vepa +lxc.net.1.type = vlan +lxc.net.1.flags = up +lxc.net.1.link = eth0 +lxc.net.1.hwaddr = 02:00:15:8f:05:c1 +lxc.net.1.vlan.id = 2 -lxc.rootfs = /var/lib/lxc/migrate_test/rootfs -lxc.utsname = migrate_test +lxc.rootfs.path = /var/lib/lxc/migrate_test/rootfs +lxc.uts.name = migrate_test lxc.autodev=1 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-physnetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-physnetwork-v3.config index 92729841d7..9cf96163b3 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-physnetwork-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-physnetwork-v3.config @@ -1,10 +1,10 @@ -lxc.network.type = phys -lxc.network.link = eth0 -lxc.network.name = eth1 -lxc.network.ipv4 = 192.168.122.2/24 -lxc.network.ipv4.gateway = 192.168.122.1 -lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 -lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.0.type = phys +lxc.net.0.link = eth0 +lxc.net.0.name = eth1 +lxc.net.0.ipv4 = 192.168.122.2/24 +lxc.net.0.ipv4.gateway = 192.168.122.1 +lxc.net.0.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.0.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 lxc.rootfs.path = /var/lib/lxc/migrate_test/rootfs lxc.uts.name = migrate_test diff --git a/tests/lxcconf2xmldata/lxcconf2xml-simple-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-simple-v3.config index a0036a482e..09cc91c2c6 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-simple-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-simple-v3.config @@ -1,15 +1,15 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = veth -lxc.network.flags = up -lxc.network.link = virbr0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.name = eth0 -lxc.network.ipv4 = 192.168.122.2/24 -lxc.network.ipv4.gateway = 192.168.122.1 -lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 -lxc.network.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.1.type = veth +lxc.net.1.flags = up +lxc.net.1.link = virbr0 +lxc.net.1.hwaddr = 02:00:15:8f:05:c1 +lxc.net.1.name = eth0 +lxc.net.1.ipv4 = 192.168.122.2/24 +lxc.net.1.ipv4.gateway = 192.168.122.1 +lxc.net.1.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.1.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 #remove next line if host DNS configuration should not be available to container lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork-v3.config index 31e26997dd..172211c21f 100644 --- a/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork-v3.config +++ b/tests/lxcconf2xmldata/lxcconf2xml-vlannetwork-v3.config @@ -1,11 +1,11 @@ # Template used to create this container: opensuse # Template script checksum (SHA-1): 27307e0a95bd81b2c0bd82d6f87fdbe83be075ef -lxc.network.type = vlan -lxc.network.flags = up -lxc.network.link = eth0 -lxc.network.hwaddr = 02:00:15:8f:05:c1 -lxc.network.vlan.id = 2 +lxc.net.0.type = vlan +lxc.net.0.flags = up +lxc.net.0.link = eth0 +lxc.net.0.hwaddr = 02:00:15:8f:05:c1 +lxc.net.0.vlan.id = 2 lxc.rootfs.path = /var/lib/lxc/migrate_test/rootfs lxc.uts.name = migrate_test -- 2.19.1

This is a test case to test network indexes. NICs must be created considering the sequence of each index no matter where the entry is. They do not be defined in sequence as legacy version suggests. Signed-off-by: Julio Faracco <jcfaracco@gmail.com> --- .../lxcconf2xml-randomnetwork-v3.config | 21 +++++++++ .../lxcconf2xml-randomnetwork.xml | 45 +++++++++++++++++++ tests/lxcconf2xmltest.c | 1 + 3 files changed, 67 insertions(+) create mode 100644 tests/lxcconf2xmldata/lxcconf2xml-randomnetwork-v3.config create mode 100644 tests/lxcconf2xmldata/lxcconf2xml-randomnetwork.xml diff --git a/tests/lxcconf2xmldata/lxcconf2xml-randomnetwork-v3.config b/tests/lxcconf2xmldata/lxcconf2xml-randomnetwork-v3.config new file mode 100644 index 0000000000..b69cec32d6 --- /dev/null +++ b/tests/lxcconf2xmldata/lxcconf2xml-randomnetwork-v3.config @@ -0,0 +1,21 @@ +lxc.net.20.type = macvlan +lxc.net.1.type = phys +lxc.net.10.flags = up +lxc.net.20.hwaddr = 02:00:15:8f:05:c1 +lxc.net.20.flags = up +lxc.net.1.link = eth0 +lxc.net.1.name = eth1 +lxc.net.10.type = vlan +lxc.net.1.ipv6.gateway = 2003:db8:1:0:214:1234:fe0b:3595 +lxc.net.1.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596/64 +lxc.net.20.link = eth0 +lxc.net.10.vlan.id = 2 +lxc.net.1.ipv4.gateway = 192.168.122.1 +lxc.net.10.link = eth0 +lxc.net.1.ipv4 = 192.168.122.2/24 +lxc.net.10.hwaddr = 02:00:15:8f:05:c1 +lxc.net.20.macvlan.mode = vepa + +lxc.rootfs = /var/lib/lxc/migrate_test/rootfs +lxc.utsname = migrate_test +lxc.autodev=1 diff --git a/tests/lxcconf2xmldata/lxcconf2xml-randomnetwork.xml b/tests/lxcconf2xmldata/lxcconf2xml-randomnetwork.xml new file mode 100644 index 0000000000..baaceb5455 --- /dev/null +++ b/tests/lxcconf2xmldata/lxcconf2xml-randomnetwork.xml @@ -0,0 +1,45 @@ +<domain type='lxc'> + <name>migrate_test</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory unit='KiB'>65536</memory> + <currentMemory unit='KiB'>65536</currentMemory> + <vcpu placement='static'>1</vcpu> + <os> + <type>exe</type> + <init>/sbin/init</init> + </os> + <features> + <capabilities policy='allow'> + </capabilities> + </features> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/libexec/libvirt_lxc</emulator> + <filesystem type='mount' accessmode='passthrough'> + <source dir='/var/lib/lxc/migrate_test/rootfs'/> + <target dir='/'/> + </filesystem> + <interface type='direct'> + <mac address='02:00:15:8f:05:c1'/> + <source dev='eth0' mode='vepa'/> + <link state='up'/> + </interface> + <hostdev mode='capabilities' type='net'> + <source> + <interface>eth0</interface> + </source> + <ip address='2003:db8:1:0:214:1234:fe0b:3596' family='ipv6' prefix='64'/> + <ip address='192.168.122.2' family='ipv4' prefix='24'/> + <route family='ipv4' address='0.0.0.0' gateway='192.168.122.1'/> + <route family='ipv6' address='::' gateway='2003:db8:1:0:214:1234:fe0b:3595'/> + </hostdev> + <hostdev mode='capabilities' type='net'> + <source> + <interface>eth0.2</interface> + </source> + </hostdev> + </devices> +</domain> diff --git a/tests/lxcconf2xmltest.c b/tests/lxcconf2xmltest.c index 2a277042ce..78927d29b1 100644 --- a/tests/lxcconf2xmltest.c +++ b/tests/lxcconf2xmltest.c @@ -163,6 +163,7 @@ mymain(void) DO_TEST3("macvlannetwork", false); DO_TEST3("vlannetwork", false); DO_TEST3("miscnetwork", false); + DO_TEST3("randomnetwork", false); DO_TEST3("idmap", false); DO_TEST3("memtune", false); DO_TEST3("cputune", false); -- 2.19.1
participants (2)
-
Julio Faracco
-
Michal Privoznik