From 7b5f58f78ce917ad715438d201ee30d1fef629d1 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 e30be109940e..d5a3b44e5667 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 9fae56027bab..a3ca87fb4454 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,