// required for to write the deployment properties back to Jenkins environment variables.
  @Override
  public void makeBuildVariables(AbstractBuild build, Map<String, String> variables) {

    int counter = 1;

    for (Deployment deployment : deployments) {
      // change counter to string and append be for build environment
      String strCounter = "BE_" + Integer.toString(counter);
      variables.putAll(deployment.getDeploymentComponents(strCounter));
      counter++;
    }
  }
  protected boolean doTearDown() throws IOException, InterruptedException {
    boolean result = true;

    List<Deployment> reversedList = new ArrayList<Deployment>(deployments);
    Collections.reverse(reversedList);

    for (Deployment deployment : reversedList) {
      // automatically delete the stack?
      result = result && deployment.Destroy();
    }

    return result;
  }
  @Override
  public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener)
      throws IOException, InterruptedException {

    EnvVars env = build.getEnvironment(listener);
    env.overrideAll(build.getBuildVariables());
    EnvVariableResolver helper = new EnvVariableResolver(build, listener);

    boolean success = true;

    int counter = 1;
    for (PluginParam param : params) {

      // resolve build vars in request params
      List<RequestParam> rparamResolved = new ArrayList<RequestParam>();
      ;

      for (RequestParam rparam : param.getRequestParams()) {
        String rparamString =
            helper.replaceBuildParamWithValue(rparam.getRequestParam().toString());
        rparamResolved.add(new RequestParam(rparamString));
      }

      // Resolve any environment variables in the parameters
      PluginParam fparam =
          new PluginParam(
              helper.replaceBuildParamWithValue(param.getServerUrl()),
              helper.replaceBuildParamWithValue(param.getUserName()),
              helper.replaceBuildParamWithValue(param.getPassword()),
              helper.replaceBuildParamWithValue(param.getTenant()),
              helper.replaceBuildParamWithValue(param.getBluePrintName()),
              param.isWaitExec(),
              param.getRequestTemplate(),
              rparamResolved);

      final Deployment deployment = newDeployment(listener.getLogger(), fparam);

      if (deployment.Create()) {
        this.deployments.add(deployment);
        // change counter to string and append be for build environment
        String strCounter = Integer.toString(counter) + "be";
        env.putAll(deployment.getDeploymentComponents(strCounter));
        counter++;
      } else {
        build.setResult(Result.FAILURE);
        success = false;
        break;
      }

      if (!success) {
        doTearDown();
        return null;
      }
    }
    return new Environment() {
      @Override
      public boolean tearDown(AbstractBuild build, BuildListener listener)
          throws IOException, InterruptedException {

        return doTearDown();
      }
    };
  }