17
17
package io .grpc .xds ;
18
18
19
19
import com .google .auto .value .AutoValue ;
20
+ import com .google .common .collect .ImmutableMap ;
20
21
import com .google .protobuf .Any ;
21
22
import com .google .protobuf .InvalidProtocolBufferException ;
22
23
import com .google .protobuf .Message ;
23
- import com .google .protobuf .util .Durations ;
24
- import io .grpc .lookup .v1 .GrpcKeyBuilder ;
25
- import io .grpc .lookup .v1 .GrpcKeyBuilder .ExtraKeys ;
26
- import io .grpc .lookup .v1 .GrpcKeyBuilder .Name ;
27
- import io .grpc .lookup .v1 .NameMatcher ;
28
- import io .grpc .lookup .v1 .RouteLookupConfig ;
29
- import io .grpc .rls .RlsProtoData ;
30
- import java .util .ArrayList ;
31
- import java .util .List ;
24
+ import io .grpc .internal .JsonParser ;
25
+ import io .grpc .internal .JsonUtil ;
26
+ import java .io .IOException ;
27
+ import java .util .Map ;
32
28
33
29
/** The ClusterSpecifierPlugin for RouteLookup policy. */
34
30
final class RouteLookupServiceClusterSpecifierPlugin implements ClusterSpecifierPlugin {
@@ -49,84 +45,49 @@ public String[] typeUrls() {
49
45
}
50
46
51
47
@ Override
48
+ @ SuppressWarnings ("unchecked" )
52
49
public ConfigOrError <RlsPluginConfig > parsePlugin (Message rawProtoMessage ) {
53
50
if (!(rawProtoMessage instanceof Any )) {
54
51
return ConfigOrError .fromError ("Invalid config type: " + rawProtoMessage .getClass ());
55
52
}
56
-
57
- Any anyMessage = (Any ) rawProtoMessage ;
58
- RouteLookupConfig configProto ;
59
- try {
60
- configProto = anyMessage .unpack (RouteLookupConfig .class );
61
- } catch (InvalidProtocolBufferException e ) {
62
- return ConfigOrError .fromError ("Invalid proto: " + e );
63
- }
64
53
try {
65
- List <GrpcKeyBuilder > keyBuildersProto = configProto .getGrpcKeybuildersList ();
66
- List <RlsProtoData .GrpcKeyBuilder > keyBuilders =
67
- new ArrayList <>(keyBuildersProto .size ());
68
- for (GrpcKeyBuilder keyBuilderProto : keyBuildersProto ) {
69
- List <Name > namesProto = keyBuilderProto .getNamesList ();
70
- List <RlsProtoData .GrpcKeyBuilder .Name > names = new ArrayList <>(namesProto .size ());
71
- for (Name nameProto : namesProto ) {
72
- if (nameProto .getMethod ().isEmpty ()) {
73
- names .add (new RlsProtoData .GrpcKeyBuilder .Name (nameProto .getService ()));
74
- } else {
75
- names .add (
76
- new RlsProtoData .GrpcKeyBuilder .Name (
77
- nameProto .getService (), nameProto .getMethod ()));
78
- }
79
- }
80
-
81
- List <NameMatcher > headersProto = keyBuilderProto .getHeadersList ();
82
- List <RlsProtoData .NameMatcher > headers = new ArrayList <>(headersProto .size ());
83
- for (NameMatcher headerProto : headersProto ) {
84
- headers .add (
85
- new RlsProtoData .NameMatcher (
86
- headerProto .getKey (), headerProto .getNamesList (),
87
- headerProto .getRequiredMatch ()));
88
- }
89
-
90
- String host = null ;
91
- String service = null ;
92
- String method = null ;
93
- if (keyBuilderProto .hasExtraKeys ()) {
94
- ExtraKeys extraKeysProto = keyBuilderProto .getExtraKeys ();
95
- host = extraKeysProto .getHost ();
96
- service = extraKeysProto .getService ();
97
- method = extraKeysProto .getMethod ();
98
- }
99
- RlsProtoData .ExtraKeys extraKeys =
100
- RlsProtoData .ExtraKeys .create (host , service , method );
101
-
102
- RlsProtoData .GrpcKeyBuilder keyBuilder =
103
- new RlsProtoData .GrpcKeyBuilder (
104
- names , headers , extraKeys , keyBuilderProto .getConstantKeysMap ());
105
- keyBuilders .add (keyBuilder );
54
+ Any anyMessage = (Any ) rawProtoMessage ;
55
+ Class <? extends Message > protoClass ;
56
+ try {
57
+ protoClass =
58
+ (Class <? extends Message >)
59
+ Class .forName ("io.grpc.lookup.v1.RouteLookupClusterSpecifier" );
60
+ } catch (ClassNotFoundException e ) {
61
+ return ConfigOrError .fromError ("Dependency for 'io.grpc:grpc-rls' is missing: " + e );
62
+ }
63
+ Message configProto ;
64
+ try {
65
+ configProto = anyMessage .unpack (protoClass );
66
+ } catch (InvalidProtocolBufferException e ) {
67
+ return ConfigOrError .fromError ("Invalid proto: " + e );
68
+ }
69
+ String jsonString = MessagePrinter .print (configProto );
70
+ try {
71
+ Map <String , ?> jsonMap = (Map <String , ?>) JsonParser .parse (jsonString );
72
+ Map <String , ?> config = JsonUtil .getObject (jsonMap , "routeLookupConfig" );
73
+ return ConfigOrError .fromConfig (RlsPluginConfig .create (config ));
74
+ } catch (IOException e ) {
75
+ return ConfigOrError .fromError (
76
+ "Unable to parse RouteLookupClusterSpecifier: " + jsonString );
106
77
}
107
- RlsProtoData .RouteLookupConfig config = new RlsProtoData .RouteLookupConfig (
108
- keyBuilders ,
109
- configProto .getLookupService (),
110
- Durations .toMillis (configProto .getLookupServiceTimeout ()),
111
- configProto .hasMaxAge () ? Durations .toMillis (configProto .getMaxAge ()) : null ,
112
- configProto .hasStaleAge () ? Durations .toMillis (configProto .getStaleAge ()) : null ,
113
- configProto .getCacheSizeBytes (),
114
- configProto .getValidTargetsList (),
115
- configProto .getDefaultTarget ());
116
- return ConfigOrError .fromConfig (RlsPluginConfig .create (config ));
117
78
} catch (RuntimeException e ) {
118
- return ConfigOrError .fromError (
119
- "Error parsing RouteLookupConfig: \n " + configProto + "\n reason: " + e );
79
+ return ConfigOrError .fromError ("Error parsing RouteLookupConfig: " + e );
120
80
}
121
81
}
122
82
123
83
@ AutoValue
124
84
abstract static class RlsPluginConfig implements PluginConfig {
125
85
126
- abstract RlsProtoData . RouteLookupConfig config ();
86
+ abstract ImmutableMap < String , ?> config ();
127
87
128
- static RlsPluginConfig create (RlsProtoData .RouteLookupConfig config ) {
129
- return new AutoValue_RouteLookupServiceClusterSpecifierPlugin_RlsPluginConfig (config );
88
+ static RlsPluginConfig create (Map <String , ?> config ) {
89
+ return new AutoValue_RouteLookupServiceClusterSpecifierPlugin_RlsPluginConfig (
90
+ ImmutableMap .copyOf (config ));
130
91
}
131
92
132
93
@ Override
0 commit comments