| /* | |
| * | |
| * Copyright 2021 gRPC authors. | |
| * | |
| * Licensed 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 admin contains internal implementation for admin service. | |
| package admin | |
| import "google.golang.org/grpc" | |
| // services is a map from name to service register functions. | |
| var services []func(grpc.ServiceRegistrar) (func(), error) | |
| // AddService adds a service to the list of admin services. | |
| // | |
| // NOTE: this function must only be called during initialization time (i.e. in | |
| // an init() function), and is not thread-safe. | |
| // | |
| // If multiple services with the same service name are added (e.g. two services | |
| // for `grpc.channelz.v1.Channelz`), the server will panic on `Register()`. | |
| func AddService(f func(grpc.ServiceRegistrar) (func(), error)) { | |
| services = append(services, f) | |
| } | |
| // Register registers the set of admin services to the given server. | |
| func Register(s grpc.ServiceRegistrar) (cleanup func(), _ error) { | |
| var cleanups []func() | |
| for _, f := range services { | |
| cleanup, err := f(s) | |
| if err != nil { | |
| callFuncs(cleanups) | |
| return nil, err | |
| } | |
| if cleanup != nil { | |
| cleanups = append(cleanups, cleanup) | |
| } | |
| } | |
| return func() { | |
| callFuncs(cleanups) | |
| }, nil | |
| } | |
| func callFuncs(fs []func()) { | |
| for _, f := range fs { | |
| f() | |
| } | |
| } |