public FormValidation doCheckWorkflowName(
        @QueryParameter final String serverUrl,
        @QueryParameter final String userName,
        @QueryParameter final String password,
        @QueryParameter final String tenant,
        @QueryParameter final String workflowName)
        throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException, IOException,
            URISyntaxException {

      String workflowNameValue = Util.fixEmptyAndTrim(workflowName);
      if (workflowNameValue == null) {
        return FormValidation.error("Please enter workflow name.");
      }

      if (workflowNameValue.indexOf('$') >= 0) {
        // set by variable, can't validate
        return FormValidation.ok();
      }
      // Call server and validate
      BuildParam buildParam = new BuildParam(serverUrl, userName, password, tenant, null);
      OrchestratorClient client = new OrchestratorClient(buildParam);
      List<Workflow> workflows = client.fetchWorkflows();

      boolean isWorkflowFound = false;
      for (Workflow workflow : workflows) {
        if (workflow.getName().equals(workflowName)) {
          isWorkflowFound = true;
        }
      }
      if (!isWorkflowFound) {
        return FormValidation.error("Workflow with the given name doesn't exist in the server.");
      }
      return FormValidation.ok();
    }
  @Override
  public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
      throws InterruptedException, IOException {
    PrintStream logger = listener.getLogger();
    EnvVariableResolver resolver = new EnvVariableResolver(build, listener);

    // Resolve the workflowName to workflowId
    BuildParam buildParam = new BuildParam(serverUrl, userName, password, tenant, null);
    OrchestratorClient client = new OrchestratorClient(buildParam);
    String workflowId = null;
    try {
      String resolvedWfName = resolver.getValueForBuildParameter(workflowName);

      List<Workflow> workflows = client.fetchWorkflows();
      for (Workflow workflow : workflows) {
        if (workflow.getName().equals(resolvedWfName)) {
          workflowId = workflow.getId();
          break;
        }
      }
    } catch (Exception e) {
      throw new IOException(e.getMessage(), e);
    }

    if (workflowId == null) {
      throw new IOException("Workflow doesn't exist in the server.");
    }

    BuildParam param =
        new BuildParam(
            resolver.getValueForBuildParameter(serverUrl),
            resolver.getValueForBuildParameter(userName),
            resolver.getValueForBuildParameter(password),
            resolver.getValueForBuildParameter(tenant),
            workflowId,
            waitExec,
            resolver.getValueForBuildParameter(inputParams));
    logger.println("Starting Orchestrator workflow execution : " + param.getWorkflowName());
    param.validate();

    OrchestratorCallable callable = new OrchestratorCallable(param);
    Map<String, String> outputParameters = launcher.getChannel().call(callable);

    if (outputParameters != null && outputParameters.size() > 0) {
      logger.println("Output Parameters from the workflow execution");
      for (Map.Entry entry : outputParameters.entrySet()) {
        logger.println(entry.getKey() + " : " + entry.getValue());
      }
    }

    OrchestratorEnvAction orchestratorAction = new OrchestratorEnvAction(outputParameters);
    build.addAction(orchestratorAction);

    return true;
  }