AWSTemplateFormatVersion: '2010-09-09'
Description: 'Master template for an IBM Cloud Pak for Data deployment.'
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: VPC
        Parameters:
          - NumberOfAZs
          - AvailabilityZones
          - VPCCIDR
          - PrivateSubnet1CIDR
          - PrivateSubnet2CIDR
          - PrivateSubnet3CIDR
          - PublicSubnet1CIDR
          - PublicSubnet2CIDR
          - PublicSubnet3CIDR
          - BootNodeAccessCIDR
          - ClusterNetworkCIDR
          - ClusterNetworkHostPrefix
          - ServiceNetworkCIDR
      - Label:
          default: DNS
        Parameters:
          - DomainName
#      - Label:
#          default: Jumpbox
#        Parameters:
#          - KeyPairName
      - Label:
          default: OpenShift
        Parameters:
          - NumberOfMaster
          - NumberOfCompute
          - MasterInstanceType
          - MasterVolumeIops
          - MasterVolumeSize
          - MasterVolumeType
          - ComputeInstanceType
          - ComputeVolumeIops
          - ComputeVolumeSize
          - ComputeVolumeType
#          - ClusterName
          - EnableFips
          - PrivateCluster
          - OpenshiftVersion
          - OpenshiftUsername
          - OpenshiftPassword
          - EnableAutoscaler
          - CPDExternalRegistry
      - Label:
          default: Storage
        Parameters:   
          - StorageType
          - PortworxClusterId
          - PortworxUserId
          - PortworxOsbEndpoint
          - OCSInstanceType
      - Label:
          default: Red Hat subscription
        Parameters:
          - RedhatPullSecret
      - Label:
          default: CP4D
        Parameters:
          - LicenseAgreement
          - APIUsername
          - APIKey
          - Namespace
#          - ICPDDeploymentLogsBucketName
          - DB2OLTP
          - WKC
          - WML
          - DV
          - WSL
          - OpenScale
          - Spark
          - DATASTAGE
          - CDE
          - CA
      - Label:
          default: EKS
        Parameters:
          - ProvisionEKS
          - EKSNodeInstanceType
          - AdditionalEKSAdminUserArn
          - AdditionalEKSAdminRoleArn
      - Label:
          default: Cloud formation S3 bucket
        Parameters:
          - CloudFormationS3Bucket

    ParameterLabels:
      NumberOfAZs:
        default: Number of Availability Zones
      AvailabilityZones:
        default: Availability Zones
      VPCCIDR:
        default: VPC CIDR
      PrivateSubnet1CIDR:
        default: Private subnet 1 CIDR
      PrivateSubnet2CIDR:
        default: Private subnet 2 CIDR
      PrivateSubnet3CIDR:
        default: Private subnet 3 CIDR
      PublicSubnet1CIDR:
        default: Public subnet 1 CIDR
      PublicSubnet2CIDR:
        default: Public subnet 2 CIDR
      PublicSubnet3CIDR:
        default: Public subnet 3 CIDR
      BootNodeAccessCIDR:
        default: Boot node external access CIDR
      ClusterNetworkCIDR:
        default: Cluster network CIDR
      ClusterNetworkHostPrefix:
        default: Cluster network host prefix
      ServiceNetworkCIDR: 
        default: Service network CIDR
      DomainName:
        default: Domain name
#      KeyPairName:
#        default: Key pair name
      NumberOfMaster:
        default: Number of master nodes
      NumberOfCompute:
        default: Number of compute nodes
      MasterInstanceType:
        default: Master instance type
      MasterVolumeIops:
        default: Master volume iops
      MasterVolumeSize:
        default: Master volume size
      MasterVolumeType:
        default: Master volume type
      ComputeInstanceType:
        default: Compute instance type
      ComputeVolumeIops:
        default: Compute volume iops
      ComputeVolumeSize:
        default: Compute volume size
      ComputeVolumeType:
        default: Compute volume type
#      ClusterName:
#        default: Cluster name
      EnableFips:
        default: Enable Fips
      PrivateCluster:
        default: Disable external endpoints of your cluster.
      OpenshiftVersion:
        default: Choose Openshift Version
      OpenshiftUsername:
        default: Choose username to login to Openshift console
      OpenshiftPassword:
        default: Choose password to be used to login to Openshift and Cloud Pak for Data Console
      StorageType:
        default: Cluster storage type
      PortworxClusterId: 
        default: Portworx cluster id
      PortworxUserId:
        default: Portworx user id
      PortworxOsbEndpoint:
        default: Portworx osb endpoint
      EnableAutoscaler:
        default: Enable auto scaler in openshift
      CPDExternalRegistry:
        default: CPD external registry
      OCSInstanceType:
        default: OCS instance type
      RedhatPullSecret:
        default: Red Hat pull secret
      LicenseAgreement:
        default: License agreement
      APIUsername:
        default: IBM Cloud Pak for Data API user name
      APIKey:
        default: IBM Cloud Pak for Data API key
      Namespace:
        default: OpenShift project
#      ICPDDeploymentLogsBucketName:
#        default: Output S3 bucket name
      DB2OLTP:
        default: DB2OLTP service
      WKC:
        default: Watson Knowledge Catalog service  
      WML:
        default: Watson Machine Learning service
      DV:
        default: Data Virtualization service
      WSL:
        default: Watson Studio service
      OpenScale:
        default: Watson OpenScale and Watson Machine Learning services
      Spark:
        default: Analytics Engine powered by Apache Spark service
      DATASTAGE:
        default: Datastage
      CDE:
        default: Cognos Dashboard service
      CA:
        default: Cognos Anlytics service
      CloudFormationS3Bucket:
        default: Cloud formation S3 bucket
      ProvisionEKS:
        default: Provision EKS?
      EKSNodeInstanceType:
        default: EKS Node instance type
      AdditionalEKSAdminUserArn:
        default: Additional EKS admin ARN (IAM user)
      AdditionalEKSAdminRoleArn:
        default: Additional EKS admin ARN (IAM role)
Parameters:
  NumberOfAZs:
    Description: >-
      The number of Availability Zones to be used for the deployment. Keep in mind that some regions may be limited to 2 Availability Zones. For a single ICPD cluster to be highly available, 3 Availability Zones are needed to avoid a single point of failure when using 3, 5 or 7 master nodes.  With less than 3 Availability Zones, one of the AZs will have more master nodes.
    Type: Number
    Default: 3
    AllowedValues:
      - 1
      - 3
  AvailabilityZones:
    Description: The list of Availability Zones to use for the subnets in the VPC. The Template uses one or three Availability Zones and preserves the logical order you specify.
    Type: List<AWS::EC2::AvailabilityZone::Name>
