View | Details | Raw Unified | Return to bug 34819 | Differences between
and this patch

Collapse All | Expand All

(-)lib.py (-20 / +67 lines)
Lines 126-132 Link Here
126
		# Create the logfile
126
		# Create the logfile
127
		if self.logfile:
127
		if self.logfile:
128
			log = open(self.logfile, 'a+')
128
			log = open(self.logfile, 'a+')
129
			log.write('Created instance %s at %s\n' % (section, time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())))
129
			log.write('Creating instance %s at %s\n' % (section, time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime())))
130
			log.close()
130
			log.close()
131
		self.logfile_fd = None
131
		self.logfile_fd = None
132
132
Lines 150-156 Link Here
150
				self._connect_vm()
150
				self._connect_vm()
151
				break
151
				break
152
			except socket_error:
152
			except socket_error:
153
				self._log('Pending %d...'  % (timeout - now + start))
153
				self._log('Connecting %d...'  % (timeout - now + start))
154
				time.sleep(5)
154
				time.sleep(5)
155
				now = time.time()
155
				now = time.time()
156
			except paramiko.AuthenticationException:
156
			except paramiko.AuthenticationException:
Lines 159-165 Link Here
159
				now = time.time()
159
				now = time.time()
160
			except Exception, ex:
160
			except Exception, ex:
161
				self._log('Unknown error "%s"...'  % (ex,))
161
				self._log('Unknown error "%s"...'  % (ex,))
162
				self._log('Pending %d...'  % (timeout - now + start))
162
				self._log('Connecting %d...'  % (timeout - now + start))
163
				time.sleep(5)
163
				time.sleep(5)
164
				now = time.time()
164
				now = time.time()
165
		else:
165
		else:
Lines 552-561 Link Here
552
				'ec2_ami',
552
				'ec2_ami',
553
				'ec2_security_group',
553
				'ec2_security_group',
554
				'ec2_instance_type',
554
				'ec2_instance_type',
555
				'ec2_instance_ebsOptimized',
555
				'ec2_keypair',
556
				'ec2_keypair',
556
				'ec2_region',
557
				'ec2_region',
557
				'ec2_subnet_id',
558
				'ec2_subnet_id',
558
				'ec2_partition_size',
559
				'ec2_partition_size',
560
				'ec2_instance_store',
561
				'ec2_volume_type',
562
				'ec2_volume_iops',
559
				]
563
				]
560
		for key in params:
564
		for key in params:
561
			if not config.has_option(section, key):
565
			if not config.has_option(section, key):
Lines 574-587 Link Here
574
		"""
578
		"""
575
		Create explicit block device with given size.
579
		Create explicit block device with given size.
576
		"""
580
		"""
577
		bdm = None
581
		if not self.aws_cfg.get('ec2_partition_size') and not self.aws_cfg.get('ec2_instance_store'):
582
			# Nothing to do here if not related parameters
583
			return None
584
		
585
		#Initialize only one time
586
		bdm = blockdevicemapping.BlockDeviceMapping()
587
		self._log('Mapping volumes.')
578
		if self.aws_cfg.get('ec2_partition_size'):
588
		if self.aws_cfg.get('ec2_partition_size'):
579
			dev_sda1 = blockdevicemapping.EBSBlockDeviceType(
589
			opt_volume_type = 'standard'
580
					size = self.aws_cfg.get('ec2_partition_size'),
590
			opt_iops = None
581
					delete_on_termination=True,
591
			if self.aws_cfg.get('ec2_volume_type'):
582
					)
592
				self._log('Adding IOPS volumes...')
583
			bdm = blockdevicemapping.BlockDeviceMapping()
593
				#TODO: make sure ebsOptimized is also active
594
				opt_volume_type = self.aws_cfg.get('ec2_volume_type')
595
				# IOPS - up to partition_size * 30 (See AWS docs)
596
				opt_iops = self.aws_cfg.get('ec2_volume_iops')
597
			self._log('Assign new size to root volume (%s)...' % self.aws_cfg.get('ec2_partition_size'))
598
			dev_sda1.size = self.aws_cfg.get('ec2_partition_size')
599
			dev_sda1.volume_type = opt_volume_type
600
			dev_sda1.iops = opt_iops
601
			dev_sda1.delete_on_termination = True
584
			bdm['/dev/sda1'] = dev_sda1
602
			bdm['/dev/sda1'] = dev_sda1
603
			self._log('...OK!')
604
		#self._log('MappedEBSDevices: %s' % bdm)
605
		#assumming 2 - TODO: cycle for number-of-devices
606
		if self.aws_cfg.get('ec2_instance_store'):
607
			self._log('Adding instance store volumes...')
608
			dev_xvdb = blockdevicemapping.BlockDeviceType()
609
			dev_xvdc = blockdevicemapping.BlockDeviceType()
610
			dev_xvdb.ephemeral_name = 'ephemeral0'
611
			dev_xvdc.ephemeral_name = 'ephemeral1'
612
			dev_sda1 = blockdevicemapping.BlockDeviceType()
613
			bdm['/dev/sdb'] = dev_xvdb
