Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add data residency for eu and global regions #743

Merged
merged 3 commits into from
Nov 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions examples/dataresidency/setregion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import com.sendgrid.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

//////////////////////////////////////////////////////////////////
// Set data residency to navigate to a region/edge.
// Currently supported: "global", "eu"


public class Example {
public static void main(String[] args) throws IOException {
try {

final Mail helloWorld = buildHelloEmail();

Request request = new Request();
request.setEndpoint("mail/send");
request.setBody(helloWorld.build());
request.setMethod(Method.POST);

// sending to global data residency
Sendgrid sg = buildSendgridObj("global");
Response response = sg.api(request);
System.out.println("Sending to hostname: " + sg.getHost());
System.out.println(response.getStatusCode());
System.out.println(response.getBody());
System.out.println(response.getHeaders());

// sending to EU data residency
Sendgrid sg = buildSendgridObj("eu");
Response response = sg.api(request);
System.out.println("Sending to hostname: " + sg.getHost());
System.out.println(response.getStatusCode());
System.out.println(response.getBody());
System.out.println(response.getHeaders());

// not configuring any region defaults to global
Sendgrid sg = new SendGrid(System.getenv("SENDGRID_API_KEY"));
Response response = sg.api(request);
System.out.println("Sending to hostname: " + sg.getHost());
System.out.println(response.getStatusCode());
System.out.println(response.getBody());
System.out.println(response.getHeaders());

} catch (IOException ex) {
throw ex;
}
}

public static Mail buildHelloEmail() {
Email from = new Email("test@example.com");
String subject = "Hello World from the Twilio SendGrid Java Library";
Email to = new Email("test@example.com");
Content content = new Content("text/plain", "some text here");
// Note that when you use this constructor an initial personalization object
// is created for you. It can be accessed via
// mail.personalization.get(0) as it is a List object
Mail mail = new Mail(from, subject, to, content);
Email email = new Email("test2@example.com");
mail.personalization.get(0).addTo(email);

return mail;
}

public static Sendgrid buildSendgridObj(String region){
SendGrid sg = new SendGrid(System.getenv("SENDGRID_API_KEY"));
sg.setDataResidency(region);
return sg;

}
}

25 changes: 25 additions & 0 deletions src/main/java/com/sendgrid/BaseInterface.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ public abstract class BaseInterface implements SendGridAPI {
private static final int RATE_LIMIT_RESPONSE_CODE = 429;
private static final int THREAD_POOL_SIZE = 8;

private static final Map<String, String> allowedRegionsHostMap;
static {
//todo: change this to Map.of() when we've moved on from Java 8
allowedRegionsHostMap = new HashMap<>();
allowedRegionsHostMap.put("eu", "api.eu.sendgrid.com");
allowedRegionsHostMap.put("global", "api.sendgrid.com");
}
private ExecutorService pool;

/**
Expand Down Expand Up @@ -336,4 +343,22 @@ public void run() {
}
});
}

/*
* Client libraries contain setters for specifying region/edge.
* This allows support global and eu regions only. This set will likely expand in the future.
* Global should be the default
* Global region means the message should be sent through:
* HTTP: api.sendgrid.com
* EU region means the message should be sent through:
* HTTP: api.eu.sendgrid.com
*/
public void setDataResidency(String region){
if (allowedRegionsHostMap.containsKey(region)){
this.host = allowedRegionsHostMap.get(region);
}
else{
throw new IllegalArgumentException("region can only be \"eu\" or \"global\"");
}
}
}
46 changes: 46 additions & 0 deletions src/test/java/com/sendgrid/SendGridTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3242,4 +3242,50 @@ public void test_request_headers_override_sendgrid_object_headers() throws IOExc
sg.api(request);
verify(client).api(argThat((Request req) -> req.getHeaders().get("set-on-both").equals("456")));
}

@Test
public void testSetResidency_happy_path_eu() {
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
sg.setDataResidency("eu");
Assert.assertEquals(sg.getHost(), "api.eu.sendgrid.com");
}
@Test
public void testSetResidency_happy_path_global() {
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
sg.setDataResidency("global");
Assert.assertEquals(sg.getHost(), "api.sendgrid.com");
}


@Test
public void testSetResidency_override_host() {
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
sg.setHost("api.new.com");
sg.setDataResidency("eu");
Assert.assertEquals(sg.getHost(), "api.eu.sendgrid.com");
}

@Test
public void testsetResidency_override_data_residency() {
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
sg.setDataResidency("eu");
sg.setHost("api.new.com");
Assert.assertEquals(sg.getHost(), "api.new.com");
}

@Test (expected = IllegalArgumentException.class)
public void testsetResidency_incorrect_region() {
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
sg.setDataResidency("foo");
}
@Test (expected = IllegalArgumentException.class)
public void testsetResidency_null_region(){
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
sg.setDataResidency("");
}
@Test
public void testsetResidency_default_region() {
SendGrid sg = new SendGrid(SENDGRID_API_KEY);
Assert.assertEquals(sg.getHost(), "api.sendgrid.com");
}
}
Loading