github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/cloud/pkg/cloudhub/servers/udsserver/server.go (about)

     1  package udsserver
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  
     8  	"k8s.io/klog"
     9  
    10  	beehiveContext "github.com/kubeedge/beehive/pkg/core/context"
    11  	"github.com/kubeedge/beehive/pkg/core/model"
    12  	hubmodel "github.com/kubeedge/kubeedge/cloud/pkg/cloudhub/common/model"
    13  	"github.com/kubeedge/kubeedge/common/constants"
    14  )
    15  
    16  // StartServer serves
    17  func StartServer(address string) {
    18  	uds := NewUnixDomainSocket(address)
    19  	uds.SetContextHandler(func(context string) string {
    20  		// receive message from client
    21  		klog.Infof("uds server receives context: %s", context)
    22  		msg, err := ExtractMessage(context)
    23  		if err != nil {
    24  			klog.Errorf("Failed to extract message: %v", err)
    25  			return feedbackError(err, msg)
    26  		}
    27  
    28  		// Send message to edge
    29  		resp, err := beehiveContext.SendSync(hubmodel.SrcCloudHub, *msg, constants.CSISyncMsgRespTimeout)
    30  		if err != nil {
    31  			klog.Errorf("failed to send message to edge: %v", err)
    32  			return feedbackError(err, msg)
    33  		}
    34  		// Marshal response message
    35  		data, err := json.Marshal(resp)
    36  		if err != nil {
    37  			klog.Errorf("marshal response failed with error: %v", err)
    38  			return feedbackError(err, msg)
    39  		}
    40  		klog.Infof("uds server send back data: %s resp: %v", string(data), resp)
    41  		return string(data)
    42  	})
    43  
    44  	klog.Info("start unix domain socket server")
    45  	uds.StartServer()
    46  }
    47  
    48  // ExtractMessage extracts message from clients
    49  func ExtractMessage(context string) (*model.Message, error) {
    50  	var msg *model.Message
    51  	if context != "" {
    52  		err := json.Unmarshal([]byte(context), &msg)
    53  		if err != nil {
    54  			return nil, err
    55  		}
    56  	} else {
    57  		err := errors.New("failed with error: context is empty")
    58  		klog.Errorf("%v", err)
    59  		return nil, err
    60  	}
    61  	return msg, nil
    62  }
    63  
    64  // feedbackError sends back error message
    65  func feedbackError(err error, request *model.Message) string {
    66  	// Build message
    67  	errResponse := model.NewErrorMessage(request, err.Error()).SetRoute(hubmodel.SrcCloudHub, request.GetGroup())
    68  	// Marshal message
    69  	data, err := json.Marshal(errResponse)
    70  	if err != nil {
    71  		return fmt.Sprintf("feedbackError marshal failed with error: %v", err)
    72  	}
    73  	return string(data)
    74  }