def test_001_attach_volume(self): """Attach volume""" if self.ctx.ssh is None: raise self.skipException("Booting failed") self._start_test() # NOTE(apavlov): ec2-create-volume -z ZONE -s SIZE_GB zone = self.ctx.instance.placement volume = self.ec2_client.create_volume(self.volume_size, zone) self.addResourceCleanUp(self.destroy_volume_wait, volume) self.ctx.volume = volume # NOTE(apavlov): wait it (ec2-describe-volumes VOLUME) self.assertVolumeStatusWait(volume, "available") # NOTE(apavlov): ec2-attach-volume -d /dev/XXX -i INSTANCE VOLUME # and wait until it will be available self.ctx.part_lines = self.ctx.ssh.get_partitions().split('\n') volume.attach(self.ctx.instance.id, "/dev/" + self.volume_attach_name) # NOTE(apavlov): "attaching" invalid EC2 status #1074901 self.assertVolumeStatusWait(self._volume_state, "in-use") boto_wait.re_search_wait(self._volume_state, "in-use") boto_wait.state_wait(self._part_state, 1) part_lines_new = self.ctx.ssh.get_partitions().split('\n') volume_name = utils.detect_new_volume(self.ctx.part_lines, part_lines_new) self.ctx.part_lines = part_lines_new self._end_test("Create and attach volume") self.ctx.ssh.exec_command("PATH=$PATH:/usr/sbin:/usr/bin " "&& sudo mkfs.ext3 /dev/" + volume_name) self.ctx.ssh.exec_command("sudo mkdir -m 777 /vol " "&& sudo mount /dev/" + volume_name + " /vol") self.ctx.volume_ready = True self._check_test()
def _run_scenario(self, scenario_func, snapshot=None): # NOTE(apavlov): ec2-run-instances --key KEYPAIR IMAGE reservation = self.ec2_client.run_instances( self.image_id, instance_type=self.instance_type, key_name=self.keypair.name, security_groups=(self.sec_group_name, )) self.addResourceCleanUp(self.destroy_reservation, reservation) instance = reservation.instances[0] LOG.info("state: %s", instance.state) # NOTE(apavlov): wait until it runs (ec2-describe-instances INSTANCE) if instance.state != "running": self.assertInstanceStateWait(instance, "running") # NOTE(apavlov): ec2-create-volume -z ZONE -s SIZE_GB zone = instance.placement volume = self.ec2_client.create_volume(1, zone, snapshot=snapshot) self.addResourceCleanUp(self.destroy_volume_wait, volume) # NOTE(apavlov): wait it (ec2-describe-volumes VOLUME) self.assertVolumeStatusWait(volume, "available") ip_address = self._prepare_public_ip(instance) ssh = remote_client.RemoteClient(ip_address, self.ssh_user, pkey=self.keypair.material) # NOTE(apavlov): ec2-attach-volume -d /dev/XXX -i INSTANCE VOLUME # and wait until it will be available part_lines = ssh.get_partitions().split('\n') volume.attach(instance.id, "/dev/" + self.volume_attach_name) def _volume_state(): volume.update(validate=True) return volume.status self.assertVolumeStatusWait(_volume_state, "in-use") boto_wait.re_search_wait(_volume_state, "in-use") def _part_state(): current = ssh.get_partitions().split('\n') if len(current) > len(part_lines): return 1 if len(current) < len(part_lines): return -1 return 0 boto_wait.state_wait(_part_state, 1) part_lines_new = ssh.get_partitions().split('\n') self.volume_name = utils.detect_new_volume(part_lines, part_lines_new) part_lines = part_lines_new self._correct_ns_if_needed(ssh) snapshot = scenario_func(ssh, volume.id) # NOTE(apavlov): stop this instance(imagine that it will be used) instance.stop() LOG.info("state: %s", instance.state) if instance.state != "stopped": self.assertInstanceStateWait(instance, "stopped") return snapshot
def _run_scenario(self, scenario_func, snapshot=None): # NOTE(apavlov): ec2-run-instances --key KEYPAIR IMAGE reservation = self.ec2_client.run_instances(self.image_id, instance_type=self.instance_type, key_name=self.keypair.name, security_groups=(self.sec_group_name,)) self.addResourceCleanUp(self.destroy_reservation, reservation) instance = reservation.instances[0] LOG.info("state: %s", instance.state) # NOTE(apavlov): wait until it runs (ec2-describe-instances INSTANCE) if instance.state != "running": self.assertInstanceStateWait(instance, "running") # NOTE(apavlov): ec2-create-volume -z ZONE -s SIZE_GB zone = instance.placement volume = self.ec2_client.create_volume(1, zone, snapshot=snapshot) self.addResourceCleanUp(self.destroy_volume_wait, volume) # NOTE(apavlov): wait it (ec2-describe-volumes VOLUME) self.assertVolumeStatusWait(volume, "available") ip_address = self._prepare_public_ip(instance) ssh = remote_client.RemoteClient(ip_address, self.ssh_user, pkey=self.keypair.material) # NOTE(apavlov): ec2-attach-volume -d /dev/XXX -i INSTANCE VOLUME # and wait until it will be available part_lines = ssh.get_partitions().split('\n') volume.attach(instance.id, "/dev/" + self.volume_attach_name) def _volume_state(): volume.update(validate=True) return volume.status self.assertVolumeStatusWait(_volume_state, "in-use") boto_wait.re_search_wait(_volume_state, "in-use") def _part_state(): current = ssh.get_partitions().split('\n') if len(current) > len(part_lines): return 1 if len(current) < len(part_lines): return -1 return 0 boto_wait.state_wait(_part_state, 1) part_lines_new = ssh.get_partitions().split('\n') self.volume_name = utils.detect_new_volume(part_lines, part_lines_new) part_lines = part_lines_new self._correct_ns_if_needed(ssh) snapshot = scenario_func(ssh, volume.id) # NOTE(apavlov): stop this instance(imagine that it will be used) instance.stop() LOG.info("state: %s", instance.state) if instance.state != "stopped": self.assertInstanceStateWait(instance, "stopped") return snapshot