diff --git a/go.mod b/go.mod index ddf87273f1e..7d6961bdb7d 100644 --- a/go.mod +++ b/go.mod @@ -211,3 +211,5 @@ exclude ( // This tag doesn't exist, but is imported by github.com/portworx/sched-ops. github.com/kubernetes-incubator/external-storage v0.20.4-openstorage-rc2 ) + +replace github.com/ceph/go-ceph => github.com/pkalever/go-ceph v0.15.1-0.20220519063010-0878b3a3b0c1 diff --git a/go.sum b/go.sum index 522e9e06323..414d6fb08f6 100644 --- a/go.sum +++ b/go.sum @@ -182,8 +182,6 @@ github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3 github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/centrify/cloud-golang-sdk v0.0.0-20190214225812-119110094d0f/go.mod h1:C0rtzmGXgN78pYR0tGJFhtHgkbAs0lIbHwkB81VxDQE= -github.com/ceph/go-ceph v0.15.0 h1:ILB3NaLWOtt4u/2d8I8HZTC4Ycm1PsOYVar3IFU1xlo= -github.com/ceph/go-ceph v0.15.0/go.mod h1:mafFpf5Vg8Ai8Bd+FAMvKBHLmtdpTXdRP/TNq8XWegY= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -404,9 +402,9 @@ github.com/gocql/gocql v0.0.0-20190402132108-0e1d5de854df/go.mod h1:4Fw1eo5iaEhD github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -938,6 +936,8 @@ github.com/pierrec/lz4 v2.2.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI= github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkalever/go-ceph v0.15.1-0.20220519063010-0878b3a3b0c1 h1:mLvR1zIWUqU6wzbyIHZUc7opGinNtoHA7KhPaUJu8Xg= +github.com/pkalever/go-ceph v0.15.1-0.20220519063010-0878b3a3b0c1/go.mod h1:wCA4fBhRgUBlA0jWcwQ8ojhkXv5JkdnJFM2G65oPKLM= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1394,7 +1394,6 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/vendor/github.com/ceph/go-ceph/cephfs/admin/fsadmin.go b/vendor/github.com/ceph/go-ceph/cephfs/admin/fsadmin.go index 03b3323aea9..28f39f3d7fc 100644 --- a/vendor/github.com/ceph/go-ceph/cephfs/admin/fsadmin.go +++ b/vendor/github.com/ceph/go-ceph/cephfs/admin/fsadmin.go @@ -93,6 +93,15 @@ func parseListNames(res response) ([]string, error) { return vl, nil } +func parseListKeyValues(res response) (map[string]string, error) { + var x map[string]string + if err := res.NoStatus().Unmarshal(&x).End(); err != nil { + return nil, err + } + + return x, nil +} + // parsePathResponse returns a cleaned up path from requests that get a path // unless an error is encountered, then an error is returned. func parsePathResponse(res response) (string, error) { diff --git a/vendor/github.com/ceph/go-ceph/cephfs/admin/metadata.go b/vendor/github.com/ceph/go-ceph/cephfs/admin/metadata.go new file mode 100644 index 00000000000..0b98838a118 --- /dev/null +++ b/vendor/github.com/ceph/go-ceph/cephfs/admin/metadata.go @@ -0,0 +1,109 @@ +//go:build !(nautilus || octopus) && ceph_preview && ceph_ci_untested +// +build !nautilus,!octopus,ceph_preview,ceph_ci_untested + +package admin + +import "C" + +// GetMetadata gets custom metadata on the subvolume in a volume belonging to +// an optional subvolume group based on provided key name. +// PREVIEW +// +// Similar To: +// ceph fs subvolume metadata get [--group_name ] +func (fsa *FSAdmin) GetMetadata(volume, group, subvolume, key string) (string, error) { + m := map[string]string{ + "prefix": "fs subvolume metadata get", + "format": "json", + "vol_name": volume, + "sub_name": subvolume, + "key_name": key, + } + + if group != NoGroup { + m["group_name"] = group + } + + return parsePathResponse(fsa.marshalMgrCommand(m)) +} + +// SetMetadata sets custom metadata on the subvolume in a volume belonging to +// an optional subvolume group as a key-value pair. +// PREVIEW +// +// Similar To: +// ceph fs subvolume metadata set [--group_name ] +func (fsa *FSAdmin) SetMetadata(volume, group, subvolume, key, value string) error { + m := map[string]string{ + "prefix": "fs subvolume metadata set", + "format": "json", + "vol_name": volume, + "sub_name": subvolume, + "key_name": key, + "value": value, + } + + if group != NoGroup { + m["group_name"] = group + } + + return fsa.marshalMgrCommand(m).NoData().End() +} + +// RemoveMetadata removes custom metadata set on the subvolume in a volume +// belonging to an optional subvolume group using the metadata key. +// PREVIEW +// +// Similar To: +// ceph fs subvolume metadata rm [--group_name ] +func (fsa *FSAdmin) RemoveMetadata(volume, group, subvolume, key string) error { + return fsa.rmSubVolumeMetadata(volume, group, subvolume, key, commonRmFlags{}) +} + +// ForceRemoveMetadata attempt to forcefully remove custom metadata set on +// the subvolume in a volume belonging to an optional subvolume group using +// the metadata key. +// PREVIEW +// +// Similar To: +// ceph fs subvolume metadata rm [--group_name ] --force +func (fsa *FSAdmin) ForceRemoveMetadata(volume, group, subvolume, key string) error { + return fsa.rmSubVolumeMetadata(volume, group, subvolume, key, commonRmFlags{force: true}) +} + +func (fsa *FSAdmin) rmSubVolumeMetadata(volume, group, subvolume, key string, o commonRmFlags) error { + m := map[string]string{ + "prefix": "fs subvolume metadata rm", + "format": "json", + "vol_name": volume, + "sub_name": subvolume, + "key_name": key, + } + + if group != NoGroup { + m["group_name"] = group + } + + return fsa.marshalMgrCommand(mergeFlags(m, o)).NoData().End() +} + +// ListMetadata lists custom metadata (key-value pairs) set on the subvolume +// in a volume belonging to an optional subvolume group. +// PREVIEW +// +// Similar To: +// ceph fs subvolume metadata ls [--group_name ] +func (fsa *FSAdmin) ListMetadata(volume, group, subvolume string) (map[string]string, error) { + m := map[string]string{ + "prefix": "fs subvolume metadata ls", + "format": "json", + "vol_name": volume, + "sub_name": subvolume, + } + + if group != NoGroup { + m["group_name"] = group + } + + return parseListKeyValues(fsa.marshalMgrCommand(m)) +} diff --git a/vendor/github.com/ceph/go-ceph/cephfs/admin/volume.go b/vendor/github.com/ceph/go-ceph/cephfs/admin/volume.go index 3131892c23e..d2f57420c55 100644 --- a/vendor/github.com/ceph/go-ceph/cephfs/admin/volume.go +++ b/vendor/github.com/ceph/go-ceph/cephfs/admin/volume.go @@ -2,6 +2,7 @@ package admin import ( "bytes" + "encoding/json" ) var ( @@ -114,8 +115,40 @@ type VolumeStatus struct { Pools []VolumePool `json:"pools"` } -func parseVolumeStatus(res response) (*VolumeStatus, error) { - var vs VolumeStatus +type mdsVersionField struct { + Version string + Items []struct { + Version string `json:"version"` + } +} + +func (m *mdsVersionField) UnmarshalJSON(data []byte) (err error) { + if err = json.Unmarshal(data, &m.Version); err == nil { + return + } + return json.Unmarshal(data, &m.Items) +} + +// volumeStatusResponse deals with the changing output of the mgr +// api json +type volumeStatusResponse struct { + Pools []VolumePool `json:"pools"` + MDSVersion mdsVersionField `json:"mds_version"` +} + +func (v *volumeStatusResponse) volumeStatus() *VolumeStatus { + vstatus := &VolumeStatus{} + vstatus.Pools = v.Pools + if v.MDSVersion.Version != "" { + vstatus.MDSVersion = v.MDSVersion.Version + } else if len(v.MDSVersion.Items) > 0 { + vstatus.MDSVersion = v.MDSVersion.Items[0].Version + } + return vstatus +} + +func parseVolumeStatus(res response) (*volumeStatusResponse, error) { + var vs volumeStatusResponse res = res.NoStatus() if !res.Ok() { return nil, res.End() @@ -142,5 +175,9 @@ func (fsa *FSAdmin) VolumeStatus(name string) (*VolumeStatus, error) { "prefix": "fs status", "format": "json", }) - return parseVolumeStatus(res) + v, err := parseVolumeStatus(res) + if err != nil { + return nil, err + } + return v.volumeStatus(), nil } diff --git a/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer.go b/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer.go index b7cbf9b6dd0..d74cd2bcfcf 100644 --- a/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer.go +++ b/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer.go @@ -1,5 +1,5 @@ -//go:build ptrguard -// +build ptrguard +//go:build !no_ptrguard +// +build !no_ptrguard package cutil diff --git a/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer_memcpy.go b/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer_memcpy.go index 96fb32d64c2..cde47c9e9a4 100644 --- a/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer_memcpy.go +++ b/vendor/github.com/ceph/go-ceph/internal/cutil/sync_buffer_memcpy.go @@ -1,5 +1,5 @@ -//go:build !ptrguard -// +build !ptrguard +//go:build no_ptrguard +// +build no_ptrguard package cutil diff --git a/vendor/github.com/ceph/go-ceph/rados/ioctx.go b/vendor/github.com/ceph/go-ceph/rados/ioctx.go index f05251942cf..807552623db 100644 --- a/vendor/github.com/ceph/go-ceph/rados/ioctx.go +++ b/vendor/github.com/ceph/go-ceph/rados/ioctx.go @@ -43,6 +43,11 @@ const ( // CreateIdempotent if used with IOContext.Create() and the object // already exists, the function will not return an error. CreateIdempotent = C.LIBRADOS_CREATE_IDEMPOTENT + + defaultListObjectsResultSize = 1000 + // listEndSentinel is the value returned by rados_list_object_list_is_end + // when a cursor has reached the end of a pool + listEndSentinel = 1 ) //revive:disable:var-naming old-yet-exported public api @@ -302,22 +307,36 @@ type ObjectListFunc func(oid string) // RadosAllNamespaces before calling this function to return objects from all // namespaces func (ioctx *IOContext) ListObjects(listFn ObjectListFunc) error { - var ctx C.rados_list_ctx_t - ret := C.rados_nobjects_list_open(ioctx.ioctx, &ctx) - if ret < 0 { - return getError(ret) + pageResults := C.size_t(defaultListObjectsResultSize) + var filterLen C.size_t + results := make([]C.rados_object_list_item, pageResults) + + next := C.rados_object_list_begin(ioctx.ioctx) + if next == nil { + return ErrNotFound } - defer func() { C.rados_nobjects_list_close(ctx) }() + defer C.rados_object_list_cursor_free(ioctx.ioctx, next) + finish := C.rados_object_list_end(ioctx.ioctx) + if finish == nil { + return ErrNotFound + } + defer C.rados_object_list_cursor_free(ioctx.ioctx, finish) for { - var cEntry *C.char - ret := C.rados_nobjects_list_next(ctx, &cEntry, nil, nil) - if ret == -C.ENOENT { - return nil - } else if ret < 0 { + ret := C.rados_object_list(ioctx.ioctx, next, finish, pageResults, nil, filterLen, (*C.rados_object_list_item)(unsafe.Pointer(&results[0])), &next) + if ret < 0 { return getError(ret) } - listFn(C.GoString(cEntry)) + + numEntries := int(ret) + for i := 0; i < numEntries; i++ { + item := results[i] + listFn(C.GoStringN(item.oid, (C.int)(item.oid_length))) + } + + if C.rados_object_list_is_end(ioctx.ioctx, next) == listEndSentinel { + return nil + } } } diff --git a/vendor/github.com/ceph/go-ceph/rbd/snapshot_rename.go b/vendor/github.com/ceph/go-ceph/rbd/snapshot_rename.go new file mode 100644 index 00000000000..6e98cf49381 --- /dev/null +++ b/vendor/github.com/ceph/go-ceph/rbd/snapshot_rename.go @@ -0,0 +1,38 @@ +//go:build ceph_preview +// +build ceph_preview + +package rbd + +// #cgo LDFLAGS: -lrbd +// #include +// #include +import "C" + +import ( + "unsafe" +) + +// Rename a snapshot. +// PREVIEW +// +// Implements: +// int rbd_snap_rename(rbd_image_t image, const char *snapname, +// const char* dstsnapsname); +func (snapshot *Snapshot) Rename(destName string) error { + if err := snapshot.validate(imageNeedsIOContext | imageIsOpen | imageNeedsName | snapshotNeedsName); err != nil { + return err + } + + cSrcName := C.CString(snapshot.name) + cDestName := C.CString(destName) + defer C.free(unsafe.Pointer(cSrcName)) + defer C.free(unsafe.Pointer(cDestName)) + + err := C.rbd_snap_rename(snapshot.image.image, cSrcName, cDestName) + if err != 0 { + return getError(err) + } + + snapshot.name = destName + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 0eb94cd8a45..cff40e18eb2 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -119,7 +119,7 @@ github.com/cenkalti/backoff/v3 github.com/ceph/ceph-csi/api/deploy/kubernetes/nfs github.com/ceph/ceph-csi/api/deploy/kubernetes/rbd github.com/ceph/ceph-csi/api/deploy/ocp -# github.com/ceph/go-ceph v0.15.0 +# github.com/ceph/go-ceph v0.15.0 => github.com/pkalever/go-ceph v0.15.1-0.20220519063010-0878b3a3b0c1 ## explicit; go 1.12 github.com/ceph/go-ceph/cephfs/admin github.com/ceph/go-ceph/common/admin/manager @@ -1382,3 +1382,4 @@ sigs.k8s.io/yaml # k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.24.0 # k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.24.0 # layeh.com/radius => github.com/layeh/radius v0.0.0-20190322222518-890bc1058917 +# github.com/ceph/go-ceph => github.com/pkalever/go-ceph v0.15.1-0.20220519063010-0878b3a3b0c1