Ejemplo n.º 1
0
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