def launch_spot_batch_service():
    """ 
        Launch dispatcher on t2.micro EC2 instance, in the future this will be in AWS Lambda
        1. Multiple instances can (and should) be launched concurrently, i.e. in different AZ's
        2. Install as a service that starts at system boot, this is detailed in the README
    """
    if len(sys.argv) == 1:
        print 'ERROR: Missing log configuration file, first argument must be path/name.ext of the log configuration file'
        sys.exit(8)
    logging.config.fileConfig( sys.argv[1], disable_existing_loggers=False)
    logger = logging.getLogger(__name__)
    
    try:
        logger.info( '**********************************' )
        logger.info( 'Starting SpotBatchMgr Version: ' + awsspotbatch.Version )
        logger.info( '**********************************' )
        if len(sys.argv) == 2:
            logger.error('Missing master parm item file, second argument must be path/name.ext of master parm item json file')
            sys.exit(8)
            
        master_parm_item = MasterParmItem( sys.argv[2] )
        is_purge_queues = False
        if len(sys.argv) > 3 and sys.argv[3] == 'purge': is_purge_queues = True
         
        spot_master_sqs_message_durable = SqsMessageDurable( awsspotbatch.common.const.SPOT_MASTER_QUEUE_NAME, master_parm_item.region_name, profile_name=master_parm_item.profile_name )
        spot_request_sqs_message_durable = SqsMessageDurable( awsspotbatch.common.const.SPOT_REQUEST_QUEUE_NAME, master_parm_item.region_name, profile_name=master_parm_item.profile_name )

        if is_purge_queues:
            spot_master_sqs_message_durable.purge_queue()
            spot_request_sqs_message_durable.purge_queue()
        
        spot_master_dispatcher = SpotMasterDispatcher( region_name=master_parm_item.region_name, 
                                                       profile_name=master_parm_item.profile_name )
        spot_request_dispatcher = SpotRequestDispatcher( region_name=master_parm_item.region_name, 
                                                       profile_name=master_parm_item.profile_name )
        
        spot_master_dispatcher.start()
        logger.info("Started: spot_master_dispatcher")
        spot_request_dispatcher.start()
        logger.info("Started: spot_request_dispatcher")
        
        spot_master_dispatcher.join()

    except StandardError as e:
        logger.error( e )
        logger.error( traceback.format_exc() )
        sys.exit(8)
def main():
    """ """
    import logging.config
    logging.config.fileConfig( '../../../../config/consoleandfile.conf', disable_existing_loggers=False)
    logger = logging.getLogger(__name__)
    
    try:
        logger.info( 'Starting' )
        master_parm_item = MasterParmItem( sys.argv[1] )
         
        spot_master_sqs_message_durable = SqsMessageDurable( awsspotbatch.common.const.SPOT_MASTER_QUEUE_NAME, master_parm_item.region_name, profile_name=master_parm_item.profile_name )
        spot_request_sqs_message_durable = SqsMessageDurable( awsspotbatch.common.const.SPOT_REQUEST_QUEUE_NAME, master_parm_item.region_name, profile_name=master_parm_item.profile_name )

        # TEST TEST TEST - only during development
        spot_master_sqs_message_durable.purge_queue()
        spot_request_sqs_message_durable.purge_queue()
        
        spot_master_dispatcher = SpotMasterDispatcher( region_name=master_parm_item.region_name, 
                                                       profile_name=master_parm_item.profile_name )
        spot_request_dispatcher = SpotRequestDispatcher( region_name=master_parm_item.region_name, 
                                                       profile_name=master_parm_item.profile_name )
        
        spot_master_dispatcher.start()
        spot_request_dispatcher.start()

        spot_master_msg_batch_submit = create_spot_master_msg_batch_submit( sys.argv[2], sys.argv[3] )
        message_attributes = create_microsvc_message_attributes( awsspotbatch.common.const.MICROSVC_MASTER_CLASSNAME_SpotMasterMessageSubmitBatch )
        spot_master_sqs_message_durable.send_message( spot_master_msg_batch_submit.to_json(),
                                                      message_attributes=message_attributes )
         
        spot_master_dispatcher.join()
        
        logger.info( 'Completed Successfully' )

    except StandardError as e:
        logger.error( e )
        logger.error( traceback.format_exc() )
        sys.exit(8)