def find_cheapest_subnet_price( batch_job_parm_item, profile_name=None ): """ Find cheapest subnet and price :param batch_job_parm_item: :param profile_name: (Default value = None) :return: cheapest_subnet, bid_price, spot_cheapest_item """ bid_price = -1.0 cheapest_subnet = None spot_cheapest_item = None spot_cheapest_items = find_spot_cheapest_prices( instance_type=batch_job_parm_item.instance_type, product_description='Linux/UNIX', profile_name=profile_name, region_filter=batch_job_parm_item.spot_query_region_names, max_bid=batch_job_parm_item.spot_query_max_bid) if len(spot_cheapest_items) > 0: spot_cheapest_item = spot_cheapest_items[0] spot_query_regions_azs_subnets = batch_job_parm_item.spot_query_regions_azs_subnets cheapest_subnet = None if spot_cheapest_item.region.name in spot_query_regions_azs_subnets: azs_subnets = spot_query_regions_azs_subnets[ spot_cheapest_item.region.name ] if spot_cheapest_item.zone.name in azs_subnets: cheapest_subnet = azs_subnets[ spot_cheapest_item.zone.name ] bid_price = calc_bid_price( spot_cheapest_item.price ) return cheapest_subnet, bid_price, spot_cheapest_item
def submit_request_spot_instances( spot_master_item, dynamodb_conn, profile_name=None ): """ :param spot_master_item: :param dynamodb_conn: :param profile_name: (Default value = None) """ spot_instance_requests = None bid_price = -1.0 cheapest_subnet = None spot_batch_job_parm_table = Table(awsspotbatch.common.const.SPOT_BATCH_JOB_PARM_TABLE_NAME, connection=dynamodb_conn ) spot_batch_job_parm_item = spot_batch_job_parm_table.get_item( spot_master_uuid=spot_master_item[TableSpotMaster.spot_master_uuid] ) batch_job_parm_item = BatchJobParmItem( stringParmFile=spot_batch_job_parm_item[TableSpotBatchJobParm.raw_batch_job_parm_item] ) spot_cheapest_items = find_spot_cheapest_prices( instance_type=batch_job_parm_item.instance_type, product_description='Linux/UNIX', profile_name=profile_name, region_filter=batch_job_parm_item.spot_query_region_names, max_bid=batch_job_parm_item.spot_query_max_bid) if len(spot_cheapest_items) > 0: spot_cheapest_item = spot_cheapest_items[0] spot_query_regions_azs_subnets = batch_job_parm_item.spot_query_regions_azs_subnets cheapest_subnet = None if spot_cheapest_item.region.name in spot_query_regions_azs_subnets: azs_subnets = spot_query_regions_azs_subnets[ spot_cheapest_item.region.name ] if spot_cheapest_item.zone.name in azs_subnets: cheapest_subnet = azs_subnets[ spot_cheapest_item.zone.name ] bid_price = calc_bid_price( spot_cheapest_item.price ) valid_until = datetime.datetime.utcnow() + datetime.timedelta( minutes=batch_job_parm_item.spot_request_valid_for_minutes ) valid_until_iso = valid_until.isoformat() ec2_conn = awsext.ec2.connect_to_region( spot_cheapest_item.region.name ) spot_instance_requests = ec2_conn.request_spot_instances( bid_price, image_id=batch_job_parm_item.ami_id, count=batch_job_parm_item.num_instances, type='one-time', dry_run=batch_job_parm_item.dry_run, valid_until=valid_until_iso, user_data=None, instance_type=spot_cheapest_item.instance_type, placement=spot_cheapest_item.zone.name, instance_profile_name=spot_master_item[ TableSpotMaster.role_name ], key_name=spot_master_item[ TableSpotMaster.kp_name ], security_group_ids=[ spot_master_item[ TableSpotMaster.sg_id ] ], subnet_id=cheapest_subnet, availability_zone_group='single', ) return spot_instance_requests, bid_price, cheapest_subnet