dubbo.apache.org/dubbo-go/v3@v3.1.1/xds/balancer/priority/config.go (about) 1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /* 19 * 20 * Copyright 2021 gRPC authors. 21 * 22 */ 23 24 package priority 25 26 import ( 27 "encoding/json" 28 "fmt" 29 ) 30 31 import ( 32 "google.golang.org/grpc/serviceconfig" 33 ) 34 35 import ( 36 internalserviceconfig "dubbo.apache.org/dubbo-go/v3/xds/utils/serviceconfig" 37 ) 38 39 // Child is a child of priority balancer. 40 type Child struct { 41 Config *internalserviceconfig.BalancerConfig `json:"config,omitempty"` 42 IgnoreReresolutionRequests bool `json:"ignoreReresolutionRequests,omitempty"` 43 } 44 45 // LBConfig represents priority balancer's config. 46 type LBConfig struct { 47 serviceconfig.LoadBalancingConfig `json:"-"` 48 49 // Children is a map from the child balancer names to their configs. Child 50 // names can be found in field Priorities. 51 Children map[string]*Child `json:"children,omitempty"` 52 // Priorities is a list of child balancer names. They are sorted from 53 // highest priority to low. The type/config for each child can be found in 54 // field Children, with the balancer name as the key. 55 Priorities []string `json:"priorities,omitempty"` 56 } 57 58 func parseConfig(c json.RawMessage) (*LBConfig, error) { 59 var cfg LBConfig 60 if err := json.Unmarshal(c, &cfg); err != nil { 61 return nil, err 62 } 63 64 prioritiesSet := make(map[string]bool) 65 for _, name := range cfg.Priorities { 66 if _, ok := cfg.Children[name]; !ok { 67 return nil, fmt.Errorf("LB policy name %q found in Priorities field (%v) is not found in Children field (%+v)", name, cfg.Priorities, cfg.Children) 68 } 69 prioritiesSet[name] = true 70 } 71 for name := range cfg.Children { 72 if _, ok := prioritiesSet[name]; !ok { 73 return nil, fmt.Errorf("LB policy name %q found in Children field (%v) is not found in Priorities field (%+v)", name, cfg.Children, cfg.Priorities) 74 } 75 } 76 return &cfg, nil 77 }