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 }