Skip to content

Instantly share code, notes, and snippets.

@fnichol
Last active April 27, 2023 15:24
Show Gist options
  • Star 69 You must be signed in to star a gist
  • Fork 11 You must be signed in to fork a gist
  • Save fnichol/7551540 to your computer and use it in GitHub Desktop.
Save fnichol/7551540 to your computer and use it in GitHub Desktop.
Auto-enable Local HTTP Caching in Test Kitchen

Auto-enable Local HTTP Caching in Test Kitchen

Note: total experiment and hack, looks nasty, could be awesome:

Setup

  • Drop the kitchen.local.yml into $HOME/.kitchen/config.yml
  • Install polipo (with Mac: brew install polipo, with Ubuntu: apt-get install polipo)
  • Drop polipo-start and polipo-console somewhere useful (perhaps $HOME/bin?)

Run with HTTP Caching Proxy

Simply start up polipo in the foreground in a terminal/tmux/screen session with: ~/bin/polipo-start. In your Test Kitchen project verify that caching is enabled by running kitchen diagnose and look for the http_proxy and chef_omnibus_url config options, like in this abbreviated example output:

---
timestamp: 2015-03-06 19:27:56 UTC
kitchen_version: 1.3.1
instances:
  default-ubuntu-1204:
    state_file: {}
    driver:
      http_proxy: http://10.0.10.20:8123
      https_proxy: http://10.0.10.20:8123
      provision_command: env http_proxy=http://10.0.10.20:8123 bash -c 'curl -L
        http://www.chef.io/chef/install.sh | bash'
    provisioner:
      chef_omnibus_url: http://www.chef.io/chef/install.sh
<%
require 'socket'
# @return [String] public IP address of workstation used for egress traffic
def local_ip
@local_ip ||= begin
# turn off reverse DNS resolution temporarily
orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true
UDPSocket.open do |s|
s.connect '64.233.187.99', 1 # a google IP, does not hit network
s.addr.last
end
ensure
Socket.do_not_reverse_lookup = orig
end
end
# @return [Integer] default polipo listening port
def local_port ; 8123 ; end
# @return [String] the polipo proxy URL
def http_proxy_url ; "http://#{local_ip}:#{local_port}" ; end
# @return [TrueClass,FalseClass] whether or not the polipo port is listening
def proxy_running?
socket = TCPSocket.new(local_ip, local_port)
true
rescue SocketError, Errno::ECONNREFUSED,
Errno::EHOSTUNREACH, Errno::ENETUNREACH, IOError
false
rescue Errno::EPERM, Errno::ETIMEDOUT
false
ensure
socket && socket.close
end
%>
---
<% if proxy_running? %>
driver:
http_proxy: <%= http_proxy_url %>
https_proxy: <%= http_proxy_url %>
# used in kitchen-docker to pre-install/cache a Chef Ommnibus package in a
# layer before booting containers
provision_command: "env http_proxy=<%= http_proxy_url %> bash -c 'curl -L http://www.chef.io/chef/install.sh | bash'"
provisioner:
# installs from an http:// source to enable better caching through
# http_proxy, and yes, this is a bit evil
chef_omnibus_url: http://www.chef.io/chef/install.sh
<% end %>
#!/usr/bin/env bash
set -e
[ -n "$DEBUG" ] && set -x
if ! command -v lynx >/dev/null ; then
echo "$(basename $0) - lynx command not found, please install and retry"
exit 10
fi
exec lynx "http://127.0.0.1:8123"
#!/usr/bin/env bash
set -e
[ -n "$DEBUG" ] && set -x
if ! command -v polipo >/dev/null ; then
echo "$(basename $0) - polipo command not found, please install and retry"
exit 10
fi
mkdir -p "$HOME/.polipo-cache"
exec polipo \
proxyAddress='0.0.0.0' \
disableIndexing='false' \
disableServersList='false' \
allowedClients='0.0.0.0/0' \
diskCacheRoot='~/.polipo-cache'
@amontalban
Copy link

Would be great if the proxy_running can exit in a quick way when polipo is not running otherwise it crawls every kitchen command.

@eherot
Copy link

eherot commented Dec 5, 2016

Noticing that you catch Errno::ETIMEDOUT here but without doing anything to enforce a meaningful timeout on TCPSocket.new. By default it's 75 seconds which makes most kitchen commands unusable in the event that this gets triggered.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment