Skip to content

Commit

Permalink
Storage queue linting, builder refactor, tests (#4383)
Browse files Browse the repository at this point in the history
* Initial check in for storage queue
  • Loading branch information
sima-zhu authored Jul 22, 2019
1 parent da7ebb6 commit 78ea66b
Show file tree
Hide file tree
Showing 97 changed files with 10,746 additions and 190 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,7 @@
<Or>
<Class name="com.azure.storage.blob.BlobInputStream"/>
<Class name="com.azure.storage.blob.BlobOutputStream"/>
<Class name="com.azure.storage.queue.QueueServiceClient"/>
</Or>
<Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
</Match>
Expand Down
7 changes: 6 additions & 1 deletion eng/jacoco-test-coverage/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
<azure-keyvault.version>4.0.0-preview.1</azure-keyvault.version>
<azure-messaging-eventhubs.version>5.0.0-preview.2</azure-messaging-eventhubs.version>
<azure-storage-blob.version>12.0.0-preview.1</azure-storage-blob.version>
<azure-storage-queue.version>12.0.0-preview.1</azure-storage-queue.version>
</properties>

<distributionManagement>
Expand Down Expand Up @@ -93,7 +94,11 @@
<!-- <artifactId>azure-storage-blob</artifactId>-->
<!-- <version>${azure-storage-blob.version}</version>-->
<!-- </dependency>-->

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-queue</artifactId>
<version>${azure-storage-queue.version}</version>
</dependency>
<!-- Tracing will be built and released separately. Removing tracing dependency
until we finalize dependency composition -->
<!-- <dependency>-->
Expand Down
7 changes: 6 additions & 1 deletion eng/spotbugs-aggregate-report/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
<azure-keyvault.version>4.0.0-preview.1</azure-keyvault.version>
<azure-messaging-eventhubs.version>5.0.0-preview.2</azure-messaging-eventhubs.version>
<azure-storage.version>12.0.0-preview.1</azure-storage.version>
<azure-storage-queue.version>12.0.0-preview.1</azure-storage-queue.version>
</properties>
<distributionManagement>
<site>
Expand Down Expand Up @@ -182,7 +183,11 @@
<!-- <artifactId>azure-storage-blob</artifactId>-->
<!-- <version>${azure-storage.version}</version>-->
<!-- </dependency>-->

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-queue</artifactId>
<version>${azure-storage-queue.version}</version>
</dependency>
<!-- Added this dependency to include necessary annotations used by reactor core.
Without this dependency, javadoc throws a warning as it cannot find enum When.MAYBE
which is used in @Nullable annotation in reactor core classes -->
Expand Down
8 changes: 7 additions & 1 deletion pom.client.xml
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,10 @@
<title>Azure Storage - Blobs</title>
<packages>com.azure.storage.blob*</packages>
</group>
<group>
<title>Azure Storage - Queues</title>
<packages>com.azure.storage.queue*</packages>
</group>
</groups>
<links>
<link>https://docs.oracle.com/javase/8/docs/api/</link>
Expand Down Expand Up @@ -546,7 +550,8 @@
-snippetpath ${project.basedir}/sdk/eventhubs/azure-eventhubs/src/samples/java
-snippetpath ${project.basedir}/sdk/keyvault/azure-keyvault-keys/src/samples/java
-snippetpath ${project.basedir}/sdk/keyvault/azure-keyvault-secrets/src/samples/java
<!-- -snippetpath ${project.basedir}/storage/client/blob/src/samples/java-->
<!-- -snippetpath ${project.basedir}/storage/client/blob/src/samples/java-->
-snippetpath ${project.basedir}/storage/client/queue/src/samples/java
</additionalOptions>
</configuration>
</reportSet>
Expand Down Expand Up @@ -748,5 +753,6 @@
<!-- <module>./sdk/tracing</module>-->
<module>./sdk/identity/azure-identity</module>
<module>./storage/client/blob</module>
<module>./storage/client/queue</module>
</modules>
</project>
135 changes: 85 additions & 50 deletions storage/client/queue/README.md

Large diffs are not rendered by default.

78 changes: 78 additions & 0 deletions storage/client/queue/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.azure</groupId>
<artifactId>azure-client-sdk-parent</artifactId>
<version>1.1.0</version>
<relativePath>../../../pom.client.xml</relativePath>
</parent>

<modelVersion>4.0.0</modelVersion>

<groupId>com.azure</groupId>
<artifactId>azure-storage-queue</artifactId>
<version>12.0.0-preview.1</version>

<name>azure-storage-queue</name>
<url>https://github.com/Azure/azure-sdk-for-java</url>

<distributionManagement>
<site>
<id>azure-java-build-docs</id>
<url>${site.url}/site/${project.artifactId}</url>
</site>
</distributionManagement>

<scm>
<url>scm:git:https://github.com/Azure/azure-sdk-for-java</url>
<connection>scm:git:[email protected]:Azure/azure-sdk-for-java.git</connection>
<tag>HEAD</tag>
</scm>

<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-core</artifactId>
<version>1.0.0-preview.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>

<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-core-test</artifactId>
<version>1.0.0-preview.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.0.0-preview.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>adal4j</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package com.azure.storage.common.credentials;

import com.azure.core.implementation.util.ImplUtils;
import com.azure.core.util.logging.ClientLogger;
import io.netty.handler.codec.http.QueryStringDecoder;

import javax.crypto.Mac;
Expand All @@ -26,11 +27,12 @@
* SharedKey credential policy that is put into a header to authorize requests.
*/
public final class SharedKeyCredential {
private static final ClientLogger LOGGER = new ClientLogger(SharedKeyCredential.class);
private static final String AUTHORIZATION_HEADER_FORMAT = "SharedKey %s:%s";

// Pieces of the connection string that are needed.
private static final String ACCOUNT_NAME = "AccountName".toLowerCase();
private static final String ACCOUNT_KEY = "AccountKey".toLowerCase();
private static final String ACCOUNT_NAME = "accountname";
private static final String ACCOUNT_KEY = "accountkey";

private final String accountName;
private final byte[] accountKey;
Expand Down Expand Up @@ -59,7 +61,7 @@ public static SharedKeyCredential fromConnectionString(String connectionString)
HashMap<String, String> connectionStringPieces = new HashMap<>();
for (String connectionStringPiece : connectionString.split(";")) {
String[] kvp = connectionStringPiece.split("=", 2);
connectionStringPieces.put(kvp[0].toLowerCase(), kvp[1]);
connectionStringPieces.put(kvp[0].toLowerCase(Locale.ROOT), kvp[1]);
}

String accountName = connectionStringPieces.get(ACCOUNT_NAME);
Expand Down Expand Up @@ -98,9 +100,11 @@ public String generateAuthorizationHeader(URL requestURL, String httpMethod, Map
*
* @param stringToSign The UTF-8-encoded string to sign.
* @return A {@code String} that contains the HMAC-SHA256-encoded signature.
* @throws InvalidKeyException If the accountKey is not a valid Base64-encoded string.
* @throws RuntimeException for one of the following cases:
* - If the HMAC-SHA256 signature for {@code sharedKeyCredentials} fails to generate.
* - If the an invalid key has been given to the client.
*/
public String computeHmac256(final String stringToSign) throws InvalidKeyException {
public String computeHmac256(final String stringToSign) {
try {
/*
We must get a new instance of the Mac calculator for each signature calculated because the instances are
Expand All @@ -111,8 +115,12 @@ public String computeHmac256(final String stringToSign) throws InvalidKeyExcepti
hmacSha256.init(new SecretKeySpec(this.accountKey, "HmacSHA256"));
byte[] utf8Bytes = stringToSign.getBytes(StandardCharsets.UTF_8);
return Base64.getEncoder().encodeToString(hmacSha256.doFinal(utf8Bytes));
} catch (final NoSuchAlgorithmException e) {
throw new Error(e);
} catch (final NoSuchAlgorithmException e) {
LOGGER.asError().log(e.getMessage());
throw new RuntimeException(e);
} catch (InvalidKeyException e) {
LOGGER.asError().log("Please double check the account key. Error details: " + e.getMessage());
throw new RuntimeException("Please double check the account key. Error details: " + e.getMessage());
}
}

Expand All @@ -121,20 +129,20 @@ private String buildStringToSign(URL requestURL, String httpMethod, Map<String,
contentLength = contentLength.equals("0") ? "" : contentLength;

// If the x-ms-header exists ignore the Date header
String dateHeader = (headers.containsKey("x-ms-date")) ? "" : getStandardHeaderValue(headers,"Date");
String dateHeader = (headers.containsKey("x-ms-date")) ? "" : getStandardHeaderValue(headers, "Date");

return String.join("\n",
httpMethod,
getStandardHeaderValue(headers,"Content-Encoding"),
getStandardHeaderValue(headers,"Content-Language"),
getStandardHeaderValue(headers, "Content-Encoding"),
getStandardHeaderValue(headers, "Content-Language"),
contentLength,
getStandardHeaderValue(headers,"Content-MD5"),
getStandardHeaderValue(headers,"Content-Type"),
getStandardHeaderValue(headers, "Content-MD5"),
getStandardHeaderValue(headers, "Content-Type"),
dateHeader,
getStandardHeaderValue(headers,"If-Modified-Since"),
getStandardHeaderValue(headers,"If-Match"),
getStandardHeaderValue(headers, "If-Modified-Since"),
getStandardHeaderValue(headers, "If-Match"),
getStandardHeaderValue(headers, "If-None-Match"),
getStandardHeaderValue(headers,"If-Unmodified-Since"),
getStandardHeaderValue(headers, "If-Unmodified-Since"),
getStandardHeaderValue(headers, "Range"),
getAdditionalXmsHeaders(headers),
getCanonicalizedResource(requestURL));
Expand Down Expand Up @@ -224,6 +232,7 @@ private String computeHMACSHA256(String stringToSign) {
String signature = Base64.getEncoder().encodeToString(hmacSha256.doFinal(utf8Bytes));
return String.format(AUTHORIZATION_HEADER_FORMAT, accountName, signature);
} catch (NoSuchAlgorithmException | InvalidKeyException ex) {
LOGGER.asError().log(ex.getMessage());
throw new Error(ex);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,11 @@ public RequestRetryOptions() {
* <p><strong>Sample Code</strong></p>
*
* <p>For more samples, please see the <a href="https://github.com/Azure/azure-storage-java/blob/master/src/test/java/com/microsoft/azure/storage/Samples.java">samples file</a></p>
* @throws IllegalArgumentException If one of the following case exists:
* <ul>
* <li> There is only one null value for retryDelay and maxRetryDelay.<li/>
* <li> Unrecognized retry policy type.<li/>
* </ul>
*/
public RequestRetryOptions(RetryPolicyType retryPolicyType, Integer maxTries, Integer tryTimeout,
Long retryDelayInMs, Long maxRetryDelayInMs, String secondaryHost) {
Expand Down Expand Up @@ -105,7 +110,6 @@ public RequestRetryOptions(RetryPolicyType retryPolicyType, Integer maxTries, In
}
this.maxRetryDelayInMs = TimeUnit.SECONDS.toMillis(120);
}

this.secondaryHost = secondaryHost;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
public final class RequestRetryPolicy implements HttpPipelinePolicy {
private final RequestRetryOptions requestRetryOptions;

/**
* Create a policy of retrying a given HTTP request.
* @param requestRetryOptions Options for configuring the RequestRetryPolicy.
*/
public RequestRetryPolicy(RequestRetryOptions requestRetryOptions) {
this.requestRetryOptions = requestRetryOptions;
}
Expand Down
Loading

0 comments on commit 78ea66b

Please sign in to comment.