Merge pull request #95206 from misterikkit/quobyte-update

storage: Use FilteredDialContext in quobyte client
This commit is contained in:
Kubernetes Prow Robot 2020-11-10 21:44:30 -08:00 committed by GitHub
commit 0923b9abce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 82 additions and 36 deletions

4
go.mod
View File

@ -82,7 +82,7 @@ require (
github.com/prometheus/client_golang v1.7.1 github.com/prometheus/client_golang v1.7.1
github.com/prometheus/client_model v0.2.0 github.com/prometheus/client_model v0.2.0
github.com/prometheus/common v0.10.0 github.com/prometheus/common v0.10.0
github.com/quobyte/api v0.1.2 github.com/quobyte/api v0.1.8
github.com/robfig/cron v1.1.0 github.com/robfig/cron v1.1.0
github.com/spf13/afero v1.2.2 github.com/spf13/afero v1.2.2
github.com/spf13/cobra v1.1.1 github.com/spf13/cobra v1.1.1
@ -401,7 +401,7 @@ replace (
github.com/prometheus/client_model => github.com/prometheus/client_model v0.2.0 github.com/prometheus/client_model => github.com/prometheus/client_model v0.2.0
github.com/prometheus/common => github.com/prometheus/common v0.10.0 github.com/prometheus/common => github.com/prometheus/common v0.10.0
github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3 github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3
github.com/quobyte/api => github.com/quobyte/api v0.1.2 github.com/quobyte/api => github.com/quobyte/api v0.1.8
github.com/remyoudompheng/bigfft => github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446 github.com/remyoudompheng/bigfft => github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446
github.com/robfig/cron => github.com/robfig/cron v1.1.0 github.com/robfig/cron => github.com/robfig/cron v1.1.0
github.com/rogpeppe/fastuuid => github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af github.com/rogpeppe/fastuuid => github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af

4
go.sum
View File

@ -425,8 +425,8 @@ github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lN
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/quobyte/api v0.1.2 h1:lPHLsuvtjFyk8WhC4uHoHRkScijIHcffTWBBP+YpzYo= github.com/quobyte/api v0.1.8 h1:+sOX1gIlC/OaLipqVZWrHgly9Kh9Qo8OygeS0mWAg30=
github.com/quobyte/api v0.1.2/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI=
github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
github.com/robfig/cron v1.1.0 h1:jk4/Hud3TTdcrJgUOBgsqrZBarcxl6ADIjSC2iniwLY= github.com/robfig/cron v1.1.0 h1:jk4/Hud3TTdcrJgUOBgsqrZBarcxl6ADIjSC2iniwLY=
github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=

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) {

View File

@ -24,6 +24,10 @@ func main() {
RootUserID: "root", RootUserID: "root",
RootGroupID: "root", RootGroupID: "root",
ConfigurationName: "BASE", ConfigurationName: "BASE",
Labels: []quobyte_api.Label{
{Name: "label1", Value: "value1"},
{Name: "label2", Value: "value2"},
},
} }
volumeUUID, err := client.CreateVolume(req) volumeUUID, err := client.CreateVolume(req)

View File

@ -32,6 +32,10 @@ func (client *QuobyteClient) GetAPIRetryPolicy() string {
return client.apiRetryPolicy return client.apiRetryPolicy
} }
func (client *QuobyteClient) SetTransport(t http.RoundTripper) {
client.client.Transport = t
}
// NewQuobyteClient creates a new Quobyte API client // NewQuobyteClient creates a new Quobyte API client
func NewQuobyteClient(url string, username string, password string) *QuobyteClient { func NewQuobyteClient(url string, username string, password string) *QuobyteClient {
return &QuobyteClient{ return &QuobyteClient{

View File

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt"
"io" "io"
"log" "log"
"math/rand" "math/rand"
@ -112,7 +113,12 @@ func (client QuobyteClient) sendRequest(method string, request interface{}, resp
defer resp.Body.Close() defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode > 299 { if resp.StatusCode < 200 || resp.StatusCode > 299 {
log.Printf("Warning: HTTP status code for request is %s\n", strconv.Itoa(resp.StatusCode)) log.Printf("Warning: HTTP status code for request is %s\n",
strconv.Itoa(resp.StatusCode))
if resp.StatusCode == 401 {
return errors.New("Unable to authenticate with Quobyte API service")
}
return fmt.Errorf("JsonRPC failed with error code %d", resp.StatusCode)
} }
return decodeResponse(resp.Body, &response) return decodeResponse(resp.Body, &response)
} }

View File

@ -1,25 +1,31 @@
package quobyte package quobyte
type retryPolicy struct { type retryPolicy struct {
RetryPolicy string `json:"retry,omitempty"` RetryPolicy string `json:"retry,omitempty"`
} }
// CreateVolumeRequest represents a CreateVolumeRequest // CreateVolumeRequest represents a CreateVolumeRequest
type CreateVolumeRequest struct { type CreateVolumeRequest struct {
Name string `json:"name,omitempty"` Name string `json:"name,omitempty"`
RootUserID string `json:"root_user_id,omitempty"` RootUserID string `json:"root_user_id,omitempty"`
RootGroupID string `json:"root_group_id,omitempty"` RootGroupID string `json:"root_group_id,omitempty"`
ReplicaDeviceIDS []uint64 `json:"replica_device_ids,string,omitempty"` ReplicaDeviceIDS []uint64 `json:"replica_device_ids,string,omitempty"`
ConfigurationName string `json:"configuration_name,omitempty"` ConfigurationName string `json:"configuration_name,omitempty"`
AccessMode uint32 `json:"access_mode,string,omitempty"` Labels []Label `json:"label,omitempty"`
TenantID string `json:"tenant_id,omitempty"` AccessMode uint32 `json:"access_mode,uint32,omitempty"`
retryPolicy TenantID string `json:"tenant_id,omitempty"`
retryPolicy
}
type Label struct {
Name string `json:"name,string,omitempty"`
Value string `json:"value,string,omitempty"`
} }
type resolveVolumeNameRequest struct { type resolveVolumeNameRequest struct {
VolumeName string `json:"volume_name,omitempty"` VolumeName string `json:"volume_name,omitempty"`
TenantDomain string `json:"tenant_domain,omitempty"` TenantDomain string `json:"tenant_domain,omitempty"`
retryPolicy retryPolicy
} }
type resolveTenantNameRequest struct { type resolveTenantNameRequest struct {
@ -35,8 +41,8 @@ type volumeUUID struct {
} }
type getClientListRequest struct { type getClientListRequest struct {
TenantDomain string `json:"tenant_domain,omitempty"` TenantDomain string `json:"tenant_domain,omitempty"`
retryPolicy retryPolicy
} }
type GetClientListResponse struct { type GetClientListResponse struct {
@ -67,13 +73,13 @@ type quota struct {
} }
type setQuotaRequest struct { type setQuotaRequest struct {
Quotas []*quota `json:"quotas,omitempty"` Quotas []*quota `json:"quotas,omitempty"`
retryPolicy retryPolicy
} }
type getTenantRequest struct { type getTenantRequest struct {
TenantIDs []string `json:"tenant_id,omitempty"` TenantIDs []string `json:"tenant_id,omitempty"`
retryPolicy retryPolicy
} }
type GetTenantResponse struct { type GetTenantResponse struct {
@ -94,8 +100,8 @@ type TenantDomainConfigurationVolumeAccess struct {
} }
type setTenantRequest struct { type setTenantRequest struct {
Tenants *TenantDomainConfiguration `json:"tenant,omitempty"` Tenants *TenantDomainConfiguration `json:"tenant,omitempty"`
retryPolicy retryPolicy
} }
type setTenantResponse struct { type setTenantResponse struct {

4
vendor/modules.txt vendored
View File

@ -975,10 +975,10 @@ github.com/prometheus/procfs
# github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3 # github.com/prometheus/procfs => github.com/prometheus/procfs v0.1.3
github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/fs
github.com/prometheus/procfs/internal/util github.com/prometheus/procfs/internal/util
# github.com/quobyte/api v0.1.2 => github.com/quobyte/api v0.1.2 # github.com/quobyte/api v0.1.8 => github.com/quobyte/api v0.1.8
## explicit ## explicit
github.com/quobyte/api github.com/quobyte/api
# github.com/quobyte/api => github.com/quobyte/api v0.1.2 # github.com/quobyte/api => github.com/quobyte/api v0.1.8
# github.com/remyoudompheng/bigfft => github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446 # github.com/remyoudompheng/bigfft => github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446
# github.com/robfig/cron v1.1.0 => github.com/robfig/cron v1.1.0 # github.com/robfig/cron v1.1.0 => github.com/robfig/cron v1.1.0
## explicit ## explicit