def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ options = RunOptions(top_level=top_level) configure_eliot_logging_for_acceptance() try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner def cluster_cleanup(): print ("stopping cluster") return runner.stop_cluster(reactor) cleanup_trigger_id = reactor.addSystemEventTrigger("before", "shutdown", cluster_cleanup) from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service( destination=FileDestination(file=open("%s.log" % (base_path.basename(),), "a")), reactor=reactor, capture_stdout=False, ) log_writer.startService() reactor.addSystemEventTrigger("before", "shutdown", log_writer.stopService) yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) save_managed_config(options["cert-directory"], options["config"], cluster) managed_config_file = options["cert-directory"].child("managed.yaml") managed_config = create_managed_config(options["config"], cluster) managed_config_file.setContent(yaml.safe_dump(managed_config, default_flow_style=False)) if options["distribution"] in ("centos-7",): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_journal(reactor, node.address, remote_logs_file).addErrback(write_failure) elif options["distribution"] in ("ubuntu-14.04", "ubuntu-15.10"): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_upstart(reactor, node.address, remote_logs_file).addErrback(write_failure) flocker_client = make_client(reactor, cluster) yield wait_for_nodes(reactor, flocker_client, len(cluster.agent_nodes)) if options["no-keep"]: print ("not keeping cluster") else: save_environment(options["cert-directory"], cluster, options.package_source()) reactor.removeSystemEventTrigger(cleanup_trigger_id)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_file = open("%s.log" % base_path.basename(), "a") log_writer = eliot_logging_service( log_file=log_file, reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger( 'before', 'shutdown', log_writer.stopService) try: nodes = yield runner.start_nodes(reactor, node_count=1) yield perform( make_dispatcher(reactor), install_cli(runner.package_source, nodes[0])) result = yield run_client_tests(reactor=reactor, node=nodes[0]) except: result = 1 raise finally: # Unless the tests failed, and the user asked to keep the nodes, we # delete them. if not (result != 0 and options['keep']): runner.stop_nodes(reactor) elif options['keep']: print "--keep specified, not destroying nodes." raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_file = open("%s.log" % base_path.basename(), "a") log_writer = eliot_logging_service(log_file=log_file, reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger('before', 'shutdown', log_writer.stopService) try: nodes = yield runner.start_nodes(reactor, node_count=1) yield perform(make_dispatcher(reactor), install_cli(runner.package_source, nodes[0])) result = yield run_client_tests(reactor=reactor, node=nodes[0]) except: result = 1 raise finally: # Unless the tests failed, and the user asked to keep the nodes, we # delete them. if not (result != 0 and options['keep']): runner.stop_nodes(reactor) elif options['keep']: print "--keep specified, not destroying nodes." raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ configure_eliot_logging_for_acceptance() options = RunOptions(top_level=top_level) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) sys.stderr.write("\n") sys.stderr.write(str(options)) raise SystemExit(1) # Existing nodes must be described in a managed section # of the configuration. existing_nodes = make_managed_nodes( options['config']['managed']['addresses'], options['distribution'], ) # The following code assumes that one of the managed nodes # is both a control node and an agent node. [control_node] = [ node for node in existing_nodes if node.address == options['control-node'] ] dataset_backend_config_file = save_backend_configuration( options.dataset_backend(), options.dataset_backend_configuration(), ) cluster = Cluster( all_nodes=list(existing_nodes), control_node=control_node, agent_nodes=list(existing_nodes), dataset_backend=options.dataset_backend(), default_volume_size=get_default_volume_size( options.dataset_backend_configuration()), certificates=Certificates(options['cert-directory']), dataset_backend_config_file=dataset_backend_config_file, ) flocker_client = make_client(reactor, cluster) existing_count = len(existing_nodes) yield wait_for_nodes(reactor, flocker_client, existing_count) if options['starting-index'] is None: options['starting-index'] = existing_count print( "Adding {} node(s) to the cluster of {} nodes " "starting at index {}".format( options['number-of-nodes'], existing_count, options['starting-index'], )) runner = options.runner cleanup_id = reactor.addSystemEventTrigger('before', 'shutdown', runner.stop_cluster, reactor) from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service(destination=FileDestination( file=open("%s.log" % (base_path.basename(), ), "a")), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger('before', 'shutdown', log_writer.stopService) control_node = options['control-node'] if options['distribution'] in ('centos-7', ): remote_logs_file = open("remote_logs.log", "a") capture_journal(reactor, control_node, remote_logs_file) elif options['distribution'] in ('ubuntu-14.04', 'ubuntu-15.10'): remote_logs_file = open("remote_logs.log", "a") capture_upstart(reactor, control_node, remote_logs_file) yield runner.ensure_keys(reactor) deferreds = runner.extend_cluster( reactor, cluster, options['number-of-nodes'], options['tag'], options['starting-index'], ) results = yield DeferredList(deferreds) failed_count = 0 for (success, _) in results: if not success: failed_count += 1 if failed_count: print "Failed to create {} nodes, see logs.".format(failed_count) yield wait_for_nodes( reactor, flocker_client, len(cluster.agent_nodes), ) save_managed_config(options['cert-directory'], options['config'], cluster) save_environment(options['cert-directory'], cluster, options.package_source()) reactor.removeSystemEventTrigger(cleanup_id)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service( destination=FileDestination( file=open("%s.log" % (base_path.basename(),), "a") ), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger( 'before', 'shutdown', log_writer.stopService) cluster = None try: yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) if options['distribution'] in ('centos-7',): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_journal(reactor, node.address, remote_logs_file) if not options["no-pull"]: yield perform( make_dispatcher(reactor), parallel([ run_remotely( username='******', address=node.address, commands=task_pull_docker_images() ) for node in cluster.agent_nodes ]), ) result = yield run_tests( reactor=reactor, cluster=cluster, trial_args=options['trial-args']) except: result = 1 raise finally: # Unless the tests failed, and the user asked to keep the nodes, we # delete them. if not options['keep']: runner.stop_cluster(reactor) else: print "--keep specified, not destroying nodes." if cluster is None: print ("Didn't finish creating the cluster.") else: print ("To run acceptance tests against these nodes, " "set the following environment variables: ") environment_variables = get_trial_environment(cluster) for environment_variable in environment_variables: print "export {name}={value};".format( name=environment_variable, value=shell_quote( environment_variables[environment_variable]), ) raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service( destination=FileDestination( file=open("%s.log" % (base_path.basename(),), "a") ), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger( 'before', 'shutdown', log_writer.stopService) cluster = None results = [] setup_succeeded = False reached_finally = False def cluster_cleanup(): if not reached_finally: print "interrupted..." print "stopping cluster" return runner.stop_cluster(reactor) cleanup_trigger_id = reactor.addSystemEventTrigger('before', 'shutdown', cluster_cleanup) try: yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) if options['distribution'] in ('centos-7',): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: results.append(capture_journal(reactor, node.address, remote_logs_file) ) elif options['distribution'] in ('ubuntu-14.04',): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: results.append(capture_upstart(reactor, node.address, remote_logs_file) ) gather_deferreds(results) if not options["no-pull"]: yield perform( make_dispatcher(reactor), parallel([ run_remotely( username='******', address=node.address, commands=task_pull_docker_images() ) for node in cluster.agent_nodes ]), ) setup_succeeded = True result = yield run_tests( reactor=reactor, cluster=cluster, trial_args=options['trial-args']) finally: reached_finally = True # We delete the nodes if the user hasn't asked to keep them # or if we failed to provision the cluster. if not setup_succeeded: print "cluster provisioning failed" elif not options['keep']: print "not keeping cluster" else: print "--keep specified, not destroying nodes." print ("To run acceptance tests against these nodes, " "set the following environment variables: ") environment_variables = get_trial_environment(cluster) for environment_variable in environment_variables: print "export {name}={value};".format( name=environment_variable, value=shell_quote( environment_variables[environment_variable]), ) reactor.removeSystemEventTrigger(cleanup_trigger_id) raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ options = RunOptions(top_level=top_level) configure_eliot_logging_for_acceptance() try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner def cluster_cleanup(): print("stopping cluster") return runner.stop_cluster(reactor) cleanup_trigger_id = reactor.addSystemEventTrigger('before', 'shutdown', cluster_cleanup) from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service(destination=FileDestination( file=open("%s.log" % (base_path.basename(), ), "a")), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger('before', 'shutdown', log_writer.stopService) yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) save_managed_config(options['cert-directory'], options['config'], cluster) managed_config_file = options['cert-directory'].child("managed.yaml") managed_config = create_managed_config(options['config'], cluster) managed_config_file.setContent( yaml.safe_dump(managed_config, default_flow_style=False)) if options['distribution'] in ('centos-7', ): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_journal(reactor, node.address, remote_logs_file).addErrback(write_failure) elif options['distribution'] in ('ubuntu-14.04', ): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_upstart(reactor, node.address, remote_logs_file).addErrback(write_failure) flocker_client = make_client(reactor, cluster) yield wait_for_nodes(reactor, flocker_client, len(cluster.agent_nodes)) if options['no-keep']: print("not keeping cluster") else: save_environment(options['cert-directory'], cluster, options.package_source()) reactor.removeSystemEventTrigger(cleanup_trigger_id)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service( destination=FileDestination( file=open("%s.log" % (base_path.basename(),), "a") ), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger( 'before', 'shutdown', log_writer.stopService) cluster = None results = [] try: yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) if options['distribution'] in ('centos-7',): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: results.append(capture_journal(reactor, node.address, remote_logs_file) ) elif options['distribution'] in ('ubuntu-14.04', 'ubuntu-15.10'): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: results.append(capture_upstart(reactor, node.address, remote_logs_file) ) gather_deferreds(results) if options['apps-per-node'] > 0: config = _build_config(cluster, options['template'], options['apps-per-node']) yield _configure(reactor, cluster, config) result = 0 except BaseException: result = 1 raise finally: if options['no-keep'] or result == 1: runner.stop_cluster(reactor) else: if cluster is None: print("Didn't finish creating the cluster.") runner.stop_cluster(reactor) else: print("The following variables describe the cluster:") environment_variables = get_trial_environment(cluster) for environment_variable in environment_variables: print("export {name}={value};".format( name=environment_variable, value=shell_quote( environment_variables[environment_variable]), )) print("Be sure to preserve the required files.") raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ configure_eliot_logging_for_acceptance() options = RunOptions(top_level=top_level) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) sys.stderr.write("\n") sys.stderr.write(str(options)) raise SystemExit(1) # Existing nodes must be described in a managed section # of the configuration. existing_nodes = make_managed_nodes( options['config']['managed']['addresses'], options['distribution'], ) # The following code assumes that one of the managed nodes # is both a control node and an agent node. [control_node] = [ node for node in existing_nodes if node.address == options['control-node'] ] dataset_backend_config_file = save_backend_configuration( options.dataset_backend(), options.dataset_backend_configuration(), ) cluster = Cluster( all_nodes=list(existing_nodes), control_node=control_node, agent_nodes=list(existing_nodes), dataset_backend=options.dataset_backend(), default_volume_size=get_default_volume_size( options.dataset_backend_configuration() ), certificates=Certificates(options['cert-directory']), dataset_backend_config_file=dataset_backend_config_file, ) flocker_client = make_client(reactor, cluster) existing_count = len(existing_nodes) yield wait_for_nodes(reactor, flocker_client, existing_count) if options['starting-index'] is None: options['starting-index'] = existing_count print( "Adding {} node(s) to the cluster of {} nodes " "starting at index {}".format( options['number-of-nodes'], existing_count, options['starting-index'], ) ) runner = options.runner cleanup_id = reactor.addSystemEventTrigger('before', 'shutdown', runner.stop_cluster, reactor) from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service( destination=FileDestination( file=open("%s.log" % (base_path.basename(),), "a") ), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger( 'before', 'shutdown', log_writer.stopService) control_node = options['control-node'] if options['distribution'] in ('centos-7',): remote_logs_file = open("remote_logs.log", "a") capture_journal(reactor, control_node, remote_logs_file) elif options['distribution'] in ('ubuntu-14.04', 'ubuntu-15.10'): remote_logs_file = open("remote_logs.log", "a") capture_upstart(reactor, control_node, remote_logs_file) yield runner.ensure_keys(reactor) deferreds = runner.extend_cluster( reactor, cluster, options['number-of-nodes'], options['tag'], options['starting-index'], ) results = yield DeferredList(deferreds) failed_count = 0 for (success, value) in results: if not success: failed_count = failed_count + 1 if failed_count: print "Failed to create {} nodes, see logs.".format(failed_count) yield wait_for_nodes( reactor, flocker_client, len(cluster.agent_nodes), ) save_managed_config(options['cert-directory'], options['config'], cluster) save_environment( options['cert-directory'], cluster, options.package_source() ) reactor.removeSystemEventTrigger(cleanup_id)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service(destination=FileDestination( file=open("%s.log" % (base_path.basename(), ), "a")), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger('before', 'shutdown', log_writer.stopService) cluster = None results = [] try: yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) if options['distribution'] in ('centos-7', ): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: results.append( capture_journal(reactor, node.address, remote_logs_file)) elif options['distribution'] in ('ubuntu-14.04', 'ubuntu-15.10'): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: results.append( capture_upstart(reactor, node.address, remote_logs_file)) gather_deferreds(results) if options['apps-per-node'] > 0: config = _build_config(cluster, options['template'], options['apps-per-node']) yield _configure(reactor, cluster, config) result = 0 except BaseException: result = 1 raise finally: if options['no-keep'] or result == 1: runner.stop_cluster(reactor) else: if cluster is None: print("Didn't finish creating the cluster.") runner.stop_cluster(reactor) else: print("The following variables describe the cluster:") environment_variables = get_trial_environment(cluster) for environment_variable in environment_variables: print("export {name}={value};".format( name=environment_variable, value=shell_quote( environment_variables[environment_variable]), )) print("Be sure to preserve the required files.") raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner from flocker.common.script import eliot_logging_service log_file = open("%s.log" % base_path.basename(), "a") log_writer = eliot_logging_service(log_file=log_file, reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger('before', 'shutdown', log_writer.stopService) cluster = None try: cluster = yield runner.start_cluster(reactor) if options['distribution'] in ('centos-7', ): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_journal(reactor, node.address, remote_logs_file) if not options["no-pull"]: yield perform( make_dispatcher(reactor), parallel([ run_remotely(username='******', address=node.address, commands=task_pull_docker_images()) for node in cluster.agent_nodes ]), ) result = yield run_tests(reactor=reactor, cluster=cluster, trial_args=options['trial-args']) except: result = 1 raise finally: # Unless the tests failed, and the user asked to keep the nodes, we # delete them. if not options['keep']: runner.stop_cluster(reactor) else: print "--keep specified, not destroying nodes." if cluster is None: print("Didn't finish creating the cluster.") else: print( "To run acceptance tests against these nodes, " "set the following environment variables: ") environment_variables = get_trial_environment(cluster) for environment_variable in environment_variables: print "export {name}={value};".format( name=environment_variable, value=shell_quote( environment_variables[environment_variable]), ) raise SystemExit(result)
def main(reactor, args, base_path, top_level): """ :param reactor: Reactor to use. :param list args: The arguments passed to the script. :param FilePath base_path: The executable being run. :param FilePath top_level: The top-level of the Flocker repository. """ options = RunOptions(top_level=top_level) add_destination(eliot_output) try: options.parseOptions(args) except UsageError as e: sys.stderr.write("%s: %s\n" % (base_path.basename(), e)) raise SystemExit(1) runner = options.runner def cluster_cleanup(): print("stopping cluster") return runner.stop_cluster(reactor) cleanup_trigger_id = reactor.addSystemEventTrigger('before', 'shutdown', cluster_cleanup) from flocker.common.script import eliot_logging_service log_writer = eliot_logging_service( destination=FileDestination( file=open("%s.log" % (base_path.basename(),), "a") ), reactor=reactor, capture_stdout=False) log_writer.startService() reactor.addSystemEventTrigger( 'before', 'shutdown', log_writer.stopService) yield runner.ensure_keys(reactor) cluster = yield runner.start_cluster(reactor) managed_config_file = options['cert-directory'].child("managed.yaml") managed_config = create_managed_config(options['config'], cluster) managed_config_file.setContent( yaml.safe_dump(managed_config, default_flow_style=False) ) if options['distribution'] in ('centos-7',): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_journal(reactor, node.address, remote_logs_file).addErrback(write_failure) elif options['distribution'] in ('ubuntu-14.04', 'ubuntu-15.10'): remote_logs_file = open("remote_logs.log", "a") for node in cluster.all_nodes: capture_upstart(reactor, node.address, remote_logs_file).addErrback(write_failure) flocker_client = _make_client(reactor, cluster) yield _wait_for_nodes(reactor, flocker_client, len(cluster.agent_nodes)) if options['no-keep']: print("not keeping cluster") else: environment_variables = get_trial_environment(cluster) environment_strings = list() for environment_variable in environment_variables: environment_strings.append( "export {name}={value};\n".format( name=environment_variable, value=shell_quote( environment_variables[environment_variable] ), ) ) environment = ''.join(environment_strings) print("The following variables describe the cluster:") print(environment) env_file = options['cert-directory'].child("environment.env") env_file.setContent(environment) print("The variables are also saved in {}".format( env_file.path )) print("Be sure to preserve the required files.") reactor.removeSystemEventTrigger(cleanup_trigger_id)