Top-level domain name registry service on Google Cloud Platform
Find a file
Lai Jiang 2294c77306 Add a beam pipeline to expand recurring billing event (#1881)
This will replace the ExpandRecurringBillingEventsAction, which has a
couple of issues:

1) The action starts with too many Recurrings that are later filtered out
   because their expanded OneTimes are not actually in scope. This is due
   to the Recurrings not recording its latest expanded event time, and
   therefore many Recurrings that are not yet due for renewal get included
   in the initial query.

2) The action works in sequence, which exacerbated the issue in 1) and
   makes it very slow to run if the window of operation is wider than
   one day, which in turn makes it impossible to run any catch-up
   expansions with any significant gap to fill.

3) The action only expands the recurrence when the billing times because
   due, but most of its logic works on event time, which is 45 days
   before billing time, making the code hard to reason about and
   error-prone.  This has led to b/258822640 where a premature
   optimization intended to fix 1) caused some autorenwals to not be
   expanded correctly when subsequent manual renews within the autorenew
   grace period closed the original recurrece.

As a result, the new pipeline addresses the above issues in the
following way:

1) Update the recurrenceLastExpansion field on the Recurring when a new
   expansion occurs, and narrow down the Recurrings in scope for
   expansion by only looking for the ones that have not been expanded for
   more than a year.

2) Make it a Beam pipeline so expansions can happen in parallel. The
   Recurrings are grouped into batches in order to not overwhelm the
   database with writes for each expansion.

3) Create new expansions when the event time, as opposed to billing
   time, is within the operation window. This streamlines the logic and
   makes it clearer and easier to reason about. This also aligns with
   how other (cancelllable) operations for which there are accompanying
   grace periods are handled, when the corresponding data is always
   speculatively created at event time. Lastly, doing this negates the
   need to check if the expansion has finished running before generating
   the monthly invoices, because the billing events are now created not
   just-in-time, but 45 days in advance.

Note that this PR only adds the pipeline. It does not switch the default
behavior to using the pipeline, which is still done by
ExpandRecurringBillingEventsAction. We will first use this pipeline to
generate missing billing events and domain histories caused by
b/258822640. This also allows us to test it in production, as it
backfills data that will not affect ongoing invoice generation. If
anything goes wrong, we can always delete the generated billing events
and domain histories, based on the unique "reason" in them.

