You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eagle.apache.org by yo...@apache.org on 2016/01/13 02:08:09 UTC

[2/7] incubator-eagle git commit: EAGLE-120 EAGLE-100 initial system and hadoop metric initial system and hadoop metric https://issues.apache.org/jira/browse/EAGLE-120 Author: qingwen220 qingwzhao@ebay.com Reviewer: yonzhang2012 yonzhang2012@apache.org C

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/kafka-python/test/testutil.py
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/kafka-python/test/testutil.py b/eagle-external/hadoop_jmx_collector/lib/kafka-python/test/testutil.py
new file mode 100644
index 0000000..7661cbc
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/kafka-python/test/testutil.py
@@ -0,0 +1,105 @@
+import functools
+import logging
+import os
+import random
+import socket
+import string
+import time
+import uuid
+
+from six.moves import xrange
+from . import unittest
+
+from kafka import KafkaClient
+from kafka.common import OffsetRequest
+
+__all__ = [
+    'random_string',
+    'get_open_port',
+    'kafka_versions',
+    'KafkaIntegrationTestCase',
+    'Timer',
+]
+
+def random_string(l):
+    s = "".join(random.choice(string.ascii_letters) for i in xrange(l))
+    return s.encode('utf-8')
+
+def kafka_versions(*versions):
+    def kafka_versions(func):
+        @functools.wraps(func)
+        def wrapper(self):
+            kafka_version = os.environ.get('KAFKA_VERSION')
+
+            if not kafka_version:
+                self.skipTest("no kafka version specified")
+            elif 'all' not in versions and kafka_version not in versions:
+                self.skipTest("unsupported kafka version")
+
+            return func(self)
+        return wrapper
+    return kafka_versions
+
+def get_open_port():
+    sock = socket.socket()
+    sock.bind(("", 0))
+    port = sock.getsockname()[1]
+    sock.close()
+    return port
+
+class KafkaIntegrationTestCase(unittest.TestCase):
+    create_client = True
+    topic = None
+    server = None
+
+    def setUp(self):
+        super(KafkaIntegrationTestCase, self).setUp()
+        if not os.environ.get('KAFKA_VERSION'):
+            return
+
+        if not self.topic:
+            topic = "%s-%s" % (self.id()[self.id().rindex(".") + 1:], random_string(10).decode('utf-8'))
+            self.topic = topic.encode('utf-8')
+
+        if self.create_client:
+            self.client = KafkaClient('%s:%d' % (self.server.host, self.server.port))
+
+        self.client.ensure_topic_exists(self.topic)
+
+        self._messages = {}
+
+    def tearDown(self):
+        super(KafkaIntegrationTestCase, self).tearDown()
+        if not os.environ.get('KAFKA_VERSION'):
+            return
+
+        if self.create_client:
+            self.client.close()
+
+    def current_offset(self, topic, partition):
+        offsets, = self.client.send_offset_request([ OffsetRequest(topic, partition, -1, 1) ])
+        return offsets.offsets[0]
+
+    def msgs(self, iterable):
+        return [ self.msg(x) for x in iterable ]
+
+    def msg(self, s):
+        if s not in self._messages:
+            self._messages[s] = '%s-%s-%s' % (s, self.id(), str(uuid.uuid4()))
+
+        return self._messages[s].encode('utf-8')
+
+    def key(self, k):
+        return k.encode('utf-8')
+
+
+class Timer(object):
+    def __enter__(self):
+        self.start = time.time()
+        return self
+
+    def __exit__(self, *args):
+        self.end = time.time()
+        self.interval = self.end - self.start
+
+logging.basicConfig(level=logging.DEBUG)

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/kafka-python/tox.ini
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/kafka-python/tox.ini b/eagle-external/hadoop_jmx_collector/lib/kafka-python/tox.ini
new file mode 100644
index 0000000..71565fd
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/kafka-python/tox.ini
@@ -0,0 +1,50 @@
+[tox]
+envlist = lint, py26, py27, pypy, py33, py34, docs
+
+[testenv]
+deps =
+    six
+    unittest2
+    nose
+    nose-timer
+    coverage
+    mock
+    python-snappy
+commands =
+    nosetests {posargs:-v --with-id --id-file={envdir}/.noseids --with-timer --timer-top-n 10 --with-coverage --cover-erase --cover-package kafka}
+setenv =
+    PROJECT_ROOT = {toxinidir}
+
+[testenv:py33]
+deps =
+    nose
+    nose-timer
+    coverage
+    mock
+    python-snappy
+
+[testenv:py34]
+deps =
+    nose
+    nose-timer
+    coverage
+    mock
+    python-snappy
+
+[testenv:lint]
+basepython = python2.7
+deps =
+    unittest2
+    mock
+    pylint
+commands = pylint {posargs: -E kafka test}
+
+[testenv:docs]
+deps =
+    sphinxcontrib-napoleon
+    sphinx_rtd_theme
+    sphinx
+
+commands =
+    sphinx-apidoc -o docs/apidoc/ kafka/
+    sphinx-build -b html docs/ docs/_build

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/kafka-python/travis_selector.sh
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/kafka-python/travis_selector.sh b/eagle-external/hadoop_jmx_collector/lib/kafka-python/travis_selector.sh
new file mode 100755
index 0000000..7a2f45f
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/kafka-python/travis_selector.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# This works with the .travis.yml file to select a python version for testing
+
+if [ $1 == "pypy" ]; then
+    echo "pypy"
+elif [ $1 == "3.4" ]; then
+    echo "py34"
+elif [ $1 == "3.3" ]; then
+    echo "py33"
+elif [ $1 == "2.7" ]; then
+    echo "py27"
+elif [ $1 == "2.6" ]; then
+    echo "py26"
+else
+    echo $1
+fi;

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/.gitignore
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/.gitignore b/eagle-external/hadoop_jmx_collector/lib/six/.gitignore
new file mode 100644
index 0000000..2833e76
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/.gitignore
@@ -0,0 +1,23 @@
+# xcode noise
+build
+*.pbxuser
+*.perspectivev3
+*.mode1v3
+*.xcuserstate
+xcuserdata
+
+# old skool
+.svn
+.cvs
+
+# Python
+*.pyc
+
+# PyCharm
+.idea
+
+# osx noise
+.DS_Store
+
+#compass
+.sass-cache

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/CHANGES
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/CHANGES b/eagle-external/hadoop_jmx_collector/lib/six/CHANGES
new file mode 100644
index 0000000..87315e3
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/CHANGES
@@ -0,0 +1,231 @@
+Changelog for six
+=================
+
+This file lists the changes in each six version.
+
+1.8.0
+-----
+
+- Issue #90: Add six.moves.shlex_quote.
+
+- Issue #59: Add six.moves.intern.
+
+- Add six.urllib.parse.uses_(fragment|netloc|params|query|relative).
+
+- Issue #88: Fix add_metaclass when the class has __slots__ containing
+  "__weakref__" or "__dict__".
+
+- Issue #89: Make six use absolute imports.
+
+- Issue #85: Always accept *updated* and *assigned* arguments for wraps().
+
+- Issue #86: In reraise(), instantiate the exception if the second argument is
+  None.
+
+- Pull request #45: Add six.moves.email_mime_nonmultipart.
+
+- Issue #81: Add six.urllib.request.splittag mapping.
+
+- Issue #80: Add six.urllib.request.splituser mapping.
+
+1.7.3
+-----
+
+- Issue #77: Fix import six on Python 3.4 with a custom loader.
+
+- Issue #74: six.moves.xmlrpc_server should map to SimpleXMLRPCServer on Python
+  2 as documented not xmlrpclib.
+
+1.7.2
+-----
+
+- Issue #72: Fix installing on Python 2.
+
+1.7.1
+-----
+
+- Issue #71: Make the six.moves meta path importer handle reloading of the six
+  module gracefully.
+
+1.7.0
+-----
+
+- Pull request #30: Implement six.moves with a PEP 302 meta path hook.
+
+- Pull request #32: Add six.wraps, which is like functools.wraps but always sets
+  the __wrapped__ attribute.
+
+- Pull request #35: Improve add_metaclass, so that it doesn't end up inserting
+  another class into the hierarchy.
+
+- Pull request #34: Add import mappings for dummy_thread.
+
+- Pull request #33: Add import mappings for UserDict and UserList.
+
+- Pull request #31: Select the implementations of dictionary iterator routines
+  at import time for a 20% speed boost.
+
+1.6.1
+-----
+
+- Raise an AttributeError for six.moves.X when X is a module not available in
+  the current interpreter.
+
+1.6.0
+-----
+
+- Raise an AttributeError for every attribute of unimportable modules.
+
+- Issue #56: Make the fake modules six.moves puts into sys.modules appear not to
+  have a __path__ unless they are loaded.
+
+- Pull request #28: Add support for SplitResult.
+
+- Issue #55: Add move mapping for xmlrpc.server.
+
+- Pull request #29: Add move for urllib.parse.splitquery.
+
+1.5.2
+-----
+
+- Issue #53: Make the fake modules six.moves puts into sys.modules appear not to
+  have a __name__ unless they are loaded.
+
+1.5.1
+-----
+
+- Issue #51: Hack around the Django autoreloader after recent six.moves changes.
+
+1.5.0
+-----
+
+- Removed support for Python 2.4. This is because py.test no longer supports
+  2.4.
+
+- Fix various import problems including issues #19 and #41. six.moves modules
+  are now lazy wrappers over the underlying modules instead of the actual
+  modules themselves.
+
+- Issue #49: Add six.moves mapping for tkinter.ttk.
+
+- Pull request #24: Add __dir__ special method to six.moves modules.
+
+- Issue #47: Fix add_metaclass on classes with a string for the __slots__
+  variable.
+
+- Issue #44: Fix interpretation of backslashes on Python 2 in the u() function.
+
+- Pull request #21: Add import mapping for urllib's proxy_bypass function.
+
+- Issue #43: Add import mapping for the Python 2 xmlrpclib module.
+
+- Issue #39: Add import mapping for the Python 2 thread module.
+
+- Issue #40: Add import mapping for the Python 2 gdbm module.
+
+- Issue #35: On Python versions less than 2.7, print_ now encodes unicode
+  strings when outputing to standard streams. (Python 2.7 handles this
+  automatically.)
+
+1.4.1
+-----
+
+- Issue #32: urllib module wrappings don't work when six is not a toplevel file.
+
+1.4.0
+-----
+
+- Issue #31: Add six.moves mapping for UserString.
+
+- Pull request #12: Add six.add_metaclass, a decorator for adding a metaclass to
+  a class.
+
+- Add six.moves.zip_longest and six.moves.filterfalse, which correspond
+  respectively to itertools.izip_longest and itertools.ifilterfalse on Python 2
+  and itertools.zip_longest and itertools.filterfalse on Python 3.
+
+- Issue #25: Add the unichr function, which returns a string for a Unicode
+  codepoint.
+
+- Issue #26: Add byte2int function, which complements int2byte.
+
+- Add a PY2 constant with obvious semantics.
+
+- Add helpers for indexing and iterating over bytes: iterbytes and indexbytes.
+
+- Add create_bound_method() wrapper.
+
+- Issue #23: Allow multiple base classes to be passed to with_metaclass.
+
+- Issue #24: Add six.moves.range alias. This exactly the same as the current
+  xrange alias.
+
+- Pull request #5: Create six.moves.urllib, which contains abstractions for a
+  bunch of things which are in urllib in Python 3 and spread out across urllib,
+  urllib2, and urlparse in Python 2.
+
+1.3.0
+-----
+
+- Issue #21: Add methods to access the closure and globals of a function.
+
+- In six.iter(items/keys/values/lists), passed keyword arguments through to the
+  underlying method.
+
+- Add six.iterlists().
+
+- Issue #20: Fix tests if tkinter is not available.
+
+- Issue #17: Define callable to be builtin callable when it is available again
+  in Python 3.2+.
+
+- Issue #16: Rename Python 2 exec_'s arguments, so casually calling exec_ with
+  keyword arguments will raise.
+
+- Issue #14: Put the six.moves package in sys.modules based on the name six is
+  imported under.
+
+- Fix Jython detection.
+
+- Pull request #4: Add email_mime_multipart, email_mime_text, and
+  email_mime_base to six.moves.
+
+1.2.0
+-----
+
+- Issue #13: Make iterkeys/itervalues/iteritems return iterators on Python 3
+  instead of iterables.
+
+- Issue #11: Fix maxsize support on Jython.
+
+- Add six.next() as an alias for six.advance_iterator().
+
+- Use the builtin next() function for advance_iterator() where is available
+  (2.6+), not just Python 3.
+
+- Add the Iterator class for writing portable iterators.
+
+1.1.0
+-----
+
+- Add the int2byte function.
+
+- Add compatibility mappings for iterators over the keys, values, and items of a
+  dictionary.
+
+- Fix six.MAXSIZE on platforms where sizeof(long) != sizeof(Py_ssize_t).
+
+- Issue #3: Add six.moves mappings for filter, map, and zip.
+
+1.0.0
+-----
+
+- Issue #2: u() on Python 2.x now resolves unicode escapes.
+
+- Expose an API for adding mappings to six.moves.
+
+1.0 beta 1
+----------
+
+- Reworked six into one .py file.  This breaks imports.  Please tell me if you
+  are interested in an import compatibility layer.

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/CONTRIBUTORS
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/CONTRIBUTORS b/eagle-external/hadoop_jmx_collector/lib/six/CONTRIBUTORS
new file mode 100644
index 0000000..29b0f6a
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/CONTRIBUTORS
@@ -0,0 +1,21 @@
+The primary author and maintainer of six is Benjamin Peterson. He would like to
+acknowledge the following people who submitted bug reports, pull requests, and
+otherwise worked to improve six:
+
+Marc Abramowitz
+Aymeric Augustin
+Ned Batchelder
+Jason R. Coombs
+Julien Danjou
+Ben Darnell
+Ben Davis
+Joshua Harlow
+Anselm Kruis
+Alexander Lukanin
+James Mills
+Sridhar Ratnakumar
+Erik Rose
+Peter Ruibal
+Miroslav Shubernetskiy
+
+If you think you belong on this list, please let me know! --Benjamin

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/LICENSE
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/LICENSE b/eagle-external/hadoop_jmx_collector/lib/six/LICENSE
new file mode 100644
index 0000000..d76e024
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/LICENSE
@@ -0,0 +1,18 @@
+Copyright (c) 2010-2014 Benjamin Peterson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/MANIFEST.in
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/MANIFEST.in b/eagle-external/hadoop_jmx_collector/lib/six/MANIFEST.in
new file mode 100644
index 0000000..b924e06
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/MANIFEST.in
@@ -0,0 +1,6 @@
+include CHANGES
+include LICENSE
+include test_six.py
+
+recursive-include documentation *
+prune documentation/_build

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/README
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/README b/eagle-external/hadoop_jmx_collector/lib/six/README
new file mode 100644
index 0000000..4de73fa
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/README
@@ -0,0 +1,16 @@
+Six is a Python 2 and 3 compatibility library.  It provides utility functions
+for smoothing over the differences between the Python versions with the goal of
+writing Python code that is compatible on both Python versions.  See the
+documentation for more information on what is provided.
+
+Six supports every Python version since 2.5.  It is contained in only one Python
+file, so it can be easily copied into your project. (The copyright and license
+notice must be retained.)
+
+Online documentation is at http://pythonhosted.org/six/.
+
+Bugs can be reported to http://bitbucket.org/gutworth/six.  The code can also be
+found there.
+
+For questions about six or porting in general, email the python-porting mailing
+list: http://mail.python.org/mailman/listinfo/python-porting

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/documentation/Makefile
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/documentation/Makefile b/eagle-external/hadoop_jmx_collector/lib/six/documentation/Makefile
new file mode 100644
index 0000000..eebafcd
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/documentation/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html       to make standalone HTML files"
+	@echo "  dirhtml    to make HTML files named index.html in directories"
+	@echo "  singlehtml to make a single large HTML file"
+	@echo "  pickle     to make pickle files"
+	@echo "  json       to make JSON files"
+	@echo "  htmlhelp   to make HTML files and a HTML help project"
+	@echo "  qthelp     to make HTML files and a qthelp project"
+	@echo "  devhelp    to make HTML files and a Devhelp project"
+	@echo "  epub       to make an epub"
+	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
+	@echo "  text       to make text files"
+	@echo "  man        to make manual pages"
+	@echo "  changes    to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck  to check all external links for integrity"
+	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+	@echo
+	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+	@echo
+	@echo "Build finished; now you can process the pickle files."
+
+json:
+	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+	@echo
+	@echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+	@echo
+	@echo "Build finished; now you can run HTML Help Workshop with the" \
+	      ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+	@echo
+	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
+	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/six.qhcp"
+	@echo "To view the help file:"
+	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/six.qhc"
+
+devhelp:
+	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+	@echo
+	@echo "Build finished."
+	@echo "To view the help file:"
+	@echo "# mkdir -p $$HOME/.local/share/devhelp/six"
+	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/six"
+	@echo "# devhelp"
+
+epub:
+	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+	@echo
+	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make' in that directory to run these through (pdf)latex" \
+	      "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo "Running LaTeX files through pdflatex..."
+	make -C $(BUILDDIR)/latex all-pdf
+	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+	@echo
+	@echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+	@echo
+	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+	@echo
+	@echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/documentation/conf.py
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/documentation/conf.py b/eagle-external/hadoop_jmx_collector/lib/six/documentation/conf.py
new file mode 100644
index 0000000..fd285c7
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/documentation/conf.py
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+#
+# six documentation build configuration file
+
+import os
+import sys
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+needs_sphinx = "1.0"
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ["sphinx.ext.intersphinx"]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# The suffix of source filenames.
+source_suffix = ".rst"
+
+# The encoding of source files.
+#source_encoding = "utf-8-sig"
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = u"six"
+copyright = u"2010-2014, Benjamin Peterson"
+
+sys.path.append(os.path.abspath(os.path.join(".", "..")))
+from six import __version__ as six_version
+sys.path.pop()
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = six_version[:-2]
+# The full version, including alpha/beta/rc tags.
+release = six_version
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ["_build"]
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "sphinx"
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = "default"
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'sixdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ("index", "six.tex", u"six Documentation",
+   u"Benjamin Peterson", "manual"),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ("index", "six", u"six Documentation",
+     [u"Benjamin Peterson"], 1)
+]
+
+# -- Intersphinx ---------------------------------------------------------------
+
+intersphinx_mapping = {"py2" : ("http://docs.python.org/2/", None),
+                       "py3" : ("http://docs.python.org/3/", None)}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/documentation/index.rst
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/documentation/index.rst b/eagle-external/hadoop_jmx_collector/lib/six/documentation/index.rst
new file mode 100644
index 0000000..0adadc2
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/documentation/index.rst
@@ -0,0 +1,757 @@
+Six: Python 2 and 3 Compatibility Library
+=========================================
+
+.. module:: six
+   :synopsis: Python 2 and 3 compatibility
+
+.. moduleauthor:: Benjamin Peterson <be...@python.org>
+.. sectionauthor:: Benjamin Peterson <be...@python.org>
+
+
+Six provides simple utilities for wrapping over differences between Python 2 and
+Python 3.  It is intended to support codebases that work on both Python 2 and 3
+without modification.  six consists of only one Python file, so it is painless
+to copy into a project.
+
+Six can be downloaded on `PyPi <http://pypi.python.org/pypi/six/>`_.  Its bug
+tracker and code hosting is on `BitBucket <http://bitbucket.org/gutworth/six>`_.
+
+The name, "six", comes from the fact that 2*3 equals 6.  Why not addition?
+Multiplication is more powerful, and, anyway, "five" has already been snatched
+away by the Zope Five project.
+
+
+Indices and tables
+------------------
+
+* :ref:`genindex`
+* :ref:`search`
+
+
+Package contents
+----------------
+
+.. data:: PY2
+
+   A boolean indicating if the code is running on Python 2.
+
+.. data:: PY3
+
+   A boolean indicating if the code is running on Python 3.
+
+
+Constants
+>>>>>>>>>
+
+Six provides constants that may differ between Python versions.  Ones ending
+``_types`` are mostly useful as the second argument to ``isinstance`` or
+``issubclass``.
+
+
+.. data:: class_types
+
+   Possible class types.  In Python 2, this encompasses old-style and new-style
+   classes.  In Python 3, this is just new-styles.
+
+
+.. data:: integer_types
+
+   Possible integer types.  In Python 2, this is :func:`py2:long` and
+   :func:`py2:int`, and in Python 3, just :func:`py3:int`.
+
+
+.. data:: string_types
+
+   Possible types for text data.  This is :func:`py2:basestring` in Python 2 and
+   :func:`py3:str` in Python 3.
+
+
+.. data:: text_type
+
+   Type for representing (Unicode) textual data.  This is :func:`py2:unicode` in
+   Python 2 and :func:`py3:str` in Python 3.
+
+
+.. data:: binary_type
+
+   Type for representing binary data.  This is :func:`py2:str` in Python 2 and
+   :func:`py3:bytes` in Python 3.
+
+
+.. data:: MAXSIZE
+
+   The maximum  size of a  container like :func:`py3:list`  or :func:`py3:dict`.
+   This  is  equivalent  to  :data:`py3:sys.maxsize` in  Python  2.6  and  later
+   (including 3.x).   Note, this is temptingly  similar to, but not  the same as
+   :data:`py2:sys.maxint`  in  Python  2.   There is  no  direct  equivalent  to
+   :data:`py2:sys.maxint` in  Python 3  because its integer  type has  no limits
+   aside from memory.
+
+
+Here's example usage of the module::
+
+   import six
+
+   def dispatch_types(value):
+       if isinstance(value, six.integer_types):
+           handle_integer(value)
+       elif isinstance(value, six.class_types):
+           handle_class(value)
+       elif isinstance(value, six.string_types):
+           handle_string(value)
+
+
+Object model compatibility
+>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+Python 3 renamed the attributes of several intepreter data structures.  The
+following accessors are available.  Note that the recommended way to inspect
+functions and methods is the stdlib :mod:`py3:inspect` module.
+
+
+.. function:: get_unbound_function(meth)
+
+   Get the function out of unbound method *meth*.  In Python 3, unbound methods
+   don't exist, so this function just returns *meth* unchanged.  Example
+   usage::
+
+      from six import get_unbound_function
+
+      class X(object):
+          def method(self):
+              pass
+      method_function = get_unbound_function(X.method)
+
+
+.. function:: get_method_function(meth)
+
+   Get the function out of method object *meth*.
+
+
+.. function:: get_method_self(meth)
+
+   Get the ``self`` of bound method *meth*.
+
+
+.. function:: get_function_closure(func)
+
+   Get the closure (list of cells) associated with *func*.  This is equivalent
+   to ``func.__closure__`` on Python 2.6+ and ``func.func_closure`` on Python
+   2.5.
+
+
+.. function:: get_function_code(func)
+
+   Get the code object associated with *func*.  This is equivalent to
+   ``func.__code__`` on Python 2.6+ and ``func.func_code`` on Python 2.5.
+
+
+.. function:: get_function_defaults(func)
+
+   Get the defaults tuple associated with *func*.  This is equivalent to
+   ``func.__defaults__`` on Python 2.6+ and ``func.func_defaults`` on Python
+   2.5.
+
+
+.. function:: get_function_globals(func)
+
+   Get the globals of *func*.  This is equivalent to ``func.__globals__`` on
+   Python 2.6+ and ``func.func_globals`` on Python 2.5.
+
+
+.. function:: next(it)
+.. function:: advance_iterator(it)
+
+   Get the next item of iterator *it*.  :exc:`py3:StopIteration` is raised if
+   the iterator is exhausted.  This is a replacement for calling ``it.next()``
+   in Python 2 and ``next(it)`` in Python 3.
+
+
+.. function:: callable(obj)
+
+   Check if *obj* can be called.  Note ``callable`` has returned in Python 3.2,
+   so using six's version is only necessary when supporting Python 3.0 or 3.1.
+
+
+.. function:: iterkeys(dictionary, **kwargs)
+
+   Returns an iterator over *dictionary*\'s keys. This replaces
+   ``dictionary.iterkeys()`` on Python 2 and ``dictionary.keys()`` on
+   Python 3.  *kwargs* are passed through to the underlying method.
+
+
+.. function:: itervalues(dictionary, **kwargs)
+
+   Returns an iterator over *dictionary*\'s values. This replaces
+   ``dictionary.itervalues()`` on Python 2 and ``dictionary.values()`` on
+   Python 3.  *kwargs* are passed through to the underlying method.
+
+
+.. function:: iteritems(dictionary, **kwargs)
+
+   Returns an iterator over *dictionary*\'s items. This replaces
+   ``dictionary.iteritems()`` on Python 2 and ``dictionary.items()`` on
+   Python 3.  *kwargs* are passed through to the underlying method.
+
+
+.. function:: iterlists(dictionary, **kwargs)
+
+   Calls ``dictionary.iterlists()`` on Python 2 and ``dictionary.lists()`` on
+   Python 3.  No builtin Python mapping type has such a method; this method is
+   intended for use with multi-valued dictionaries like `Werkzeug's
+   <http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.MultiDict>`_.
+   *kwargs* are passed through to the underlying method.
+
+
+.. function:: create_bound_method(func, obj)
+
+   Return a method object wrapping *func* and bound to *obj*.  On both Python 2
+   and 3, this will return a :func:`py3:types.MethodType` object.  The reason
+   this wrapper exists is that on Python 2, the ``MethodType`` constructor
+   requires the *obj*'s class to be passed.
+
+
+.. class:: Iterator
+
+   A class for making portable iterators. The intention is that it be subclassed
+   and subclasses provide a ``__next__`` method. In Python 2, :class:`Iterator`
+   has one method: ``next``. It simply delegates to ``__next__``. An alternate
+   way to do this would be to simply alias ``next`` to ``__next__``. However,
+   this interacts badly with subclasses that override
+   ``__next__``. :class:`Iterator` is empty on Python 3. (In fact, it is just
+   aliased to :class:`py3:object`.)
+
+
+.. function:: wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES)
+
+   This is exactly the :func:`py3:functools.wraps` decorator, but it sets the
+   ``__wrapped__`` attribute on what it decorates as :func:`py3:functools.wraps`
+   does on Python versions after 3.2.
+
+
+Syntax compatibility
+>>>>>>>>>>>>>>>>>>>>
+
+These functions smooth over operations which have different syntaxes between
+Python 2 and 3.
+
+
+.. function:: exec_(code, globals=None, locals=None)
+
+   Execute *code* in the scope of *globals* and *locals*.  *code* can be a
+   string or a code object.  If *globals* or *locals* are not given, they will
+   default to the scope of the caller.  If just *globals* is given, it will also
+   be used as *locals*.
+
+   .. note::
+
+      Python 3's :func:`py3:exec` doesn't take keyword arguments, so calling
+      :func:`exec` with them should be avoided.
+
+
+.. function:: print_(*args, *, file=sys.stdout, end="\\n", sep=" ")
+
+   Print *args* into *file*.  Each argument will be separated with *sep* and
+   *end* will be written to the file after the last argument is printed.
+
+   .. note::
+
+      In Python 2, this function imitates Python 3's :func:`py3:print` by not
+      having softspace support.  If you don't know what that is, you're probably
+      ok. :)
+
+
+.. function:: reraise(exc_type, exc_value, exc_traceback=None)
+
+   Reraise an exception, possibly with a different traceback.  In the simple
+   case, ``reraise(*sys.exc_info())`` with an active exception (in an except
+   block) reraises the current exception with the last traceback.  A different
+   traceback can be specified with the *exc_traceback* parameter.  Note that
+   since the exception reraising is done within the :func:`reraise` function,
+   Python will attach the call frame of :func:`reraise` to whatever traceback is
+   raised.
+
+
+.. function:: with_metaclass(metaclass, *bases)
+
+   Create a new class with base classes *bases* and metaclass *metaclass*.  This
+   is designed to be used in class declarations like this: ::
+
+      from six import with_metaclass
+
+      class Meta(type):
+          pass
+
+      class Base(object):
+          pass
+
+      class MyClass(with_metaclass(Meta, Base)):
+          pass
+
+   Another way to set a metaclass on a class is with the :func:`add_metaclass`
+   decorator.
+
+
+.. function:: add_metaclass(metaclass)
+
+   Class decorator that replaces a normally-constructed class with a
+   metaclass-constructed one.  Example usage: ::
+
+       @add_metaclass(Meta)
+       class MyClass(object):
+           pass
+
+   That code produces a class equivalent to ::
+
+       class MyClass(object, metaclass=Meta):
+           pass
+
+   on Python 3 or ::
+
+       class MyClass(object):
+           __metaclass__ = MyMeta
+
+   on Python 2.
+
+   Note that class decorators require Python 2.6. However, the effect of the
+   decorator can be emulated on Python 2.5 like so::
+
+       class MyClass(object):
+           pass
+       MyClass = add_metaclass(Meta)(MyClass)
+
+
+Binary and text data
+>>>>>>>>>>>>>>>>>>>>
+
+Python 3 enforces the distinction between byte strings and text strings far more
+rigoriously than Python 2 does; binary data cannot be automatically coerced to
+or from text data.  six provides several functions to assist in classifying
+string data in all Python versions.
+
+
+.. function:: b(data)
+
+   A "fake" bytes literal.  *data* should always be a normal string literal.  In
+   Python 2, :func:`b` returns a 8-bit string.  In Python 3, *data* is encoded
+   with the latin-1 encoding to bytes.
+
+
+   .. note::
+
+      Since all Python versions 2.6 and after support the ``b`` prefix,
+      :func:`b`, code without 2.5 support doesn't need :func:`b`.
+
+
+.. function:: u(text)
+
+   A "fake" unicode literal.  *text* should always be a normal string literal.
+   In Python 2, :func:`u` returns unicode, and in Python 3, a string.  Also, in
+   Python 2, the string is decoded with the ``unicode-escape`` codec, which
+   allows unicode escapes to be used in it.
+
+
+   .. note::
+
+      In Python 3.3, the ``u`` prefix has been reintroduced. Code that only
+      supports Python 3 versions greater than 3.3 thus does not need
+      :func:`u`.
+
+   .. note::
+
+      On Python 2, :func:`u` doesn't know what the encoding of the literal
+      is. Each byte is converted directly to the unicode codepoint of the same
+      value. Because of this, it's only safe to use :func:`u` with strings of
+      ASCII data.
+
+
+.. function:: unichr(c)
+
+   Return the (Unicode) string representing the codepoint *c*.  This is
+   equivalent to :func:`py2:unichr` on Python 2 and :func:`py3:chr` on Python 3.
+
+
+.. function:: int2byte(i)
+
+   Converts *i* to a byte.  *i* must be in ``range(0, 256)``.  This is
+   equivalent to :func:`py2:chr` in Python 2 and ``bytes((i,))`` in Python 3.
+
+
+.. function:: byte2int(bs)
+
+   Converts the first byte of *bs* to an integer.  This is equivalent to
+   ``ord(bs[0])`` on Python 2 and ``bs[0]`` on Python 3.
+
+
+.. function:: indexbytes(buf, i)
+
+   Return the byte at index *i* of *buf* as an integer.  This is equivalent to
+   indexing a bytes object in Python 3.
+
+
+.. function:: iterbytes(buf)
+
+   Return an iterator over bytes in *buf* as integers.  This is equivalent to
+   a bytes object iterator in Python 3.
+
+
+.. data:: StringIO
+
+   This is an fake file object for textual data.  It's an alias for
+   :class:`py2:StringIO.StringIO` in Python 2 and :class:`py3:io.StringIO` in
+   Python 3.
+
+
+.. data:: BytesIO
+
+   This is a fake file object for binary data.  In Python 2, it's an alias for
+   :class:`py2:StringIO.StringIO`, but in Python 3, it's an alias for
+   :class:`py3:io.BytesIO`.
+
+
+Renamed modules and attributes compatibility
+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+.. module:: six.moves
+   :synopsis: Renamed modules and attributes compatibility
+
+Python 3 reorganized the standard library and moved several functions to
+different modules.  Six provides a consistent interface to them through the fake
+:mod:`six.moves` module.  For example, to load the module for parsing HTML on
+Python 2 or 3, write::
+
+   from six.moves import html_parser
+
+Similarly, to get the function to reload modules, which was moved from the
+builtin module to the ``imp`` module, use::
+
+   from six.moves import reload_module
+
+For the most part, :mod:`six.moves` aliases are the names of the modules in
+Python 3.  When the new Python 3 name is a package, the components of the name
+are separated by underscores.  For example, ``html.parser`` becomes
+``html_parser``.  In some cases where several modules have been combined, the
+Python 2 name is retained.  This is so the appropiate modules can be found when
+running on Python 2.  For example, ``BaseHTTPServer`` which is in
+``http.server`` in Python 3 is aliased as ``BaseHTTPServer``.
+
+Some modules which had two implementations have been merged in Python 3.  For
+example, ``cPickle`` no longer exists in Python 3; it was merged with
+``pickle``.  In these cases, fetching the fast version will load the fast one on
+Python 2 and the merged module in Python 3.
+
+The :mod:`py2:urllib`, :mod:`py2:urllib2`, and :mod:`py2:urlparse` modules have
+been combined in the :mod:`py3:urllib` package in Python 3.  The
+:mod:`six.moves.urllib` package is a version-independent location for this
+functionality; its structure mimics the structure of the Python 3
+:mod:`py3:urllib` package.
+
+.. note::
+
+   In order to make imports of the form::
+
+     from six.moves.cPickle import loads
+
+   work, six places special proxy objects in in :data:`py3:sys.modules`. These
+   proxies lazily load the underlying module when an attribute is fetched. This
+   will fail if the underlying module is not available in the Python
+   interpreter. For example, ``sys.modules["six.moves.winreg"].LoadKey`` would
+   fail on any non-Windows platform. Unfortunately, some applications try to
+   load attributes on every module in :data:`py3:sys.modules`. six mitigates
+   this problem for some applications by pretending attributes on unimportable
+   modules don't exist. This hack doesn't work in every case, though. If you are
+   encountering problems with the lazy modules and don't use any from imports
+   directly from ``six.moves`` modules, you can workaround the issue by removing
+   the six proxy modules::
+
+     d = [name for name in sys.modules if name.startswith("six.moves.")]
+     for name in d:
+         del sys.modules[name]
+
+Supported renames:
+
++------------------------------+-------------------------------------+-------------------------------------+
+| Name                         | Python 2 name                       | Python 3 name                       |
++==============================+=====================================+=====================================+
+| ``builtins``                 | :mod:`py2:__builtin__`              | :mod:`py3:builtins`                 |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``configparser``             | :mod:`py2:ConfigParser`             | :mod:`py3:configparser`             |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``copyreg``                  | :mod:`py2:copy_reg`                 | :mod:`py3:copyreg`                  |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``cPickle``                  | :mod:`py2:cPickle`                  | :mod:`py3:pickle`                   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``cStringIO``                | :func:`py2:cStringIO.StringIO`      | :class:`py3:io.StringIO`            |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``dbm_gnu``                  | :func:`py2:gdbm`                    | :class:`py3:dbm.gnu`                |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``_dummy_thread``            | :mod:`py2:dummy_thread`             | :mod:`py3:_dummy_thread`            |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``email_mime_multipart``     | :mod:`py2:email.MIMEMultipart`      | :mod:`py3:email.mime.multipart`     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``email_mime_nonmultipart``  | :mod:`py2:email.MIMENonMultipart`   | :mod:`py3:email.mime.nonmultipart`  |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``email_mime_text``          | :mod:`py2:email.MIMEText`           | :mod:`py3:email.mime.text`          |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``email_mime_base``          | :mod:`py2:email.MIMEBase`           | :mod:`py3:email.mime.base`          |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``filter``                   | :func:`py2:itertools.ifilter`       | :func:`py3:filter`                  |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``filterfalse``              | :func:`py2:itertools.ifilterfalse`  | :func:`py3:itertools.filterfalse`   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``http_cookiejar``           | :mod:`py2:cookielib`                | :mod:`py3:http.cookiejar`           |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``http_cookies``             | :mod:`py2:Cookie`                   | :mod:`py3:http.cookies`             |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``html_entities``            | :mod:`py2:htmlentitydefs`           | :mod:`py3:html.entities`            |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``html_parser``              | :mod:`py2:HTMLParser`               | :mod:`py3:html.parser`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``http_client``              | :mod:`py2:httplib`                  | :mod:`py3:http.client`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``BaseHTTPServer``           | :mod:`py2:BaseHTTPServer`           | :mod:`py3:http.server`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``CGIHTTPServer``            | :mod:`py2:CGIHTTPServer`            | :mod:`py3:http.server`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``SimpleHTTPServer``         | :mod:`py2:SimpleHTTPServer`         | :mod:`py3:http.server`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``input``                    | :func:`py2:raw_input`               | :func:`py3:input`                   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``intern``                   | :func:`py2:intern`                  | :func:`py3:sys.intern`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``map``                      | :func:`py2:itertools.imap`          | :func:`py3:map`                     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``queue``                    | :mod:`py2:Queue`                    | :mod:`py3:queue`                    |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``range``                    | :func:`py2:xrange`                  | :func:`py3:range`                   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``reduce``                   | :func:`py2:reduce`                  | :func:`py3:functools.reduce`        |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``reload_module``            | :func:`py2:reload`                  | :func:`py3:imp.reload`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``reprlib``                  | :mod:`py2:repr`                     | :mod:`py3:reprlib`                  |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``shlex_quote``              | :mod:`py2:pipes.quote`              | :mod:`py3:shlex.quote`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``socketserver``             | :mod:`py2:SocketServer`             | :mod:`py3:socketserver`             |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``_thread``                  | :mod:`py2:thread`                   | :mod:`py3:_thread`                  |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter``                  | :mod:`py2:Tkinter`                  | :mod:`py3:tkinter`                  |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_dialog``           | :mod:`py2:Dialog`                   | :mod:`py3:tkinter.dialog`           |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_filedialog``       | :mod:`py2:FileDialog`               | :mod:`py3:tkinter.FileDialog`       |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_scrolledtext``     | :mod:`py2:ScrolledText`             | :mod:`py3:tkinter.scrolledtext`     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_simpledialog``     | :mod:`py2:SimpleDialog`             | :mod:`py3:tkinter.simpledialog`     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_ttk``              | :mod:`py2:ttk`                      | :mod:`py3:tkinter.ttk`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_tix``              | :mod:`py2:Tix`                      | :mod:`py3:tkinter.tix`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_constants``        | :mod:`py2:Tkconstants`              | :mod:`py3:tkinter.constants`        |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_dnd``              | :mod:`py2:Tkdnd`                    | :mod:`py3:tkinter.dnd`              |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_colorchooser``     | :mod:`py2:tkColorChooser`           | :mod:`py3:tkinter.colorchooser`     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_commondialog``     | :mod:`py2:tkCommonDialog`           | :mod:`py3:tkinter.commondialog`     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_tkfiledialog``     | :mod:`py2:tkFileDialog`             | :mod:`py3:tkinter.filedialog`       |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_font``             | :mod:`py2:tkFont`                   | :mod:`py3:tkinter.font`             |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_messagebox``       | :mod:`py2:tkMessageBox`             | :mod:`py3:tkinter.messagebox`       |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``tkinter_tksimpledialog``   | :mod:`py2:tkSimpleDialog`           | :mod:`py3:tkinter.simpledialog`     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``urllib.parse``             | See :mod:`six.moves.urllib.parse`   | :mod:`py3:urllib.parse`             |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``urllib.error``             | See :mod:`six.moves.urllib.error`   | :mod:`py3:urllib.error`             |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``urllib.request``           | See :mod:`six.moves.urllib.request` | :mod:`py3:urllib.request`           |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``urllib.response``          | See :mod:`six.moves.urllib.response`| :mod:`py3:urllib.response`          |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``urllib.robotparser``       | :mod:`py2:robotparser`              | :mod:`py3:urllib.robotparser`       |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``urllib_robotparser``       | :mod:`py2:robotparser`              | :mod:`py3:urllib.robotparser`       |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``UserDict``                 | :class:`py2:UserDict.UserDict`      | :class:`py3:collections.UserDict`   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``UserList``                 | :class:`py2:UserList.UserList`      | :class:`py3:collections.UserList`   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``UserString``               | :class:`py2:UserString.UserString`  | :class:`py3:collections.UserString` |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``winreg``                   | :mod:`py2:_winreg`                  | :mod:`py3:winreg`                   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``xmlrpc_client``            | :mod:`py2:xmlrpclib`                | :mod:`py3:xmlrpc.client`            |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``xmlrpc_server``            | :mod:`py2:SimpleXMLRPCServer`       | :mod:`py3:xmlrpc.server`            |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``xrange``                   | :func:`py2:xrange`                  | :func:`py3:range`                   |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``zip``                      | :func:`py2:itertools.izip`          | :func:`py3:zip`                     |
++------------------------------+-------------------------------------+-------------------------------------+
+| ``zip_longest``              | :func:`py2:itertools.izip_longest`  | :func:`py3:itertools.zip_longest`   |
++------------------------------+-------------------------------------+-------------------------------------+
+
+urllib parse
+<<<<<<<<<<<<
+
+.. module:: six.moves.urllib.parse
+   :synopsis: Stuff from :mod:`py2:urlparse` and :mod:`py2:urllib` in Python 2 and :mod:`py3:urllib.parse` in Python 3
+
+Contains functions from Python 3's :mod:`py3:urllib.parse` and Python 2's:
+
+:mod:`py2:urlparse`:
+
+* :func:`py2:urlparse.ParseResult`
+* :func:`py2:urlparse.SplitResult`
+* :func:`py2:urlparse.urlparse`
+* :func:`py2:urlparse.urlunparse`
+* :func:`py2:urlparse.parse_qs`
+* :func:`py2:urlparse.parse_qsl`
+* :func:`py2:urlparse.urljoin`
+* :func:`py2:urlparse.urldefrag`
+* :func:`py2:urlparse.urlsplit`
+* :func:`py2:urlparse.urlunsplit`
+* :func:`py2:urlparse.splitquery`
+* :func:`py2:urlparse.uses_fragment`
+* :func:`py2:urlparse.uses_netloc`
+* :func:`py2:urlparse.uses_params`
+* :func:`py2:urlparse.uses_query`
+* :func:`py2:urlparse.uses_relative`
+
+and :mod:`py2:urllib`:
+
+* :func:`py2:urllib.quote`
+* :func:`py2:urllib.quote_plus`
+* :func:`py2:urllib.splittag`
+* :func:`py2:urllib.splituser`
+* :func:`py2:urllib.unquote`
+* :func:`py2:urllib.unquote_plus`
+* :func:`py2:urllib.urlencode`
+
+
+urllib error
+<<<<<<<<<<<<
+
+.. module:: six.moves.urllib.error
+   :synopsis: Stuff from :mod:`py2:urllib` and :mod:`py2:urllib2` in Python 2 and :mod:`py3:urllib.error` in Python 3
+
+Contains exceptions from Python 3's :mod:`py3:urllib.error` and Python 2's:
+
+:mod:`py2:urllib`:
+
+* :exc:`py2:urllib.ContentTooShortError`
+
+and :mod:`py2:urllib2`:
+
+* :exc:`py2:urllib2.URLError`
+* :exc:`py2:urllib2.HTTPError`
+
+
+urllib request
+<<<<<<<<<<<<<<
+
+.. module:: six.moves.urllib.request
+   :synopsis: Stuff from :mod:`py2:urllib` and :mod:`py2:urllib2` in Python 2 and :mod:`py3:urllib.request` in Python 3
+
+Contains items from Python 3's :mod:`py3:urllib.request` and Python 2's:
+
+:mod:`py2:urllib`:
+
+* :func:`py2:urllib.pathname2url`
+* :func:`py2:urllib.url2pathname`
+* :func:`py2:urllib.getproxies`
+* :func:`py2:urllib.urlretrieve`
+* :func:`py2:urllib.urlcleanup`
+* :class:`py2:urllib.URLopener`
+* :class:`py2:urllib.FancyURLopener`
+* :func:`py2:urllib.proxy_bypass`
+
+and :mod:`py2:urllib2`:
+
+* :func:`py2:urllib2.urlopen`
+* :func:`py2:urllib2.install_opener`
+* :func:`py2:urllib2.build_opener`
+* :class:`py2:urllib2.Request`
+* :class:`py2:urllib2.OpenerDirector`
+* :class:`py2:urllib2.HTTPDefaultErrorHandler`
+* :class:`py2:urllib2.HTTPRedirectHandler`
+* :class:`py2:urllib2.HTTPCookieProcessor`
+* :class:`py2:urllib2.ProxyHandler`
+* :class:`py2:urllib2.BaseHandler`
+* :class:`py2:urllib2.HTTPPasswordMgr`
+* :class:`py2:urllib2.HTTPPasswordMgrWithDefaultRealm`
+* :class:`py2:urllib2.AbstractBasicAuthHandler`
+* :class:`py2:urllib2.HTTPBasicAuthHandler`
+* :class:`py2:urllib2.ProxyBasicAuthHandler`
+* :class:`py2:urllib2.AbstractDigestAuthHandler`
+* :class:`py2:urllib2.HTTPDigestAuthHandler`
+* :class:`py2:urllib2.ProxyDigestAuthHandler`
+* :class:`py2:urllib2.HTTPHandler`
+* :class:`py2:urllib2.HTTPSHandler`
+* :class:`py2:urllib2.FileHandler`
+* :class:`py2:urllib2.FTPHandler`
+* :class:`py2:urllib2.CacheFTPHandler`
+* :class:`py2:urllib2.UnknownHandler`
+* :class:`py2:urllib2.HTTPErrorProcessor`
+
+
+urllib response
+<<<<<<<<<<<<<<<
+
+.. module:: six.moves.urllib.response
+   :synopsis: Stuff from :mod:`py2:urllib` in Python 2 and :mod:`py3:urllib.response` in Python 3
+
+Contains classes from Python 3's :mod:`py3:urllib.response` and Python 2's:
+
+:mod:`py2:urllib`:
+
+* :class:`py2:urllib.addbase`
+* :class:`py2:urllib.addclosehook`
+* :class:`py2:urllib.addinfo`
+* :class:`py2:urllib.addinfourl`
+
+
+Advanced - Customizing renames
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+.. currentmodule:: six
+
+It is possible to add additional names to the :mod:`six.moves` namespace.
+
+
+.. function:: add_move(item)
+
+   Add *item* to the :mod:`six.moves` mapping.  *item* should be a
+   :class:`MovedAttribute` or :class:`MovedModule` instance.
+
+
+.. function:: remove_move(name)
+
+   Remove the :mod:`six.moves` mapping called *name*.  *name* should be a
+   string.
+
+
+Instances of the following classes can be passed to :func:`add_move`.  Neither
+have any public members.
+
+
+.. class:: MovedModule(name, old_mod, new_mod)
+
+   Create a mapping for :mod:`six.moves` called *name* that references different
+   modules in Python 2 and 3.  *old_mod* is the name of the Python 2 module.
+   *new_mod* is the name of the Python 3 module.
+
+
+.. class:: MovedAttribute(name, old_mod, new_mod, old_attr=None, new_attr=None)
+
+   Create a mapping for :mod:`six.moves` called *name* that references different
+   attributes in Python 2 and 3.  *old_mod* is the name of the Python 2 module.
+   *new_mod* is the name of the Python 3 module.  If *new_attr* is not given, it
+   defaults to *old_attr*.  If neither is given, they both default to *name*.

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/setup.cfg
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/setup.cfg b/eagle-external/hadoop_jmx_collector/lib/six/setup.cfg
new file mode 100644
index 0000000..5e40900
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/setup.cfg
@@ -0,0 +1,2 @@
+[wheel]
+universal = 1

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/db2bbf91/eagle-external/hadoop_jmx_collector/lib/six/setup.py
----------------------------------------------------------------------
diff --git a/eagle-external/hadoop_jmx_collector/lib/six/setup.py b/eagle-external/hadoop_jmx_collector/lib/six/setup.py
new file mode 100644
index 0000000..b0cca52
--- /dev/null
+++ b/eagle-external/hadoop_jmx_collector/lib/six/setup.py
@@ -0,0 +1,32 @@
+from __future__ import with_statement
+
+try:
+    from setuptools import setup
+except ImportError:
+    from distutils.core import setup
+
+import six
+
+six_classifiers = [
+    "Programming Language :: Python :: 2",
+    "Programming Language :: Python :: 3",
+    "Intended Audience :: Developers",
+    "License :: OSI Approved :: MIT License",
+    "Topic :: Software Development :: Libraries",
+    "Topic :: Utilities",
+]
+
+with open("README", "r") as fp:
+    six_long_description = fp.read()
+
+setup(name="six",
+      version=six.__version__,
+      author="Benjamin Peterson",
+      author_email="benjamin@python.org",
+      url="http://pypi.python.org/pypi/six/",
+      py_modules=["six"],
+      description="Python 2 and 3 compatibility utilities",
+      long_description=six_long_description,
+      license="MIT",
+      classifiers=six_classifiers
+      )