private ISoftwareManagementTask createThriftTask(
      ChunkContext chunkContext, String targetName, StatusUpdater statusUpdater) {
    ISoftwareManagementTask task;
    // get command work directory
    File workDir = CommandUtil.createWorkDir(getJobExecutionId(chunkContext));

    // update work directory in job context
    putIntoJobExecutionContext(
        chunkContext, JobConstants.CURRENT_COMMAND_WORK_DIR, workDir.getAbsolutePath());

    boolean needAllocIp = true;
    if (ManagementOperation.DESTROY.equals(managementOperation)
        || ManagementOperation.PRE_DESTROY.equals(managementOperation)) {
      needAllocIp = false;
    }
    String specFilePath = null;

    if (!(ManagementOperation.DESTROY.equals(managementOperation)
        || ManagementOperation.PRE_DESTROY.equals(managementOperation))) {
      // write cluster spec file
      File specFile = clusterManager.writeClusterSpecFile(targetName, workDir, needAllocIp);
      specFilePath = specFile.getAbsolutePath();
    }

    task =
        SoftwareManagementTaskFactory.createThriftTask(
            targetName, specFilePath, statusUpdater, managementOperation, lockClusterEntityMgr);
    return task;
  }