pkg/vpc/vpc.go (96 lines of code) (raw):
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package vpc
import (
"errors"
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
"github.com/aws/amazon-vpc-cni-k8s/pkg/utils/logger"
)
type NetworkCard struct {
// max number of interfaces supported per card
MaximumNetworkInterfaces int64
// the index of current card
NetworkCardIndex int64
NetworkPerformance string
}
// InstanceTypeLimits keeps track of limits for an instance type
type InstanceTypeLimits struct {
ENILimit int
IPv4Limit int
DefaultNetworkCardIndex int
NetworkCards []NetworkCard
HypervisorType string
IsBareMetal bool
}
var ErrInstanceTypeNotExist = errors.New("instance type does not exist")
var ErrNoInfo = errors.New("no info on instance type due to not being publicly available")
var log = logger.Get()
func New(eniLimit int, ipv4Limit int, defaultNetworkCardIndex int, networkCards []NetworkCard,
hypervisorType string, isBareMetalInstance bool) InstanceTypeLimits {
return InstanceTypeLimits{
ENILimit: eniLimit,
IPv4Limit: ipv4Limit,
NetworkCards: networkCards,
HypervisorType: hypervisorType,
IsBareMetal: isBareMetalInstance,
DefaultNetworkCardIndex: defaultNetworkCardIndex,
}
}
func GetENILimit(instanceType string) (int, error) {
instance, ok := GetInstance(instanceType)
if !ok {
log.Errorf("%s: %s", instanceType, ErrInstanceTypeNotExist)
return -1, ErrInstanceTypeNotExist
}
return instance.ENILimit, nil
}
func GetIPv4Limit(instanceType string) (int, error) {
instance, ok := GetInstance(instanceType)
if !ok {
log.Errorf("%s: %s", instanceType, ErrInstanceTypeNotExist)
return -1, ErrInstanceTypeNotExist
}
return instance.IPv4Limit, nil
}
func GetDefaultNetworkCardIndex(instanceType string) (int, error) {
instance, ok := GetInstance(instanceType)
if !ok {
log.Errorf("%s: %s", instanceType, ErrInstanceTypeNotExist)
return -1, ErrInstanceTypeNotExist
}
return instance.DefaultNetworkCardIndex, nil
}
func GetHypervisorType(instanceType string) (string, error) {
instance, ok := GetInstance(instanceType)
if !ok {
log.Errorf("%s: %s", instanceType, ErrInstanceTypeNotExist)
return "", ErrInstanceTypeNotExist
}
return string(instance.HypervisorType), nil
}
func GetIsBareMetal(instanceType string) (bool, error) {
instance, ok := GetInstance(instanceType)
if !ok {
log.Errorf("%s: %s", instanceType, ErrInstanceTypeNotExist)
return false, ErrInstanceTypeNotExist
}
return instance.IsBareMetal, nil
}
func GetNetworkCards(instanceType string) ([]NetworkCard, error) {
instance, ok := GetInstance(instanceType)
if !ok {
log.Errorf("%s: %s", instanceType, ErrInstanceTypeNotExist)
return nil, ErrInstanceTypeNotExist
}
if len(instance.NetworkCards) < 1 {
log.Errorf("%s: %s", instanceType, ErrNoInfo)
return nil, ErrNoInfo
}
return instance.NetworkCards, nil
}
func GetInstance(instanceType string) (InstanceTypeLimits, bool) {
instance, ok := instanceNetworkingLimits[instanceType]
if !ok {
return InstanceTypeLimits{}, ok
}
return instance, ok
}
func SetInstance(instanceType ec2types.InstanceType, eniLimit int, ipv4Limit int, defaultNetworkCardIndex int, networkCards []NetworkCard, hypervisorType ec2types.InstanceTypeHypervisor, isBareMetalInstance bool) {
instanceNetworkingLimits[string(instanceType)] = New(eniLimit, ipv4Limit, defaultNetworkCardIndex, networkCards,
string(hypervisorType), isBareMetalInstance)
}