/
mhnd_allocate_service_idents_req.go
69 lines (65 loc) · 2.71 KB
/
mhnd_allocate_service_idents_req.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package messageswitch
import (
"github.com/google/uuid"
qabalwrap "github.com/qabalwrap/qabalwrap-1"
qbw1grpcgen "github.com/qabalwrap/qabalwrap-1/gen/qbw1grpcgen"
)
func queueAllocateServiceIdentsRequest(spanEmitter *qabalwrap.TraceEmitter, s *MessageSwitch, m *qabalwrap.EnvelopedMessage) (err error) {
spanEmitter = spanEmitter.StartSpanWithoutMessage(s.ServiceInstanceIdent, "queue-allocate-service-idents-req")
if !s.primarySwitch {
spanEmitter.FinishSpanFailed("(queueAllocateServiceIdentsRequest) not primary switch: src=%d", m.SourceServiceIdent)
return ErrNotSupportedOperation
}
var req qbw1grpcgen.AllocateServiceIdentsRequest
if err = m.Unmarshal(&req); nil != err {
spanEmitter.FinishSpanFailed("(queueAllocateServiceIdentsRequest) cannot unpack request: %v", err)
return
}
var unassignedSrvRefs []*ServiceReference
for _, ref := range req.ServiceIdents {
uniqIdent, err := uuid.Parse(ref.UniqueIdent)
if nil != err {
spanEmitter.EventError("(queueAllocateServiceIdentsRequest) cannot parse unique identifier: %v", err)
continue
}
if ref.TextIdent == "" {
spanEmitter.EventError("(queueAllocateServiceIdentsRequest) text identifier must not empty: [%s]", ref.TextIdent)
continue
}
srvRef := &ServiceReference{
UniqueIdent: uniqIdent,
SerialIdent: qabalwrap.UnknownServiceIdent,
TextIdent: ref.TextIdent,
}
if err := srvRef.PublicKey.UnmarshalBinary(ref.PublicKey); nil != err {
spanEmitter.EventError("(queueAllocateServiceIdentsRequest) cannot load public key [%s/%s]: %v", ref.UniqueIdent, ref.TextIdent, err)
continue
}
unassignedSrvRefs = append(unassignedSrvRefs, srvRef)
}
if len(unassignedSrvRefs) == 0 {
spanEmitter.FinishSpanSuccess("empty unassigned service reference")
return
}
for _, srvRef := range unassignedSrvRefs {
s.allocateServiceIdentsRequests <- &serviceReferenceRequest{
ServiceRef: srvRef,
SpanEmitter: spanEmitter,
}
spanEmitter.EventInfo("(queueAllocateServiceIdentsRequest) push request [%s/%s] into queue.",
srvRef.TextIdent, srvRef.UniqueIdent.String())
}
spanEmitter.FinishSpanSuccessWithoutMessage()
return
}
func handleAllocateServiceIdentsRequest(s *MessageSwitch, srvRefReq *serviceReferenceRequest) {
spanEmitter := srvRefReq.SpanEmitter.StartSpanWithoutMessage(s.ServiceInstanceIdent, "hnd-allocate-service-ident")
if !s.primarySwitch {
spanEmitter.FinishSpanFailed("(handleAllocateServiceIdentsRequest) not primary switch: serviceRef=[%s/%s]",
srvRefReq.ServiceRef.TextIdent, srvRefReq.ServiceRef.UniqueIdent.String())
return
}
s.crossBar.addUnassignedServiceConnectByServiceReference(spanEmitter, srvRefReq.ServiceRef)
s.crossBar.assignServiceSerialIdents(spanEmitter)
spanEmitter.FinishSpanSuccessWithoutMessage()
}