Skip to content

Commit e5649bd

Browse files
authored
Remove usage of internal StorageConnectionString in repository-azure (#94054)
This change replaces the usage of the internal Azure API, that parses the connection string in order to retrieve the primary and secondary URI's, with our own implementation.
1 parent 87fdbb8 commit e5649bd

File tree

4 files changed

+78
-15
lines changed

4 files changed

+78
-15
lines changed

modules/repository-azure/src/main/java/org/elasticsearch/repositories/azure/AzureClientProvider.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@
2828
import com.azure.core.http.ProxyOptions;
2929
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
3030
import com.azure.core.http.policy.HttpPipelinePolicy;
31-
import com.azure.core.util.logging.ClientLogger;
3231
import com.azure.storage.blob.BlobServiceAsyncClient;
3332
import com.azure.storage.blob.BlobServiceClient;
3433
import com.azure.storage.blob.BlobServiceClientBuilder;
35-
import com.azure.storage.common.implementation.connectionstring.StorageConnectionString;
3634
import com.azure.storage.common.policy.RequestRetryOptions;
3735

3836
import org.apache.logging.log4j.LogManager;
@@ -95,7 +93,6 @@ class AzureClientProvider extends AbstractLifecycleComponent {
9593
private final EventLoopGroup eventLoopGroup;
9694
private final ConnectionProvider connectionProvider;
9795
private final ByteBufAllocator byteBufAllocator;
98-
private final ClientLogger clientLogger = new ClientLogger(AzureClientProvider.class);
9996
private final LoopResources nioLoopResources;
10097
private volatile boolean closed = false;
10198

@@ -176,9 +173,7 @@ AzureBlobServiceClient createClient(
176173
}
177174

178175
if (locationMode.isSecondary()) {
179-
// TODO: maybe extract this logic so we don't need to have a client logger around?
180-
StorageConnectionString storageConnectionString = StorageConnectionString.create(connectionString, clientLogger);
181-
String secondaryUri = storageConnectionString.getBlobEndpoint().getSecondaryUri();
176+
String secondaryUri = settings.getStorageEndpoint().secondaryURI();
182177
if (secondaryUri == null) {
183178
throw new IllegalArgumentException(
184179
"Unable to configure an AzureClient using a secondary location without a secondary " + "endpoint"

modules/repository-azure/src/main/java/org/elasticsearch/repositories/azure/AzureStorageService.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
import com.azure.core.http.ProxyOptions;
1212
import com.azure.core.util.logging.ClientLogger;
13-
import com.azure.storage.common.implementation.connectionstring.StorageConnectionString;
1413
import com.azure.storage.common.policy.RequestRetryOptions;
1514
import com.azure.storage.common.policy.RetryPolicyType;
1615

@@ -125,10 +124,9 @@ int getMaxReadRetries(String clientName) {
125124

126125
// non-static, package private for testing
127126
RequestRetryOptions getRetryOptions(LocationMode locationMode, AzureStorageSettings azureStorageSettings) {
128-
String connectString = azureStorageSettings.getConnectString();
129-
StorageConnectionString storageConnectionString = StorageConnectionString.create(connectString, clientLogger);
130-
String primaryUri = storageConnectionString.getBlobEndpoint().getPrimaryUri();
131-
String secondaryUri = storageConnectionString.getBlobEndpoint().getSecondaryUri();
127+
AzureStorageSettings.StorageEndpoint endpoint = azureStorageSettings.getStorageEndpoint();
128+
String primaryUri = endpoint.primaryURI();
129+
String secondaryUri = endpoint.secondaryURI();
132130

133131
if (locationMode == LocationMode.PRIMARY_THEN_SECONDARY && secondaryUri == null) {
134132
throw new IllegalArgumentException("Unable to use " + locationMode + " location mode without a secondary location URI");

modules/repository-azure/src/main/java/org/elasticsearch/repositories/azure/AzureStorageSettings.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.net.InetAddress;
2323
import java.net.InetSocketAddress;
2424
import java.net.Proxy;
25+
import java.net.URI;
26+
import java.net.URISyntaxException;
2527
import java.net.UnknownHostException;
2628
import java.util.Collections;
2729
import java.util.HashMap;
@@ -266,4 +268,56 @@ private static <T> T getValue(Settings settings, String groupName, Setting<T> se
266268
final String fullKey = k.toConcreteKey(groupName).toString();
267269
return setting.getConcreteSetting(fullKey).get(settings);
268270
}
271+
272+
private static final String BLOB_ENDPOINT_NAME = "BlobEndpoint";
273+
private static final String BLOB_SECONDARY_ENDPOINT_NAME = "BlobSecondaryEndpoint";
274+
275+
record StorageEndpoint(String primaryURI, @Nullable String secondaryURI) {}
276+
277+
StorageEndpoint getStorageEndpoint() {
278+
String primaryURI = getProperty(BLOB_ENDPOINT_NAME);
279+
String secondaryURI = getProperty(BLOB_SECONDARY_ENDPOINT_NAME);
280+
if (primaryURI != null) {
281+
return new StorageEndpoint(primaryURI, secondaryURI);
282+
}
283+
return new StorageEndpoint(deriveURIFromSettings(true), deriveURIFromSettings(false));
284+
}
285+
286+
/**
287+
* Returns the value for the given property name, or null if not configured.
288+
* @throws IllegalArgumentException if the connectionString is malformed
289+
*/
290+
private String getProperty(String propertyName) {
291+
final String[] settings = getConnectString().split(";");
292+
for (int i = 0; i < settings.length; i++) {
293+
String setting = settings[i].trim();
294+
if (setting.length() > 0) {
295+
final int idx = setting.indexOf("=");
296+
if (idx == -1 || idx == 0 || idx == settings[i].length() - 1) {
297+
new IllegalArgumentException("Invalid connection string: " + getConnectString());
298+
}
299+
if (propertyName.equals(setting.substring(0, idx))) {
300+
return setting.substring(idx + 1);
301+
}
302+
}
303+
}
304+
return null;
305+
}
306+
307+
private static final String DEFAULT_DNS = "core.windows.net";
308+
309+
/** Derives the primary or secondary endpoint from the settings. */
310+
private String deriveURIFromSettings(boolean isPrimary) {
311+
String uriString = new StringBuilder().append("https://")
312+
.append(account)
313+
.append(isPrimary ? "" : "-secondary")
314+
.append(".blob.")
315+
.append(Strings.isNullOrEmpty(endpointSuffix) ? DEFAULT_DNS : endpointSuffix)
316+
.toString();
317+
try {
318+
return new URI(uriString).toString(); // validates the URI
319+
} catch (URISyntaxException e) {
320+
throw new IllegalArgumentException(e);
321+
}
322+
}
269323
}

modules/repository-azure/src/test/java/org/elasticsearch/repositories/azure/AzureStorageServiceTests.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,17 @@ public void testTimeoutConfiguration() throws Exception {
350350
}
351351
}
352352

353-
public void testRetryConfigurationForSecondaryFallbackLocationMode() throws Exception {
353+
public void testRetryConfigurationForSecondaryFallbackLocationMode1() throws Exception {
354+
testRetryConfigurationForSecondaryFallbackLocationModeImpl(true);
355+
}
356+
357+
public void testRetryConfigurationForSecondaryFallbackLocationMode2() throws Exception {
358+
testRetryConfigurationForSecondaryFallbackLocationModeImpl(false);
359+
}
360+
361+
public void testRetryConfigurationForSecondaryFallbackLocationModeImpl(boolean endpointSetting) throws Exception {
354362
final String endpoint;
355-
if (randomBoolean()) {
363+
if (endpointSetting) {
356364
endpoint = "core.windows.net";
357365
} else {
358366
endpoint = "ignored;BlobEndpoint=https://myaccount1.blob.core.windows.net;"
@@ -375,9 +383,17 @@ public void testRetryConfigurationForSecondaryFallbackLocationMode() throws Exce
375383
}
376384
}
377385

378-
public void testRetryConfigurationForPrimaryFallbackLocationMode() throws Exception {
386+
public void testRetryConfigurationForPrimaryFallbackLocationMode1() throws Exception {
387+
testRetryConfigurationForPrimaryFallbackLocationModeImpl(true);
388+
}
389+
390+
public void testRetryConfigurationForPrimaryFallbackLocationMode2() throws Exception {
391+
testRetryConfigurationForPrimaryFallbackLocationModeImpl(false);
392+
}
393+
394+
private void testRetryConfigurationForPrimaryFallbackLocationModeImpl(boolean endpointSetting) throws Exception {
379395
final String endpoint;
380-
if (randomBoolean()) {
396+
if (endpointSetting) {
381397
endpoint = "core.windows.net";
382398
} else {
383399
endpoint = "ignored;BlobEndpoint=https://myaccount1.blob.core.windows.net;"

0 commit comments

Comments
 (0)