2 * Copyright 2020 Huawei Technologies Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
26 "github.com/apache/servicecomb-service-center/pkg/log"
27 "github.com/apache/servicecomb-service-center/pkg/util"
28 "github.com/apache/servicecomb-service-center/server/core"
29 "github.com/apache/servicecomb-service-center/server/core/proto"
30 svcerr "github.com/apache/servicecomb-service-center/server/error"
32 "mepserver/mp1/arch/workspace"
33 "mepserver/mp1/models"
34 meputil "mepserver/mp1/util"
37 type DecodeRestReq struct {
39 R *http.Request `json:"r,in"`
40 Ctx context.Context `json:"ctx,out"`
41 AppInstanceId string `json:"appInstanceId,out"`
42 SubscribeId string `json:"subscribeId,out"`
43 ServiceId string `json:"serviceId,out"`
44 RestBody interface{} `json:"restBody,out"`
47 //service request handler
48 func (t *DecodeRestReq) OnRequest(data string) workspace.TaskCode {
50 err := t.ParseBody(t.R)
52 log.Error("parse rest body failed", err)
54 return workspace.TaskFinish
57 func (t *DecodeRestReq) ParseBody(r *http.Request) error {
58 if t.RestBody == nil {
61 msg, err := ioutil.ReadAll(r.Body)
63 log.Error("read body failed", err)
64 t.SetFirstErrorCode(SerErrFailBase, err.Error())
68 newMsg, err := t.checkParam(msg)
70 log.Error("check Param failed", err)
71 t.SetFirstErrorCode(SerErrFailBase, err.Error())
75 err = json.Unmarshal(newMsg, t.RestBody)
77 log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(newMsg))
78 t.SetFirstErrorCode(SerErrFailBase, err.Error())
85 func (t *DecodeRestReq) checkParam(msg []byte) ([]byte, error) {
87 var temp map[string]interface{}
88 err := json.Unmarshal(msg, &temp)
90 log.Errorf(err, "invalid json to map: %s", util.BytesToStringWithNoCopy(msg))
91 t.SetFirstErrorCode(SerErrFailBase, err.Error())
95 meputil.SetMapValue(temp, "consumedLocalOnly", true)
96 meputil.SetMapValue(temp, "isLocal", true)
97 meputil.SetMapValue(temp, "scopeOfLocality", "MEC_HOST")
99 msg, err = json.Marshal(&temp)
101 log.Errorf(err, "invalid map to json")
102 t.SetFirstErrorCode(SerErrFailBase, err.Error())
109 func (t *DecodeRestReq) WithBody(body interface{}) *DecodeRestReq {
114 func (t *DecodeRestReq) GetParam(r *http.Request) {
115 query, _ := meputil.GetHTTPTags(r)
116 t.AppInstanceId = query.Get(":appInstanceId")
117 t.SubscribeId = query.Get(":subscriptionId")
118 t.ServiceId = query.Get(":serviceId")
119 t.Ctx = util.SetTargetDomainProject(r.Context(), r.Header.Get("X-Domain-Name"), query.Get(":project"))
122 type RegisterServiceId struct {
123 HttpErrInf *proto.Response `json:"httpErrInf,out"`
125 Ctx context.Context `json:"ctx,in"`
126 ServiceId string `json:"serviceId,out"`
127 RestBody interface{} `json:"restBody,in"`
130 func (t *RegisterServiceId) OnRequest(data string) workspace.TaskCode {
132 serviceInfo, ok := t.RestBody.(*models.ServiceInfo)
134 t.SetFirstErrorCode(1, "restbody failed")
135 return workspace.TaskFinish
137 req := &proto.CreateServiceRequest{}
138 serviceInfo.ToServiceRequest(req)
139 resp, err := core.ServiceAPI.Create(t.Ctx, req)
141 log.Errorf(err, "Service Center ServiceAPI.Create fail: %s!", err.Error())
142 t.SetFirstErrorCode(1, err.Error())
143 return workspace.TaskFinish
146 if resp.ServiceId == "" {
147 t.HttpErrInf = resp.Response
148 log.Warn("Service id empty.")
150 t.ServiceId = resp.ServiceId
151 return workspace.TaskFinish
154 type RegisterServiceInst struct {
155 HttpErrInf *proto.Response `json:"httpErrInf,out"`
157 W http.ResponseWriter `json:"w,in"`
158 Ctx context.Context `json:"ctx,in"`
159 AppInstanceId string `json:"appInstanceId,in"`
160 ServiceId string `json:"serviceId,in"`
161 InstanceId string `json:"instanceId,out"`
162 RestBody interface{} `json:"restBody,in"`
163 HttpRsp interface{} `json:"httpRsp,out"`
166 func (t *RegisterServiceInst) OnRequest(data string) workspace.TaskCode {
167 serviceInfo, ok := t.RestBody.(*models.ServiceInfo)
169 t.SetFirstErrorCode(1, "restbody failed")
170 return workspace.TaskFinish
172 req := &proto.RegisterInstanceRequest{}
173 serviceInfo.ToRegisterInstance(req)
174 req.Instance.ServiceId = t.ServiceId
175 req.Instance.Properties["appInstanceId"] = t.AppInstanceId
176 resp, err := core.InstanceAPI.Register(t.Ctx, req)
178 log.Errorf(err, "RegisterInstance fail: %s", t.ServiceId)
179 t.HttpErrInf = &proto.Response{}
180 t.HttpErrInf.Code = svcerr.ErrForbidden
181 t.HttpErrInf.Message = err.Error()
182 return workspace.TaskFinish
184 t.InstanceId = resp.InstanceId
186 //build response serviceComb use serviceId + InstanceId to mark a service instance
187 mp1SerId := t.ServiceId + t.InstanceId
188 serviceInfo.SerInstanceId = mp1SerId
189 t.HttpRsp = serviceInfo
191 location := fmt.Sprintf("/mep/mp1/v1/services/%s", mp1SerId)
192 t.W.Header().Set("Location", location)
193 return workspace.TaskFinish