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  }