summaryrefslogtreecommitdiff
path: root/docker
diff options
context:
space:
mode:
Diffstat (limited to 'docker')
-rw-r--r--docker/api/buildkit/auth/auth.proto19
-rw-r--r--docker/api/buildkit/auth/auth.py26
-rw-r--r--docker/api/buildkit/auth/auth_grpc.py37
-rw-r--r--docker/api/buildkit/auth/auth_pb2.py140
-rw-r--r--docker/api/buildkit/filesync/filesync.proto20
-rw-r--r--docker/api/buildkit/filesync/filesync.py22
-rw-r--r--docker/api/buildkit/filesync/filesync_grpc.py81
-rw-r--r--docker/api/buildkit/filesync/filesync_pb2.py127
-rw-r--r--docker/api/buildkit/grpc.py33
-rw-r--r--docker/api/buildkit/session.py53
-rw-r--r--docker/api/daemon.py12
11 files changed, 551 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
diff --git a/docker/api/daemon.py b/docker/api/daemon.py
index c836e58..5a8e7b8 100644
--- a/docker/api/daemon.py
+++ b/docker/api/daemon.py
@@ -185,6 +185,18 @@ class DaemonApiMixin(object):
return types.ServerInfo(resp.headers)
+ def session(self, protocol):
+ url = self._url("/session")
+ headers = {
+ 'Connection': 'Upgrade',
+ 'Upgrade': protocol,
+ }
+
+ resp = self._post(url, headers=headers, stream=True)
+
+ self._raise_for_status(resp)
+ return self._get_raw_response_socket(resp)
+
def version(self, api_version=True):
"""
Returns version information from the server. Similar to the ``docker