Amazon S3 Driver : Proof of Concept
* Rollback to the real Proof of Concept original version instead of the broken multipart one
* Modification to pass flake8 build
* New version of S3 driver : added manifest.json

* Making the changes to match the new way to handle the Plug

* Added some exception catches and documentation
* Refactoring of the start function

* Added the get_conn function
* Moved some error handling code.
  It didn't try to catch exceptions at the right place.

* The get_bucket function now takes a boolean arg, allowing
  to ask it to only check the bucket's existence without trying
  to fetch contents (it is faster).

* New get_file function that raises ServiceError if file is not found
  on S3. Better than to try and raise in the several functions that do it

* Now handling some S3 read timeout errors by raising TryAgain exceptions.

* Encountered a socket.error exception raised by boto in the check changes thread
  when connection reset by peer.  Handling it by trying a reconnection

* Moving from concatenated strings with '+' to str.format()
* Fix flake8
Return of the multipart upload approach.

* Get rid of the global variables as it wasn't thread-safe

* Add helper functions get_file_timestamp and get_file

* Add the set_chunk_size handler, as S3 requires parts of at least 5 MB

* Add some documentation, or modify existing one

* The bucket polling thread now checks for and skips the files that are
  currently being uploaded. This used to cause transfer problems.
Add the tests of s3 driver.

Not perfect since there seems to cause an import problem with tox.
But the tests can be run directly with py.test.
Still investigating on that issue, with no real idea of what's wrong.
Adapt the S3 Driver to Escalator.

* S3 Driver now takes the Onitu root into account.
  The CheckChanges thread now only lists keys that are prefixed with this root.
  The driver now checks that the given root isn't a regular file on the remote
  S3 bucket. S3 doesn't have a concept such as a directory, so it just checks
  that root is a 0-size file.
  Root now defaults to '' in the manifest.

* All filenames passed to the driver are now prefixed wit the onitu root

* No longer uses the TryAgain exception

* Catch in the end_upload handler against empty uploads (e.g. for tests).
  Amazon S3 raises an exception when a MP upload is empty.

* Adapting the tests to make them work. Taking the root into account seems to
  bug the tests. But they run fine with an empty root. So leave it as it is for
  now.
Change an old statement which isn't valid anymore.
  At some point the timestamp was initialized with '0.0'. But it is now
  a float.

* Change the quotes convention

* No more '\' in strings

* A timeout now raises ServiceError in all cases

* Removed unnecessary str(...) when using string.format()

* Add a condition to import StringIO from io in Python 3.
Implement a basic cache system (a dict) for Amazon S3 multipart uploads.
Fix issues with the Onitu root.

- Onitu configuration demands that the root begins with a slash.
  But S3 stops listing keys with a leading slash when they aren't
  in the bucket's root. So introduce the get_root() function that
  strips that leading slash, if needed
Migrate from boto to tinys3.

This new version seems still a bit clunky and isn't Python 3 compatible
yet, and brings some errors with it. Trying to fix it
Fix a problem when the remote file isn't in the bucket anymore when
calling get_chunk.
Fix style issues for PEP8. Delete tinys3 tests as it's useless for onitu
to ship with them.

- Make an improvement on get_multipart_upload(): by using the 'prefix'
  parameter, we can only list multipart uploads of the required file. It
  should be a massive improvement on buckets with lots of uploads
Fix the get_chunk response. It was sending UTF-8 encoded responses, making
the results all wrong. The problem was that we were using Requests' response
text field, whereas we're better using the content field.

- Add some debug printing
Changed import policy to be Python3-compatible.

- In Py3k upload_chunk passes chunk as bytes. So now the driver uses StringIO
  in Python 2 and BytesIO in Python 3

- Change the syntax of the tinys3 import for python 3. Luckily the new syntax
  is valid in both versions

- Add a try/catch in get_file
Add the delete_file plug handler.

- Check if Onitu root is bucket's root, because by leaving an empty string as
  root, it was raising an error

- Add more error handling
Fix a bug in tinys3 sometimes making upload part result in 403.

Subresource canonicalized URL query parameters are part of the string to sign
to authenticate a request to a S3 server. The problem is that those parameters
must be lexicographically sorted while added to the string to sign. tinys3
added those to the string, but not lexicographically sorted. Not sure why it
sometimes worked, and sometimes raised a 403 Forbidden error, though.

- Add a 'key' parameter to tinys3 HeadRequest to allow performing such requests
  on keys (see below)

- Add the Connection.head_object method, to perform a HEAD request on an object
  (just to check its existence)