diff options
-rw-r--r-- | etc/Makefile.am | 1 | ||||
-rw-r--r-- | etc/describe-instance-attribute.fln | 46 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/dscrinstattr.c | 80 | ||||
-rw-r--r-- | src/eclat.c | 2 | ||||
-rw-r--r-- | src/eclat.h | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/describe-instance-attribute.at | 91 | ||||
-rw-r--r-- | tests/testsuite.at | 1 |
9 files changed, 224 insertions, 0 deletions
diff --git a/etc/Makefile.am b/etc/Makefile.am index a42deb2..8c4ff75 100644 --- a/etc/Makefile.am +++ b/etc/Makefile.am @@ -20,6 +20,7 @@ FLNFILES=\ associate-address.fln\ disassociate-address.fln\ describe-addresses.fln\ + describe-instance-attribute.fln\ describe-instance-status.fln\ describe-instances.fln\ describe-tags.fln\ diff --git a/etc/describe-instance-attribute.fln b/etc/describe-instance-attribute.fln new file mode 100644 index 0000000..7692df4 --- /dev/null +++ b/etc/describe-instance-attribute.fln @@ -0,0 +1,46 @@ +/* This file is part of Eclat. + Copyright (C) 2012 Sergey Poznyakoff. + + Eclat is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Eclat is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eclat. If not, see <http://www.gnu.org/licenses/>. */ + +if (.DescribeInstanceAttributeResponse.instanceType.value || + .DescribeInstanceAttributeResponse.kernel.value || + .DescribeInstanceAttributeResponse.ramdisk.value || + .DescribeInstanceAttributeResponse.userData.value || + .DescribeInstanceAttributeResponse.disableApiTermination.value || + .DescribeInstanceAttributeResponse.instanceInitiatedShutdownBehavior.value || + .DescribeInstanceAttributeResponse.rootDeviceName.value || + .DescribeInstanceAttributeResponse.ebsOptimized.value) + print(last,"\n"); +else if (.DescribeInstanceAttributeResponse.blockDeviceMapping) + for (dev in .DescribeInstanceAttributeResponse.blockDeviceMapping.item) { + print(dev.deviceName,"\t", dev.ebs.volumeId, "\t", dev.ebs.status, + "\t", dev.ebs.deleteOnTermination); + if (dev.ebs.status[attached]) + print("\t", dev.ebs.attachTime); + print("\n"); + } +else if (.DescribeInstanceAttributeResponse.sourceDestCheck) + print(last,"\n"); +else if (.DescribeInstanceAttributeResponse.groupSet) + for (gset in .DescribeInstanceAttributeResponse.groupSet.item) { + print(gset.groupId); + if (gset.groupName) + print("\t", gset.groupName); + print("\n"); + } +else if (.DescribeInstanceAttributeResponse.productCodes) + for (code in .DescribeInstanceAttributeResponse.productCodes.item) + print(code.productCode,"\t",code.type, "\n"); +
\ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index 1a1e1a5..6ee37ef 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -24,6 +24,7 @@ eclat_SOURCES=\ disassaddr.c\ dscraddrs.c\ dscrtags.c\ + dscrinstattr.c\ dscrinsts.c\ dscrinststat.c\ dscrvols.c\ diff --git a/src/dscrinstattr.c b/src/dscrinstattr.c new file mode 100644 index 0000000..543e456 --- /dev/null +++ b/src/dscrinstattr.c @@ -0,0 +1,80 @@ +/* This file is part of Eclat. + Copyright (C) 2012 Sergey Poznyakoff. + + Eclat is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + Eclat is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Eclat. If not, see <http://www.gnu.org/licenses/>. */ + +#include "eclat.h" + +static char *attrs[] = { + "instanceType", + "kernel", + "ramdisk", + "userData", + "disableApiTermination", + "instanceInitiatedShutdownBehavior", + "rootDeviceName", + "blockDeviceMapping", + "sourceDestCheck", + "groupSet", + "productCodes", + "ebsOptimized", + NULL +}; + +static void +list_attrs(FILE *fp) +{ + size_t ncols = get_scr_cols(); + int i, col, len; + char *delim = ""; + + fprintf(fp, "Available attributes are:\n"); + col = 0; + for (i = 0; attrs[i]; i++) { + len = strlen(delim) + strlen(attrs[i]); + if (col + len > ncols) { + fprintf(fp, ",\n%s", attrs[i]); + col = strlen(attrs[i]); + } else + col += fprintf(fp, "%s%s", delim, attrs[i]); + delim = ", "; + } + fputc('\n', fp); + fputc('\n', fp); +} + +int +eclat_describe_instance_attribute(CURL *curl, int argc, char **argv) +{ + int i; + struct ec2_query *q; + + generic_proginfo->args_doc = "INST-ID ATTR"; + generic_proginfo->print_help_hook = list_attrs; + generic_parse_options("eclat describe-instance-attribute", + "describe the specified attribute of the instance", + argc, argv, &i); + argv += i; + argc -= i; + + if (argc != 2) + die(EX_USAGE, "wrong number of arguments"); + + q = eclat_query_create(use_ssl ? EC2_QF_HTTPS : 0, endpoint, "/"); + eclat_query_add_param(q, "Action", "DescribeInstanceAttribute"); + eclat_query_add_param(q, "InstanceId", argv[0]); + eclat_query_add_param(q, "Attribute", argv[1]); + + return eclat_send_query(curl, q); +} diff --git a/src/eclat.c b/src/eclat.c index 1642699..17a361c 100644 --- a/src/eclat.c +++ b/src/eclat.c @@ -227,6 +227,8 @@ struct command cmdtab[] = { { "describe-addresses", "DescribeAddresses", eclat_describe_addresses }, { "describe-tags", "DescribeTags", eclat_describe_tags }, + { "describe-instance-attribute", "DescribeInstanceAttribute", + eclat_describe_instance_attribute }, { "describe-instance-status", "DescribeInstanceStatus", eclat_describe_instance_status }, { "describe-instances", "DescribeInstances", diff --git a/src/eclat.h b/src/eclat.h index e24b591..8c3b5f0 100644 --- a/src/eclat.h +++ b/src/eclat.h @@ -68,6 +68,7 @@ int eclat_disassociate_address(CURL *curl, int argc, char **argv); int eclat_describe_addresses(CURL *curl, int argc, char **argv); int eclat_describe_volumes(CURL *curl, int argc, char **argv); int eclat_get_console_output(CURL *curl, int argc, char **argv); +int eclat_describe_instance_attribute(CURL *curl, int argc, char **argv); char *region_to_endpoint(const char *region); diff --git a/tests/Makefile.am b/tests/Makefile.am index 56a4b99..c03730f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -43,6 +43,7 @@ TESTSUITE_AT = \ associate-address.at\ decode.at\ describe-addresses.at\ + describe-instance-attribute.at\ describe-instance-status.at\ describe-instances.at\ describe-tags.at\ diff --git a/tests/describe-instance-attribute.at b/tests/describe-instance-attribute.at new file mode 100644 index 0000000..17aa368 --- /dev/null +++ b/tests/describe-instance-attribute.at @@ -0,0 +1,91 @@ +# This file is part of Eclat -*- Autotest -*- +# Copyright (C) 2012 Sergey Poznyakoff +# +# Eclat is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# Eclat is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Eclat. If not, see <http://www.gnu.org/licenses/>. + +ECLAT_TEST_FORMAT([DescribeInstanceAttribute instanceType], +[DescribeInstanceAttribute DescribeInstanceAttribute-instanceType], +[describe-instance-attribute.fln], +[<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2012-08-15/"> + <requestId>07bdd73d-d1d0-4c07-b8d8-a50a24e737ad</requestId> + <instanceId>i-12345678</instanceId> + <instanceType> + <value>m1.medium</value> + </instanceType> +</DescribeInstanceAttributeResponse> +], +[m1.medium +]) + +ECLAT_TEST_FORMAT([DescribeInstanceAttribute kernel], +[DescribeInstanceAttribute DescribeInstanceAttribute-kernel], +[describe-instance-attribute.fln], +[<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2012-08-15/"> + <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId> + <instanceId>i-10a64379</instanceId> + <kernel> + <value>aki-f70657b2</value> + </kernel> +</DescribeInstanceAttributeResponse> +], +[aki-f70657b2 +]) + +ECLAT_TEST_FORMAT([DescribeInstanceAttribute blockDeviceMapping], +[DescribeInstanceAttribute DescribeInstanceAttribute-blockDeviceMapping], +[describe-instance-attribute.fln], +[<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2012-08-15/"> + <requestId>dba8e015-a520-43f2-a7f9-63bd337f83bf</requestId> + <instanceId>i-12345678</instanceId> + <blockDeviceMapping> + <item> + <deviceName>/dev/sda1</deviceName> + <ebs> + <volumeId>vol-deadbeef</volumeId> + <status>attached</status> + <attachTime>2012-03-30T14:04:26.000Z</attachTime> + <deleteOnTermination>true</deleteOnTermination> + </ebs> + </item> + <item> + <deviceName>/dev/sdf</deviceName> + <ebs> + <volumeId>vol-beefdead</volumeId> + <status>attached</status> + <attachTime>2012-03-30T16:11:14.000Z</attachTime> + <deleteOnTermination>false</deleteOnTermination> + </ebs> + </item> + </blockDeviceMapping> +</DescribeInstanceAttributeResponse> +], +[/dev/sda1 vol-deadbeef attached true 2012-03-30T14:04:26.000Z +/dev/sdf vol-beefdead attached false 2012-03-30T16:11:14.000Z +]) + +ECLAT_TEST_FORMAT([DescribeInstanceAttribute groupSet], +[DescribeInstanceAttribute DescribeInstanceAttribute-groupSet], +[describe-instance-attribute.fln], +[<DescribeInstanceAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2012-08-15/"> + <requestId>42507af2-227a-4f76-b8c4-55bb0c2f1384</requestId> + <instanceId>i-12345678</instanceId> + <groupSet> + <item> + <groupId>sg-deadbeef</groupId> + </item> + </groupSet> +</DescribeInstanceAttributeResponse> +], +[sg-deadbeef +]) diff --git a/tests/testsuite.at b/tests/testsuite.at index ccb5868..b47591f 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -57,6 +57,7 @@ m4_include([tagshairy.at]) AT_BANNER([Default formats]) m4_include([associate-address.at]) m4_include([describe-addresses.at]) +m4_include([describe-instance-attribute.at]) m4_include([describe-instance-status.at]) m4_include([describe-instances.at]) m4_include([describe-tags.at]) |