github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/client/secret.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  //SecretsGetter is interface to get client secrets
    16  type SecretsGetter interface {
    17  	Secrets(namespace string) SecretsInterface
    18  }
    19  
    20  //SecretsInterface is interface for client secret
    21  type SecretsInterface interface {
    22  	Create(*api.Secret) (*api.Secret, error)
    23  	Update(*api.Secret) error
    24  	Delete(name string) error
    25  	Get(name string) (*api.Secret, error)
    26  }
    27  
    28  type secrets struct {
    29  	namespace string
    30  	send      SendInterface
    31  }
    32  
    33  func newSecrets(namespace string, s SendInterface) *secrets {
    34  	return &secrets{
    35  		send:      s,
    36  		namespace: namespace,
    37  	}
    38  }
    39  
    40  func (c *secrets) Create(cm *api.Secret) (*api.Secret, error) {
    41  	return nil, nil
    42  }
    43  
    44  func (c *secrets) Update(cm *api.Secret) error {
    45  	return nil
    46  }
    47  
    48  func (c *secrets) Delete(name string) error {
    49  	return nil
    50  }
    51  
    52  func (c *secrets) Get(name string) (*api.Secret, error) {
    53  
    54  	resource := fmt.Sprintf("%s/%s/%s", c.namespace, model.ResourceTypeSecret, name)
    55  	secretMsg := message.BuildMsg(modules.MetaGroup, "", modules.EdgedModuleName, resource, model.QueryOperation, nil)
    56  	msg, err := c.send.SendSync(secretMsg)
    57  	if err != nil {
    58  		return nil, fmt.Errorf("get secret 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 secret failed, err: %v", err)
    69  		}
    70  	}
    71  
    72  	//op := msg.GetOperation()
    73  	if msg.GetOperation() == model.ResponseOperation && msg.GetSource() == metamanager.MetaManagerModuleName {
    74  		return handleSecretFromMetaDB(content)
    75  	}
    76  	//else
    77  	return handleSecretFromMetaManager(content)
    78  
    79  }
    80  
    81  func handleSecretFromMetaDB(content []byte) (*api.Secret, error) {
    82  	var lists []string
    83  	err := json.Unmarshal(content, &lists)
    84  	if err != nil {
    85  		return nil, fmt.Errorf("unmarshal message to secret list from db failed, err: %v", err)
    86  	}
    87  
    88  	if len(lists) != 1 {
    89  		return nil, fmt.Errorf("secret length from meta db is %d", len(lists))
    90  	}
    91  
    92  	var secret api.Secret
    93  	err = json.Unmarshal([]byte(lists[0]), &secret)
    94  	if err != nil {
    95  		return nil, fmt.Errorf("unmarshal message to secret from db failed, err: %v", err)
    96  	}
    97  	return &secret, nil
    98  }
    99  
   100  func handleSecretFromMetaManager(content []byte) (*api.Secret, error) {
   101  	var secret api.Secret
   102  	err := json.Unmarshal(content, &secret)
   103  	if err != nil {
   104  		return nil, fmt.Errorf("unmarshal message to secret failed, err: %v", err)
   105  	}
   106  	return &secret, nil
   107  }