Documentation
¶
Overview ¶
Package ec2config defines EC2 configuration.
Index ¶
Constants ¶
const ( // AMITypeAL2ARM64 is the AMI type for Amazon Linux 2 AMI. // https://aws.amazon.com/ec2/graviton/ AMITypeAL2ARM64 = "AL2_arm_64" // AMITypeBottleRocketCPU is the AMI type for Bottlerocket OS. // https://github.com/bottlerocket-os/bottlerocket AMITypeBottleRocketCPU = "BOTTLEROCKET_x86_64" // AMITypeAL2X8664 is the AMI type for Amazon Linux 2 AMI. AMITypeAL2X8664 = "AL2_x86_64" // AMITypeAL2X8664GPU is the AMI type for Amazon Linux 2 AMI with GPU. AMITypeAL2X8664GPU = "AL2_x86_64_GPU" // DefaultNodeInstanceTypeCPUARM is the default EC2 instance type for CPU worker node. // https://aws.amazon.com/ec2/instance-types/m6/ DefaultNodeInstanceTypeCPUARM = "m6g.xlarge" // DefaultNodeInstanceTypeCPU is the default EC2 instance type for CPU worker node. DefaultNodeInstanceTypeCPU = "c5.xlarge" // DefaultNodeInstanceTypeGPU is the default EC2 instance type for GPU worker node. DefaultNodeInstanceTypeGPU = "p3.8xlarge" // DefaultNodeVolumeSize is the default EC2 instance volume size for a worker node. DefaultNodeVolumeSize = 40 // ASGsMaxLimit is the maximum number of "Managed Node Group"s per a EKS cluster. ASGsMaxLimit = 10 // ASGMaxLimit is the maximum number of nodes per a "Managed Node Group". ASGMaxLimit = 100 )
const AWS_K8S_TESTER_EC2_PREFIX = "AWS_K8S_TESTER_EC2_"
AWS_K8S_TESTER_EC2_PREFIX is the environment variable prefix used for "ec2config".
const StatusDELETEDORNOTEXIST = "DELETED/NOT-EXIST"
TODO: asg status
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ASG ¶ added in v0.6.9
type ASG struct {
// Name is the ASG name.
Name string `json:"name"`
ASGCFNStackID string `json:"asg-cfn-stack-id" read-only:"true"`
ASGCFNStackYAMLPath string `json:"asg-cfn-stack-yaml-path" read-only:"true"`
ASGCFNStackYAMLS3Key string `json:"asg-cfn-stack-yaml-s3-key" read-only:"true"`
TimeFrameCreate timeutil.TimeFrame `json:"time-frame-create" read-only:"true"`
TimeFrameDelete timeutil.TimeFrame `json:"time-frame-delete" read-only:"true"`
// RemoteAccessUserName is the user name used for running init scripts or SSH access.
RemoteAccessUserName string `json:"remote-access-user-name"`
// SSMDocumentCreate is true to auto-create and delete SSM document.
SSMDocumentCreate bool `json:"ssm-document-create"`
// SSMDocumentName is the name of SSM document.
SSMDocumentName string `json:"ssm-document-name"`
// SSMDocumentCFNStackName is the name of SSM document CFN stack.
SSMDocumentCFNStackName string `json:"ssm-document-cfn-stack-name"`
// SSMDocumentCommands is the commands for SSM document.
// Only used if SSM doc is created.
SSMDocumentCommands string `json:"ssm-document-commands"`
// SSMDocumentExecutionTimeoutSeconds is the SSM document execution timeout in seconds.
SSMDocumentExecutionTimeoutSeconds int `json:"ssm-document-execution-timeout-in-seconds"`
SSMDocumentCFNStackID string `json:"ssm-document-cfn-stack-id" read-only:"true"`
SSMDocumentCFNStackYAMLPath string `json:"ssm-document-cfn-stack-yaml-path" read-only:"true"`
SSMDocumentCFNStackYAMLS3Key string `json:"ssm-document-cfn-stack-yaml-s3-key" read-only:"true"`
SSMDocumentCommandIDs []string `json:"ssm-document-command-ids" read-only:"true"`
// AMIType is the AMI type for the node group.
// Allowed values are BOTTLEROCKET_x86_64, AL2_x86_64 and AL2_x86_64_GPU.
// ref. https://docs.aws.amazon.com/eks/latest/userguide/launch-workers.html
// ref. https://github.com/awslabs/amazon-eks-ami/blob/master/amazon-eks-nodegroup.yaml
AMIType string `json:"ami-type,omitempty"`
// ImageID is the Amazon Machine Image (AMI).
// This value overrides any AWS Systems Manager Parameter Store value.
// NOTE: THIS FIELD IS SET TO EMPTY IF "ImageIDSSMParameter" IS NOT EMPTY.
ImageID string `json:"image-id"`
// ImageIDSSMParameter is the AWS Systems Manager Parameter Store
// parameter of the AMI ID.
ImageIDSSMParameter string `json:"image-id-ssm-parameter"`
// InstanceTypes is the list of EC2 instance types.
InstanceTypes []string `json:"instance-types"`
// VolumeSize is the size of the default volume, in GiB.
//
// Constraints: 1-16384 for General Purpose SSD (gp2), 4-16384 for Provisioned
// IOPS SSD (io1), 500-16384 for Throughput Optimized HDD (st1), 500-16384 for
// Cold HDD (sc1), and 1-1024 for Magnetic (standard) volumes. If you specify
// a snapshot, the volume size must be equal to or larger than the snapshot
// size.
//
// Default: If you're creating the volume from a snapshot and don't specify
// a volume size, the default is the snapshot size.
VolumeSize int64 `json:"volume-size"`
// ASGMinSize is the minimum size of ASG.
ASGMinSize int64 `json:"asg-min-size,omitempty"`
// ASGMaxSize is the maximum size of ASG.
ASGMaxSize int64 `json:"asg-max-size,omitempty"`
// ASGDesiredCapacity is the desired capacity of ASG.
ASGDesiredCapacity int64 `json:"asg-desired-capacity,omitempty"`
// Instances is a map from instance ID to instance.
Instances map[string]Instance `json:"instanaces" read-only:"true"`
// Logs maps each instance ID to a list of log file paths fetched via SSH access.
Logs map[string][]string `json:"logs" read-only:"true"`
}
ASG represents one ASG.
type BlockDeviceMapping ¶
BlockDeviceMapping defines a block device mapping.
type CPUOptions ¶ added in v0.9.0
type CPUOptions struct {
// CoreCount is the number of CPU cores for the instance.
CoreCount int64 `json:"core-count"`
// ThreadsPerCore is the number of threads per CPU core.
ThreadsPerCore int64 `json:"threads-per-core"`
}
CPUOptions represents the CPU of an EC2 instance.
type Config ¶
type Config struct {
// Up is true if the cluster is up.
Up bool `json:"up"`
TimeFrameCreate timeutil.TimeFrame `json:"time-frame-create" read-only:"true"`
TimeFrameDelete timeutil.TimeFrame `json:"time-frame-delete" read-only:"true"`
// StatusCurrent represents the current status of the cluster.
StatusCurrent string `json:"status-current"`
// Status represents the status of the cluster.
Status []Status `json:"status"`
// Name is the cluster name.
// If empty, deployer auto-populates it.
Name string `json:"name"`
// Partition is the AWS partition for EC2 deployment region.
// If empty, set default partition "aws".
Partition string `json:"partition"`
// Region is the AWS geographic area for EC2 deployment.
// If empty, set default region.
Region string `json:"region"`
// ConfigPath is the configuration file path.
// Deployer is expected to update this file with latest status.
ConfigPath string `json:"config-path,omitempty"`
// AWSAccountID is the account ID of the eks tester caller session.
AWSAccountID string `json:"aws-account-id" read-only:"true"`
// AWSUserID is the user ID of the eks tester caller session.
AWSUserID string `json:"aws-user-id" read-only:"true"`
// AWSIAMRoleARN is the user IAM Role ARN of the eks tester caller session.
AWSIAMRoleARN string `json:"aws-iam-role-arn" read-only:"true"`
// AWSCredentialPath is automatically set via AWS SDK Go.
// And to be mounted as a volume as 'Secret' object.
AWSCredentialPath string `json:"aws-credential-path" read-only:"true"`
// LogColor is true to output logs in color.
LogColor bool `json:"log-color"`
// LogColorOverride is not empty to override "LogColor" setting.
// If not empty, the automatic color check is not even run and use this value instead.
// For instance, github action worker might not support color device,
// thus exiting color check with the exit code 1.
// Useful to output in color in HTML based log outputs (e.g., Prow).
// Useful to skip terminal color check when there is no color device (e.g., Github action worker).
LogColorOverride string `json:"log-color-override"`
// LogLevel configures log level. Only supports debug, info, warn, error, panic, or fatal. Default 'info'.
LogLevel string `json:"log-level"`
// LogOutputs is a list of log outputs. Valid values are 'default', 'stderr', 'stdout', or file names.
// Logs are appended to the existing file, if any.
// Multiple values are accepted. If empty, it sets to 'default', which outputs to stderr.
// See https://pkg.go.dev/go.uber.org/zap#Open and https://pkg.go.dev/go.uber.org/zap#Config for more details.
LogOutputs []string `json:"log-outputs,omitempty"`
// OnFailureDelete is true to delete all resources on creation fail.
OnFailureDelete bool `json:"on-failure-delete"`
// OnFailureDeleteWaitSeconds is the seconds to wait before deleting
// all resources on creation fail.
OnFailureDeleteWaitSeconds uint64 `json:"on-failure-delete-wait-seconds"`
// S3BucketCreate is true to auto-create S3 bucket.
S3BucketCreate bool `json:"s3-bucket-create"`
// S3BucketCreateKeep is true to not delete auto-created S3 bucket.
// The created S3 bucket is kept.
S3BucketCreateKeep bool `json:"s3-bucket-create-keep"`
// S3BucketName is the name of cluster S3.
S3BucketName string `json:"s3-bucket-name"`
// S3BucketLifecycleExpirationDays is expiration in days for the lifecycle of the object.
S3BucketLifecycleExpirationDays int64 `json:"s3-bucket-lifecycle-expiration-days"`
// S3Dir is the S3 directory to store all test results.
// It is under the bucket "eksconfig.Config.S3BucketName".
S3Dir string `json:"s3-dir"`
// RoleName is the name of cluster role.
RoleName string `json:"role-name"`
// RoleCreate is true to auto-create and delete cluster role.
RoleCreate bool `json:"role-create"`
// RoleARN is the role ARN that EC2 uses to create AWS resources for Kubernetes.
// By default, it's empty which triggers tester to create one.
RoleARN string `json:"role-arn"`
// RoleServicePrincipals is the EC2 Role Service Principals
RoleServicePrincipals []string `json:"role-service-principals"`
// RoleManagedPolicyARNs is EC2 Role managed policy ARNs.
RoleManagedPolicyARNs []string `json:"role-managed-policy-arns"`
RoleCFNStackID string `json:"role-cfn-stack-id" read-only:"true"`
RoleCFNStackYAMLPath string `json:"role-cfn-stack-yaml-path" read-only:"true"`
RoleCFNStackYAMLS3Key string `json:"role-cfn-stack-yaml-s3-key" read-only:"true"`
// VPCCreate is true to auto-create and delete VPC.
VPCCreate bool `json:"vpc-create"`
// VPCID is the VPC ID for cluster creation.
// If not empty, VPC is reused and not deleted.
// If empty, VPC is created anew and deleted on cluster deletion.
VPCID string `json:"vpc-id"`
VPCCFNStackID string `json:"vpc-cfn-stack-id" read-only:"true"`
VPCCFNStackYAMLPath string `json:"vpc-cfn-stack-yaml-path" read-only:"true"`
VPCCFNStackYAMLS3Key string `json:"vpc-cfn-stack-yaml-s3-key" read-only:"true"`
// SSHIngressIPv4Range is the IP range for SSH inbound traffic.
SSHIngressIPv4Range string `json:"ssh-ingress-ipv4-range"`
// VpcCIDR is the IP range (CIDR notation) for VPC, must be a valid private
// (RFC 1918) CIDR range.
VPCCIDR string `json:"vpc-cidr,omitempty"`
// PublicSubnetCIDR1 is the CIDR Block for subnet 1 within the VPC.
PublicSubnetCIDR1 string `json:"public-subnet-cidr-1,omitempty"`
// PublicSubnetCIDR2 is the CIDR Block for subnet 2 within the VPC.
PublicSubnetCIDR2 string `json:"public-subnet-cidr-2,omitempty"`
// PublicSubnetCIDR3 is the CIDR Block for subnet 3 within the VPC.
PublicSubnetCIDR3 string `json:"public-subnet-cidr-3,omitempty"`
// PrivateSubnetCIDR1 is the CIDR Block for subnet 1 within the VPC.
PrivateSubnetCIDR1 string `json:"private-subnet-cidr-1,omitempty"`
// PrivateSubnetCIDR2 is the CIDR Block for subnet 2 within the VPC.
PrivateSubnetCIDR2 string `json:"private-subnet-cidr-2,omitempty"`
// PublicSubnetIDs is the list of all public subnets in the VPC.
PublicSubnetIDs []string `json:"public-subnet-ids" read-only:"true"`
// PrivateSubnetIDs is the list of all private subnets in the VPC.
PrivateSubnetIDs []string `json:"private-subnet-ids" read-only:"true"`
// DHCPOptionsDomainName is used to complete unqualified DNS hostnames for VPC.
// ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html
// ref. https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html
DHCPOptionsDomainName string `json:"dhcp-options-domain-name"`
// DHCPOptionsDomainNameServers is a list of strings.
// The IPv4 addresses of up to four domain name servers, or AmazonProvidedDNS, for VPC.
// ref. https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html
// ref. https://docs.aws.amazon.com/eks/latest/userguide/cluster-endpoint.html
DHCPOptionsDomainNameServers []string `json:"dhcp-options-domain-name-servers"`
// SecurityGroupID is the security group ID for the VPC.
SecurityGroupID string `json:"security-group-id" read-only:"true"`
// RemoteAccessKeyCreate is true to create the remote SSH access private key.
RemoteAccessKeyCreate bool `json:"remote-access-key-create"`
// RemoteAccessKeyName is the remote SSH access private key name.
RemoteAccessKeyName string `json:"remote-access-key-name"`
// RemoteAccessPrivateKeyPath is the remote SSH access private key path.
RemoteAccessPrivateKeyPath string `json:"remote-access-private-key-path"`
// RemoteAccessCommandsOutputPath is the output path for ssh commands.
RemoteAccessCommandsOutputPath string `json:"remote-access-commands-output-path,omitempty"`
// ASGsFetchLogs is true to fetch logs from remote nodes using SSH.
ASGsFetchLogs bool `json:"asgs-fetch-logs"`
// ASGsLogsDir is set to specify the target directory to store all remote log files.
// If empty, it stores in the same directory as "ConfigPath".
ASGsLogsDir string `json:"asgs-logs-dir,omitempty"`
// ASGs is a map from each ASG name to EC2 ASG.
ASGs map[string]ASG `json:"asgs"`
// TotalNodes is the total number of nodes from all ASGs.
TotalNodes int64 `json:"total-nodes" read-only:"true"`
// contains filtered or unexported fields
}
Config defines EC2 configuration.
func Load ¶
Load loads configuration from YAML. Useful when injecting shared configuration via ConfigMap.
Example usage:
import "github.com/aws/aws-k8s-tester/eksconfig"
cfg := eksconfig.Load("test.yaml")
err := cfg.ValidateAndSetDefaults()
Do not set default values in this function. "ValidateAndSetDefaults" must be called separately, to prevent overwriting previous data when loaded from disks.
func NewDefault ¶
func NewDefault() *Config
NewDefault returns a default configuration.
- empty string creates a non-nil object for pointer-type field
- omitting an entire field returns nil value
- make sure to check both
func (*Config) RecordStatus ¶ added in v0.6.9
RecordStatus records cluster status.
func (*Config) SSHCommands ¶
SSHCommands returns the SSH commands.
func (*Config) UpdateFromEnvs ¶
UpdateFromEnvs updates fields from environmental variables. Empty values are ignored and do not overwrite fields with empty values. WARNING: The environmental variable value always overwrites current field values if there's a conflict.
func (*Config) ValidateAndSetDefaults ¶
ValidateAndSetDefaults returns an error for invalid configurations. And updates empty fields with default values. At the end, it writes populated YAML to aws-k8s-tester config path.
type EBS ¶
type EBS struct {
DeleteOnTermination bool `json:"delete-on-termination"`
Status string `json:"status"`
VolumeID string `json:"volume-id"`
}
EBS defines an EBS volume.
type IAMInstanceProfile ¶ added in v0.9.0
type IAMInstanceProfile struct {
// ARN is the Amazon Resource Name (ARN) of the instance profile.
ARN string `json:"arn"`
// ID is the ID of the instance profile.
ID string `json:"id"`
}
IAMInstanceProfile is the IAM instance profile.
type Instance ¶
type Instance struct {
Architecture string `json:"architecture"`
ImageID string `json:"image-id"`
IAMInstanceProfile IAMInstanceProfile `json:"iam-instance-profile"`
InstanceID string `json:"instance-id"`
InstanceType string `json:"instance-type"`
KeyName string `json:"key-name"`
Placement Placement `json:"placement"`
PrivateDNSName string `json:"private-dns-name"`
PrivateIP string `json:"private-ip"`
PublicDNSName string `json:"public-dns-name"`
PublicIP string `json:"public-ip"`
State State `json:"state"`
StateReason StateReason `json:"state-reason"`
StateTransitionReason string `json:"state-transition-reason"`
SubnetID string `json:"subnet-id"`
VPCID string `json:"vpc-id"`
CPUOptions CPUOptions `json:"cpu-options"`
BlockDeviceMappings []BlockDeviceMapping `json:"block-device-mappings"`
EBSOptimized bool `json:"ebs-optimized"`
RootDeviceName string `json:"root-device-name"`
RootDeviceType string `json:"root-device-type"`
SecurityGroups []SecurityGroup `json:"security-groups"`
LaunchTime time.Time `json:"launch-time"`
RemoteAccessUserName string `json:"remote-access-user-name"`
Hypervisor string `json:"hypervisor"`
VirtualizationType string `json:"virtualization-type"`
}
Instance represents an EC2 instance.
func ConvertInstance ¶ added in v0.6.9
ConvertInstance converts "aws ec2 describe-instances" to "config.Instance".
type Placement ¶
type Placement struct {
AvailabilityZone string `json:"availability-zone"`
Tenancy string `json:"tenancy"`
}
Placement defines EC2 placement.
type SecurityGroup ¶
SecurityGroup defines a security group.
type StateReason ¶ added in v0.9.0
StateReason represents the EC2 state reason.