Provide a simple LDAP service

Add LDAP stack to deploy a simple OpenLDAP configuration and
its admin server.

This can be used in any cookbook to provide Gerrit an
LDAP service for authentication.

Feature: Issue 12484
Change-Id: I0cc0276ef37c8a044882e85bfa9f0d5c2eff481a
diff --git a/ldap/Makefile b/ldap/Makefile
new file mode 100644
index 0000000..646569d
--- /dev/null
+++ b/ldap/Makefile
@@ -0,0 +1,21 @@
+LDAP_TEMPLATE:=cf-ldap.yml
+AWS_REGION:=us-east-1
+AWS_FC_COMMAND=export AWS_PAGER=;aws cloudformation
+LDAP_STACK_NAME:=gerrit-ldap
+HOSTED_ZONE_NAME:=mycompany.com
+
+.PHONY: ldap delete-ldap
+
+ldap:
+	$(AWS_FC_COMMAND) create-stack \
+		--stack-name $(LDAP_STACK_NAME) \
+		--capabilities CAPABILITY_IAM  \
+		--template-body file://`pwd`/$(LDAP_TEMPLATE) \
+		--region $(AWS_REGION) \
+		--parameters \
+		ParameterKey=HostedZoneName,ParameterValue=$(HOSTED_ZONE_NAME)
+
+delete-ldap:
+	$(AWS_FC_COMMAND) delete-stack \
+	--stack-name $(LDAP_STACK_NAME) \
+	--region $(AWS_REGION)
diff --git a/ldap/README.md b/ldap/README.md
new file mode 100644
index 0000000..f56737a
--- /dev/null
+++ b/ldap/README.md
@@ -0,0 +1,59 @@
+# LDAP
+
+This is a set of Cloud Formation Templates and scripts to spin up a simple LDAP
+service and its Admin panel.
+
+It can be used to provide a simple LDAP instance to be used to integrate with
+any Gerrit setup in the different cookbooks.
+
+## How to run it
+
+### Prerequisites
+
+As a prerequisite to run this stack, you will need a registered and correctly
+configured domain in [Route53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started.html)
+
+### Getting Started
+
+* Create a key pair to access the EC2 instances in the cluster:
+
+```
+aws ec2 create-key-pair --key-name gerrit-cluster-keys \
+  --query 'KeyMaterial' --output text > gerrit-cluster.pem
+```
+
+*NOTE: the EC2 key pair are useful when you need to connect to the EC2 instances
+for troubleshooting purposes. Store them in a `pem` file to use when ssh-ing into your
+instances as follow: `ssh -i yourKeyPairs.pem <ec2_instance_ip>`*
+
+* Create the LDAP stack:
+
+```
+make ldap HOSTED_ZONE_NAME=mycompany.com
+```
+
+The `HOSTED_ZONE_NAME` value is the Hosted Zone Name where a DSN route pointing
+to the LDAP service will be created.
+
+### Cleaning up
+
+```
+make delete-ldap
+```
+
+### Access your LDAP instance
+
+* LDAP Service:
+ * **URI**: ldap://gerrit-ldap.gerritforgeaws.com
+ * **Port**: 636
+* LDAP Admin Service:
+ * **URI**: https://gerrit-ldap.mycompany.com
+ * **Port**: 6443
+ * **Username**: cn=admin,dc=example,dc=org
+ * **Password**: secret
+
+The LDAP instance provided already has a Gerrit Admin user baked in with the
+following credentials:
+
+* **Username**: gerritadmin
+* **Password**: secret
diff --git a/ldap/cf-ldap.yml b/ldap/cf-ldap.yml
new file mode 100644
index 0000000..0c0dbd4
--- /dev/null
+++ b/ldap/cf-ldap.yml
@@ -0,0 +1,76 @@
+---
+AWSTemplateFormatVersion: '2010-09-09'
+Description: 'AWS CloudFormation Template to Deploy a single EC2 instance
+  with OpenLDAP Installed and configured with a Gerrit Admin User'
+Parameters:
+  KeyName:
+    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
+    Type: AWS::EC2::KeyPair::KeyName
+    Default: gerrit-cluster-keys
+    ConstraintDescription: must be the name of an existing EC2 KeyPair.
+  InstanceType:
+    Description: EC2 instance type
+    Type: String
+    Default: t2.micro
+  HostedZoneName:
+    Description: The route53 HostedZoneName.
+    Type: String
+Resources:
+  EC2Instance:
+    Type: AWS::EC2::Instance
+    Properties:
+      InstanceType: !Ref InstanceType
+      SecurityGroups:
+        - !Ref InstanceSecurityGroup
+      KeyName: !Ref KeyName
+      ImageId: ami-0472cbe99b81a694a
+      UserData:
+        Fn::Base64: !Sub |
+          #!/bin/bash -xe
+          su - ec2-user bash -c "docker-compose up"
+  InstanceSecurityGroup:
+    Type: AWS::EC2::SecurityGroup
+    Properties:
+      GroupDescription: Enable SSH access via port 22
+      SecurityGroupIngress:
+      - CidrIp: 0.0.0.0/0
+        IpProtocol: -1
+  LDAPDnsRecord:
+      Type: AWS::Route53::RecordSet
+      Properties:
+        Name: !Sub 'gerrit-ldap.${HostedZoneName}'
+        HostedZoneName: !Sub '${HostedZoneName}.'
+        Comment: DNS name for LDAP Test instance.
+        Type: A
+        TTL: '60'
+        ResourceRecords:
+          - !GetAtt EC2Instance.PublicIp
+Outputs:
+  InstanceId:
+    Description: InstanceId of the newly created EC2 instance
+    Value:
+      Ref: EC2Instance
+  AZ:
+    Description: Availability Zone of the newly created EC2 instance
+    Value:
+      Fn::GetAtt:
+      - EC2Instance
+      - AvailabilityZone
+  PublicDNS:
+    Description: Public DNSName of the newly created EC2 instance
+    Value:
+      Fn::GetAtt:
+      - EC2Instance
+      - PublicDnsName
+  PublicIP:
+    Description: Public IP address of the newly created EC2 instance
+    Value:
+      Fn::GetAtt:
+      - EC2Instance
+      - PublicIp
+  LDAPAdminWebUrl:
+    Description: LDAP Admin URL
+    Value: !Sub 'https://gerrit-ldap.${HostedZoneName}:6443'
+  LDAPServiceUrl:
+    Description: LDAP Service URL
+    Value: !Sub 'ldap://gerrit-ldap.${HostedZoneName}:636'