#    Type: String
  VPCCIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.0.0/16
    Description: CIDR block for the VPC
    Type: String
  PrivateSubnet1CIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.0.0/19
    Description: The CIDR block for the private subnet located in Availability Zone 1.
    Type: String
  PrivateSubnet2CIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.32.0/19
    Description: The CIDR block for the private subnet located in Availability Zone 2.
    Type: String
  PrivateSubnet3CIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.64.0/19
    Description: The CIDR block for the private subnet located in Availability Zone 3.
    Type: String
  PublicSubnet1CIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.128.0/20
    Description: The CIDR block for the public subnet located in Availability Zone 1.
    Type: String
  PublicSubnet2CIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.144.0/20
    Description: The CIDR block for the public subnet located in Availability Zone 2.
    Type: String
  PublicSubnet3CIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-8]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-28
    Default: 10.0.160.0/20
    Description: The CIDR block for the public subnet located in Availability Zone 3.
    Type: String
  BootNodeAccessCIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/x
    Description: The CIDR IP range that is permitted to access boot node instance. We recommend that you set this value to a trusted IP range. The value `0.0.0.0/0` permits all IP addresses to access. Additional values can be added post-deployment from the Amazon EC2 console.
    Type: String
    Default: 0.0.0.0/0
  ClusterNetworkCIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/x
    Description: The Cluster Network CIDR IP range that is used as IP address pools for pods. 
    Type: String
    Default: 10.128.0.0/14
  ClusterNetworkHostPrefix:
    Description: Cluster network host prefix
    Type: Number
    Default: 23
  ServiceNetworkCIDR:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/x
    Description: The Service Network CIDR IP range. 
    Type: String
    Default: 172.30.0.0/16
  DomainName:
    Description: 'Amazon Route 53 base domain configured for your OpenShift Container Platform cluster. Name must consist of lower case alphanumeric characters and must start and end with an alphanumeric character.'
    Type: String
  NumberOfMaster:
    Default: '3'
    Description: The desired capacity for the OpenShift master instances. Must be an odd number. A minimum of 3 is required.
    Type: String
    AllowedPattern: '^[3579]$|(^[3-9]+[3579]$)'
  NumberOfCompute:
    Default: '10'
    Description: The desired capacity for the OpenShift compute instances. Minimum of 3 nodes required. If the number of compute instances exceeds your Red Hat entitlement limits or AWS instance limits, the stack will fail. Choose a number that is within your limits.
    Type: Number
  MasterInstanceType:
    Default: m5.xlarge
    AllowedValues:
      - m5.xlarge
      - m5.2xlarge
      - m5d.xlarge
      - m5d.2xlarge
    ConstraintDescription: Must contain valid instance type
    Description: The EC2 instance type for the OpenShift master instances.
    Type: String
  MasterVolumeIops:
    Description: Master node volume iops
    Type: Number
    Default: 2000
  MasterVolumeSize:
    Description: Master node volume size in GB
    Type: Number
    Default: 200
  MasterVolumeType:
    Description: Master node volume type
    Default: gp2
    Type: String
    AllowedValues:
      - io1
      - gp2
  ComputeInstanceType:
    Default: m5.4xlarge
    AllowedValues:
      - m5.4xlarge
      - m5.8xlarge
      - m5.12xlarge
      - m5.24xlarge
      - m5a.4xlarge
      - m5a.8xlarge
      - m5a.12xlarge
      - m5a.24xlarge
      - c5.4xlarge
      - c5.9xlarge
      - c5.12xlarge
      - c5.18xlarge
      - c5.24xlarge
      - r5.4xlarge
      - r5.9xlarge
      - r5.12xlarge
      - r5.18xlarge
      - r5.24xlarge
    ConstraintDescription: Must contain valid instance type
    Description: The EC2 instance type for the OpenShift compute instances.
    Type: String
  ComputeVolumeIops:
    Default: 2000
    Type: Number
    Description: Worker volume IOPS.
  ComputeVolumeSize:
    Default: 200
    Type: Number
    Description: Worker volume size in GB.
  ComputeVolumeType:
    Default: gp2
    Type: String
    Description: Worker volume type.
    AllowedValues:
      - io1
      - gp2
  DB2OLTP:
    Description: >-
       Choose yes to install the DB2OLTP service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  DV:
    Description: >-
       Choose yes to install the Data Virtualization service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  WML:
    Description: >-
       Choose yes to install the Watson Machine Learning service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  WSL:
    Description: >-
       Choose yes to install the Watson Studio service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  WKC:
    Description: >-
       Choose yes to install the Watson Knowledge Catalog service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  OpenScale:
    Description: >-
       Choose yes to install the Watson OpenScale and Watson Machine Learning services.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "no"
  CDE:
    Description: >-
       Choose yes to install the Cognos Dashboard Engine service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  CA:
    Description: >-
       Choose yes to install the Cognos Analytics service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  Spark:
    Description: >-
       Choose yes to install the Analytics Engine powered by Apache Spark service.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "no"
  DATASTAGE:
    Description: >-
       Choose yes to install the Datastage.
    Type: String
    AllowedValues:
      - "no"
      - "yes"
    Default: "yes"
  APIUsername:
    Description: >-
       The IBM Cloud Pak for Data user name to access IBM Container Registry.
    Type: String
    Default: "cp"  
  APIKey:
    Description: >-
       The IBM Cloud Pak for Data API key to access IBM Container Registry.
    Type: String 
    NoEcho: 'true'
  RedhatPullSecret:
    Description: S3 path of OpenShift Installer Provisioned Infrastructure pull secret(e.g., s3://my-bucket/path/to/pull-secret).
    Type: String
    Default: "s3://cp4d-ocp-cloudformation-dev/pull-secrets/pull_secret.json"
  OCSInstanceType:
    Default: m4.4xlarge
    AllowedValues:
      - m4.4xlarge
      - m4.8xlarge
      - m4.10xlarge
      - m5.4xlarge
      - m5.8xlarge
      - m5.12xlarge
      - c4.8xlarge
      - c5.8xlarge
      - c5.12xlarge
      - c5.9xlarge
      - r5.4xlarge
      - r5.8xlarge
      - r5.12xlarge
    ConstraintDescription: Must contain valid instance type
    Description: Update this value if Storage type selected is OCS. The EC2 instance type for the OpenShift Container Storage instances.
    Type: String
  StorageType:
    Description: Select either EFS, Portworx or Openshift Container Storage as default Storage class.  
    Type: String
    AllowedValues:
      - "efs-ebs"
#      - "efs"
      - "ocs"
      - "portworxenterprise"
      - "portworxessentials"
#      - "PortworxIBM"
    Default: "efs-ebs"
  PortworxClusterId:
    Description: Portworx storage cluster id.
    Type: String
    Default: ""
  PortworxUserId:
    Description: Portworx cluster user id.
    Type: String
    Default: ""
  PortworxOsbEndpoint:
    Description: Portworx osb endpoint.
    Type: String
    Default: ""
  OpenshiftVersion:
    Description: Choose Openshift Version
    Type: String
    AllowedValues: 
      - "4.8.11"
      - "4.10.22"
    Default: "4.10.22"
  OpenshiftUsername:
    Description: Choose username to login to Openshift console
    Type: String
    Default: "ocsadmin"
  OpenshiftPassword:
    Description: Choose password to be used to login to Openshift and Cloud Pak for Data Console
    Type: String
    NoEcho: 'true'
  EnableFips:
    Description: Enable Fips for Openshift
    Type: String
    AllowedValues:
      - "false"
      - "true"
    Default: "false"
  PrivateCluster:  
    Description: Choose true to deploy a private cluster. For details visit OpenShift documentation (https://docs.openshift.com/container-platform/4.6/installing/installing_aws/installing-aws-private.html)
    Type: String
    AllowedValues:
      - "true"
      - "false"
    Default: "false"
  EnableAutoscaler:
    Description: Enable autoscaler for openshift
    Type: String
    Default: "true"
    AllowedValues:
      - "true"
      - "false"
  CPDExternalRegistry:
    Description: URL to external registry for CPD install. CPD images must already exist in the repo
    Type: String
    Default: "cp.icr.io"
  LicenseAgreement:
    Description: >-
      I have read and agreed to the license terms for IBM Cloud Pak for Data that were provided to me at time of purchase.
    Type: String
    Default: '-' 
    AllowedValues:
      - I agree
      - '-'
    ConstraintDescription: must answer 'I agree'
  Namespace:
    Description: >-
      The OpenShift project that will be created for deploying Cloud Pak for Data. It can be any lowercase string.
    Type: String
    Default: "zen"
  CloudFormationS3Bucket:
    Description: >-
      The cloud formation S3 bucket. This contains all template and config in respective folders.
    Type: String
    Default: "cp4d-ocp-cloudformation-dev"
  ProvisionEKS:
    Description: Provision EKS
    Type: String
    Default: "true"
    AllowedValues:
      - "true"
      - "false"
  EKSNodeInstanceType:
    Default: t3.medium
    AllowedValues:
      - a1.medium
      - a1.large
      - a1.xlarge
      - a1.2xlarge
      - a1.4xlarge
      - a1.metal
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - c5.4xlarge
      - c5.9xlarge
      - c5.12xlarge
      - c5.18xlarge
      - c5.24xlarge
      - c5.metal
      - c5a.large
      - c5a.xlarge
      - c5a.2xlarge
      - c5a.4xlarge
      - c5a.8xlarge
      - c5a.12xlarge
      - c5a.16xlarge
      - c5a.24xlarge
      - c5ad.large
      - c5ad.xlarge
      - c5ad.2xlarge
      - c5ad.4xlarge
      - c5ad.8xlarge
      - c5ad.12xlarge
      - c5ad.16xlarge
      - c5ad.24xlarge
      - c5d.large
      - c5d.xlarge
      - c5d.2xlarge
      - c5d.4xlarge
      - c5d.9xlarge
      - c5d.12xlarge
      - c5d.18xlarge
      - c5d.24xlarge
      - c5d.metal
      - c5n.large
      - c5n.xlarge
      - c5n.2xlarge
      - c5n.4xlarge
      - c5n.9xlarge
      - c5n.18xlarge
      - c5n.metal
      - c6a.large
      - c6a.xlarge
      - c6a.2xlarge
      - c6a.4xlarge
      - c6a.8xlarge
      - c6a.12xlarge
      - c6a.16xlarge
      - c6a.24xlarge
      - c6a.32xlarge
      - c6a.48xlarge
      - c6a.metal
      - c6g.medium
      - c6g.large
      - c6g.xlarge
      - c6g.2xlarge
      - c6g.4xlarge
      - c6g.8xlarge
      - c6g.12xlarge
      - c6g.16xlarge
      - c6g.metal
      - c6gd.medium
      - c6gd.large
      - c6gd.xlarge
      - c6gd.2xlarge
      - c6gd.4xlarge
      - c6gd.8xlarge
      - c6gd.12xlarge
      - c6gd.16xlarge
      - c6gd.metal
      - c6gn.medium
      - c6gn.large
      - c6gn.xlarge
      - c6gn.2xlarge
      - c6gn.4xlarge
      - c6gn.8xlarge
      - c6gn.12xlarge
      - c6gn.16xlarge
      - c6gn.metal
      - c6i.large
      - c6i.xlarge
      - c6i.2xlarge
      - c6i.4xlarge
      - c6i.8xlarge
      - c6i.12xlarge
      - c6i.16xlarge
      - c6i.24xlarge
      - c6i.32xlarge
      - c6i.metal
      - c6id.medium
      - c6id.large
      - c6id.xlarge
      - c6id.2xlarge
      - c6id.4xlarge
      - c6id.8xlarge
      - c6id.12xlarge
      - c6id.16xlarge
      - c6id.24xlarge
      - c6id.32xlarge
      - c6id.metal
      - c7g.medium
      - c7g.large
      - c7g.xlarge
      - c7g.2xlarge
      - c7g.4xlarge
      - c7g.8xlarge
      - c7g.12xlarge
      - c7g.16xlarge
      - cc2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - d3.xlarge
      - d3.2xlarge
      - d3.4xlarge
      - d3.8xlarge
      - d3en.xlarge
      - d3en.2xlarge
      - d3en.4xlarge
      - d3en.6xlarge
      - d3en.8xlarge
      - d3en.12xlarge
      - f1.2xlarge
      - f1.4xlarge
      - f1.16xlarge
      - g2.2xlarge
      - g2.8xlarge
      - g3.4xlarge
      - g3.8xlarge
      - g3.16xlarge
      - g3s.xlarge
      - g4ad.xlarge
      - g4ad.2xlarge
      - g4ad.4xlarge
      - g4ad.8xlarge
      - g4ad.12xlarge
      - g4ad.16xlarge
      - g4ad.metal
      - g4dn.xlarge
      - g4dn.2xlarge
      - g4dn.4xlarge
      - g4dn.8xlarge
      - g4dn.12xlarge
      - g4dn.16xlarge
      - g4dn.metal
      - g5.xlarge
      - g5.2xlarge
      - g5.4xlarge
      - g5.8xlarge
      - g5.12xlarge
      - g5.16xlarge
      - g5.24xlarge
      - g5.48xlarge
      - g5g.xlarge
      - g5g.2xlarge
      - g5g.4xlarge
      - g5g.8xlarge
      - g5g.16xlarge
      - g5g.metal
      - h1.2xlarge
      - h1.4xlarge
      - h1.8xlarge
      - h1.16xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - i3.large
      - i3.xlarge
      - i3.2xlarge
      - i3.4xlarge
      - i3.8xlarge
      - i3.16xlarge
      - i3.metal
      - i3en.large
      - i3en.xlarge
      - i3en.2xlarge
      - i3en.3xlarge
      - i3en.6xlarge
      - i3en.12xlarge
      - i3en.24xlarge
      - i3en.metal
      - i4i.large
      - i4i.xlarge
      - i4i.2xlarge
      - i4i.4xlarge
      - i4i.8xlarge
      - i4i.16xlarge
      - i4i.32xlarge
      - i4i.metal
      - im4gn.large
      - im4gn.xlarge
      - im4gn.2xlarge
      - im4gn.4xlarge
      - im4gn.8xlarge
      - im4gn.16xlarge
      - inf1.xlarge
      - inf1.2xlarge
      - inf1.6xlarge
      - inf1.24xlarge
      - is4gen.medium
      - is4gen.large
      - is4gen.xlarge
      - is4gen.2xlarge
      - is4gen.4xlarge
      - is4gen.8xlarge
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - m4.16xlarge
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5.4xlarge
      - m5.8xlarge
      - m5.12xlarge
      - m5.16xlarge
      - m5.24xlarge
      - m5.metal
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - m5a.4xlarge
      - m5a.8xlarge
      - m5a.12xlarge
      - m5a.16xlarge
      - m5a.24xlarge
      - m5ad.large
      - m5ad.xlarge
      - m5ad.2xlarge
      - m5ad.4xlarge
      - m5ad.8xlarge
      - m5ad.12xlarge
      - m5ad.16xlarge
      - m5ad.24xlarge
      - m5d.large
      - m5d.xlarge
      - m5d.2xlarge
      - m5d.4xlarge
      - m5d.8xlarge
      - m5d.12xlarge
      - m5d.16xlarge
      - m5d.24xlarge
      - m5d.metal
      - m5dn.large
      - m5dn.xlarge
      - m5dn.2xlarge
      - m5dn.4xlarge
      - m5dn.8xlarge
      - m5dn.12xlarge
      - m5dn.16xlarge
      - m5dn.24xlarge
      - m5dn.metal
      - m5n.large
      - m5n.xlarge
      - m5n.2xlarge
      - m5n.4xlarge
      - m5n.8xlarge
      - m5n.12xlarge
      - m5n.16xlarge
      - m5n.24xlarge
      - m5n.metal
      - m5zn.large
      - m5zn.xlarge
      - m5zn.2xlarge
      - m5zn.4xlarge
      - m5zn.8xlarge
      - m5zn.12xlarge
      - m5zn.16xlarge
      - m5zn.24xlarge
      - m5zn.metal
      - m6a.large
      - m6a.xlarge
      - m6a.2xlarge
      - m6a.4xlarge
      - m6a.8xlarge
      - m6a.12xlarge
      - m6a.16xlarge
      - m6a.24xlarge
      - m6a.32xlarge
      - m6a.48xlarge
      - m6a.metal
      - m6g.medium
      - m6g.large
      - m6g.xlarge
      - m6g.2xlarge
      - m6g.4xlarge
      - m6g.8xlarge
      - m6g.12xlarge
      - m6g.16xlarge
      - m6g.metal
      - m6gd.medium
      - m6gd.large
      - m6gd.xlarge
      - m6gd.2xlarge
      - m6gd.4xlarge
      - m6gd.8xlarge
      - m6gd.12xlarge
      - m6gd.16xlarge
      - m6gd.metal
      - m6i.large
      - m6i.xlarge
      - m6i.2xlarge
      - m6i.4xlarge
      - m6i.8xlarge
      - m6i.12xlarge
      - m6i.16xlarge
      - m6i.24xlarge
      - m6i.32xlarge
      - m6i.metal
      - m6id.large
      - m6id.xlarge
      - m6id.2xlarge
      - m6id.4xlarge
      - m6id.8xlarge
      - m6id.12xlarge
      - m6id.16xlarge
      - m6id.24xlarge
      - m6id.32xlarge
      - m6id.metal
      - p2.xlarge
      - p2.8xlarge
      - p2.16xlarge
      - p3.2xlarge
      - p3.8xlarge
      - p3.16xlarge
      - p3dn.24xlarge
      - p4d.24xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - r4.large
      - r4.xlarge
      - r4.2xlarge
      - r4.4xlarge
      - r4.8xlarge
      - r4.16xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5.4xlarge
      - r5.8xlarge
      - r5.12xlarge
      - r5.16xlarge
      - r5.24xlarge
      - r5.metal
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
      - r5a.4xlarge
      - r5a.8xlarge
      - r5a.12xlarge
      - r5a.16xlarge
      - r5a.24xlarge
      - r5ad.large
      - r5ad.xlarge
      - r5ad.2xlarge
      - r5ad.4xlarge
      - r5ad.8xlarge
      - r5ad.12xlarge
      - r5ad.16xlarge
      - r5ad.24xlarge
      - r5b.large
      - r5b.xlarge
      - r5b.2xlarge
      - r5b.4xlarge
      - r5b.8xlarge
      - r5b.12xlarge
      - r5b.16xlarge
      - r5b.24xlarge
      - r5b.metal
      - r5d.large
      - r5d.xlarge
      - r5d.2xlarge
      - r5d.4xlarge
      - r5d.8xlarge
      - r5d.12xlarge
      - r5d.16xlarge
      - r5d.24xlarge
      - r5d.metal
      - r5dn.large
      - r5dn.xlarge
      - r5dn.2xlarge
      - r5dn.4xlarge
      - r5dn.8xlarge
      - r5dn.12xlarge
      - r5dn.16xlarge
      - r5dn.24xlarge
      - r5dn.metal
      - r5n.large
      - r5n.xlarge
      - r5n.2xlarge
      - r5n.4xlarge
      - r5n.8xlarge
      - r5n.12xlarge
      - r5n.16xlarge
      - r5n.24xlarge
      - r5n.metal
      - r6g.medium
      - r6g.large
      - r6g.xlarge
      - r6g.2xlarge
      - r6g.4xlarge
      - r6g.8xlarge
      - r6g.12xlarge
      - r6g.16xlarge
      - r6g.metal
      - r6gd.medium
      - r6gd.large
      - r6gd.xlarge
      - r6gd.2xlarge
      - r6gd.4xlarge
      - r6gd.8xlarge
      - r6gd.12xlarge
      - r6gd.16xlarge
      - r6gd.metal
      - r6i.large
      - r6i.xlarge
      - r6i.2xlarge
      - r6i.4xlarge
      - r6i.8xlarge
      - r6i.12xlarge
      - r6i.16xlarge
      - r6i.24xlarge
      - r6i.32xlarge
      - r6i.metal
      - r6id.large
      - r6id.xlarge
      - r6id.2xlarge
      - r6id.4xlarge
      - r6id.8xlarge
      - r6id.12xlarge
      - r6id.16xlarge
      - r6id.24xlarge
      - r6id.32xlarge
      - r6id.metal
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - t2.xlarge
      - t2.2xlarge
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3.large
      - t3.xlarge
      - t3.2xlarge
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - t3a.large
      - t3a.xlarge
      - t3a.2xlarge
      - t4g.nano
      - t4g.micro
      - t4g.small
      - t4g.medium
      - t4g.large
      - t4g.xlarge
      - t4g.2xlarge
      - x1.16xlarge
      - x1.32xlarge
      - x1e.xlarge
      - x1e.2xlarge
      - x1e.4xlarge
      - x1e.8xlarge
      - x1e.16xlarge
      - x1e.32xlarge
      - x2gd.medium
      - x2gd.large
      - x2gd.xlarge
      - x2gd.2xlarge
      - x2gd.4xlarge
      - x2gd.8xlarge
      - x2gd.12xlarge
      - x2gd.16xlarge
      - x2gd.metal
      - x2idn.16xlarge
      - x2idn.24xlarge
      - x2idn.32xlarge
      - x2idn.metal
      - x2iedn.xlarge
      - x2iedn.2xlarge
      - x2iedn.4xlarge
      - x2iedn.8xlarge
      - x2iedn.16xlarge
      - x2iedn.24xlarge
      - x2iedn.32xlarge
      - x2iedn.metal
      - x2iezn.2xlarge
      - x2iezn.4xlarge
      - x2iezn.6xlarge
      - x2iezn.8xlarge
      - x2iezn.12xlarge
      - x2iezn.metal
      - z1d.large
      - z1d.xlarge
      - z1d.2xlarge
      - z1d.3xlarge
      - z1d.6xlarge
      - z1d.12xlarge
      - z1d.metal
    ConstraintDescription: Must be a valid EC2 instance type.
    Description: EC2 instance type.
    Type: String
  AdditionalEKSAdminUserArn:
    Default: ""
    AllowedPattern: '^arn:(aws|aws-cn|aws-us-gov):iam::[0-9]{12}:.*|^$'
    Description: "(Optional) IAM user Amazon Resource Name (ARN) to be granted administrative access to the EKS cluster."
    Type: String
  AdditionalEKSAdminRoleArn:
    Default: ""
    AllowedPattern: '^arn:(aws|aws-cn|aws-us-gov):iam::[0-9]{12}:.*|^$'
    Description: "(Optional) IAM role Amazon Resource Name (ARN) to be granted administrative access to the EKS cluster."
    Type: String


Rules:
  LicenseAgreementRule:
    Assertions:
    - Assert:
        Fn::Contains:
        - - I agree
        - Ref: LicenseAgreement
      AssertDescription: User must agree to the terms of the license agreement.

Conditions:
  3AZCondition: !Equals [!Ref NumberOfAZs, 3]
  ProvisionEksCondition: !Equals [!Ref ProvisionEKS, "true"]

Resources:
  VPCStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Join 
              - ''
              - - https://s3.amazonaws.com/ibm-aws-immersion-day/templates/ekscp4d450/vpc.yml
      Parameters:
        EKSClusterName: !Ref AWS::StackName
        AvailabilityZones: !Join [ ',', !Ref 'AvailabilityZones']
        NumberOfAZs: !Ref  NumberOfAZs
        PrivateSubnet1ACIDR: !Ref 'PrivateSubnet1CIDR'
        PrivateSubnet2ACIDR: !Ref 'PrivateSubnet2CIDR'
        PrivateSubnet3ACIDR: !Ref 'PrivateSubnet3CIDR'
        PrivateSubnetATag2: !Sub "kubernetes.io/cluster/${AWS::StackName}-${AWS::Region}=owned"
        PrivateSubnetATag3: "kubernetes.io/role/internal-elb="
        PublicSubnet1CIDR: !Ref 'PublicSubnet1CIDR'
        PublicSubnet2CIDR: !Ref 'PublicSubnet2CIDR'
        PublicSubnet3CIDR: !Ref 'PublicSubnet3CIDR'
        PublicSubnetTag2: !Sub "kubernetes.io/cluster/${AWS::StackName}-${AWS::Region}=owned"
        PublicSubnetTag3: "kubernetes.io/role/elb="
        VPCCIDR: !Ref 'VPCCIDR'

  PrerequisitesStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Join 
              - ''
              - - https://s3.amazonaws.com/ibm-aws-immersion-day/templates/ekscp4d450/prerequisites.yml
      Parameters:
        KeyPairName: !Ref AWS::StackName

  CloudPakDataStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Join
              - ''
              - - https://s3.amazonaws.com/ibm-aws-immersion-day/self-paced/templates/cluster.yml
      Parameters:
        DB2OLTP: !Ref DB2OLTP
        DV: !Ref DV
        WML: !Ref WML
        WSL: !Ref WSL
        WKC: !Ref WKC
        OpenScale: !Ref OpenScale
        CDE: !Ref CDE
        CA: !Ref CA
        Spark: !Ref Spark
        DATASTAGE: !Ref DATASTAGE
        APIUsername: !Ref APIUsername
        APIKey: !Ref APIKey
        KeyPairName: !GetAtt 'PrerequisitesStack.Outputs.KeyPairName'
        PrivateSubnet1ID: !GetAtt 'VPCStack.Outputs.PrivateSubnet1AID'
        PrivateSubnet2ID: !If
          - 3AZCondition
          - !GetAtt 'VPCStack.Outputs.PrivateSubnet2AID'
          - ""
        PrivateSubnet3ID: !If
          - 3AZCondition
          - !GetAtt 'VPCStack.Outputs.PrivateSubnet3AID'
          - ""
        PublicSubnet1ID: !GetAtt 'VPCStack.Outputs.PublicSubnet1ID'
        PublicSubnet2ID: !If
          - 3AZCondition
          - !GetAtt 'VPCStack.Outputs.PublicSubnet2ID'
          - ""
        PublicSubnet3ID: !If
          - 3AZCondition
          - !GetAtt 'VPCStack.Outputs.PublicSubnet3ID'
          - ""
        BootNodeAccessCIDR: !Ref 'BootNodeAccessCIDR'
        ClusterNetworkCIDR: !Ref 'ClusterNetworkCIDR'
        ClusterNetworkHostPrefix: !Ref 'ClusterNetworkHostPrefix'
        ServiceNetworkCIDR: !Ref ServiceNetworkCIDR
        RedhatPullSecret: !Ref 'RedhatPullSecret'
        VPCCIDR: !Ref 'VPCCIDR'
        VPCID: !GetAtt 'VPCStack.Outputs.VPCID'
        MasterInstanceType: !Ref 'MasterInstanceType'
        MasterVolumeIops: !Ref 'MasterVolumeIops'
        MasterVolumeSize: !Ref 'MasterVolumeSize'
        MasterVolumeType: !Ref 'MasterVolumeType'
        OCSInstanceType: !Ref 'OCSInstanceType'
        ComputeInstanceType: !Ref 'ComputeInstanceType'
        ComputeVolumeIops: !Ref 'ComputeVolumeIops'
        ComputeVolumeSize: !Ref 'ComputeVolumeSize'
        ComputeVolumeType: !Ref 'ComputeVolumeType'
        NumberOfAZs: !Ref NumberOfAZs
        AvailabilityZones: !Join [ ',', !Ref 'AvailabilityZones']
        NumberOfMaster: !Ref 'NumberOfMaster'
        NumberOfCompute: !Ref 'NumberOfCompute'
        ICPDDeploymentLogsBucketName: !GetAtt 'PrerequisitesStack.Outputs.S3BucketForLogs'
        DomainName: !Ref 'DomainName'
        ClusterName: !Ref AWS::StackName
        StorageType: !Ref StorageType
        PortworxClusterId: !Ref PortworxClusterId
        PortworxUserId: !Ref PortworxUserId
        PortworxOsbEndpoint: !Ref PortworxOsbEndpoint
        EnableFips: !Ref EnableFips
        PrivateCluster: !Ref PrivateCluster
        OpenshiftVersion: !Ref OpenshiftVersion
        OpenshiftUsername: !Ref OpenshiftUsername
        OpenshiftPassword: !Ref OpenshiftPassword
        EnableAutoscaler: !Ref EnableAutoscaler
        LicenseAgreement: !Ref LicenseAgreement
        Namespace: !Ref Namespace
        CPDExternalRegistry: !Ref CPDExternalRegistry

  EKSStack:
    Type: AWS::CloudFormation::Stack
    Condition: ProvisionEksCondition
    Properties:
      TemplateURL: !Join
              - ''
              - - https://s3.amazonaws.com/aws-quickstart/quickstart-amazon-eks/templates/amazon-eks-entrypoint-existing-vpc.template.yaml
      Parameters:
        KeyPairName: !GetAtt 'PrerequisitesStack.Outputs.KeyPairName'
#        QSS3BucketName: 'aws-quickstart'
#        QSS3KeyPrefix: 'quickstart-amazon-eks/'
        QSS3BucketRegion: !Sub "${AWS::Region}"
        RemoteAccessCIDR: !Ref 'BootNodeAccessCIDR'
        EKSPublicAccessEndpoint: Enabled
        AdditionalEKSAdminUserArn: !Ref AdditionalEKSAdminUserArn
        AdditionalEKSAdminRoleArn: !Ref AdditionalEKSAdminRoleArn
        NodeInstanceType: !Ref EKSNodeInstanceType
        NumberOfNodes: 2
        VPCID: !GetAtt 'VPCStack.Outputs.VPCID'
        PublicSubnet1ID: !GetAtt 'VPCStack.Outputs.PublicSubnet1ID'
        PublicSubnet2ID: !GetAtt 'VPCStack.Outputs.PublicSubnet2ID'
        PublicSubnet3ID: !GetAtt 'VPCStack.Outputs.PublicSubnet3ID'
        PrivateSubnet1ID: !GetAtt 'VPCStack.Outputs.PrivateSubnet1AID'
        PrivateSubnet2ID: !GetAtt 'VPCStack.Outputs.PrivateSubnet2AID'
        PrivateSubnet3ID: !GetAtt 'VPCStack.Outputs.PrivateSubnet3AID'
        ClusterAutoScaler: Enabled
        ProvisionBastionHost: Enabled
        ALBIngressController: Enabled
        EKSClusterName: !Ref AWS::StackName
#        PerAccountSharedResources: 'No'
#        PerRegionSharedResources: 'No'
        PerAccountSharedResources: 'AutoDetect'
        PerRegionSharedResources: 'AutoDetect'

Outputs:
  BootnodePublicIp:
    Description: The boot node public IP address.
    Value: !GetAtt 'CloudPakDataStack.Outputs.BootnodePublicIp'
  OpenShiftUI:
    Description: The URL for the OpenShift UI.
    Value: !GetAtt 'CloudPakDataStack.Outputs.OpenshiftURLValue'
  ICPDWebClientURL:
    Description: CloudPak for Data web client URL.
    Value: !GetAtt 'CloudPakDataStack.Outputs.ICPDWebClientURL'
  OpenshiftPassword:
    Description: OpenShift password secret.
    Value: !GetAtt 'CloudPakDataStack.Outputs.OpenshiftPassword'