614
			bdm['/dev/sdc'] = dev_xvdc
615
			self._log('...OK!')
616
		#self._log('MappedDevices: %s' % bdm)
585
		return bdm
617
		return bdm
586
618
587
	def _connect_vm(self):
619
	def _connect_vm(self):
Lines 617-623 Link Here
617
				user_data=user_data,
649
				user_data=user_data,
618
				security_group_ids=[self.aws_cfg['ec2_security_group']],
650
				security_group_ids=[self.aws_cfg['ec2_security_group']],
619
				instance_type=self.aws_cfg['ec2_instance_type'],
651
				instance_type=self.aws_cfg['ec2_instance_type'],
620
				instance_initiated_shutdown_behavior='terminate',  # 'save'
652
				instance_initiated_shutdown_behavior='terminate',
621
				block_device_map=self._get_blockdevicemapping()
653
				block_device_map=self._get_blockdevicemapping()
622
				)
654
				)
623
		else:
655
		else:
Lines 628-656 Link Here
628
				user_data=user_data,
660
				user_data=user_data,
629
				security_groups=[self.aws_cfg['ec2_security_group']],
661
				security_groups=[self.aws_cfg['ec2_security_group']],
630
				instance_type=self.aws_cfg['ec2_instance_type'],
662
				instance_type=self.aws_cfg['ec2_instance_type'],
631
				instance_initiated_shutdown_behavior='terminate',  # 'save'
663
				instance_initiated_shutdown_behavior='terminate',
632
				block_device_map=self._get_blockdevicemapping()
664
				block_device_map=self._get_blockdevicemapping()
633
				)
665
				)
666
		
667
		self.instance = reservation.instances[0]		
668
		self._log('Instance %s reserved. ->%s' % (self.instance.id, self.instance.state))
634
669
635
		self.instance = reservation.instances[0]
636
637
		self._wait_instance()
670
		self._wait_instance()
638
671
		
639
		self.instance.add_tag('Name', 'Test-%s-%s' % (os.getenv('USER'), self.section))
672
		self.instance.add_tag('Name', 'Test-%s-%s' % (os.getenv('USER'), self.section))
640
		self.instance.add_tag('class', 'ucs-test')
673
		self.instance.add_tag('class', 'ucs-test')
641
		for var in env_vars:
674
		for var in env_vars:
642
			self.instance.add_tag(var.lower(), os.getenv(var, ''))
675
			self.instance.add_tag(var.lower(), os.getenv(var, ''))
676
		#Need ebsOptimized if volume_type is io1
677
		#NOTE:launching an instance with image.run does not support ebsOptimized
678
		#modifying instance attribute:
679
		#self._log('EBS status: %s' % (self.instance.ebs_optimized))
680
		if self.aws_cfg.get('ec2_instance_ebsOptimized') == 'True':
681
			self._log('Changing EBS status: stopping instance first.')
682
			# stop VM (make sure it will only be stoped, not terminated)
683
			self.instance.modify_attribute('instanceInitiatedShutdownBehavior', 'stop')
684
			self.instance.stop()
685
			self._wait_instance(desiredState='stopped')
686
			self.instance.modify_attribute('ebsOptimized', True)
687
			self.instance.modify_attribute('instanceInitiatedShutdownBehavior', 'terminate')
688
			self.instance.start()
689
			self._wait_instance()
643
690
644
	def _wait_instance(self, timeout=600):
691
	def _wait_instance(self, timeout=600, desiredState='running'):
645
		"""
692
		"""
646
		Wait until instance is created.
693
		Wait until instance is created.
647
		"""
694
		"""
648
		start = now = time.time()
695
		start = now = time.time()
649
		while now - start < timeout:
696
		while now - start < timeout:
650
			if self.instance.state == 'running':
697
			if self.instance.state == desiredState:
651
				break
698
				break
652
			if self.instance.state == 'pending':
699
			if self.instance.state != desiredState:
653
				self._log('Pending %d...' % (timeout - now + start))
700
				self._log('State: %s, waiting %d...' % (self.instance.state, timeout - now + start))
654
			time.sleep(10)
701
			time.sleep(10)
655
702
656
			try:
703
			try:
Lines 661-674 Link Here
661
					if error.error_code == 'InvalidInstanceID.NotFound':
708
					if error.error_code == 'InvalidInstanceID.NotFound':
662
						break
709
						break
663
				else:
710
				else:
664
					self._log('Unexcpected error waiting for instance: %s', ex)
711
					self._log('Unexpected error waiting for instance: %s', ex)
665
					raise
712
					raise
666
			now = time.time()
713
			now = time.time()
667
		else:
714
		else:
668
			self._log('Timeout waiting for instance')
715
			self._log('Timeout waiting for instance')
669
			raise
716
			raise
717
		self._log('OK ->%s' % (self.instance.state))
670
718
671
672
def _print_process(msg):
719
def _print_process(msg):
673
	'''	Print s status line '''
720
	'''	Print s status line '''
674
	if len(msg) > 64:
721
	if len(msg) > 64:

Return to bug 34819