/**
   * Request the launching of an existing task definition. The name must be included in the path.
   *
   * @param name the name of the existing task to be executed (required)
   * @param properties the runtime properties for the task, as a comma-delimited list of key=value
   *     pairs
   */
  @RequestMapping(value = "/{name}", method = RequestMethod.POST)
  @ResponseStatus(HttpStatus.CREATED)
  public void deploy(
      @PathVariable("name") String name, @RequestParam(required = false) String properties) {
    TaskDefinition taskDefinition = this.repository.findOne(name);
    if (taskDefinition == null) {
      throw new NoSuchTaskDefinitionException(name);
    }

    ModuleDefinition module = taskDefinition.getModuleDefinition();
    ArtifactRegistration registration = this.registry.find(module.getName(), ArtifactType.task);
    if (registration == null) {
      throw new IllegalArgumentException(
          String.format(
              "Module %s of type %s not found in registry", module.getName(), ArtifactType.task));
    }
    ArtifactCoordinates coordinates = registration.getCoordinates();

    Map<String, String> deploymentProperties = new HashMap<>();
    module = updateTaskProperties(module, module.getName());
    deploymentProperties.putAll(DeploymentPropertiesUtils.parse(properties));
    deploymentProperties.put(
        ModuleDeployer.GROUP_DEPLOYMENT_ID,
        taskDefinition.getName() + "-" + System.currentTimeMillis());

    this.moduleDeployer.deploy(
        new ModuleDeploymentRequest(module, coordinates, deploymentProperties));
  }
 @Override
 protected ModuleRegistrationResource instantiateResource(ArtifactRegistration registration) {
   return new ModuleRegistrationResource(
       registration.getName(),
       registration.getType().name(),
       registration.getCoordinates().toString());
 }
  /**
   * Retrieve detailed information about a particular module.
   *
   * @param type module type
   * @param name module name
   * @return detailed module information
   */
  @RequestMapping(value = "/{type}/{name}", method = RequestMethod.GET)
  @ResponseStatus(HttpStatus.OK)
  public DetailedModuleRegistrationResource info(
      @PathVariable("type") ArtifactType type, @PathVariable("name") String name) {
    Assert.isTrue(type != ArtifactType.library, "Only modules are supported by this endpoint");
    ArtifactRegistration registration = registry.find(name, type);
    if (registration == null) {
      return null;
    }
    DetailedModuleRegistrationResource result =
        new DetailedModuleRegistrationResource(moduleAssembler.toResource(registration));
    Resource resource = moduleResolver.resolve(adapt(registration.getCoordinates()));

    List<ConfigurationMetadataProperty> properties =
        moduleConfigurationMetadataResolver.listProperties(resource);
    for (ConfigurationMetadataProperty property : properties) {
      result.addOption(property);
    }
    return result;
  }
 @Override
 public ModuleRegistrationResource toResource(ArtifactRegistration registration) {
   return createResourceWithId(
       String.format("%s/%s", registration.getType(), registration.getName()), registration);
 }