vendor updates

This commit is contained in:
Serguei Bezverkhi
2018-03-06 17:33:18 -05:00
parent 4b3ebc171b
commit e9033989a0
5854 changed files with 248382 additions and 119809 deletions

View File

@ -17,7 +17,7 @@ limitations under the License.
package csicommon
import (
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/golang/glog"
"golang.org/x/net/context"
"google.golang.org/grpc/codes"
@ -76,25 +76,11 @@ func (cs *DefaultControllerServer) GetCapacity(ctx context.Context, req *csi.Get
return nil, status.Error(codes.Unimplemented, "")
}
func (cs *DefaultControllerServer) ControllerProbe(ctx context.Context, req *csi.ControllerProbeRequest) (*csi.ControllerProbeResponse, error) {
glog.V(5).Infof("Using default ControllerProbe")
if err := cs.Driver.ValidateControllerServiceRequest(req.Version, csi.ControllerServiceCapability_RPC_UNKNOWN); err != nil {
return nil, err
}
return &csi.ControllerProbeResponse{}, nil
}
// ControllerGetCapabilities implements the default GRPC callout.
// Default supports all capabilities
func (cs *DefaultControllerServer) ControllerGetCapabilities(ctx context.Context, req *csi.ControllerGetCapabilitiesRequest) (*csi.ControllerGetCapabilitiesResponse, error) {
glog.V(5).Infof("Using default ControllerGetCapabilities")
// Check arguments
if req.GetVersion() == nil {
return nil, status.Error(codes.InvalidArgument, "Version missing in request")
}
return &csi.ControllerGetCapabilitiesResponse{
Capabilities: cs.Driver.cap,
}, nil

View File

@ -17,25 +17,25 @@ limitations under the License.
package csicommon
import (
"fmt"
"github.com/golang/glog"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
)
type CSIDriver struct {
name string
nodeID string
version *csi.Version
supVers []*csi.Version
version string
cap []*csi.ControllerServiceCapability
vc []*csi.VolumeCapability_AccessMode
}
// Creates a NewCSIDriver object. Assumes vendor version is equal to driver version &
// does not support optional driver plugin info manifest field. Refer to CSI spec for more details.
func NewCSIDriver(name string, v *csi.Version, supVers []*csi.Version, nodeID string) *CSIDriver {
func NewCSIDriver(name string, v string, nodeID string) *CSIDriver {
if name == "" {
glog.Errorf("Driver name missing")
return nil
@ -45,57 +45,22 @@ func NewCSIDriver(name string, v *csi.Version, supVers []*csi.Version, nodeID st
glog.Errorf("NodeID missing")
return nil
}
if v == nil {
// TODO version format and validation
if len(v) == 0 {
glog.Errorf("Version argument missing")
return nil
}
found := false
for _, sv := range supVers {
if sv.GetMajor() == v.GetMajor() && sv.GetMinor() == v.GetMinor() && sv.GetPatch() == v.GetPatch() {
found = true
}
}
if !found {
supVers = append(supVers, v)
}
driver := CSIDriver{
name: name,
version: v,
supVers: supVers,
nodeID: nodeID,
}
return &driver
}
func (d *CSIDriver) CheckVersion(v *csi.Version) error {
if v == nil {
return status.Error(codes.InvalidArgument, "Version missing")
}
// Assumes always backward compatible
for _, sv := range d.supVers {
if v.Major == sv.Major && v.Minor <= sv.Minor {
return nil
}
}
return status.Error(codes.InvalidArgument, "Unsupported version: "+GetVersionString(v))
}
func (d *CSIDriver) ValidateControllerServiceRequest(v *csi.Version, c csi.ControllerServiceCapability_RPC_Type) error {
if v == nil {
return status.Error(codes.InvalidArgument, "Version not specified")
}
if err := d.CheckVersion(v); err != nil {
return status.Error(codes.InvalidArgument, "Unsupported version")
}
func (d *CSIDriver) ValidateControllerServiceRequest(c csi.ControllerServiceCapability_RPC_Type) error {
if c == csi.ControllerServiceCapability_RPC_UNKNOWN {
return nil
}
@ -105,8 +70,7 @@ func (d *CSIDriver) ValidateControllerServiceRequest(v *csi.Version, c csi.Contr
return nil
}
}
return status.Error(codes.InvalidArgument, "Unsupported version: "+GetVersionString(v))
return status.Error(codes.InvalidArgument, fmt.Sprintf("%s", c))
}
func (d *CSIDriver) AddControllerServiceCapabilities(cl []csi.ControllerServiceCapability_RPC_Type) {

View File

@ -19,7 +19,7 @@ package csicommon
import (
"testing"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/stretchr/testify/assert"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@ -31,93 +31,22 @@ const (
)
var (
fakeVersion = csi.Version{Major: 5, Minor: 2, Patch: 0}
fakeVersionsSupported = []*csi.Version{
{
Major: 4, Minor: 0, Patch: 0,
},
{
Major: 4, Minor: 1, Patch: 0,
},
}
vendorVersion = "0.2.0"
)
func NewFakeDriver() *CSIDriver {
fakeVersion = csi.Version{Major: 5, Minor: 2, Patch: 0}
fakeVersionsSupported = []*csi.Version{
{
Major: 4, Minor: 0, Patch: 0,
},
{
Major: 4, Minor: 1, Patch: 0,
},
}
driver := NewCSIDriver(fakeDriverName, &fakeVersion, fakeVersionsSupported, fakeNodeID)
driver := NewCSIDriver(fakeDriverName, vendorVersion, fakeNodeID)
return driver
}
func TestNewFakeDriver(t *testing.T) {
// Test New fake driver with invalid arguments.
d := NewCSIDriver("", &fakeVersion, fakeVersionsSupported, fakeNodeID)
d := NewCSIDriver("", vendorVersion, fakeNodeID)
assert.Nil(t, d)
}
func TestCheckVersion(t *testing.T) {
driver := NewFakeDriver()
// Exact version
v := csi.Version{
Major: 5,
Minor: 1,
Patch: 0,
}
err := driver.CheckVersion(&v)
assert.NoError(t, err)
//Supported version
v = csi.Version{
Major: 4,
Minor: 0,
Patch: 0,
}
err = driver.CheckVersion(&v)
assert.NoError(t, err)
// Unsupported version
v = csi.Version{
Major: 6,
Minor: 0,
Patch: 0,
}
err = driver.CheckVersion(&v)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Supported minor version
v = csi.Version{
Major: 5,
Minor: 1,
Patch: 0,
}
err = driver.CheckVersion(&v)
assert.NoError(t, err)
// Unsupported minor version
v = csi.Version{
Major: 5,
Minor: 3,
Patch: 0,
}
err = driver.CheckVersion(&v)
s, ok = status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
}
func TestGetVolumeCapabilityAccessModes(t *testing.T) {
d := NewFakeDriver()
@ -137,18 +66,12 @@ func TestGetVolumeCapabilityAccessModes(t *testing.T) {
func TestValidateControllerServiceRequest(t *testing.T) {
d := NewFakeDriver()
v := csi.Version{
Major: 5,
Minor: 0,
Patch: 0,
}
// Valid requests which require no capabilities
err := d.ValidateControllerServiceRequest(&v, csi.ControllerServiceCapability_RPC_UNKNOWN)
err := d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_UNKNOWN)
assert.NoError(t, err)
// Test controller service publish/unpublish not supported
err = d.ValidateControllerServiceRequest(&v, csi.ControllerServiceCapability_RPC_PUBLISH_UNPUBLISH_VOLUME)
err = d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_PUBLISH_UNPUBLISH_VOLUME)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
@ -163,19 +86,19 @@ func TestValidateControllerServiceRequest(t *testing.T) {
})
// Test controller service publish/unpublish is supported
err = d.ValidateControllerServiceRequest(&v, csi.ControllerServiceCapability_RPC_PUBLISH_UNPUBLISH_VOLUME)
err = d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_PUBLISH_UNPUBLISH_VOLUME)
assert.NoError(t, err)
// Test controller service create/delete is supported
err = d.ValidateControllerServiceRequest(&v, csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME)
err = d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_CREATE_DELETE_VOLUME)
assert.NoError(t, err)
// Test controller service list volumes is supported
err = d.ValidateControllerServiceRequest(&v, csi.ControllerServiceCapability_RPC_LIST_VOLUMES)
err = d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_LIST_VOLUMES)
assert.NoError(t, err)
// Test controller service get capacity is supported
err = d.ValidateControllerServiceRequest(&v, csi.ControllerServiceCapability_RPC_GET_CAPACITY)
err = d.ValidateControllerServiceRequest(csi.ControllerServiceCapability_RPC_GET_CAPACITY)
assert.NoError(t, err)
}

View File

@ -17,7 +17,7 @@ limitations under the License.
package csicommon
import (
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/golang/glog"
"golang.org/x/net/context"
"google.golang.org/grpc/codes"
@ -28,15 +28,6 @@ type DefaultIdentityServer struct {
Driver *CSIDriver
}
//GetSupportedVersions(context.Context, *GetSupportedVersionsRequest) (*GetSupportedVersionsResponse, error)
//GetPluginInfo(context.Context, *GetPluginInfoRequest) (*GetPluginInfoResponse, error)
func (ids *DefaultIdentityServer) GetSupportedVersions(ctx context.Context, req *csi.GetSupportedVersionsRequest) (*csi.GetSupportedVersionsResponse, error) {
glog.V(5).Infof("Using default GetSupportedVersions")
return &csi.GetSupportedVersionsResponse{
SupportedVersions: ids.Driver.supVers,
}, nil
}
func (ids *DefaultIdentityServer) GetPluginInfo(ctx context.Context, req *csi.GetPluginInfoRequest) (*csi.GetPluginInfoResponse, error) {
glog.V(5).Infof("Using default GetPluginInnfo")
@ -44,15 +35,31 @@ func (ids *DefaultIdentityServer) GetPluginInfo(ctx context.Context, req *csi.Ge
return nil, status.Error(codes.Unavailable, "Driver name not configured")
}
err := ids.Driver.CheckVersion(req.GetVersion())
if err != nil {
return nil, err
if ids.Driver.version == "" {
return nil, status.Error(codes.Unavailable, "Driver is missing version")
}
version := GetVersionString(ids.Driver.version)
return &csi.GetPluginInfoResponse{
Name: ids.Driver.name,
VendorVersion: version,
VendorVersion: ids.Driver.version,
}, nil
}
func (ids *DefaultIdentityServer) Probe(ctx context.Context, req *csi.ProbeRequest) (*csi.ProbeResponse, error) {
return &csi.ProbeResponse{}, nil
}
func (ids *DefaultIdentityServer) GetPluginCapabilities(ctx context.Context, req *csi.GetPluginCapabilitiesRequest) (*csi.GetPluginCapabilitiesResponse, error) {
glog.V(5).Infof("Using default capabilities")
return &csi.GetPluginCapabilitiesResponse{
Capabilities: []*csi.PluginCapability{
{
Type: &csi.PluginCapability_Service_{
Service: &csi.PluginCapability_Service{
Type: csi.PluginCapability_Service_UNKNOWN,
},
},
},
},
}, nil
}

View File

@ -20,49 +20,18 @@ import (
"context"
"testing"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/stretchr/testify/assert"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func TestGetSupportedVersions(t *testing.T) {
d := NewFakeDriver()
ids := NewDefaultIdentityServer(d)
req := csi.GetSupportedVersionsRequest{}
// Test Get supported versions are valid.
resp, err := ids.GetSupportedVersions(context.Background(), &req)
assert.NoError(t, err)
for _, fv := range fakeVersionsSupported {
found := false
for _, rv := range resp.GetSupportedVersions() {
if fv.GetMajor() == rv.GetMajor() && fv.GetMinor() == rv.GetMinor() && fv.GetPatch() == rv.GetPatch() {
found = true
}
}
assert.True(t, found)
}
}
func TestGetPluginInfo(t *testing.T) {
d := NewFakeDriver()
ids := NewDefaultIdentityServer(d)
// Test invalid request
req := csi.GetPluginInfoRequest{}
resp, err := ids.GetPluginInfo(context.Background(), &req)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Test valid request
req.Version = &fakeVersion
resp, err = ids.GetPluginInfo(context.Background(), &req)
assert.NoError(t, err)
assert.Equal(t, resp.GetName(), fakeDriverName)
assert.Equal(t, resp.GetVendorVersion(), vendorVersion)
}

View File

@ -17,7 +17,7 @@ limitations under the License.
package csicommon
import (
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/golang/glog"
"golang.org/x/net/context"
"google.golang.org/grpc/codes"
@ -29,53 +29,24 @@ type DefaultNodeServer struct {
}
func (ns *DefaultNodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublishVolumeRequest) (*csi.NodePublishVolumeResponse, error) {
err := ns.Driver.CheckVersion(req.GetVersion())
if err != nil {
return nil, err
}
return nil, status.Error(codes.Unimplemented, "")
}
func (ns *DefaultNodeServer) NodeUnpublishVolume(ctx context.Context, req *csi.NodeUnpublishVolumeRequest) (*csi.NodeUnpublishVolumeResponse, error) {
err := ns.Driver.CheckVersion(req.GetVersion())
if err != nil {
return nil, err
}
return nil, status.Error(codes.Unimplemented, "")
}
func (ns *DefaultNodeServer) NodeGetId(ctx context.Context, req *csi.NodeGetIdRequest) (*csi.NodeGetIdResponse, error) {
glog.V(5).Infof("Using default NodeGetId")
err := ns.Driver.CheckVersion(req.GetVersion())
if err != nil {
return nil, err
}
return &csi.NodeGetIdResponse{
NodeId: ns.Driver.nodeID,
}, nil
}
func (ns *DefaultNodeServer) NodeProbe(ctx context.Context, req *csi.NodeProbeRequest) (*csi.NodeProbeResponse, error) {
glog.V(5).Infof("Using default NodeProbe")
err := ns.Driver.CheckVersion(req.GetVersion())
if err != nil {
return nil, err
}
return &csi.NodeProbeResponse{}, nil
}
func (ns *DefaultNodeServer) NodeGetCapabilities(ctx context.Context, req *csi.NodeGetCapabilitiesRequest) (*csi.NodeGetCapabilitiesResponse, error) {
glog.V(5).Infof("Using default NodeGetCapabilities")
err := ns.Driver.CheckVersion(req.GetVersion())
if err != nil {
return nil, err
}
return &csi.NodeGetCapabilitiesResponse{
Capabilities: []*csi.NodeServiceCapability{
{

View File

@ -20,7 +20,7 @@ import (
"context"
"testing"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/stretchr/testify/assert"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@ -31,15 +31,8 @@ func TestNodeGetId(t *testing.T) {
ns := NewDefaultNodeServer(d)
// Test invalid request
req := csi.NodeGetIdRequest{}
_, err := ns.NodeGetId(context.Background(), &req)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Test valid request
req.Version = &fakeVersion
req := csi.NodeGetIdRequest{}
resp, err := ns.NodeGetId(context.Background(), &req)
assert.NoError(t, err)
assert.Equal(t, resp.GetNodeId(), fakeNodeID)
@ -50,34 +43,9 @@ func TestNodeGetCapabilities(t *testing.T) {
ns := NewDefaultNodeServer(d)
// Test invalid request
// Test valid request
req := csi.NodeGetCapabilitiesRequest{}
_, err := ns.NodeGetCapabilities(context.Background(), &req)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Test valid request
req.Version = &fakeVersion
_, err = ns.NodeGetCapabilities(context.Background(), &req)
assert.NoError(t, err)
}
func TestNodeProbe(t *testing.T) {
d := NewFakeDriver()
ns := NewDefaultNodeServer(d)
// Test invalid request
req := csi.NodeProbeRequest{}
_, err := ns.NodeProbe(context.Background(), &req)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Test valid request
req.Version = &fakeVersion
_, err = ns.NodeProbe(context.Background(), &req)
assert.NoError(t, err)
}
@ -91,13 +59,6 @@ func TestNodePublishVolume(t *testing.T) {
_, err := ns.NodePublishVolume(context.Background(), &req)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Test valid node publish request
req.Version = &fakeVersion
_, err = ns.NodePublishVolume(context.Background(), &req)
s, ok = status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.Unimplemented)
}
@ -111,12 +72,5 @@ func TestNodeUnpublishVolume(t *testing.T) {
_, err := ns.NodeUnpublishVolume(context.Background(), &req)
s, ok := status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.InvalidArgument)
// Test valid node publish request
req.Version = &fakeVersion
_, err = ns.NodeUnpublishVolume(context.Background(), &req)
s, ok = status.FromError(err)
assert.True(t, ok)
assert.Equal(t, s.Code(), codes.Unimplemented)
}

View File

@ -24,7 +24,7 @@ import (
"github.com/golang/glog"
"google.golang.org/grpc"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
)
// Defines Non blocking GRPC server interfaces

View File

@ -20,7 +20,7 @@ import (
"fmt"
"strings"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/container-storage-interface/spec/lib/go/csi/v0"
"github.com/golang/glog"
"golang.org/x/net/context"
"google.golang.org/grpc"
@ -36,28 +36,6 @@ func ParseEndpoint(ep string) (string, string, error) {
return "", "", fmt.Errorf("Invalid endpoint: %v", ep)
}
func GetVersionString(v *csi.Version) string {
return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch)
}
func GetVersionFromString(v string) (*csi.Version, error) {
var major, minor, patch int32
n, err := fmt.Sscanf(v, "%d.%d.%d", &major, &minor, &patch)
if err != nil {
return nil, err
}
if n != 3 {
return nil, fmt.Errorf("Invalid format. Specify version in x.y.z format")
}
return &csi.Version{
Major: major,
Minor: minor,
Patch: patch,
}, nil
}
func NewVolumeCapabilityAccessMode(mode csi.VolumeCapability_AccessMode_Mode) *csi.VolumeCapability_AccessMode {
return &csi.VolumeCapability_AccessMode{Mode: mode}
}

View File

@ -19,39 +19,9 @@ package csicommon
import (
"testing"
"github.com/container-storage-interface/spec/lib/go/csi"
"github.com/stretchr/testify/assert"
)
func TestGetVersionFromString(t *testing.T) {
//Invalid version
_, err := GetVersionFromString("")
assert.NotNil(t, err)
v, err := GetVersionFromString("1.2.3")
assert.NoError(t, err)
assert.Equal(t, v.GetMajor(), int32(1))
assert.Equal(t, v.GetMinor(), int32(2))
assert.Equal(t, v.GetPatch(), int32(3))
// Invalid version
_, err = GetVersionFromString("1.2")
assert.NotNil(t, err)
}
func TestGetVersionString(t *testing.T) {
v := &csi.Version{
Major: 1,
Minor: 0,
Patch: 0,
}
//Invalid version
vStr := GetVersionString(v)
assert.Equal(t, vStr, "1.0.0")
}
func TestParseEndpoint(t *testing.T) {
//Valid unix domain socket endpoint