Cherry pick master_tops restore
Restore master_tops functionality and add more documentation.
Fix stray if statement
Merge commit
Merge commit
Merge commit
Add full gpg public key.
merge commit
merge commot
merge commit
Add master_tops and ext_nodes to release notes for 2014.1.6
Merge pull request #14053 from basepi/2014.1.6release2

Add master_tops and ext_nodes to release notes for 2014.1.6
Make sure test_full_returns passes for RAET
Improved and restructured dockerio module docs
Fixing lint
Make log error punctuation consistent.
glusterfs.list_volumes should return the expected type

We are expecting a list, not a None.

     Comment: An exception occurred in this state: Traceback (most recent call last):
                File "/usr/lib/python2.7/dist-packages/salt/state.py", line 1517, in call
                  **cdata['kwargs'])
                File "/usr/lib/python2.7/dist-packages/salt/states/glusterfs.py", line 178, in started
                  if name not in volumes:
              TypeError: argument of type 'NoneType' is not iterable
Merge pull request #14056 from gtmanfred/develop

glusterfs.list_volumes should return the expected type
Please DO NOT MERGE IMMEDIATELY

Salt targeting is done using the zmq pub/sub mechanism. No filtering is done so all requests go to all minions. This is an attempt to make the requests more target-able. ZeroMQ supports filters on these sockets which are processed publisher side. So the thought is to set it to the minion id and a shared "broadcast" one. Only requests of tgt_type == list will use this. The thought is if we like this we can use other data (mine etc) to determine a more specific target on the master (such as a list) from a glob match etc.

This is more or less backwards compatible, during my testing it still works but the old minion will throw an exception like:

[CRITICAL] An exception occurred while polling the minion
Traceback (most recent call last):
  File "/home/thjackso/src/salt/salt/minion.py", line 1324, in tune_in
    payload = self.serial.loads(self.socket.recv(zmq.NOBLOCK))
  File "/home/thjackso/src/salt/salt/payload.py", line 95, in loads
    return msgpack.loads(msg, use_list=True)
  File "_unpacker.pyx", line 114, in msgpack._unpacker.unpackb (msgpack/_unpacker.cpp:114)
ExtraData: unpack(b) recieved extra data.

So if we decide this is a good idea we'll probably want to wrap the new master side logic in a config option, and just merge in the minion side changes for the first release.

This is another attempt of #10374.
Change LaneStack rxMsgs to duple (msg, sender)
where msg is message body dict and
sender is name of remote that sent the message