Skip to content

Commit

Permalink
Consolidate ec2 client create call
Browse files Browse the repository at this point in the history
Signed-off-by: Vlad Ungureanu <vladu@palantir.com>
  • Loading branch information
ungureanuvladvictor authored and errordeveloper committed Nov 27, 2020
1 parent 816b323 commit 9dc8130
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 47 deletions.
31 changes: 31 additions & 0 deletions pkg/aws/ec2/ec2.go
Original file line number Diff line number Diff line change
Expand Up @@ -542,3 +542,34 @@ func (c *Client) GetSecurityGroups(ctx context.Context) (types.SecurityGroupMap,

return securityGroups, nil
}

// GetInstanceTypes returns all the known EC2 instance types in the configured region
func (c *Client) GetInstanceTypes(ctx context.Context) ([]ec2.InstanceTypeInfo, error) {
c.limiter.Limit(ctx, "DescribeInstanceTypes")
sinceStart := spanstat.Start()
instanceTypeInfos := []ec2.InstanceTypeInfo{}
describeInstanceTypes := &ec2.DescribeInstanceTypesInput{}
req := c.ec2Client.DescribeInstanceTypesRequest(describeInstanceTypes)
describeInstanceTypesResponse, err := req.Send(ctx)
c.metricsAPI.ObserveAPICall("DescribeInstanceTypes", deriveStatus(req.Request, err), sinceStart.Seconds())
if err != nil {
return instanceTypeInfos, err
}

instanceTypeInfos = append(instanceTypeInfos, describeInstanceTypesResponse.InstanceTypes...)

for describeInstanceTypesResponse.NextToken != nil {
describeInstanceTypes := &ec2.DescribeInstanceTypesInput{
NextToken: describeInstanceTypesResponse.NextToken,
}
req = c.ec2Client.DescribeInstanceTypesRequest(describeInstanceTypes)
describeInstanceTypesResponse, err = req.Send(ctx)
if err != nil {
return instanceTypeInfos, err
}

instanceTypeInfos = append(instanceTypeInfos, describeInstanceTypesResponse.InstanceTypes...)
}

return instanceTypeInfos, nil
}
29 changes: 2 additions & 27 deletions pkg/aws/eni/limits/limits.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import (
"github.com/cilium/cilium/pkg/lock"

"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/ec2"
)

// limit contains limits for adapter count and addresses. The mappings will be
Expand Down Expand Up @@ -344,35 +343,11 @@ func UpdateFromUserDefinedMappings(m map[string]string) (err error) {

// UpdateFromEC2API updates limits from the EC2 API via calling
// https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstanceTypes.html.
func UpdateFromEC2API(ctx context.Context) error {
cfg, err := ec2shim.NewConfig()
func UpdateFromEC2API(ctx context.Context, ec2Client *ec2shim.Client) error {
instanceTypeInfos, err := ec2Client.GetInstanceTypes(ctx)
if err != nil {
return err
}
ec2Client := ec2.New(cfg)

instanceTypeInfos := []ec2.InstanceTypeInfo{}
describeInstanceTypes := &ec2.DescribeInstanceTypesInput{}
req := ec2Client.DescribeInstanceTypesRequest(describeInstanceTypes)
describeInstanceTypesResponse, err := req.Send(ctx)
if err != nil {
return err
}

instanceTypeInfos = append(instanceTypeInfos, describeInstanceTypesResponse.InstanceTypes...)

for describeInstanceTypesResponse.NextToken != nil {
describeInstanceTypes := &ec2.DescribeInstanceTypesInput{
NextToken: describeInstanceTypesResponse.NextToken,
}
req = ec2Client.DescribeInstanceTypesRequest(describeInstanceTypes)
describeInstanceTypesResponse, err = req.Send(ctx)
if err != nil {
return err
}

instanceTypeInfos = append(instanceTypeInfos, describeInstanceTypesResponse.InstanceTypes...)
}

limits.Lock()
defer limits.Unlock()
Expand Down
43 changes: 23 additions & 20 deletions pkg/ipam/allocator/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,32 @@ import (
var log = logging.DefaultLogger.WithField(logfields.LogSubsys, "ipam-allocator-aws")

// AllocatorAWS is an implementation of IPAM allocator interface for AWS ENI
type AllocatorAWS struct{}
type AllocatorAWS struct {
client *ec2shim.Client
}

// Init sets up ENI limits based on given options
func (*AllocatorAWS) Init() error {
func (a *AllocatorAWS) Init() error {
var aMetrics ec2shim.MetricsAPI

cfg, err := ec2shim.NewConfig()
if err != nil {
return err
}
subnetsFilters := ec2shim.NewSubnetsFilters(operatorOption.Config.IPAMSubnetsTags, operatorOption.Config.IPAMSubnetsIDs)

if operatorOption.Config.EnableMetrics {
aMetrics = apiMetrics.NewPrometheusMetrics(operatorMetrics.Namespace, "ec2", operatorMetrics.Registry)
} else {
aMetrics = &apiMetrics.NoOpMetrics{}
}
a.client = ec2shim.NewClient(ec2.New(cfg), aMetrics, operatorOption.Config.IPAMAPIQPSLimit, operatorOption.Config.IPAMAPIBurst, subnetsFilters)

if err := limits.UpdateFromUserDefinedMappings(operatorOption.Config.AWSInstanceLimitMapping); err != nil {
return fmt.Errorf("failed to parse aws-instance-limit-mapping: %w", err)
}
if operatorOption.Config.UpdateEC2AdapterLimitViaAPI {
if err := limits.UpdateFromEC2API(context.TODO()); err != nil {
if err := limits.UpdateFromEC2API(context.TODO(), a.client); err != nil {
return fmt.Errorf("unable to update instance type to adapter limits from EC2 API: %w", err)
}
}
Expand All @@ -54,31 +71,17 @@ func (*AllocatorAWS) Init() error {
// Start kicks of ENI allocation, the initial connection to AWS
// APIs is done in a blocking manner, given that is successful, a controller is
// started to manage allocation based on CiliumNode custom resources
func (*AllocatorAWS) Start(getterUpdater ipam.CiliumNodeGetterUpdater) (allocator.NodeEventHandler, error) {
var (
aMetrics ec2shim.MetricsAPI
iMetrics ipam.MetricsAPI
)
func (a *AllocatorAWS) Start(getterUpdater ipam.CiliumNodeGetterUpdater) (allocator.NodeEventHandler, error) {
var iMetrics ipam.MetricsAPI

log.Info("Starting ENI allocator...")

cfg, err := ec2shim.NewConfig()
if err != nil {
return nil, err
}

if operatorOption.Config.EnableMetrics {
aMetrics = apiMetrics.NewPrometheusMetrics(operatorMetrics.Namespace, "ec2", operatorMetrics.Registry)
iMetrics = ipamMetrics.NewPrometheusMetrics(operatorMetrics.Namespace, operatorMetrics.Registry)
} else {
aMetrics = &apiMetrics.NoOpMetrics{}
iMetrics = &ipamMetrics.NoOpMetrics{}
}

subnetsFilters := ec2shim.NewSubnetsFilters(operatorOption.Config.IPAMSubnetsTags, operatorOption.Config.IPAMSubnetsIDs)
ec2Client := ec2shim.NewClient(ec2.New(cfg), aMetrics, operatorOption.Config.IPAMAPIQPSLimit, operatorOption.Config.IPAMAPIBurst, subnetsFilters)
log.Info("Connected to EC2 service API")
instances := eni.NewInstancesManager(ec2Client, operatorOption.Config.ENITags)
instances := eni.NewInstancesManager(a.client, operatorOption.Config.ENITags)
nodeManager, err := ipam.NewNodeManager(instances, getterUpdater, iMetrics,
operatorOption.Config.ParallelAllocWorkers, operatorOption.Config.AWSReleaseExcessIPs)
if err != nil {
Expand Down

0 comments on commit 9dc8130

Please sign in to comment.