|
| 1 | +package services |
| 2 | + |
| 3 | +import ( |
| 4 | + "go.temporal.io/api/operatorservice/v1" |
| 5 | + "go.temporal.io/api/workflowservice/v1" |
| 6 | + "go.temporal.io/server/api/adminservice/v1" |
| 7 | + "go.temporal.io/server/common/log" |
| 8 | + "go.temporal.io/server/common/log/tag" |
| 9 | + "google.golang.org/grpc" |
| 10 | +) |
| 11 | + |
| 12 | +type variant struct { |
| 13 | + registerWorkflow func(*grpc.Server, workflowservice.WorkflowServiceServer) |
| 14 | + registerAdmin func(*grpc.Server, adminservice.AdminServiceServer) |
| 15 | + registerOperator func(*grpc.Server, operatorservice.OperatorServiceServer) |
| 16 | +} |
| 17 | + |
| 18 | +type Registration struct { |
| 19 | + Server *grpc.Server |
| 20 | + Workflow workflowservice.WorkflowServiceServer |
| 21 | + Admin adminservice.AdminServiceServer |
| 22 | + Operator operatorservice.OperatorServiceServer |
| 23 | + Variant string |
| 24 | + Logger log.Logger |
| 25 | +} |
| 26 | + |
| 27 | +// Register installs the stable frontend gRPC services, or an experimental |
| 28 | +// variant compiled into this binary. |
| 29 | +func Register(r Registration) { |
| 30 | + if err := registryError(); err != nil { |
| 31 | + r.Logger.Fatal("invalid experimental API registry", tag.Error(err)) |
| 32 | + } |
| 33 | + |
| 34 | + selected := variant{} |
| 35 | + if r.Variant == "" { |
| 36 | + registerVariant(r, selected) |
| 37 | + return |
| 38 | + } |
| 39 | + |
| 40 | + var ok bool |
| 41 | + selected, ok = get(r.Variant) |
| 42 | + if !ok { |
| 43 | + r.Logger.Fatal( |
| 44 | + "frontend.apiVariant set but variant not wired into this binary", |
| 45 | + tag.NewStringTag("variant", r.Variant), |
| 46 | + tag.NewStringsTag("compiled_in", names()), |
| 47 | + ) |
| 48 | + } |
| 49 | + |
| 50 | + registerVariant(r, selected) |
| 51 | + r.Logger.Info("Experimental API variant active", |
| 52 | + tag.NewStringTag("variant", r.Variant)) |
| 53 | +} |
| 54 | + |
| 55 | +func registerVariant(r Registration, v variant) { |
| 56 | + registerWorkflow := registerStableWorkflow |
| 57 | + if v.registerWorkflow != nil { |
| 58 | + registerWorkflow = v.registerWorkflow |
| 59 | + } |
| 60 | + registerAdmin := registerStableAdmin |
| 61 | + if v.registerAdmin != nil { |
| 62 | + registerAdmin = v.registerAdmin |
| 63 | + } |
| 64 | + registerOperator := registerStableOperator |
| 65 | + if v.registerOperator != nil { |
| 66 | + registerOperator = v.registerOperator |
| 67 | + } |
| 68 | + |
| 69 | + registerWorkflow(r.Server, r.Workflow) |
| 70 | + registerAdmin(r.Server, r.Admin) |
| 71 | + registerOperator(r.Server, r.Operator) |
| 72 | +} |
| 73 | + |
| 74 | +func registerStableWorkflow(server *grpc.Server, workflow workflowservice.WorkflowServiceServer) { |
| 75 | + workflowservice.RegisterWorkflowServiceServer(server, workflow) |
| 76 | +} |
| 77 | + |
| 78 | +func registerStableAdmin(server *grpc.Server, admin adminservice.AdminServiceServer) { |
| 79 | + adminservice.RegisterAdminServiceServer(server, admin) |
| 80 | +} |
| 81 | + |
| 82 | +func registerStableOperator(server *grpc.Server, operator operatorservice.OperatorServiceServer) { |
| 83 | + operatorservice.RegisterOperatorServiceServer(server, operator) |
| 84 | +} |
0 commit comments