github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/client/configmap.go (about)

     1  package client
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	api "k8s.io/api/core/v1"
     8  
     9  	"github.com/kubeedge/beehive/pkg/core/model"
    10  	"github.com/kubeedge/kubeedge/edge/pkg/common/message"
    11  	"github.com/kubeedge/kubeedge/edge/pkg/common/modules"
    12  	"github.com/kubeedge/kubeedge/edge/pkg/metamanager"
    13  )
    14  
    15  // ConfigMapsGetter has a method to return a ConfigMapInterface.
    16  // A group's client should implement this interface.
    17  type ConfigMapsGetter interface {
    18  	ConfigMaps(namespace string) ConfigMapsInterface
    19  }
    20  
    21  // ConfigMapsInterface has methods to work with ConfigMap resources.
    22  type ConfigMapsInterface interface {
    23  	Create(*api.ConfigMap) (*api.ConfigMap, error)
    24  	Update(*api.ConfigMap) error
    25  	Delete(name string) error
    26  	Get(name string) (*api.ConfigMap, error)
    27  }
    28  
    29  type configMaps struct {
    30  	namespace string
    31  	send      SendInterface
    32  }
    33  
    34  func newConfigMaps(namespace string, s SendInterface) *configMaps {
    35  	return &configMaps{
    36  		send:      s,
    37  		namespace: namespace,
    38  	}
    39  }
    40  
    41  func (c *configMaps) Create(cm *api.ConfigMap) (*api.ConfigMap, error) {
    42  	return nil, nil
    43  }
    44  
    45  func (c *configMaps) Update(cm *api.ConfigMap) error {
    46  	return nil
    47  }
    48  
    49  func (c *configMaps) Delete(name string) error {
    50  	return nil
    51  }
    52  
    53  func (c *configMaps) Get(name string) (*api.ConfigMap, error) {
    54  
    55  	resource := fmt.Sprintf("%s/%s/%s", c.namespace, model.ResourceTypeConfigmap, name)
    56  	configMapMsg := message.BuildMsg(modules.MetaGroup, "", modules.EdgedModuleName, resource, model.QueryOperation, nil)
    57  	msg, err := c.send.SendSync(configMapMsg)
    58  	if err != nil {
    59  		return nil, fmt.Errorf("get configmap from metaManager failed, err: %v", err)
    60  	}
    61  
    62  	var content []byte
    63  	switch msg.Content.(type) {
    64  	case []byte:
    65  		content = msg.GetContent().([]byte)
    66  	default:
    67  		content, err = json.Marshal(msg.Content)
    68  		if err != nil {
    69  			return nil, fmt.Errorf("marshal message to configmap failed, err: %v", err)
    70  		}
    71  	}
    72  
    73  	if msg.GetOperation() == model.ResponseOperation && msg.GetSource() == metamanager.MetaManagerModuleName {
    74  		return handleConfigMapFromMetaDB(content)
    75  	}
    76  	return handleConfigMapFromMetaManager(content)
    77  
    78  }
    79  
    80  func handleConfigMapFromMetaDB(content []byte) (*api.ConfigMap, error) {
    81  	var lists []string
    82  	err := json.Unmarshal([]byte(content), &lists)
    83  	if err != nil {
    84  		return nil, fmt.Errorf("unmarshal message to ConfigMap list from db failed, err: %v", err)
    85  	}
    86  
    87  	if len(lists) != 1 {
    88  		return nil, fmt.Errorf("ConfigMap length from meta db is %d", len(lists))
    89  	}
    90  
    91  	var configMap api.ConfigMap
    92  	err = json.Unmarshal([]byte(lists[0]), &configMap)
    93  	if err != nil {
    94  		return nil, fmt.Errorf("unmarshal message to ConfigMap from db failed, err: %v", err)
    95  	}
    96  	return &configMap, nil
    97  }
    98  
    99  func handleConfigMapFromMetaManager(content []byte) (*api.ConfigMap, error) {
   100  	var configMap api.ConfigMap
   101  	err := json.Unmarshal(content, &configMap)
   102  	if err != nil {
   103  		return nil, fmt.Errorf("unmarshal message to ConfigMap failed, err: %v", err)
   104  	}
   105  	return &configMap, nil
   106  }