Skip to content

Commit 5a119b1

Browse files
basildblanchette
andcommitted
[JENKINS-73640] Use AWS SDK for Java 2.x
Co-authored-by: Denis Blanchette <[email protected]>
1 parent 4d2067f commit 5a119b1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1831
-1349
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ console](https://wiki.jenkins.io/display/JENKINS/Jenkins+Script+Console),
294294
example:
295295

296296
```groovy
297-
import com.amazonaws.services.ec2.model.InstanceType
297+
import software.amazon.awssdk.services.ec2.model.InstanceType
298298
import com.cloudbees.jenkins.plugins.awscredentials.AWSCredentialsImpl
299299
import com.cloudbees.plugins.credentials.*
300300
import com.cloudbees.plugins.credentials.domains.Domain

pom.xml

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ THE SOFTWARE.
8989
<type>pom</type>
9090
<scope>import</scope>
9191
</dependency>
92+
<!-- TODO until in BOM -->
93+
<dependency>
94+
<groupId>org.jenkins-ci.plugins</groupId>
95+
<artifactId>aws-credentials</artifactId>
96+
<version>238.v8fb_588a_2b_e67</version>
97+
</dependency>
9298
</dependencies>
9399
</dependencyManagement>
94100

@@ -108,6 +114,14 @@ THE SOFTWARE.
108114
</exclusion>
109115
</exclusions>
110116
</dependency>
117+
<dependency>
118+
<groupId>io.jenkins.plugins.aws-java-sdk2</groupId>
119+
<artifactId>aws-java-sdk2-ec2</artifactId>
120+
</dependency>
121+
<dependency>
122+
<groupId>io.jenkins.plugins.aws-java-sdk2</groupId>
123+
<artifactId>aws-java-sdk2-sts</artifactId>
124+
</dependency>
111125
<dependency>
112126
<groupId>org.jenkins-ci.plugins</groupId>
113127
<artifactId>apache-httpcomponents-client-4-api</artifactId>
@@ -141,16 +155,6 @@ THE SOFTWARE.
141155
<groupId>org.jenkins-ci.plugins</groupId>
142156
<artifactId>trilead-api</artifactId>
143157
</dependency>
144-
<dependency>
145-
<groupId>org.jenkins-ci.plugins.aws-java-sdk</groupId>
146-
<artifactId>aws-java-sdk-ec2</artifactId>
147-
<version>1.12.696-451.v0651a_da_9ca_ec</version>
148-
</dependency>
149-
<dependency>
150-
<groupId>org.jenkins-ci.plugins.aws-java-sdk</groupId>
151-
<artifactId>aws-java-sdk-minimal</artifactId>
152-
<version>1.12.767-467.vb_e93f0c614b_6</version>
153-
</dependency>
154158
<dependency>
155159
<groupId>org.jenkins-ci.plugins.workflow</groupId>
156160
<artifactId>workflow-step-api</artifactId>

src/main/java/hudson/plugins/ec2/AmazonEC2Cloud.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,6 @@
2323
*/
2424
package hudson.plugins.ec2;
2525

26-
import com.amazonaws.SdkClientException;
27-
import com.amazonaws.auth.AWSCredentialsProvider;
28-
import com.amazonaws.services.ec2.AmazonEC2;
29-
import com.amazonaws.services.ec2.model.DescribeRegionsResult;
30-
import com.amazonaws.services.ec2.model.Region;
3126
import edu.umd.cs.findbugs.annotations.Nullable;
3227
import hudson.Extension;
3328
import hudson.Util;
@@ -51,6 +46,11 @@
5146
import org.kohsuke.stapler.QueryParameter;
5247
import org.kohsuke.stapler.interceptor.RequirePOST;
5348
import org.kohsuke.stapler.verb.POST;
49+
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
50+
import software.amazon.awssdk.core.exception.SdkClientException;
51+
import software.amazon.awssdk.services.ec2.Ec2Client;
52+
import software.amazon.awssdk.services.ec2.model.DescribeRegionsResponse;
53+
import software.amazon.awssdk.services.ec2.model.Region;
5454

5555
/**
5656
* The original implementation of {@link EC2Cloud}.
@@ -178,7 +178,7 @@ public void setAltEC2Endpoint(String altEC2Endpoint) {
178178
}
179179

180180
@Override
181-
protected AWSCredentialsProvider createCredentialsProvider() {
181+
protected AwsCredentialsProvider createCredentialsProvider() {
182182
return createCredentialsProvider(
183183
isUseInstanceProfileForCredentials(),
184184
getCredentialsId(),
@@ -229,14 +229,14 @@ public ListBoxModel doFillRegionItems(
229229
ListBoxModel model = new ListBoxModel();
230230
if (Jenkins.get().hasPermission(Jenkins.ADMINISTER)) {
231231
try {
232-
AWSCredentialsProvider credentialsProvider =
232+
AwsCredentialsProvider credentialsProvider =
233233
createCredentialsProvider(useInstanceProfileForCredentials, credentialsId);
234-
AmazonEC2 client = AmazonEC2Factory.getInstance()
234+
Ec2Client client = AmazonEC2Factory.getInstance()
235235
.connect(credentialsProvider, determineEC2EndpointURL(altEC2Endpoint));
236-
DescribeRegionsResult regions = client.describeRegions();
237-
List<Region> regionList = regions.getRegions();
236+
DescribeRegionsResponse regions = client.describeRegions();
237+
List<Region> regionList = regions.regions();
238238
for (Region r : regionList) {
239-
String name = r.getRegionName();
239+
String name = r.regionName();
240240
model.add(name, name);
241241
}
242242
} catch (SdkClientException ex) {

src/main/java/hudson/plugins/ec2/CloudHelper.java

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
11
package hudson.plugins.ec2;
22

3-
import com.amazonaws.AmazonClientException;
4-
import com.amazonaws.AmazonServiceException;
5-
import com.amazonaws.services.ec2.AmazonEC2;
6-
import com.amazonaws.services.ec2.model.AvailabilityZone;
7-
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult;
8-
import com.amazonaws.services.ec2.model.DescribeImagesRequest;
9-
import com.amazonaws.services.ec2.model.DescribeInstancesRequest;
10-
import com.amazonaws.services.ec2.model.Image;
11-
import com.amazonaws.services.ec2.model.Instance;
12-
import com.amazonaws.services.ec2.model.Reservation;
133
import edu.umd.cs.findbugs.annotations.CheckForNull;
144
import java.util.ArrayList;
155
import java.util.Collections;
166
import java.util.List;
177
import java.util.logging.Logger;
188
import org.apache.commons.lang.StringUtils;
9+
import software.amazon.awssdk.awscore.exception.AwsServiceException;
10+
import software.amazon.awssdk.core.exception.SdkException;
11+
import software.amazon.awssdk.services.ec2.Ec2Client;
12+
import software.amazon.awssdk.services.ec2.model.AvailabilityZone;
13+
import software.amazon.awssdk.services.ec2.model.DescribeAvailabilityZonesResponse;
14+
import software.amazon.awssdk.services.ec2.model.DescribeImagesRequest;
15+
import software.amazon.awssdk.services.ec2.model.DescribeInstancesRequest;
16+
import software.amazon.awssdk.services.ec2.model.Image;
17+
import software.amazon.awssdk.services.ec2.model.Instance;
18+
import software.amazon.awssdk.services.ec2.model.Reservation;
1919

2020
final class CloudHelper {
2121
private static final Logger LOGGER = Logger.getLogger(CloudHelper.class.getName());
2222

23-
static Instance getInstanceWithRetry(String instanceId, EC2Cloud cloud)
24-
throws AmazonClientException, InterruptedException {
23+
static Instance getInstanceWithRetry(String instanceId, EC2Cloud cloud) throws SdkException, InterruptedException {
2524
// Sometimes even after a successful RunInstances, DescribeInstances
2625
// returns an error for a few seconds. We do a few retries instead of
2726
// failing instantly. See [JENKINS-15319].
2827
for (int i = 0; i < 5; i++) {
2928
try {
3029
return getInstance(instanceId, cloud);
31-
} catch (AmazonServiceException e) {
32-
if (e.getErrorCode().equals("InvalidInstanceID.NotFound")
33-
|| EC2Cloud.EC2_REQUEST_EXPIRED_ERROR_CODE.equals(e.getErrorCode())) {
30+
} catch (AwsServiceException e) {
31+
if (e.awsErrorDetails().errorCode().equals("InvalidInstanceID.NotFound")
32+
|| EC2Cloud.EC2_REQUEST_EXPIRED_ERROR_CODE.equals(
33+
e.awsErrorDetails().errorCode())) {
3434
// retry in 5 seconds.
3535
Thread.sleep(5000);
3636
continue;
@@ -43,50 +43,51 @@ static Instance getInstanceWithRetry(String instanceId, EC2Cloud cloud)
4343
}
4444

4545
@CheckForNull
46-
static Instance getInstance(String instanceId, EC2Cloud cloud) throws AmazonClientException {
46+
static Instance getInstance(String instanceId, EC2Cloud cloud) throws SdkException {
4747
if (StringUtils.isEmpty(instanceId) || cloud == null) {
4848
return null;
4949
}
5050

51-
DescribeInstancesRequest request = new DescribeInstancesRequest();
52-
request.setInstanceIds(Collections.singletonList(instanceId));
51+
DescribeInstancesRequest request = DescribeInstancesRequest.builder()
52+
.instanceIds(Collections.singletonList(instanceId))
53+
.build();
5354

5455
List<Reservation> reservations =
55-
cloud.connect().describeInstances(request).getReservations();
56+
cloud.connect().describeInstances(request).reservations();
5657
if (reservations.size() != 1) {
5758
String message = "Unexpected number of reservations reported by EC2 for instance id '" + instanceId
5859
+ "', expected 1 result, found " + reservations + ".";
5960
if (reservations.isEmpty()) {
6061
message += " Instance seems to be dead.";
6162
}
6263
LOGGER.info(message);
63-
throw new AmazonClientException(message);
64+
throw SdkException.builder().message(message).build();
6465
}
6566
Reservation reservation = reservations.get(0);
6667

67-
List<Instance> instances = reservation.getInstances();
68+
List<Instance> instances = reservation.instances();
6869
if (instances.size() != 1) {
6970
String message = "Unexpected number of instances reported by EC2 for instance id '" + instanceId
7071
+ "', expected 1 result, found " + instances + ".";
7172
if (instances.isEmpty()) {
7273
message += " Instance seems to be dead.";
7374
}
7475
LOGGER.info(message);
75-
throw new AmazonClientException(message);
76+
throw SdkException.builder().message(message).build();
7677
}
7778
return instances.get(0);
7879
}
7980

8081
@CheckForNull
81-
static Image getAmiImage(AmazonEC2 ec2, String ami) {
82+
static Image getAmiImage(Ec2Client ec2, String ami) {
8283
List<String> images = Collections.singletonList(ami);
8384
List<String> owners = Collections.emptyList();
8485
List<String> users = Collections.emptyList();
85-
DescribeImagesRequest request = new DescribeImagesRequest();
86-
request.setImageIds(images);
87-
request.setOwners(owners);
88-
request.setExecutableUsers(users);
89-
List<Image> img = ec2.describeImages(request).getImages();
86+
DescribeImagesRequest.Builder requestBuilder = DescribeImagesRequest.builder();
87+
requestBuilder.imageIds(images);
88+
requestBuilder.owners(owners);
89+
requestBuilder.executableUsers(users);
90+
List<Image> img = ec2.describeImages(requestBuilder.build()).images();
9091
if (img == null || img.isEmpty()) {
9192
// de-registered AMI causes an empty list to be
9293
// returned. so be defensive
@@ -98,14 +99,14 @@ static Image getAmiImage(AmazonEC2 ec2, String ami) {
9899
}
99100

100101
// Retrieve the availability zones for the region connected on
101-
static ArrayList<String> getAvailabilityZones(AmazonEC2 ec2) {
102+
static ArrayList<String> getAvailabilityZones(Ec2Client ec2) {
102103
ArrayList<String> availabilityZones = new ArrayList<>();
103104

104-
DescribeAvailabilityZonesResult zones = ec2.describeAvailabilityZones();
105-
List<AvailabilityZone> zoneList = zones.getAvailabilityZones();
105+
DescribeAvailabilityZonesResponse zones = ec2.describeAvailabilityZones();
106+
List<AvailabilityZone> zoneList = zones.availabilityZones();
106107

107108
for (AvailabilityZone z : zoneList) {
108-
availabilityZones.add(z.getZoneName());
109+
availabilityZones.add(z.zoneName());
109110
}
110111

111112
return availabilityZones;

0 commit comments

Comments
 (0)