// Example envs, could be one of the following

def defaultEnvs = [
  [env: "stage", region: "us-east-1"],
  [env: "prod", region: "us-east-1"]
]

// Or

def defaultEnvs = [
  [env: "stage", region: "us-east-1"]
]

// Or

def defaultEnvs = [
  [env: "stage", region: "us-east-1"],
  [env: "prod", region: "us-east-1"],
  [env: "stage", region: "eu-central-1"],
  [env: "prod", region: "eu-central-1"]
]

// Etc...


stage("Plan") {
  def planJobs = [:]

  for(int i = 0; i < envs.size(); i++) {
    def details = envs.get(i)

    planJobs["${details-env}-${details.region}"] = {
      node() {
        checkout scm
        // run things, etc
      }
    }
  }

  parallel(planJobs)
}


stage("Apply") {
  def applyJobs = [:]

  for(int i = 0; i < envs.size(); i++) {
    def details = envs.get(i)

    applyJobs["${details-env}-${details.region}"] = {
      def apply = false

      try {
        confirmedUser = input message: 'Apply Plan?', ok: 'Apply', submitterParameter: 'confirmedUser'
        apply = true
      } catch (err) {
        apply = false
        currentBuild.result = 'ABORTED'
      }


      if(apply) {
        node() {
          checkout scm
          // run things, etc
        }
      }
    }
  }

  parallel(applyJobs)
}