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  }