Allow root to run sudo without a TTY.

This makes it more convienent to use sudo instead of su.
Enforce the presence of a no_proxy environment variable.

It turns out that people don't just magically know how to configure
their proxy parameters correctly in the somewhat complex dev and test
setup we use.
Go back to committed_read for transaction isolation.

Now that we have most of the contention nailed down, we can move back to
committed_read from read_repeatable.
Use open4 for subprocesses instead of open3.

open3 requires an additional background thread per spawned process to
watch for the subprocess to exit and reap it.  open4 does not, and lets
us see what the PID of our spawned process is as a super added bonus.
Make Puma launch with all threads pre-forked in production mode.

This makes it less likely that Puma will not be able to fork a thread in
time of need.
Run all docker slaves via sudo to avoid ulimit constraints.
Use 'FOR NO KEY UPDATE' when updating sysdata in the database roles.

This hints to postgresql that we don't intend to delete the row or
change the primary key.  This fixes some deadlocks on our more heavily
used NodeRole rows.
Ditch run's version of locked_transaction.

The one in api_helper does the job just fine.
Include a log for when we retry due to serialization failure.

This is for informational reasons.
Let jig.run_job steal work on a per-node basis.

This allows the annealer to more efficiently reuse SSH oppourtunistic
master channels, and makes individual nodes come up faster.
Make the fake /etc/sysconfig/network contain meaningful content.

Squid needs this to actually launch in Centos and Redhat.
Switch to Squid for our caching HTTP proxy needs.

Using Squid instead of Apache is faster and less resource intensive, and
gives us and our users oppourtunities to tune the cache for their
expected workload.
Make Docker nodes use IPv6 for their bringup.

Since they are not tied to IPv4 like Sledgehammer is for PXE, just let
them use native IPv6 from the start.
Remove magic from our automatic IPv6 range.

Instead of relying on hardcoded magic to determine what the IPv6 address
for a node is, track it in the database along with the IPv4 ranges.
Add utility views for faster handling of framework roles.

These views encapsulate all the knowledge we need to deal with our DHCP,
Docker, and DNS records.
Refactor high-contnetion framework roles to use the specialized views.

This undoes the per-node logic I used to have in the Rails framework,
and since the database is doing all the heavy lifting it is just about
as fast.
Merge pull request #122 from VictorLowther/over-100-docker-nodes-at-once

+2 (nice comments & commit messages) Over 100 docker nodes at once