Add HA plugin to the dual-master receipt
Include the installation and configuration of the
high-availability plugin in static peer mode.
This improvement allows to have the near-real-time sync
of indexes, caches and sessions between the two masters.
Feature: Issue 12753
Change-Id: I60c18868d0ba33f24180ac7a3df46c0eba260dd8
diff --git a/dual-master/Makefile b/dual-master/Makefile
index 0d168e7..d91e7c6 100644
--- a/dual-master/Makefile
+++ b/dual-master/Makefile
@@ -13,8 +13,8 @@
gerrit-build gerrit-publish
create-all: cluster wait-for-cluster-creation \
- service-master-1 service-master-2 \
- wait-for-service-master-1-creation wait-for-service-master-2-creation \
+ service-master-1 wait-for-service-master-1-creation \
+ service-master-2 wait-for-service-master-2-creation \
dns-routing wait-for-dns-routing-creation
cluster: cluster-keys
@@ -40,6 +40,7 @@
ParameterKey=DockerRegistryUrl,ParameterValue=$(DOCKER_REGISTRY_URI) \
ParameterKey=CertificateArn,ParameterValue=$(SSL_CERTIFICATE_ARN) \
ParameterKey=GerritKeyPrefix,ParameterValue=$(GERRIT_KEY_PREFIX)\
+ ParameterKey=PeerSubdomain,ParameterValue=$(MASTER2_SUBDOMAIN) \
ParameterKey=DockerImage,ParameterValue=aws-gerrit/gerrit:$(IMAGE_TAG)
service-master-2:
@@ -62,7 +63,8 @@
ParameterKey=GerritIndexVolume,ParameterValue=gerrit-index-master-2 \
ParameterKey=GerritCacheVolume,ParameterValue=gerrit-cache-master-2 \
ParameterKey=GerritDbVolume,ParameterValue=gerrit-db-master-2 \
- ParameterKey=GerritLogsVolume,ParameterValue=gerrit-logs-master-2
+ ParameterKey=GerritLogsVolume,ParameterValue=gerrit-logs-master-2 \
+ ParameterKey=PeerSubdomain,ParameterValue=$(MASTER1_SUBDOMAIN)
dns-routing:
$(AWS_FC_COMMAND) create-stack \
@@ -109,12 +111,19 @@
--region $(AWS_REGION)
@echo "*** Cluster stack '$(CLUSTER_STACK_NAME)' deleted"
-wait-for-service-master-deletion:
- @echo "*** Wait for service master stack '$(SERVICE_MASTER_STACK_NAME)' deletion"
+wait-for-service-master-1-deletion:
+ @echo "*** Wait for service master stack '$(SERVICE_MASTER1_STACK_NAME)' deletion"
$(AWS_FC_COMMAND) wait stack-delete-complete \
--stack-name $(SERVICE_MASTER1_STACK_NAME) \
--region $(AWS_REGION)
- @echo "*** Service stack master '$(SERVICE_MASTER_STACK_NAME)' deleted"
+ @echo "*** Service stack master '$(SERVICE_MASTER1_STACK_NAME)' deleted"
+
+wait-for-service-master-2-deletion:
+ @echo "*** Wait for service master stack '$(SERVICE_MASTER2_STACK_NAME)' deletion"
+ $(AWS_FC_COMMAND) wait stack-delete-complete \
+ --stack-name $(SERVICE_MASTER2_STACK_NAME) \
+ --region $(AWS_REGION)
+ @echo "*** Service stack master '$(SERVICE_MASTER2_STACK_NAME)' deleted"
wait-for-dns-routing-deletion:
@echo "*** Wait for DNS routing stack '$(DNS_ROUTING_STACK_NAME)' deletion"
diff --git a/dual-master/cf-cluster.yml b/dual-master/cf-cluster.yml
index 24d1b31..4197929 100644
--- a/dual-master/cf-cluster.yml
+++ b/dual-master/cf-cluster.yml
@@ -166,6 +166,7 @@
&& s=0 && break || s=$? && sleep 5;
done; (exit $s)
mkdir $DIR_TGT/git
+ mkdir $DIR_TGT/high-availability
chown -R 1000:1000 $DIR_TGT
cp -p /etc/fstab /etc/fstab.back-$(date +%F)
echo -e \"$DIR_SRC:/ \t\t $DIR_TGT \t\t nfs \t\t defaults \t\t 0 \t\t 0\" | tee -a /etc/fstab
diff --git a/dual-master/cf-service-master.yml b/dual-master/cf-service-master.yml
index 29b4322..b97fa2c 100644
--- a/dual-master/cf-service-master.yml
+++ b/dual-master/cf-service-master.yml
@@ -63,10 +63,17 @@
GerritKeyPrefix:
Description: Gerrit credentials keys prefix
Type: String
+ PeerSubdomain:
+ Description: The subdomain of the Gerrit cluster
+ Type: String
GerritGitVolume:
Description: Gerrit git volume name
Type: String
Default: gerrit-git-master
+ GerritWebsessionsVolume:
+ Description: Gerrit git volume name
+ Type: String
+ Default: gerrit-ha-websessions-master
GerritDataVolume:
Description: Gerrit data volume name
Type: String
@@ -130,9 +137,17 @@
Value: false
- Name: GERRIT_KEY_PREFIX
Value: !Ref GerritKeyPrefix
+ - Name: SETUP_HA
+ Value: true
+ - Name: HA_PEER_URL
+ Value: !Sub 'https://${PeerSubdomain}.${HostedZoneName}'
+ - Name: HOSTED_ZONE_NAME
+ Value: !Ref HostedZoneName
MountPoints:
- SourceVolume: !Ref GerritGitVolume
ContainerPath: /var/gerrit/git
+ - SourceVolume: !Ref GerritWebsessionsVolume
+ ContainerPath: /var/gerrit/high-availability
- SourceVolume: !Ref GerritDataVolume
ContainerPath: /var/gerrit/data
- SourceVolume: !Ref GerritIndexVolume
@@ -162,6 +177,9 @@
- Name: !Ref 'GerritGitVolume'
Host:
SourcePath: "/mnt/efs/gerrit-shared/git"
+ - Name: !Ref 'GerritWebsessionsVolume'
+ Host:
+ SourcePath: "/mnt/efs/gerrit-shared/high-availability"
- Name: !Ref 'GerritDbVolume'
DockerVolumeConfiguration:
Scope: shared
diff --git a/gerrit/Makefile b/gerrit/Makefile
index bc39a08..7b9d7eb 100644
--- a/gerrit/Makefile
+++ b/gerrit/Makefile
@@ -18,6 +18,11 @@
-O ./plugins/javamelody.jar \
|| { echo >&2 "Cannot download javamelody plugin: Check internet connection. Aborting"; exit 1; }
+ @echo "Downloading HA plugin $(GERRIT_BRANCH)"
+ wget $(GERRIT_CI)/plugin-high-availability-bazel-$(GERRIT_BRANCH)/$(LAST_BUILD)/high-availability/high-availability.jar \
+ -O ./plugins/high-availability.jar \
+ || { echo >&2 "Cannot download high-availability plugin: Check internet connection. Aborting"; exit 1; }
+
gerrit-build:
cat Dockerfile | \
GERRIT_VERSION=$(GERRIT_VERSION) GERRIT_PATCH=$(GERRIT_PATCH) envsubst | \
diff --git a/gerrit/etc/gerrit.config.template b/gerrit/etc/gerrit.config.template
index 630f1cb..5cdbd19 100644
--- a/gerrit/etc/gerrit.config.template
+++ b/gerrit/etc/gerrit.config.template
@@ -33,6 +33,7 @@
listenUrl = http://*:8080/
filterClass = com.googlesource.gerrit.plugins.ootb.FirstTimeRedirect
firstTimeRedirectUrl = /login/%23%2F?account_id=1000000
+ requestLog = true
[cache]
directory = cache
[plugins]
@@ -58,3 +59,6 @@
excludeMetrics = caches/.*
{% endif %}
+
+[auth]
+ cookiedomain = .{{ COOKIE_DOMAIN }}
diff --git a/gerrit/etc/high-availability.config.template b/gerrit/etc/high-availability.config.template
new file mode 100644
index 0000000..ff94d0d
--- /dev/null
+++ b/gerrit/etc/high-availability.config.template
@@ -0,0 +1,8 @@
+[main]
+ sharedDirectory = /var/gerrit/high-availability
+
+[peerInfo]
+ strategy = static
+
+[peerInfo "static"]
+ url = {{ HA_PEER_URL }}
diff --git a/gerrit/setup_gerrit.py b/gerrit/setup_gerrit.py
index fc15a6b..d1b10b9 100755
--- a/gerrit/setup_gerrit.py
+++ b/gerrit/setup_gerrit.py
@@ -8,6 +8,7 @@
from jinja2 import Environment, FileSystemLoader
setupReplication = (os.getenv('SETUP_REPLICATION') == 'true')
+setupHA = (os.getenv('SETUP_HA') == 'true')
def get_secret(secret_name):
# Create a Secrets Manager client
@@ -144,7 +145,8 @@
'LDAP_GROUP_BASE': config['ldap']['groupBase'],
'SMTP_SERVER': config['smtp']["server"],
'SMTP_USER': config['smtp']["user"],
- 'SMTP_DOMAIN': config['smtp']["domain"]
+ 'SMTP_DOMAIN': config['smtp']["domain"],
+ 'COOKIE_DOMAIN': os.getenv('HOSTED_ZONE_NAME'),
})
f.write(template.render(config_for_template))
@@ -159,3 +161,11 @@
SLAVE_1_URL=config['remote-slave']['url'],
SLAVE_1_AMDIN_URL=config['remote-slave']['adminUrl']
))
+
+if (setupHA):
+ print("Setting HA config in '" +
+ GERRIT_CONFIG_DIRECTORY + "high-availability.config'")
+ config.read(BASE_CONFIG_DIR + '/high-availability.setup')
+ template = env.get_template("high-availability.config.template")
+ with open(GERRIT_CONFIG_DIRECTORY + "high-availability.config", 'w', encoding='utf-8') as f:
+ f.write(template.render(HA_PEER_URL=os.getenv('HA_PEER_URL')))