Use FilteredDialContext with quobyte API

This injects the filtered DialContext behavior from VolumeHost into the
quobyte plugin, which allows us to configure a host deny list for the
plugin.

There should be no change in timeouts, because we are able to use the
same default transport settings as before.
This commit is contained in:
Jonathan Basseri 2020-09-30 17:16:31 -07:00
parent 40bb82a5b8
commit dfe6ea6df6
3 changed files with 35 additions and 9 deletions

View File

@ -15,6 +15,7 @@ go_library(
], ],
importpath = "k8s.io/kubernetes/pkg/volume/quobyte", importpath = "k8s.io/kubernetes/pkg/volume/quobyte",
deps = [ deps = [
"//pkg/proxy/util:go_default_library",
"//pkg/volume:go_default_library", "//pkg/volume:go_default_library",
"//pkg/volume/util:go_default_library", "//pkg/volume/util:go_default_library",
"//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library",

View File

@ -32,6 +32,7 @@ import (
"k8s.io/apimachinery/pkg/api/resource" "k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
proxyutil "k8s.io/kubernetes/pkg/proxy/util"
"k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume"
"k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util"
) )
@ -65,6 +66,9 @@ const (
) )
func (plugin *quobytePlugin) Init(host volume.VolumeHost) error { func (plugin *quobytePlugin) Init(host volume.VolumeHost) error {
if host == nil {
return errors.New("host must not be nil")
}
plugin.host = host plugin.host = host
return nil return nil
} }
@ -304,7 +308,8 @@ func (unmounter *quobyteUnmounter) TearDownAt(dir string) error {
type quobyteVolumeDeleter struct { type quobyteVolumeDeleter struct {
*quobyteMounter *quobyteMounter
pv *v1.PersistentVolume pv *v1.PersistentVolume
dialOptions *proxyutil.FilteredDialOptions
} }
func (plugin *quobytePlugin) NewDeleter(spec *volume.Spec) (volume.Deleter, error) { func (plugin *quobytePlugin) NewDeleter(spec *volume.Spec) (volume.Deleter, error) {
@ -320,6 +325,9 @@ func (plugin *quobytePlugin) newDeleterInternal(spec *volume.Spec) (volume.Delet
if err != nil { if err != nil {
return nil, err return nil, err
} }
if plugin.host == nil {
return nil, errors.New("host must not be nil")
}
return &quobyteVolumeDeleter{ return &quobyteVolumeDeleter{
quobyteMounter: &quobyteMounter{ quobyteMounter: &quobyteMounter{
@ -334,7 +342,8 @@ func (plugin *quobytePlugin) newDeleterInternal(spec *volume.Spec) (volume.Delet
registry: source.Registry, registry: source.Registry,
readOnly: readOnly, readOnly: readOnly,
}, },
pv: spec.PersistentVolume, pv: spec.PersistentVolume,
dialOptions: plugin.host.GetFilteredDialOptions(),
}, nil }, nil
} }
@ -343,19 +352,24 @@ func (plugin *quobytePlugin) NewProvisioner(options volume.VolumeOptions) (volum
} }
func (plugin *quobytePlugin) newProvisionerInternal(options volume.VolumeOptions) (volume.Provisioner, error) { func (plugin *quobytePlugin) newProvisionerInternal(options volume.VolumeOptions) (volume.Provisioner, error) {
if plugin.host == nil {
return nil, errors.New("host must not be nil")
}
return &quobyteVolumeProvisioner{ return &quobyteVolumeProvisioner{
quobyteMounter: &quobyteMounter{ quobyteMounter: &quobyteMounter{
quobyte: &quobyte{ quobyte: &quobyte{
plugin: plugin, plugin: plugin,
}, },
}, },
options: options, options: options,
dialOptions: plugin.host.GetFilteredDialOptions(),
}, nil }, nil
} }
type quobyteVolumeProvisioner struct { type quobyteVolumeProvisioner struct {
*quobyteMounter *quobyteMounter
options volume.VolumeOptions options volume.VolumeOptions
dialOptions *proxyutil.FilteredDialOptions
} }
func (provisioner *quobyteVolumeProvisioner) Provision(selectedNode *v1.Node, allowedTopologies []v1.TopologySelectorTerm) (*v1.PersistentVolume, error) { func (provisioner *quobyteVolumeProvisioner) Provision(selectedNode *v1.Node, allowedTopologies []v1.TopologySelectorTerm) (*v1.PersistentVolume, error) {
@ -409,7 +423,8 @@ func (provisioner *quobyteVolumeProvisioner) Provision(selectedNode *v1.Node, al
provisioner.volume = fmt.Sprintf("kubernetes-dynamic-pvc-%s", uuid.New().String()) provisioner.volume = fmt.Sprintf("kubernetes-dynamic-pvc-%s", uuid.New().String())
manager := &quobyteVolumeManager{ manager := &quobyteVolumeManager{
config: cfg, config: cfg,
dialOptions: provisioner.dialOptions,
} }
vol, sizeGB, err := manager.createVolume(provisioner, createQuota) vol, sizeGB, err := manager.createVolume(provisioner, createQuota)
@ -449,7 +464,8 @@ func (deleter *quobyteVolumeDeleter) Delete() error {
return err return err
} }
manager := &quobyteVolumeManager{ manager := &quobyteVolumeManager{
config: cfg, config: cfg,
dialOptions: deleter.dialOptions,
} }
err = manager.deleteVolume(deleter) err = manager.deleteVolume(deleter)
if err != nil { if err != nil {

View File

@ -18,19 +18,22 @@ package quobyte
import ( import (
"net" "net"
"net/http"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
"k8s.io/api/core/v1" v1 "k8s.io/api/core/v1"
volumehelpers "k8s.io/cloud-provider/volume/helpers" volumehelpers "k8s.io/cloud-provider/volume/helpers"
proxyutil "k8s.io/kubernetes/pkg/proxy/util"
quobyteapi "github.com/quobyte/api" quobyteapi "github.com/quobyte/api"
"k8s.io/klog/v2" "k8s.io/klog/v2"
) )
type quobyteVolumeManager struct { type quobyteVolumeManager struct {
config *quobyteAPIConfig config *quobyteAPIConfig
dialOptions *proxyutil.FilteredDialOptions
} }
func (manager *quobyteVolumeManager) createVolume(provisioner *quobyteVolumeProvisioner, createQuota bool) (quobyte *v1.QuobyteVolumeSource, size int, err error) { func (manager *quobyteVolumeManager) createVolume(provisioner *quobyteVolumeProvisioner, createQuota bool) (quobyte *v1.QuobyteVolumeSource, size int, err error) {
@ -77,11 +80,17 @@ func (manager *quobyteVolumeManager) deleteVolume(deleter *quobyteVolumeDeleter)
} }
func (manager *quobyteVolumeManager) createQuobyteClient() *quobyteapi.QuobyteClient { func (manager *quobyteVolumeManager) createQuobyteClient() *quobyteapi.QuobyteClient {
return quobyteapi.NewQuobyteClient( client := quobyteapi.NewQuobyteClient(
manager.config.quobyteAPIServer, manager.config.quobyteAPIServer,
manager.config.quobyteUser, manager.config.quobyteUser,
manager.config.quobytePassword, manager.config.quobytePassword,
) )
// quobyte client library @v0.1.7 uses a zero-value http.Client with a nil
// transport which is equivalent to using http.DefaultTransport.
rt := http.DefaultTransport.(*http.Transport).Clone()
rt.DialContext = proxyutil.NewFilteredDialContext(rt.DialContext, nil, manager.dialOptions)
client.SetTransport(rt)
return client
} }
func (mounter *quobyteMounter) pluginDirIsMounted(pluginDir string) (bool, error) { func (mounter *quobyteMounter) pluginDirIsMounted(pluginDir string) (bool, error) {