Merge branch 'csi-v1.0' into fix-134

This commit is contained in:
Huamin Chen 2019-02-04 10:57:56 -05:00 committed by GitHub
commit 6df22b38ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 35 additions and 29 deletions

View File

@ -9,14 +9,21 @@ branches:
go: 1.11.x go: 1.11.x
env:
global:
- GO_METALINTER_VERSION="v3.0.0"
install: install:
- curl -L https://git.io/vp6lP | sh # install gometalinter
- curl -L
"https://raw.githubusercontent.com/alecthomas/gometalinter/"${GO_METALINTER_VERSION}"/scripts/install.sh"
| bash -s -- -b $GOPATH/bin "${GO_METALINTER_VERSION}"
before_script: before_script:
- GO_FILES=$(find . -iname '*.go' -type f | grep -v /vendor/) - GO_FILES=$(find . -iname '*.go' -type f | grep -v /vendor/)
script: script:
- gometalinter --deadline=10m -j 4 --enable=megacheck --enable=misspell --vendor ./... - gometalinter --deadline=10m -j 4 --enable=misspell --enable=staticcheck --vendor ./...
- test -z $(gofmt -s -l $GO_FILES) - test -z $(gofmt -s -l $GO_FILES)
- make rbdplugin - make rbdplugin
- make cephfsplugin - make cephfsplugin

View File

@ -29,7 +29,6 @@ spec:
- name: csi-provisioner - name: csi-provisioner
image: quay.io/k8scsi/csi-provisioner:v1.0.1 image: quay.io/k8scsi/csi-provisioner:v1.0.1
args: args:
- "--provisioner=csi-cephfsplugin"
- "--csi-address=$(ADDRESS)" - "--csi-address=$(ADDRESS)"
- "--v=5" - "--v=5"
env: env:

View File

@ -27,7 +27,7 @@ spec:
serviceAccount: rbd-csi-attacher serviceAccount: rbd-csi-attacher
containers: containers:
- name: csi-rbdplugin-attacher - name: csi-rbdplugin-attacher
image: quay.io/k8scsi/csi-attacher:v1.0.0 image: quay.io/k8scsi/csi-attacher:v1.0.1
args: args:
- "--v=5" - "--v=5"
- "--csi-address=$(ADDRESS)" - "--csi-address=$(ADDRESS)"

View File

@ -27,7 +27,7 @@ spec:
serviceAccount: rbd-csi-provisioner serviceAccount: rbd-csi-provisioner
containers: containers:
- name: csi-provisioner - name: csi-provisioner
image: quay.io/k8scsi/csi-provisioner:canary image: quay.io/k8scsi/csi-provisioner:v1.0.1
args: args:
- "--csi-address=$(ADDRESS)" - "--csi-address=$(ADDRESS)"
- "--v=5" - "--v=5"

View File

@ -43,8 +43,8 @@ Parameter | Required | Description
`provisionVolume` | yes | Mode of operation. BOOL value. If `true`, a new CephFS volume will be provisioned. If `false`, an existing volume will be used. `provisionVolume` | yes | Mode of operation. BOOL value. If `true`, a new CephFS volume will be provisioned. If `false`, an existing volume will be used.
`pool` | for `provisionVolume=true` | Ceph pool into which the volume shall be created `pool` | for `provisionVolume=true` | Ceph pool into which the volume shall be created
`rootPath` | for `provisionVolume=false` | Root path of an existing CephFS volume `rootPath` | for `provisionVolume=false` | Root path of an existing CephFS volume
`csiProvisionerSecretName`, `csiNodeStageSecretName` | for Kubernetes | name of the Kubernetes Secret object containing Ceph client credentials. Both parameters should have the same value `csi.storage.k8s.io/provisioner-secret-name`, `csi.storage.k8s.io/node-stage-secret-name` | for Kubernetes | name of the Kubernetes Secret object containing Ceph client credentials. Both parameters should have the same value
`csiProvisionerSecretNamespace`, `csiNodeStageSecretNamespace` | for Kubernetes | namespaces of the above Secret objects `csi.storage.k8s.io/provisioner-secret-namespace`, `csi.storage.k8s.io/node-stage-secret-namespace` | for Kubernetes | namespaces of the above Secret objects
**Required secrets for `provisionVolume=true`:** **Required secrets for `provisionVolume=true`:**
Admin credentials are required for provisioning new volumes Admin credentials are required for provisioning new volumes

View File

@ -44,8 +44,8 @@ Parameter | Required | Description
`pool` | yes | Ceph pool into which the RBD image shall be created `pool` | yes | Ceph pool into which the RBD image shall be created
`imageFormat` | no | RBD image format. Defaults to `2`. See [man pages](http://docs.ceph.com/docs/mimic/man/8/rbd/#cmdoption-rbd-image-format) `imageFormat` | no | RBD image format. Defaults to `2`. See [man pages](http://docs.ceph.com/docs/mimic/man/8/rbd/#cmdoption-rbd-image-format)
`imageFeatures` | no | RBD image features. Available for `imageFormat=2`. CSI RBD currently supports only `layering` feature. See [man pages](http://docs.ceph.com/docs/mimic/man/8/rbd/#cmdoption-rbd-image-feature) `imageFeatures` | no | RBD image features. Available for `imageFormat=2`. CSI RBD currently supports only `layering` feature. See [man pages](http://docs.ceph.com/docs/mimic/man/8/rbd/#cmdoption-rbd-image-feature)
`csiProvisionerSecretName`, `csiNodePublishSecretName` | for Kubernetes | name of the Kubernetes Secret object containing Ceph client credentials. Both parameters should have the same value `csi.storage.k8s.io/provisioner-secret-name`, `csi.storage.k8s.io/node-publish-secret-name` | for Kubernetes | name of the Kubernetes Secret object containing Ceph client credentials. Both parameters should have the same value
`csiProvisionerSecretNamespace`, `csiNodePublishSecretNamespace` | for Kubernetes | namespaces of the above Secret objects `csi.storage.k8s.io/provisioner-secret-namespace`, `csi.storage.k8s.io/node-publish-secret-namespace` | for Kubernetes | namespaces of the above Secret objects
`mounter`| no | if set to `rbd-nbd`, use `rbd-nbd` on nodes that have `rbd-nbd` and `nbd` kernel modules to map rbd images `mounter`| no | if set to `rbd-nbd`, use `rbd-nbd` on nodes that have `rbd-nbd` and `nbd` kernel modules to map rbd images
**Required secrets:** **Required secrets:**

View File

@ -25,10 +25,10 @@ parameters:
# rootPath: /absolute/path # rootPath: /absolute/path
# The secrets have to contain user and/or Ceph admin credentials. # The secrets have to contain user and/or Ceph admin credentials.
csiProvisionerSecretName: csi-cephfs-secret csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
csiProvisionerSecretNamespace: default csi.storage.k8s.io/provisioner-secret-namespace: default
csiNodeStageSecretName: csi-cephfs-secret csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
csiNodeStageSecretNamespace: default csi.storage.k8s.io/node-stage-secret-namespace: default
# (optional) The driver can use either ceph-fuse (fuse) or ceph kernel client (kernel) # (optional) The driver can use either ceph-fuse (fuse) or ceph kernel client (kernel)
# If omitted, default volume mounter will be used - this is determined by probing for ceph-fuse # If omitted, default volume mounter will be used - this is determined by probing for ceph-fuse

View File

@ -24,10 +24,10 @@ parameters:
imageFeatures: layering imageFeatures: layering
# The secrets have to contain Ceph admin credentials. # The secrets have to contain Ceph admin credentials.
csiProvisionerSecretName: csi-rbd-secret csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csiProvisionerSecretNamespace: default csi.storage.k8s.io/provisioner-secret-namespace: default
csiNodePublishSecretName: csi-rbd-secret csi.storage.k8s.io/node-publish-secret-name: csi-rbd-secret
csiNodePublishSecretNamespace: default csi.storage.k8s.io/node-publish-secret-namespace: default
# Ceph users for operating RBD # Ceph users for operating RBD
adminid: admin adminid: admin

View File

@ -34,7 +34,7 @@ type volumeOptions struct {
func validateNonEmptyField(field, fieldName string) error { func validateNonEmptyField(field, fieldName string) error {
if field == "" { if field == "" {
return fmt.Errorf("Parameter '%s' cannot be empty", fieldName) return fmt.Errorf("parameter '%s' cannot be empty", fieldName)
} }
return nil return nil
@ -53,7 +53,7 @@ func (o *volumeOptions) validate() error {
} }
} else { } else {
if o.ProvisionVolume { if o.ProvisionVolume {
return fmt.Errorf("Non-empty field rootPath is in conflict with provisionVolume=true") return fmt.Errorf("non-empty field rootPath is in conflict with provisionVolume=true")
} }
} }
@ -75,7 +75,7 @@ func (o *volumeOptions) validate() error {
func extractOption(dest *string, optionLabel string, options map[string]string) error { func extractOption(dest *string, optionLabel string, options map[string]string) error {
opt, ok := options[optionLabel] opt, ok := options[optionLabel]
if !ok { if !ok {
return fmt.Errorf("Missing required field %s", optionLabel) return fmt.Errorf("missing required field %s", optionLabel)
} }
*dest = opt *dest = opt
@ -87,7 +87,7 @@ func validateMounter(m string) error {
case volumeMounterFuse: case volumeMounterFuse:
case volumeMounterKernel: case volumeMounterKernel:
default: default:
return fmt.Errorf("Unknown mounter '%s'. Valid options are 'fuse' and 'kernel'", m) return fmt.Errorf("unknown mounter '%s'. Valid options are 'fuse' and 'kernel'", m)
} }
return nil return nil
@ -134,7 +134,7 @@ func extractNewVolOpt(opts *volumeOptions, volOpt map[string]string) error {
} }
if opts.ProvisionVolume, err = strconv.ParseBool(provisionVolumeBool); err != nil { if opts.ProvisionVolume, err = strconv.ParseBool(provisionVolumeBool); err != nil {
return fmt.Errorf("Failed to parse provisionVolume: %v", err) return fmt.Errorf("failed to parse provisionVolume: %v", err)
} }
if opts.ProvisionVolume { if opts.ProvisionVolume {

View File

@ -338,7 +338,7 @@ func (cs *ControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateS
return nil, status.Errorf(codes.NotFound, "Source Volume ID %s cannot found", req.GetSourceVolumeId()) return nil, status.Errorf(codes.NotFound, "Source Volume ID %s cannot found", req.GetSourceVolumeId())
} }
if !hasSnapshotFeature(rbdVolume.ImageFeatures) { if !hasSnapshotFeature(rbdVolume.ImageFeatures) {
return nil, fmt.Errorf("Volume(%s) has not snapshot feature(layering)", req.GetSourceVolumeId()) return nil, fmt.Errorf("volume(%s) has not snapshot feature(layering)", req.GetSourceVolumeId())
} }
rbdSnap.VolName = rbdVolume.VolName rbdSnap.VolName = rbdVolume.VolName
@ -437,7 +437,7 @@ func (cs *ControllerServer) doSnapshot(rbdSnap *rbdSnapshot, secret map[string]s
if err != nil { if err != nil {
return fmt.Errorf("snapshot is created but failed to protect and delete snapshot: %v", err) return fmt.Errorf("snapshot is created but failed to protect and delete snapshot: %v", err)
} }
return fmt.Errorf("Snapshot is created but failed to protect snapshot") return fmt.Errorf("snapshot is created but failed to protect snapshot")
} }
} }
return nil return nil

View File

@ -299,7 +299,7 @@ func createPath(volOpt *rbdVolume, userID string, creds map[string]string) (stri
} }
devicePath, found := waitForPath(volOpt.Pool, image, 10, useNBD) devicePath, found := waitForPath(volOpt.Pool, image, 10, useNBD)
if !found { if !found {
return "", fmt.Errorf("Could not map image %s, Timeout after 10s", imagePath) return "", fmt.Errorf("could not map image %s, Timeout after 10s", imagePath)
} }
return devicePath, nil return devicePath, nil
} }

