xref: /aosp_15_r20/external/grpc-grpc-java/xds/src/main/java/io/grpc/xds/PriorityLoadBalancerProvider.java (revision e07d83d3ffcef9ecfc9f7f475418ec639ff0e5fe)
1 /*
2  * Copyright 2020 The gRPC Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package io.grpc.xds;
18 
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 
22 import com.google.common.base.MoreObjects;
23 import io.grpc.Internal;
24 import io.grpc.LoadBalancer;
25 import io.grpc.LoadBalancer.Helper;
26 import io.grpc.LoadBalancerProvider;
27 import io.grpc.NameResolver.ConfigOrError;
28 import io.grpc.Status;
29 import io.grpc.internal.ServiceConfigUtil.PolicySelection;
30 import java.util.Collections;
31 import java.util.HashSet;
32 import java.util.List;
33 import java.util.Map;
34 
35 /** Provider for priority load balancing policy. */
36 @Internal
37 public final class PriorityLoadBalancerProvider extends LoadBalancerProvider {
38 
39   @Override
isAvailable()40   public boolean isAvailable() {
41     return true;
42   }
43 
44   @Override
getPriority()45   public int getPriority() {
46     return 5;
47   }
48 
49   @Override
getPolicyName()50   public String getPolicyName() {
51     return XdsLbPolicies.PRIORITY_POLICY_NAME;
52   }
53 
54   @Override
newLoadBalancer(Helper helper)55   public LoadBalancer newLoadBalancer(Helper helper) {
56     return new PriorityLoadBalancer(helper);
57   }
58 
59   @Override
parseLoadBalancingPolicyConfig(Map<String, ?> rawConfig)60   public ConfigOrError parseLoadBalancingPolicyConfig(Map<String, ?> rawConfig) {
61     return ConfigOrError.fromError(
62         Status.INTERNAL.withDescription(getPolicyName() + " cannot be used from service config"));
63   }
64 
65   static final class PriorityLbConfig {
66     final Map<String, PriorityChildConfig> childConfigs;
67     final List<String> priorities;
68 
PriorityLbConfig(Map<String, PriorityChildConfig> childConfigs, List<String> priorities)69     PriorityLbConfig(Map<String, PriorityChildConfig> childConfigs, List<String> priorities) {
70       this.childConfigs = Collections.unmodifiableMap(checkNotNull(childConfigs, "childConfigs"));
71       this.priorities = Collections.unmodifiableList(checkNotNull(priorities, "priorities"));
72       checkArgument(!priorities.isEmpty(), "priority list is empty");
73       checkArgument(
74           childConfigs.keySet().containsAll(priorities),
75           "missing child config for at lease one of the priorities");
76       checkArgument(
77           priorities.size() == new HashSet<>(priorities).size(),
78           "duplicate names in priorities");
79       checkArgument(
80           priorities.size() == childConfigs.keySet().size(),
81           "some names in childConfigs are not referenced by priorities");
82     }
83 
84     @Override
toString()85     public String toString() {
86       return MoreObjects.toStringHelper(this)
87           .add("childConfigs", childConfigs)
88           .add("priorities", priorities)
89           .toString();
90     }
91 
92     static final class PriorityChildConfig {
93       final PolicySelection policySelection;
94       final boolean ignoreReresolution;
95 
PriorityChildConfig(PolicySelection policySelection, boolean ignoreReresolution)96       PriorityChildConfig(PolicySelection policySelection, boolean ignoreReresolution) {
97         this.policySelection = checkNotNull(policySelection, "policySelection");
98         this.ignoreReresolution = ignoreReresolution;
99       }
100 
101       @Override
toString()102       public String toString() {
103         return MoreObjects.toStringHelper(this)
104             .add("policySelection", policySelection)
105             .add("ignoreReresolution", ignoreReresolution)
106             .toString();
107       }
108     }
109   }
110 }
111