提交 a09bbc02 编写于 作者: C Cédric Bosdonnat 提交者: Daniel P. Berrange

LXC from native: map vlan network type

The problem with VLAN is that the user still has to manually create the
vlan interface on the host. Then the generated configuration will use
it as a nerwork hostdev device. So the generated configurations of the
following two fragments are equivalent (see rhbz#1059637).

lxc.network.type = phys
lxc.network.link = eth0.5

lxc.network.type = vlan
lxc.network.link = eth0
lxc.network.vlan.id = 5
上级 d1520c5c
......@@ -414,22 +414,39 @@ lxcAddNetworkDefinition(virDomainDefPtr def,
const char *link,
const char *mac,
const char *flag,
const char *macvlanmode)
const char *macvlanmode,
const char *vlanid)
{
virDomainNetDefPtr net = NULL;
virDomainHostdevDefPtr hostdev = NULL;
bool isPhys, isVlan = false;
if ((type == NULL) || STREQ(type, "empty") || STREQ(type, "") ||
STREQ(type, "none"))
return 0;
if (type != NULL && STREQ(type, "phys")) {
if (!link ||
!(hostdev = lxcCreateHostdevDef(VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES,
isPhys = STREQ(type, "phys");
isVlan = STREQ(type, "vlan");
if (type != NULL && (isPhys || isVlan)) {
if (!link) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Missing 'link' attribute for NIC"));
goto error;
}
if (!(hostdev = lxcCreateHostdevDef(VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES,
VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET,
link)))
goto error;
/* This still requires the user to manually setup the vlan interface
* on the host */
if (isVlan && vlanid) {
VIR_FREE(hostdev->source.caps.u.net.iface);
if (virAsprintf(&hostdev->source.caps.u.net.iface,
"%s.%s", link, vlanid) < 0)
goto error;
}
if (VIR_EXPAND_N(def->hostdevs, def->nhostdevs, 1) < 0)
goto error;
def->hostdevs[def->nhostdevs - 1] = hostdev;
......@@ -457,6 +474,7 @@ typedef struct {
char *mac;
char *flag;
char *macvlanmode;
char *vlanid;
bool privnet;
size_t networks;
} lxcNetworkParseData;
......@@ -472,7 +490,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
status = lxcAddNetworkDefinition(parseData->def, parseData->type,
parseData->link, parseData->mac,
parseData->flag,
parseData->macvlanmode);
parseData->macvlanmode,
parseData->vlanid);
if (status < 0)
return -1;
......@@ -487,6 +506,7 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
parseData->mac = NULL;
parseData->flag = NULL;
parseData->macvlanmode = NULL;
parseData->vlanid = NULL;
/* Keep the new value */
parseData->type = value->str;
......@@ -499,6 +519,8 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
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 (STRPREFIX(name, "lxc.network"))
VIR_WARN("Unhandled network property: %s = %s",
name,
......@@ -511,14 +533,16 @@ static int
lxcConvertNetworkSettings(virDomainDefPtr def, virConfPtr properties)
{
int status;
lxcNetworkParseData data = {def, NULL, NULL, NULL, NULL, NULL, true, 0};
lxcNetworkParseData data = {def, NULL, NULL, NULL, NULL,
NULL, NULL, true, 0};
virConfWalk(properties, lxcNetworkWalkCallback, &data);
/* Add the last network definition found */
status = lxcAddNetworkDefinition(def, data.type, data.link,
data.mac, data.flag,
data.macvlanmode);
data.macvlanmode,
data.vlanid);
if (status < 0)
return -1;
else if (status > 0)
......
# 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.rootfs = /var/lib/lxc/migrate_test/rootfs
lxc.utsname = migrate_test
lxc.autodev=1
<domain type='lxc'>
<name>migrate_test</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>65536</memory>
<currentMemory unit='KiB'>0</currentMemory>
<vcpu placement='static' current='0'>1</vcpu>
<os>
<type>exe</type>
<init>/sbin/init</init>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<filesystem type='mount' accessmode='passthrough'>
<source dir='/var/lib/lxc/migrate_test/rootfs'/>
<target dir='/'/>
</filesystem>
<hostdev mode='capabilities' type='net'>
<source>
<interface>eth0.2</interface>
</source>
</hostdev>
</devices>
</domain>
......@@ -108,6 +108,7 @@ mymain(void)
DO_TEST("nonenetwork", false);
DO_TEST("physnetwork", false);
DO_TEST("macvlannetwork", false);
DO_TEST("vlannetwork", false);
DO_TEST("idmap", false);
DO_TEST("memtune", false);
DO_TEST("cputune", false);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册