code: @Override
    public Deployment undeployJob(final String host, final JobId jobId, final String token)
        throws HostNotFoundException, JobNotDeployedException, TokenVerificationException {
      log.info("undeploying {}: {}", jobId, host);
      final ZooKeeperClient client = provider.get("undeployJob");
  
      assertHostExists(client, host);
  
      final Deployment deployment = getDeployment(host, jobId);
      if (deployment == null) {
        throw new JobNotDeployedException(host, jobId);
      }
  
      final Job job = getJob(client, jobId);
      verifyToken(token, job);
      final String configHostJobPath = Paths.configHostJob(host, jobId);
  
      try {
        // use listRecursive to remove both job node and its child creation node
        final List<String> nodes = newArrayList(reverse(client.listRecursive(configHostJobPath)));
        nodes.add(Paths.configJobHost(jobId, host));
  
        final List<Integer> staticPorts = staticPorts(job);
        for (final int port : staticPorts) {
          nodes.add(Paths.configHostPort(host, port));
        }
  
        client.transaction(delete(nodes));
  
      } catch (NoNodeException e) {
        // This method is racy since it's possible someone undeployed the job after we called
        // getDeployment and checked the job exists. If we now discover the job is undeployed,
        // throw an exception and handle it the same as if we discovered this earlier.
        throw new JobNotDeployedException(host, jobId);
      } catch (KeeperException e) {
        throw new HeliosRuntimeException("Removing deployment failed", e);
      }
      return deployment;
    }
docs: Undeploys the job specified by {@code jobId} on {@code host}.