syncer/service/replicator/resource/microservice.go (95 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package resource
import (
"context"
v1sync "github.com/apache/servicecomb-service-center/syncer/api/v1"
pb "github.com/go-chassis/cari/discovery"
"github.com/go-chassis/cari/pkg/errsvc"
)
const (
Microservice = "service"
)
func NewMicroservice(e *v1sync.Event) Resource {
m := µservice{
event: e,
}
m.manager = new(metadataManage)
return m
}
type microservice struct {
event *v1sync.Event
createInput *pb.CreateServiceRequest
updateInput *pb.UpdateServicePropsRequest
deleteInput *pb.DeleteServiceRequest
serviceID string
cur *pb.MicroService
manager serviceManager
defaultFailHandler
}
type serviceManager interface {
RegisterService(ctx context.Context, request *pb.CreateServiceRequest) (*pb.CreateServiceResponse, error)
GetService(ctx context.Context, in *pb.GetServiceRequest) (*pb.MicroService, error)
PutServiceProperties(ctx context.Context, request *pb.UpdateServicePropsRequest) error
UnregisterService(ctx context.Context, request *pb.DeleteServiceRequest) error
}
func (m *microservice) loadInput() error {
m.createInput = new(pb.CreateServiceRequest)
cre := newInputParam(m.createInput, func() {
m.serviceID = m.createInput.Service.ServiceId
})
m.updateInput = new(pb.UpdateServicePropsRequest)
upd := newInputParam(m.updateInput, func() {
m.serviceID = m.updateInput.ServiceId
})
m.deleteInput = new(pb.DeleteServiceRequest)
del := newInputParam(m.deleteInput, func() {
m.serviceID = m.deleteInput.ServiceId
})
return newInputLoader(
m.event,
cre,
upd,
del,
).loadInput()
}
func (m *microservice) LoadCurrentResource(ctx context.Context) *Result {
err := m.loadInput()
if err != nil {
return FailResult(err)
}
cur, err := m.manager.GetService(ctx, &pb.GetServiceRequest{
ServiceId: m.serviceID,
})
if err != nil {
if errsvc.IsErrEqualCode(err, pb.ErrServiceNotExists) {
return nil
}
return FailResult(err)
}
m.cur = cur
return nil
}
func (m *microservice) NeedOperate(ctx context.Context) *Result {
c := &checker{
curNotNil: m.cur != nil,
event: m.event,
updateTime: func() (int64, error) {
return formatUpdateTimeSecond(m.cur.ModTimestamp)
},
resourceID: m.serviceID,
}
c.tombstoneLoader = c
return c.needOperate(ctx)
}
func (m *microservice) CreateHandle(ctx context.Context) error {
_, err := m.manager.RegisterService(ctx, m.createInput)
return err
}
func (m *microservice) UpdateHandle(ctx context.Context) error {
return m.manager.PutServiceProperties(ctx, m.updateInput)
}
func (m *microservice) DeleteHandle(ctx context.Context) error {
return m.manager.UnregisterService(ctx, m.deleteInput)
}
func (m *microservice) Operate(ctx context.Context) *Result {
return newOperator(m).operate(ctx, m.event.Action)
}