Commit e7769a3e authored by Martin Blanchard's avatar Martin Blanchard
Browse files

buildbox.py: Port to new CAS downloader helper

#79
parent 93779f6a
Loading
Loading
Loading
Loading
+27 −19
Original line number Diff line number Diff line
@@ -19,28 +19,31 @@ import tempfile

from google.protobuf import any_pb2

from buildgrid.client.cas import upload
from buildgrid.client.cas import download, upload
from buildgrid._protos.build.bazel.remote.execution.v2 import remote_execution_pb2
from buildgrid._protos.google.bytestream import bytestream_pb2_grpc
from buildgrid.utils import read_file, write_file, parse_to_pb2_from_fetch
from buildgrid.utils import read_file, write_file


def work_buildbox(context, lease):
    """Executes a lease for a build action, using buildbox.
    """

    stub_bytestream = bytestream_pb2_grpc.ByteStreamStub(context.cas_channel)
    local_cas_directory = context.local_cas
    # instance_name = context.parent
    logger = context.logger

    action_digest = remote_execution_pb2.Digest()
    lease.payload.Unpack(action_digest)

    action = parse_to_pb2_from_fetch(remote_execution_pb2.Action(),
                                     stub_bytestream, action_digest)
    with download(context.cas_channel) as cas:
        action = cas.get_message(action_digest,
                                 remote_execution_pb2.Action())

    command = parse_to_pb2_from_fetch(remote_execution_pb2.Command(),
                                      stub_bytestream, action.command_digest)
        assert action.command_digest.hash

        command = cas.get_message(action.command_digest,
                                  remote_execution_pb2.Command())

    environment = dict()
    for variable in command.environment_variables:
@@ -101,7 +104,8 @@ def work_buildbox(context, lease):

            # TODO: Have BuildBox helping us creating the Tree instance here
            # See https://gitlab.com/BuildStream/buildbox/issues/7 for details
            output_tree = _cas_tree_maker(stub_bytestream, output_digest)
            with download(context.cas_channel) as cas:
                output_tree = _cas_tree_maker(cas, output_digest)

            with upload(context.cas_channel) as cas:
                output_tree_digest = cas.send_message(output_tree)
@@ -121,24 +125,28 @@ def work_buildbox(context, lease):
    return lease


def _cas_tree_maker(stub_bytestream, directory_digest):
def _cas_tree_maker(cas, directory_digest):
    # Generates and stores a Tree for a given Directory. This is very inefficient
    # and only temporary. See https://gitlab.com/BuildStream/buildbox/issues/7.
    output_tree = remote_execution_pb2.Tree()

    def list_directories(parent_directory):
        directory_list = list()
    def __cas_tree_maker(cas, parent_directory):
        digests, directories = list(), list()
        for directory_node in parent_directory.directories:
            directory = parse_to_pb2_from_fetch(remote_execution_pb2.Directory(),
                                                stub_bytestream, directory_node.digest)
            directory_list.extend(list_directories(directory))
            directory_list.append(directory)
            directories.append(remote_execution_pb2.Directory())
            digests.append(directory_node.digest)

        cas.get_messages(digests, directories)

        for directory in directories[:]:
            directories.extend(__cas_tree_maker(directory))

        return directories

        return directory_list
    root_directory = cas.get_message(directory_digest,
                                     remote_execution_pb2.Directory())

    root_directory = parse_to_pb2_from_fetch(remote_execution_pb2.Directory(),
                                             stub_bytestream, directory_digest)
    output_tree.children.extend(list_directories(root_directory))
    output_tree.children.extend(__cas_tree_maker(root_directory))
    output_tree.root.CopyFrom(root_directory)

    return output_tree