mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-26 16:20:28 +00:00
cephfs/cephuser: fixed getCephUser
output from `ceph auth -f json get` contains non-JSON data in the beginning workaround for this is searching for the start of valid JSON data (starts with "[{") and start reading from there
This commit is contained in:
parent
d09ce2d003
commit
12958d0a9a
@ -17,6 +17,8 @@ limitations under the License.
|
|||||||
package cephfs
|
package cephfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
@ -38,26 +40,47 @@ type cephEntity struct {
|
|||||||
Caps cephEntityCaps `json:"caps"`
|
Caps cephEntityCaps `json:"caps"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ent *cephEntity) toCredentials() *credentials {
|
||||||
|
return &credentials{
|
||||||
|
id: ent.Entity[len(cephEntityClientPrefix):],
|
||||||
|
key: ent.Key,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func getCephUserName(volId volumeID) string {
|
func getCephUserName(volId volumeID) string {
|
||||||
return cephUserPrefix + string(volId)
|
return cephUserPrefix + string(volId)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCephUser(userId string) (*cephEntity, error) {
|
func getCephUser(adminCr *credentials, volId volumeID) (*cephEntity, error) {
|
||||||
entityName := cephEntityClientPrefix + userId
|
entityName := cephEntityClientPrefix + getCephUserName(volId)
|
||||||
var ents []cephEntity
|
|
||||||
|
|
||||||
if err := execCommandJson(&ents, "ceph", "auth", "get", entityName); err != nil {
|
var ents []cephEntity
|
||||||
return nil, err
|
args := [...]string{
|
||||||
|
"auth", "-f", "json", "-c", getCephConfPath(volId), "-n", cephEntityClientPrefix + adminCr.id,
|
||||||
|
"get", entityName,
|
||||||
|
}
|
||||||
|
|
||||||
|
out, err := execCommand("ceph", args[:]...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("cephfs: ceph failed with following error: %s\ncephfs: ceph output: %s", err, out)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Workaround for output from `ceph auth get`
|
||||||
|
// Contains non-json data: "exported keyring for ENTITY\n\n"
|
||||||
|
offset := bytes.Index(out, []byte("[{"))
|
||||||
|
|
||||||
|
if json.NewDecoder(bytes.NewReader(out[offset:])).Decode(&ents); err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to decode json: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(ents) != 1 {
|
if len(ents) != 1 {
|
||||||
return nil, fmt.Errorf("error retrieving entity %s", entityName)
|
return nil, fmt.Errorf("got unexpected number of entities for %s: expected 1, got %d", entityName, len(ents))
|
||||||
}
|
}
|
||||||
|
|
||||||
return &ents[0], nil
|
return &ents[0], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createCephUser(volOptions *volumeOptions, cr *credentials, volId volumeID) (*cephEntity, error) {
|
func createCephUser(volOptions *volumeOptions, adminCr *credentials, volId volumeID) (*cephEntity, error) {
|
||||||
caps := cephEntityCaps{
|
caps := cephEntityCaps{
|
||||||
Mds: fmt.Sprintf("allow rw path=%s", getVolumeRootPath_ceph(volId)),
|
Mds: fmt.Sprintf("allow rw path=%s", getVolumeRootPath_ceph(volId)),
|
||||||
Mon: "allow r",
|
Mon: "allow r",
|
||||||
@ -66,7 +89,7 @@ func createCephUser(volOptions *volumeOptions, cr *credentials, volId volumeID)
|
|||||||
|
|
||||||
var ents []cephEntity
|
var ents []cephEntity
|
||||||
args := [...]string{
|
args := [...]string{
|
||||||
"auth", "-f", "json", "-c", getCephConfPath(volId), "-n", cephEntityClientPrefix + cr.id,
|
"auth", "-f", "json", "-c", getCephConfPath(volId), "-n", cephEntityClientPrefix + adminCr.id,
|
||||||
"get-or-create", cephEntityClientPrefix + getCephUserName(volId),
|
"get-or-create", cephEntityClientPrefix + getCephUserName(volId),
|
||||||
"mds", caps.Mds,
|
"mds", caps.Mds,
|
||||||
"mon", caps.Mon,
|
"mon", caps.Mon,
|
||||||
|
Loading…
Reference in New Issue
Block a user