diff --git a/.gitignore b/.gitignore index 9f11b755..e5b22c33 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .idea/ +.vscode/ +__pycache__ diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..8b4706f2 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,5 @@ +# Lines starting with '#' are comments. +# Each line is a file pattern followed by one or more owners. + +# These owners will be the default owners for everything in the repo. +* @thrawn01 diff --git a/python/gubernator/__init__.py b/python/gubernator/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/gubernator/client.py b/python/gubernator/client.py new file mode 100644 index 00000000..e3bb4caa --- /dev/null +++ b/python/gubernator/client.py @@ -0,0 +1,14 @@ +import gubernator.pb.ratelimit_pb2 as pb +import gubernator.pb.ratelimit_pb2_grpc as pb_grpc +import grpc + + +class Client(object): + def __init__(self, endpoint='127.0.0.1:9090', timeout=None, + username=None, password=None): + channel = grpc.insecure_channel(endpoint) + print(dir(pb)) + self.stub = pb_grpc.RateLimitServiceStub(channel) + + def ping(self): + print(self.stub.Ping(pb.HealthCheckRequest())) diff --git a/python/gubernator/pb/__init__.py b/python/gubernator/pb/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/gubernator/pb/peers_pb2.py b/python/gubernator/pb/peers_pb2.py new file mode 100644 index 00000000..eec24fc6 --- /dev/null +++ b/python/gubernator/pb/peers_pb2.py @@ -0,0 +1,137 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: peers.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +import ratelimit_pb2 as ratelimit__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='peers.proto', + package='pb.gubernator', + syntax='proto3', + serialized_options=_b('Z\002pb\200\001\001'), + serialized_pb=_b('\n\x0bpeers.proto\x12\rpb.gubernator\x1a\x0fratelimit.proto\"L\n\x14PeerRateLimitRequest\x12\x34\n\x0brate_limits\x18\x01 \x03(\x0b\x32\x1f.pb.gubernator.RateLimitRequest\"N\n\x15PeerRateLimitResponse\x12\x35\n\x0brate_limits\x18\x01 \x03(\x0b\x32 .pb.gubernator.RateLimitResponse2p\n\x0cPeersService\x12`\n\x11GetPeerRateLimits\x12#.pb.gubernator.PeerRateLimitRequest\x1a$.pb.gubernator.PeerRateLimitResponse\"\x00\x42\x07Z\x02pb\x80\x01\x01\x62\x06proto3') + , + dependencies=[ratelimit__pb2.DESCRIPTOR,]) + + + + +_PEERRATELIMITREQUEST = _descriptor.Descriptor( + name='PeerRateLimitRequest', + full_name='pb.gubernator.PeerRateLimitRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rate_limits', full_name='pb.gubernator.PeerRateLimitRequest.rate_limits', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=47, + serialized_end=123, +) + + +_PEERRATELIMITRESPONSE = _descriptor.Descriptor( + name='PeerRateLimitResponse', + full_name='pb.gubernator.PeerRateLimitResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rate_limits', full_name='pb.gubernator.PeerRateLimitResponse.rate_limits', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=125, + serialized_end=203, +) + +_PEERRATELIMITREQUEST.fields_by_name['rate_limits'].message_type = ratelimit__pb2._RATELIMITREQUEST +_PEERRATELIMITRESPONSE.fields_by_name['rate_limits'].message_type = ratelimit__pb2._RATELIMITRESPONSE +DESCRIPTOR.message_types_by_name['PeerRateLimitRequest'] = _PEERRATELIMITREQUEST +DESCRIPTOR.message_types_by_name['PeerRateLimitResponse'] = _PEERRATELIMITRESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +PeerRateLimitRequest = _reflection.GeneratedProtocolMessageType('PeerRateLimitRequest', (_message.Message,), dict( + DESCRIPTOR = _PEERRATELIMITREQUEST, + __module__ = 'peers_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.PeerRateLimitRequest) + )) +_sym_db.RegisterMessage(PeerRateLimitRequest) + +PeerRateLimitResponse = _reflection.GeneratedProtocolMessageType('PeerRateLimitResponse', (_message.Message,), dict( + DESCRIPTOR = _PEERRATELIMITRESPONSE, + __module__ = 'peers_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.PeerRateLimitResponse) + )) +_sym_db.RegisterMessage(PeerRateLimitResponse) + + +DESCRIPTOR._options = None + +_PEERSSERVICE = _descriptor.ServiceDescriptor( + name='PeersService', + full_name='pb.gubernator.PeersService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=205, + serialized_end=317, + methods=[ + _descriptor.MethodDescriptor( + name='GetPeerRateLimits', + full_name='pb.gubernator.PeersService.GetPeerRateLimits', + index=0, + containing_service=None, + input_type=_PEERRATELIMITREQUEST, + output_type=_PEERRATELIMITRESPONSE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_PEERSSERVICE) + +DESCRIPTOR.services_by_name['PeersService'] = _PEERSSERVICE + +# @@protoc_insertion_point(module_scope) diff --git a/python/gubernator/pb/peers_pb2_grpc.py b/python/gubernator/pb/peers_pb2_grpc.py new file mode 100644 index 00000000..d492f13e --- /dev/null +++ b/python/gubernator/pb/peers_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import peers_pb2 as peers__pb2 + + +class PeersServiceStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetPeerRateLimits = channel.unary_unary( + '/pb.gubernator.PeersService/GetPeerRateLimits', + request_serializer=peers__pb2.PeerRateLimitRequest.SerializeToString, + response_deserializer=peers__pb2.PeerRateLimitResponse.FromString, + ) + + +class PeersServiceServicer(object): + # missing associated documentation comment in .proto file + pass + + def GetPeerRateLimits(self, request, context): + """Used by peers to relay batches of requests to an authoritative peer + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_PeersServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetPeerRateLimits': grpc.unary_unary_rpc_method_handler( + servicer.GetPeerRateLimits, + request_deserializer=peers__pb2.PeerRateLimitRequest.FromString, + response_serializer=peers__pb2.PeerRateLimitResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'pb.gubernator.PeersService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/python/gubernator/pb/ratelimit_pb2.py b/python/gubernator/pb/ratelimit_pb2.py new file mode 100644 index 00000000..318b3686 --- /dev/null +++ b/python/gubernator/pb/ratelimit_pb2.py @@ -0,0 +1,510 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: ratelimit.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='ratelimit.proto', + package='pb.gubernator', + syntax='proto3', + serialized_options=_b('Z\002pb\200\001\001'), + serialized_pb=_b('\n\x0fratelimit.proto\x12\rpb.gubernator\x1a\x1cgoogle/api/annotations.proto\"L\n\x14RateLimitRequestList\x12\x34\n\x0brate_limits\x18\x01 \x03(\x0b\x32\x1f.pb.gubernator.RateLimitRequest\"N\n\x15RateLimitResponseList\x12\x35\n\x0brate_limits\x18\x01 \x03(\x0b\x32 .pb.gubernator.RateLimitResponse\"\x82\x01\n\x10RateLimitRequest\x12\x11\n\tnamespace\x18\x01 \x01(\t\x12\x12\n\nunique_key\x18\x02 \x01(\t\x12\x0c\n\x04hits\x18\x03 \x01(\x03\x12\x39\n\x11rate_limit_config\x18\x04 \x01(\x0b\x32\x1e.pb.gubernator.RateLimitConfig\"\xa0\x01\n\x0fRateLimitConfig\x12\r\n\x05limit\x18\x01 \x01(\x03\x12\x10\n\x08\x64uration\x18\x02 \x01(\x03\x12;\n\talgorithm\x18\x03 \x01(\x0e\x32(.pb.gubernator.RateLimitConfig.Algorithm\"/\n\tAlgorithm\x12\x10\n\x0cTOKEN_BUCKET\x10\x00\x12\x10\n\x0cLEAKY_BUCKET\x10\x01\"\xae\x02\n\x11RateLimitResponse\x12\x37\n\x06status\x18\x01 \x01(\x0e\x32\'.pb.gubernator.RateLimitResponse.Status\x12\x15\n\rcurrent_limit\x18\x02 \x01(\x03\x12\x17\n\x0flimit_remaining\x18\x03 \x01(\x03\x12\x12\n\nreset_time\x18\x04 \x01(\x03\x12@\n\x08metadata\x18\x05 \x03(\x0b\x32..pb.gubernator.RateLimitResponse.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\")\n\x06Status\x12\x0f\n\x0bUNDER_LIMIT\x10\x00\x12\x0e\n\nOVER_LIMIT\x10\x01\"\x14\n\x12HealthCheckRequest\"J\n\x13HealthCheckResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07message\x18\x02 \x01(\t\x12\x12\n\npeer_count\x18\x03 \x01(\x05\x32\xfb\x01\n\x10RateLimitService\x12x\n\rGetRateLimits\x12#.pb.gubernator.RateLimitRequestList\x1a$.pb.gubernator.RateLimitResponseList\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/GetRateLimits:\x01*\x12m\n\x0bHealthCheck\x12!.pb.gubernator.HealthCheckRequest\x1a\".pb.gubernator.HealthCheckResponse\"\x17\x82\xd3\xe4\x93\x02\x11\x12\x0f/v1/HealthCheckB\x07Z\x02pb\x80\x01\x01\x62\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + +_RATELIMITCONFIG_ALGORITHM = _descriptor.EnumDescriptor( + name='Algorithm', + full_name='pb.gubernator.RateLimitConfig.Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TOKEN_BUCKET', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='LEAKY_BUCKET', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=469, + serialized_end=516, +) +_sym_db.RegisterEnumDescriptor(_RATELIMITCONFIG_ALGORITHM) + +_RATELIMITRESPONSE_STATUS = _descriptor.EnumDescriptor( + name='Status', + full_name='pb.gubernator.RateLimitResponse.Status', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNDER_LIMIT', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OVER_LIMIT', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=780, + serialized_end=821, +) +_sym_db.RegisterEnumDescriptor(_RATELIMITRESPONSE_STATUS) + + +_RATELIMITREQUESTLIST = _descriptor.Descriptor( + name='RateLimitRequestList', + full_name='pb.gubernator.RateLimitRequestList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rate_limits', full_name='pb.gubernator.RateLimitRequestList.rate_limits', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=64, + serialized_end=140, +) + + +_RATELIMITRESPONSELIST = _descriptor.Descriptor( + name='RateLimitResponseList', + full_name='pb.gubernator.RateLimitResponseList', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rate_limits', full_name='pb.gubernator.RateLimitResponseList.rate_limits', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=142, + serialized_end=220, +) + + +_RATELIMITREQUEST = _descriptor.Descriptor( + name='RateLimitRequest', + full_name='pb.gubernator.RateLimitRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='namespace', full_name='pb.gubernator.RateLimitRequest.namespace', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='unique_key', full_name='pb.gubernator.RateLimitRequest.unique_key', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='hits', full_name='pb.gubernator.RateLimitRequest.hits', index=2, + number=3, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rate_limit_config', full_name='pb.gubernator.RateLimitRequest.rate_limit_config', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=223, + serialized_end=353, +) + + +_RATELIMITCONFIG = _descriptor.Descriptor( + name='RateLimitConfig', + full_name='pb.gubernator.RateLimitConfig', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='limit', full_name='pb.gubernator.RateLimitConfig.limit', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='duration', full_name='pb.gubernator.RateLimitConfig.duration', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='algorithm', full_name='pb.gubernator.RateLimitConfig.algorithm', index=2, + number=3, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _RATELIMITCONFIG_ALGORITHM, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=356, + serialized_end=516, +) + + +_RATELIMITRESPONSE_METADATAENTRY = _descriptor.Descriptor( + name='MetadataEntry', + full_name='pb.gubernator.RateLimitResponse.MetadataEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='pb.gubernator.RateLimitResponse.MetadataEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='value', full_name='pb.gubernator.RateLimitResponse.MetadataEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=_b('8\001'), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=731, + serialized_end=778, +) + +_RATELIMITRESPONSE = _descriptor.Descriptor( + name='RateLimitResponse', + full_name='pb.gubernator.RateLimitResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='status', full_name='pb.gubernator.RateLimitResponse.status', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='current_limit', full_name='pb.gubernator.RateLimitResponse.current_limit', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='limit_remaining', full_name='pb.gubernator.RateLimitResponse.limit_remaining', index=2, + number=3, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='reset_time', full_name='pb.gubernator.RateLimitResponse.reset_time', index=3, + number=4, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='metadata', full_name='pb.gubernator.RateLimitResponse.metadata', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[_RATELIMITRESPONSE_METADATAENTRY, ], + enum_types=[ + _RATELIMITRESPONSE_STATUS, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=519, + serialized_end=821, +) + + +_HEALTHCHECKREQUEST = _descriptor.Descriptor( + name='HealthCheckRequest', + full_name='pb.gubernator.HealthCheckRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=823, + serialized_end=843, +) + + +_HEALTHCHECKRESPONSE = _descriptor.Descriptor( + name='HealthCheckResponse', + full_name='pb.gubernator.HealthCheckResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='status', full_name='pb.gubernator.HealthCheckResponse.status', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='message', full_name='pb.gubernator.HealthCheckResponse.message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='peer_count', full_name='pb.gubernator.HealthCheckResponse.peer_count', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=845, + serialized_end=919, +) + +_RATELIMITREQUESTLIST.fields_by_name['rate_limits'].message_type = _RATELIMITREQUEST +_RATELIMITRESPONSELIST.fields_by_name['rate_limits'].message_type = _RATELIMITRESPONSE +_RATELIMITREQUEST.fields_by_name['rate_limit_config'].message_type = _RATELIMITCONFIG +_RATELIMITCONFIG.fields_by_name['algorithm'].enum_type = _RATELIMITCONFIG_ALGORITHM +_RATELIMITCONFIG_ALGORITHM.containing_type = _RATELIMITCONFIG +_RATELIMITRESPONSE_METADATAENTRY.containing_type = _RATELIMITRESPONSE +_RATELIMITRESPONSE.fields_by_name['status'].enum_type = _RATELIMITRESPONSE_STATUS +_RATELIMITRESPONSE.fields_by_name['metadata'].message_type = _RATELIMITRESPONSE_METADATAENTRY +_RATELIMITRESPONSE_STATUS.containing_type = _RATELIMITRESPONSE +DESCRIPTOR.message_types_by_name['RateLimitRequestList'] = _RATELIMITREQUESTLIST +DESCRIPTOR.message_types_by_name['RateLimitResponseList'] = _RATELIMITRESPONSELIST +DESCRIPTOR.message_types_by_name['RateLimitRequest'] = _RATELIMITREQUEST +DESCRIPTOR.message_types_by_name['RateLimitConfig'] = _RATELIMITCONFIG +DESCRIPTOR.message_types_by_name['RateLimitResponse'] = _RATELIMITRESPONSE +DESCRIPTOR.message_types_by_name['HealthCheckRequest'] = _HEALTHCHECKREQUEST +DESCRIPTOR.message_types_by_name['HealthCheckResponse'] = _HEALTHCHECKRESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +RateLimitRequestList = _reflection.GeneratedProtocolMessageType('RateLimitRequestList', (_message.Message,), dict( + DESCRIPTOR = _RATELIMITREQUESTLIST, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.RateLimitRequestList) + )) +_sym_db.RegisterMessage(RateLimitRequestList) + +RateLimitResponseList = _reflection.GeneratedProtocolMessageType('RateLimitResponseList', (_message.Message,), dict( + DESCRIPTOR = _RATELIMITRESPONSELIST, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.RateLimitResponseList) + )) +_sym_db.RegisterMessage(RateLimitResponseList) + +RateLimitRequest = _reflection.GeneratedProtocolMessageType('RateLimitRequest', (_message.Message,), dict( + DESCRIPTOR = _RATELIMITREQUEST, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.RateLimitRequest) + )) +_sym_db.RegisterMessage(RateLimitRequest) + +RateLimitConfig = _reflection.GeneratedProtocolMessageType('RateLimitConfig', (_message.Message,), dict( + DESCRIPTOR = _RATELIMITCONFIG, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.RateLimitConfig) + )) +_sym_db.RegisterMessage(RateLimitConfig) + +RateLimitResponse = _reflection.GeneratedProtocolMessageType('RateLimitResponse', (_message.Message,), dict( + + MetadataEntry = _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), dict( + DESCRIPTOR = _RATELIMITRESPONSE_METADATAENTRY, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.RateLimitResponse.MetadataEntry) + )) + , + DESCRIPTOR = _RATELIMITRESPONSE, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.RateLimitResponse) + )) +_sym_db.RegisterMessage(RateLimitResponse) +_sym_db.RegisterMessage(RateLimitResponse.MetadataEntry) + +HealthCheckRequest = _reflection.GeneratedProtocolMessageType('HealthCheckRequest', (_message.Message,), dict( + DESCRIPTOR = _HEALTHCHECKREQUEST, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.HealthCheckRequest) + )) +_sym_db.RegisterMessage(HealthCheckRequest) + +HealthCheckResponse = _reflection.GeneratedProtocolMessageType('HealthCheckResponse', (_message.Message,), dict( + DESCRIPTOR = _HEALTHCHECKRESPONSE, + __module__ = 'ratelimit_pb2' + # @@protoc_insertion_point(class_scope:pb.gubernator.HealthCheckResponse) + )) +_sym_db.RegisterMessage(HealthCheckResponse) + + +DESCRIPTOR._options = None +_RATELIMITRESPONSE_METADATAENTRY._options = None + +_RATELIMITSERVICE = _descriptor.ServiceDescriptor( + name='RateLimitService', + full_name='pb.gubernator.RateLimitService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=922, + serialized_end=1173, + methods=[ + _descriptor.MethodDescriptor( + name='GetRateLimits', + full_name='pb.gubernator.RateLimitService.GetRateLimits', + index=0, + containing_service=None, + input_type=_RATELIMITREQUESTLIST, + output_type=_RATELIMITRESPONSELIST, + serialized_options=_b('\202\323\344\223\002\026\"\021/v1/GetRateLimits:\001*'), + ), + _descriptor.MethodDescriptor( + name='HealthCheck', + full_name='pb.gubernator.RateLimitService.HealthCheck', + index=1, + containing_service=None, + input_type=_HEALTHCHECKREQUEST, + output_type=_HEALTHCHECKRESPONSE, + serialized_options=_b('\202\323\344\223\002\021\022\017/v1/HealthCheck'), + ), +]) +_sym_db.RegisterServiceDescriptor(_RATELIMITSERVICE) + +DESCRIPTOR.services_by_name['RateLimitService'] = _RATELIMITSERVICE + +# @@protoc_insertion_point(module_scope) diff --git a/python/gubernator/pb/ratelimit_pb2_grpc.py b/python/gubernator/pb/ratelimit_pb2_grpc.py new file mode 100644 index 00000000..eb60d2d5 --- /dev/null +++ b/python/gubernator/pb/ratelimit_pb2_grpc.py @@ -0,0 +1,64 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +from . import ratelimit_pb2 as ratelimit__pb2 + + +class RateLimitServiceStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.GetRateLimits = channel.unary_unary( + '/pb.gubernator.RateLimitService/GetRateLimits', + request_serializer=ratelimit__pb2.RateLimitRequestList.SerializeToString, + response_deserializer=ratelimit__pb2.RateLimitResponseList.FromString, + ) + self.HealthCheck = channel.unary_unary( + '/pb.gubernator.RateLimitService/HealthCheck', + request_serializer=ratelimit__pb2.HealthCheckRequest.SerializeToString, + response_deserializer=ratelimit__pb2.HealthCheckResponse.FromString, + ) + + +class RateLimitServiceServicer(object): + # missing associated documentation comment in .proto file + pass + + def GetRateLimits(self, request, context): + """Given a list of rate limits return the rates and statuses of each request. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def HealthCheck(self, request, context): + """This method is for round trip benchmarking and can be used by + the client to determine connectivity to the server + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_RateLimitServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'GetRateLimits': grpc.unary_unary_rpc_method_handler( + servicer.GetRateLimits, + request_deserializer=ratelimit__pb2.RateLimitRequestList.FromString, + response_serializer=ratelimit__pb2.RateLimitResponseList.SerializeToString, + ), + 'HealthCheck': grpc.unary_unary_rpc_method_handler( + servicer.HealthCheck, + request_deserializer=ratelimit__pb2.HealthCheckRequest.FromString, + response_serializer=ratelimit__pb2.HealthCheckResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'pb.gubernator.RateLimitService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/python/tests/__init__.py b/python/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/tests/test_client.py b/python/tests/test_client.py new file mode 100644 index 00000000..0a486c5b --- /dev/null +++ b/python/tests/test_client.py @@ -0,0 +1,7 @@ +#import pytest +from gubernator.client import Client + + +def test_client(): + client = Client() + client.Ping() diff --git a/scripts/fix-import.py b/scripts/fix-import.py new file mode 100755 index 00000000..350b4836 --- /dev/null +++ b/scripts/fix-import.py @@ -0,0 +1,18 @@ +#! /usr/bin/env python + +import fileinput +import re + +regex = re.compile("import.*_pb2") + +files = [ + "python/gubernator/pb/ratelimit_pb2_grpc.py" +] + +for file in files: + for line in fileinput.input(file, inplace=True): + if regex.match(line): + print("from . " + line, end='') + continue + print(line, end='') + diff --git a/scripts/proto.sh b/scripts/proto.sh index bcc1a832..5b70abcc 100755 --- a/scripts/proto.sh +++ b/scripts/proto.sh @@ -5,18 +5,33 @@ set -e set -u set -x -PROTO_DIR=./proto -GO_DIR=./golang/pb +PROTO_DIR=proto +GO_DIR=golang/pb +PY_DIR=python/gubernator/pb +GRPC_GATEWAY_DIR=$GOPATH/pkg/mod/github.com/grpc-ecosystem/grpc-gateway\@v1.7.0/third_party/googleapis # Cleanup outdated autogenerated files. rm -f $GO_DIR/*.go +rm -rf $PY_DIR/* protoc -I=$PROTO_DIR \ - -I=$GOPATH/pkg/mod/github.com/grpc-ecosystem/grpc-gateway\@v1.7.0/third_party/googleapis \ + -I=$GRPC_GATEWAY_DIR \ --go_out=plugins=grpc:$GO_DIR \ $PROTO_DIR/*.proto protoc -I=$PROTO_DIR \ - -I=$GOPATH/pkg/mod/github.com/grpc-ecosystem/grpc-gateway\@v1.7.0/third_party/googleapis \ + -I=$GRPC_GATEWAY_DIR \ --grpc-gateway_out=logtostderr=true:$GO_DIR \ $PROTO_DIR/*.proto + +python3 -m grpc_tools.protoc \ + -I=$PROTO_DIR \ + -I=$GRPC_GATEWAY_DIR \ + --python_out=$PY_DIR \ + --grpc_python_out=$PY_DIR \ + $PROTO_DIR/*.proto + +touch $PY_DIR/__init__.py + +# Fix import paths because python3 +./scripts/fix-import.py