/**
* $Id: $
* $Date: $
*
*/
package org.xmlsh.aws;
import java.io.IOException;
import java.util.List;
import javax.xml.stream.XMLStreamException;
import org.xmlsh.aws.util.AWSASCommand;
import org.xmlsh.core.CoreException;
import org.xmlsh.core.Options;
import org.xmlsh.core.SafeXMLStreamWriter;
import org.xmlsh.core.UnexpectedException;
import org.xmlsh.core.XValue;
import org.xmlsh.core.io.OutputPort;
import org.xmlsh.util.Util;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.services.autoscaling.model.AutoScalingGroup;
import com.amazonaws.services.autoscaling.model.DescribeAutoScalingGroupsRequest;
import com.amazonaws.services.autoscaling.model.DescribeAutoScalingGroupsResult;
import com.amazonaws.services.autoscaling.model.EnabledMetric;
import com.amazonaws.services.autoscaling.model.Instance;
import com.amazonaws.services.autoscaling.model.SuspendedProcess;
import com.amazonaws.services.autoscaling.model.TagDescription;
import net.sf.saxon.s9api.SaxonApiException;
public class asDescribeGroups extends AWSASCommand {
@Override
public int run(List<XValue> args) throws Exception {
Options opts = getOptions();
parseOptions(opts, args);
setSerializeOpts(opts);
args = opts.getRemainingArgs();
parseCommonOptions(opts);
try {
getASClient(opts);
} catch (UnexpectedException e) {
usage(e.getLocalizedMessage());
return 1;
}
int ret = describe(args);
return ret;
}
private int describe(List<XValue> args)
throws IOException, XMLStreamException, SaxonApiException, CoreException,
InterruptedException {
OutputPort stdout = getStdout();
mWriter = new SafeXMLStreamWriter(
stdout.asXMLStreamWriter(getSerializeOpts()));
startDocument();
startElement(getName());
DescribeAutoScalingGroupsRequest request = new DescribeAutoScalingGroupsRequest();
if(!args.isEmpty())
request.setAutoScalingGroupNames(Util.toStringList(args));
traceCall("describeAutoScalingGroups");
DescribeAutoScalingGroupsResult result = null;
int retry = rateRetry;
int delay = retryDelay;
do {
try {
result = getAWSClient().describeAutoScalingGroups(request);
break;
} catch (AmazonServiceException e) {
mShell.printErr("AmazonServiceException", e);
if(retry > 0
&& Util.isEqual("RequestLimitExceeded", e.getErrorCode())) {
mShell.printErr("AWS RequestLimitExceeded - sleeping " + delay);
Thread.sleep(delay);
retry--;
delay *= 2;
}
else
throw e;
}
} while(retry > 0);
for(AutoScalingGroup group : result.getAutoScalingGroups())
write(group);
endElement();
endDocument();
closeWriter();
stdout.writeSequenceTerminator(getSerializeOpts());
return 0;
}
private void write(AutoScalingGroup group) throws XMLStreamException {
startElement("group");
attribute("group-arn", group.getAutoScalingGroupARN());
attribute("name", group.getAutoScalingGroupName());
attribute("create-time", group.getCreatedTime());
attribute("default-cooldown", group.getDefaultCooldown());
attribute("desired-capacity", group.getDesiredCapacity());
attribute("health-check-grace-period", group.getHealthCheckGracePeriod());
attribute("health-check-type", group.getHealthCheckType());
attribute("launch-configuration-name", group.getLaunchConfigurationName());
attribute("max-size", group.getMaxSize());
attribute("min-size", group.getMinSize());
attribute("placement-group", group.getPlacementGroup());
attribute("status", group.getStatus());
attribute("vpc-zone-id", group.getVPCZoneIdentifier());
writeStringList("termination-policies", "termination-policy", "name",
group.getTerminationPolicies());
writeZones(group.getAvailabilityZones());
writeMetrics(group.getEnabledMetrics());
writeInstances(group.getInstances());
writeELBNames(group.getLoadBalancerNames());
writeSuspendedProcesses(group.getSuspendedProcesses());
writeTagDescriptions(group.getTags());
endElement();
}
private void writeTagDescriptions(List<TagDescription> tags)
throws XMLStreamException {
startElement("tags");
for(TagDescription tag : tags)
writeTagDescription(tag);
endElement();
}
private void writeTagDescription(TagDescription tag)
throws XMLStreamException {
startElement("tag");
attribute("key", tag.getKey());
attribute("propagate-at-launch", tag.getPropagateAtLaunch());
attribute("resource-id", tag.getResourceId());
attribute("resource-type", tag.getResourceType());
attribute("value", tag.getValue());
endElement();
}
private void writeSuspendedProcesses(
List<SuspendedProcess> suspendedProcesses) throws XMLStreamException {
startElement("suspended-processes");
for(SuspendedProcess proc : suspendedProcesses)
writeSuspendedProcess(proc);
endElement();
}
private void writeSuspendedProcess(SuspendedProcess proc)
throws XMLStreamException {
startElement("process");
attribute("name", proc.getProcessName());
attribute("reason", proc.getSuspensionReason());
endElement();
}
private void writeELBNames(List<String> loadBalancerNames)
throws XMLStreamException {
writeStringList("elb-names", "elb", "name", loadBalancerNames);
}
private void writeInstances(List<Instance> instances)
throws XMLStreamException {
startElement("instances");
for(Instance inst : instances) {
startElement("instance");
attribute("availability-zone", inst.getAvailabilityZone());
attribute("health-status", inst.getHealthStatus());
attribute("instance-id", inst.getInstanceId());
attribute("launch-configuration", inst.getLaunchConfigurationName());
attribute("lifecycle-state", inst.getLifecycleState());
endElement();
}
endElement();
}
private void writeMetrics(List<EnabledMetric> enabledMetrics)
throws XMLStreamException {
startElement("enabled-metrics");
for(EnabledMetric metric : enabledMetrics) {
startElement("enabled-metric");
attribute("granularity", metric.getGranularity());
attribute("metric", metric.getMetric());
endElement();
}
endElement();
}
}
/*
* Copyright (C) 2008-2014 David A. Lee.
*
* The contents of this file are subject to the "Simplified BSD License" (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.opensource.org/licenses/bsd-license.php
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied.
* See the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is: all this file.
*
* The Initial Developer of the Original Code is David A. Lee
*
* Portions created by (your name) are Copyright (C) (your legal entity). All
* Rights Reserved.
*
* Contributor(s): David A. Lee
*
*/