View Javadoc
1   package org.kuali.common.devops.ubuntu;
2   
3   import static com.amazonaws.regions.Region.getRegion;
4   import static com.amazonaws.regions.Regions.US_WEST_1;
5   import static com.google.common.base.Stopwatch.createStarted;
6   import static java.lang.String.format;
7   import static org.kuali.common.util.encrypt.Encryption.getDefaultEncryptor;
8   import static org.kuali.common.util.log.Loggers.newLogger;
9   
10  import java.util.List;
11  
12  import org.junit.Test;
13  import org.kuali.common.aws.ec2.api.EC2Service;
14  import org.kuali.common.aws.ec2.impl.DefaultEC2Service;
15  import org.kuali.common.aws.ec2.model.ImmutableTag;
16  import org.kuali.common.aws.ec2.model.VolumeRequest;
17  import org.kuali.common.aws.model.ImmutableAWSCredentials;
18  import org.kuali.common.core.json.api.JsonService;
19  import org.kuali.common.core.json.jackson.JacksonJsonService;
20  import org.kuali.common.core.ssh.KeyPair;
21  import org.kuali.common.core.system.VirtualSystem;
22  import org.kuali.common.util.channel.api.ChannelService;
23  import org.kuali.common.util.channel.api.SecureChannel;
24  import org.kuali.common.util.channel.impl.DefaultChannelService;
25  import org.kuali.common.util.channel.model.ChannelContext;
26  import org.kuali.common.util.encrypt.Encryptor;
27  import org.slf4j.Logger;
28  
29  import com.amazonaws.auth.AWSCredentials;
30  import com.amazonaws.regions.Region;
31  import com.amazonaws.services.ec2.model.Instance;
32  import com.amazonaws.services.ec2.model.Tag;
33  import com.google.common.base.Stopwatch;
34  import com.google.common.collect.ImmutableList;
35  
36  public class MuckWithVolumes {
37  
38  	private static final Logger logger = newLogger();
39  
40  	@Test
41  	public void test() {
42  		try {
43  			Stopwatch sw = createStarted();
44  			Region region = getRegion(US_WEST_1);
45  			VirtualSystem vs = VirtualSystem.build();
46  			String instanceId = vs.getProperty("instance", "i-df5b6581");
47  			JsonService json = new JacksonJsonService();
48  			AWSCredentials credentials = getFoundation();
49  			EC2Service ec2 = new DefaultEC2Service(credentials, region.getName());
50  			Instance instance = ec2.getInstance(instanceId);
51  			Tag name = new ImmutableTag("Name", "ci.master.jobs");
52  			Tag stack = new ImmutableTag("Stack", "test");
53  			List<Tag> tags = ImmutableList.of(name, stack);
54  			ChannelContext ctx = ChannelContext.builder(instance.getPublicDnsName()).privateKey(getPrivateKey()).username("root").build();
55  			ChannelService cs = new DefaultChannelService();
56  			SecureChannel channel = cs.openChannel(ctx);
57  
58  			info("instance -> %s", instance.getInstanceId());
59  			info("hostname -> %s", instance.getPublicDnsName());
60  
61  			String zone = instance.getPlacement().getAvailabilityZone();
62  			String volumeId = ec2.createVolume(zone, 1024);
63  			info("create   -> %s", volumeId);
64  			ec2.tag(volumeId, tags);
65  			String device = "/dev/xvdf";
66  			String dir = "/home/tomcat7/.jenkins/jobs";
67  			VolumeRequest request = VolumeRequest.builder().withDevice(device).withInstanceId(instanceId).withVolumeId(volumeId).build();
68  			info("attach   -> %s %s:%s", request.getVolumeId(), instance.getPublicDnsName(), device);
69  			ec2.attachVolume(request);
70  			// create the file system
71  			channel.exec(format("mkfs -t ext4 %s", device));
72  			channel.exec(format("mkdir -p %s", dir));
73  			channel.exec(format("chown -R tomcat7:tomcat7 %s", dir));
74  			channel.exec(format("mount %s %s", device, dir));
75  			// channel.exec(format("umount %s", dir));
76  			// info("detach   -> %s %s:%s", request.getVolumeId(), instance.getPublicDnsName(), device);
77  			// ec2.detachVolume(request);
78  			// info("delete   -> %s", volumeId);
79  			// ec2.deleteVolume(volumeId);
80  			// info("elapsed  -> %s", getTime(sw));
81  		} catch (Throwable e) {
82  			e.printStackTrace();
83  		}
84  	}
85  
86  	protected static void debug(String msg, Object... args) {
87  		logger.debug((args == null || args.length == 0) ? msg : format(msg, args));
88  	}
89  
90  	protected static void info(String msg, Object... args) {
91  		logger.info((args == null || args.length == 0) ? msg : format(msg, args));
92  	}
93  
94  	private static String getPrivateKey() {
95  		Encryptor enc = getDefaultEncryptor();
96  		String publicKey = enc
97  				.decrypt("U2FsdGVkX1/mOVOU9KiA43fWz10qtG08ixrGGBk+DsuFEikZ1N3bz5BUiPD4G7okAeQgen+RQ4E40/AybeLRjJUuOgLUdeOCpcK6u/H+EZs+N820xZe1Hpq/wchfs13npj6gWpOWylQAhl5DSioe5wHxkQC3hORV13sr5Mhaf+SorF/NPyzvERsJZ/FoScV+RcGxLfwVmlAUEVdsYNfgUepXPUWwTDmNu4FcRO/8ud7Kth7E3BkwG7sTN9n7pkEbA632ZdjcccBIptOfurArMLORN8VsCbiQU8uFo2leudzsa5zdx6JsxiGHHQeybogZ95lLwxAl48ka4YfpyVDaDA7Bf3nUp2xMbqvTaoPYMXrp8Y0Qk/aDhsDIhfSd72Sk/XE/RI/sjlzO2Owp0wp9Wb9uT3AsSAu44qjqCr8/AY9BUTn/SSc/+2COnO7YUgMSbo/fy3WK2twIyTd/YiF+qjaNjLUdYwxZDiD0s/g0pk46rnKdTy406KRO5W4uGIvVO5WpLsMk3chLctas3KJYreZ1pUV4gnnC8R2baqRzkgg=");
98  		String privateKey = enc
99  				.decrypt("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");
100 		return KeyPair.builder("kuali-devops").withPublicKey(publicKey).withPrivateKey(privateKey).build().getPrivateKey();
101 	}
102 
103 	private static AWSCredentials getFoundation() {
104 		Encryptor enc = getDefaultEncryptor();
105 		String accessKey = enc.decrypt("U2FsdGVkX19A2e6dN/ipVfb/9n0DROCPIrLK6H8PvvPmt0h6cBqccGaJW0NSoX3S");
106 		String secretKey = enc.decrypt("U2FsdGVkX19Y9SZ5GAU82/X5Z0xZdeQf7DFuVDW07R9lfyHK4VaOj5R7pviRBKmIyn7jrVT2lv8Edeu7098k1A==");
107 		return ImmutableAWSCredentials.build(accessKey, secretKey);
108 	}
109 
110 }