Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,7 @@ ipam-*.xml
.vscode/*

# Coverage
*.out
*.out

# Goland
.idea/*
32 changes: 25 additions & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ CNI_NET_DIR = cni/network/plugin
CNI_IPAM_DIR = cni/ipam/plugin
CNI_IPAMV6_DIR = cni/ipam/pluginv6
CNI_TELEMETRY_DIR = cni/telemetry/service
ACNCLI_DIR = acncli
TELEMETRY_CONF_DIR = telemetry
CNS_DIR = cns/service
CNMS_DIR = cnms/service
Expand All @@ -88,6 +89,7 @@ OUTPUT_DIR = output
BUILD_DIR = $(OUTPUT_DIR)/$(GOOS)_$(GOARCH)
CNM_BUILD_DIR = $(BUILD_DIR)/cnm
CNI_BUILD_DIR = $(BUILD_DIR)/cni
ACNCLI_BUILD_DIR = $(BUILD_DIR)/acncli
CNI_MULTITENANCY_BUILD_DIR = $(BUILD_DIR)/cni-multitenancy
CNS_BUILD_DIR = $(BUILD_DIR)/cns
CNMS_BUILD_DIR = $(BUILD_DIR)/cnms
Expand Down Expand Up @@ -118,6 +120,7 @@ endif
# Archive file names.
CNM_ARCHIVE_NAME = azure-vnet-cnm-$(GOOS)-$(GOARCH)-$(VERSION).$(ARCHIVE_EXT)
CNI_ARCHIVE_NAME = azure-vnet-cni-$(GOOS)-$(GOARCH)-$(VERSION).$(ARCHIVE_EXT)
ACNCLI_ARCHIVE_NAME = acncli-$(GOOS)-$(GOARCH)-$(VERSION).$(ARCHIVE_EXT)
CNI_MULTITENANCY_ARCHIVE_NAME = azure-vnet-cni-multitenancy-$(GOOS)-$(GOARCH)-$(VERSION).$(ARCHIVE_EXT)
CNS_ARCHIVE_NAME = azure-cns-$(GOOS)-$(GOARCH)-$(VERSION).$(ARCHIVE_EXT)
CNMS_ARCHIVE_NAME = azure-cnms-$(GOOS)-$(GOARCH)-$(VERSION).$(ARCHIVE_EXT)
Expand All @@ -134,7 +137,7 @@ CNM_PLUGIN_ROOTFS = azure-vnet-plugin-rootfs
AZURE_NPM_IMAGE = containernetworking.azurecr.io/public/containernetworking/azure-npm

# Azure CNI installer parameters
AZURE_CNI_IMAGE = containernetworking.azurecr.io/public/containernetworking/azure-cni-installer
AZURE_CNI_IMAGE = containernetworking.azurecr.io/public/containernetworking/azure-cni-manager

# Azure vnet telemetry image parameters.
AZURE_VNET_TELEMETRY_IMAGE = containernetworking.azurecr.io/public/containernetworking/azure-vnet-telemetry
Expand All @@ -155,6 +158,7 @@ azure-vnet-ipamv6: $(CNI_BUILD_DIR)/azure-vnet-ipamv6$(EXE_EXT)
azure-cni-plugin: azure-vnet azure-vnet-ipam azure-vnet-ipamv6 azure-vnet-telemetry cni-archive
azure-cns: $(CNS_BUILD_DIR)/azure-cns$(EXE_EXT) cns-archive
azure-vnet-telemetry: $(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT)
acncli: $(ACNCLI_BUILD_DIR)/acncli$(EXE_EXT) acncli-archive

# Azure-NPM only supports Linux for now.
ifeq ($(GOOS),linux)
Expand All @@ -163,9 +167,9 @@ azure-npm: $(NPM_BUILD_DIR)/azure-npm$(EXE_EXT) npm-archive
endif

ifeq ($(GOOS),linux)
all-binaries: azure-cnm-plugin azure-cni-plugin azure-cns azure-cnms azure-npm
all-binaries: acncli azure-cnm-plugin azure-cni-plugin azure-cns azure-cnms azure-npm
else
all-binaries: azure-cnm-plugin azure-cni-plugin azure-cns
all-binaries: acncli azure-cnm-plugin azure-cni-plugin azure-cns acncli
endif

ifeq ($(GOOS),linux)
Expand Down Expand Up @@ -200,6 +204,10 @@ $(CNI_BUILD_DIR)/azure-vnet-ipamv6$(EXE_EXT): $(CNIFILES)
$(CNI_BUILD_DIR)/azure-vnet-telemetry$(EXE_EXT): $(CNIFILES)
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

# Build the Azure CLI network plugin.
$(ACNCLI_BUILD_DIR)/acncli$(EXE_EXT): $(CNIFILES)
CGO_ENABLED=0 go build -v -o $(ACNCLI_BUILD_DIR)/acn$(EXE_EXT) -ldflags "-X main.version=$(VERSION) -s -w" $(ACNCLI_DIR)/*.go

# Build the Azure CNS Service.
$(CNS_BUILD_DIR)/azure-cns$(EXE_EXT): $(CNSFILES)
go build -v -o $(CNS_BUILD_DIR)/azure-cns$(EXE_EXT) -ldflags "-X main.version=$(VERSION) -X $(cnsaipath)=$(CNS_AI_ID) -s -w" $(CNS_DIR)/*.go
Expand Down Expand Up @@ -240,10 +248,11 @@ all-binaries-platforms:
export GOOS=linux; make all-binaries
export GOOS=windows; make all-binaries

# CNI Installer
.PHONY: cni-installer
cni-installer: all-binaries-platforms
docker build -f ./cni/installer/Dockerfile --build-arg VERSION=$(VERSION) -t $(AZURE_CNI_IMAGE):$(VERSION) .
# CNI Manager
.PHONY: azure-cni-manager
azure-cni-manager: all-binaries
docker build -f ./acncli/Dockerfile --build-arg VERSION=$(VERSION) -t $(AZURE_CNI_IMAGE):$(VERSION) .


# Build the Azure CNM plugin image, installable with "docker plugin install".
.PHONY: azure-vnet-plugin-image
Expand Down Expand Up @@ -369,6 +378,15 @@ cnm-archive:
cd $(CNM_BUILD_DIR) && $(ARCHIVE_CMD) $(CNM_ARCHIVE_NAME) azure-vnet-plugin$(EXE_EXT)
chown $(BUILD_USER):$(BUILD_USER) $(CNM_BUILD_DIR)/$(CNM_ARCHIVE_NAME)

# Create a CNM archive for the target platform.
.PHONY: acncli-archive
acncli-archive:
mkdir -p $(ACNCLI_BUILD_DIR)
chmod 0755 $(ACNCLI_BUILD_DIR)/acn$(EXE_EXT)
cd $(ACNCLI_BUILD_DIR) && $(ARCHIVE_CMD) $(ACNCLI_ARCHIVE_NAME) acn$(EXE_EXT)
chown $(BUILD_USER):$(BUILD_USER) $(ACNCLI_BUILD_DIR)/$(ACNCLI_ARCHIVE_NAME)


# Create a CNS archive for the target platform.
.PHONY: cns-archive
cns-archive:
Expand Down
1 change: 1 addition & 0 deletions acncli/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
deployment/*
21 changes: 21 additions & 0 deletions acncli/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
FROM golang as build
WORKDIR /go/src/github.com/Azure/azure-container-networking/
ADD . .
ARG VERSION
RUN make all-binaries
RUN rm -rf ./output/windows*
RUN rm -rf ./output/linux_amd64/npm/*
RUN mv ./output /output
RUN find /output -name "*.zip" -type f -delete
RUN find /output -name "*.tgz" -type f -delete

FROM scratch
COPY --from=build /output/linux_amd64/acncli/ .
COPY --from=build /output /output

ENV AZURE_CNI_OS=linux
ENV AZURE_CNI_TENANCY=singletenancy
ENV AZURE_CNI_IPAM=azure-cns
ENV AZURE_CNI_MODE=transparent

CMD ["./acn", "manager", "-f"]
100 changes: 100 additions & 0 deletions acncli/api/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package api

import "strings"

const (
CNI = "cni"

EnvPrefix = "AZURE_CNI"

//CNI Install Flags
FlagMode = "mode"
FlagTarget = "target"
FlagIPAM = "ipam"
FlagOS = "os"
FlagTenancy = "tenancy"
FlagExempt = "exempt"
FlagBinDirectory = "bin-directory"
FlagConflistDirectory = "conflist-directory"
FlagVersion = "version"

//CNI Log Flags
FlagFollow = "follow"
FlagLogFilePath = "log-file"

// tenancy flags
Singletenancy = "singletenancy"
Multitenancy = "multitenancy"

// os flags
Linux = "linux"
Windows = "windows"

// arch flags
Amd64 = "amd64"

// target mode flags
Local = "local"
Cluster = "cluster"

// File permissions
BinPerm = 755
ConflistPerm = 644

// CNI versions
Latest = "latest"
Packaged = "packaged"

AzureCNIBin = "azure-vnet"
AzureTelemetryBin = "azure-vnet-telemetry"
AzureTelemetryConfig = "azure-vnet-telemetry.config"
AzureCNSIPAM = "azure-cns"
AzureVNETIPAM = "azure-vnet-ipam"
ConflistExtension = ".conflist"

DefaultSrcDirLinux = "/output/"
DefaultBinDirLinux = "/opt/cni/bin/"
DefaultConflistDirLinux = "/etc/cni/net.d/"
DefaultLogFile = "/var/log/azure-vnet.log"
Transparent = "transparent"
Bridge = "bridge"
Azure0 = "azure0"
)

var (
// Concatenating flags to the env ensures consistency between flags and env's for viper and cobra
EnvCNIOS = EnvPrefix + "_" + strings.ToUpper(FlagOS)
EnvCNIType = EnvPrefix + "_" + strings.ToUpper(FlagTenancy)
EnvCNISourceDir = EnvPrefix + "_" + "SRC_DIR"
EnvCNIDestinationBinDir = EnvPrefix + "_" + "BIN_DIR"
EnvCNIDestinationConflistDir = EnvPrefix + "_" + "CONFLIST_DIR"
EnvCNIIPAMType = EnvPrefix + "_" + strings.ToUpper(FlagIPAM)
EnvCNIMode = EnvPrefix + "_" + strings.ToUpper(FlagMode)
EnvCNIExemptBins = EnvPrefix + "_" + strings.ToUpper(FlagExempt)
EnvCNILogFile = EnvPrefix + "_" + "LOG_FILE"

Defaults = map[string]string{
FlagOS: Linux,
FlagTenancy: Singletenancy,
FlagIPAM: AzureVNETIPAM,
FlagExempt: AzureTelemetryBin + "," + AzureTelemetryConfig,
FlagMode: Bridge,
FlagTarget: Local,
FlagBinDirectory: DefaultBinDirLinux,
FlagConflistDirectory: DefaultConflistDirLinux,
FlagVersion: Packaged,
FlagLogFilePath: DefaultLogFile,
EnvCNILogFile: EnvCNILogFile,
EnvCNISourceDir: DefaultSrcDirLinux,
EnvCNIDestinationBinDir: DefaultBinDirLinux,
EnvCNIDestinationConflistDir: DefaultConflistDirLinux,
}

DefaultToggles = map[string]bool{
FlagFollow: false,
}
)

func GetDefaults() map[string]string {
return Defaults
}
69 changes: 69 additions & 0 deletions acncli/cmd/install.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package cmd

import (
"fmt"
"strings"

c "github.com/Azure/azure-container-networking/acncli/api"
i "github.com/Azure/azure-container-networking/acncli/installer"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

// install CNI will install CNI to a local machine
func InstallCmd() *cobra.Command {
var cmd = &cobra.Command{
Use: "install",
Short: "Installs an ACN component",
}
cmd.AddCommand(InstallCNICmd())
return cmd
}

func InstallCNICmd() *cobra.Command {
var cmd = &cobra.Command{
Use: "cni",
Short: "Installs CNI and conflist ",
RunE: func(cmd *cobra.Command, args []string) error {

envs := i.InstallerConfig{
ExemptBins: make(map[string]bool),
}

// only allow windows and linux binaries
if err := envs.SetOSType(viper.GetString(c.FlagOS)); err != nil {
return err
}

// only allow windows and linux binaries
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment remove or change to //only allow Single or Multi tenancy

if err := envs.SetCNIType(viper.GetString(c.FlagTenancy)); err != nil {
return err
}

// only allow windows and linux binaries
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above

if err := envs.SetCNIDatapathMode(viper.GetString(c.FlagMode)); err != nil {
return err
}

envs.SetExempt(strings.Split(strings.Replace(strings.ToLower(viper.GetString(c.FlagExempt)), " ", "", -1), ","))

envs.SrcDir = fmt.Sprintf("%s%s/%s/", c.DefaultSrcDirLinux, envs.OSType, envs.CNITenancy)
envs.DstBinDir = viper.GetString(c.FlagBinDirectory)
envs.DstConflistDir = viper.GetString(c.FlagConflistDirectory)
envs.IPAMType = viper.GetString(c.FlagIPAM)

return i.InstallLocal(envs)
},
}

cmd.Flags().String(c.FlagMode, c.Defaults[c.FlagMode], fmt.Sprintf("Datapath mode for Azure CNI, options are %s and %s", c.Transparent, c.Bridge))
cmd.Flags().String(c.FlagTarget, c.Defaults[c.FlagTarget], fmt.Sprintf("Location to install Azure CNI, options are %s and %s", c.Local, c.Cluster))
cmd.Flags().String(c.FlagIPAM, c.Defaults[c.FlagIPAM], fmt.Sprintf("Specify which IPAM source to use, options are %s and %s", c.AzureVNETIPAM, c.AzureCNSIPAM))
cmd.Flags().String(c.FlagOS, c.Defaults[c.FlagOS], fmt.Sprintf("Specify which operating system to install, options are %s and %s", c.Linux, c.Windows))
cmd.Flags().String(c.FlagTenancy, c.Defaults[c.FlagTenancy], fmt.Sprintf("Tenancy option for Azure CNI, options are %s and %s", c.Singletenancy, c.Multitenancy))
cmd.Flags().String(c.FlagBinDirectory, c.Defaults[c.FlagBinDirectory], "Destination where Azure CNI binaries will be installed")
cmd.Flags().String(c.FlagConflistDirectory, c.Defaults[c.FlagConflistDirectory], "Destination where Azure CNI conflists will be installed")
cmd.Flags().String(c.FlagExempt, c.Defaults[c.FlagExempt], "Exempt files that won't be installed")

return cmd
}
50 changes: 50 additions & 0 deletions acncli/cmd/logs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package cmd

import (
"fmt"

c "github.com/Azure/azure-container-networking/acncli/api"
"github.com/nxadm/tail"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

// LogsCmd will write the logs of the Azure CNI logs
func LogsCmd() *cobra.Command {
var cmd = &cobra.Command{
Use: "logs",
Short: "Fetches the logs of an ACN component",
Long: "The logs command is used to fetch and/or watch the logs of an ACN component",
}
cmd.AddCommand(LogsCNICmd())
return cmd
}

func LogsCNICmd() *cobra.Command {
var cmd = &cobra.Command{
Use: "cni",
Short: fmt.Sprintf("Retrieves the logs of %s binary", c.AzureCNIBin),
RunE: func(cmd *cobra.Command, args []string) error {
fmt.Printf("📃 - started watching %s\n", viper.GetString(c.FlagLogFilePath))

// this loop exists for when the logfile gets rotated, and tail loses the original file
for {
t, err := tail.TailFile(viper.GetString(c.FlagLogFilePath), tail.Config{Follow: viper.GetBool(c.FlagFollow), ReOpen: true})

if err != nil {
return err
}
for line := range t.Lines {
fmt.Println(line.Text)
}
if viper.GetBool(c.FlagFollow) == false {
return nil
}
}
}}

cmd.Flags().BoolP(c.FlagFollow, "f", c.DefaultToggles[c.FlagFollow], fmt.Sprintf("Follow the log file, similar to 'tail -f'"))
cmd.Flags().String(c.FlagLogFilePath, c.Defaults[c.FlagLogFilePath], fmt.Sprintf("Path of the Azure CNI log file"))

return cmd
}
27 changes: 27 additions & 0 deletions acncli/cmd/manager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package cmd

import (
"github.com/spf13/cobra"
)

// ManagerCmd starts the manager mode, which installs CNI+Conflists, then watches logs
func ManagerCmd() *cobra.Command {
var cmd = &cobra.Command{
Use: "manager",
Short: "Starts the ACN CNI manager, which installs CNI, sets up conflists, then starts watching logs",
RunE: func(cmd *cobra.Command, args []string) error {
err := InstallCNICmd().RunE(cmd, args)
if err != nil {
return err
}

err = LogsCNICmd().RunE(cmd, args)
return err
},
}

cmd.Flags().AddFlagSet(InstallCNICmd().Flags())
cmd.Flags().AddFlagSet(LogsCNICmd().Flags())

return cmd
}
Loading