diff options
Diffstat (limited to 'docker/api/buildkit')
-rw-r--r-- | docker/api/buildkit/auth/auth.proto | 19 | ||||
-rw-r--r-- | docker/api/buildkit/auth/auth.py | 26 | ||||
-rw-r--r-- | docker/api/buildkit/auth/auth_grpc.py | 37 | ||||
-rw-r--r-- | docker/api/buildkit/auth/auth_pb2.py | 140 | ||||
-rw-r--r-- | docker/api/buildkit/filesync/filesync.proto | 20 | ||||
-rw-r--r-- | docker/api/buildkit/filesync/filesync.py | 22 | ||||
-rw-r--r-- | docker/api/buildkit/filesync/filesync_grpc.py | 81 | ||||
-rw-r--r-- | docker/api/buildkit/filesync/filesync_pb2.py | 127 | ||||
-rw-r--r-- | docker/api/buildkit/grpc.py | 33 | ||||
-rw-r--r-- | docker/api/buildkit/session.py | 53 |
10 files changed, 539 insertions, 19 deletions
diff --git a/docker/api/buildkit/auth/auth.proto b/docker/api/buildkit/auth/auth.proto new file mode 100644 index 0000000..79afb36 --- /dev/null +++ b/docker/api/buildkit/auth/auth.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +package moby.filesync.v1; + +option go_package = "auth"; + +service Auth{ + rpc Credentials(CredentialsRequest) returns (CredentialsResponse); +} + + +message CredentialsRequest { + string Host = 1; +} + +message CredentialsResponse { + string Username = 1; + string Secret = 2; +}
\ No newline at end of file diff --git a/docker/api/buildkit/auth/auth.py b/docker/api/buildkit/auth/auth.py new file mode 100644 index 0000000..df096a7 --- /dev/null +++ b/docker/api/buildkit/auth/auth.py @@ -0,0 +1,26 @@ +from .auth_pb2 import CredentialsResponse +from .auth_grpc import AuthBase +from ..grpc import Attachable +from docker.auth import resolve_authconfig + + +class Auth(AuthBase, Attachable): + def __init__(self, authconfig, credstore_env, *args, **kwargs): + self.authconfig = authconfig + self.credstore_env = credstore_env + super(Auth, self).__init__(*args, **kwargs) + + async def Credentials(self, stream): + request = await stream.recv_message() + host = request.Host + auth_data = resolve_authconfig( + self.authconfig, host, self.credstore_env + ) + response = None + if auth_data is None: + response = CredentialsResponse(Username=None, Secret=None) + else: + response = CredentialsResponse( + Username=auth_data['Username'], Secret=auth_data['Password'] + ) + await stream.send_message(response) diff --git a/docker/api/buildkit/auth/auth_grpc.py b/docker/api/buildkit/auth/auth_grpc.py new file mode 100644 index 0000000..4c54bcd --- /dev/null +++ b/docker/api/buildkit/auth/auth_grpc.py @@ -0,0 +1,37 @@ +# Generated by the Protocol Buffers compiler. DO NOT EDIT! +# source: auth.proto +# plugin: grpclib.plugin.main +import abc + +import grpclib.const +import grpclib.client + +import auth_pb2 + + +class AuthBase(abc.ABC): + + @abc.abstractmethod + async def Credentials(self, stream): + pass + + def __mapping__(self): + return { + '/moby.filesync.v1.Auth/Credentials': grpclib.const.Handler( + self.Credentials, + grpclib.const.Cardinality.UNARY_UNARY, + auth_pb2.CredentialsRequest, + auth_pb2.CredentialsResponse, + ), + } + + +class AuthStub: + + def __init__(self, channel: grpclib.client.Channel) -> None: + self.Credentials = grpclib.client.UnaryUnaryMethod( + channel, + '/moby.filesync.v1.Auth/Credentials', + auth_pb2.CredentialsRequest, + auth_pb2.CredentialsResponse, + ) diff --git a/docker/api/buildkit/auth/auth_pb2.py b/docker/api/buildkit/auth/auth_pb2.py new file mode 100644 index 0000000..07ee94a --- /dev/null +++ b/docker/api/buildkit/auth/auth_pb2.py @@ -0,0 +1,140 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: auth.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() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='auth.proto', + package='moby.filesync.v1', + syntax='proto3', + serialized_options=_b('Z\004auth'), + serialized_pb=_b('\n\nauth.proto\x12\x10moby.filesync.v1\"\"\n\x12\x43redentialsRequest\x12\x0c\n\x04Host\x18\x01 \x01(\t\"7\n\x13\x43redentialsResponse\x12\x10\n\x08Username\x18\x01 \x01(\t\x12\x0e\n\x06Secret\x18\x02 \x01(\t2b\n\x04\x41uth\x12Z\n\x0b\x43redentials\x12$.moby.filesync.v1.CredentialsRequest\x1a%.moby.filesync.v1.CredentialsResponseB\x06Z\x04\x61uthb\x06proto3') +) + + + + +_CREDENTIALSREQUEST = _descriptor.Descriptor( + name='CredentialsRequest', + full_name='moby.filesync.v1.CredentialsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Host', full_name='moby.filesync.v1.CredentialsRequest.Host', 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), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=32, + serialized_end=66, +) + + +_CREDENTIALSRESPONSE = _descriptor.Descriptor( + name='CredentialsResponse', + full_name='moby.filesync.v1.CredentialsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='Username', full_name='moby.filesync.v1.CredentialsResponse.Username', 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='Secret', full_name='moby.filesync.v1.CredentialsResponse.Secret', 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=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=68, + serialized_end=123, +) + +DESCRIPTOR.message_types_by_name['CredentialsRequest'] = _CREDENTIALSREQUEST +DESCRIPTOR.message_types_by_name['CredentialsResponse'] = _CREDENTIALSRESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +CredentialsRequest = _reflection.GeneratedProtocolMessageType('CredentialsRequest', (_message.Message,), dict( + DESCRIPTOR = _CREDENTIALSREQUEST, + __module__ = 'auth_pb2' + # @@protoc_insertion_point(class_scope:moby.filesync.v1.CredentialsRequest) + )) +_sym_db.RegisterMessage(CredentialsRequest) + +CredentialsResponse = _reflection.GeneratedProtocolMessageType('CredentialsResponse', (_message.Message,), dict( + DESCRIPTOR = _CREDENTIALSRESPONSE, + __module__ = 'auth_pb2' + # @@protoc_insertion_point(class_scope:moby.filesync.v1.CredentialsResponse) + )) +_sym_db.RegisterMessage(CredentialsResponse) + + +DESCRIPTOR._options = None + +_AUTH = _descriptor.ServiceDescriptor( + name='Auth', + full_name='moby.filesync.v1.Auth', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=125, + serialized_end=223, + methods=[ + _descriptor.MethodDescriptor( + name='Credentials', + full_name='moby.filesync.v1.Auth.Credentials', + index=0, + containing_service=None, + input_type=_CREDENTIALSREQUEST, + output_type=_CREDENTIALSRESPONSE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_AUTH) + +DESCRIPTOR.services_by_name['Auth'] = _AUTH + +# @@protoc_insertion_point(module_scope) diff --git a/docker/api/buildkit/filesync/filesync.proto b/docker/api/buildkit/filesync/filesync.proto new file mode 100644 index 0000000..327a043 --- /dev/null +++ b/docker/api/buildkit/filesync/filesync.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +package moby.filesync.v1; + +option go_package = "filesync"; + +service FileSync{ + rpc DiffCopy(stream BytesMessage) returns (stream BytesMessage); + rpc TarStream(stream BytesMessage) returns (stream BytesMessage); +} + +service FileSend{ + rpc DiffCopy(stream BytesMessage) returns (stream BytesMessage); +} + + +// BytesMessage contains a chunk of byte data +message BytesMessage{ + bytes data = 1; +}
\ No newline at end of file diff --git a/docker/api/buildkit/filesync/filesync.py b/docker/api/buildkit/filesync/filesync.py new file mode 100644 index 0000000..cf33cba --- /dev/null +++ b/docker/api/buildkit/filesync/filesync.py @@ -0,0 +1,22 @@ +from .filesync_pb2 import BytesMessage +from .filesync_grpc import FileSendBase, FileSyncBase +from ..grpc import Attachable + + +class FileSync(FileSyncBase, Attachable): + def __init__(self, *args, **kwargs): + super(FileSync, self).__init__(*args, **kwargs) + + async def DiffCopy(self, stream): + pass + + async def TarStream(self, stream): + pass + + +class FileSend(FileSendBase, Attachable): + def __init__(self, *args, **kwargs): + super(FileSync, self).__init__(*args, **kwargs) + + async def DiffCopy(self, stream): + pass diff --git a/docker/api/buildkit/filesync/filesync_grpc.py b/docker/api/buildkit/filesync/filesync_grpc.py new file mode 100644 index 0000000..7405754 --- /dev/null +++ b/docker/api/buildkit/filesync/filesync_grpc.py @@ -0,0 +1,81 @@ +# Generated by the Protocol Buffers compiler. DO NOT EDIT! +# source: filesync.proto +# plugin: grpclib.plugin.main +import abc + +import grpclib.const +import grpclib.client + +import filesync_pb2 + + +class FileSyncBase(abc.ABC): + + @abc.abstractmethod + async def DiffCopy(self, stream): + pass + + @abc.abstractmethod + async def TarStream(self, stream): + pass + + def __mapping__(self): + return { + '/moby.filesync.v1.FileSync/DiffCopy': grpclib.const.Handler( + self.DiffCopy, + grpclib.const.Cardinality.STREAM_STREAM, + filesync_pb2.BytesMessage, + filesync_pb2.BytesMessage, + ), + '/moby.filesync.v1.FileSync/TarStream': grpclib.const.Handler( + self.TarStream, + grpclib.const.Cardinality.STREAM_STREAM, + filesync_pb2.BytesMessage, + filesync_pb2.BytesMessage, + ), + } + + +class FileSyncStub: + + def __init__(self, channel: grpclib.client.Channel) -> None: + self.DiffCopy = grpclib.client.StreamStreamMethod( + channel, + '/moby.filesync.v1.FileSync/DiffCopy', + filesync_pb2.BytesMessage, + filesync_pb2.BytesMessage, + ) + self.TarStream = grpclib.client.StreamStreamMethod( + channel, + '/moby.filesync.v1.FileSync/TarStream', + filesync_pb2.BytesMessage, + filesync_pb2.BytesMessage, + ) + + +class FileSendBase(abc.ABC): + + @abc.abstractmethod + async def DiffCopy(self, stream): + pass + + def __mapping__(self): + return { + '/moby.filesync.v1.FileSend/DiffCopy': grpclib.const.Handler( + self.DiffCopy, + grpclib.const.Cardinality.STREAM_STREAM, + filesync_pb2.BytesMessage, + filesync_pb2.BytesMessage, + ), + } + + +class FileSendStub: + + def __init__(self, channel: grpclib.client.Channel) -> None: + self.DiffCopy = grpclib.client.StreamStreamMethod( + channel, + '/moby.filesync.v1.FileSend/DiffCopy', + filesync_pb2.BytesMessage, + filesync_pb2.BytesMessage, + ) diff --git a/docker/api/buildkit/filesync/filesync_pb2.py b/docker/api/buildkit/filesync/filesync_pb2.py new file mode 100644 index 0000000..136c5b1 --- /dev/null +++ b/docker/api/buildkit/filesync/filesync_pb2.py @@ -0,0 +1,127 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: filesync.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() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='filesync.proto', + package='moby.filesync.v1', + syntax='proto3', + serialized_options=_b('Z\010filesync'), + serialized_pb=_b('\n\x0e\x66ilesync.proto\x12\x10moby.filesync.v1\"\x1c\n\x0c\x42ytesMessage\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c\x32\xab\x01\n\x08\x46ileSync\x12N\n\x08\x44iffCopy\x12\x1e.moby.filesync.v1.BytesMessage\x1a\x1e.moby.filesync.v1.BytesMessage(\x01\x30\x01\x12O\n\tTarStream\x12\x1e.moby.filesync.v1.BytesMessage\x1a\x1e.moby.filesync.v1.BytesMessage(\x01\x30\x01\x32Z\n\x08\x46ileSend\x12N\n\x08\x44iffCopy\x12\x1e.moby.filesync.v1.BytesMessage\x1a\x1e.moby.filesync.v1.BytesMessage(\x01\x30\x01\x42\nZ\x08\x66ilesyncb\x06proto3') +) + + + + +_BYTESMESSAGE = _descriptor.Descriptor( + name='BytesMessage', + full_name='moby.filesync.v1.BytesMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='moby.filesync.v1.BytesMessage.data', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + 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=36, + serialized_end=64, +) + +DESCRIPTOR.message_types_by_name['BytesMessage'] = _BYTESMESSAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +BytesMessage = _reflection.GeneratedProtocolMessageType('BytesMessage', (_message.Message,), dict( + DESCRIPTOR = _BYTESMESSAGE, + __module__ = 'filesync_pb2' + # @@protoc_insertion_point(class_scope:moby.filesync.v1.BytesMessage) + )) +_sym_db.RegisterMessage(BytesMessage) + + +DESCRIPTOR._options = None + +_FILESYNC = _descriptor.ServiceDescriptor( + name='FileSync', + full_name='moby.filesync.v1.FileSync', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=67, + serialized_end=238, + methods=[ + _descriptor.MethodDescriptor( + name='DiffCopy', + full_name='moby.filesync.v1.FileSync.DiffCopy', + index=0, + containing_service=None, + input_type=_BYTESMESSAGE, + output_type=_BYTESMESSAGE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='TarStream', + full_name='moby.filesync.v1.FileSync.TarStream', + index=1, + containing_service=None, + input_type=_BYTESMESSAGE, + output_type=_BYTESMESSAGE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_FILESYNC) + +DESCRIPTOR.services_by_name['FileSync'] = _FILESYNC + + +_FILESEND = _descriptor.ServiceDescriptor( + name='FileSend', + full_name='moby.filesync.v1.FileSend', + file=DESCRIPTOR, + index=1, + serialized_options=None, + serialized_start=240, + serialized_end=330, + methods=[ + _descriptor.MethodDescriptor( + name='DiffCopy', + full_name='moby.filesync.v1.FileSend.DiffCopy', + index=0, + containing_service=None, + input_type=_BYTESMESSAGE, + output_type=_BYTESMESSAGE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_FILESEND) + +DESCRIPTOR.services_by_name['FileSend'] = _FILESEND + +# @@protoc_insertion_point(module_scope) diff --git a/docker/api/buildkit/grpc.py b/docker/api/buildkit/grpc.py new file mode 100644 index 0000000..9ee640d --- /dev/null +++ b/docker/api/buildkit/grpc.py @@ -0,0 +1,33 @@ +import grpclib.server + + +class Handler(grpclib.server.Handler): + def __init__(self, headers, *args, **kwargs): + self.headers = headers + super(Handler, self).__init__(*args, **kwargs) + + def accept(self, stream, headers, release_stream): + for k, v in self.headers.items(): + headers.setdefault(k, v) + + +class Server(grpclib.server.Server): + headers = {} + + def add_headers(self, h): + self.headers.update(h) + + def _protocol_factory(self): + self.__gc_step__() + handler = Handler( + self.headers, self._mapping, self._codec, loop=self._loop + ) + self._handlers.add(handler) + return grpclib.server.H2Protocol( + handler, self._config, loop=self._loop + ) + + +class Attachable(object): + def register(self, grpc_server): + grpc_server._mapping.update(self.__mapping__()) diff --git a/docker/api/buildkit/session.py b/docker/api/buildkit/session.py index 92a9627..f9d2910 100644 --- a/docker/api/buildkit/session.py +++ b/docker/api/buildkit/session.py @@ -1,19 +1,18 @@ +import asyncio import binascii -import concurrent.futures import hashlib import os import base36 -import grpc -from grpc_health.v1 import health_pb2_grpc +import grpclib.server from docker.utils import version_gte from docker.utils.config import config_dir -headerSessionID = "X-Docker-Expose-Session-Uuid" -headerSessionName = "X-Docker-Expose-Session-Name" -headerSessionSharedKey = "X-Docker-Expose-Session-Sharedkey" -headerSessionMethod = "X-Docker-Expose-Session-Grpc-Method" +HEADER_SESSION_ID = "X-Docker-Expose-Session-Uuid" +HEADER_SESSION_NAME = "X-Docker-Expose-Session-Name" +HEADER_SESSION_SHAREDKEY = "X-Docker-Expose-Session-Sharedkey" +HEADER_SESSION_METHOD = "X-Docker-Expose-Session-Grpc-Method" def is_session_supported(client, for_stream): @@ -68,23 +67,39 @@ class Session(object): self.id = generate_session_id() self.name = name self.shared_key = shared_key - self.grpc_server = grpc.server( - concurrent.futures.ThreadPoolExecutor(max_workers=10) - ) - - health_pb2_grpc.add_HealthServicer_to_server( - health_pb2_grpc.HealthServicer(), - self.grpc_server + self.grpc_server = grpclib.server.Server( + [], asyncio.get_event_loop() ) + self.sock = None def allow(self, attachable): attachable.register(self.grpc_server) - def run(self, dialer): + def run(self, sock): meta = { - headerSessionID: self.id, - headerSessionName: self.name, - headerSessionSharedKey: self.shared_key, + HEADER_SESSION_ID: self.id, + HEADER_SESSION_NAME: self.name, + HEADER_SESSION_SHAREDKEY: self.shared_key, } -# for name, svc
\ No newline at end of file + # FIXME: some loop for headerSessionMethod + + self.sock = sock + + await self.serve(meta) + + async def serve(self, metadata): + # FIXME: Figure out what to do with metadata + await self.grpc_server.start(sock=self.sock) + print('Serving on socket {}'.format(self.sock)) + try: + await self.grpc_server.wait_closed() + except asyncio.CancelledError: + self.grpc_server.close() + await self.grpc_server.wait_closed() + + def close(self): + if self.sock: + self.sock.close() + self.grpc_server.close() + self.closed = True |