Skip to content

Commit e5ebc5a

Browse files
authored
Save Cloud SQL connection names in Keyring (#2622)
This eliminates the need to make a new release after database disaster recovery.
1 parent f9d2839 commit e5ebc5a

File tree

10 files changed

+95
-9
lines changed

10 files changed

+95
-9
lines changed

core/src/main/java/google/registry/keyring/api/DummyKeyringModule.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@ static InMemoryKeyring provideDummyKeyring() {
124124
"not a real login",
125125
"not a real credential",
126126
"not a real password",
127-
"not a real password");
127+
"not a real password",
128+
"not the real primary connection",
129+
"not the real replica connection");
128130
}
129131

130132
private DummyKeyringModule() {}

core/src/main/java/google/registry/keyring/api/InMemoryKeyring.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public final class InMemoryKeyring implements Keyring {
3939
private final String marksdbLordnPassword;
4040
private final String marksdbSmdrlLoginAndPassword;
4141
private final String bsaApiKey;
42+
private final String sqlPrimaryConnectionName;
43+
private final String sqlReplicaConnectionName;
4244

4345
public InMemoryKeyring(
4446
PGPKeyPair rdeStagingKey,
@@ -55,7 +57,9 @@ public InMemoryKeyring(
5557
String marksdbSmdrlLoginAndPassword,
5658
String cloudSqlPassword,
5759
String toolsCloudSqlPassword,
58-
String bsaApiKey) {
60+
String bsaApiKey,
61+
String sqlPrimaryConnectionName,
62+
String sqlReplicaConnectionName) {
5963
checkArgument(PgpHelper.isSigningKey(rdeSigningKey.getPublicKey()),
6064
"RDE signing key must support signing: %s", rdeSigningKey.getKeyID());
6165
checkArgument(rdeStagingKey.getPublicKey().isEncryptionKey(),
@@ -81,6 +85,8 @@ public InMemoryKeyring(
8185
this.marksdbSmdrlLoginAndPassword =
8286
checkNotNull(marksdbSmdrlLoginAndPassword, "marksdbSmdrlLoginAndPassword");
8387
this.bsaApiKey = checkNotNull(bsaApiKey, "bsaApiKey");
88+
this.sqlPrimaryConnectionName = sqlPrimaryConnectionName;
89+
this.sqlReplicaConnectionName = sqlReplicaConnectionName;
8490
}
8591

8692
@Override
@@ -153,6 +159,16 @@ public String getBsaApiKey() {
153159
return bsaApiKey;
154160
}
155161

162+
@Override
163+
public String getSqlPrimaryConnectionName() {
164+
return sqlPrimaryConnectionName;
165+
}
166+
167+
@Override
168+
public String getSqlReplicaConnectionName() {
169+
return sqlReplicaConnectionName;
170+
}
171+
156172
/** Does nothing. */
157173
@Override
158174
public void close() {}

core/src/main/java/google/registry/keyring/api/Keyring.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ public interface Keyring extends AutoCloseable {
148148
/** Returns the API_KEY for authentication with the BSA portal. */
149149
String getBsaApiKey();
150150

151+
/** Returns the Cloud SQL connection name of the primary database instance. */
152+
String getSqlPrimaryConnectionName();
153+
154+
/** Returns the Cloud SQL connection name of the replica database instance. */
155+
String getSqlReplicaConnectionName();
156+
151157
// Don't throw so try-with-resources works better.
152158
@Override
153159
void close();

core/src/main/java/google/registry/keyring/secretmanager/SecretManagerKeyring.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@ String getLabel() {
5757

5858
/** Key labels for string secrets. */
5959
enum StringKeyLabel {
60-
SAFE_BROWSING_API_KEY,
6160
BSA_API_KEY_STRING,
6261
ICANN_REPORTING_PASSWORD_STRING,
6362
MARKSDB_DNL_LOGIN_STRING,
6463
MARKSDB_LORDN_PASSWORD_STRING,
6564
MARKSDB_SMDRL_LOGIN_STRING,
6665
RDE_SSH_CLIENT_PRIVATE_STRING,
67-
RDE_SSH_CLIENT_PUBLIC_STRING;
66+
RDE_SSH_CLIENT_PUBLIC_STRING,
67+
SAFE_BROWSING_API_KEY,
68+
SQL_PRIMARY_CONN_NAME,
69+
SQL_REPLICA_CONN_NAME;
6870

6971
String getLabel() {
7072
return UPPER_UNDERSCORE.to(LOWER_HYPHEN, name());
@@ -148,6 +150,16 @@ public String getBsaApiKey() {
148150
return getString(StringKeyLabel.BSA_API_KEY_STRING);
149151
}
150152

153+
@Override
154+
public String getSqlPrimaryConnectionName() {
155+
return getString(StringKeyLabel.SQL_PRIMARY_CONN_NAME);
156+
}
157+
158+
@Override
159+
public String getSqlReplicaConnectionName() {
160+
return getString(StringKeyLabel.SQL_REPLICA_CONN_NAME);
161+
}
162+
151163
/** No persistent resources are maintained for this Keyring implementation. */
152164
@Override
153165
public void close() {}

core/src/main/java/google/registry/keyring/secretmanager/SecretManagerKeyringUpdater.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import static google.registry.keyring.secretmanager.SecretManagerKeyring.StringKeyLabel.RDE_SSH_CLIENT_PRIVATE_STRING;
3333
import static google.registry.keyring.secretmanager.SecretManagerKeyring.StringKeyLabel.RDE_SSH_CLIENT_PUBLIC_STRING;
3434
import static google.registry.keyring.secretmanager.SecretManagerKeyring.StringKeyLabel.SAFE_BROWSING_API_KEY;
35+
import static google.registry.keyring.secretmanager.SecretManagerKeyring.StringKeyLabel.SQL_PRIMARY_CONN_NAME;
36+
import static google.registry.keyring.secretmanager.SecretManagerKeyring.StringKeyLabel.SQL_REPLICA_CONN_NAME;
3537
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
3638

3739
import com.google.common.flogger.FluentLogger;
@@ -124,6 +126,14 @@ public SecretManagerKeyringUpdater setBsaApiKey(String credential) {
124126
return setString(credential, BSA_API_KEY_STRING);
125127
}
126128

129+
public SecretManagerKeyringUpdater setSqlPrimaryConnectionName(String name) {
130+
return setString(name, SQL_PRIMARY_CONN_NAME);
131+
}
132+
133+
public SecretManagerKeyringUpdater setSqlReplicaConnectionName(String name) {
134+
return setString(name, SQL_REPLICA_CONN_NAME);
135+
}
136+
127137
/**
128138
* Persists the secrets in the Secret Manager.
129139
*

core/src/main/java/google/registry/tools/GetKeyringSecretCommand.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,6 @@ public void run() throws Exception {
6464
case BSA_API_KEY -> out.write(KeySerializer.serializeString(keyring.getBsaApiKey()));
6565
case ICANN_REPORTING_PASSWORD ->
6666
out.write(KeySerializer.serializeString(keyring.getIcannReportingPassword()));
67-
case SAFE_BROWSING_API_KEY ->
68-
out.write(KeySerializer.serializeString(keyring.getSafeBrowsingAPIKey()));
6967
case MARKSDB_DNL_LOGIN_AND_PASSWORD ->
7068
out.write(KeySerializer.serializeString(keyring.getMarksdbDnlLoginAndPassword()));
7169
case MARKSDB_LORDN_PASSWORD ->
@@ -91,6 +89,12 @@ public void run() throws Exception {
9189
keyring.getRdeStagingEncryptionKey(), keyring.getRdeStagingDecryptionKey())));
9290
case RDE_STAGING_PUBLIC_KEY ->
9391
out.write(KeySerializer.serializePublicKey(keyring.getRdeStagingEncryptionKey()));
92+
case SAFE_BROWSING_API_KEY ->
93+
out.write(KeySerializer.serializeString(keyring.getSafeBrowsingAPIKey()));
94+
case SQL_PRIMARY_CONN_NAME ->
95+
out.write(KeySerializer.serializeString(keyring.getSqlPrimaryConnectionName()));
96+
case SQL_REPLICA_CONN_NAME ->
97+
out.write(KeySerializer.serializeString(keyring.getSqlReplicaConnectionName()));
9498
}
9599
}
96100
}

core/src/main/java/google/registry/tools/UpdateKeyringSecretCommand.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,16 @@ public void run() throws Exception {
9090
secretManagerKeyringUpdater.setRdeSshClientPublicKey(deserializeString(input));
9191
case RDE_STAGING_KEY_PAIR ->
9292
secretManagerKeyringUpdater.setRdeStagingKey(deserializeKeyPair(input));
93-
case SAFE_BROWSING_API_KEY ->
94-
secretManagerKeyringUpdater.setSafeBrowsingAPIKey(deserializeString(input));
9593
case RDE_STAGING_PUBLIC_KEY ->
9694
throw new IllegalArgumentException(
9795
"Can't update RDE_STAGING_PUBLIC_KEY directly."
9896
+ " Must update public and private keys together using RDE_STAGING_KEY_PAIR.");
97+
case SAFE_BROWSING_API_KEY ->
98+
secretManagerKeyringUpdater.setSafeBrowsingAPIKey(deserializeString(input));
99+
case SQL_PRIMARY_CONN_NAME ->
100+
secretManagerKeyringUpdater.setSqlPrimaryConnectionName(deserializeString(input));
101+
case SQL_REPLICA_CONN_NAME ->
102+
secretManagerKeyringUpdater.setSqlReplicaConnectionName(deserializeString(input));
99103
}
100104

101105
secretManagerKeyringUpdater.update();

core/src/main/java/google/registry/tools/params/KeyringKeyName.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,7 @@ public enum KeyringKeyName {
3636
RDE_SSH_CLIENT_PUBLIC_KEY,
3737
RDE_STAGING_KEY_PAIR,
3838
RDE_STAGING_PUBLIC_KEY,
39-
SAFE_BROWSING_API_KEY
39+
SAFE_BROWSING_API_KEY,
40+
SQL_PRIMARY_CONN_NAME,
41+
SQL_REPLICA_CONN_NAME
4042
}

core/src/test/java/google/registry/keyring/secretmanager/SecretManagerKeyringUpdaterTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,24 @@ void bsaApiKey() {
102102
verifyPersistedSecret("bsa-api-key-string", secret);
103103
}
104104

105+
@Test
106+
void sqlPrimaryConnectionName() {
107+
String name = "name";
108+
updater.setSqlPrimaryConnectionName(name).update();
109+
110+
assertThat(keyring.getSqlPrimaryConnectionName()).isEqualTo(name);
111+
verifyPersistedSecret("sql-primary-conn-name", name);
112+
}
113+
114+
@Test
115+
void sqlReplicaConnectionName() {
116+
String name = "name";
117+
updater.setSqlReplicaConnectionName(name).update();
118+
119+
assertThat(keyring.getSqlReplicaConnectionName()).isEqualTo(name);
120+
verifyPersistedSecret("sql-replica-conn-name", name);
121+
}
122+
105123
@Test
106124
void marksdbDnlLoginAndPassword() {
107125
String secret = "marksdbDnlLoginAndPassword";

core/src/test/java/google/registry/testing/FakeKeyringModule.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public final class FakeKeyringModule {
5656
private static final String MARKSDB_LORDN_PASSWORD = "yolo";
5757
private static final String MARKSDB_SMDRL_LOGIN_AND_PASSWORD = "smdrl:yolo";
5858
private static final String BSA_API_KEY = "bsaapikey";
59+
private static final String SQL_PRIMARY_CONNECTION = "project:primary-region:primary-name";
60+
private static final String SQL_REPLICA_CONNECTION = "project:replica-region:replica-name";
5961

6062
@Provides
6163
public Keyring get() {
@@ -151,6 +153,16 @@ public PGPPublicKey getBrdaReceiverKey() {
151153
return rdeReceiverKey;
152154
}
153155

156+
@Override
157+
public String getSqlPrimaryConnectionName() {
158+
return SQL_PRIMARY_CONNECTION;
159+
}
160+
161+
@Override
162+
public String getSqlReplicaConnectionName() {
163+
return SQL_REPLICA_CONNECTION;
164+
}
165+
154166
@Override
155167
public void close() {}
156168
};

0 commit comments

Comments
 (0)