cns/cmd/cli/cli.go (86 lines of code) (raw):
package cli
import (
"context"
"fmt"
"os"
"sort"
"strings"
"github.com/Azure/azure-container-networking/cns"
"github.com/Azure/azure-container-networking/cns/client"
"github.com/Azure/azure-container-networking/cns/types"
)
const (
envCNSIPAddress = "CNSIpAddress"
envCNSPort = "CNSPort"
getCmdArg = "get"
getInMemoryData = "getInMemory"
getPodCmdArg = "getPodContexts"
)
func HandleCNSClientCommands(ctx context.Context, cmd string, arg string) error {
cnsIPAddress := os.Getenv(envCNSIPAddress)
cnsPort := os.Getenv(envCNSPort)
cnsClient, err := client.New("http://"+cnsIPAddress+":"+cnsPort, client.DefaultTimeout)
if err != nil {
return err
}
switch {
case strings.EqualFold(getCmdArg, cmd):
return getCmd(ctx, cnsClient, arg)
case strings.EqualFold(getPodCmdArg, cmd):
return getPodCmd(ctx, cnsClient)
case strings.EqualFold(getInMemoryData, cmd):
return getInMemory(ctx, cnsClient)
default:
return fmt.Errorf("No debug cmd supplied, options are: %v", getCmdArg)
}
}
func getCmd(ctx context.Context, client *client.Client, arg string) error {
var states []types.IPState
switch types.IPState(arg) {
case types.Available:
states = append(states, types.Available)
case types.Assigned:
states = append(states, types.Assigned)
case types.PendingProgramming:
states = append(states, types.PendingProgramming)
case types.PendingRelease:
states = append(states, types.PendingRelease)
default:
states = append(states, types.Assigned, types.Available, types.PendingProgramming, types.PendingRelease)
}
addr, err := client.GetIPAddressesMatchingStates(ctx, states...)
if err != nil {
return err
}
printIPAddresses(addr)
return nil
}
// Sort the addresses based on IP, then write to stdout
func printIPAddresses(addrSlice []cns.IPConfigurationStatus) {
sort.Slice(addrSlice, func(i, j int) bool {
return addrSlice[i].IPAddress < addrSlice[j].IPAddress
})
for _, addr := range addrSlice {
fmt.Println(addr.String())
}
}
func getPodCmd(ctx context.Context, client *client.Client) error {
resp, err := client.GetPodOrchestratorContext(ctx)
if err != nil {
return err
}
i := 1
for orchContext, podID := range resp {
fmt.Printf("%d %s : %s\n", i, orchContext, podID)
i++
}
return nil
}
func getInMemory(ctx context.Context, client *client.Client) error {
data, err := client.GetHTTPServiceData(ctx)
if err != nil {
return err
}
fmt.Printf("PodIPIDByOrchestratorContext: %v\nPodIPConfigState: %v\n",
data.HTTPRestServiceData.PodIPIDByPodInterfaceKey, data.HTTPRestServiceData.PodIPConfigState)
return nil
}