From 9d8cc1f2f6293f09627710708181e549a25d557f Mon Sep 17 00:00:00 2001 From: Trekkie Coder Date: Tue, 28 May 2024 10:31:35 +0900 Subject: [PATCH] gh-681: use cloudCIDR block as command-line argument --- options/options.go | 1 + pkg/loxinet/loxinet.go | 10 ++++++++-- pkg/loxinet/utils_aws.go | 35 +++++++++++++++++++++++++++++------ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/options/options.go b/options/options.go index 8c80a9f5..ec2afe96 100644 --- a/options/options.go +++ b/options/options.go @@ -34,4 +34,5 @@ var Opts struct { FallBack bool `long:"fallback" description:"Fallback to system default networking(experimental)"` LocalVIP bool `long:"localvip" description:"support vip availability from lb node(experimental)"` Cloud string `long:"cloud" description:"cloud type if any e.g aws,ncloud" default:"on-prem"` + CloudCIDRBlock string `long:"cloudcidrblock" description:"cloud implementations need VIP cidr blocks(experimental)"` } diff --git a/pkg/loxinet/loxinet.go b/pkg/loxinet/loxinet.go index 52efb735..a47f18f5 100644 --- a/pkg/loxinet/loxinet.go +++ b/pkg/loxinet/loxinet.go @@ -222,9 +222,15 @@ func loxiNetInit() { signal.Notify(mh.sigCh, os.Interrupt, syscall.SIGCHLD, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM) if mh.cloudLabel == "aws" { - AWSApiInit() + err := AWSApiInit(opts.Opts.CloudCIDRBlock) + if err != nil { + os.Exit(1) + } } else if mh.cloudLabel == "ncloud" { - NcloudApiInit() + err := NcloudApiInit() + if err != nil { + os.Exit(1) + } } // Check if profiling is enabled diff --git a/pkg/loxinet/utils_aws.go b/pkg/loxinet/utils_aws.go index 442deb74..ae3bea15 100644 --- a/pkg/loxinet/utils_aws.go +++ b/pkg/loxinet/utils_aws.go @@ -36,6 +36,8 @@ var ( vpcID string instanceID string azName string + awsCIDRnet *net.IPNet + loxiEniID string ) func AWSGetInstanceIDInfo() (string, error) { @@ -105,6 +107,10 @@ func AWSGetInstanceAvailabilityZone() (string, error) { } func AWSPrepVIPNetwork() error { + if awsCIDRnet == nil { + return nil + } + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Second*2)) defer cancel() @@ -158,7 +164,7 @@ func AWSPrepVIPNetwork() error { } } - cidrBlock := "123.123.123.0/28" + cidrBlock := awsCIDRnet.String() loxilbSubNetKey := "loxiType" loxilbSubNetKeyVal := "loxilb-subnet" subnetTag := types.Tag{Key: &loxilbSubNetKey, Value: &loxilbSubNetKeyVal} @@ -193,6 +199,8 @@ func AWSPrepVIPNetwork() error { return nil } + loxiEniID = *intfOutput.NetworkInterface.NetworkInterfaceId + tk.LogIt(tk.LogInfo, "Created interface (%s) for loxilb instance %v\n", *intfOutput.NetworkInterface.NetworkInterfaceId, vpcID) devIdx := int32(1) @@ -294,10 +302,16 @@ func AWSUpdatePrivateIP(vIP net.IP, add bool) error { return err } - niID, err := AWSGetNetworkInterface(instanceID, vIP) - if err != nil { - tk.LogIt(tk.LogError, "AWS get network interface failed: %v\n", err) - return err + niID := "" + + if awsCIDRnet == nil || loxiEniID == "" { + niID, err = AWSGetNetworkInterface(instanceID, vIP) + if err != nil { + tk.LogIt(tk.LogError, "AWS get network interface failed: %v\n", err) + return err + } + } else { + niID = loxiEniID } if !add { @@ -307,7 +321,8 @@ func AWSUpdatePrivateIP(vIP net.IP, add bool) error { return AWSCreatePrivateIp(niID, vIP) } -func AWSApiInit() error { +func AWSApiInit(cloudCIDRBlock string) error { + // Using the SDK's default configuration, loading additional config // and credentials values from the environment variables, shared // credentials, and shared configuration files @@ -316,6 +331,14 @@ func AWSApiInit() error { return err } + if cloudCIDRBlock != "" { + _, awsCIDRnet, err = net.ParseCIDR(cloudCIDRBlock) + if err != nil { + tk.LogIt(tk.LogError, "failed to parse cloud cidr block %s\n", cloudCIDRBlock) + return err + } + } + // Using the Config value, create the DynamoDB client imdsClient = imds.NewFromConfig(cfg) ec2Client = ec2.NewFromConfig(cfg)