From e3c8a0ceb66816433b095c4d734663e1b1e0e4ea Mon Sep 17 00:00:00 2001 From: Karol Stepniewski Date: Sun, 12 Feb 2017 23:50:04 -0800 Subject: [PATCH] Add custom CA file to openstack cloud provider config In cases where insecure OpenStack endpoint is to be used (e.g., when testing), gophercloud will fail to connect to such endpoints. This patch adds support for custom CA file configuration option, which, when provided, will make gophercloud validate OpenStack endpoint against certificate(s) read from file specified in that option. --- pkg/cloudprovider/providers/openstack/BUILD | 2 ++ pkg/cloudprovider/providers/openstack/openstack.go | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/pkg/cloudprovider/providers/openstack/BUILD b/pkg/cloudprovider/providers/openstack/BUILD index e30be109940..d5a3b44e566 100644 --- a/pkg/cloudprovider/providers/openstack/BUILD +++ b/pkg/cloudprovider/providers/openstack/BUILD @@ -54,6 +54,8 @@ go_library( "//vendor:gopkg.in/gcfg.v1", "//vendor:k8s.io/apimachinery/pkg/api/resource", "//vendor:k8s.io/apimachinery/pkg/types", + "//vendor:k8s.io/apimachinery/pkg/util/net", + "//vendor:k8s.io/client-go/util/cert", ], ) diff --git a/pkg/cloudprovider/providers/openstack/openstack.go b/pkg/cloudprovider/providers/openstack/openstack.go index 9fae56027ba..a3ca87fb445 100644 --- a/pkg/cloudprovider/providers/openstack/openstack.go +++ b/pkg/cloudprovider/providers/openstack/openstack.go @@ -17,6 +17,7 @@ limitations under the License. package openstack import ( + "crypto/tls" "errors" "fmt" "io" @@ -37,6 +38,8 @@ import ( "github.com/golang/glog" "k8s.io/apimachinery/pkg/types" + netutil "k8s.io/apimachinery/pkg/util/net" + certutil "k8s.io/client-go/util/cert" "k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/cloudprovider" ) @@ -118,6 +121,7 @@ type Config struct { DomainId string `gcfg:"domain-id"` DomainName string `gcfg:"domain-name"` Region string + CAFile string `gcfg:"ca-file"` } LoadBalancer LoadBalancerOpts BlockStorage BlockStorageOpts @@ -205,6 +209,16 @@ func newOpenStack(cfg Config) (*OpenStack, error) { if err != nil { return nil, err } + if cfg.Global.CAFile != "" { + roots, err := certutil.NewPool(cfg.Global.CAFile) + if err != nil { + return nil, err + } + config := &tls.Config{} + config.RootCAs = roots + provider.HTTPClient.Transport = netutil.SetOldTransportDefaults(&http.Transport{TLSClientConfig: config}) + + } if cfg.Global.TrustId != "" { authOptionsExt := trust.AuthOptionsExt{ TrustID: cfg.Global.TrustId,