| /* |
| * 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. |
| */ |
| |
| /* |
| * |
| * Copyright 2021 gRPC authors. |
| * |
| */ |
| |
| // Package clusterspecifier contains the ClusterSpecifier interface and a registry for |
| // storing and retrieving their implementations. |
| package clusterspecifier |
| |
| import ( |
| "github.com/golang/protobuf/proto" |
| ) |
| |
| // BalancerConfig is the Go Native JSON representation of a balancer |
| // configuration. |
| type BalancerConfig []map[string]interface{} |
| |
| // ClusterSpecifier defines the parsing functionality of a Cluster Specifier. |
| type ClusterSpecifier interface { |
| // TypeURLs are the proto message types supported by this |
| // ClusterSpecifierPlugin. A ClusterSpecifierPlugin will be registered by |
| // each of its supported message types. |
| TypeURLs() []string |
| // ParseClusterSpecifierConfig parses the provided configuration |
| // proto.Message from the top level RDS configuration. The resulting |
| // BalancerConfig will be used as configuration for a child LB Policy of the |
| // Cluster Manager LB Policy. |
| ParseClusterSpecifierConfig(proto.Message) (BalancerConfig, error) |
| } |
| |
| var ( |
| // m is a map from scheme to filter. |
| m = make(map[string]ClusterSpecifier) |
| ) |
| |
| // Register registers the ClusterSpecifierPlugin to the ClusterSpecifier map. |
| // cs.TypeURLs() will be used as the types for this ClusterSpecifierPlugin. |
| // |
| // NOTE: this function must only be called during initialization time (i.e. in |
| // an init() function), and is not thread-safe. If multiple cluster specifier |
| // plugins are registered with the same type URL, the one registered last will |
| // take effect. |
| func Register(cs ClusterSpecifier) { |
| for _, u := range cs.TypeURLs() { |
| m[u] = cs |
| } |
| } |
| |
| // Get returns the ClusterSpecifier registered with typeURL. |
| // |
| // If no cluster specifier is registered with typeURL, nil will be returned. |
| func Get(typeURL string) ClusterSpecifier { |
| return m[typeURL] |
| } |