Allow usage of predefined Network Stack

Some organisations already have predefined Network Stack.
aws-gerrit should be able to use them instead of creating
new one.

Feature: Issue 13161
Change-Id: I5f1ab54391916b29ac6b42ff55d22edac9c07456
diff --git a/Configuration.md b/Configuration.md
index 9003d14..57ae5eb 100644
--- a/Configuration.md
+++ b/Configuration.md
@@ -43,6 +43,8 @@
   If not set, create a new Internet Gateway
 * `VPC_ID`: Optional. Id of the existing VPC.
   If not set, create a new VPC.
+* `SUBNET_ID`: Optional. Id of the existing Subnet.
+  If not set, create a new Network Stack.
 
 #### LDAP
 
diff --git a/common-templates/cf-gerrit-network-stack.yml b/common-templates/cf-gerrit-network-stack.yml
index f856091..8017fb2 100644
--- a/common-templates/cf-gerrit-network-stack.yml
+++ b/common-templates/cf-gerrit-network-stack.yml
@@ -10,6 +10,10 @@
     Type: String
     Default: ""
     Description: VPC id. If empty VPC will be created
+  SubnetIdProp:
+    Type: String
+    Default: ""
+    Description: Subnet id. If empty Network Stack will be created
 Mappings:
   # Hard values for the subnet masks. These masks define
   # the range of internal IP addresses that can be assigned.
@@ -24,8 +28,11 @@
       CIDR: '10.0.0.0/24'
 
 Conditions:
-  CreateInternetGateway: !Equals [!Ref InternetGatewayIdProp, ""]
   CreateVPC: !Equals [!Ref VPCIdProp, ""]
+  CreateNetworkStack: !Equals [!Ref SubnetIdProp, ""]
+  CreateInternetGateway: !And
+     - !Equals [!Ref InternetGatewayIdProp, ""]
+     - !Condition CreateNetworkStack
 Resources:
   VPC:
     Condition: CreateVPC
@@ -37,6 +44,7 @@
 
   # Public subnets, where containers can have public IP addresses
   PublicSubnetOne:
+    Condition: CreateNetworkStack
     Type: AWS::EC2::Subnet
     Properties:
       AvailabilityZone:
@@ -54,15 +62,18 @@
     Condition: CreateInternetGateway
     Type: AWS::EC2::InternetGateway
   GatewayAttachement:
+    Condition: CreateNetworkStack
     Type: AWS::EC2::VPCGatewayAttachment
     Properties:
       VpcId: !If [CreateVPC, !Ref 'VPC', !Ref 'VPCIdProp' ]
       InternetGatewayId: !If [CreateInternetGateway, !Ref 'InternetGateway', !Ref 'InternetGatewayIdProp' ]
   PublicRouteTable:
+    Condition: CreateNetworkStack
     Type: AWS::EC2::RouteTable
     Properties:
       VpcId: !If [CreateVPC, !Ref 'VPC', !Ref 'VPCIdProp' ]
   PublicRoute:
+    Condition: CreateNetworkStack
     Type: AWS::EC2::Route
     DependsOn: GatewayAttachement
     Properties:
@@ -70,6 +81,7 @@
       DestinationCidrBlock: '0.0.0.0/0'
       GatewayId: !If [CreateInternetGateway, !Ref 'InternetGateway', !Ref 'InternetGatewayIdProp' ]
   PublicSubnetOneRouteTableAssociation:
+    Condition: CreateNetworkStack
     Type: AWS::EC2::SubnetRouteTableAssociation
     Properties:
       SubnetId: !Ref PublicSubnetOne
@@ -78,6 +90,6 @@
   VPCRef:
     Value: !If [CreateVPC, !Ref 'VPC', !Ref 'VPCIdProp' ]
   PublicSubnetOneRef:
-    Value: !Ref PublicSubnetOne
+    Value: !If [CreateNetworkStack, !Ref 'PublicSubnetOne', !Ref 'SubnetIdProp' ]
   PublicOneCIDR:
     Value: !FindInMap ['SubnetConfig', 'PublicOne', 'CIDR']
diff --git a/dual-master/Makefile b/dual-master/Makefile
index 007158d..15d2b86 100644
--- a/dual-master/Makefile
+++ b/dual-master/Makefile
@@ -40,6 +40,7 @@
 		ParameterKey=ECSKeyName,ParameterValue=$(CLUSTER_KEYS) \
 		ParameterKey=InternetGatewayIdProp,ParameterValue=$(INTERNET_GATEWAY_ID) \
 		ParameterKey=VPCIdProp,ParameterValue=$(VPC_ID) \
+		ParameterKey=SubnetIdProp,ParameterValue=$(SUBNET_ID) \
 		$(OPTIONAL_PARAMS)
 
 service-master-1:
diff --git a/dual-master/cf-cluster.yml b/dual-master/cf-cluster.yml
index ccc78ee..6eec872 100644
--- a/dual-master/cf-cluster.yml
+++ b/dual-master/cf-cluster.yml
@@ -33,6 +33,10 @@
     Type: String
     Default: ""
     Description: VPC id. If empty VPC will be created
+  SubnetIdProp:
+    Type: String
+    Default: ""
+    Description: Subnet id. If empty Network Stack will be created
   ECSKeyName:
     Type: String
     Default: gerrit-cluster-keys
@@ -261,6 +265,7 @@
       Parameters:
         InternetGatewayIdProp: !Ref 'InternetGatewayIdProp'
         VPCIdProp: !Ref 'VPCIdProp'
+        SubnetIdProp: !Ref 'SubnetIdProp'
 
 Outputs:
   ClusterName:
diff --git a/master-slave/Makefile b/master-slave/Makefile
index 9b6b70c..b9a382f 100644
--- a/master-slave/Makefile
+++ b/master-slave/Makefile
@@ -37,6 +37,7 @@
 		ParameterKey=ECSKeyName,ParameterValue=$(CLUSTER_KEYS) \
 		ParameterKey=InternetGatewayIdProp,ParameterValue=$(INTERNET_GATEWAY_ID) \
 		ParameterKey=VPCIdProp,ParameterValue=$(VPC_ID) \
+		ParameterKey=SubnetIdProp,ParameterValue=$(SUBNET_ID) \
 		$(OPTIONAL_PARAMS)
 
 service-master:
diff --git a/master-slave/cf-cluster.yml b/master-slave/cf-cluster.yml
index d3a24fd..c3c64f0 100644
--- a/master-slave/cf-cluster.yml
+++ b/master-slave/cf-cluster.yml
@@ -33,6 +33,10 @@
     Type: String
     Default: ""
     Description: VPC id. If empty VPC will be created
+  SubnetIdProp:
+    Type: String
+    Default: ""
+    Description: Subnet id. If empty Network Stack will be created
   ECSKeyName:
     Type: String
     Default: gerrit-cluster-keys
@@ -205,6 +209,7 @@
       Parameters:
         InternetGatewayIdProp: !Ref 'InternetGatewayIdProp'
         VPCIdProp: !Ref 'VPCIdProp'
+        SubnetIdProp: !Ref 'SubnetIdProp'
 
 Outputs:
   ClusterName:
diff --git a/single-master/Makefile b/single-master/Makefile
index 95a1f98..96d133c 100644
--- a/single-master/Makefile
+++ b/single-master/Makefile
@@ -33,6 +33,7 @@
 		ParameterKey=ECSKeyName,ParameterValue=$(CLUSTER_KEYS) \
 		ParameterKey=InternetGatewayIdProp,ParameterValue=$(INTERNET_GATEWAY_ID) \
 		ParameterKey=VPCIdProp,ParameterValue=$(VPC_ID) \
+		ParameterKey=SubnetIdProp,ParameterValue=$(SUBNET_ID) \
 		$(OPTIONAL_PARAMS)
 
 service:
diff --git a/single-master/cf-cluster.yml b/single-master/cf-cluster.yml
index 4072f04..239ed31 100644
--- a/single-master/cf-cluster.yml
+++ b/single-master/cf-cluster.yml
@@ -33,6 +33,10 @@
     Type: String
     Default: ""
     Description: VPC id. If empty VPC will be created
+  SubnetIdProp:
+    Type: String
+    Default: ""
+    Description: Subnet id. If empty Network Stack will be created
   ECSKeyName:
     Type: String
     Default: gerrit-cluster-keys
@@ -181,6 +185,7 @@
       Parameters:
         InternetGatewayIdProp: !Ref 'InternetGatewayIdProp'
         VPCIdProp: !Ref 'VPCIdProp'
+        SubnetIdProp: !Ref 'SubnetIdProp'
 
 Outputs:
   ClusterName: