org.apache.mesos.v1.scheduler.Protos Java Examples

The following examples show how to use org.apache.mesos.v1.scheduler.Protos. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: AuxiliaryService.java    From Juice with GNU General Public License v3.0 6 votes vote down vote up
public static void decline(final @NotNull Protocol protocol, final @NotNull String streamId, final @NotNull org.apache.mesos.v1.Protos.FrameworkID frameworkId,
                           final @NotNull Protos.Call call, final @NotNull String url) {
    try {
        SendUtils.sendCall(call, protocol, streamId, url);
    } catch (IOException e) {
        log.error("send decline call to mesos error!");
        log.error("frameworkId : " + frameworkId.getValue());
        log.error("call : " + call);
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        getSendErrors().push(new SendErrors(frameworkId, call));
    }
}
 
Example #2
Source File: SchedulerDriver.java    From Juice with GNU General Public License v3.0 6 votes vote down vote up
private Protos.Call subscribeCall() {

        String hostName = System.getenv("HOST");
        if (StringUtils.isBlank(hostName)) {
            try {
                hostName = InetAddress.getLocalHost().getHostAddress();
            } catch (UnknownHostException e) {
                hostName = "unknown host";
                e.printStackTrace();
            }
        }

        return SchedulerCalls.subscribe(
                FrameworkInfo.newBuilder()
                        .setId(frameworkId)
                        .setHostname(hostName)
                        .setUser(Optional.ofNullable(System.getenv("user")).orElse("root"))
                        .setName(MESOS_SCHEDULER_NAME)
                        .setFailoverTimeout(FRAMEWORK_FAILOVER_TIMEOUT)
                        .setRole(MESOS_FRAMEWORK_ROLE)
                        .build());
    }
 
Example #3
Source File: SchedulerEvents.java    From mesos-rxjava with Apache License 2.0 6 votes vote down vote up
/**
 * Utility method to more succinctly construct an {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#UPDATE UPDATE}.
 *
 * @param agentId        The {@link org.apache.mesos.v1.Protos.TaskStatus#getAgentId() agentId} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param executorId     The {@link org.apache.mesos.v1.Protos.TaskStatus#getExecutorId() executorId} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param taskId         The {@link org.apache.mesos.v1.Protos.TaskStatus#getTaskId() taskId} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param state          The {@link org.apache.mesos.v1.Protos.TaskState TaskState} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param uuid           The {@link org.apache.mesos.v1.Protos.TaskStatus#getUuid() uuid} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @return  A {@link Protos.Call Call} with a configured {@link Protos.Call.Acknowledge Acknowledge}.
 */
@NotNull
public static Protos.Event update(
    @NotNull final String agentId,
    @NotNull final String executorId,
    @NotNull final String taskId,
    @NotNull final org.apache.mesos.v1.Protos.TaskState state,
    @Nullable final ByteString uuid
) {
    return update(
        org.apache.mesos.v1.Protos.AgentID.newBuilder().setValue(agentId).build(),
        org.apache.mesos.v1.Protos.ExecutorID.newBuilder().setValue(executorId).build(),
        org.apache.mesos.v1.Protos.TaskID.newBuilder().setValue(taskId).build(),
        state,
        uuid
    );
}
 
Example #4
Source File: SchedulerEvents.java    From mesos-rxjava with Apache License 2.0 6 votes vote down vote up
/**
 * Utility method to more succinctly construct an {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#MESSAGE MESSAGE}.
 *
 * @param agentId        The {@link Protos.Event.Message#getAgentId() agentId} to be set on the
 *                       {@link Protos.Event.Message Message}.
 * @param executorId     The {@link Protos.Event.Message#getExecutorId() executorId} to be set on the
 *                       {@link Protos.Event.Message Message}.
 * @param data           The {@link Protos.Event.Message#getData() data} to be set on the
 *                       {@link Protos.Event.Message Message}.
 * @return  A {@link Protos.Call Call} with a configured {@link Protos.Call.Acknowledge Acknowledge}.
 */
@NotNull
public static Protos.Event message(
    @NotNull final org.apache.mesos.v1.Protos.AgentID agentId,
    @NotNull final org.apache.mesos.v1.Protos.ExecutorID executorId,
    @NotNull final ByteString data
) {
    return Protos.Event.newBuilder()
        .setType(Protos.Event.Type.MESSAGE)
        .setMessage(
            Protos.Event.Message.newBuilder()
                .setAgentId(agentId)
                .setExecutorId(executorId)
                .setData(data)
        )
        .build();
}
 
Example #5
Source File: Protobuf.java    From Juice with GNU General Public License v3.0 5 votes vote down vote up
@Override
public Object getEvent(byte[] buffer, Class<?> classz) throws Exception {
    if(classz.equals(Protos.Event.class)) {
        return Protos.Event.parseFrom(buffer);
    }

    return Event.parseFrom(buffer);
}
 
Example #6
Source File: AuxiliaryService.java    From Juice with GNU General Public License v3.0 5 votes vote down vote up
public static void kill(@NotNull Map<Long, String> killmap, String agentId, @NotNull Protocol protocol, final @NotNull String streamId, final @NotNull FrameworkID frameworkID, @NotNull String url, final @NotNull long taskId) {
    if (killmap.containsKey(taskId)) {
        fixedAuxiliaryPool.submit(() -> {
            JuiceTask juiceTask = daoUtils.queryTask(taskId);
            if (null != juiceTask) {
                if (juiceTask.getTaskStatus() > TaskResult.Result.RUNNING.getType()) {
                    killmap.remove(taskId);
                    return;
                }
                String value = killmap.get(taskId);
                if (StringUtils.isBlank(value)) {
                    if (StringUtils.isNotBlank(juiceTask.getAgentId())) {
                        value = juiceTask.getAgentId();
                    } else if (StringUtils.isNotBlank(agentId)) {
                        value = agentId;
                    }
                }
                if (StringUtils.isNotBlank(value)) {
                    TaskManagement.TaskAgentRel taskAgentRel = new TaskManagement.TaskAgentRel(taskId, juiceTask.getTaskName(), juiceTask.getRetry(), value);
                    Protos.Call call = SchedulerCalls.kill(frameworkID, taskAgentRel);
                    try {
                        SendUtils.sendCall(call, protocol, streamId, url);
                        killmap.remove(taskId);
                    } catch (IOException e) {
                        log.warn("send kill task call error due to : " + e.getCause());
                    }
                }
            }
        });
    }
}
 
Example #7
Source File: AuxiliaryService.java    From Juice with GNU General Public License v3.0 5 votes vote down vote up
public static void accept(final @NotNull Protocol protocol, final @NotNull String streamId, final @NotNull org.apache.mesos.v1.Protos.OfferID offerID,
                          final @NotNull org.apache.mesos.v1.Protos.FrameworkID frameworkID, final @NotNull List<org.apache.mesos.v1.Protos.TaskInfo> taskInfos,
                          final @NotNull String url) {
    Protos.Call call = SchedulerCalls.accept(frameworkID, offerID, taskInfos);
    log.info("accept --> Launching {} tasks", taskInfos.size());

    try {
        SendUtils.sendCall(call, protocol, streamId, url);
    } catch (IOException e) {
        log.error("send accept call to mesos error!");
        log.error("frameworkId : " + frameworkID.getValue() + ", offerId : " + offerID.getValue());
        log.error("call : " + call);
        taskInfos.forEach(
                taskInfo -> {
                    getTaskErrors().add(new TaskResult(com.hujiang.juice.common.model.Task.splitTaskNameId(taskInfo.getTaskId().getValue()), TaskResult.Result.ERROR, "send task to mesos error!"));
                }
        );
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        List<org.apache.mesos.v1.Protos.OfferID> offerIDS = Lists.newArrayList();
        offerIDS.add(offerID);

        //  if accept error, then offer will be decline
        getSendErrors().push(new SendErrors(frameworkID, SchedulerCalls.decline(frameworkID, offerIDS)));
    }
}
 
Example #8
Source File: SchedulerDriver.java    From Juice with GNU General Public License v3.0 5 votes vote down vote up
private void connecting() throws Exception {
    InputStream stream = null;
    Response res = null;

    try {
        Protos.Call call = subscribeCall();
        res = Restty.create(getUrl())
                .addAccept(protocol.mediaType())
                .addMediaType(protocol.mediaType())
                .addKeepAlive()
                .requestBody(protocol.getSendBytes(call))
                .post();

        streamId = res.header(STREAM_ID);
        stream = res.body().byteStream();
        log.info("send subscribe, frameworkId : " + frameworkId + " , url " + getUrl() + ", streamId : " + streamId);
        log.debug("subscribe call : " + call);
        if (null == stream) {
            log.warn("stream is null");
            throw new DriverException("stream is null");
        }
        while (true) {
            int size = SendUtils.readChunkSize(stream);
            byte[] event = SendUtils.readChunk(stream, size);

            onEvent(event);
        }
    } catch (Exception e) {
        log.error("service handle error, due to : " + e);
        throw e;
    } finally {
        if (null != stream) {
            stream.close();
        }
        if (null != res) {
            res.close();
        }
        streamId = null;
    }
}
 
Example #9
Source File: SleepySimulationTest.java    From mesos-rxjava with Apache License 2.0 5 votes vote down vote up
@Before
public void setUp() throws Exception {
    subject = BehaviorSubject.create();
    sim = new MesosServerSimulation<>(
        subject,
        ProtobufMessageCodecs.SCHEDULER_EVENT,
        ProtobufMessageCodecs.SCHEDULER_CALL,
        (e) -> e.getType() == Protos.Call.Type.SUBSCRIBE
    );
    final int serverPort = sim.start();
    uri = URI.create(String.format("http://localhost:%d/api/v1/scheduler", serverPort));
}
 
Example #10
Source File: ProtobufMesosClientBuilder.java    From mesos-rxjava with Apache License 2.0 5 votes vote down vote up
/**
 * @return  An initial {@link MesosClientBuilder} that will use protobuf
 *          for the {@link org.apache.mesos.v1.scheduler.Protos.Call Call} and
 *          {@link org.apache.mesos.v1.scheduler.Protos.Event Event} messages.
 */
@NotNull
public static MesosClientBuilder<Protos.Call, Protos.Event> schedulerUsingProtos() {
    return MesosClientBuilder.<Protos.Call, Protos.Event>newBuilder()
        .sendCodec(ProtobufMessageCodecs.SCHEDULER_CALL)
        .receiveCodec(ProtobufMessageCodecs.SCHEDULER_EVENT)
        ;
}
 
Example #11
Source File: ProtobufMesosClientBuilder.java    From mesos-rxjava with Apache License 2.0 5 votes vote down vote up
/**
 * @return  An initial {@link MesosClientBuilder} that will use protobuf
 *          for the {@link org.apache.mesos.v1.executor.Protos.Call Call} and
 *          {@link org.apache.mesos.v1.executor.Protos.Event Event} messages.
 */
@NotNull
public static MesosClientBuilder<
    org.apache.mesos.v1.executor.Protos.Call,
    org.apache.mesos.v1.executor.Protos.Event
    > executorUsingProtos() {
    return MesosClientBuilder.<org.apache.mesos.v1.executor.Protos.Call, org.apache.mesos.v1.executor.Protos.Event>newBuilder()
        .sendCodec(ProtobufMessageCodecs.EXECUTOR_CALL)
        .receiveCodec(ProtobufMessageCodecs.EXECUTOR_EVENT)
        ;
}
 
Example #12
Source File: SchedulerEvents.java    From mesos-rxjava with Apache License 2.0 5 votes vote down vote up
/**
 * Utility method to more succinctly construct an {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#SUBSCRIBED SUBSCRIBED}.
 *
 * @param frameworkId              The frameworkId to be set on the
 *                                 {@link Protos.Event.Subscribed} message.
 * @param heartbeatIntervalSeconds The heartbeatIntervalSeconds to be set on the
 *                                 {@link Protos.Event.Subscribed} message.
 * @return An instance of {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#SUBSCRIBED SUBSCRIBED} and
 * {@link Protos.Event#getSubscribed() subscribed} set based on the provide parameters.
 */
@NotNull
public static Protos.Event subscribed(@NotNull final String frameworkId, final int heartbeatIntervalSeconds) {
    return Protos.Event.newBuilder()
        .setType(Protos.Event.Type.SUBSCRIBED)
        .setSubscribed(
            Protos.Event.Subscribed.newBuilder()
                .setFrameworkId(org.apache.mesos.v1.Protos.FrameworkID.newBuilder()
                    .setValue(frameworkId)
                )
                .setHeartbeatIntervalSeconds(heartbeatIntervalSeconds)
        )
        .build();
}
 
Example #13
Source File: SchedulerEvents.java    From mesos-rxjava with Apache License 2.0 5 votes vote down vote up
/**
 * Utility method to more succinctly construct an {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#UPDATE UPDATE}.
 *
 * @param agentId        The {@link org.apache.mesos.v1.Protos.TaskStatus#getAgentId() agentId} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param executorId     The {@link org.apache.mesos.v1.Protos.TaskStatus#getExecutorId() executorId} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param taskId         The {@link org.apache.mesos.v1.Protos.TaskStatus#getTaskId() taskId} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param state          The {@link org.apache.mesos.v1.Protos.TaskState TaskState} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @param uuid           The {@link org.apache.mesos.v1.Protos.TaskStatus#getUuid() uuid} to be set on the
 *                       {@link org.apache.mesos.v1.Protos.TaskStatus TaskStatus}.
 * @return  A {@link Protos.Call Call} with a configured {@link Protos.Call.Acknowledge Acknowledge}.
 */
@NotNull
public static Protos.Event update(
    @NotNull final org.apache.mesos.v1.Protos.AgentID agentId,
    @NotNull final org.apache.mesos.v1.Protos.ExecutorID executorId,
    @NotNull final org.apache.mesos.v1.Protos.TaskID taskId,
    @NotNull final org.apache.mesos.v1.Protos.TaskState state,
    @Nullable final ByteString uuid
) {
    final org.apache.mesos.v1.Protos.TaskStatus.Builder builder = org.apache.mesos.v1.Protos.TaskStatus.newBuilder()
        .setAgentId(agentId)
        .setExecutorId(executorId)
        .setTaskId(taskId)
        .setState(state);

    final org.apache.mesos.v1.Protos.TaskStatus status;
    if (uuid != null) {
        status = builder.setUuid(uuid).build();
    } else {
        status = builder.build();
    }

    return Protos.Event.newBuilder()
        .setType(Protos.Event.Type.UPDATE)
        .setUpdate(
            Protos.Event.Update.newBuilder()
                .setStatus(status)
        )
        .build();
}
 