View File

@ -231,13 +231,13 @@ func getRBDVolumeOptions(volOptions map[string]string) (*rbdVolume, error) {
rbdVol := &rbdVolume{} rbdVol := &rbdVolume{}
rbdVol.Pool, ok = volOptions["pool"] rbdVol.Pool, ok = volOptions["pool"]
if !ok { if !ok {
return nil, fmt.Errorf("Missing required parameter pool") return nil, fmt.Errorf("missing required parameter pool")
} }
rbdVol.Monitors, ok = volOptions["monitors"] rbdVol.Monitors, ok = volOptions["monitors"]
if !ok { if !ok {
// if mons are not set in options, check if they are set in secret // if mons are not set in options, check if they are set in secret
if rbdVol.MonValueFromSecret, ok = volOptions["monValueFromSecret"]; !ok { if rbdVol.MonValueFromSecret, ok = volOptions["monValueFromSecret"]; !ok {
return nil, fmt.Errorf("Either monitors or monValueFromSecret must be set") return nil, fmt.Errorf("either monitors or monValueFromSecret must be set")
} }
} }
rbdVol.ImageFormat, ok = volOptions["imageFormat"] rbdVol.ImageFormat, ok = volOptions["imageFormat"]
@ -283,13 +283,13 @@ func getRBDSnapshotOptions(snapOptions map[string]string) (*rbdSnapshot, error)
rbdSnap := &rbdSnapshot{} rbdSnap := &rbdSnapshot{}
rbdSnap.Pool, ok = snapOptions["pool"] rbdSnap.Pool, ok = snapOptions["pool"]
if !ok { if !ok {
return nil, fmt.Errorf("Missing required parameter pool") return nil, fmt.Errorf("missing required parameter pool")
} }
rbdSnap.Monitors, ok = snapOptions["monitors"] rbdSnap.Monitors, ok = snapOptions["monitors"]
if !ok { if !ok {
// if mons are not set in options, check if they are set in secret // if mons are not set in options, check if they are set in secret
if rbdSnap.MonValueFromSecret, ok = snapOptions["monValueFromSecret"]; !ok { if rbdSnap.MonValueFromSecret, ok = snapOptions["monValueFromSecret"]; !ok {
return nil, fmt.Errorf("Either monitors or monValueFromSecret must be set") return nil, fmt.Errorf("either monitors or monValueFromSecret must be set")
} }
} }
rbdSnap.AdminID, ok = snapOptions["adminid"] rbdSnap.AdminID, ok = snapOptions["adminid"]