#!groovy

import jenkins.model.*
import hudson.model.*
import hudson.slaves.*
import hudson.plugins.sshslaves.*

def launcherName = ${launcher}.getClass().getName()
def retStrategyName = new hudson.slaves.RetentionStrategy.${ret_strategy}().getClass().getName()


switch (launcherName) {
  case 'hudson.slaves.JNLPLauncher':
    result = Jenkins.instance.slaves.find{
               it.name == "${name}" &&
               it.numExecutors == ${num_executors} &&
               it.nodeDescription == "${desc}" &&
               it.remoteFS == "${remote_home}" &&
               it.labelString == "${label}" &&
               it.mode == Node.Mode.${node_mode} &&
               it.launcher.tunnel == ("${tunnel}" ?: null) &&
               it.launcher.vmargs == ("${jvmopts}" ?: null) &&
               it.launcher.getClass().getName().equals(launcherName) &&
               it.retentionStrategy.getClass().getName().equals(retStrategyName)
             }
    break
  default:
    result = Jenkins.instance.slaves.find{
               it.name == "${name}" &&
               it.numExecutors == ${num_executors} &&
               it.nodeDescription == "${desc}" &&
               it.remoteFS == "${remote_home}" &&
               it.labelString == "${label}" &&
               it.mode == Node.Mode.${node_mode} &&
               it.launcher.vmargs == ("${jvmopts}" ?: null) &&
               it.launcher.getClass().getName().equals(launcherName) &&
               it.retentionStrategy.getClass().getName().equals(retStrategyName)
             }
    break
}

if(result){
  print("EXISTS")
}else{
  Slave slave = new DumbSlave(
                    "${name}",
                    "${desc}",
                    "${remote_home}",
                    "${num_executors}",
                    Node.Mode.${node_mode},
                    "${label}",
                    ${launcher},
                    new RetentionStrategy.${ret_strategy}(),
                    new LinkedList())
  Jenkins.instance.addNode(slave)
  print("CREATED")
}

