github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/client/persistentvolume.go (about) 1 package client 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 api "k8s.io/api/core/v1" 8 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 9 10 "github.com/kubeedge/beehive/pkg/core/model" 11 "github.com/kubeedge/kubeedge/edge/pkg/common/message" 12 "github.com/kubeedge/kubeedge/edge/pkg/common/modules" 13 "github.com/kubeedge/kubeedge/edge/pkg/metamanager" 14 ) 15 16 // PersistentVolumesGetter is interface to get client PersistentVolumes 17 type PersistentVolumesGetter interface { 18 PersistentVolumes(namespace string) PersistentVolumesInterface 19 } 20 21 // PersistentVolumesInterface is interface for client PersistentVolumes 22 type PersistentVolumesInterface interface { 23 Create(*api.PersistentVolume) (*api.PersistentVolume, error) 24 Update(*api.PersistentVolume) error 25 Delete(name string) error 26 Get(name string, options metav1.GetOptions) (*api.PersistentVolume, error) 27 } 28 29 type persistentvolumes struct { 30 namespace string 31 send SendInterface 32 } 33 34 func newPersistentVolumes(n string, s SendInterface) *persistentvolumes { 35 return &persistentvolumes{ 36 namespace: n, 37 send: s, 38 } 39 } 40 41 func (c *persistentvolumes) Create(pv *api.PersistentVolume) (*api.PersistentVolume, error) { 42 return nil, nil 43 } 44 45 func (c *persistentvolumes) Update(pv *api.PersistentVolume) error { 46 return nil 47 } 48 49 func (c *persistentvolumes) Delete(name string) error { 50 return nil 51 } 52 53 func (c *persistentvolumes) Get(name string, options metav1.GetOptions) (*api.PersistentVolume, error) { 54 resource := fmt.Sprintf("%s/%s/%s", c.namespace, "persistentvolume", name) 55 pvMsg := message.BuildMsg(modules.MetaGroup, "", modules.EdgedModuleName, resource, model.QueryOperation, nil) 56 msg, err := c.send.SendSync(pvMsg) 57 if err != nil { 58 return nil, fmt.Errorf("get persistentvolume from metaManager failed, err: %v", err) 59 } 60 61 var content []byte 62 switch msg.Content.(type) { 63 case []byte: 64 content = msg.GetContent().([]byte) 65 default: 66 content, err = json.Marshal(msg.GetContent()) 67 if err != nil { 68 return nil, fmt.Errorf("marshal message to persistentvolume failed, err: %v", err) 69 } 70 } 71 72 if msg.GetOperation() == model.ResponseOperation && msg.GetSource() == metamanager.MetaManagerModuleName { 73 return handlePersistentVolumeFromMetaDB(content) 74 } 75 return handlePersistentVolumeFromMetaManager(content) 76 } 77 78 func handlePersistentVolumeFromMetaDB(content []byte) (*api.PersistentVolume, error) { 79 var lists []string 80 err := json.Unmarshal(content, &lists) 81 if err != nil { 82 return nil, fmt.Errorf("unmarshal message to persistentvolume list from db failed, err: %v", err) 83 } 84 85 if len(lists) != 1 { 86 return nil, fmt.Errorf("persistentvolume length from meta db is %d", len(lists)) 87 } 88 89 var pv *api.PersistentVolume 90 err = json.Unmarshal([]byte(lists[0]), &pv) 91 if err != nil { 92 return nil, fmt.Errorf("unmarshal message to persistentvolume from db failed, err: %v", err) 93 } 94 return pv, nil 95 } 96 97 func handlePersistentVolumeFromMetaManager(content []byte) (*api.PersistentVolume, error) { 98 var pv *api.PersistentVolume 99 err := json.Unmarshal(content, &pv) 100 if err != nil { 101 return nil, fmt.Errorf("unmarshal message to persistentvolume failed, err: %v", err) 102 } 103 return pv, nil 104 }