Skip to content

Commit

Permalink
Merge pull request #114 from rundeck-plugins/add-region
Browse files Browse the repository at this point in the history
adding region to ec2 nodes
  • Loading branch information
ltamaster authored Aug 6, 2021
2 parents 1de4361 + da7e196 commit 354d9a3
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ public class EC2ResourceModelSource implements ResourceModelSource {
+ "tag.terminated.selector=state.name=terminated\n"
+ "tag.pending.selector=state.name=pending\n"
+ "state.selector=state.name\n"
+ "region.selector=region\n"
+ "tags.default=ec2\n";
try {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.dtolabs.rundeck.plugin.resources.ec2;

import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Region;

import java.lang.reflect.Field;
import java.util.ArrayList;
Expand All @@ -10,11 +11,20 @@
public class Ec2Instance extends Instance {

String imageName;
String region;

public String getImageName() {
return imageName;
}

public String getRegion() {
return region;
}

public void setRegion(String region) {
this.region = region;
}

public void setImageName(String imageName) {
this.imageName = imageName;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ class InstanceToNodeMapper {
private Properties mapping;
private int maxResults;
private AmazonEC2Client ec2 ;
private DescribeAvailabilityZonesResult zones;

private static final String[] extraInstanceMappingAttributes= {"imageName"};
private static final String[] extraInstanceMappingAttributes= {"imageName","region"};

/**
* Create with the credentials and mapping definition
Expand Down Expand Up @@ -100,6 +101,7 @@ public NodeSetImpl performQuery() {
if (null != getEndpoint()) {
ec2.setEndpoint(getEndpoint());
}
zones = ec2.describeAvailabilityZones();

final ArrayList<Filter> filters = buildFilters();

Expand Down Expand Up @@ -297,6 +299,8 @@ static INodeEntry instanceToNode(final Instance inst, final Properties mapping)
node.setHostname(node.getHostname() + ":" + sshport);
}



return node;
}

Expand Down Expand Up @@ -480,6 +484,9 @@ public Set<Instance> addExtraMappingAttribute(Set<Instance> instances){
if(extraAttribute.equals("imageName")){
instances = addingImageName(instances);
}
if(extraAttribute.equals("region")){
instances = addingRegion(instances);
}
}
}
return instances;
Expand Down Expand Up @@ -517,20 +524,50 @@ public Set<Instance> addingImageName(Set<Instance> originalInstances){
}

for (final Instance inst : originalInstances) {
Ec2Instance customInstance = Ec2Instance.builder(inst);

if(ec2Images.containsKey(inst.getImageId())){
Ec2Instance customInstance = Ec2Instance.builder(inst);
Image image = ec2Images.get(inst.getImageId());
customInstance.setImageName(image.getName());
instances.add(customInstance);
}else{
Ec2Instance customInstance = Ec2Instance.builder(inst);
customInstance.setImageName("Not found");
logger.debug("Image not found" + inst.getImageId());
instances.add(customInstance);
}
instances.add(customInstance);

}

return instances;
}

public Set<Instance> addingRegion(Set<Instance> originalInstances){
Set<Instance> instances = new HashSet<>();

for (final Instance inst : originalInstances) {
String region = getRegionAvailableZone(inst.getPlacement().getAvailabilityZone());
Ec2Instance customInstance = Ec2Instance.builder(inst);

if(region!=null){
customInstance.setRegion(region);
}
instances.add(customInstance);
}

return instances;
}

private String getRegionAvailableZone(String availableZone){

String region = null;

for(AvailabilityZone zone : zones.getAvailabilityZones()) {
if (zone.getZoneName().equals(availableZone)){
region = zone.getRegionName();
}
}


return region;
}

}
1 change: 1 addition & 0 deletions src/main/resources/defaultMapping.properties
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ tags.default=ec2
tags.selector=tags/Rundeck-Tags
username.default=ec2-user
username.selector=tags/Rundeck-User
region.selector=region
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package com.dtolabs.rundeck.plugin.resources.ec2
import com.amazonaws.ClientConfiguration
import com.amazonaws.auth.AWSCredentials
import com.amazonaws.services.ec2.AmazonEC2Client
import com.amazonaws.services.ec2.model.AvailabilityZone
import com.amazonaws.services.ec2.model.DescribeAvailabilityZonesResult
import com.amazonaws.services.ec2.model.DescribeImagesRequest
import com.amazonaws.services.ec2.model.DescribeImagesResult
import com.amazonaws.services.ec2.model.DescribeInstancesResult
import com.amazonaws.services.ec2.model.Image
import com.amazonaws.services.ec2.model.Instance
import com.amazonaws.services.ec2.model.InstanceState
import com.amazonaws.services.ec2.model.InstanceStateName
import com.amazonaws.services.ec2.model.Placement
import com.amazonaws.services.ec2.model.Reservation
import com.amazonaws.services.ec2.model.Tag
import spock.lang.Specification
Expand Down Expand Up @@ -163,6 +166,7 @@ class InstanceToNodeMapperSpec extends Specification {
i.setInstanceId("aninstanceId")
i.setArchitecture("anarch")
i.setImageId("ami-something")
i.setPlacement(new Placement("us-east-1a"))

def state = new InstanceState()
state.setName(InstanceStateName.Running)
Expand Down Expand Up @@ -193,6 +197,9 @@ class InstanceToNodeMapperSpec extends Specification {
describeImages(_) >> Mock(DescribeImagesResult){
getImages()>>[image]
}
describeAvailabilityZones()>>Mock(DescribeAvailabilityZonesResult){
getAvailabilityZones()>>[]
}
}

AWSCredentials credentials = Mock(AWSCredentials)
Expand Down Expand Up @@ -231,6 +238,9 @@ class InstanceToNodeMapperSpec extends Specification {
describeImages(_) >> Mock(DescribeImagesResult){
getImages()>>[image]
}
describeAvailabilityZones()>>Mock(DescribeAvailabilityZonesResult){
getAvailabilityZones()>>[]
}
}

AWSCredentials credentials = Mock(AWSCredentials)
Expand All @@ -246,4 +256,45 @@ class InstanceToNodeMapperSpec extends Specification {
instances!=null
0*ec2.describeImages(_)
}

def "adding region to the node attributes"() {
given:

Instance instance = mkInstance()
Image image = mkImage()
List<AvailabilityZone> zones = new ArrayList<>()
AvailabilityZone zone1 = new AvailabilityZone()
zone1.setRegionName("us-east-1")
zone1.setZoneName("us-east-1a")

Reservation reservertion = Mock(Reservation){
getInstances()>>[instance]
}
AmazonEC2Client ec2 = Mock(AmazonEC2Client){
describeInstances(_) >> Mock(DescribeInstancesResult){
getReservations() >> [reservertion]
}
describeImages(_) >> Mock(DescribeImagesResult){
getImages()>>[image]
}
describeAvailabilityZones()>>Mock(DescribeAvailabilityZonesResult){
getAvailabilityZones()>>[zone1]
}
}

AWSCredentials credentials = Mock(AWSCredentials)
ClientConfiguration clientConfiguration = Mock(ClientConfiguration)

int pageResults = 100
Properties mapping = new Properties()
mapping.put("region.selector","region")
def mapper = new InstanceToNodeMapper(ec2, credentials, mapping, clientConfiguration, pageResults);
when:
def instances = mapper.performQuery()
then:
instances!=null
instances.getNode("aninstanceId").getAttributes().containsKey("region")
instances.getNode("aninstanceId").getAttributes().get("region") == "us-east-1"

}
}

0 comments on commit 354d9a3

Please sign in to comment.