apiVersion: v1
kind: ConfigMap
metadata:
  name: instance-manager
  namespace: instance-manager
data:
  controller.conf: |
    foo: bar
  cloudformation.template: |
    AWSTemplateFormatVersion: '2010-09-09'
    Description: 'Amazon EKS - Node Group - Released 2018-08-30'
    Parameters:
      KeyName:
        Description: The EC2 Key Pair to allow SSH access to the instances
        Type: AWS::EC2::KeyPair::KeyName
      NodeImageId:
        Type: AWS::EC2::Image::Id
        Description: AMI id for the node instances.
      NodeInstanceType:
        Description: EC2 instance type for the node instances
        Type: String
        Default: t2.medium
        AllowedValues:
        - t2.small
        - t2.medium
        - t2.large
        - t2.xlarge
        - t2.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
        ConstraintDescription: Must be a valid EC2 instance type
      NodeAutoScalingGroupMinSize:
        Type: Number
        Description: Minimum size of Node Group ASG.
        Default: 1
      NodeAutoScalingGroupMaxSize:
        Type: Number
        Description: Maximum size of Node Group ASG.
        Default: 3
      NodeVolumeSize:
        Type: Number
        Description: Node volume size
        Default: 20
      ClusterName:
        Description: The cluster name provided when the cluster was created. If it is incorrect, nodes will not be able to join the cluster.
        Type: String
      BootstrapArguments:
        Description: Arguments to pass to the bootstrap script. See files/bootstrap.sh in https://github.com/awslabs/amazon-eks-ami
        Default: ""
        Type: String
      NodeGroupName:
        Description: Unique identifier for the Node Group.
        Type: String
      NodeSecurityGroups:
        Description: The security groups to attach to the scaling group
        Type: List<AWS::EC2::SecurityGroup::Id>
      VpcId:
        Description: The VPC of the worker instances
        Type: AWS::EC2::VPC::Id
      Subnets:
        Description: The subnets where workers can be created.
        Type: List<AWS::EC2::Subnet::Id>
    Metadata:
      AWS::CloudFormation::Interface:
        ParameterGroups:
          -
            Label:
              default: "EKS Cluster"
            Parameters:
              - ClusterName
              - NodeSecurityGroups
          -
            Label:
              default: "Worker Node Configuration"
            Parameters:
              - NodeGroupName
              - NodeAutoScalingGroupMinSize
              - NodeAutoScalingGroupMaxSize
              - NodeInstanceType
              - NodeImageId
              - NodeVolumeSize
              - KeyName
              - BootstrapArguments
          -
            Label:
              default: "Worker Network Configuration"
            Parameters:
              - VpcId
              - Subnets
    Resources:
      NodeInstanceProfile:
        Type: AWS::IAM::InstanceProfile
        Properties:
          Path: "/"
          Roles:
          - !Ref NodeInstanceRole
      NodeInstanceRole:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Principal:
                Service:
                - ec2.amazonaws.com
              Action:
              - sts:AssumeRole
          Path: "/"
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy
            - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
            - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
      NodeGroup:
        Type: AWS::AutoScaling::AutoScalingGroup
        Properties:
          DesiredCapacity: !Ref NodeAutoScalingGroupMinSize
          LaunchConfigurationName: !Ref NodeLaunchConfig
          MinSize: !Ref NodeAutoScalingGroupMinSize
          MaxSize: !Ref NodeAutoScalingGroupMaxSize
          VPCZoneIdentifier:
            !Ref Subnets
          Tags:
          - Key: Name
            Value: !Sub "${ClusterName}-${NodeGroupName}-Node"
            PropagateAtLaunch: 'true'
          - Key: !Sub 'kubernetes.io/cluster/${ClusterName}'
            Value: 'owned'
            PropagateAtLaunch: 'true'
          - Key: KubernetesCluster
            Value: !Ref ClusterName
            PropagateAtLaunch: 'true'
        {{$strategy := .Spec.AwsUpgradeStrategy.Type | ToLower}}
        {{if (eq $strategy "rollingupdate")}}
        UpdatePolicy:
          AutoScalingRollingUpdate:
            MinInstancesInService: '1'
            MaxBatchSize: '1'
        {{end}}
      NodeLaunchConfig:
        Type: AWS::AutoScaling::LaunchConfiguration
        Properties:
          AssociatePublicIpAddress: 'false'
          IamInstanceProfile: !Ref NodeInstanceProfile
          ImageId: !Ref NodeImageId
          InstanceType: !Ref NodeInstanceType
          KeyName: !Ref KeyName
          SecurityGroups: !Ref NodeSecurityGroups
          BlockDeviceMappings:
            - DeviceName: /dev/xvda
              Ebs:
                VolumeSize: !Ref NodeVolumeSize
                VolumeType: gp2
                DeleteOnTermination: true
          UserData:
            Fn::Base64:
              !Sub |
                #!/bin/bash
                set -o xtrace
                /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}
                /opt/aws/bin/cfn-signal --exit-code $? \
                        --stack  ${AWS::StackName} \
                        --resource NodeGroup  \
                        --region ${AWS::Region}
    Outputs:
      NodeInstanceRole:
        Description: The node instance role
        Value: !GetAtt NodeInstanceRole.Arn
      AsgName:
        Description: The ASG name
        Value: !Ref NodeGroup
      LaunchConfigName:
        Description: The launch config name
        Value: !Ref NodeLaunchConfig
