<!--
 ! Copyright 2009-2013 by The Regents of the University of California
 ! Licensed under the Apache License, Version 2.0 (the "License");
 ! you may not use this file except in compliance with the License.
 ! you may obtain a copy of the License from
 ! 
 !     http://www.apache.org/licenses/LICENSE-2.0
 ! 
 ! Unless required by applicable law or agreed to in writing, software
 ! distributed under the License is distributed on an "AS IS" BASIS,
 ! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ! See the License for the specific language governing permissions and
 ! limitations under the License.
 !-->
<events xmlns="events">
  <event>
    <type>node_join</type>
    <script>node_join/nc_join.sh</script>
    <description>Creates a NodeController process at a specified location.</description>
    <args>location_of_cc location(hostname/ip_address) node_controller_id</args>
    <daemon>true</daemon>
  </event>
  <event>
    <type>node_failure</type>
    <script>node_failure/nc_failure.sh</script>
    <description>Kills a NodeController process at a specified location.</description>
    <args>node_controller_id</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>cc_start</type>
    <script>cc_start/cc_start.sh</script>
    <description>Starts a  ClusterController process at a specified location.</description>
    <args></args>
    <daemon>true</daemon>
  </event>
  <event>
    <type>cc_failure</type>
    <script>cc_failure/cc_failure.sh</script>
    <description>Kills the Cluster Controller process running at a specified location.</description>
    <args></args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>node_restart</type>
    <script>node_restart/nc_restart.sh</script>
    <description>Shuts and restarts a NodeControllerProcess after a specified time interval, at a specified location</description>
    <args>address of cc, node controller id and sleep interval(seconds)</args>
    <daemon>true</daemon>
  </event>
  <event>
    <type>asterix_deploy</type>
    <script>asterix_deploy/asterix_deploy.sh</script>
    <description>Deploys Asterix application on a cluster running hyracks</description>
    <args>IP address of the node running the hyracks cluster controller</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>zookeeper_start</type>
    <script>zookeeper/start.sh</script>
    <description>Launches ZooKeeper server process</description>
    <args>IP address of the ZooKeeper server</args>
    <daemon>true</daemon>
  </event>
  <event>
    <type>zookeeper_stop</type>
    <script>zookeeper/stop.sh</script>
    <description>Terminates ZooKeeper server process</description>
    <args>IP address of the ZooKeeper server</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>file_transfer</type>
    <script>file/transfer.sh</script>
    <description>Copies a file on the local file system to a remote node</description>
    <args>local_source_path destination_node destination_path</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>directory_transfer</type>
    <script>file/dir_transfer.sh</script>
    <description>Copies a directory (and its contents) on the local file system to a remote node</description>
    <args>local_source_path destination_node destination_path</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>directory_copy</type>
    <script>file/dir_copy.sh</script>
    <description>Copies a directory (and its contents) from the remove file system to the local file system</description>
    <args>destination_node destination_path local_source_path</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>file_delete</type>
    <script>file/delete.sh</script>
    <description>Deletes a file on the local file system to a remote node</description>
    <args>local_source_path destination_node destination_path</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>backup</type>
    <script>backup/backup.sh</script>
    <description>Takes a backup of an Asterix instance</description>
    <args>Asterix_data_dir HDFSurl</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>restore</type>
    <script>restore/restore.sh</script>
    <description>Restores an Asterix instance from a back up</description>
    <args>Asterix_data_dir HDFSurl</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>hdfs_delete</type>
    <script>hdfs/delete.sh</script>
    <description>Deletes an HDFS path</description>
    <args>WorkingDir HadoopVersion HDFSUrl Path_to_Delete</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>node_info</type>
    <script>node_info/node_info.sh</script>
    <description>Retrieved environment information for a node</description>
    <daemon>false</daemon>
  </event>
</events>
