All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hubspot.singularity.data.zkmigrations.SingularityCmdLineArgsMigration Maven / Gradle / Ivy

package com.hubspot.singularity.data.zkmigrations;

import java.util.Collections;
import java.util.List;

import javax.inject.Singleton;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.utils.ZKPaths;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Optional;
import com.google.common.base.Throwables;
import com.google.inject.Inject;
import com.hubspot.mesos.Resources;
import com.hubspot.singularity.SingularityCreateResult;
import com.hubspot.singularity.SingularityPendingRequest;
import com.hubspot.singularity.SingularityPendingRequest.PendingType;
import com.hubspot.singularity.SingularityPendingTask;
import com.hubspot.singularity.SingularityPendingTaskId;
import com.hubspot.singularity.data.TaskManager;
import com.hubspot.singularity.data.transcoders.StringTranscoder;
import com.hubspot.singularity.data.transcoders.Transcoder;

@Singleton
public class SingularityCmdLineArgsMigration extends ZkDataMigration {

  private static final Logger LOG = LoggerFactory.getLogger(SingularityCmdLineArgsMigration.class);

  private final CuratorFramework curator;
  private final TaskManager taskManager;
  private final ObjectMapper objectMapper;
  private final Transcoder pendingRequestTranscoder;

  @Inject
  public SingularityCmdLineArgsMigration(CuratorFramework curator, TaskManager taskManager, ObjectMapper objectMapper, Transcoder pendingRequestTranscoder) {
    super(4);
    this.curator = curator;
    this.taskManager = taskManager;
    this.objectMapper = objectMapper;
    this.pendingRequestTranscoder = pendingRequestTranscoder;
  }

  static class SingularityPendingRequestPrevious {

    private final String requestId;
    private final String deployId;
    private final long timestamp;
    private final PendingType pendingType;
    private final Optional user;
    private final Optional cmdLineArgs;

    @JsonCreator
    public SingularityPendingRequestPrevious(@JsonProperty("requestId") String requestId, @JsonProperty("deployId") String deployId, @JsonProperty("timestamp") long timestamp,
        @JsonProperty("user") Optional user, @JsonProperty("pendingType") PendingType pendingType, @JsonProperty("cmdLineArgs") Optional cmdLineArgs) {
      this.requestId = requestId;
      this.deployId = deployId;
      this.timestamp = timestamp;
      this.user = user;
      this.cmdLineArgs = cmdLineArgs;
      this.pendingType = pendingType;
    }

    public String getRequestId() {
      return requestId;
    }

    public String getDeployId() {
      return deployId;
    }

    public long getTimestamp() {
      return timestamp;
    }

    public PendingType getPendingType() {
      return pendingType;
    }

    public Optional getUser() {
      return user;
    }

    public Optional getCmdLineArgs() {
      return cmdLineArgs;
    }



  }

  static final String TASK_PENDING_PATH = "/tasks/scheduled";
  static final String REQUEST_PENDING_PATH = "/requests/pending";

  @Override
  public void applyMigration() {
    checkPendingTasks();
    checkPendingRequests();
  }

  private void checkPendingRequests() {

    try {
      if (curator.checkExists().forPath(REQUEST_PENDING_PATH) == null) {
        return;
      }
    } catch (Exception e) {
      throw Throwables.propagate(e);
    }

    try {
      for (String pendingRequest : curator.getChildren().forPath(REQUEST_PENDING_PATH)) {
        SingularityPendingRequestPrevious previous = objectMapper.readValue(curator.getData().forPath(ZKPaths.makePath(REQUEST_PENDING_PATH, pendingRequest)), SingularityPendingRequestPrevious.class);
        SingularityPendingRequest newRequest = new SingularityPendingRequest(previous.requestId, previous.deployId, previous.timestamp, previous.user, previous.pendingType,
            getCmdLineArgs(previous.cmdLineArgs), Optional. absent(), Optional. absent(), Optional. absent(), Optional. absent());

        LOG.info("Re-saving {}", newRequest);

        curator.setData().forPath(ZKPaths.makePath(REQUEST_PENDING_PATH, pendingRequest), pendingRequestTranscoder.toBytes(newRequest));
      }
    } catch (Exception e) {
      throw Throwables.propagate(e);
    }
  }

  private void checkPendingTasks() {

    try {
      if (curator.checkExists().forPath(TASK_PENDING_PATH) == null) {
        return;
      }
    } catch (Exception e) {
      throw Throwables.propagate(e);
    }

    try {

      for (SingularityPendingTaskId pendingTaskId : taskManager.getPendingTaskIds()) {
        Optional cmdLineArgs = getCmdLineArgs(pendingTaskId);

        SingularityCreateResult result = taskManager.savePendingTask(new SingularityPendingTask(pendingTaskId, getCmdLineArgs(cmdLineArgs), Optional. absent(),
            Optional. absent(), Optional. absent(), Optional. absent(), Optional.absent()));

        LOG.info("Saving {} ({}) {}", pendingTaskId, cmdLineArgs, result);
      }
    } catch (Exception e) {
      throw Throwables.propagate(e);
    }
  }

  private Optional> getCmdLineArgs(Optional cmdLineArgs) {
    return cmdLineArgs.isPresent() ? Optional.of(Collections.singletonList(cmdLineArgs.get())) : Optional.> absent();
  }

  private Optional getCmdLineArgs(SingularityPendingTaskId pendingTaskId) throws Exception {
    byte[] data = curator.getData().forPath(ZKPaths.makePath(TASK_PENDING_PATH, pendingTaskId.getId()));

    if (data != null && data.length > 0) {
      return Optional.of(StringTranscoder.INSTANCE.fromBytes(data));
    }

    return Optional.absent();
  }


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy