1
2 from starcluster import node
3 from starcluster import volume
4 from starcluster import static
5
6 from createvolume import CmdCreateVolume
7
8
10 """
11 resizevolume [options] <volume_id> <volume_size>
12
13 Resize an existing EBS volume
14
15 NOTE: The EBS volume must either be unpartitioned or contain only a single
16 partition. Any other configuration will be aborted.
17 """
18
19 names = ['resizevolume', 'res']
20
22 parser.add_option(
23 "-z", "--zone", dest="dest_zone",
24 action="store", type="string", default=None,
25 help="Create the resized volume in a different zone than the " + \
26 "original volume (must be within the same region)")
27 parser.add_option(
28 "-k", "--keypair", dest="keypair",
29 action="store", type="string", default=None,
30 help="The keypair to use when launching host instance " + \
31 "(must be defined in the config)")
32 parser.add_option(
33 "-H", "--host-instance", dest="host_instance",
34 action="store", type="string", default=None,
35 help="Use existing instance as volume host rather than " + \
36 "launching a new host")
37 parser.add_option(
38 "-d", "--detach-volume", dest="detach_vol",
39 action="store_true", default=False,
40 help="Detach new volume from host instance after creation")
41 parser.add_option(
42 "-s", "--shutdown-volume-host", dest="shutdown_instance",
43 action="store_true", default=False,
44 help="Shutdown host instance after creating volume")
45 parser.add_option(
46 "-i", "--image-id", dest="image_id",
47 action="store", type="string", default=None,
48 help="The AMI to use when launching volume host instance")
49 parser.add_option(
50 "-I", "--instance-type", dest="instance_type",
51 action="store", type="choice", default="m1.small",
52 choices=static.INSTANCE_TYPES.keys(),
53 help="The instance type to use when launching volume " + \
54 "host instance")
55 parser.add_option(
56 "-r", "--resizefs-cmd", dest="resizefs_cmd",
57 action="store", type="string", default="resize2fs",
58 help="Specify alternate resizefs command to use when " + \
59 "formatting volume (default: resize2fs)")
60
62 if len(args) != 2:
63 self.parser.error(
64 "you must specify a volume id and a size (in GB)")
65 volid, size = args
66 size = self._get_size_arg(size)
67 vol = self.ec2.get_volume(volid)
68 zone = vol.zone
69 if self.opts.dest_zone:
70 zone = self.ec2.get_zone(self.opts.dest_zone).name
71 key = self.opts.keypair
72 host_instance = None
73 if self.opts.host_instance:
74 host_instance = self.ec2.get_instance(self.opts.host_instance)
75 key = host_instance.key_name
76 keypair, key_location = self._load_keypair(key)
77 if host_instance:
78 host_instance = node.Node(host_instance, key_location,
79 alias="volumecreator_host")
80 kwargs = self.specified_options_dict
81 kwargs.update(dict(keypair=keypair, key_location=key_location,
82 host_instance=host_instance))
83 vc = volume.VolumeCreator(self.ec2, **kwargs)
84 if host_instance:
85 vc._validate_host_instance(host_instance, zone)
86 self.catch_ctrl_c()
87 new_volid = vc.resize(vol, size, dest_zone=self.opts.dest_zone)
88 if new_volid:
89 self.log.info(
90 "Volume %s was successfully resized to %sGB" % (volid, size))
91 self.log.info("New volume id is: %s" % new_volid)
92 else:
93 self.log.error("failed to resize volume %s" % volid)
94