Example #14
Source File: SleepySimulationTest.java    From mesos-rxjava with Apache License 2.0 4 votes vote down vote up
@Test
public void offerSimulation() throws Throwable {
    final String fwId = "sleepy-" + UUID.randomUUID();
    final org.apache.mesos.v1.Protos.FrameworkID frameworkID = org.apache.mesos.v1.Protos.FrameworkID.newBuilder()
        .setValue(fwId)
        .build();
    final Protos.Call subscribe = SchedulerCalls.subscribe(
        frameworkID,
        org.apache.mesos.v1.Protos.FrameworkInfo.newBuilder()
            .setId(frameworkID)
            .setUser("root")
            .setName("sleepy")
            .setFailoverTimeout(0)
            .setRole("*")
            .build()
    );

    async.run("sleepy-framework", () -> Sleepy._main(fwId, uri.toString(), "1", "*"));

    subject.onNext(subscribed(fwId, 15));
    sim.awaitSubscribeCall();
    final List<Protos.Call> callsReceived1 = sim.getCallsReceived();
    assertThat(callsReceived1).hasSize(1);
    assertThat(callsReceived1.get(0)).isEqualTo(subscribe);

    // send a heartbeat
    subject.onNext(HEARTBEAT);
    // send an offer
    subject.onNext(resourceOffer("host-1", "offer-1", "agent-1", fwId, 4, 16 * 1024, 100 * 1024));

    sim.awaitCall();  // wait for accept to reach the server
    final List<Protos.Call> callsReceived2 = sim.getCallsReceived();
    assertThat(callsReceived2).hasSize(2);
    final Protos.Call.Accept accept = callsReceived2.get(1).getAccept();
    assertThat(accept).isNotNull();
    assertThat(
        accept.getOfferIdsList().stream()
            .map(org.apache.mesos.v1.Protos.OfferID::getValue)
            .collect(Collectors.toList())
    ).isEqualTo(newArrayList("offer-1"));
    final List<org.apache.mesos.v1.Protos.TaskInfo> taskInfos = accept.getOperationsList().stream()
        .map(org.apache.mesos.v1.Protos.Offer.Operation::getLaunch)
        .flatMap(l -> l.getTaskInfosList().stream())
        .collect(Collectors.toList());
    assertThat(taskInfos).hasSize(4);
    assertThat(
        taskInfos.stream()
            .map(t -> t.getTaskId().getValue())
            .collect(Collectors.toSet())
    ).isEqualTo(newHashSet("task-1-1", "task-1-2", "task-1-3", "task-1-4"));

    // send task status updates
    final ByteString uuid1 = ByteString.copyFromUtf8(UUID.randomUUID().toString());
    final ByteString uuid2 = ByteString.copyFromUtf8(UUID.randomUUID().toString());
    final ByteString uuid3 = ByteString.copyFromUtf8(UUID.randomUUID().toString());
    final ByteString uuid4 = ByteString.copyFromUtf8(UUID.randomUUID().toString());
    subject.onNext(update("agent-1", "task-1-1", "task-1-1", TASK_RUNNING, uuid1));
    subject.onNext(update("agent-1", "task-1-2", "task-1-2", TASK_RUNNING, uuid2));
    subject.onNext(update("agent-1", "task-1-3", "task-1-3", TASK_RUNNING, uuid3));
    subject.onNext(update("agent-1", "task-1-4", "task-1-4", TASK_RUNNING, uuid4));

    // wait for the task status updates to be ack'd
    sim.awaitCall(4);
    final List<Protos.Call> callsReceived3 = sim.getCallsReceived();
    assertThat(callsReceived3).hasSize(6);
    final List<Protos.Call> ackCalls = callsReceived3.subList(2, 6);
    final Set<ByteString> ackdUuids = ackCalls.stream()
        .map(c -> c.getAcknowledge().getUuid())
        .collect(Collectors.toSet());

    assertThat(ackdUuids).isEqualTo(newHashSet(uuid1, uuid2, uuid3, uuid4));

    // send another offer with too little cpu for a task to run
    subject.onNext(resourceOffer("host-1", "offer-2", "agent-1", fwId, 0.9, 15 * 1024, 100 * 1024));

    // wait for the decline of the offer
    sim.awaitCall();
    final List<Protos.Call> callsReceived4 = sim.getCallsReceived();
    assertThat(callsReceived4).hasSize(7);
    final Protos.Call.Decline decline = callsReceived4.get(6).getDecline();
    assertThat(
        decline.getOfferIdsList().stream()
            .map(org.apache.mesos.v1.Protos.OfferID::getValue)
            .collect(Collectors.toList())
    ).isEqualTo(newArrayList("offer-2"));

    subject.onCompleted();
    sim.awaitSendingEvents();
}
 
Example #15
Source File: SchedulerEvents.java    From mesos-rxjava with Apache License 2.0 4 votes vote down vote up
/**
 * Utility method to more succinctly construct an {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#OFFERS OFFERS}.
 *
 * @param hostname    The hostname to set on the offer.
 * @param offerId     The offerId to set on the offer.
 * @param agentId     The agentId to set on the offer.
 * @param frameworkId The frameworkId to set on the offer.
 * @param cpus        The number of cpus the offer will have.
 * @param mem         The number of megabytes of memory the offer will have.
 * @param disk        The number of megabytes of disk the offer will have.
 * @return An {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#OFFERS OFFERS} containing a single
 * {@link org.apache.mesos.v1.Protos.Offer Offer} using the specified parameters as the values of the offer.
 */
