Merge remote-tracking branch 'origin/develop' into develop

* origin/develop:
  The documentation for 'Developing Salt' is missing a critical step for 0.17+ users who wish to utilize the test runner. This commit describes the direct installation of salt-testing.
  -- Please review for accuracy prior to merge --
Edit the docs with new `id` generation process
Switch priority of `socket.getfqdn()` and `/etc/hostname` id guessing
Retrieve ID from cache if possible
PEP8 line length
Cache any non-IP guess of minion ID
Only log that we're guessing the ID when that is actually true
Fix out-of-date comment
Fix git.latest to run current branch and ls remote as correct user
Cache the minion id in /var/lib/salt or C:\salt\var\lib
Add RabbitMQ functionality

Add support for user tags and permissions to the rabbitmq_user state,
which requires adding support for set_user_tags to the rabbitmq module.

Also add a rabbitmq_plugin state, which requires adding rabbitmq-plugin
support to the rabbitmq module.
Merge pull request #7683 from jesusaurus/feature/rabbitmq

Add more RabbitMQ functionality
Fix PEP-8 E302. Add UTF-8 header.
Fix PEP-8 E302. Add UTF-8 header.
Fix PyLint W0102. Dangerous default value.
Fix PEP-8 E302.
Merge pull request #7684 from s0undt3ch/develop

Some PEP8/Pylint fixes
OSError: [Errno 22] Invalid argument - caused by duplicate gids.

Currently, `supgroups` can return a list that has duplicate gids in it:
```python
>>> supgroups = [g.gr_gid for g in grp.getgrall() if uinfo.pw_name in g.gr_mem and g.gr_gid != uinfo.pw_gid]
>>> supgroups
[80, 29, 1, 2, 5, 9, 8, 20, 3, 4, 1, 2, 3, 4, 5, 8, 9, 20, 29, 80]
```

This cause problems in the comparison on [L80](https://github.com/saltstack/salt/blob/0.17/salt/modules/cmdmod.py#L80).  More importantly, it causes an OS error on [L82](https://github.com/saltstack/salt/blob/0.17/salt/modules/cmdmod.py#L82) when we attempt to `os.setgroups(supgroups)`.  Simply deduplicating the list before handling processing it fixes the issue.

Here's some debugging that should help you understand:
```python
>>> uinfo
pwd.struct_passwd(pw_name='root', pw_passwd='*', pw_uid=0, pw_gid=0, pw_gecos='System Administrator', pw_dir='/var/root', pw_shell='/bin/sh')
>>> [g.gr_gid for g in grp.getgrall()]
[83, 55, 87, 81, 79, 33, 67, 235, 97, 93, 32, 82, 202, 212, 72, 207, 59, 204, 220, 227, 56, 201, 25, 96, 84, 30, 211, 205, 26, 98, 100, 78, 54, 65, 74, 222, 228, 24, 209, 28, 27, 216, 76, 60, 203, 31, 92, 58, 200, 89, 75, 73, 13, 94, 210, 91, 208, 99, 95, 213, 66, 224, 221, 88, 70, 90, 80, 50, 7, 29, 401, 53, 1, 68, 12, 16, 51, 2, 61, 6, 62, 52, 69, 4294967294, 4294967295, 5, 10, 9, 8, 20, 3, 4, 45, 0, 2106269579, 4294967294, 4294967295, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 16, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 45, 50, 51, 52, 53, 54, 55, 56, 58, 59, 60, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 83, 84, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 200, 201, 202, 203, 204, 205, 207, 208, 209, 210, 211, 212, 213, 216, 220, 221, 222, 224, 227, 228]
>>> supgroups = [g.gr_gid for g in grp.getgrall() if uinfo.pw_name in g.gr_mem and g.gr_gid != uinfo.pw_gid]
>>> supgroups
[80, 29, 1, 2, 5, 9, 8, 20, 3, 4, 1, 2, 3, 4, 5, 8, 9, 20, 29, 80]
>>> # Notice the duplication ...
...
>>>
>>> os.getgroups()
[0, 1, 2, 3, 4, 5, 8, 9, 12, 20, 29, 61, 80]
>>> os.setgroups(supgroups)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> type(supgroups)
<type 'list'>
>>> seen = set()
>>> supgroups_deduped = [ x for x in supgroups if x not in seen and not seen.add(x) ]
>>> supgroups_deduped
[80, 29, 1, 2, 5, 9, 8, 20, 3, 4]
>>> os.setgroups(supgroups_deduped)
>>> os.getgroups()
[0, 1, 2, 3, 4, 5, 8, 9, 12, 20, 29, 61, 80]
```

Solution gleened from:
http://stackoverflow.com/a/480227/615422

```sh
# /usr/local/bin/salt-minion --versions-report
           Salt: 0.16.3
         Python: 2.7.2 (default, Oct 11 2012, 20:14:37)
         Jinja2: 2.7.1
       M2Crypto: 0.21.1
 msgpack-python: 0.3.0
   msgpack-pure: Not Installed
       pycrypto: 2.6
         PyYAML: 3.10
          PyZMQ: 13.1.0
            ZMQ: 3.2.3
```
OS X 10.8.4
ensure that printed OrderedDict can be parsed by YAML (like a regular dict)
Merge pull request #7680 from joshuagoodson-uar/git-user-fix

Fix git.latest to run current branch and ls remote as correct user