aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2018-12-15 00:03:30 +0200
committerSergey Poznyakoff <gray@gnu.org>2018-12-15 00:03:30 +0200
commit2116e1ef1cd5597e23f785e84d67d8fea5537475 (patch)
tree6b9b8c33c639a84c81c2db67b4913cd3ef89f35c
parent35c194f2f3bfe666494c62fe3a770661e3886aa6 (diff)
downloadeclat-2116e1ef1cd5597e23f785e84d67d8fea5537475.tar.gz
eclat-2116e1ef1cd5597e23f785e84d67d8fea5537475.tar.bz2
Implement ModifyVolume and DescribeVolumesModifications
-rw-r--r--TODO2
-rw-r--r--etc/Makefile.am2
-rw-r--r--etc/describe-volumes-modifications.fln49
-rw-r--r--etc/modify-volume.fln45
-rw-r--r--lib/libeclat.h2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/chvol.c86
-rw-r--r--src/eclat.c5
-rw-r--r--src/eclat.h4
-rw-r--r--src/lschvol.c68
10 files changed, 263 insertions, 2 deletions
diff --git a/TODO b/TODO
index 3e45bda..f0b5579 100644
--- a/TODO
+++ b/TODO
@@ -101,12 +101,13 @@ DescribeSnapshots lssnap [X] [X]
DescribeSpotDatafeedSubscription - [ ] [ ]
DescribeSpotInstanceRequests - [ ] [ ]
DescribeSpotPriceHistory - [ ] [ ]
DescribeSubnets lssubnet [X] [ ]
DescribeTags lstag [X] [X]
DescribeVolumes lsvol [X] [X]
+DescribeVolumesModifications lschvol [X] [ ]
DescribeVolumeAttribute - [ ] [ ]
DescribeVolumeStatus - [ ] [ ]
DescribeVpcAttribute lsvpcattr [X] [ ]
DescribeVpcs lsvpc [X] [ ]
DescribeVpnConnections - [ ] [ ]
DescribeVpnGateways - [ ] [ ]
@@ -126,12 +127,13 @@ ImportKeyPair - [ ] [ ]
ImportVolume - [ ] [ ]
ModifyImageAttribute setaattr [X] [X]
ModifyInstanceAttribute setiattr [X] [X]
ModifyNetworkInterfaceAttribute - [ ] [ ]
ModifySnapshotAttribute setsattr [X] [X]
ModifySubnetAttribute setsubnetattr [X] [ ]
+ModifyVolume chvol [X] [ ]
ModifyVolumeAttribute - [ ] [ ]
ModifyVpcAttribute setvpcattr [X] [ ]
MonitorInstances - [ ] [ ]
PurchaseReservedInstancesOffering - [ ] [ ]
RebootInstances reboot [X] [X]
RegisterImage - [ ] [ ]
diff --git a/etc/Makefile.am b/etc/Makefile.am
index 2376583..7d0b355 100644
--- a/etc/Makefile.am
+++ b/etc/Makefile.am
@@ -57,24 +57,26 @@ FLNFILES=\
describe-security-groups.fln\
describe-snapshot-attribute.fln\
describe-snapshots.fln\
describe-subnets.fln\
describe-tags.fln\
describe-volumes.fln\
+ describe-volumes-modifications.fln\
describe-vpc-attribute.fln\
describe-vpcs.fln\
detach-internet-gateway.fln\
detach-volume.fln\
disassociate-address.fln\
disassociate-route-table.fln\
get-console-output.fln\
lsattr.fln\
modify-image-attribute.fln\
modify-instance-attribute.fln\
modify-snapshot-attribute.fln\
modify-subnet-attribute.fln\
+ modify-volume.fln\
modify-vpc-attribute.fln\
reboot-instances.fln\
release-address.fln\
replace-route.fln\
route.fln\
reset-snapshot-attribute.fln\
diff --git a/etc/describe-volumes-modifications.fln b/etc/describe-volumes-modifications.fln
new file mode 100644
index 0000000..f752490
--- /dev/null
+++ b/etc/describe-volumes-modifications.fln
@@ -0,0 +1,49 @@
+/* This file is part of Eclat.
+ Copyright (C) 2018 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 (.DescribeVolumesModificationsResponse.volumeModificationSet.item) {
+ for (var in .DescribeVolumesModificationsResponse.volumeModificationSet.item) {
+ print(var.volumeId,
+ " ",
+ var.modificationState,
+ " ",
+ var.progress,
+ "%\n");
+ if (var.targetSize) {
+ print("\tsize: ",
+ var.originalSize,
+ " => ",
+ var.targetSize,
+ "\n");
+ }
+ if (var.targetVolumeType) {
+ print("\ttype: ",
+ var.originalVolumeType,
+ " => ",
+ var.targetVolumeType,
+ "\n");
+ }
+ if (var.targetIops) {
+ print("\tiops:",
+ var.originalIops,
+ " => ",
+ var.targetIops,
+ "\n");
+ }
+ }
+}
+
+
diff --git a/etc/modify-volume.fln b/etc/modify-volume.fln
new file mode 100644
index 0000000..6b04bec
--- /dev/null
+++ b/etc/modify-volume.fln
@@ -0,0 +1,45 @@
+/* This file is part of Eclat.
+ Copyright (C) 2018 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 (.ModifyVolumeResponse.volumeModification) {
+ print(.ModifyVolumeResponse.volumeModification.volumeId,
+ ": ",
+ .ModifyVolumeResponse.volumeModification.modificationState,
+ " ",
+ .ModifyVolumeResponse.volumeModification.progress,
+ "%\n");
+ if (.ModifyVolumeResponse.volumeModification.targetSize) {
+ print("\tsize: ",
+ .ModifyVolumeResponse.volumeModification.originalSize,
+ " => ",
+ .ModifyVolumeResponse.volumeModification.targetSize,
+ "\n");
+ }
+ if (.ModifyVolumeResponse.volumeModification.targetVolumeType) {
+ print("\ttype: ",
+ .ModifyVolumeResponse.volumeModification.originalVolumeType,
+ " => ",
+ .ModifyVolumeResponse.volumeModification.targetVolumeType,
+ "\n");
+ }
+ if (.ModifyVolumeResponse.volumeModification.targetIops) {
+ print("\tiops: ",
+ .ModifyVolumeResponse.volumeModification.originalIops,
+ " => ",
+ .ModifyVolumeResponse.volumeModification.targetIops,
+ "\n");
+ }
+} \ No newline at end of file
diff --git a/lib/libeclat.h b/lib/libeclat.h
index 6f1acf6..285e045 100644
--- a/lib/libeclat.h
+++ b/lib/libeclat.h
@@ -80,13 +80,13 @@ int eclat_base64_decode(const unsigned char *input, size_t input_len,
struct ec2_param {
char *name;
char *value;
int encoded;
};
-#define EC2_API_VERSION "2014-06-15"
+#define EC2_API_VERSION "2016-11-15"
#define EC2_RF_HTTPS 0x01
#define EC2_RF_POST 0x02
struct ec2_request {
int flags; /* Composed from EC2_RF_* bits */
diff --git a/src/Makefile.am b/src/Makefile.am
index e78461c..c4fc211 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,12 +18,13 @@ bin_PROGRAMS=eclat ispeek
eclat_SOURCES=\
accfile.c\
allocaddr.c\
asscaddr.c\
atvol.c\
+ chvol.c\
cmdline.h\
config.c\
cpimg.c\
cpsnap.c\
deimg.c\
devmap.c\
@@ -36,12 +37,13 @@ eclat_SOURCES=\
getconout.c\
igw.c\
io.c\
lsaddr.c\
lsattr.c\
lsaattr.c\
+ lschvol.c\
lsiattr.c\
lsimg.c\
lsinst.c\
lsistat.c\
lsreg.c\
lssattr.c\
diff --git a/src/chvol.c b/src/chvol.c
new file mode 100644
index 0000000..f1246c9
--- /dev/null
+++ b/src/chvol.c
@@ -0,0 +1,86 @@
+/* This file is part of Eclat.
+ Copyright (C) 2012-2018 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"
+
+// eclat modvol VOLID [iops=V] [size=S] [type=V]
+
+char const *params[] = {
+ "iops",
+ "Iops",
+ "size",
+ "Size",
+ "type",
+ "VolumeType"
+};
+
+static char const *
+getparam(char const *p, size_t len)
+{
+ int i;
+
+ for (i = 0; i < sizeof(params) / sizeof(params[0]); i++) {
+ if (len == strlen(params[i])
+ && memcmp(params[i], p, len) == 0) {
+ if (i % 2 == 0)
+ i++;
+ return params[i];
+ }
+ }
+ return NULL;
+}
+
+int
+eclat_modify_volume(eclat_command_env_t *env, int argc, char **argv)
+{
+ int i;
+ struct ec2_request *q = env->request;
+
+ generic_proginfo->args_doc = "VOL-ID [iops=V] [size=S] [type=V]";
+ generic_parse_options(env->cmd,
+ "modify volume parameters",
+ argc, argv, &i);
+ argv += i;
+ argc -= i;
+
+ if (argc == 0)
+ die(EX_USAGE, "wrong number of arguments");
+
+ translate_ids(1, argv, MAP_VOLUME);
+ eclat_request_add_param(q, "VolumeId", argv[0]);
+ for (i = 1; i < argc; i++) {
+ size_t len;
+ char const *param;
+ char const *value;
+
+ len = strcspn(argv[i], "=");
+ param = getparam(argv[i], len);
+ if (!param)
+ die(EX_USAGE, "unrecognized parameter: %s", argv[i]);
+ if (argv[i][len]) {
+ value = argv[i] + len + 1;
+ } else {
+ i++;
+ if (i == argc)
+ die(EX_USAGE, "missing value for %s",
+ argv[i-1]);
+ value = argv[i];
+ }
+ eclat_request_add_param(q, param, value);
+ }
+ return 0;
+}
+
diff --git a/src/eclat.c b/src/eclat.c
index 26a8f9f..43387be 100644
--- a/src/eclat.c
+++ b/src/eclat.c
@@ -205,13 +205,16 @@ struct eclat_command cmdtab[] = {
eclat_describe_route_tables },
{ "assocrtab", "associate-route-table", "AssociateRouteTable",
eclat_associate_route_table, CMD_MOD },
{ "disasrtab", "disassociate-route-table", "DisassociateRouteTable",
eclat_disassociate_route_table, CMD_MOD },
{ "route", NULL, NULL, eclat_route },
-
+ { "chvol", "modify-volume", "ModifyVolume",
+ eclat_modify_volume },
+ { "lschvol", "describe-volumes-modifications", "DescribeVolumesModifications",
+ eclat_describe_volumes_modifications }
};
size_t cmdcnt = sizeof(cmdtab) / sizeof(cmdtab[0]);
static int
cmdcmp(const void *a, const void *b)
{
diff --git a/src/eclat.h b/src/eclat.h
index 1948234..f314476 100644
--- a/src/eclat.h
+++ b/src/eclat.h
@@ -154,12 +154,16 @@ int eclat_reset_snapshot_attribute(eclat_command_env_t *env,
int eclat_describe_avaialbility_zones(eclat_command_env_t *env, int argc, char **argv);
int eclat_describe_regions(eclat_command_env_t *env, int argc, char **argv);
int eclat_create_volume(eclat_command_env_t *env, int argc, char **argv);
int eclat_delete_volume(eclat_command_env_t *env, int argc, char **argv);
int eclat_attach_volume(eclat_command_env_t *env, int argc, char **argv);
int eclat_detach_volume(eclat_command_env_t *env, int argc, char **argv);
+int eclat_modify_volume(eclat_command_env_t *env, int argc, char **argv);
+int eclat_describe_volumes_modifications(eclat_command_env_t *env, int argc,
+ char **argv);
+
int eclat_modify_instance_attribute(eclat_command_env_t *env,
int argc, char **argv);
int eclat_run_instances(eclat_command_env_t *env, int argc, char **argv);
int eclat_describe_images(eclat_command_env_t *env, int argc, char **argv);
int eclat_create_image(eclat_command_env_t *env, int argc, char **argv);
int eclat_deregister_image(eclat_command_env_t *env, int argc, char **argv);
diff --git a/src/lschvol.c b/src/lschvol.c
new file mode 100644
index 0000000..28e7dc2
--- /dev/null
+++ b/src/lschvol.c
@@ -0,0 +1,68 @@
+/* This file is part of Eclat.
+ Copyright (C) 2018 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 *modification_state_enum[] = {
+ "modifying",
+ "optimizing",
+ "completed",
+ "failed",
+ NULL
+};
+
+static char *volume_type_enum[] = {
+ "standard",
+ "io1",
+ "gp2",
+ "sc1",
+ "st1",
+ NULL
+};
+
+static struct filter_descr filters[] = {
+ { "volume-id", FILTER_STRING },
+ { "modification-state", FILTER_ENUM, modification_state_enum },
+ { "target-size", FILTER_INT },
+ { "target-iops", FILTER_INT },
+ { "target-volume-type", FILTER_ENUM, volume_type_enum },
+ { "original-size", FILTER_INT },
+ { "original-iops", FILTER_INT },
+ { "original-volume-type", FILTER_ENUM, volume_type_enum },
+ { "start-time", FILTER_DATE },
+ { NULL }
+};
+
+int
+eclat_describe_volumes_modifications(eclat_command_env_t *env, int argc,
+ char **argv)
+{
+ int i;
+
+ available_filters = filters;
+ generic_proginfo->print_help_hook = list_filters;
+ generic_proginfo->args_doc = "[FILTER...] [ID...]";
+ generic_parse_options(env->cmd,
+ "describe current modifications status of EBS volumes",
+ argc, argv, &i);
+ argv += i;
+ argc -= i;
+ translate_ids(argc, argv, MAP_VOLUME);
+
+ describe_request_create(env, argc, argv, "VolumeId");
+ return 0;
+}
+

Return to:

Send suggestions and report system problems to the System administrator.