<!--
 ! 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>destination_node destination_path</args>
    <daemon>false</daemon>
  </event>
  <event>
    <type>file_create</type>
    <script>file/create_file.sh</script>
    <description>Creates a file on the local file system to a remote node</description>
    <args>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>
