//
// typica - A client library for Amazon Web Services
// Copyright (C) 2008 Xerox Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package com.xerox.amazonws.ec2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* This class provides helper methods to interact with the Amazon EC2 service.
*
* @author D. Kavanagh
* @author developer@dotech.com
*/
public class EC2Utils {
private static Log logger = LogFactory.getLog(EC2Utils.class);
/**
* This method makes a best effort to fetch all instance metadata.
*
* @return map of metadata
*/
public static Map<String, String> getInstanceMetadata() {
HashMap<String, String> result = new HashMap<String, String>();
int retries = 0;
while (true) {
try {
URL url = new URL("http://169.254.169.254/latest/meta-data/");
BufferedReader rdr = new BufferedReader(new InputStreamReader(url.openStream()));
String line = rdr.readLine();
while (line != null) {
try {
String val = getInstanceMetadata(line);
result.put(line, val);
} catch (IOException ex) {
logger.error("Problem fetching piece of instance metadata!", ex);
}
line = rdr.readLine();
}
return result;
} catch (IOException ex) {
if (retries == 5) {
logger.debug("Problem getting instance data, retries exhausted...");
return result;
}
else {
logger.debug("Problem getting instance data, retrying...");
try { Thread.sleep((int)Math.pow(2.0, retries)*1000); } catch (InterruptedException e) {}
retries++;
}
}
}
}
/**
* This method makes a best effort to fetch a piece of instance metadata.
*
* @param key the name of the metadata to fetch
* @return value of the metadata item
*/
public static String getInstanceMetadata(String key) throws IOException {
int retries = 0;
String value = null;
while (true) {
try {
URL url = new URL("http://169.254.169.254/latest/meta-data/"+key);
value = new BufferedReader(new InputStreamReader(url.openStream())).readLine();
return value;
} catch (IOException ex) {
if (retries == 5) {
logger.debug("Problem getting instance data, retries exhausted...");
logger.debug("value = "+value);
return null;
}
else {
logger.debug("Problem getting instance data, retrying...");
try { Thread.sleep((int)Math.pow(2.0, retries)*1000); } catch (InterruptedException e) {}
retries++;
}
}
}
}
/**
* This method makes a best effort to fetch a piece of instance metadata.
*
* @param key the name of the metadata to fetch
* @return value of the metadata item
*/
public static String getInstanceUserdata() throws IOException {
int retries = 0;
while (true) {
try {
URL url = new URL("http://169.254.169.254/latest/user-data/");
InputStreamReader rdr = new InputStreamReader(url.openStream());
StringWriter wtr = new StringWriter();
char [] buf = new char[1024];
int bytes;
while ((bytes = rdr.read(buf)) > -1) {
if (bytes > 0) {
wtr.write(buf, 0, bytes);
}
}
rdr.close();
return wtr.toString();
} catch (IOException ex) {
if (retries == 5) {
logger.debug("Problem getting user data, retries exhausted...");
return null;
}
else {
logger.debug("Problem getting user data, retrying...");
try { Thread.sleep((int)Math.pow(2.0, retries)*1000); } catch (InterruptedException e) {}
retries++;
}
}
}
}
/**
* This method encodes key/value pairs into a user-data string
*
*/
public static String encodeUserParams(Map<String, String> params) {
StringBuilder ret = new StringBuilder();
for (String key : params.keySet()) {
ret.append(key);
ret.append("=");
ret.append(params.get(key));
ret.append(";");
}
return ret.toString();
}
/**
* This method decodes key/value pairs from a user-data string
*
*/
public static Map<String, String> decodeUserParams(String params) {
HashMap<String, String> result = new HashMap<String, String>();
String param = params.substring(0, params.indexOf(';'));
while (param != null) {
int idx = param.indexOf('=');
String key = param.substring(0, idx);
String value = param.substring(idx+1);
result.put(key, value);
if (param.length() == params.length()-1) {
param = null; // done
}
else {
params = params.substring(params.indexOf(';')+1);
param = params.substring(0, params.indexOf(';'));
}
}
return result;
}
}