From 8981bce04c947ee5cd72a7862beec421753bbaba Mon Sep 17 00:00:00 2001 From: Yuriy Belenitsky Date: Tue, 9 Jun 2020 10:03:11 -0400 Subject: [PATCH] Add KeyName parameter --- .../bfmgr/controllers/Dashboard.java | 1 + .../bfmgr/model/CreateClusterRequest.java | 1 + .../eightydegreeswest/bfmgr/service/BfMgrCtrl.java | 2 ++ .../bfmgr/service/impl/BfMgrCtrlAws.java | 12 ++++++++++++ .../bfmgr/service/impl/BfMgrCtrlGcp.java | 7 +++++++ .../bfmgr/service/impl/BfMgrCtrlLocal.java | 7 ++++++- src/main/resources/aws.json | 9 +++++++++ src/main/resources/bfmgr-aws.json | 11 ++++++++++- src/main/resources/templates/dashboard.html | 7 +++++++ 9 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/eightydegreeswest/bfmgr/controllers/Dashboard.java b/src/main/java/com/eightydegreeswest/bfmgr/controllers/Dashboard.java index 8a4ec5b..066c1c0 100644 --- a/src/main/java/com/eightydegreeswest/bfmgr/controllers/Dashboard.java +++ b/src/main/java/com/eightydegreeswest/bfmgr/controllers/Dashboard.java @@ -26,6 +26,7 @@ public String getMainDashboard(Model model) throws UnknownHostException { model.addAttribute("createClusterRequest", bfMgrCtrl.getDefaultCreateClusterRequest()); model.addAttribute("subnetList", bfMgrCtrl.getSubnets()); model.addAttribute("securityGroupList", bfMgrCtrl.getSecurityGroups()); + model.addAttribute("keyNamesList", bfMgrCtrl.getKeyNames()); model.addAttribute("clusters", bfMgrCtrl.getBuildfarmClusters()); return "dashboard"; } diff --git a/src/main/java/com/eightydegreeswest/bfmgr/model/CreateClusterRequest.java b/src/main/java/com/eightydegreeswest/bfmgr/model/CreateClusterRequest.java index 45662b6..ca1ac6d 100644 --- a/src/main/java/com/eightydegreeswest/bfmgr/model/CreateClusterRequest.java +++ b/src/main/java/com/eightydegreeswest/bfmgr/model/CreateClusterRequest.java @@ -19,4 +19,5 @@ public class CreateClusterRequest { private String workerTag; private String workerConfig; private String elbType; + private String keyName; } diff --git a/src/main/java/com/eightydegreeswest/bfmgr/service/BfMgrCtrl.java b/src/main/java/com/eightydegreeswest/bfmgr/service/BfMgrCtrl.java index 17639d3..57b8fb4 100644 --- a/src/main/java/com/eightydegreeswest/bfmgr/service/BfMgrCtrl.java +++ b/src/main/java/com/eightydegreeswest/bfmgr/service/BfMgrCtrl.java @@ -1,5 +1,6 @@ package com.eightydegreeswest.bfmgr.service; +import com.amazonaws.services.ec2.model.KeyPairInfo; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Subnet; import com.eightydegreeswest.bfmgr.model.BuildfarmCluster; @@ -15,4 +16,5 @@ public interface BfMgrCtrl { CreateClusterRequest getDefaultCreateClusterRequest(); List getSubnets(); List getSecurityGroups(); + List getKeyNames(); } diff --git a/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlAws.java b/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlAws.java index 34942c1..cf70a72 100644 --- a/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlAws.java +++ b/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlAws.java @@ -17,6 +17,7 @@ import com.amazonaws.services.ec2.model.DescribeSubnetsRequest; import com.amazonaws.services.ec2.model.Filter; import com.amazonaws.services.ec2.model.Instance; +import com.amazonaws.services.ec2.model.KeyPairInfo; import com.amazonaws.services.ec2.model.Reservation; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Subnet; @@ -143,6 +144,7 @@ public CreateClusterRequest getDefaultCreateClusterRequest() { createClusterRequest.setWorkerRepo(workerRepo); createClusterRequest.setWorkerTag(buildfarmTag); createClusterRequest.setElbType("internet-facing"); + createClusterRequest.setKeyName(""); return createClusterRequest; } @@ -156,6 +158,15 @@ public List getSecurityGroups() { return awsEc2Client.describeSecurityGroups().getSecurityGroups(); } + @Override + public List getKeyNames() { + try { + return awsEc2Client.describeKeyPairs().getKeyPairs(); + } catch (Exception e) { + return new ArrayList<>(); + } + } + private String getLoadBalancerEndpoint(String clusterName) { try { return awsElbClient.describeLoadBalancers(new DescribeLoadBalancersRequest().withNames(clusterName)).getLoadBalancers().get(0).getDNSName(); @@ -228,6 +239,7 @@ private Collection getCloudFormationParameters(CreateClusterRequest c parameters.add(getParameter("ClusterName", createClusterRequest.getClusterName())); parameters.add(getParameter("RequiredTagName", getAssetTag())); parameters.add(getParameter("ElbType", createClusterRequest.getElbType())); + parameters.add(getParameter("KeyName", createClusterRequest.getKeyName())); return parameters; } diff --git a/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlGcp.java b/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlGcp.java index 92853b1..0d0098f 100644 --- a/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlGcp.java +++ b/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlGcp.java @@ -1,10 +1,12 @@ package com.eightydegreeswest.bfmgr.service.impl; +import com.amazonaws.services.ec2.model.KeyPairInfo; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Subnet; import com.eightydegreeswest.bfmgr.model.BuildfarmCluster; import com.eightydegreeswest.bfmgr.model.CreateClusterRequest; import com.eightydegreeswest.bfmgr.service.BfMgrCtrl; +import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,4 +48,9 @@ public List getSubnets() { public List getSecurityGroups() { throw new UnsupportedOperationException(); } + + @Override + public List getKeyNames() { + return new ArrayList<>(); + } } diff --git a/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlLocal.java b/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlLocal.java index 0a40393..1eeb5be 100644 --- a/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlLocal.java +++ b/src/main/java/com/eightydegreeswest/bfmgr/service/impl/BfMgrCtrlLocal.java @@ -1,5 +1,6 @@ package com.eightydegreeswest.bfmgr.service.impl; +import com.amazonaws.services.ec2.model.KeyPairInfo; import com.amazonaws.services.ec2.model.SecurityGroup; import com.amazonaws.services.ec2.model.Subnet; import com.eightydegreeswest.bfmgr.model.BfInstance; @@ -12,7 +13,6 @@ import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; import com.github.dockerjava.core.DockerClientBuilder; import java.io.File; @@ -194,6 +194,11 @@ public List getSecurityGroups() { return new ArrayList<>(); } + @Override + public List getKeyNames() { + return new ArrayList<>(); + } + private void removeContainer(String container) { try { dockerClient.removeContainerCmd(container).withForce(true).exec(); diff --git a/src/main/resources/aws.json b/src/main/resources/aws.json index 855bfa8..1f8d856 100644 --- a/src/main/resources/aws.json +++ b/src/main/resources/aws.json @@ -67,8 +67,15 @@ "Default" : "internet-facing", "AllowedValues" : ["internet-facing", "internal"], "Description":"Load balancer type." + }, + "KeyName": { + "Type": "AWS::EC2::KeyPair::KeyName", + "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance" } }, + "Conditions": { + "HasKeyName": {"Fn::Not": [{"Fn::Equals": ["", {"Ref": "KeyName"}]}]} + }, "Resources":{ "TemplateServer":{ "Type":"AWS::EC2::LaunchTemplate", @@ -126,6 +133,7 @@ } }, "InstanceInitiatedShutdownBehavior":"terminate", + "KeyName": {"Fn::If": ["HasKeyName", {"Ref": "KeyName"}, {"Ref": "AWS::NoValue"}]}, "IamInstanceProfile" : { "Name" : "buildfarm-manager" }, @@ -235,6 +243,7 @@ } }, "InstanceInitiatedShutdownBehavior":"terminate", + "KeyName": {"Fn::If": ["HasKeyName", {"Ref": "KeyName"}, {"Ref": "AWS::NoValue"}]}, "IamInstanceProfile" : { "Name" : "buildfarm-manager" }, diff --git a/src/main/resources/bfmgr-aws.json b/src/main/resources/bfmgr-aws.json index e72223a..b9d4b2b 100644 --- a/src/main/resources/bfmgr-aws.json +++ b/src/main/resources/bfmgr-aws.json @@ -18,8 +18,15 @@ "ReleaseNumber": { "Type": "String", "Description": "Enter bfmgr release number" + }, + "KeyName": { + "Type": "AWS::EC2::KeyPair::KeyName", + "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance" } }, + "Conditions": { + "HasKeyName": {"Fn::Not": [{"Fn::Equals": ["", {"Ref": "KeyName"}]}]} + }, "Resources": { "BfMgrRole": { "Type": "AWS::IAM::Role", @@ -78,6 +85,7 @@ "Type" : "AWS::IAM::InstanceProfile", "Properties" : { "Path" : "/", + "InstanceProfileName" : "buildfarm-manager", "Roles" : ["buildfarm-manager"] }, "DependsOn": [ @@ -134,7 +142,8 @@ ] ] } - } + }, + "KeyName": {"Fn::If": ["HasKeyName", {"Ref": "KeyName"}, {"Ref": "AWS::NoValue"}]} }, "DependsOn": [ "BfMgrRole", diff --git a/src/main/resources/templates/dashboard.html b/src/main/resources/templates/dashboard.html index 19babab..84700ca 100644 --- a/src/main/resources/templates/dashboard.html +++ b/src/main/resources/templates/dashboard.html @@ -104,6 +104,13 @@