# 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.
# Welcome to Bigtop!
 
Bigtop (http://bigtop.apache.org/) is a project for the development of
packaging and tests of the Apache Hadoop (http://hadoop.apache.org/)
ecosystem.
 
The primary goal of Bigtop is to build a community around the
packaging and interoperability testing of Hadoop-related
projects. This includes testing at various levels (packaging,
platform, runtime, upgrade, etc...) developed by a community with a
focus on the system as a whole, rather than individual projects.
 
## Building Bigtop
 
Packages have been built for CentOS/RHEL 5 and 6, Fedora 17,
SuSE Linux Enterprise 11, OpenSUSE12.2, Ubuntu LTS Lucid and Precise,
and Ubuntu Quantal. They can probably be built for other platforms as
well.Some of the binary artifacts might be compatible with other closely
related distributions.
 
Building all of Bigtop requires the following tools:
 
* Java JDK 1.6
* Apache Forrest 0.8
* Apache Ant
* Apache Maven
* git
* subversion
* autoconf
* automake
* liblzo2-dev
* libz-dev
* sharutils
* libfuse-dev
* libssl-dev
 
On Debian-based systems one also needs
 
* build-essential dh-make debhelper devscripts
* reprepro
 
On openSUSE 11.4+, in addition, one also needs to ensure the following is installed:
 
 
relaxngDatatype
docbook-utils docbook-simple
asciidoc
fuse-devel
docbook5
docbook5-xsl-stylesheets
libxml2-devel
xmlformat
xmlto
libxslt
libopenssl-devel
 
## Building packages
 
$ make [component-name]-[rpm|deb]
 
## Building local YUM/APT repositories
 
$ make [component-name]-[yum|apt]
 
## Running the tests
 
WARNING: since testing packages requires installing them on a live
system it is highly recommended to use VMs for that.
 
Testing Bigtop is done using iTest framework. The tests are organized in maven submodules, with
one submodule per bigtop component.
 
The bigtop-tests/test-execution/smokes/pom.xml defines all submodules to be tested, and
each submodule is in its own directory under smokes/, for example:
 
smokes/hadoop/pom.xml
smokes/hive/pom.xml
... and so on.
 
For more documentation on iTest and testing visit Bigtop wiki http://bigtop.apache.org/,
but here's 2 steps to get started:
 
## Running the tests: Installing smoke tests
* To install your iTest test jars locally (i.e. package/hadoop/flume/sqoop/...)
 
#Note: the --offline option should be used, after you have all dependencies, so that you don't
#overwrite your built snapshots with remote snapshots.
mvn install -DskipTests -DskipITs -DperformRelease -f bigtop-tests/test-execution/smokes/package/pom.xml
 
## Running the tests: Running the installed smoke test jars on your cluster
 
* Example 1: To run the iTest testing suite for the "packaging" submodule (i.e. package/hadoop/flume/sqoop/...)
 
mvn clean verify -Dbigtop.repo.file.url.CentOS=XXX -D'org.apache.maven-failsafe-plugin.testInclude=**/TestPackagesReadiness.*' -f bigtop-tests/test-execution/smokes/package/pom.xml
 
 
* Example 2: Running the mapreduce standard smokes - for the "hadoop" submodule, further specifying only those in the hadoop examples jar (like WordCount, Calculate PI, and so on):
 
mvn clean verify -Dbigtop.repo.file.url.CentOS=XXX -D'org.apache.maven-failsafe-plugin.testInclude=**/*TestHadoopExamples*' -f bigtop-tests/test-execution/smokes/package/pom.xml
 
Note: A minor bug/issue is that you need the testInclude regular expression above is needed even if you want to run all tests, because iTest names don't follow the maven integration test naming convention of IT*, but instead, follow the surefire (unit test) convention of Test*.
 
## Contact us!
 
You can get in touch with us on the Bigtop mailing lists (http://bigtop.apache.org/mail-lists.html).