@NotNull
public static Protos.Event resourceOffer(
    @NotNull final String hostname,
    @NotNull final String offerId,
    @NotNull final String agentId,
    @NotNull final String frameworkId,
    final double cpus,
    final long mem,
    final long disk
) {
    return Protos.Event.newBuilder()
        .setType(Protos.Event.Type.OFFERS)
        .setOffers(
            Protos.Event.Offers.newBuilder()
                .addAllOffers(Collections.singletonList(
                    org.apache.mesos.v1.Protos.Offer.newBuilder()
                        .setHostname(hostname)
                        .setId(org.apache.mesos.v1.Protos.OfferID.newBuilder().setValue(offerId))
                        .setAgentId(org.apache.mesos.v1.Protos.AgentID.newBuilder().setValue(agentId))
                        .setFrameworkId(org.apache.mesos.v1.Protos.FrameworkID.newBuilder().setValue(frameworkId))
                        .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder()
                            .setName("cpus")
                            .setRole("*")
                            .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR)
                            .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(cpus)))
                        .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder()
                            .setName("mem")
                            .setRole("*")
                            .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR)
                            .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(mem)))
                        .addResources(org.apache.mesos.v1.Protos.Resource.newBuilder()
                            .setName("disk")
                            .setRole("*")
                            .setType(org.apache.mesos.v1.Protos.Value.Type.SCALAR)
                            .setScalar(org.apache.mesos.v1.Protos.Value.Scalar.newBuilder().setValue(disk)))
                        .build()
                ))
        )
        .build();
}
 
Example #16
Source File: SchedulerDriver.java    From Juice with GNU General Public License v3.0 4 votes vote down vote up
private Protos.Call acknowledgeCall(TaskStatus status) {
    return SchedulerCalls.ackUpdate(frameworkId, status.getUuid(), status.getAgentId(), status.getTaskId());
}
 
Example #17
Source File: AuxiliaryService.java    From Juice with GNU General Public License v3.0 4 votes vote down vote up
public static void declineOffer(final @NotNull Protocol protocol, final @NotNull String streamId, final @NotNull FrameworkID frameworkID,
                                final @NotNull Protos.Call call, final @NotNull String url) {
    fixedSendPool.submit(() -> decline(protocol, streamId, frameworkID, call, url));
}
 
Example #18
Source File: SchedulerEvents.java    From mesos-rxjava with Apache License 2.0 3 votes vote down vote up
/**
 * Utility method to more succinctly construct an {@link Protos.Event Event} of type
 * {@link Protos.Event.Type#MESSAGE MESSAGE}.
 *
 * @param agentId        The {@link org.apache.mesos.v1.Protos.AgentID#getValue() value} of the
 *                       {@link Protos.Event.Message#getAgentId() agentId} to be set on the
 *                       {@link Protos.Event.Message Message}.
 * @param executorId     The {@link org.apache.mesos.v1.Protos.ExecutorID#getValue() value} of the
 *                       {@link Protos.Event.Message#getExecutorId() executorId} to be set on the
 *                       {@link Protos.Event.Message Message}.
 * @param data           The {@link Protos.Event.Message#getData() data} to be set on the
 *                       {@link Protos.Event.Message Message}.
 * @return  A {@link Protos.Call Call} with a configured {@link Protos.Call.Acknowledge Acknowledge}.
 */
@NotNull
public static Protos.Event message(
    @NotNull final String agentId,
    @NotNull final String executorId,
    @NotNull final ByteString data
) {
    return message(
        org.apache.mesos.v1.Protos.AgentID.newBuilder().setValue(agentId).build(),
        org.apache.mesos.v1.Protos.ExecutorID.newBuilder().setValue(executorId).build(),
        data
    );
}