xref: /aosp_15_r20/external/grpc-grpc-java/xds/src/main/java/io/grpc/xds/FaultConfig.java (revision e07d83d3ffcef9ecfc9f7f475418ec639ff0e5fe)
1 /*
2  * Copyright 2021 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.checkNotNull;
20 
21 import com.google.auto.value.AutoValue;
22 import io.grpc.Status;
23 import io.grpc.xds.Filter.FilterConfig;
24 import javax.annotation.Nullable;
25 
26 /** Fault injection configurations. */
27 @AutoValue
28 abstract class FaultConfig implements FilterConfig {
29   @Nullable
faultDelay()30   abstract FaultDelay faultDelay();
31 
32   @Nullable
faultAbort()33   abstract FaultAbort faultAbort();
34 
35   @Nullable
maxActiveFaults()36   abstract Integer maxActiveFaults();
37 
38   @Override
typeUrl()39   public final String typeUrl() {
40     return FaultFilter.TYPE_URL;
41   }
42 
create( @ullable FaultDelay faultDelay, @Nullable FaultAbort faultAbort, @Nullable Integer maxActiveFaults)43   static FaultConfig create(
44       @Nullable FaultDelay faultDelay, @Nullable FaultAbort faultAbort,
45       @Nullable Integer maxActiveFaults) {
46     return new AutoValue_FaultConfig(faultDelay, faultAbort, maxActiveFaults);
47   }
48 
49   /** Fault configurations for aborting requests. */
50   @AutoValue
51   abstract static class FaultDelay {
52     @Nullable
delayNanos()53     abstract Long delayNanos();
54 
headerDelay()55     abstract boolean headerDelay();
56 
percent()57     abstract FractionalPercent percent();
58 
forFixedDelay(long delayNanos, FractionalPercent percent)59     static FaultDelay forFixedDelay(long delayNanos, FractionalPercent percent) {
60       return FaultDelay.create(delayNanos, false, percent);
61     }
62 
forHeader(FractionalPercent percentage)63     static FaultDelay forHeader(FractionalPercent percentage) {
64       return FaultDelay.create(null, true, percentage);
65     }
66 
create( @ullable Long delayNanos, boolean headerDelay, FractionalPercent percent)67     private static FaultDelay create(
68         @Nullable Long delayNanos, boolean headerDelay, FractionalPercent percent) {
69       return new AutoValue_FaultConfig_FaultDelay(delayNanos, headerDelay, percent);
70     }
71   }
72 
73   /** Fault configurations for delaying requests. */
74   @AutoValue
75   abstract static class FaultAbort {
76     @Nullable
status()77     abstract Status status();
78 
headerAbort()79     abstract boolean headerAbort();
80 
percent()81     abstract FractionalPercent percent();
82 
forStatus(Status status, FractionalPercent percent)83     static FaultAbort forStatus(Status status, FractionalPercent percent) {
84       checkNotNull(status, "status");
85       return FaultAbort.create(status, false, percent);
86     }
87 
forHeader(FractionalPercent percent)88     static FaultAbort forHeader(FractionalPercent percent) {
89       return FaultAbort.create(null, true, percent);
90     }
91 
create( @ullable Status status, boolean headerAbort, FractionalPercent percent)92     private static FaultAbort create(
93         @Nullable Status status, boolean headerAbort, FractionalPercent percent) {
94       return new AutoValue_FaultConfig_FaultAbort(status, headerAbort, percent);
95     }
96   }
97 
98   @AutoValue
99   abstract static class FractionalPercent {
100     enum DenominatorType {
101       HUNDRED, TEN_THOUSAND, MILLION
102     }
103 
numerator()104     abstract int numerator();
105 
denominatorType()106     abstract DenominatorType denominatorType();
107 
perHundred(int numerator)108     static FractionalPercent perHundred(int numerator) {
109       return FractionalPercent.create(numerator, DenominatorType.HUNDRED);
110     }
111 
perTenThousand(int numerator)112     static FractionalPercent perTenThousand(int numerator) {
113       return FractionalPercent.create(numerator, DenominatorType.TEN_THOUSAND);
114     }
115 
perMillion(int numerator)116     static FractionalPercent perMillion(int numerator) {
117       return FractionalPercent.create(numerator, DenominatorType.MILLION);
118     }
119 
create( int numerator, DenominatorType denominatorType)120     static FractionalPercent create(
121         int numerator, DenominatorType denominatorType) {
122       return new AutoValue_FaultConfig_FractionalPercent(numerator, denominatorType);
123     }
124   }
125 }
126