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