Add ProxyUrl parameter for OpenStack builder.

In my particular case I need to use a separate HTTP proxy to access my
OpenStack API than what is set in the environment. This commit adds an
optional parameter to the builder configuration and overrides the
net/http client that is used by the gophercloud library.
This commit is contained in:
John Bellone 2013-11-19 12:03:35 -05:00
parent 6867c4f3e3
commit 817b1bdb32
1 changed files with 17 additions and 0 deletions

View File

@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/packer"
"github.com/rackspace/gophercloud" "github.com/rackspace/gophercloud"
"net/http"
"net/url"
"os" "os"
) )
@ -14,6 +16,7 @@ type AccessConfig struct {
Project string `mapstructure:"project"` Project string `mapstructure:"project"`
Provider string `mapstructure:"provider"` Provider string `mapstructure:"provider"`
RawRegion string `mapstructure:"region"` RawRegion string `mapstructure:"region"`
ProxyUrl string `mapstructure:"proxy_url"`
} }
// Auth returns a valid Auth object for access to openstack services, or // Auth returns a valid Auth object for access to openstack services, or
@ -23,6 +26,7 @@ func (c *AccessConfig) Auth() (gophercloud.AccessProvider, error) {
password := c.Password password := c.Password
project := c.Project project := c.Project
provider := c.Provider provider := c.Provider
proxy := c.ProxyUrl
if username == "" { if username == "" {
username = os.Getenv("SDK_USERNAME") username = os.Getenv("SDK_USERNAME")
@ -47,6 +51,19 @@ func (c *AccessConfig) Auth() (gophercloud.AccessProvider, error) {
authoptions.TenantName = project authoptions.TenantName = project
} }
// For corporate networks it may be the case where we want our API calls
// to be sent through a separate HTTP proxy than external traffic.
if proxy != "" {
url, err := url.Parse(proxy)
if err != nil {
return nil, err
}
// The gophercloud.Context has a UseCustomClient method which
// would allow us to override with a new instance of http.Client.
http.DefaultTransport = &http.Transport{Proxy: http.ProxyURL(url)}
}
return gophercloud.Authenticate(provider, authoptions) return gophercloud.Authenticate(provider, authoptions)
} }