Add EKSCluster worker node spec for cloudformation
Signed-off-by: Luke Weber <luke.weber@gmail.com>
This commit is contained in:
parent
997b6bd7a9
commit
d6bec33e4e
|
|
@ -34,6 +34,7 @@ const (
|
||||||
Version = "v1alpha1"
|
Version = "v1alpha1"
|
||||||
APIVersion = Group + "/" + Version
|
APIVersion = Group + "/" + Version
|
||||||
EKSClusterKind = "eksclusters"
|
EKSClusterKind = "eksclusters"
|
||||||
|
EKSClusterKindAPIVersion = EKSClusterKind + "." + APIVersion
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,10 @@ limitations under the License.
|
||||||
package v1alpha1
|
package v1alpha1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
corev1alpha1 "github.com/crossplaneio/crossplane/pkg/apis/core/v1alpha1"
|
corev1alpha1 "github.com/crossplaneio/crossplane/pkg/apis/core/v1alpha1"
|
||||||
"github.com/crossplaneio/crossplane/pkg/util"
|
"github.com/crossplaneio/crossplane/pkg/util"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
|
|
@ -37,12 +41,42 @@ const (
|
||||||
// ClusterStatusFailed = "FAILED"
|
// ClusterStatusFailed = "FAILED"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type EKSRegion string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// EKSRegionUSWest2 - us-west-2 (Oregon) region for eks cluster
|
||||||
|
EKSRegionUSWest2 EKSRegion = "us-west-2"
|
||||||
|
// EKSRegionUSEast1 - us-east-1 (N. Virginia) region for eks cluster
|
||||||
|
EKSRegionUSEast1 EKSRegion = "us-east-1"
|
||||||
|
// EKSRegionUSEast2 - us-east-2 (Ohio) region for eks worker only
|
||||||
|
EKSRegionUSEast2 EKSRegion = "us-east-2"
|
||||||
|
// EKSRegionEUWest1 - eu-west-1 (Ireland) region for eks cluster
|
||||||
|
EKSRegionEUWest1 EKSRegion = "eu-west-1"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
workerNodeRegionAMI = map[EKSRegion]string{
|
||||||
|
EKSRegionUSWest2: "ami-0f54a2f7d2e9c88b3",
|
||||||
|
EKSRegionUSEast1: "ami-0a0b913ef3249b655",
|
||||||
|
EKSRegionUSEast2: "ami-0958a76db2d150238",
|
||||||
|
EKSRegionEUWest1: "ami-00c3b2d35bddd4f5c",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
type EKSClusterSpec struct {
|
type EKSClusterSpec struct {
|
||||||
|
// Configuration of this Spec is dependent on the readme as described here
|
||||||
|
// https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html
|
||||||
|
|
||||||
|
// Region for EKS Cluster
|
||||||
|
// +kubebuilder:validation:Enum=us-west-2,us-east-1,eu-west-1
|
||||||
|
Region EKSRegion `json:"region"`
|
||||||
|
|
||||||
// RoleARN --role-arn
|
// RoleARN --role-arn
|
||||||
// The Amazon Resource Name (ARN) of the IAM role that provides permis-
|
// The Amazon Resource Name (ARN) of the IAM role that provides permis-
|
||||||
// sions for Amazon EKS to make calls to other AWS API operations on
|
// sions for Amazon EKS to make calls to other AWS API operations on
|
||||||
// your behalf. For more information, see Amazon EKS Service IAM Role
|
// your behalf. For more information, see Amazon EKS Service IAM Role
|
||||||
// in the * Amazon EKS User Guide * .
|
// in the * Amazon EKS User Guide * .
|
||||||
|
// TODO: we could simplify this to roleName.
|
||||||
RoleARN string `json:"roleARN"`
|
RoleARN string `json:"roleARN"`
|
||||||
|
|
||||||
// ResourcesVPCConfig --resources-vpc-config (structure)
|
// ResourcesVPCConfig --resources-vpc-config (structure)
|
||||||
|
|
@ -54,12 +88,16 @@ type EKSClusterSpec struct {
|
||||||
// specify up to 5 security groups, but we recommend that you use a
|
// specify up to 5 security groups, but we recommend that you use a
|
||||||
// dedicated security group for your cluster control plane.
|
// dedicated security group for your cluster control plane.
|
||||||
//
|
//
|
||||||
|
// VpcID of EKS cluster
|
||||||
|
VpcID string `json:"vpcId"`
|
||||||
|
// SubnetIds
|
||||||
// Syntax:
|
// Syntax:
|
||||||
// subnetIds=string,string,
|
// subnetIds=string,string,
|
||||||
SubnetIds []string `json:"subnetIds"`
|
SubnetIds []string `json:"subnetIds"`
|
||||||
|
// SecurityGroupIds
|
||||||
// Syntax:
|
// Syntax:
|
||||||
// securityGroupsIds=string,string,
|
// securityGroupIds=string,string,
|
||||||
SecurityGroupsIds []string `json:"securityGroupIds"`
|
SecurityGroupIds []string `json:"securityGroupIds"`
|
||||||
|
|
||||||
// ClientRequestToken
|
// ClientRequestToken
|
||||||
// --client-request-token (string)
|
// --client-request-token (string)
|
||||||
|
|
@ -68,7 +106,7 @@ type EKSClusterSpec struct {
|
||||||
ClientRequestToken string `json:"clientRequestToken,omitempty"`
|
ClientRequestToken string `json:"clientRequestToken,omitempty"`
|
||||||
|
|
||||||
// ClusterVersion --kubernetes-version (string)
|
// ClusterVersion --kubernetes-version (string)
|
||||||
// The desired Kubernetes version for your clustee. If you do not spec-
|
// The desired Kubernetes version for your cluster. If you do not spec-
|
||||||
// ify a value here, the latest version available in Amazon EKS is
|
// ify a value here, the latest version available in Amazon EKS is
|
||||||
// used.
|
// used.
|
||||||
ClusterVersion string `json:"clusterVersion,omitempty"`
|
ClusterVersion string `json:"clusterVersion,omitempty"`
|
||||||
|
|
@ -88,16 +126,58 @@ type EKSClusterSpec struct {
|
||||||
// the command inputs and returns a sample output JSON for that command.
|
// the command inputs and returns a sample output JSON for that command.
|
||||||
GenerateCLISkeleton string `json:"generateCLISkeleton,omitempty"`
|
GenerateCLISkeleton string `json:"generateCLISkeleton,omitempty"`
|
||||||
|
|
||||||
|
// WorkerNodes configuration for cloudformation
|
||||||
|
WorkerNodes WorkerNodesSpec `json:"workerNodes"`
|
||||||
|
|
||||||
|
// ConnectionSecretNameOverride set this override the generated name of Status.ConnectionSecretRef.Name
|
||||||
|
ConnectionSecretNameOverride string `json:"connectionSecretNameOverride,omitempty"`
|
||||||
|
|
||||||
// Kubernetes object references
|
// Kubernetes object references
|
||||||
ClaimRef *corev1.ObjectReference `json:"claimRef,omitempty"`
|
ClaimRef *corev1.ObjectReference `json:"claimRef,omitempty"`
|
||||||
ClassRef *corev1.ObjectReference `json:"classRef,omitempty"`
|
ClassRef *corev1.ObjectReference `json:"classRef,omitempty"`
|
||||||
ConnectionSecretRef *corev1.LocalObjectReference `json:"connectionSecretRef,omitempty"`
|
|
||||||
ProviderRef corev1.LocalObjectReference `json:"providerRef"`
|
ProviderRef corev1.LocalObjectReference `json:"providerRef"`
|
||||||
|
|
||||||
// ReclaimPolicy identifies how to handle the cloud resource after the deletion of this type
|
// ReclaimPolicy identifies how to handle the cloud resource after the deletion of this type
|
||||||
ReclaimPolicy corev1alpha1.ReclaimPolicy `json:"reclaimPolicy,omitempty"`
|
ReclaimPolicy corev1alpha1.ReclaimPolicy `json:"reclaimPolicy,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//WorkerNodesSpec - Worker node spec used to define cloudformation template that provisions workers for cluster
|
||||||
|
type WorkerNodesSpec struct {
|
||||||
|
// KeyName The EC2 Key Pair to allow SSH access to the instances
|
||||||
|
KeyName string `json:"keyName"`
|
||||||
|
|
||||||
|
// NodeImageId The EC2 Key Pair to allow SSH access to the instances
|
||||||
|
// defaults to region standard AMI
|
||||||
|
NodeImageID string `json:"nodeImageId,omitempty"`
|
||||||
|
|
||||||
|
// NodeInstanceType EC2 instance type for the node instances
|
||||||
|
// +kubebuilder:validation:Enum=t2.small,t2.medium,t2.large,t2.xlarge,t2.2xlarge,t3.nano,t3.micro,t3.small,t3.medium,t3.large,t3.xlarge,t3.2xlarge,m3.medium,m3.large,m3.xlarge,m3.2xlarge,m4.large,m4.xlarge,m4.2xlarge,m4.4xlarge,m4.10xlarge,m5.large,m5.xlarge,m5.2xlarge,m5.4xlarge,m5.12xlarge,m5.24xlarge,c4.large,c4.xlarge,c4.2xlarge,c4.4xlarge,c4.8xlarge,c5.large,c5.xlarge,c5.2xlarge,c5.4xlarge,c5.9xlarge,c5.18xlarge,i3.large,i3.xlarge,i3.2xlarge,i3.4xlarge,i3.8xlarge,i3.16xlarge,r3.xlarge,r3.2xlarge,r3.4xlarge,r3.8xlarge,r4.large,r4.xlarge,r4.2xlarge,r4.4xlarge,r4.8xlarge,r4.16xlarge,x1.16xlarge,x1.32xlarge,p2.xlarge,p2.8xlarge,p2.16xlarge,p3.2xlarge,p3.8xlarge,p3.16xlarge,r5.large,r5.xlarge,r5.2xlarge,r5.4xlarge,r5.12xlarge,r5.24xlarge,r5d.large,r5d.xlarge,r5d.2xlarge,r5d.4xlarge,r5d.12xlarge,r5d.24xlarge,z1d.large,z1d.xlarge,z1d.2xlarge,z1d.3xlarge,z1d.6xlarge,z1d.12xlarge
|
||||||
|
NodeInstanceType string `json:"nodeInstanceType"`
|
||||||
|
|
||||||
|
// NodeAutoScalingGroupMinSize Minimum size of Node Group ASG.
|
||||||
|
// default 1
|
||||||
|
NodeAutoScalingGroupMinSize *int `json:"nodeAutoScalingGroupMinSize,omitempty"`
|
||||||
|
|
||||||
|
// NodeAutoScalingGroupMaxSize Maximum size of Node Group ASG.
|
||||||
|
// Default: 3
|
||||||
|
NodeAutoScalingGroupMaxSize *int `json:"nodeAutoScalingGroupMaxSize,omitempty"`
|
||||||
|
|
||||||
|
// NodeVolumeSize Node volume size in GB
|
||||||
|
// Default: 20
|
||||||
|
NodeVolumeSize *int `json:"nodeVolumeSize,omitempty"`
|
||||||
|
|
||||||
|
// BootstrapArguments Arguments to pass to the bootstrap script. See files/bootstrap.sh in https://github.com/awslabs/amazon-eks-ami
|
||||||
|
// Default: ""
|
||||||
|
BootstrapArguments string `json:"bootstrapArguments,omitempty"`
|
||||||
|
|
||||||
|
// NodeGroupName Unique identifier for the Node Group.
|
||||||
|
NodeGroupName string `json:"nodeGroupName,omitempty"`
|
||||||
|
|
||||||
|
// ClusterControlPlaneSecurityGroup The security group of the cluster control plane.
|
||||||
|
ClusterControlPlaneSecurityGroup string `json:"clusterControlPlaneSecurityGroup,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// EKSClusterStatus schema of the status of eks cluster
|
||||||
type EKSClusterStatus struct {
|
type EKSClusterStatus struct {
|
||||||
corev1alpha1.ConditionedStatus
|
corev1alpha1.ConditionedStatus
|
||||||
corev1alpha1.BindingStatusPhase
|
corev1alpha1.BindingStatusPhase
|
||||||
|
|
@ -108,6 +188,10 @@ type EKSClusterStatus struct {
|
||||||
ClusterName string `json:"resourceName,omitempty"`
|
ClusterName string `json:"resourceName,omitempty"`
|
||||||
// Endpoint for cluster
|
// Endpoint for cluster
|
||||||
Endpoint string `json:"endpoint,omitempty"`
|
Endpoint string `json:"endpoint,omitempty"`
|
||||||
|
// CloudFormationStackID Stack-id
|
||||||
|
CloudFormationStackID string `json:"cloudformationStackId,omitempty"`
|
||||||
|
|
||||||
|
ConnectionSecretRef corev1.LocalObjectReference `json:"connectionSecretRef,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// +genclient
|
// +genclient
|
||||||
|
|
@ -134,12 +218,96 @@ type EKSClusterList struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewEKSClusterSpec from properties map
|
// NewEKSClusterSpec from properties map
|
||||||
// TODO: will be using once abstract resource support is added
|
|
||||||
func NewEKSClusterSpec(properties map[string]string) *EKSClusterSpec {
|
func NewEKSClusterSpec(properties map[string]string) *EKSClusterSpec {
|
||||||
spec := &EKSClusterSpec{
|
spec := &EKSClusterSpec{
|
||||||
ReclaimPolicy: corev1alpha1.ReclaimRetain,
|
ReclaimPolicy: corev1alpha1.ReclaimRetain,
|
||||||
}
|
}
|
||||||
// TODO: complete spec fields assignment
|
|
||||||
|
val, ok := properties["region"]
|
||||||
|
if ok {
|
||||||
|
spec.Region = EKSRegion(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["roleARN"]
|
||||||
|
if ok {
|
||||||
|
spec.RoleARN = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["vpcId"]
|
||||||
|
if ok {
|
||||||
|
spec.VpcID = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["subnetIds"]
|
||||||
|
if ok {
|
||||||
|
spec.SubnetIds = append(spec.SubnetIds, strings.Split(val, ",")...)
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["securityGroupIds"]
|
||||||
|
if ok {
|
||||||
|
spec.SecurityGroupIds = append(spec.SecurityGroupIds, strings.Split(val, ",")...)
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["clusterVersion"]
|
||||||
|
if ok {
|
||||||
|
spec.ClusterVersion = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerKeyName"]
|
||||||
|
if ok {
|
||||||
|
spec.WorkerNodes.KeyName = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerNodeImageId"]
|
||||||
|
if ok {
|
||||||
|
spec.WorkerNodes.NodeImageID = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerNodeInstanceType"]
|
||||||
|
if ok {
|
||||||
|
spec.WorkerNodes.NodeInstanceType = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerNodeAutoScalingGroupMinSize"]
|
||||||
|
if ok {
|
||||||
|
if size, err := strconv.Atoi(val); err == nil {
|
||||||
|
spec.WorkerNodes.NodeAutoScalingGroupMinSize = &size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerNodeAutoScalingGroupMaxSize"]
|
||||||
|
if ok {
|
||||||
|
if size, err := strconv.Atoi(val); err == nil {
|
||||||
|
spec.WorkerNodes.NodeAutoScalingGroupMaxSize = &size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerNodeVolumeSize"]
|
||||||
|
if ok {
|
||||||
|
if size, err := strconv.Atoi(val); err == nil {
|
||||||
|
spec.WorkerNodes.NodeVolumeSize = &size
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerBootstrapArguments"]
|
||||||
|
if ok {
|
||||||
|
spec.WorkerNodes.BootstrapArguments = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["workerNodeGroupName"]
|
||||||
|
if ok {
|
||||||
|
spec.WorkerNodes.NodeGroupName = val
|
||||||
|
}
|
||||||
|
val, ok = properties["workerClusterControlPlaneSecurityGroup"]
|
||||||
|
if ok {
|
||||||
|
spec.WorkerNodes.ClusterControlPlaneSecurityGroup = val
|
||||||
|
}
|
||||||
|
|
||||||
|
val, ok = properties["connectionSecretNameOverride"]
|
||||||
|
if ok {
|
||||||
|
spec.ConnectionSecretNameOverride = val
|
||||||
|
}
|
||||||
|
|
||||||
return spec
|
return spec
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -154,17 +322,19 @@ func (e *EKSCluster) ConnectionSecret() *corev1.Secret {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConnectionSecretName returns a secret name from the reference
|
// ConnectionSecretName returns the name of the connection secret
|
||||||
func (e *EKSCluster) ConnectionSecretName() string {
|
func (e *EKSCluster) ConnectionSecretName() string {
|
||||||
if e.Spec.ConnectionSecretRef == nil {
|
if e.Status.ConnectionSecretRef.Name != "" {
|
||||||
e.Spec.ConnectionSecretRef = &corev1.LocalObjectReference{
|
return e.Status.ConnectionSecretRef.Name
|
||||||
Name: e.Name,
|
} else if e.Spec.ConnectionSecretNameOverride != "" {
|
||||||
|
return e.Spec.ConnectionSecretNameOverride
|
||||||
}
|
}
|
||||||
} else if e.Spec.ConnectionSecretRef.Name == "" {
|
return e.Name
|
||||||
e.Spec.ConnectionSecretRef.Name = e.Name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return e.Spec.ConnectionSecretRef.Name
|
// SetConnectionSecretReference sets a local object reference to this secret in Status.ConnectionSecretRef
|
||||||
|
func (e *EKSCluster) SetConnectionSecretReference(secret *corev1.Secret) {
|
||||||
|
e.Status.ConnectionSecretRef.Name = secret.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
// Endpoint returns rds resource endpoint value saved in the status (could be empty)
|
// Endpoint returns rds resource endpoint value saved in the status (could be empty)
|
||||||
|
|
@ -215,3 +385,11 @@ func (e *EKSCluster) SetBound(state bool) {
|
||||||
e.Status.Phase = corev1alpha1.BindingStateUnbound
|
e.Status.Phase = corev1alpha1.BindingStateUnbound
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAMIByRegion returns the default ami id for a given EKS region
|
||||||
|
func GetRegionAMI(region EKSRegion) (string, error) {
|
||||||
|
if val, ok := workerNodeRegionAMI[region]; ok {
|
||||||
|
return val, nil
|
||||||
|
}
|
||||||
|
return "", fmt.Errorf("not a valid EKS region, %s", string(region))
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ package v1alpha1
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"log"
|
"log"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
corev1alpha1 "github.com/crossplaneio/crossplane/pkg/apis/core/v1alpha1"
|
corev1alpha1 "github.com/crossplaneio/crossplane/pkg/apis/core/v1alpha1"
|
||||||
|
|
@ -59,14 +61,28 @@ func TestMain(m *testing.M) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestEKSCluster(t *testing.T) {
|
func TestEKSCluster(t *testing.T) {
|
||||||
|
autoscaleSize := 1
|
||||||
|
volSize := 20
|
||||||
key := types.NamespacedName{Name: name, Namespace: namespace}
|
key := types.NamespacedName{Name: name, Namespace: namespace}
|
||||||
created := &EKSCluster{
|
created := &EKSCluster{
|
||||||
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
|
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace},
|
||||||
Spec: EKSClusterSpec{
|
Spec: EKSClusterSpec{
|
||||||
|
Region: "us-west-2",
|
||||||
ClusterVersion: "1.1.1",
|
ClusterVersion: "1.1.1",
|
||||||
RoleARN: "test-arn",
|
RoleARN: "test-arn",
|
||||||
SubnetIds: []string{"one", "two"},
|
SubnetIds: []string{"one", "two"},
|
||||||
SecurityGroupsIds: []string{"sg-1", "sg-2"},
|
SecurityGroupIds: []string{"sg-1", "sg-2"},
|
||||||
|
WorkerNodes: WorkerNodesSpec{
|
||||||
|
KeyName: "test-key-name",
|
||||||
|
NodeImageID: "ami-id-test",
|
||||||
|
NodeInstanceType: "t2.small",
|
||||||
|
NodeAutoScalingGroupMinSize: &autoscaleSize,
|
||||||
|
NodeAutoScalingGroupMaxSize: &autoscaleSize,
|
||||||
|
NodeVolumeSize: &volSize,
|
||||||
|
BootstrapArguments: "test-bootstrap",
|
||||||
|
NodeGroupName: "special-group-name",
|
||||||
|
ClusterControlPlaneSecurityGroup: "sg-cluster-sec-group",
|
||||||
|
},
|
||||||
ReclaimPolicy: corev1alpha1.ReclaimRetain,
|
ReclaimPolicy: corev1alpha1.ReclaimRetain,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -90,4 +106,114 @@ func TestEKSCluster(t *testing.T) {
|
||||||
// Test Delete
|
// Test Delete
|
||||||
g.Expect(c.Delete(ctx, fetched)).NotTo(HaveOccurred())
|
g.Expect(c.Delete(ctx, fetched)).NotTo(HaveOccurred())
|
||||||
g.Expect(c.Get(ctx, key, fetched)).To(HaveOccurred())
|
g.Expect(c.Get(ctx, key, fetched)).To(HaveOccurred())
|
||||||
|
|
||||||
|
// Test create w/invalid region
|
||||||
|
badRegion := created.DeepCopy()
|
||||||
|
badRegion.Spec.Region = "bad-region"
|
||||||
|
g.Expect(c.Create(ctx, badRegion)).To(MatchError(ContainSubstring("spec.region in body should be one of [us-west-2 us-east-1 eu-west-1]")))
|
||||||
|
|
||||||
|
// Test create w/invalid instance type
|
||||||
|
badInstanceType := created.DeepCopy()
|
||||||
|
badInstanceType.Spec.WorkerNodes.NodeInstanceType = "xs-bad-type"
|
||||||
|
g.Expect(c.Create(ctx, badInstanceType)).To(MatchError(ContainSubstring("spec.workerNodes.nodeInstanceType in body should be one of [t2.small")))
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewEKSClusterSpec(t *testing.T) {
|
||||||
|
g := NewGomegaWithT(t)
|
||||||
|
|
||||||
|
m := make(map[string]string)
|
||||||
|
exp := &EKSClusterSpec{ReclaimPolicy: corev1alpha1.ReclaimRetain}
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val := "test-region"
|
||||||
|
m["region"] = val
|
||||||
|
exp.Region = EKSRegion(val)
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-arm"
|
||||||
|
m["roleARN"] = val
|
||||||
|
exp.RoleARN = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-vpc"
|
||||||
|
m["vpcId"] = val
|
||||||
|
exp.VpcID = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-subnet-1-id,test-subnet-2-id"
|
||||||
|
m["subnetIds"] = val
|
||||||
|
exp.SubnetIds = append(exp.SubnetIds, strings.Split(val, ",")...)
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-sg-1-id,test-sg-2-id"
|
||||||
|
m["securityGroupIds"] = val
|
||||||
|
exp.SecurityGroupIds = append(exp.SecurityGroupIds, strings.Split(val, ",")...)
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "1.10.1"
|
||||||
|
m["clusterVersion"] = val
|
||||||
|
exp.ClusterVersion = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "key-name-test"
|
||||||
|
m["workerKeyName"] = val
|
||||||
|
exp.WorkerNodes.KeyName = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-node-image-id"
|
||||||
|
m["workerNodeImageId"] = val
|
||||||
|
exp.WorkerNodes.NodeImageID = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-node-instance-type"
|
||||||
|
m["workerNodeInstanceType"] = val
|
||||||
|
exp.WorkerNodes.NodeInstanceType = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
minSize := 5
|
||||||
|
val = strconv.Itoa(minSize)
|
||||||
|
m["workerNodeAutoScalingGroupMinSize"] = ""
|
||||||
|
exp.WorkerNodes.NodeAutoScalingGroupMinSize = nil
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
m["workerNodeAutoScalingGroupMinSize"] = val
|
||||||
|
exp.WorkerNodes.NodeAutoScalingGroupMinSize = &minSize
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
maxSize := 10
|
||||||
|
val = strconv.Itoa(maxSize)
|
||||||
|
m["workerNodeAutoScalingGroupMaxSize"] = ""
|
||||||
|
exp.WorkerNodes.NodeAutoScalingGroupMaxSize = nil
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
m["workerNodeAutoScalingGroupMaxSize"] = val
|
||||||
|
exp.WorkerNodes.NodeAutoScalingGroupMaxSize = &maxSize
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
volSize := 20
|
||||||
|
val = strconv.Itoa(volSize)
|
||||||
|
m["workerNodeVolumeSize"] = ""
|
||||||
|
exp.WorkerNodes.NodeVolumeSize = nil
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
m["workerNodeVolumeSize"] = val
|
||||||
|
exp.WorkerNodes.NodeVolumeSize = &volSize
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-bootstrap-args"
|
||||||
|
m["workerBootstrapArguments"] = val
|
||||||
|
exp.WorkerNodes.BootstrapArguments = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "test-node-group-name"
|
||||||
|
m["workerNodeGroupName"] = val
|
||||||
|
exp.WorkerNodes.NodeGroupName = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "cp-security-group"
|
||||||
|
m["workerClusterControlPlaneSecurityGroup"] = val
|
||||||
|
exp.WorkerNodes.ClusterControlPlaneSecurityGroup = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
|
|
||||||
|
val = "conn-secret-name-override-test"
|
||||||
|
m["connectionSecretNameOverride"] = val
|
||||||
|
exp.ConnectionSecretNameOverride = val
|
||||||
|
g.Expect(NewEKSClusterSpec(m)).To(Equal(exp))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -93,11 +93,12 @@ func (in *EKSClusterSpec) DeepCopyInto(out *EKSClusterSpec) {
|
||||||
*out = make([]string, len(*in))
|
*out = make([]string, len(*in))
|
||||||
copy(*out, *in)
|
copy(*out, *in)
|
||||||
}
|
}
|
||||||
if in.SecurityGroupsIds != nil {
|
if in.SecurityGroupIds != nil {
|
||||||
in, out := &in.SecurityGroupsIds, &out.SecurityGroupsIds
|
in, out := &in.SecurityGroupIds, &out.SecurityGroupIds
|
||||||
*out = make([]string, len(*in))
|
*out = make([]string, len(*in))
|
||||||
copy(*out, *in)
|
copy(*out, *in)
|
||||||
}
|
}
|
||||||
|
in.WorkerNodes.DeepCopyInto(&out.WorkerNodes)
|
||||||
if in.ClaimRef != nil {
|
if in.ClaimRef != nil {
|
||||||
in, out := &in.ClaimRef, &out.ClaimRef
|
in, out := &in.ClaimRef, &out.ClaimRef
|
||||||
*out = new(v1.ObjectReference)
|
*out = new(v1.ObjectReference)
|
||||||
|
|
@ -108,11 +109,6 @@ func (in *EKSClusterSpec) DeepCopyInto(out *EKSClusterSpec) {
|
||||||
*out = new(v1.ObjectReference)
|
*out = new(v1.ObjectReference)
|
||||||
**out = **in
|
**out = **in
|
||||||
}
|
}
|
||||||
if in.ConnectionSecretRef != nil {
|
|
||||||
in, out := &in.ConnectionSecretRef, &out.ConnectionSecretRef
|
|
||||||
*out = new(v1.LocalObjectReference)
|
|
||||||
**out = **in
|
|
||||||
}
|
|
||||||
out.ProviderRef = in.ProviderRef
|
out.ProviderRef = in.ProviderRef
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -132,6 +128,7 @@ func (in *EKSClusterStatus) DeepCopyInto(out *EKSClusterStatus) {
|
||||||
*out = *in
|
*out = *in
|
||||||
in.ConditionedStatus.DeepCopyInto(&out.ConditionedStatus)
|
in.ConditionedStatus.DeepCopyInto(&out.ConditionedStatus)
|
||||||
out.BindingStatusPhase = in.BindingStatusPhase
|
out.BindingStatusPhase = in.BindingStatusPhase
|
||||||
|
out.ConnectionSecretRef = in.ConnectionSecretRef
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -144,3 +141,34 @@ func (in *EKSClusterStatus) DeepCopy() *EKSClusterStatus {
|
||||||
in.DeepCopyInto(out)
|
in.DeepCopyInto(out)
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *WorkerNodesSpec) DeepCopyInto(out *WorkerNodesSpec) {
|
||||||
|
*out = *in
|
||||||
|
if in.NodeAutoScalingGroupMinSize != nil {
|
||||||
|
in, out := &in.NodeAutoScalingGroupMinSize, &out.NodeAutoScalingGroupMinSize
|
||||||
|
*out = new(int)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
|
if in.NodeAutoScalingGroupMaxSize != nil {
|
||||||
|
in, out := &in.NodeAutoScalingGroupMaxSize, &out.NodeAutoScalingGroupMaxSize
|
||||||
|
*out = new(int)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
|
if in.NodeVolumeSize != nil {
|
||||||
|
in, out := &in.NodeVolumeSize, &out.NodeVolumeSize
|
||||||
|
*out = new(int)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkerNodesSpec.
|
||||||
|
func (in *WorkerNodesSpec) DeepCopy() *WorkerNodesSpec {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(WorkerNodesSpec)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue