Allow slave to run on multiple EC2 instances
Currently git daemon, ssh agent and Gerrit are part of different tasks.
When scaling up the number of instances in the cluster, the containers
running the different services might end up in different EC2 instances.
This wouldn't allow them to share the git volumes, preventing the
slave service as a whole to work.
This change group all the tasks together and adds a wait loop in the
Gerrit startup script. This is not ideal, but it is the change with
minimum impact on the current architecture.
Bug: Issue 12848
Change-Id: Ia7b150b32554d025ebd48c69a3264477c23cf5dc
diff --git a/dual-master/cf-service-slave.yml b/dual-master/cf-service-slave.yml
index 7415836..c03e973 100644
--- a/dual-master/cf-service-slave.yml
+++ b/dual-master/cf-service-slave.yml
@@ -109,6 +109,8 @@
DependsOn:
- HTTPListener
- SSHListener
+ - GitListener
+ - GitSSHListener
Properties:
Cluster:
Fn::ImportValue:
@@ -122,19 +124,6 @@
- ContainerName: !Ref GerritServiceName
ContainerPort: !Ref SSHContainerPort
TargetGroupArn: !Ref SSHTargetGroup
-
- GerritReplicationService:
- Type: AWS::ECS::Service
- DependsOn:
- - GitListener
- - GitSSHListener
- Properties:
- Cluster:
- Fn::ImportValue:
- !Join [':', [!Ref 'ClusterStackName', 'ClusterName']]
- DesiredCount: !Ref DesiredCount
- TaskDefinition: !Ref GerritReplicationTaskDefinition
- LoadBalancers:
- ContainerName: !Ref GitDaemonServiceName
ContainerPort: !Ref GitPort
TargetGroupArn: !Ref GitTargetGroup
@@ -190,51 +179,6 @@
awslogs-group: !Ref ClusterStackName
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: !Ref EnvironmentName
- Volumes:
- - Name: !Ref 'GerritDbVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-db: !Join ['-', [!Ref EnvironmentName, !Ref GerritDbVolume]]
- - Name: !Ref 'GerritGitVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-git: !Join ['-', [!Ref EnvironmentName, !Ref GerritGitVolume]]
- - Name: !Ref 'GerritDataVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-data: !Join ['-', [!Ref EnvironmentName, !Ref GerritDataVolume]]
- - Name: !Ref 'GerritCacheVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-cache: !Join ['-', [!Ref EnvironmentName, !Ref GerritCacheVolume]]
- - Name: !Ref 'GerritLogsVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-logs: !Join ['-', [!Ref EnvironmentName, !Ref GerritLogsVolume]]
-
- GerritReplicationTaskDefinition:
- Type: AWS::ECS::TaskDefinition
- Properties:
- Family: !Join ['', [!Ref GerritServiceName, TaskDefinition]]
- TaskRoleArn: !Ref ECSTaskExecutionRole
- ExecutionRoleArn: !Ref ECSTaskExecutionRole
- NetworkMode: bridge
- ContainerDefinitions:
- Name: !Ref GitDaemonServiceName
Essential: true
Image: !Sub '${DockerRegistryUrl}/${GitDaemonDockerImage}'
@@ -281,6 +225,13 @@
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: !Ref EnvironmentName
Volumes:
+ - Name: !Ref 'GerritDbVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-db: !Join ['-', [!Ref EnvironmentName, !Ref GerritDbVolume]]
- Name: !Ref 'GerritGitVolume'
DockerVolumeConfiguration:
Scope: shared
@@ -288,6 +239,27 @@
Driver: local
Labels:
gerrit-git: !Join ['-', [!Ref EnvironmentName, !Ref GerritGitVolume]]
+ - Name: !Ref 'GerritDataVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-data: !Join ['-', [!Ref EnvironmentName, !Ref GerritDataVolume]]
+ - Name: !Ref 'GerritCacheVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-cache: !Join ['-', [!Ref EnvironmentName, !Ref GerritCacheVolume]]
+ - Name: !Ref 'GerritLogsVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-logs: !Join ['-', [!Ref EnvironmentName, !Ref GerritLogsVolume]]
LoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
@@ -310,7 +282,7 @@
!Join [':', [!Ref 'ClusterStackName', 'VPCId']]
Port: !Ref HTTPHostPort
Protocol: TCP
- HealthCheckPort: !Ref HTTPContainePort
+ HealthCheckPort: !Ref HTTPHostPort
HTTPListener:
Type: AWS::ElasticLoadBalancingV2::Listener
@@ -334,7 +306,7 @@
!Join [':', [!Ref 'ClusterStackName', 'VPCId']]
Port: !Ref SSHHostPort
Protocol: TCP
- HealthCheckPort: !Ref SSHContainerPort
+ HealthCheckPort: !Ref SSHHostPort
SSHListener:
Type: AWS::ElasticLoadBalancingV2::Listener
diff --git a/gerrit/entrypoint.sh b/gerrit/entrypoint.sh
index 78f0b84..4ceb995 100755
--- a/gerrit/entrypoint.sh
+++ b/gerrit/entrypoint.sh
@@ -7,8 +7,19 @@
if [ $CONTAINER_SLAVE ]; then
echo "Slave mode..."
+
+ if [ ! -d /var/gerrit/git/All-Projects.git ] ||
+ [ ! -d /var/gerrit/git/All-Users.git ] ||
+ [ `git --git-dir=/var/gerrit/git/All-Projects.git show-ref | wc -l` -eq 0 ] ||
+ [ `git --git-dir=/var/gerrit/git/All-Users.git show-ref | wc -l` -eq 0 ]; then
+ echo "Init phase..."
+ java -jar /var/gerrit/bin/gerrit.war init --no-auto-start --batch --install-all-plugins -d /var/gerrit
+ else
+ echo "Reindexing phase..."
+ java -jar /var/gerrit/bin/gerrit.war reindex --index groups
+ fi
rm -fr /var/gerrit/plugins/replication.jar
- java -jar /var/gerrit/bin/gerrit.war reindex --index groups
+
else
echo "Master mode (init phase)..."
java -jar /var/gerrit/bin/gerrit.war init --no-auto-start --batch --install-all-plugins -d /var/gerrit
diff --git a/master-slave/Makefile b/master-slave/Makefile
index 77ee882..0c487d0 100644
--- a/master-slave/Makefile
+++ b/master-slave/Makefile
@@ -16,8 +16,8 @@
create-all: gerrit-publish git-daemon-publish git-ssh-publish \
cluster wait-for-cluster-creation \
- service-slave wait-for-service-slave-creation \
- service-master wait-for-service-master-creation \
+ service-slave service-master \
+ wait-for-service-master-creation wait-for-service-slave-creation \
dns-routing wait-for-dns-routing-creation
cluster: cluster-keys
diff --git a/master-slave/cf-service-slave.yml b/master-slave/cf-service-slave.yml
index 7415836..c03e973 100644
--- a/master-slave/cf-service-slave.yml
+++ b/master-slave/cf-service-slave.yml
@@ -109,6 +109,8 @@
DependsOn:
- HTTPListener
- SSHListener
+ - GitListener
+ - GitSSHListener
Properties:
Cluster:
Fn::ImportValue:
@@ -122,19 +124,6 @@
- ContainerName: !Ref GerritServiceName
ContainerPort: !Ref SSHContainerPort
TargetGroupArn: !Ref SSHTargetGroup
-
- GerritReplicationService:
- Type: AWS::ECS::Service
- DependsOn:
- - GitListener
- - GitSSHListener
- Properties:
- Cluster:
- Fn::ImportValue:
- !Join [':', [!Ref 'ClusterStackName', 'ClusterName']]
- DesiredCount: !Ref DesiredCount
- TaskDefinition: !Ref GerritReplicationTaskDefinition
- LoadBalancers:
- ContainerName: !Ref GitDaemonServiceName
ContainerPort: !Ref GitPort
TargetGroupArn: !Ref GitTargetGroup
@@ -190,51 +179,6 @@
awslogs-group: !Ref ClusterStackName
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: !Ref EnvironmentName
- Volumes:
- - Name: !Ref 'GerritDbVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-db: !Join ['-', [!Ref EnvironmentName, !Ref GerritDbVolume]]
- - Name: !Ref 'GerritGitVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-git: !Join ['-', [!Ref EnvironmentName, !Ref GerritGitVolume]]
- - Name: !Ref 'GerritDataVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-data: !Join ['-', [!Ref EnvironmentName, !Ref GerritDataVolume]]
- - Name: !Ref 'GerritCacheVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-cache: !Join ['-', [!Ref EnvironmentName, !Ref GerritCacheVolume]]
- - Name: !Ref 'GerritLogsVolume'
- DockerVolumeConfiguration:
- Scope: shared
- Autoprovision: true
- Driver: local
- Labels:
- gerrit-logs: !Join ['-', [!Ref EnvironmentName, !Ref GerritLogsVolume]]
-
- GerritReplicationTaskDefinition:
- Type: AWS::ECS::TaskDefinition
- Properties:
- Family: !Join ['', [!Ref GerritServiceName, TaskDefinition]]
- TaskRoleArn: !Ref ECSTaskExecutionRole
- ExecutionRoleArn: !Ref ECSTaskExecutionRole
- NetworkMode: bridge
- ContainerDefinitions:
- Name: !Ref GitDaemonServiceName
Essential: true
Image: !Sub '${DockerRegistryUrl}/${GitDaemonDockerImage}'
@@ -281,6 +225,13 @@
awslogs-region: !Ref AWS::Region
awslogs-stream-prefix: !Ref EnvironmentName
Volumes:
+ - Name: !Ref 'GerritDbVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-db: !Join ['-', [!Ref EnvironmentName, !Ref GerritDbVolume]]
- Name: !Ref 'GerritGitVolume'
DockerVolumeConfiguration:
Scope: shared
@@ -288,6 +239,27 @@
Driver: local
Labels:
gerrit-git: !Join ['-', [!Ref EnvironmentName, !Ref GerritGitVolume]]
+ - Name: !Ref 'GerritDataVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-data: !Join ['-', [!Ref EnvironmentName, !Ref GerritDataVolume]]
+ - Name: !Ref 'GerritCacheVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-cache: !Join ['-', [!Ref EnvironmentName, !Ref GerritCacheVolume]]
+ - Name: !Ref 'GerritLogsVolume'
+ DockerVolumeConfiguration:
+ Scope: shared
+ Autoprovision: true
+ Driver: local
+ Labels:
+ gerrit-logs: !Join ['-', [!Ref EnvironmentName, !Ref GerritLogsVolume]]
LoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
@@ -310,7 +282,7 @@
!Join [':', [!Ref 'ClusterStackName', 'VPCId']]
Port: !Ref HTTPHostPort
Protocol: TCP
- HealthCheckPort: !Ref HTTPContainePort
+ HealthCheckPort: !Ref HTTPHostPort
HTTPListener:
Type: AWS::ElasticLoadBalancingV2::Listener
@@ -334,7 +306,7 @@
!Join [':', [!Ref 'ClusterStackName', 'VPCId']]
Port: !Ref SSHHostPort
Protocol: TCP
- HealthCheckPort: !Ref SSHContainerPort
+ HealthCheckPort: !Ref SSHHostPort
SSHListener:
Type: AWS::ElasticLoadBalancingV2::Listener