# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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 at
#
#     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.

A. Building & Installing Falcon
===============================

1. Building Falcon
------------------

* git clone https://git-wip-us.apache.org/repos/asf/incubator-falcon.git falcon
* cd falcon
* export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=256m" && mvn clean install

[optionally -Dhadoop.version=<<hadoop.version>> can be appended to build for a specific version of hadoop]
[Falcon has currently not been tested with secure Hadoop / Hadoop 2.0]

Once the build successfully completes, artifacts can be packaged for deployment.
By default the falcon is built for embedded mode.

* mvn clean assembly:assembly -DskipTests

Tar can be found in {project dir}/target/falcon-${project.version}-bin.tar.gz

Tar is structured as follows

|- bin
   |- falcon
   |- falcon-start
   |- falcon-stop
|- conf
   |- startup.properties
   |- runtime.properties
   |- client.properties
   |- log4j.xml
|- src
|- docs
|- client
   |- lib (client support libs)
|- server
   |- webapp
      |- classes (serer support classes)
      |- lib (server support libs)
   |- falcon.war
|- logs (application log files & temp data files)
   |- falcon.pid

2. Installing & running Falcon
------------------------------

a. Installing falcon
~~~~~~~~~~~~~~~~~~~~

* tar -xzvf falcon-${project.version}.tar.gz
* cd falcon-main-${project.version}

b. Starting Falcon Server
~~~~~~~~~~~~~~~~~~~~~~~~~

* bin/falcon-start

c. Using Falcon
~~~~~~~~~~~~~~~

* bin/falcon admin -version
  Falcon server build version: {Version:"0.3-SNAPSHOT-rd7e2be9afa2a5dc96acd1ec9e325f39c6b2f17f7",Mode:"embedded"}

* bin/falcon help
  (for more details about falcon cli usage)

d. Stopping Falcon Server
~~~~~~~~~~~~~~~~~~~~~~~~~

* bin/falcon-stop

3. Preparing oozie bundle for use with Falcon
---------------------------------------------

* cd <<project home>>
* src/bin/pacakge.sh <<hadoop-version>>
  >> ex. src/bin/pacakge.sh 1.1.2 or src/bin/pacakge.sh 0.20.2-cdh3u5
  >> oozie bundle available in target/package/oozie-3.2.0-incubating/distro/target/oozie-3.2.2-distro.tar.gz