Skip to content

Commit 228ab6f

Browse files
authored
pubsub: add getAttributes for gcp pubsub (salesforce#120)
1 parent 3fa0e5e commit 228ab6f

File tree

11 files changed

+440
-18
lines changed

11 files changed

+440
-18
lines changed

blob/blob-gcp/src/test/java/com/salesforce/multicloudj/blob/gcp/GcpBlobStoreTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2077,7 +2077,6 @@ void testDoDownloadDirectory_SkipsFolderMarkers() throws Exception {
20772077
}
20782078

20792079
@Test
2080-
@Disabled
20812080
void testDoDownloadDirectory_PathTraversalProtection() throws Exception {
20822081
// Given
20832082
String prefix = "test-prefix/";

pubsub/pubsub-aws/src/java/com/salesforce/multicloudj/pubsub/aws/AwsSubscription.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
import java.util.Collections;
44
import java.util.List;
5-
import java.util.Map;
65
import java.util.concurrent.CompletableFuture;
76

87
import com.salesforce.multicloudj.common.aws.AwsConstants;
98
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
109
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
10+
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
1111
import com.salesforce.multicloudj.pubsub.driver.AbstractSubscription;
1212
import com.salesforce.multicloudj.pubsub.driver.AckID;
1313
import com.salesforce.multicloudj.pubsub.driver.Message;
@@ -56,8 +56,11 @@ public boolean canNack() {
5656
}
5757

5858
@Override
59-
public Map<String, String> getAttributes() {
60-
return null;
59+
public GetAttributeResult getAttributes() {
60+
return new GetAttributeResult.Builder()
61+
.name("aws-subscription")
62+
.topic("aws-topic")
63+
.build();
6164
}
6265

6366
@Override
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.salesforce.multicloudj.pubsub.client;
2+
3+
4+
/**
5+
* Result object containing subscription attributes that are common across all Pub/Sub providers.
6+
* This class provides a standardized way to access subscription configuration properties
7+
* regardless of the underlying cloud provider (AWS, GCP, Aliyun, etc.).
8+
*/
9+
public class GetAttributeResult {
10+
11+
// Core Identification
12+
private String name;
13+
private String topic;
14+
15+
// Default constructor
16+
public GetAttributeResult() {}
17+
18+
// Builder pattern for easy construction
19+
public static class Builder {
20+
private final GetAttributeResult result = new GetAttributeResult();
21+
22+
public Builder name(String name) {
23+
result.name = name;
24+
return this;
25+
}
26+
27+
public Builder topic(String topic) {
28+
result.topic = topic;
29+
return this;
30+
}
31+
32+
public GetAttributeResult build() {
33+
return result;
34+
}
35+
}
36+
37+
// Getters
38+
public String getName() { return name; }
39+
public String getTopic() { return topic; }
40+
41+
// Setters
42+
public void setName(String name) { this.name = name; }
43+
public void setTopic(String topic) { this.topic = topic; }
44+
45+
}

pubsub/pubsub-client/src/main/java/com/salesforce/multicloudj/pubsub/client/SubscriptionClient.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import java.net.URI;
44
import java.util.List;
5-
import java.util.Map;
65
import java.util.concurrent.CompletableFuture;
76

87
import com.salesforce.multicloudj.common.exceptions.ExceptionHandler;
@@ -145,10 +144,10 @@ public boolean canNack() {
145144
* This may include provider-specific configuration like delivery delay,
146145
* message retention period, etc.
147146
*
148-
* @return A map of subscription attributes
147+
* @return A GetAttributeResult containing subscription attributes
149148
* @throws SubstrateSdkException If the operation fails
150149
*/
151-
public Map<String, String> getAttributes() {
150+
public GetAttributeResult getAttributes() {
152151
try {
153152
return subscription.getAttributes();
154153
} catch (Throwable t) {

pubsub/pubsub-client/src/main/java/com/salesforce/multicloudj/pubsub/driver/AbstractSubscription.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.Collections;
88
import java.util.Queue;
99
import java.util.List;
10-
import java.util.Map;
1110
import java.util.concurrent.CompletableFuture;
1211
import java.util.concurrent.ExecutionException;
1312
import java.util.concurrent.ExecutorService;
@@ -21,6 +20,7 @@
2120
import com.salesforce.multicloudj.common.exceptions.FailedPreconditionException;
2221
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
2322
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
23+
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
2424
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
2525
import com.salesforce.multicloudj.sts.model.CredentialsOverrider;
2626

@@ -410,7 +410,7 @@ public CompletableFuture<Void> sendNacks(List<AckID> ackIDs) {
410410

411411
public abstract boolean canNack();
412412
public abstract boolean isRetryable(Throwable error);
413-
public abstract Map<String, String> getAttributes();
413+
public abstract GetAttributeResult getAttributes();
414414

415415
protected abstract void doSendAcks(List<AckID> ackIDs);
416416
protected abstract void doSendNacks(List<AckID> ackIDs);

pubsub/pubsub-client/src/test/java/com/salesforce/multicloudj/pubsub/client/AbstractPubsubIT.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.salesforce.multicloudj.pubsub.driver.AbstractTopic;
55
import com.salesforce.multicloudj.pubsub.driver.Message;
66
import com.salesforce.multicloudj.pubsub.driver.AckID;
7+
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
78
import com.salesforce.multicloudj.common.util.common.TestsUtil;
89
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
910

@@ -325,4 +326,25 @@ public void testDoubleAck() throws Exception {
325326
subscription.sendAck(receivedMessages.get(0).getAckID());
326327
}
327328
}
329+
330+
@Test
331+
public void testGetAttributes() throws Exception {
332+
try (AbstractSubscription subscription = harness.createSubscriptionDriver()) {
333+
GetAttributeResult attributes = subscription.getAttributes();
334+
335+
// Verify that attributes are returned
336+
Assertions.assertNotNull(attributes, "Attributes should not be null");
337+
338+
// Verify essential attributes that should be present across all providers
339+
Assertions.assertNotNull(attributes.getName(), "Name should not be null");
340+
Assertions.assertFalse(attributes.getName().isEmpty(), "Name should not be empty");
341+
342+
Assertions.assertNotNull(attributes.getTopic(), "Topic should not be null");
343+
Assertions.assertFalse(attributes.getTopic().isEmpty(), "Topic should not be empty");
344+
345+
// Verify that we have the essential attributes
346+
Assertions.assertNotNull(attributes.getName(), "Should have name attribute");
347+
Assertions.assertNotNull(attributes.getTopic(), "Should have topic attribute");
348+
}
349+
}
328350
}

pubsub/pubsub-client/src/test/java/com/salesforce/multicloudj/pubsub/client/SubscriptionClientTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,14 @@ public void testCanNack() {
137137
@Test
138138
public void testGetAttributes() {
139139
// Arrange
140-
Map<String, String> expectedAttributes = Map.of("key", "value");
140+
GetAttributeResult expectedAttributes = new GetAttributeResult.Builder()
141+
.name("test-subscription")
142+
.topic("test-topic")
143+
.build();
141144
when(mockSubscription.getAttributes()).thenReturn(expectedAttributes);
142145

143146
// Act
144-
Map<String, String> result = subscriptionClient.getAttributes();
147+
GetAttributeResult result = subscriptionClient.getAttributes();
145148

146149
// Assert
147150
assertEquals(expectedAttributes, result);

pubsub/pubsub-client/src/test/java/com/salesforce/multicloudj/pubsub/driver/AbstractSubscriptionTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
44
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
55
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
6+
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
67
import org.junit.jupiter.api.Test;
78
import org.junit.jupiter.api.Timeout;
89

@@ -133,7 +134,12 @@ protected Batcher.Options createAckBatcherOptions() {
133134
public boolean canNack() { return false; }
134135

135136
@Override
136-
public Map<String, String> getAttributes() { return Collections.emptyMap(); }
137+
public GetAttributeResult getAttributes() {
138+
return new GetAttributeResult.Builder()
139+
.name("test-subscription")
140+
.topic("test-topic")
141+
.build();
142+
}
137143

138144
@Override
139145
public boolean isRetryable(Throwable error) {

pubsub/pubsub-gcp/src/main/java/com/salesforce/multicloudj/pubsub/gcp/GcpSubscription.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
import com.google.pubsub.v1.PullResponse;
1515
import com.google.pubsub.v1.ReceivedMessage;
1616
import com.salesforce.multicloudj.common.exceptions.SubstrateSdkException;
17+
import com.google.pubsub.v1.Subscription;
1718
import com.salesforce.multicloudj.common.gcp.GcpConstants;
1819
import com.salesforce.multicloudj.common.exceptions.InvalidArgumentException;
20+
import com.salesforce.multicloudj.pubsub.client.GetAttributeResult;
1921

2022
import com.salesforce.multicloudj.common.gcp.GcpCredentialsProvider;
2123
import com.salesforce.multicloudj.pubsub.batcher.Batcher;
@@ -36,6 +38,9 @@
3638
import java.net.Proxy;
3739
import java.util.ArrayList;
3840
import java.util.Collections;
41+
import java.util.HashMap;
42+
import java.util.HashSet;
43+
import java.util.LinkedHashMap;
3944
import java.util.List;
4045
import java.util.Map;
4146
import java.util.concurrent.BlockingQueue;
@@ -184,9 +189,17 @@ public boolean isRetryable(Throwable error) {
184189
}
185190

186191
@Override
187-
public Map<String, String> getAttributes() {
188-
// TODO: Implement subscription attributes retrieval
189-
return Collections.emptyMap();
192+
public GetAttributeResult getAttributes() {
193+
try {
194+
Subscription sub = getOrCreateSubscriptionAdminClient().getSubscription(subscriptionName);
195+
196+
return new GetAttributeResult.Builder()
197+
.name(sub.getName())
198+
.topic(sub.getTopic())
199+
.build();
200+
} catch (ApiException e) {
201+
throw new SubstrateSdkException("Failed to retrieve subscription attributes", e);
202+
}
190203
}
191204

192205
@Override

0 commit comments

Comments
 (0)