def run(juttle,
        deployment_name,
        program_name=None,
        persist=False,
        token_manager=None,
        app_url=defaults.APP_URL):
    headers = token_manager.get_access_token_headers()

    data_url = get_juttle_data_url(deployment_name,
                                   app_url=app_url,
                                   token_manager=token_manager)

    websocket = __wss_connect(data_url, token_manager)

    data = websocket.recv()
    channel_id_obj = json.loads(data)

    if is_debug_enabled():
        debug('got channel response %s', json.dumps(channel_id_obj))

    channel_id = channel_id_obj['channel_id']
    juttle_job = {
        'channel_id': channel_id,
        'alias': program_name,
        'program': juttle
    }

    response = requests.post('%s/api/v1/jobs' % data_url,
                             data=json.dumps(juttle_job),
                             headers=headers)

    if response.status_code != 200:
        yield {
            "error": True,
            "context": response.json()
        }
        return

    job_info = response.json()
    # yield job_info so the caller to this method can figure out which sinks
    # correlate to which flowgraphs
    yield job_info
    job_id = job_info['job']['id']

    if is_debug_enabled():
        debug('started job %s', json.dumps(job_info))

    for data in connect_job(job_id,
                            deployment_name,
                            token_manager=token_manager,
                            app_url=app_url,
                            persist=persist,
                            websocket=websocket,
                            data_url=data_url):
        yield data
:param deployment: deployment for workflow execution
dataset/ETHPy150Open jut-io/jut-python-tools/jut/api/data_engine.py/run--crossover with--dataset/ETHPy150Open cloudify-cosmo/cloudify-manager/rest-service/manager_rest/blueprints_manager.py/BlueprintsManager._execute_system_workflow