Skip to content

Commit 6ac5e8c

Browse files
CNI Ipv6 Dualstack Support (#538)
* added cniv6 plugin * cni ipv6 base framework * removed unwanted changes * added ipv6 change * added cni ipv6 changes * drop neighbor discovery messages to other VMs * fixed issues * fixed unit tests * fix nil dereference * addressed comments * ipv6 fixes and changes * addressed comments
1 parent de708ee commit 6ac5e8c

22 files changed

+703
-163
lines changed

Makefile

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ ROOT_DIR = $(shell pwd)
7575
CNM_DIR = cnm/plugin
7676
CNI_NET_DIR = cni/network/plugin
7777
CNI_IPAM_DIR = cni/ipam/plugin
78+
CNI_IPAMV6_DIR = cni/ipam/pluginv6
7879
CNI_TELEMETRY_DIR = cni/telemetry/service
7980
TELEMETRY_CONF_DIR = telemetry
8081
CNS_DIR = cns/service
@@ -144,7 +145,8 @@ ENSURE_OUTPUT_DIR_EXISTS := $(shell mkdir -p $(OUTPUT_DIR))
144145
azure-cnm-plugin: $(CNM_BUILD_DIR)/azure-vnet-plugin$(EXE_EXT) cnm-archive
145146
azure-vnet: $(CNI_BUILD_DIR)/azure-vnet$(EXE_EXT)
146147
azure-vnet-ipam: $(CNI_BUILD_DIR)/azure-vnet-ipam$(EXE_EXT)
147-
azure-cni-plugin: azure-vnet azure-vnet-ipam azure-vnet-telemetry cni-archive
148+
azure-vnet-ipamv6: $(CNI_BUILD_DIR)/azure-vnet-ipamv6$(EXE_EXT)
149+
azure-cni-plugin: azure-vnet azure-vnet-ipam azure-vnet-ipamv6 azure-vnet-telemetry cni-archive
148150
azure-cns: $(CNS_BUILD_DIR)/azure-cns$(EXE_EXT) cns-archive
149151
azure-vnet-telemetry: $(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT)
150152

@@ -184,6 +186,10 @@ $(CNI_BUILD_DIR)/azure-vnet$(EXE_EXT): $(CNIFILES)
184186
$(CNI_BUILD_DIR)/azure-vnet-ipam$(EXE_EXT): $(CNIFILES)
185187
go build -v -o $(CNI_BUILD_DIR)/azure-vnet-ipam$(EXE_EXT) -ldflags "-X main.version=$(VERSION) -s -w" $(CNI_IPAM_DIR)/*.go
186188

189+
# Build the Azure CNI IPAMV6 plugin.
190+
$(CNI_BUILD_DIR)/azure-vnet-ipamv6$(EXE_EXT): $(CNIFILES)
191+
go build -v -o $(CNI_BUILD_DIR)/azure-vnet-ipamv6$(EXE_EXT) -ldflags "-X main.version=$(VERSION) -s -w" $(CNI_IPAMV6_DIR)/*.go
192+
187193
# Build the Azure CNI telemetry plugin.
188194
$(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT): $(CNIFILES)
189195
go build -v -o $(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT) -ldflags "-X main.version=$(VERSION) -X $(ACN_PACKAGE_PATH)/telemetry.aiMetadata=$(CNI_AI_ID) -s -w" $(CNI_TELEMETRY_DIR)/*.go
@@ -314,8 +320,8 @@ publish-azure-cns-image:
314320
cni-archive:
315321
cp cni/azure-$(GOOS).conflist $(CNI_BUILD_DIR)/10-azure.conflist
316322
cp telemetry/azure-vnet-telemetry.config $(CNI_BUILD_DIR)/azure-vnet-telemetry.config
317-
chmod 0755 $(CNI_BUILD_DIR)/azure-vnet$(EXE_EXT) $(CNI_BUILD_DIR)/azure-vnet-ipam$(EXE_EXT) $(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT)
318-
cd $(CNI_BUILD_DIR) && $(ARCHIVE_CMD) $(CNI_ARCHIVE_NAME) azure-vnet$(EXE_EXT) azure-vnet-ipam$(EXE_EXT) azure-vnet-telemetry$(EXE_EXT) 10-azure.conflist azure-vnet-telemetry.config
323+
chmod 0755 $(CNI_BUILD_DIR)/azure-vnet$(EXE_EXT) $(CNI_BUILD_DIR)/azure-vnet-ipam$(EXE_EXT) $(CNI_BUILD_DIR)/azure-vnet-ipamv6$(EXE_EXT) $(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT)
324+
cd $(CNI_BUILD_DIR) && $(ARCHIVE_CMD) $(CNI_ARCHIVE_NAME) azure-vnet$(EXE_EXT) azure-vnet-ipam$(EXE_EXT) azure-vnet-ipamv6$(EXE_EXT) azure-vnet-telemetry$(EXE_EXT) 10-azure.conflist azure-vnet-telemetry.config
319325
chown $(BUILD_USER):$(BUILD_USER) $(CNI_BUILD_DIR)/$(CNI_ARCHIVE_NAME)
320326
mkdir -p $(CNI_MULTITENANCY_BUILD_DIR)
321327
cp cni/azure-$(GOOS)-multitenancy.conflist $(CNI_MULTITENANCY_BUILD_DIR)/10-azure.conflist
@@ -371,5 +377,6 @@ test-all:
371377
./cnm/network/ \
372378
./cni/ipam/ \
373379
./cns/ipamclient/ \
380+
./cnms/service/ \
374381
./npm/iptm/ \
375-
./npm/ipsm/
382+
./npm/ipsm/

aitelemetry/telemetrywrapper_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func TestMain(m *testing.M) {
6262
}
6363

6464
log.Close()
65+
hostAgent.Stop()
6566
os.Exit(exitCode)
6667
}
6768

cni/ipam/ipam.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ import (
1919
cniTypesCurr "github.com/containernetworking/cni/pkg/types/current"
2020
)
2121

22+
const (
23+
ipamV6 = "azure-vnet-ipamv6"
24+
)
25+
2226
var (
2327
ipv4DefaultRouteDstPrefix = net.IPNet{net.IPv4zero, net.IPv4Mask(0, 0, 0, 0)}
2428
)
@@ -154,8 +158,13 @@ func (plugin *ipamPlugin) Add(args *cniSkel.CmdArgs) error {
154158
options := make(map[string]string)
155159
options[ipam.OptInterfaceName] = nwCfg.Master
156160

161+
isIpv6 := false
162+
if nwCfg.Ipam.Type == ipamV6 {
163+
isIpv6 = true
164+
}
165+
157166
// Allocate an address pool.
158-
poolID, subnet, err = plugin.am.RequestPool(nwCfg.Ipam.AddrSpace, "", "", options, false)
167+
poolID, subnet, err = plugin.am.RequestPool(nwCfg.Ipam.AddrSpace, "", "", options, isIpv6)
159168
if err != nil {
160169
err = plugin.Errorf("Failed to allocate pool: %v", err)
161170
return err

cni/ipam/pluginv6/main.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright 2017 Microsoft. All rights reserved.
2+
// MIT License
3+
4+
package main
5+
6+
import (
7+
"fmt"
8+
"os"
9+
10+
"github.com/Azure/azure-container-networking/cni"
11+
"github.com/Azure/azure-container-networking/cni/ipam"
12+
"github.com/Azure/azure-container-networking/common"
13+
"github.com/Azure/azure-container-networking/log"
14+
)
15+
16+
const (
17+
name = "azure-vnet-ipamv6"
18+
)
19+
20+
// Version is populated by make during build.
21+
var version string
22+
23+
// Main is the entry point for CNI IPAM plugin.
24+
func main() {
25+
var config common.PluginConfig
26+
config.Version = version
27+
logDirectory := "" // Sets the current location as log directory
28+
29+
log.SetName(name)
30+
log.SetLevel(log.LevelInfo)
31+
if err := log.SetTargetLogDirectory(log.TargetLogfile, logDirectory); err != nil {
32+
fmt.Printf("Failed to setup cni logging: %v\n", err)
33+
return
34+
}
35+
36+
defer log.Close()
37+
38+
ipamPlugin, err := ipam.NewPlugin(name, &config)
39+
if err != nil {
40+
fmt.Printf("Failed to create IPAM plugin, err:%v.\n", err)
41+
os.Exit(1)
42+
}
43+
44+
if err := ipamPlugin.Plugin.InitializeKeyValueStore(&config); err != nil {
45+
fmt.Printf("Failed to initialize key-value store of ipam plugin, err:%v.\n", err)
46+
47+
if isSafe, _ := ipamPlugin.Plugin.IsSafeToRemoveLock(ipamPlugin.Plugin.Name); isSafe {
48+
log.Printf("[IPAM] Removing lock file as process holding lock exited")
49+
if errUninit := ipamPlugin.Plugin.UninitializeKeyValueStore(true); errUninit != nil {
50+
log.Errorf("Failed to uninitialize key-value store of network plugin, err:%v.\n", errUninit)
51+
}
52+
}
53+
54+
os.Exit(1)
55+
}
56+
57+
defer func() {
58+
if errUninit := ipamPlugin.Plugin.UninitializeKeyValueStore(false); errUninit != nil {
59+
fmt.Printf("Failed to uninitialize key-value store of ipam plugin, err:%v.\n", err)
60+
}
61+
62+
if recover() != nil {
63+
os.Exit(1)
64+
}
65+
}()
66+
67+
err = ipamPlugin.Start(&config)
68+
if err != nil {
69+
fmt.Printf("Failed to start IPAM plugin, err:%v.\n", err)
70+
panic("ipam plugin fatal error")
71+
}
72+
73+
err = ipamPlugin.Execute(cni.PluginApi(ipamPlugin))
74+
75+
ipamPlugin.Stop()
76+
77+
if err != nil {
78+
panic("ipam plugin fatal error")
79+
}
80+
}

cni/netconfig.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ type NetworkConfig struct {
5151
LogLevel string `json:"logLevel,omitempty"`
5252
LogTarget string `json:"logTarget,omitempty"`
5353
InfraVnetAddressSpace string `json:"infraVnetAddressSpace,omitempty"`
54+
IPV6Mode string `json:"ipv6Mode,omitempty"`
55+
ServiceCidrs string `json:"serviceCidrs,omitempty"`
56+
VnetCidrs string `json:"vnetCidrs,omitempty"`
5457
PodNamespaceForDualNetwork []string `json:"podNamespaceForDualNetwork,omitempty"`
5558
IPsToRouteViaHost []string `json:"ipsToRouteViaHost,omitempty"`
5659
MultiTenancy bool `json:"multiTenancy,omitempty"`

0 commit comments

Comments
 (0)