Add a SQL schema and DAO for KmsSecretRevision (#840)

* Add a SQL schema and DAO for KmsSecretRevision

The dual-object nature of KmsSecret and KmsSecretRevision will not be
necessary once we have moved to SQL. In that world, the only object will
be the one now called KmsSecretRevision. KmsSecretRevision already
stores its parent so all we need to do is convert that key to the String
secretName (or from the secretName to the key, if loading from SQL) and
select the max revision ID for a given secret name.

In a future PR, we will add a dual-writing DAO to these objects and
perform the dual writes, similar to how ReservedList functions.

* Regenerate diagram

* Rename revisionId and cryptoKeyVersionName

* Fix SQL files and diagram
This commit is contained in:
gbrodman 2020-10-30 18:45:43 -04:00 committed by GitHub
parent e07629b42f
commit 2cb7ae7f5a
12 changed files with 1229 additions and 763 deletions

View file

@ -16,6 +16,7 @@ package google.registry.model.server;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
@ -23,11 +24,13 @@ import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.common.EntityGroupRoot;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
/** Pointer to the latest {@link KmsSecretRevision}. */
@Entity
@ReportedOn
public class KmsSecret extends ImmutableObject {
public class KmsSecret extends ImmutableObject implements DatastoreEntity {
/** The unique name of this {@link KmsSecret}. */
@Id String name;
@ -45,6 +48,11 @@ public class KmsSecret extends ImmutableObject {
return latestRevision;
}
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // not persisted in SQL
}
public static KmsSecret create(String name, KmsSecretRevision latestRevision) {
KmsSecret instance = new KmsSecret();
instance.name = name;

View file

@ -17,14 +17,24 @@ package google.registry.model.server;
import static com.google.common.base.Preconditions.checkArgument;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Ignore;
import com.googlecode.objectify.annotation.OnLoad;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.Buildable;
import google.registry.model.CreateAutoTimestamp;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.ReportedOn;
import google.registry.schema.replay.DatastoreEntity;
import google.registry.schema.replay.SqlEntity;
import javax.persistence.Column;
import javax.persistence.Index;
import javax.persistence.PostLoad;
import javax.persistence.Table;
import javax.persistence.Transient;
/**
* An encrypted value.
@ -35,13 +45,22 @@ import google.registry.model.annotations.ReportedOn;
*
* <p>The value can be encrypted and decrypted using Cloud KMS.
*
* <p>Note that the primary key of this entity is {@link #revisionKey}, which is auto-generated by
* the database. So, if a retry of insertion happens after the previous attempt unexpectedly
* succeeds, we will end up with having two exact same revisions that differ only by revisionKey.
* This is fine though, because we only use the revision with the highest revisionKey.
*
* <p>TODO: remove Datastore-specific fields post-Registry-3.0-migration and rename to KmsSecret.
*
* @see <a href="https://cloud.google.com/kms/docs/">Google Cloud Key Management Service
* Documentation</a>
* @see google.registry.keyring.kms.KmsKeyring
*/
@Entity
@ReportedOn
public class KmsSecretRevision extends ImmutableObject {
@javax.persistence.Entity(name = "KmsSecret")
@Table(indexes = {@Index(columnList = "secretName")})
public class KmsSecretRevision extends ImmutableObject implements DatastoreEntity, SqlEntity {
/**
* The maximum allowable secret size. Although Datastore allows entities up to 1 MB in size,
@ -49,18 +68,31 @@ public class KmsSecretRevision extends ImmutableObject {
*/
private static final int MAX_SECRET_SIZE_BYTES = 64 * 1024 * 1024;
/** The revision of this secret. */
@Id long revisionKey;
/**
* The revision of this secret.
*
* <p>TODO: change name of the variable to revisionId once we're off Datastore
*/
@Id
@javax.persistence.Id
@Column(name = "revisionId")
long revisionKey;
/** The parent {@link KmsSecret} which contains metadata about this {@link KmsSecretRevision}. */
@Parent Key<KmsSecret> parent;
@Parent @Transient Key<KmsSecret> parent;
@Column(nullable = false)
@Ignore
String secretName;
/**
* The name of the {@code cryptoKeyVersion} associated with this {@link KmsSecretRevision}.
*
* <p>TODO: change name of the variable to cryptoKeyVersionName once we're off Datastore
*
* @see <a
* href="https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions">projects.locations.keyRings.cryptoKeys.cryptoKeyVersions</a>
*/
@Column(nullable = false, name = "cryptoKeyVersionName")
String kmsCryptoKeyVersionName;
/**
@ -70,9 +102,11 @@ public class KmsSecretRevision extends ImmutableObject {
* @see <a
* href="https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt">projects.locations.keyRings.cryptoKeys.encrypt</a>
*/
@Column(nullable = false)
String encryptedValue;
/** An automatically managed creation timestamp. */
@Column(nullable = false)
CreateAutoTimestamp creationTime = CreateAutoTimestamp.create(null);
public String getKmsCryptoKeyVersionName() {
@ -83,6 +117,28 @@ public class KmsSecretRevision extends ImmutableObject {
return encryptedValue;
}
// When loading from SQL, fill out the Datastore-specific field
@PostLoad
void postLoad() {
parent = Key.create(getCrossTldKey(), KmsSecret.class, secretName);
}
// When loading from Datastore, fill out the SQL-specific field
@OnLoad
void onLoad() {
secretName = parent.getName();
}
@Override
public ImmutableList<SqlEntity> toSqlEntities() {
return ImmutableList.of(); // This is dually-written, as we do not care about history
}
@Override
public ImmutableList<DatastoreEntity> toDatastoreEntities() {
return ImmutableList.of(); // This is dually-written, as we do not care about history
}
/** A builder for constructing {@link KmsSecretRevision} entities, since they are immutable. */
public static class Builder extends Buildable.Builder<KmsSecretRevision> {
@ -108,6 +164,7 @@ public class KmsSecretRevision extends ImmutableObject {
*/
public Builder setParent(String secretName) {
getInstance().parent = Key.create(getCrossTldKey(), KmsSecret.class, secretName);
getInstance().secretName = secretName;
return this;
}
}

View file

@ -0,0 +1,54 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.server;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Strings.isNullOrEmpty;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
import java.util.Optional;
/**
* A {@link KmsSecretRevision} DAO for Cloud SQL.
*
* <p>TODO: Rename this class to KmsSecretDao after migrating to Cloud SQL.
*/
public class KmsSecretRevisionSqlDao {
private KmsSecretRevisionSqlDao() {}
/** Saves the given KMS secret revision. */
public static void save(KmsSecretRevision kmsSecretRevision) {
checkArgumentNotNull(kmsSecretRevision, "kmsSecretRevision cannot be null");
jpaTm().assertInTransaction();
jpaTm().put(kmsSecretRevision);
}
/** Returns the latest revision for the secret name given, or absent if nonexistent. */
public static Optional<KmsSecretRevision> getLatestRevision(String secretName) {
checkArgument(!isNullOrEmpty(secretName), "secretName cannot be null or empty");
jpaTm().assertInTransaction();
return jpaTm()
.getEntityManager()
.createQuery(
"FROM KmsSecret ks WHERE ks.revisionKey IN (SELECT MAX(revisionKey) FROM "
+ "KmsSecret subKs WHERE subKs.secretName = :secretName)",
KmsSecretRevision.class)
.setParameter("secretName", secretName)
.getResultStream()
.findFirst();
}
}

View file

@ -62,6 +62,7 @@
<class>google.registry.model.registry.Registry</class>
<class>google.registry.model.reporting.DomainTransactionRecord</class>
<class>google.registry.model.reporting.Spec11ThreatMatch</class>
<class>google.registry.model.server.KmsSecretRevision</class>
<class>google.registry.model.smd.SignedMarkRevocationList</class>
<class>google.registry.model.tmch.ClaimsListShard</class>
<class>google.registry.persistence.transaction.TransactionEntity</class>

View file

@ -0,0 +1,86 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.server;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import google.registry.persistence.transaction.JpaTestRules;
import google.registry.persistence.transaction.JpaTestRules.JpaIntegrationWithCoverageExtension;
import google.registry.testing.DatastoreEntityExtension;
import google.registry.testing.FakeClock;
import java.util.Optional;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Tests for {@link google.registry.model.server.KmsSecretRevisionSqlDao}. */
public class KmsSecretRevisionSqlDaoTest {
private final FakeClock fakeClock = new FakeClock();
@RegisterExtension
@Order(value = 1)
DatastoreEntityExtension datastoreEntityExtension = new DatastoreEntityExtension();
@RegisterExtension
JpaIntegrationWithCoverageExtension jpa =
new JpaTestRules.Builder().withClock(fakeClock).buildIntegrationWithCoverageExtension();
@Test
void testSaveAndRetrieve() {
KmsSecretRevision revision = createRevision();
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(revision));
Optional<KmsSecretRevision> fromSql =
jpaTm().transact(() -> KmsSecretRevisionSqlDao.getLatestRevision("secretName"));
assertThat(fromSql.isPresent()).isTrue();
assertAboutImmutableObjects().that(revision).isEqualExceptFields(fromSql.get(), "creationTime");
}
@Test
void testMultipleRevisions() {
KmsSecretRevision revision = createRevision();
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(revision));
KmsSecretRevision secondRevision = createRevision();
secondRevision.encryptedValue = "someOtherValue";
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(secondRevision));
Optional<KmsSecretRevision> fromSql =
jpaTm().transact(() -> KmsSecretRevisionSqlDao.getLatestRevision("secretName"));
assertThat(fromSql.isPresent()).isTrue();
assertThat(fromSql.get().getEncryptedValue()).isEqualTo("someOtherValue");
}
@Test
void testNonexistent() {
KmsSecretRevision revision = createRevision();
jpaTm().transact(() -> KmsSecretRevisionSqlDao.save(revision));
assertThat(
jpaTm()
.transact(() -> KmsSecretRevisionSqlDao.getLatestRevision("someOtherSecretName"))
.isPresent())
.isFalse();
}
private KmsSecretRevision createRevision() {
return new KmsSecretRevision.Builder()
.setEncryptedValue("encrypted")
.setKmsCryptoKeyVersionName("version")
.setParent("secretName")
.build();
}
}

View file

@ -29,6 +29,7 @@ import google.registry.model.registry.RegistryLockDaoTest;
import google.registry.model.registry.RegistryTest;
import google.registry.model.registry.label.ReservedListSqlDaoTest;
import google.registry.model.reporting.Spec11ThreatMatchTest;
import google.registry.model.server.KmsSecretRevisionSqlDaoTest;
import google.registry.model.smd.SignedMarkRevocationListDaoTest;
import google.registry.model.tmch.ClaimsListDaoTest;
import google.registry.persistence.transaction.JpaEntityCoverageExtension;
@ -85,6 +86,7 @@ import org.junit.runner.RunWith;
DomainBaseSqlTest.class,
DomainHistoryTest.class,
HostHistoryTest.class,
KmsSecretRevisionSqlDaoTest.class,
LockDaoTest.class,
PollMessageTest.class,
PremiumListDaoTest.class,

View file

@ -261,19 +261,19 @@ td.section {
</tr>
<tr>
<td class="property_name">generated on</td>
<td class="property_value">2020-10-30 20:47:04.047621</td>
<td class="property_value">2020-10-30 21:56:22.867321</td>
</tr>
<tr>
<td class="property_name">last flyway file</td>
<td id="lastFlywayFile" class="property_value">V70__signed_mark_revocation_list.sql</td>
<td id="lastFlywayFile" class="property_value">V71__create_kms_secret.sql</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<svg viewbox="0.00 0.00 3524.79 2933.77" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 2929.77)">
<svg viewbox="0.00 0.00 3524.79 3018.77" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="erDiagram" style="overflow: hidden; width: 100%; height: 800px"> <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3014.77)">
<title>SchemaCrawler_Diagram</title>
<polygon fill="white" stroke="transparent" points="-4,4 -4,-2929.77 3520.79,-2929.77 3520.79,4 -4,4" />
<polygon fill="white" stroke="transparent" points="-4,4 -4,-3014.77 3520.79,-3014.77 3520.79,4 -4,4" />
<text text-anchor="start" x="3248.29" y="-29.8" font-family="Helvetica,sans-Serif" font-size="14.00">
generated by
</text>
@ -284,7 +284,7 @@ td.section {
generated on
</text>
<text text-anchor="start" x="3331.29" y="-10.8" font-family="Helvetica,sans-Serif" font-size="14.00">
2020-10-30 20:47:04.047621
2020-10-30 21:56:22.867321
</text>
<polygon fill="none" stroke="#888888" points="3243.79,-4 3243.79,-44 3508.79,-44 3508.79,-4 3243.79,-4" /> <!-- allocationtoken_a08ccbef -->
<g id="node1" class="node">
@ -521,7 +521,7 @@ td.section {
fk_billing_cancellation_billing_recurrence_id
</text>
</g> <!-- registrar_6e1503e3 -->
<g id="node25" class="node">
<g id="node26" class="node">
<title>registrar_6e1503e3</title>
<polygon fill="#ebcef2" stroke="transparent" points="9.5,-1217.27 9.5,-1236.27 116.5,-1236.27 116.5,-1217.27 9.5,-1217.27" />
<text text-anchor="start" x="11.5" y="-1224.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
@ -2182,484 +2182,512 @@ td.section {
<text text-anchor="start" x="550.5" y="-395.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fk3d09knnmxrt6iniwnp8j2ykga
</text>
</g> <!-- lock_f21d4861 -->
</g> <!-- kmssecret_f3b28857 -->
<g id="node21" class="node">
<title>lock_f21d4861</title>
<polygon fill="#ebcef2" stroke="transparent" points="3258.5,-1949.27 3258.5,-1968.27 3371.5,-1968.27 3371.5,-1949.27 3258.5,-1949.27" />
<text text-anchor="start" x="3260.5" y="-1956.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Lock
<title>kmssecret_f3b28857</title>
<polygon fill="#ebcef2" stroke="transparent" points="3255.5,-1949.27 3255.5,-1968.27 3374.5,-1968.27 3374.5,-1949.27 3255.5,-1949.27" />
<text text-anchor="start" x="3257.5" y="-1956.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.KmsSecret
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3371.5,-1949.27 3371.5,-1968.27 3445.5,-1968.27 3445.5,-1949.27 3371.5,-1949.27" />
<text text-anchor="start" x="3406.5" y="-1955.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3374.5,-1949.27 3374.5,-1968.27 3448.5,-1968.27 3448.5,-1949.27 3374.5,-1949.27" />
<text text-anchor="start" x="3409.5" y="-1955.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3260.5" y="-1937.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
resource_name
</text>
<text text-anchor="start" x="3365.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3373.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3260.5" y="-1918.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3365.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3373.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3257,-1910.77 3257,-1969.77 3446,-1969.77 3446,-1910.77 3257,-1910.77" />
</g> <!-- premiumentry_b0060b91 -->
<g id="node22" class="node">
<title>premiumentry_b0060b91</title>
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2034.27 3243.5,-2053.27 3385.5,-2053.27 3385.5,-2034.27 3243.5,-2034.27" />
<text text-anchor="start" x="3245.5" y="-2041.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3385.5,-2034.27 3385.5,-2053.27 3459.5,-2053.27 3459.5,-2034.27 3385.5,-2034.27" />
<text text-anchor="start" x="3420.5" y="-2040.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3245.5" y="-2022.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3257.5" y="-1937.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="3358.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3354.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3387.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3376.5" y="-1936.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="3245.5" y="-2003.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
domain_label
<text text-anchor="start" x="3257.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
secret_name
</text>
<text text-anchor="start" x="3358.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3354.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3387.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3376.5" y="-1917.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3242.5,-1995.77 3242.5,-2054.77 3460.5,-2054.77 3460.5,-1995.77 3242.5,-1995.77" />
</g> <!-- premiumlist_7c3ea68b -->
<g id="node23" class="node">
<title>premiumlist_7c3ea68b</title>
<polygon fill="#ebcef2" stroke="transparent" points="2656,-2033.27 2656,-2052.27 2787,-2052.27 2787,-2033.27 2656,-2033.27" />
<text text-anchor="start" x="2658" y="-2040.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumList
<polygon fill="none" stroke="#888888" points="3254,-1910.77 3254,-1969.77 3449,-1969.77 3449,-1910.77 3254,-1910.77" />
</g> <!-- lock_f21d4861 -->
<g id="node22" class="node">
<title>lock_f21d4861</title>
<polygon fill="#ebcef2" stroke="transparent" points="3258.5,-2034.27 3258.5,-2053.27 3371.5,-2053.27 3371.5,-2034.27 3258.5,-2034.27" />
<text text-anchor="start" x="3260.5" y="-2041.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Lock
</text>
<polygon fill="#ebcef2" stroke="transparent" points="2787,-2033.27 2787,-2052.27 2897,-2052.27 2897,-2033.27 2787,-2033.27" />
<text text-anchor="start" x="2858" y="-2039.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3371.5,-2034.27 3371.5,-2053.27 3445.5,-2053.27 3445.5,-2034.27 3371.5,-2034.27" />
<text text-anchor="start" x="3406.5" y="-2040.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="2658" y="-2021.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
<text text-anchor="start" x="3260.5" y="-2022.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
resource_name
</text>
<text text-anchor="start" x="2757" y="-2020.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2020.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="2757" y="-2001.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2001.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="2658" y="-1982.07" font-family="Helvetica,sans-Serif" font-size="14.00">
name
</text>
<text text-anchor="start" x="2757" y="-1982.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-1982.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3373.5" y="-2021.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="2654.5,-1975.27 2654.5,-2053.27 2897.5,-2053.27 2897.5,-1975.27 2654.5,-1975.27" />
<text text-anchor="start" x="3260.5" y="-2003.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3365.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3373.5" y="-2002.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3257,-1995.77 3257,-2054.77 3446,-2054.77 3446,-1995.77 3257,-1995.77" />
</g> <!-- premiumentry_b0060b91 -->
<g id="node23" class="node">
<title>premiumentry_b0060b91</title>
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2119.27 3243.5,-2138.27 3385.5,-2138.27 3385.5,-2119.27 3243.5,-2119.27" />
<text text-anchor="start" x="3245.5" y="-2126.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3385.5,-2119.27 3385.5,-2138.27 3459.5,-2138.27 3459.5,-2119.27 3385.5,-2119.27" />
<text text-anchor="start" x="3420.5" y="-2125.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3245.5" y="-2107.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="3358.5" y="-2106.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3387.5" y="-2106.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="3245.5" y="-2088.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
domain_label
</text>
<text text-anchor="start" x="3358.5" y="-2087.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3387.5" y="-2087.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3242.5,-2080.77 3242.5,-2139.77 3460.5,-2139.77 3460.5,-2080.77 3242.5,-2080.77" />
</g> <!-- premiumlist_7c3ea68b -->
<g id="node24" class="node">
<title>premiumlist_7c3ea68b</title>
<polygon fill="#ebcef2" stroke="transparent" points="2656,-2118.27 2656,-2137.27 2787,-2137.27 2787,-2118.27 2656,-2118.27" />
<text text-anchor="start" x="2658" y="-2125.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.PremiumList
</text>
<polygon fill="#ebcef2" stroke="transparent" points="2787,-2118.27 2787,-2137.27 2897,-2137.27 2897,-2118.27 2787,-2118.27" />
<text text-anchor="start" x="2858" y="-2124.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="2658" y="-2106.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="2757" y="-2105.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2105.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="2757" y="-2086.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2086.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="2658" y="-2067.07" font-family="Helvetica,sans-Serif" font-size="14.00">
name
</text>
<text text-anchor="start" x="2757" y="-2067.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2789" y="-2067.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="2654.5,-2060.27 2654.5,-2138.27 2897.5,-2138.27 2897.5,-2060.27 2654.5,-2060.27" />
</g> <!-- premiumentry_b0060b91&#45;&gt;premiumlist_7c3ea68b -->
<g id="edge40" class="edge">
<title>premiumentry_b0060b91:w-&gt;premiumlist_7c3ea68b:e</title>
<path fill="none" stroke="black" d="M3224.22,-2024.27C3089.29,-2024.27 3046.82,-2024.27 2908.15,-2024.27" />
<polygon fill="black" stroke="black" points="3232.5,-2024.27 3242.5,-2028.77 3237.5,-2024.27 3242.5,-2024.27 3242.5,-2024.27 3242.5,-2024.27 3237.5,-2024.27 3242.5,-2019.77 3232.5,-2024.27 3232.5,-2024.27" />
<ellipse fill="none" stroke="black" cx="3228.5" cy="-2024.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2899,-2029.27 2899,-2019.27 2901,-2019.27 2901,-2029.27 2899,-2029.27" />
<polyline fill="none" stroke="black" points="2898,-2024.27 2903,-2024.27 " />
<polygon fill="black" stroke="black" points="2904,-2029.27 2904,-2019.27 2906,-2019.27 2906,-2029.27 2904,-2029.27" />
<polyline fill="none" stroke="black" points="2903,-2024.27 2908,-2024.27 " />
<text text-anchor="start" x="2976.5" y="-2028.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<path fill="none" stroke="black" d="M3224.22,-2109.27C3089.29,-2109.27 3046.82,-2109.27 2908.15,-2109.27" />
<polygon fill="black" stroke="black" points="3232.5,-2109.27 3242.5,-2113.77 3237.5,-2109.27 3242.5,-2109.27 3242.5,-2109.27 3242.5,-2109.27 3237.5,-2109.27 3242.5,-2104.77 3232.5,-2109.27 3232.5,-2109.27" />
<ellipse fill="none" stroke="black" cx="3228.5" cy="-2109.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2899,-2114.27 2899,-2104.27 2901,-2104.27 2901,-2114.27 2899,-2114.27" />
<polyline fill="none" stroke="black" points="2898,-2109.27 2903,-2109.27 " />
<polygon fill="black" stroke="black" points="2904,-2114.27 2904,-2104.27 2906,-2104.27 2906,-2114.27 2904,-2114.27" />
<polyline fill="none" stroke="black" points="2903,-2109.27 2908,-2109.27 " />
<text text-anchor="start" x="2976.5" y="-2113.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fko0gw90lpo1tuee56l0nb6y6g5
</text>
</g> <!-- rderevision_83396864 -->
<g id="node24" class="node">
<g id="node25" class="node">
<title>rderevision_83396864</title>
<polygon fill="#ebcef2" stroke="transparent" points="3247.5,-2139.27 3247.5,-2158.27 3377.5,-2158.27 3377.5,-2139.27 3247.5,-2139.27" />
<text text-anchor="start" x="3249.5" y="-2146.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3247.5,-2224.27 3247.5,-2243.27 3377.5,-2243.27 3377.5,-2224.27 3247.5,-2224.27" />
<text text-anchor="start" x="3249.5" y="-2231.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RdeRevision
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3377.5,-2139.27 3377.5,-2158.27 3455.5,-2158.27 3455.5,-2139.27 3377.5,-2139.27" />
<text text-anchor="start" x="3416.5" y="-2145.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3377.5,-2224.27 3377.5,-2243.27 3455.5,-2243.27 3455.5,-2224.27 3377.5,-2224.27" />
<text text-anchor="start" x="3416.5" y="-2230.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3249.5" y="-2127.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3249.5" y="-2212.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3333.5" y="-2126.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3333.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3379.5" y="-2126.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3379.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3249.5" y="-2108.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3249.5" y="-2193.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
mode
</text>
<text text-anchor="start" x="3333.5" y="-2107.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3333.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3379.5" y="-2107.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3379.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3249.5" y="-2089.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3249.5" y="-2174.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
"date"
</text>
<text text-anchor="start" x="3333.5" y="-2088.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3333.5" y="-2173.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3379.5" y="-2088.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3379.5" y="-2173.07" font-family="Helvetica,sans-Serif" font-size="14.00">
date not null
</text>
<polygon fill="none" stroke="#888888" points="3246.5,-2081.27 3246.5,-2159.27 3456.5,-2159.27 3456.5,-2081.27 3246.5,-2081.27" />
<polygon fill="none" stroke="#888888" points="3246.5,-2166.27 3246.5,-2244.27 3456.5,-2244.27 3456.5,-2166.27 3246.5,-2166.27" />
</g> <!-- registrarpoc_ab47054d -->
<g id="node26" class="node">
<g id="node27" class="node">
<title>registrarpoc_ab47054d</title>
<polygon fill="#ebcef2" stroke="transparent" points="3248.5,-2243.27 3248.5,-2262.27 3380.5,-2262.27 3380.5,-2243.27 3248.5,-2243.27" />
<text text-anchor="start" x="3250.5" y="-2250.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3248.5,-2328.27 3248.5,-2347.27 3380.5,-2347.27 3380.5,-2328.27 3248.5,-2328.27" />
<text text-anchor="start" x="3250.5" y="-2335.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RegistrarPoc
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3380.5,-2243.27 3380.5,-2262.27 3454.5,-2262.27 3454.5,-2243.27 3380.5,-2243.27" />
<text text-anchor="start" x="3415.5" y="-2249.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3380.5,-2328.27 3380.5,-2347.27 3454.5,-2347.27 3454.5,-2328.27 3380.5,-2328.27" />
<text text-anchor="start" x="3415.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3250.5" y="-2231.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3250.5" y="-2316.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
email_address
</text>
<text text-anchor="start" x="3361.5" y="-2230.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3361.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3382.5" y="-2230.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3382.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3250.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3250.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
gae_user_id
</text>
<text text-anchor="start" x="3361.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3361.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3382.5" y="-2211.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3382.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text
</text>
<text text-anchor="start" x="3250.5" y="-2193.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3250.5" y="-2278.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
registrar_id
</text>
<text text-anchor="start" x="3361.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3361.5" y="-2277.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3382.5" y="-2192.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3382.5" y="-2277.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3247.5,-2185.27 3247.5,-2263.27 3455.5,-2263.27 3455.5,-2185.27 3247.5,-2185.27" />
<polygon fill="none" stroke="#888888" points="3247.5,-2270.27 3247.5,-2348.27 3455.5,-2348.27 3455.5,-2270.27 3247.5,-2270.27" />
</g> <!-- registrylock_ac88663e -->
<g id="node27" class="node">
<g id="node28" class="node">
<title>registrylock_ac88663e</title>
<polygon fill="#ebcef2" stroke="transparent" points="3229.5,-2404.27 3229.5,-2423.27 3363.5,-2423.27 3363.5,-2404.27 3229.5,-2404.27" />
<text text-anchor="start" x="3231.5" y="-2411.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3229.5,-2489.27 3229.5,-2508.27 3363.5,-2508.27 3363.5,-2489.27 3229.5,-2489.27" />
<text text-anchor="start" x="3231.5" y="-2496.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.RegistryLock
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3363.5,-2404.27 3363.5,-2423.27 3473.5,-2423.27 3473.5,-2404.27 3363.5,-2404.27" />
<text text-anchor="start" x="3434.5" y="-2410.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3363.5,-2489.27 3363.5,-2508.27 3473.5,-2508.27 3473.5,-2489.27 3363.5,-2489.27" />
<text text-anchor="start" x="3434.5" y="-2495.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3231.5" y="-2392.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3231.5" y="-2477.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="3350.5" y="-2391.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2476.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3365.5" y="-2391.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2476.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="3350.5" y="-2372.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2457.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3365.5" y="-2372.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2457.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="3231.5" y="-2353.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3231.5" y="-2438.07" font-family="Helvetica,sans-Serif" font-size="14.00">
registrar_id
</text>
<text text-anchor="start" x="3350.5" y="-2353.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2438.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3365.5" y="-2353.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2438.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3231.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3231.5" y="-2419.07" font-family="Helvetica,sans-Serif" font-size="14.00">
repo_id
</text>
<text text-anchor="start" x="3350.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2419.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3365.5" y="-2334.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2419.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3231.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3231.5" y="-2400.07" font-family="Helvetica,sans-Serif" font-size="14.00">
verification_code
</text>
<text text-anchor="start" x="3350.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2400.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3365.5" y="-2315.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2400.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3231.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3231.5" y="-2381.07" font-family="Helvetica,sans-Serif" font-size="14.00">
relock_revision_id
</text>
<text text-anchor="start" x="3350.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2381.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3365.5" y="-2296.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3365.5" y="-2381.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8
</text>
<polygon fill="none" stroke="#888888" points="3228.5,-2289.77 3228.5,-2424.77 3474.5,-2424.77 3474.5,-2289.77 3228.5,-2289.77" />
<polygon fill="none" stroke="#888888" points="3228.5,-2374.77 3228.5,-2509.77 3474.5,-2509.77 3474.5,-2374.77 3228.5,-2374.77" />
</g> <!-- registrylock_ac88663e&#45;&gt;registrylock_ac88663e -->
<g id="edge60" class="edge">
<title>registrylock_ac88663e:w-&gt;registrylock_ac88663e:e</title>
<path fill="none" stroke="black" d="M3213.75,-2308.27C3160.79,-2347.62 3175.25,-2446.77 3351.5,-2446.77 3534.5,-2446.77 3543.08,-2427.09 3482.87,-2399.41" />
<polygon fill="black" stroke="black" points="3220.82,-2304.24 3231.73,-2303.18 3225.16,-2301.75 3229.5,-2299.27 3229.5,-2299.27 3229.5,-2299.27 3225.16,-2301.75 3227.27,-2295.37 3220.82,-2304.24 3220.82,-2304.24" />
<ellipse fill="none" stroke="black" cx="3217.35" cy="-2306.22" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="3472.39,-2400.25 3476.44,-2391.1 3478.26,-2391.91 3474.22,-2401.06 3472.39,-2400.25" />
<polyline fill="none" stroke="black" points="3473.5,-2395.27 3478.07,-2397.29 " />
<polygon fill="black" stroke="black" points="3476.97,-2402.27 3481.01,-2393.12 3482.84,-2393.93 3478.8,-2403.08 3476.97,-2402.27" />
<polyline fill="none" stroke="black" points="3478.07,-2397.29 3482.65,-2399.31 " />
<text text-anchor="start" x="3270" y="-2450.57" font-family="Helvetica,sans-Serif" font-size="14.00">
<path fill="none" stroke="black" d="M3213.75,-2393.27C3160.79,-2432.62 3175.25,-2531.77 3351.5,-2531.77 3534.5,-2531.77 3543.08,-2512.09 3482.87,-2484.41" />
<polygon fill="black" stroke="black" points="3220.82,-2389.24 3231.73,-2388.18 3225.16,-2386.75 3229.5,-2384.27 3229.5,-2384.27 3229.5,-2384.27 3225.16,-2386.75 3227.27,-2380.37 3220.82,-2389.24 3220.82,-2389.24" />
<ellipse fill="none" stroke="black" cx="3217.35" cy="-2391.22" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="3472.39,-2485.25 3476.44,-2476.1 3478.26,-2476.91 3474.22,-2486.06 3472.39,-2485.25" />
<polyline fill="none" stroke="black" points="3473.5,-2480.27 3478.07,-2482.29 " />
<polygon fill="black" stroke="black" points="3476.97,-2487.27 3481.01,-2478.12 3482.84,-2478.93 3478.8,-2488.08 3476.97,-2487.27" />
<polyline fill="none" stroke="black" points="3478.07,-2482.29 3482.65,-2484.31 " />
<text text-anchor="start" x="3270" y="-2535.57" font-family="Helvetica,sans-Serif" font-size="14.00">
fk2lhcwpxlnqijr96irylrh1707
</text>
</g> <!-- reservedentry_1a7b8520 -->
<g id="node28" class="node">
<g id="node29" class="node">
<title>reservedentry_1a7b8520</title>
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2522.27 3243.5,-2541.27 3386.5,-2541.27 3386.5,-2522.27 3243.5,-2522.27" />
<text text-anchor="start" x="3245.5" y="-2529.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3243.5,-2607.27 3243.5,-2626.27 3386.5,-2626.27 3386.5,-2607.27 3243.5,-2607.27" />
<text text-anchor="start" x="3245.5" y="-2614.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ReservedEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3386.5,-2522.27 3386.5,-2541.27 3460.5,-2541.27 3460.5,-2522.27 3386.5,-2522.27" />
<text text-anchor="start" x="3421.5" y="-2528.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3386.5,-2607.27 3386.5,-2626.27 3460.5,-2626.27 3460.5,-2607.27 3386.5,-2607.27" />
<text text-anchor="start" x="3421.5" y="-2613.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3245.5" y="-2510.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3245.5" y="-2595.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="3358.5" y="-2509.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3358.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3388.5" y="-2509.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3388.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="3245.5" y="-2491.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3245.5" y="-2576.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
domain_label
</text>
<text text-anchor="start" x="3358.5" y="-2490.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3358.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3388.5" y="-2490.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3388.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3242,-2483.77 3242,-2542.77 3461,-2542.77 3461,-2483.77 3242,-2483.77" />
<polygon fill="none" stroke="#888888" points="3242,-2568.77 3242,-2627.77 3461,-2627.77 3461,-2568.77 3242,-2568.77" />
</g> <!-- reservedlist_b97c3f1c -->
<g id="node29" class="node">
<g id="node30" class="node">
<title>reservedlist_b97c3f1c</title>
<polygon fill="#ebcef2" stroke="transparent" points="2655,-2521.27 2655,-2540.27 2788,-2540.27 2788,-2521.27 2655,-2521.27" />
<text text-anchor="start" x="2657" y="-2528.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="2655,-2606.27 2655,-2625.27 2788,-2625.27 2788,-2606.27 2655,-2606.27" />
<text text-anchor="start" x="2657" y="-2613.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.ReservedList
</text>
<polygon fill="#ebcef2" stroke="transparent" points="2788,-2521.27 2788,-2540.27 2898,-2540.27 2898,-2521.27 2788,-2521.27" />
<text text-anchor="start" x="2859" y="-2527.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="2788,-2606.27 2788,-2625.27 2898,-2625.27 2898,-2606.27 2788,-2606.27" />
<text text-anchor="start" x="2859" y="-2612.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="2657" y="-2509.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="2657" y="-2594.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="2757" y="-2508.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2757" y="-2593.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2790" y="-2508.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2790" y="-2593.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="2757" y="-2489.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2757" y="-2574.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2790" y="-2489.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2790" y="-2574.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="2657" y="-2470.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2657" y="-2555.07" font-family="Helvetica,sans-Serif" font-size="14.00">
name
</text>
<text text-anchor="start" x="2757" y="-2470.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2757" y="-2555.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2790" y="-2470.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2790" y="-2555.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="2653.5,-2463.27 2653.5,-2541.27 2898.5,-2541.27 2898.5,-2463.27 2653.5,-2463.27" />
<polygon fill="none" stroke="#888888" points="2653.5,-2548.27 2653.5,-2626.27 2898.5,-2626.27 2898.5,-2548.27 2653.5,-2548.27" />
</g> <!-- reservedentry_1a7b8520&#45;&gt;reservedlist_b97c3f1c -->
<g id="edge61" class="edge">
<title>reservedentry_1a7b8520:w-&gt;reservedlist_b97c3f1c:e</title>
<path fill="none" stroke="black" d="M3224.28,-2512.27C3089.74,-2512.27 3047.38,-2512.27 2909.12,-2512.27" />
<polygon fill="black" stroke="black" points="3232.5,-2512.27 3242.5,-2516.77 3237.5,-2512.27 3242.5,-2512.27 3242.5,-2512.27 3242.5,-2512.27 3237.5,-2512.27 3242.5,-2507.77 3232.5,-2512.27 3232.5,-2512.27" />
<ellipse fill="none" stroke="black" cx="3228.5" cy="-2512.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2900,-2517.27 2900,-2507.27 2902,-2507.27 2902,-2517.27 2900,-2517.27" />
<polyline fill="none" stroke="black" points="2899,-2512.27 2904,-2512.27 " />
<polygon fill="black" stroke="black" points="2905,-2517.27 2905,-2507.27 2907,-2507.27 2907,-2517.27 2905,-2517.27" />
<polyline fill="none" stroke="black" points="2904,-2512.27 2909,-2512.27 " />
<text text-anchor="start" x="2978" y="-2516.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<path fill="none" stroke="black" d="M3224.28,-2597.27C3089.74,-2597.27 3047.38,-2597.27 2909.12,-2597.27" />
<polygon fill="black" stroke="black" points="3232.5,-2597.27 3242.5,-2601.77 3237.5,-2597.27 3242.5,-2597.27 3242.5,-2597.27 3242.5,-2597.27 3237.5,-2597.27 3242.5,-2592.77 3232.5,-2597.27 3232.5,-2597.27" />
<ellipse fill="none" stroke="black" cx="3228.5" cy="-2597.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2900,-2602.27 2900,-2592.27 2902,-2592.27 2902,-2602.27 2900,-2602.27" />
<polyline fill="none" stroke="black" points="2899,-2597.27 2904,-2597.27 " />
<polygon fill="black" stroke="black" points="2905,-2602.27 2905,-2592.27 2907,-2592.27 2907,-2602.27 2905,-2602.27" />
<polyline fill="none" stroke="black" points="2904,-2597.27 2909,-2597.27 " />
<text text-anchor="start" x="2978" y="-2601.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fkgq03rk0bt1hb915dnyvd3vnfc
</text>
</g> <!-- signedmarkrevocationentry_99c39721 -->
<g id="node30" class="node">
<g id="node31" class="node">
<title>signedmarkrevocationentry_99c39721</title>
<polygon fill="#ebcef2" stroke="transparent" points="3198.5,-2607.27 3198.5,-2626.27 3431.5,-2626.27 3431.5,-2607.27 3198.5,-2607.27" />
<text text-anchor="start" x="3200.5" y="-2614.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3198.5,-2692.27 3198.5,-2711.27 3431.5,-2711.27 3431.5,-2692.27 3198.5,-2692.27" />
<text text-anchor="start" x="3200.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationEntry
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3431.5,-2607.27 3431.5,-2626.27 3505.5,-2626.27 3505.5,-2607.27 3431.5,-2607.27" />
<text text-anchor="start" x="3466.5" y="-2613.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3431.5,-2692.27 3431.5,-2711.27 3505.5,-2711.27 3505.5,-2692.27 3431.5,-2692.27" />
<text text-anchor="start" x="3466.5" y="-2698.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3200.5" y="-2595.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3200.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="3350.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3433.5" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3433.5" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
int8 not null
</text>
<text text-anchor="start" x="3200.5" y="-2576.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3200.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
smd_id
</text>
<text text-anchor="start" x="3350.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3350.5" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3433.5" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3433.5" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3197,-2568.77 3197,-2627.77 3506,-2627.77 3506,-2568.77 3197,-2568.77" />
<polygon fill="none" stroke="#888888" points="3197,-2653.77 3197,-2712.77 3506,-2712.77 3506,-2653.77 3197,-2653.77" />
</g> <!-- signedmarkrevocationlist_c5d968fb -->
<g id="node31" class="node">
<g id="node32" class="node">
<title>signedmarkrevocationlist_c5d968fb</title>
<polygon fill="#ebcef2" stroke="transparent" points="2610,-2607.27 2610,-2626.27 2832,-2626.27 2832,-2607.27 2610,-2607.27" />
<text text-anchor="start" x="2612" y="-2614.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="2610,-2692.27 2610,-2711.27 2832,-2711.27 2832,-2692.27 2610,-2692.27" />
<text text-anchor="start" x="2612" y="-2699.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.SignedMarkRevocationList
</text>
<polygon fill="#ebcef2" stroke="transparent" points="2832,-2607.27 2832,-2626.27 2942,-2626.27 2942,-2607.27 2832,-2607.27" />
<text text-anchor="start" x="2903" y="-2613.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="2832,-2692.27 2832,-2711.27 2942,-2711.27 2942,-2692.27 2832,-2692.27" />
<text text-anchor="start" x="2903" y="-2698.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="2612" y="-2595.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="2612" y="-2680.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
revision_id
</text>
<text text-anchor="start" x="2757" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2757" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2834" y="-2594.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2834" y="-2679.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="2757" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2757" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="2834" y="-2575.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="2834" y="-2660.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<polygon fill="none" stroke="#888888" points="2609,-2568.77 2609,-2627.77 2943,-2627.77 2943,-2568.77 2609,-2568.77" />
<polygon fill="none" stroke="#888888" points="2609,-2653.77 2609,-2712.77 2943,-2712.77 2943,-2653.77 2609,-2653.77" />
</g> <!-- signedmarkrevocationentry_99c39721&#45;&gt;signedmarkrevocationlist_c5d968fb -->
<g id="edge62" class="edge">
<title>signedmarkrevocationentry_99c39721:w-&gt;signedmarkrevocationlist_c5d968fb:e</title>
<path fill="none" stroke="black" d="M3179.37,-2597.27C3084.15,-2597.27 3051.89,-2597.27 2953.1,-2597.27" />
<polygon fill="black" stroke="black" points="3187.5,-2597.27 3197.5,-2601.77 3192.5,-2597.27 3197.5,-2597.27 3197.5,-2597.27 3197.5,-2597.27 3192.5,-2597.27 3197.5,-2592.77 3187.5,-2597.27 3187.5,-2597.27" />
<ellipse fill="none" stroke="black" cx="3183.5" cy="-2597.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2944,-2602.27 2944,-2592.27 2946,-2592.27 2946,-2602.27 2944,-2602.27" />
<polyline fill="none" stroke="black" points="2943,-2597.27 2948,-2597.27 " />
<polygon fill="black" stroke="black" points="2949,-2602.27 2949,-2592.27 2951,-2592.27 2951,-2602.27 2949,-2602.27" />
<polyline fill="none" stroke="black" points="2948,-2597.27 2953,-2597.27 " />
<text text-anchor="start" x="2987" y="-2601.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<path fill="none" stroke="black" d="M3179.37,-2682.27C3084.15,-2682.27 3051.89,-2682.27 2953.1,-2682.27" />
<polygon fill="black" stroke="black" points="3187.5,-2682.27 3197.5,-2686.77 3192.5,-2682.27 3197.5,-2682.27 3197.5,-2682.27 3197.5,-2682.27 3192.5,-2682.27 3197.5,-2677.77 3187.5,-2682.27 3187.5,-2682.27" />
<ellipse fill="none" stroke="black" cx="3183.5" cy="-2682.27" rx="4" ry="4" />
<polygon fill="black" stroke="black" points="2944,-2687.27 2944,-2677.27 2946,-2677.27 2946,-2687.27 2944,-2687.27" />
<polyline fill="none" stroke="black" points="2943,-2682.27 2948,-2682.27 " />
<polygon fill="black" stroke="black" points="2949,-2687.27 2949,-2677.27 2951,-2677.27 2951,-2687.27 2949,-2687.27" />
<polyline fill="none" stroke="black" points="2948,-2682.27 2953,-2682.27 " />
<text text-anchor="start" x="2987" y="-2686.07" font-family="Helvetica,sans-Serif" font-size="14.00">
fk5ivlhvs3121yx2li5tqh54u4
</text>
</g> <!-- spec11threatmatch_a61228a6 -->
<g id="node32" class="node">
<g id="node33" class="node">
<title>spec11threatmatch_a61228a6</title>
<polygon fill="#ebcef2" stroke="transparent" points="3208.5,-2750.27 3208.5,-2769.27 3384.5,-2769.27 3384.5,-2750.27 3208.5,-2750.27" />
<text text-anchor="start" x="3210.5" y="-2757.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3208.5,-2835.27 3208.5,-2854.27 3384.5,-2854.27 3384.5,-2835.27 3208.5,-2835.27" />
<text text-anchor="start" x="3210.5" y="-2842.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Spec11ThreatMatch
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3384.5,-2750.27 3384.5,-2769.27 3494.5,-2769.27 3494.5,-2750.27 3384.5,-2750.27" />
<text text-anchor="start" x="3455.5" y="-2756.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3384.5,-2835.27 3384.5,-2854.27 3494.5,-2854.27 3494.5,-2835.27 3384.5,-2835.27" />
<text text-anchor="start" x="3455.5" y="-2841.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3210.5" y="-2738.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3210.5" y="-2823.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id
</text>
<text text-anchor="start" x="3331.5" y="-2737.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3331.5" y="-2822.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3386.5" y="-2737.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3386.5" y="-2822.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="3331.5" y="-2718.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3331.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3386.5" y="-2718.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3386.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<text text-anchor="start" x="3210.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3210.5" y="-2784.07" font-family="Helvetica,sans-Serif" font-size="14.00">
check_date
</text>
<text text-anchor="start" x="3331.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3331.5" y="-2784.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3386.5" y="-2699.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3386.5" y="-2784.07" font-family="Helvetica,sans-Serif" font-size="14.00">
date not null
</text>
<text text-anchor="start" x="3210.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3210.5" y="-2765.07" font-family="Helvetica,sans-Serif" font-size="14.00">
registrar_id
</text>
<text text-anchor="start" x="3331.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3331.5" y="-2765.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3386.5" y="-2680.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3386.5" y="-2765.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<text text-anchor="start" x="3210.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3210.5" y="-2746.07" font-family="Helvetica,sans-Serif" font-size="14.00">
tld
</text>
<text text-anchor="start" x="3331.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3331.5" y="-2746.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3386.5" y="-2661.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3386.5" y="-2746.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3207.5,-2654.27 3207.5,-2770.27 3495.5,-2770.27 3495.5,-2654.27 3207.5,-2654.27" />
<polygon fill="none" stroke="#888888" points="3207.5,-2739.27 3207.5,-2855.27 3495.5,-2855.27 3495.5,-2739.27 3207.5,-2739.27" />
</g> <!-- tld_f1fa57e2 -->
<g id="node33" class="node">
<g id="node34" class="node">
<title>tld_f1fa57e2</title>
<polygon fill="#ebcef2" stroke="transparent" points="3278.5,-2816.27 3278.5,-2835.27 3351.5,-2835.27 3351.5,-2816.27 3278.5,-2816.27" />
<text text-anchor="start" x="3280.5" y="-2823.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3278.5,-2901.27 3278.5,-2920.27 3351.5,-2920.27 3351.5,-2901.27 3278.5,-2901.27" />
<text text-anchor="start" x="3280.5" y="-2908.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Tld
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3351.5,-2816.27 3351.5,-2835.27 3425.5,-2835.27 3425.5,-2816.27 3351.5,-2816.27" />
<text text-anchor="start" x="3386.5" y="-2822.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3351.5,-2901.27 3351.5,-2920.27 3425.5,-2920.27 3425.5,-2901.27 3351.5,-2901.27" />
<text text-anchor="start" x="3386.5" y="-2907.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3280.5" y="-2804.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3280.5" y="-2889.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
tld_name
</text>
<text text-anchor="start" x="3345.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3345.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3353.5" y="-2803.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3353.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00">
text not null
</text>
<polygon fill="none" stroke="#888888" points="3277,-2796.27 3277,-2836.27 3426,-2836.27 3426,-2796.27 3277,-2796.27" />
<polygon fill="none" stroke="#888888" points="3277,-2881.27 3277,-2921.27 3426,-2921.27 3426,-2881.27 3277,-2881.27" />
</g> <!-- transaction_d50389d4 -->
<g id="node34" class="node">
<g id="node35" class="node">
<title>transaction_d50389d4</title>
<polygon fill="#ebcef2" stroke="transparent" points="3234.5,-2901.27 3234.5,-2920.27 3359.5,-2920.27 3359.5,-2901.27 3234.5,-2901.27" />
<text text-anchor="start" x="3236.5" y="-2908.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3234.5,-2986.27 3234.5,-3005.27 3359.5,-3005.27 3359.5,-2986.27 3234.5,-2986.27" />
<text text-anchor="start" x="3236.5" y="-2993.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
public.Transaction
</text>
<polygon fill="#ebcef2" stroke="transparent" points="3359.5,-2901.27 3359.5,-2920.27 3469.5,-2920.27 3469.5,-2901.27 3359.5,-2901.27" />
<text text-anchor="start" x="3430.5" y="-2907.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<polygon fill="#ebcef2" stroke="transparent" points="3359.5,-2986.27 3359.5,-3005.27 3469.5,-3005.27 3469.5,-2986.27 3359.5,-2986.27" />
<text text-anchor="start" x="3430.5" y="-2992.07" font-family="Helvetica,sans-Serif" font-size="14.00">
[table]
</text>
<text text-anchor="start" x="3236.5" y="-2889.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
<text text-anchor="start" x="3236.5" y="-2974.07" font-family="Helvetica,sans-Serif" font-weight="bold" font-style="italic" font-size="14.00">
id
</text>
<text text-anchor="start" x="3303.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3303.5" y="-2973.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3361.5" y="-2888.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3361.5" y="-2973.07" font-family="Helvetica,sans-Serif" font-size="14.00">
bigserial not null
</text>
<text text-anchor="start" x="3303.5" y="-2869.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3303.5" y="-2954.07" font-family="Helvetica,sans-Serif" font-size="14.00">
</text>
<text text-anchor="start" x="3361.5" y="-2869.07" font-family="Helvetica,sans-Serif" font-size="14.00">
<text text-anchor="start" x="3361.5" y="-2954.07" font-family="Helvetica,sans-Serif" font-size="14.00">
auto-incremented
</text>
<polygon fill="none" stroke="#888888" points="3233,-2862.77 3233,-2921.77 3470,-2921.77 3470,-2862.77 3233,-2862.77" />
<polygon fill="none" stroke="#888888" points="3233,-2947.77 3233,-3006.77 3470,-3006.77 3470,-2947.77 3233,-2947.77" />
</g>
</g>
</svg>
@ -4673,6 +4701,41 @@ td.section {
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="kmssecret_f3b28857" class="caption_name">public.KmsSecret</span> <span class="caption_description">[table]</span>
</caption>
<tbody>
<tr>
<td class="spacer"></td>
<td class="minwidth"><b><i>revision_id</i></b></td>
<td class="minwidth">int8 not null</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">secret_name</td>
<td class="minwidth">text not null</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="3" class="section">Primary Key</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td colspan="2" class="name">KmsSecret_pkey</td>
<td class="description right">[primary key]</td>
</tr>
<tr>
<td class="spacer"></td>
<td class="minwidth">revision_id</td>
<td class="minwidth"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<table>
<caption style="background-color: #EBCEF2;"> <span id="lock_f21d4861" class="caption_name">public.Lock</span> <span class="caption_description">[table]</span>
</caption>

File diff suppressed because it is too large Load diff

View file

@ -68,3 +68,4 @@ V67__grace_period_history_ids.sql
V68__make_reserved_list_nullable_in_registry.sql
V69__change_primary_key_and_add_history_table_for_delegation_signer.sql
V70__signed_mark_revocation_list.sql
V71__create_kms_secret.sql

View file

@ -0,0 +1,24 @@
-- Copyright 2020 The Nomulus Authors. All Rights Reserved.
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
CREATE TABLE "KmsSecret" (
revision_id int8 NOT NULL,
creation_time timestamptz NOT NULL,
encrypted_value text NOT NULL,
crypto_key_version_name text NOT NULL,
secret_name text NOT NULL,
PRIMARY KEY (revision_id)
);
CREATE INDEX IDXli9nil3s4t4p21i3xluvvilb7 ON "KmsSecret" (secret_name);

View file

@ -452,6 +452,15 @@
primary key (host_repo_id, history_revision_id)
);
create table "KmsSecret" (
revision_id int8 not null,
creation_time timestamptz not null,
encrypted_value text not null,
crypto_key_version_name text not null,
secret_name text not null,
primary key (revision_id)
);
create table "Lock" (
resource_name text not null,
tld text not null,
@ -727,6 +736,7 @@ create index IDX1iy7njgb7wjmj9piml4l2g0qi on "HostHistory" (history_registrar_id
create index IDXkkwbwcwvrdkkqothkiye4jiff on "HostHistory" (host_name);
create index IDXknk8gmj7s47q56cwpa6rmpt5l on "HostHistory" (history_type);
create index IDX67qwkjtlq5q8dv6egtrtnhqi7 on "HostHistory" (history_modification_time);
create index IDXli9nil3s4t4p21i3xluvvilb7 on "KmsSecret" (secret_name);
create index IDXe7wu46c7wpvfmfnj4565abibp on "PollMessage" (registrar_id);
create index IDXaydgox62uno9qx8cjlj5lauye on "PollMessage" (event_time);
create index premiumlist_name_idx on "PremiumList" (name);

View file

@ -590,6 +590,19 @@ CREATE TABLE public."HostHistory" (
);
--
-- Name: KmsSecret; Type: TABLE; Schema: public; Owner: -
--
CREATE TABLE public."KmsSecret" (
revision_id bigint NOT NULL,
creation_time timestamp with time zone NOT NULL,
encrypted_value text NOT NULL,
crypto_key_version_name text NOT NULL,
secret_name text NOT NULL
);
--
-- Name: Lock; Type: TABLE; Schema: public; Owner: -
--
@ -1193,6 +1206,14 @@ ALTER TABLE ONLY public."Host"
ADD CONSTRAINT "Host_pkey" PRIMARY KEY (repo_id);
--
-- Name: KmsSecret KmsSecret_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
ALTER TABLE ONLY public."KmsSecret"
ADD CONSTRAINT "KmsSecret_pkey" PRIMARY KEY (revision_id);
--
-- Name: Lock Lock_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@ -1538,6 +1559,13 @@ CREATE INDEX idxkjt9yaq92876dstimd93hwckh ON public."Domain" USING btree (curren
CREATE INDEX idxknk8gmj7s47q56cwpa6rmpt5l ON public."HostHistory" USING btree (history_type);
--
-- Name: idxli9nil3s4t4p21i3xluvvilb7; Type: INDEX; Schema: public; Owner: -
--
CREATE INDEX idxli9nil3s4t4p21i3xluvvilb7 ON public."KmsSecret" USING btree (secret_name);
--
-- Name: idxlrq7v63pc21uoh3auq6eybyhl; Type: INDEX; Schema: public; Owner: -
--