This pipeline can only run after we switch to use SQL sequence based ID
allocation, introduced in #1831.
2023-01-09 17:41:56 -05:00
.github/workflows Add CodeQL workflow (#1884) 2022-12-12 15:52:47 -05:00
buildSrc Remove some appengine dependencies (#1874) 2022-12-08 11:46:47 -05:00
common Remove some appengine dependencies (#1874) 2022-12-08 11:46:47 -05:00
config Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
console-webapp Bump json5 from 2.2.1 to 2.2.3 in /console-webapp (#1896) 2023-01-06 15:06:54 -05:00
core Add a beam pipeline to expand recurring billing event (#1881) 2023-01-09 17:41:56 -05:00
db Add a beam pipeline to expand recurring billing event (#1881) 2023-01-09 17:41:56 -05:00
docs Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
gradle/wrapper Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
integration Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
java-format Fixed distutils deprecation warning (#1711) 2022-07-26 15:51:52 -04:00
java8compatibility Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
networking Remove some appengine dependencies (#1874) 2022-12-08 11:46:47 -05:00
prober Remove some appengine dependencies (#1874) 2022-12-08 11:46:47 -05:00
processor Remove Ofy (#1863) 2022-12-02 22:28:33 -05:00
proxy Remove some appengine dependencies (#1874) 2022-12-08 11:46:47 -05:00
python/google/registry/scripts Rename ContactResource -> Contact (#1763) 2022-08-29 14:48:32 -04:00
release Add a beam pipeline to expand recurring billing event (#1881) 2023-01-09 17:41:56 -05:00
services Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
util Use standard Java thread creation in Concurrent (#1880) 2022-12-12 15:42:02 -05:00
.gcloudignore Remove Ofy (#1863) 2022-12-02 22:28:33 -05:00
.gitignore Remove Ofy (#1863) 2022-12-02 22:28:33 -05:00
appengine_war.gradle Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
AUTHORS Change all references to Domain Registry to Nomulus 2016-10-14 16:58:07 -04:00
build.gradle Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
buildscript-gradle.lockfile Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
CONTRIBUTING.md Add Google Java Style Guide info and link to CONTRIBUTING.md 2016-11-15 11:01:16 -05:00
CONTRIBUTORS Add rachelguan@ to CONTRIBUTORS (#1598) 2022-04-19 19:18:44 -04:00
dependencies.gradle Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
dependency_lic.gradle Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
gradle.lockfile Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
gradle.properties Upgrade to Gradle 7.0 (#1712) 2022-07-26 11:41:27 -04:00
gradlew Upgrade to Gradle 6.6.1 (#792) 2020-09-03 15:56:52 -04:00
gradlew.bat Upgrade to Gradle 6.6.1 (#792) 2020-09-03 15:56:52 -04:00
java_common.gradle Restore log4j exclusion in gradle build (#1801) 2022-09-30 14:04:00 -04:00
LICENSE Fix a typo (#174) 2019-07-15 17:49:22 -04:00
nom_build Create a nom_build wrapper script (#508) 2020-03-10 16:32:14 -04:00
nomulus-logo.png Update Nomulus logo 2017-05-23 17:22:49 -04:00
package-lock.json Update GCL dependency to avoid security alert (#1139) 2021-05-17 13:21:26 -04:00
package.json Update GCL dependency to avoid security alert (#1139) 2021-05-17 13:21:26 -04:00
projects.gradle Allow AppEngine deployment to qa environment (#986) 2021-03-03 19:31:08 -05:00
README.md Add CodeQL workflow (#1884) 2022-12-12 15:52:47 -05:00
rollback_tool An automated rollback tool for Nomulus (#847) 2020-10-29 10:37:20 -04:00
SECURITY.md Add SECURITY.md security policy (#1257) 2021-07-26 17:35:59 -04:00
settings.gradle Add new console backbone (#1876) 2023-01-05 16:23:40 -05:00
show_upgrade_diffs Added "show_upgrade_diffs" script (#981) 2021-03-09 07:48:06 -05:00
utils.gradle Use Flyway to deploy SQL schema to non-prod (#255) 2019-09-06 16:29:49 -04:00
vnames.json Fix a typo (#1085) 2021-04-15 08:15:31 -04:00

Nomulus

Internal Build FOSS Build License Code Search
Build Status for Google Registry internal build Build Status for the open source build License for this repo Link to Code Search

Nomulus logo

Overview

Nomulus is an open source, scalable, cloud-based service for operating top-level domains (TLDs). It is the authoritative source for the TLDs that it runs, meaning that it is responsible for tracking domain name ownership and handling registrations, renewals, availability checks, and WHOIS requests. End-user registrants (i.e. people or companies that want to register a domain name) use an intermediate domain name registrar acting on their behalf to interact with the registry.

Nomulus runs on Google App Engine and is written primarily in Java. It is the software that Google Registry uses to operate TLDs such as .google, .app, .how, .soy, and .みんな. It can run any number of TLDs in a single shared registry system using horizontal scaling. Its source code is publicly available in this repository under the Apache 2.0 free and open source license.

Getting started

The following resources provide information on getting the code and setting up a running system:

If you are thinking about running a production registry service using our platform, please drop by the user group and introduce yourself and your use case. To report issues or make contributions, use GitHub issues and pull requests.

Capabilities

Nomulus has the following capabilities:

  • Extensible Provisioning Protocol (EPP): An XML protocol that is the standard format for communication between registrars and registries. It includes operations for registering, renewing, checking, updating, and transferring domain names.
  • DNS interface: The registry provides a pluggable interface that can be implemented to handle different DNS providers. It includes a sample implementation using Google Cloud DNS as well as an RFC 2136 compliant implementation that works with BIND.
  • WHOIS: A text-based protocol that returns ownership and contact information on registered domain names.
  • Registration Data Access Protocol (RDAP): A JSON API that returns structured, machine-readable information about domain name ownership. It is essentially a newer version of WHOIS.
  • Registry Data Escrow (RDE): A daily export of all ownership information for a TLD to a third party escrow provider to allow take-over by another registry operator in the event of serious failure. This is required by ICANN for all new gTLDs.
  • Premium pricing: Communicates prices for premium domain names (i.e. those that are highly desirable) and supports configurable premium registration and renewal prices. An extensible interface allows fully programmatic pricing.
  • Billing history: A full history of all billable events is recorded, suitable for ingestion into an invoicing system.
  • Registration periods: Qualified Launch Partner, Sunrise, Landrush, Claims, and General Availability periods of the standard gTLD lifecycle are all supported.
  • Brand protection for trademark holders (via TMCH): Allows rights-holders to protect their brands by blocking registration of domains using their trademark. This is required by ICANN for all new gTLDs.
  • Registrar support console: A self-service web console that registrars can use to manage their accounts in the registry system.
  • Reporting: Support for required external reporting (such as ICANN monthly registry reports, CZDS, Billing and Registration Activity) as well as internal reporting using BigQuery.
  • Administrative tool: Performs the full range of administrative tasks needed to manage a running registry system, including creating and configuring new TLDs.
  • DNS interface: An interface for DNS operations is provided so you can write an implementation for your chosen provider, along with a sample implementation that uses Google Cloud DNS. If you are using Google Cloud DNS you may need to understand its capabilities and provide your own multi-AS solution.
  • GAE Proxy: App Engine Standard only serves HTTP/S traffic. A proxy to forward traffic on EPP and WHOIS ports to App Engine via HTTPS is provided. Instructions on setting up the proxy on Google Kubernetes Engine is available. Running the proxy on GKE supports IPv4 and IPv6 access, per ICANN's requirements for gTLDs. The proxy can also run as a single jar file, or on other Kubernetes providers, with modifications.

Additional components

Registry operators interested in deploying Nomulus will likely require some additional components that are need to be configured separately.

  • A way to invoice registrars for domain name registrations and accept payments. Nomulus records the information required to generate invoices in billing events.
  • Fully automated reporting to meet ICANN's requirements for gTLDs. Nomulus includes substantial reporting functionality but some additional work will be required by the operator in this area.
  • A secure method for storing cryptographic keys. A keyring interface is provided for plugging in your own implementation (see configuration doc for details).
  • System status and uptime monitoring.

Outside references

  • Donuts Registry has helped review the code and provided valuable feedback
  • CoCCa and FRED are other open-source registry platforms in use by many TLDs
  • We are not aware of any fully open source domain registrar projects, but open source EPP Toolkits (not yet tested with Nomulus; may require integration work) include:
  • Some Open Source DNS Projects that may be useful, but which we have not tested: