Documentation
¶
Index ¶
- Constants
- Variables
- func AWSErrorCode(err error) string
- func AWSErrorMessage(err error) string
- func FindASGTag(tags []*autoscaling.TagDescription, key string) (string, bool)
- func FindAutoscalingGroups(c AWSCloud, tags map[string]string) ([]*autoscaling.Group, error)
- func FindEC2Tag(tags []*ec2.Tag, key string) (string, bool)
- func FindELBTag(tags []*elb.Tag, key string) (string, bool)
- func FindRegion(cluster *kops.Cluster) (string, error)
- func NewEC2Filter(name string, values ...string) *ec2.Filter
- func ValidateRegion(region string) error
- func ValidateZones(zones []string, cloud AWSCloud) error
- type AWSAPITarget
- func (t *AWSAPITarget) AddAWSTags(id string, expected map[string]string) error
- func (t *AWSAPITarget) AddELBTags(loadBalancerName string, expected map[string]string) error
- func (t *AWSAPITarget) DeleteTags(id string, tags map[string]string) error
- func (t *AWSAPITarget) Finish(taskMap map[string]fi.Task) error
- func (t *AWSAPITarget) ProcessDeletions() bool
- func (t *AWSAPITarget) WaitForInstanceRunning(instanceID string) error
- type AWSCloud
- type AWSMachineTypeInfo
- type EphemeralDevice
- type LoggingRetryer
- type MockAWSCloud
- func (c *MockAWSCloud) AddAWSTags(id string, expected map[string]string) error
- func (c *MockAWSCloud) AddTags(name *string, tags map[string]string)
- func (c *MockAWSCloud) Autoscaling() autoscalingiface.AutoScalingAPI
- func (c *MockAWSCloud) BuildFilters(name *string) []*ec2.Filter
- func (c *MockAWSCloud) BuildTags(name *string) map[string]string
- func (c *MockAWSCloud) CloudFormation() *cloudformation.CloudFormation
- func (c *MockAWSCloud) CreateELBTags(loadBalancerName string, tags map[string]string) error
- func (c *MockAWSCloud) CreateTags(resourceId string, tags map[string]string) error
- func (c *MockAWSCloud) DefaultInstanceType(cluster *kops.Cluster, ig *kops.InstanceGroup) (string, error)
- func (c *MockAWSCloud) DeleteGroup(g *cloudinstances.CloudInstanceGroup) error
- func (c *MockAWSCloud) DeleteInstance(i *cloudinstances.CloudInstanceGroupMember) error
- func (c *MockAWSCloud) DeleteTags(id string, tags map[string]string) error
- func (c *MockAWSCloud) DescribeAvailabilityZones() ([]*ec2.AvailabilityZone, error)
- func (c *MockAWSCloud) DescribeInstance(instanceID string) (*ec2.Instance, error)
- func (c *MockAWSCloud) DescribeVPC(vpcID string) (*ec2.Vpc, error)
- func (c *MockAWSCloud) EC2() ec2iface.EC2API
- func (c *MockAWSCloud) ELB() *elb.ELB
- func (c *MockAWSCloud) FindClusterStatus(cluster *kops.Cluster) (*kops.ClusterStatus, error)
- func (c *MockAWSCloud) FindVPCInfo(id string) (*fi.VPCInfo, error)
- func (c *MockAWSCloud) GetCloudGroups(cluster *kops.Cluster, instancegroups []*kops.InstanceGroup, ...) (map[string]*cloudinstances.CloudInstanceGroup, error)
- func (c *MockAWSCloud) GetELBTags(loadBalancerName string) (map[string]string, error)
- func (c *MockAWSCloud) GetTags(resourceID string) (map[string]string, error)
- func (c *MockAWSCloud) IAM() *iam.IAM
- func (c *MockAWSCloud) Region() string
- func (c *MockAWSCloud) ResolveImage(name string) (*ec2.Image, error)
- func (c *MockAWSCloud) Route53() route53iface.Route53API
- func (c *MockAWSCloud) Tags() map[string]string
- func (c *MockAWSCloud) WithTags(tags map[string]string) AWSCloud
- type MockCloud
- type RegionDelayers
- type RequestLogger
Constants ¶
const ( WellKnownAccountKopeio = "383156758163" WellKnownAccountRedhat = "309956199498" WellKnownAccountCoreOS = "595879546273" )
const BurstableCreditsToECUS float32 = 3.0 / 60.0
I believe one vCPU ~ 3 ECUS, and 60 CPU credits would be needed to use one vCPU for an hour
const ClientMaxRetries = 13
By default, aws-sdk-go only retries 3 times, which doesn't give much time for exponential backoff to work for serious issues. At 13 retries, we'll try a given request for up to ~6m with exponential backoff along the way.
const CreateTagsLogInterval = 10 // this is in "retry intervals"
const CreateTagsMaxAttempts = 120
const CreateTagsRetryInterval = 2 * time.Second
const DeleteTagsLogInterval = 10 // this is in "retry intervals"
const DeleteTagsMaxAttempts = 120
const DeleteTagsRetryInterval = 2 * time.Second
const DescribeTagsLogInterval = 10 // this is in "retry intervals"
const DescribeTagsMaxAttempts = 120
const DescribeTagsRetryInterval = 2 * time.Second
const TagClusterName = "KubernetesCluster"
const TagNameEtcdClusterPrefix = "k8s.io/etcd/"
const TagNameRolePrefix = "k8s.io/role/"
const TagRoleMaster = "master"
Variables ¶
var MachineTypes []AWSMachineTypeInfo = []AWSMachineTypeInfo{ { Name: "t2.nano", MemoryGB: 0.5, ECU: 3 * BurstableCreditsToECUS, Cores: 1, EphemeralDisks: nil, Burstable: true, }, { Name: "t2.micro", MemoryGB: 1, ECU: 6 * BurstableCreditsToECUS, Cores: 1, EphemeralDisks: nil, Burstable: true, }, { Name: "t2.small", MemoryGB: 2, ECU: 12 * BurstableCreditsToECUS, Cores: 1, EphemeralDisks: nil, Burstable: true, }, { Name: "t2.medium", MemoryGB: 4, ECU: 24 * BurstableCreditsToECUS, Cores: 2, EphemeralDisks: nil, Burstable: true, }, { Name: "t2.large", MemoryGB: 8, ECU: 36 * BurstableCreditsToECUS, Cores: 2, EphemeralDisks: nil, Burstable: true, }, { Name: "t2.xlarge", MemoryGB: 16, ECU: 54 * BurstableCreditsToECUS, Cores: 4, EphemeralDisks: nil, Burstable: true, }, { Name: "t2.2xlarge", MemoryGB: 32, ECU: 81 * BurstableCreditsToECUS, Cores: 8, EphemeralDisks: nil, Burstable: true, }, { Name: "m3.medium", MemoryGB: 3.75, ECU: 3, Cores: 1, EphemeralDisks: []int{4}, }, { Name: "m3.large", MemoryGB: 7.5, ECU: 6.5, Cores: 2, EphemeralDisks: []int{32}, }, { Name: "m3.xlarge", MemoryGB: 15, ECU: 13, Cores: 4, EphemeralDisks: []int{40, 40}, }, { Name: "m3.2xlarge", MemoryGB: 30, ECU: 26, Cores: 8, EphemeralDisks: []int{80, 80}, }, { Name: "m4.large", MemoryGB: 8, ECU: 6.5, Cores: 2, EphemeralDisks: nil, }, { Name: "m4.xlarge", MemoryGB: 16, ECU: 13, Cores: 4, EphemeralDisks: nil, }, { Name: "m4.2xlarge", MemoryGB: 32, ECU: 26, Cores: 8, EphemeralDisks: nil, }, { Name: "m4.4xlarge", MemoryGB: 64, ECU: 53.5, Cores: 16, EphemeralDisks: nil, }, { Name: "m4.10xlarge", MemoryGB: 160, ECU: 124.5, Cores: 40, EphemeralDisks: nil, }, { Name: "m4.16xlarge", MemoryGB: 256, ECU: 188, Cores: 64, EphemeralDisks: nil, }, { Name: "c3.large", MemoryGB: 3.75, ECU: 7, Cores: 2, EphemeralDisks: []int{16, 16}, }, { Name: "c3.xlarge", MemoryGB: 7.5, ECU: 14, Cores: 4, EphemeralDisks: []int{40, 40}, }, { Name: "c3.2xlarge", MemoryGB: 15, ECU: 28, Cores: 8, EphemeralDisks: []int{80, 80}, }, { Name: "c3.4xlarge", MemoryGB: 30, ECU: 55, Cores: 16, EphemeralDisks: []int{160, 160}, }, { Name: "c3.8xlarge", MemoryGB: 60, ECU: 108, Cores: 32, EphemeralDisks: []int{320, 320}, }, { Name: "c4.large", MemoryGB: 3.75, ECU: 8, Cores: 2, EphemeralDisks: nil, }, { Name: "c4.xlarge", MemoryGB: 7.5, ECU: 16, Cores: 4, EphemeralDisks: nil, }, { Name: "c4.2xlarge", MemoryGB: 15, ECU: 31, Cores: 8, EphemeralDisks: nil, }, { Name: "c4.4xlarge", MemoryGB: 30, ECU: 62, Cores: 16, EphemeralDisks: nil, }, { Name: "c4.8xlarge", MemoryGB: 60, ECU: 132, Cores: 32, EphemeralDisks: nil, }, { Name: "cc2.8xlarge", MemoryGB: 60.5, ECU: 88, Cores: 32, EphemeralDisks: []int{840, 840, 840, 840}, }, { Name: "cg1.4xlarge", MemoryGB: 22.5, ECU: 33.5, Cores: 16, EphemeralDisks: []int{840, 840}, GPU: true, }, { Name: "cr1.8xlarge", MemoryGB: 244.0, ECU: 88, Cores: 32, EphemeralDisks: []int{120, 120}, }, { Name: "d2.xlarge", MemoryGB: 30.5, ECU: 14, Cores: 4, EphemeralDisks: []int{2000, 2000, 2000}, }, { Name: "d2.2xlarge", MemoryGB: 61.0, ECU: 28, Cores: 8, EphemeralDisks: []int{2000, 2000, 2000, 2000, 2000, 2000}, }, { Name: "d2.4xlarge", MemoryGB: 122.0, ECU: 56, Cores: 16, EphemeralDisks: []int{ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, }, }, { Name: "d2.8xlarge", MemoryGB: 244.0, ECU: 116, Cores: 36, EphemeralDisks: []int{ 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, }, }, { Name: "g2.2xlarge", MemoryGB: 15, ECU: 26, Cores: 8, EphemeralDisks: []int{60}, GPU: true, }, { Name: "g2.8xlarge", MemoryGB: 60, ECU: 104, Cores: 32, EphemeralDisks: []int{120, 120}, GPU: true, }, { Name: "hi1.4xlarge", MemoryGB: 60.5, ECU: 35, Cores: 16, EphemeralDisks: []int{1024, 1024}, }, { Name: "i2.xlarge", MemoryGB: 30.5, ECU: 14, Cores: 4, EphemeralDisks: []int{800}, }, { Name: "i2.2xlarge", MemoryGB: 61, ECU: 27, Cores: 8, EphemeralDisks: []int{800, 800}, }, { Name: "i2.4xlarge", MemoryGB: 122, ECU: 53, Cores: 16, EphemeralDisks: []int{800, 800, 800, 800}, }, { Name: "i2.8xlarge", MemoryGB: 244, ECU: 104, Cores: 32, EphemeralDisks: []int{800, 800, 800, 800, 800, 800, 800, 800}, }, { Name: "i3.large", MemoryGB: 15.25, ECU: 9, Cores: 2, EphemeralDisks: []int{475}, }, { Name: "i3.xlarge", MemoryGB: 30.5, ECU: 14, Cores: 4, EphemeralDisks: []int{950}, }, { Name: "i3.2xlarge", MemoryGB: 61, ECU: 27, Cores: 8, EphemeralDisks: []int{1900}, }, { Name: "i3.4xlarge", MemoryGB: 122, ECU: 53, Cores: 16, EphemeralDisks: []int{1900, 1900}, }, { Name: "i3.8xlarge", MemoryGB: 244, ECU: 104, Cores: 32, EphemeralDisks: []int{1900, 1900, 1900, 1900}, }, { Name: "i3.16xlarge", MemoryGB: 488, ECU: 208, Cores: 64, EphemeralDisks: []int{1900, 1900, 1900, 1900, 1900, 1900, 1900, 1900}, }, { Name: "r3.large", MemoryGB: 15.25, ECU: 6.5, Cores: 2, EphemeralDisks: []int{32}, }, { Name: "r3.xlarge", MemoryGB: 30.5, ECU: 13, Cores: 4, EphemeralDisks: []int{80}, }, { Name: "r3.2xlarge", MemoryGB: 61, ECU: 26, Cores: 8, EphemeralDisks: []int{160}, }, { Name: "r3.4xlarge", MemoryGB: 122, ECU: 52, Cores: 16, EphemeralDisks: []int{320}, }, { Name: "r3.8xlarge", MemoryGB: 244, ECU: 104, Cores: 32, EphemeralDisks: []int{320, 320}, }, { Name: "x1.32xlarge", MemoryGB: 1952, ECU: 349, Cores: 128, EphemeralDisks: []int{1920, 1920}, }, { Name: "r4.large", MemoryGB: 15.25, ECU: 7, Cores: 2, EphemeralDisks: nil, }, { Name: "r4.xlarge", MemoryGB: 30.5, ECU: 13.5, Cores: 4, EphemeralDisks: nil, }, { Name: "r4.2xlarge", MemoryGB: 61, ECU: 27, Cores: 8, EphemeralDisks: nil, }, { Name: "r4.4xlarge", MemoryGB: 122, ECU: 53, Cores: 16, EphemeralDisks: nil, }, { Name: "r4.8xlarge", MemoryGB: 244, ECU: 99, Cores: 32, EphemeralDisks: nil, }, { Name: "r4.16xlarge", MemoryGB: 488, ECU: 195, Cores: 64, EphemeralDisks: nil, }, { Name: "p2.xlarge", MemoryGB: 61, ECU: 12, Cores: 4, EphemeralDisks: nil, GPU: true, }, { Name: "p2.8xlarge", MemoryGB: 488, ECU: 94, Cores: 32, EphemeralDisks: nil, GPU: true, }, { Name: "p2.16xlarge", MemoryGB: 732, ECU: 188, Cores: 64, EphemeralDisks: nil, GPU: true, }, { Name: "p3.2xlarge", MemoryGB: 61, ECU: 23.5, Cores: 8, EphemeralDisks: nil, GPU: true, }, { Name: "p3.8xlarge", MemoryGB: 244, ECU: 94, Cores: 32, EphemeralDisks: nil, GPU: true, }, { Name: "p3.16xlarge", MemoryGB: 488, ECU: 188, Cores: 64, EphemeralDisks: nil, GPU: true, }, { Name: "g3.4xlarge", MemoryGB: 122, Cores: 16, ECU: 47, EphemeralDisks: nil, GPU: true, }, { Name: "g3.8xlarge", MemoryGB: 244, ECU: 94, Cores: 32, EphemeralDisks: nil, GPU: true, }, { Name: "g3.16xlarge", MemoryGB: 488, ECU: 188, Cores: 64, EphemeralDisks: nil, GPU: true, }, }
Functions ¶
func AWSErrorCode ¶
AWSErrorCode returns the aws error code, if it is an awserr.Error, otherwise ""
func AWSErrorMessage ¶
AWSErrorMessage returns the aws error message, if it is an awserr.Error, otherwise ""
func FindASGTag ¶
func FindASGTag(tags []*autoscaling.TagDescription, key string) (string, bool)
FindASGTag find the value of the tag with the specified key
func FindAutoscalingGroups ¶
FindAutoscalingGroups finds autoscaling groups matching the specified tags This isn't entirely trivial because autoscaling doesn't let us filter with as much precision as we would like
func FindEC2Tag ¶
FindEC2Tag find the value of the tag with the specified key
func FindELBTag ¶
FindELBTag find the value of the tag with the specified key
func FindRegion ¶
FindRegion determines the region from the zones specified in the cluster
func ValidateRegion ¶
ValidateRegion checks that an AWS region name is valid
func ValidateZones ¶
ValidateZones checks that every zone in the sliced passed is recognized
Types ¶
type AWSAPITarget ¶
type AWSAPITarget struct {
Cloud AWSCloud
}
func NewAWSAPITarget ¶
func NewAWSAPITarget(cloud AWSCloud) *AWSAPITarget
func (*AWSAPITarget) AddAWSTags ¶
func (t *AWSAPITarget) AddAWSTags(id string, expected map[string]string) error
func (*AWSAPITarget) AddELBTags ¶
func (t *AWSAPITarget) AddELBTags(loadBalancerName string, expected map[string]string) error
func (*AWSAPITarget) DeleteTags ¶
func (t *AWSAPITarget) DeleteTags(id string, tags map[string]string) error
func (*AWSAPITarget) ProcessDeletions ¶
func (t *AWSAPITarget) ProcessDeletions() bool
func (*AWSAPITarget) WaitForInstanceRunning ¶
func (t *AWSAPITarget) WaitForInstanceRunning(instanceID string) error
type AWSCloud ¶
type AWSCloud interface { fi.Cloud Region() string CloudFormation() *cloudformation.CloudFormation EC2() ec2iface.EC2API IAM() *iam.IAM ELB() *elb.ELB Autoscaling() autoscalingiface.AutoScalingAPI Route53() route53iface.Route53API // TODO: Document and rationalize these tags/filters methods AddTags(name *string, tags map[string]string) BuildFilters(name *string) []*ec2.Filter BuildTags(name *string) map[string]string Tags() map[string]string // GetTags will fetch the tags for the specified resource, retrying (up to MaxDescribeTagsAttempts) if it hits an eventual-consistency type error GetTags(resourceId string) (map[string]string, error) // CreateTags will add tags to the specified resource, retrying up to MaxCreateTagsAttempts times if it hits an eventual-consistency type error CreateTags(resourceId string, tags map[string]string) error AddAWSTags(id string, expected map[string]string) error GetELBTags(loadBalancerName string) (map[string]string, error) // CreateELBTags will add tags to the specified loadBalancer, retrying up to MaxCreateTagsAttempts times if it hits an eventual-consistency type error CreateELBTags(loadBalancerName string, tags map[string]string) error // DeleteTags will delete tags from the specified resource, retrying up to MaxCreateTagsAttempts times if it hits an eventual-consistency type error DeleteTags(id string, tags map[string]string) error // DescribeInstance is a helper that queries for the specified instance by id DescribeInstance(instanceID string) (*ec2.Instance, error) // DescribeVPC is a helper that queries for the specified vpc by id DescribeVPC(vpcID string) (*ec2.Vpc, error) DescribeAvailabilityZones() ([]*ec2.AvailabilityZone, error) // ResolveImage finds an AMI image based on the given name. // The name can be one of: // `ami-...` in which case it is presumed to be an id // owner/name in which case we find the image with the specified name, owned by owner // name in which case we find the image with the specified name, with the current owner ResolveImage(name string) (*ec2.Image, error) // WithTags created a copy of AWSCloud with the specified default-tags bound WithTags(tags map[string]string) AWSCloud // DefaultInstanceType determines a suitable instance type for the specified instance group DefaultInstanceType(cluster *kops.Cluster, ig *kops.InstanceGroup) (string, error) // FindClusterStatus gets the status of the cluster as it exists in AWS, inferred from volumes FindClusterStatus(cluster *kops.Cluster) (*kops.ClusterStatus, error) }
type AWSMachineTypeInfo ¶
type AWSMachineTypeInfo struct { Name string MemoryGB float32 ECU float32 Cores int EphemeralDisks []int Burstable bool GPU bool }
func GetMachineTypeInfo ¶
func GetMachineTypeInfo(machineType string) (*AWSMachineTypeInfo, error)
func (*AWSMachineTypeInfo) EphemeralDevices ¶
func (m *AWSMachineTypeInfo) EphemeralDevices() []*EphemeralDevice
type EphemeralDevice ¶
type LoggingRetryer ¶
type LoggingRetryer struct {
client.DefaultRetryer
}
LoggingRetryer adds some logging when we are retrying, so we have some idea what is happening Right now it is very basic - e.g. it only logs when we retry (so doesn't log when we fail due to too many retries)
func (LoggingRetryer) RetryRules ¶
func (l LoggingRetryer) RetryRules(r *request.Request) time.Duration
type MockAWSCloud ¶
type MockAWSCloud struct { MockCloud // contains filtered or unexported fields }
func BuildMockAWSCloud ¶
func BuildMockAWSCloud(region string, zoneLetters string) *MockAWSCloud
func InstallMockAWSCloud ¶
func InstallMockAWSCloud(region string, zoneLetters string) *MockAWSCloud
func (*MockAWSCloud) AddAWSTags ¶
func (c *MockAWSCloud) AddAWSTags(id string, expected map[string]string) error
func (*MockAWSCloud) Autoscaling ¶
func (c *MockAWSCloud) Autoscaling() autoscalingiface.AutoScalingAPI
func (*MockAWSCloud) BuildFilters ¶
func (c *MockAWSCloud) BuildFilters(name *string) []*ec2.Filter
func (*MockAWSCloud) CloudFormation ¶
func (c *MockAWSCloud) CloudFormation() *cloudformation.CloudFormation
func (*MockAWSCloud) CreateELBTags ¶
func (c *MockAWSCloud) CreateELBTags(loadBalancerName string, tags map[string]string) error
func (*MockAWSCloud) CreateTags ¶
func (c *MockAWSCloud) CreateTags(resourceId string, tags map[string]string) error
func (*MockAWSCloud) DefaultInstanceType ¶
func (c *MockAWSCloud) DefaultInstanceType(cluster *kops.Cluster, ig *kops.InstanceGroup) (string, error)
DefaultInstanceType determines an instance type for the specified cluster & instance group
func (*MockAWSCloud) DeleteGroup ¶
func (c *MockAWSCloud) DeleteGroup(g *cloudinstances.CloudInstanceGroup) error
func (*MockAWSCloud) DeleteInstance ¶
func (c *MockAWSCloud) DeleteInstance(i *cloudinstances.CloudInstanceGroupMember) error
func (*MockAWSCloud) DeleteTags ¶
func (c *MockAWSCloud) DeleteTags(id string, tags map[string]string) error
func (*MockAWSCloud) DescribeAvailabilityZones ¶
func (c *MockAWSCloud) DescribeAvailabilityZones() ([]*ec2.AvailabilityZone, error)
func (*MockAWSCloud) DescribeInstance ¶
func (c *MockAWSCloud) DescribeInstance(instanceID string) (*ec2.Instance, error)
func (*MockAWSCloud) DescribeVPC ¶
func (c *MockAWSCloud) DescribeVPC(vpcID string) (*ec2.Vpc, error)
func (*MockAWSCloud) EC2 ¶
func (c *MockAWSCloud) EC2() ec2iface.EC2API
func (*MockAWSCloud) ELB ¶
func (c *MockAWSCloud) ELB() *elb.ELB
func (*MockAWSCloud) FindClusterStatus ¶
func (c *MockAWSCloud) FindClusterStatus(cluster *kops.Cluster) (*kops.ClusterStatus, error)
FindEtcdStatus discovers the status of the cluster, by looking for the tagged etcd volumes
func (*MockAWSCloud) FindVPCInfo ¶
func (c *MockAWSCloud) FindVPCInfo(id string) (*fi.VPCInfo, error)
func (*MockAWSCloud) GetCloudGroups ¶
func (c *MockAWSCloud) GetCloudGroups(cluster *kops.Cluster, instancegroups []*kops.InstanceGroup, warnUnmatched bool, nodes []v1.Node) (map[string]*cloudinstances.CloudInstanceGroup, error)
func (*MockAWSCloud) GetELBTags ¶
func (c *MockAWSCloud) GetELBTags(loadBalancerName string) (map[string]string, error)
func (*MockAWSCloud) GetTags ¶
func (c *MockAWSCloud) GetTags(resourceID string) (map[string]string, error)
func (*MockAWSCloud) IAM ¶
func (c *MockAWSCloud) IAM() *iam.IAM
func (*MockAWSCloud) Region ¶
func (c *MockAWSCloud) Region() string
func (*MockAWSCloud) ResolveImage ¶
func (c *MockAWSCloud) ResolveImage(name string) (*ec2.Image, error)
func (*MockAWSCloud) Route53 ¶
func (c *MockAWSCloud) Route53() route53iface.Route53API
func (*MockAWSCloud) Tags ¶
func (c *MockAWSCloud) Tags() map[string]string
type MockCloud ¶
type MockCloud struct { MockAutoscaling autoscalingiface.AutoScalingAPI MockCloudFormation *cloudformation.CloudFormation MockEC2 ec2iface.EC2API MockRoute53 route53iface.Route53API }
func (*MockCloud) ProviderID ¶
func (c *MockCloud) ProviderID() kops.CloudProviderID
type RegionDelayers ¶
type RegionDelayers struct {
// contains filtered or unexported fields
}
type RequestLogger ¶
type RequestLogger struct {
// contains filtered or unexported fields
}
RequestLogger logs every AWS request