diff --git a/java/google/registry/BUILD b/java/google/registry/BUILD
index 815c5ebec..632fa844b 100644
--- a/java/google/registry/BUILD
+++ b/java/google/registry/BUILD
@@ -157,6 +157,75 @@ zip_file(
],
)
+################################################################################
+# DOMAIN REGISTRY :: QUALITY ASSURANCE ENVIRONMENT
+#
+# QA is an environment for automated integration testing and manual acceptance testing.
+
+registry_ear_file(
+ name = "registry_qa_ear",
+ out = "registry_qa.ear",
+ configs = {
+ "env/common/META-INF/appengine-application.xml": "META-INF/appengine-application.xml",
+ "env/common/META-INF/application.xml": "META-INF/application.xml",
+ },
+ wars = {
+ "registry_default_qa.war": "default",
+ "registry_pubapi_qa.war": "pubapi",
+ "registry_backend_qa.war": "backend",
+ "registry_tools_qa.war": "tools",
+ },
+)
+
+zip_file(
+ name = "registry_default_qa_war",
+ srcs = [
+ "env/qa/default/WEB-INF/appengine-web.xml",
+ "env/qa/default/WEB-INF/cron.xml",
+ ],
+ out = "registry_default_qa.war",
+ mappings = {
+ "domain_registry/java/google/registry/env/qa/default": "",
+ },
+ deps = [":registry_default_war"],
+)
+
+zip_file(
+ name = "registry_pubapi_qa_war",
+ srcs = [
+ "env/qa/pubapi/WEB-INF/appengine-web.xml",
+ ],
+ out = "registry_pubapi_qa.war",
+ mappings = {
+ "domain_registry/java/google/registry/env/qa/pubapi": "",
+ },
+ deps = [":registry_pubapi_war"],
+)
+
+zip_file(
+ name = "registry_backend_qa_war",
+ srcs = [
+ "env/qa/backend/WEB-INF/appengine-web.xml",
+ ],
+ out = "registry_backend_qa.war",
+ mappings = {
+ "domain_registry/java/google/registry/env/qa/backend": "",
+ },
+ deps = [":registry_backend_war"],
+)
+
+zip_file(
+ name = "registry_tools_qa_war",
+ srcs = [
+ "env/qa/tools/WEB-INF/appengine-web.xml",
+ ],
+ out = "registry_tools_qa.war",
+ mappings = {
+ "domain_registry/java/google/registry/env/qa/tools": "",
+ },
+ deps = [":registry_tools_war"],
+)
+
################################################################################
# DOMAIN REGISTRY :: SANDBOX ENVIRONMENT
#
diff --git a/java/google/registry/env/common/tools/WEB-INF/web.xml b/java/google/registry/env/common/tools/WEB-INF/web.xml
index b2b4b6716..eb7dde515 100644
--- a/java/google/registry/env/common/tools/WEB-INF/web.xml
+++ b/java/google/registry/env/common/tools/WEB-INF/web.xml
@@ -121,7 +121,6 @@
/_dr/task/generateZoneFiles
-
tools-servlet
/_dr/task/pollMapreduce
diff --git a/java/google/registry/env/qa/backend/WEB-INF/appengine-web.xml b/java/google/registry/env/qa/backend/WEB-INF/appengine-web.xml
new file mode 100644
index 000000000..e75dfe585
--- /dev/null
+++ b/java/google/registry/env/qa/backend/WEB-INF/appengine-web.xml
@@ -0,0 +1,31 @@
+
+
+
+ domain-registry
+ 1
+ java8
+ backend
+ true
+ true
+ B4
+
+ 10
+ 10m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/google/registry/env/qa/default/WEB-INF/appengine-web.xml b/java/google/registry/env/qa/default/WEB-INF/appengine-web.xml
new file mode 100644
index 000000000..c79f718ab
--- /dev/null
+++ b/java/google/registry/env/qa/default/WEB-INF/appengine-web.xml
@@ -0,0 +1,38 @@
+
+
+
+ domain-registry
+ 1
+ java8
+ default
+ true
+ true
+ F4_1G
+
+ 1
+ automatic
+ automatic
+ 100ms
+ 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/google/registry/env/qa/default/WEB-INF/cron.xml b/java/google/registry/env/qa/default/WEB-INF/cron.xml
new file mode 100644
index 000000000..d89b22947
--- /dev/null
+++ b/java/google/registry/env/qa/default/WEB-INF/cron.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+ Lease all tasks from the dns-pull queue, group by TLD, and invoke PublishDnsUpdates for each
+ group.
+
+ every 1 minutes synchronized
+ backend
+
+
+
+
+
+ Synchronize Registrar entities to Google Spreadsheets.
+
+ every 1 hours synchronized
+ backend
+
+
+
+
+
+ This job resaves all our resources, projected in time to "now".
+ It is needed for "deleteOldCommitLogs" to work correctly.
+
+ 1st monday of month 09:00
+ backend
+
+
+
+
+
+ This job deletes unreferenced commit logs from Datastore that are older than thirty days.
+ Since references are only updated on save, if we want to delete "unneeded" commit logs, we
+ also need "resaveAllEppResources" to run periodically.
+
+ 3rd monday of month 09:00
+ backend
+
+
+
+
+
+ This job runs a mapreduce that processes batch asynchronous deletions of
+ contact and host resources by mapping over all EppResources and checking
+ for any references to the contacts/hosts in pending deletion.
+
+ every 5 minutes synchronized
+ backend
+
+
+
+
+
+ This job runs a mapreduce that asynchronously handles DNS refreshes for
+ host renames by mapping over all domains and creating DNS refresh tasks
+ for any domains that reference a renamed host.
+
+ every 5 minutes synchronized
+ backend
+
+
+
+
+
+ Syncs RegistrarContact changes in the past hour to Google Groups.
+
+ every 1 hours synchronized
+ backend
+
+
+
diff --git a/java/google/registry/env/qa/pubapi/WEB-INF/appengine-web.xml b/java/google/registry/env/qa/pubapi/WEB-INF/appengine-web.xml
new file mode 100644
index 000000000..136afec07
--- /dev/null
+++ b/java/google/registry/env/qa/pubapi/WEB-INF/appengine-web.xml
@@ -0,0 +1,34 @@
+
+
+
+ domain-registry
+ 1
+ java8
+ pubapi
+ true
+ true
+ B4
+
+ 10
+ 10m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/java/google/registry/env/qa/tools/WEB-INF/appengine-web.xml b/java/google/registry/env/qa/tools/WEB-INF/appengine-web.xml
new file mode 100644
index 000000000..1e48c3e22
--- /dev/null
+++ b/java/google/registry/env/qa/tools/WEB-INF/appengine-web.xml
@@ -0,0 +1,34 @@
+
+
+
+ domain-registry
+ 1
+ java8
+ tools
+ true
+ true
+ B4
+
+ 10
+ 10m
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+