String toApplicationName(ModuleDeploymentId moduleDeploymentId) { return APPLICATION_PREFIX + moduleDeploymentId.toString(); }
private static ModuleDeploymentId clusterIdToModuleDeploymentId(String clusterId) { String[] split = clusterId.split(":"); if (split.length == 2) { return new ModuleDeploymentId(split[0], split[1]); } else { throw new IllegalArgumentException("Invalid clusterId=[" + clusterId + "]"); } }
ModuleDeploymentId toModuleDeploymentId(String applicationName) { String moduleIdString = moduleIdString(applicationName); if (moduleIdString == null) { return null; } try { return ModuleDeploymentId.parse(moduleIdString); } catch (IllegalArgumentException e) { return null; // We ignore invalid format cases } }
/** * Undeploy the given stream. * * @param stream stream to undeploy */ private void undeployStream(StreamDefinition stream) { for (ModuleDefinition module : stream.getModuleDefinitions()) { ModuleDeploymentId id = ModuleDeploymentId.fromModuleDefinition(module); ModuleStatus status = this.deployer.status(id); if (!EnumSet.of(DeploymentState.unknown, DeploymentState.undeployed) .contains(status.getState())) { this.deployer.undeploy(id); } } }
/** * Return a string that describes the state of the given stream. * @param name name of stream to determine state for * @return stream state * @see DeploymentState */ private String calculateStreamState(String name) { Set<DeploymentState> moduleStates = EnumSet.noneOf(DeploymentState.class); StreamDefinition stream = repository.findOne(name); for (ModuleDefinition module : stream.getModuleDefinitions()) { ModuleStatus status = deployer.status(ModuleDeploymentId.fromModuleDefinition(module)); moduleStates.add(status.getState()); } logger.debug("Module states for stream {}: {}", name, moduleStates); return aggregateState(moduleStates).toString(); }
@Override public TaskDefinitionResource instantiateResource(TaskDefinition taskDefinition) { ModuleDeploymentId id = ModuleDeploymentId.fromModuleDefinition(taskDefinition.getModuleDefinition()); TaskDefinitionResource taskDefinitionResource = new TaskDefinitionResource(taskDefinition.getName(), taskDefinition.getDslText()); taskDefinitionResource.setStatus(moduleDeployer.status(id).getState().name()); return taskDefinitionResource; } }
@RequestMapping("/{id}") public ModuleStatusResource display(@PathVariable String id) { ModuleDeploymentId moduleDeploymentId = ModuleDeploymentId.parse(id); for (ModuleDeployer moduleDeployer : moduleDeployers) { ModuleStatus status = moduleDeployer.status(moduleDeploymentId); if (status != null) { return statusAssembler.toResource(status); } } throw new ResourceNotFoundException(); }
@Override public ModuleDeploymentId deploy(ModuleDeploymentRequest request) { ModuleDefinition definition = request.getDefinition(); ModuleDeploymentId moduleDeploymentId = new ModuleDeploymentId(definition.getGroup(), definition.getLabel()); String applicationName = this.cloudFoundryModuleDeploymentConverter.toApplicationName(moduleDeploymentId); PushBindAndStartApplicationResults response = this.resourceClient.pushBindAndStartApplication(new PushBindAndStartApplicationParameters() .withEnvironment(this.cloudFoundryModuleDeploymentConverter.toModuleLauncherEnvironment(request)) .withInstances(request.getCount()) .withName(applicationName) .withResource(properties.getModuleLauncherLocation()) .withServiceInstanceNames(this.properties.getServices()) ); if (!response.isCreateSucceeded()) { throw new IllegalStateException("Module " + moduleDeploymentId + " could not be deployed"); } return moduleDeploymentId; }
@Override public Map<ModuleDeploymentId, ModuleStatus> status() { HashMap<ModuleDeploymentId, ModuleStatus> statuses = new HashMap<ModuleDeploymentId, ModuleStatus>(); for (Entry<String, String> entry : yarnCloudAppService.getClustersStates().entrySet()) { ModuleDeploymentId id = clusterIdToModuleDeploymentId(entry.getKey()); YarnModuleInstanceStatus status = new YarnModuleInstanceStatus(id.toString(), entry .getValue().equals("RUNNING"), null); statuses.put(id, ModuleStatus.of(id).with(status).build()); } return statuses; }
@Override public ModuleDeploymentId deploy(ModuleDeploymentRequest request) { int count = request.getCount(); ModuleCoordinates coordinates = request.getCoordinates(); ModuleDefinition definition = request.getDefinition(); ModuleDeploymentId id = ModuleDeploymentId.fromModuleDefinition(definition); String clusterId = moduleDeploymentIdToClusterId(id); String module = coordinates.toString(); Map<String, String> definitionParameters = definition.getParameters(); Map<String, String> deploymentProperties = request.getDeploymentProperties(); logger.info("deploying request for definition: " + definition); logger.info("deploying module: " + module); logger.info("definitionParameters: " + definitionParameters); logger.info("deploymentProperties: " + deploymentProperties); // TODO: using default app name "app" until we start to customise // via deploymentProperties Message<Events> message = MessageBuilder.withPayload(Events.DEPLOY) .setHeader(YarnCloudAppStateMachine.HEADER_APP_VERSION, "app") .setHeader(YarnCloudAppStateMachine.HEADER_CLUSTER_ID, clusterId) .setHeader(YarnCloudAppStateMachine.HEADER_COUNT, count) .setHeader(YarnCloudAppStateMachine.HEADER_MODULE, module) .setHeader(YarnCloudAppStateMachine.HEADER_DEFINITION_PARAMETERS, definitionParameters) .build(); stateMachine.sendEvent(message); return id; }
@RequestMapping public PagedResources<ModuleInstanceStatusResource> list(@PathVariable String moduleId, PagedResourcesAssembler<ModuleInstanceStatus> assembler) { ModuleDeploymentId moduleDeploymentId = ModuleDeploymentId.parse(moduleId); for (ModuleDeployer moduleDeployer : moduleDeployers) { ModuleStatus status = moduleDeployer.status(moduleDeploymentId); if (status != null) { List<ModuleInstanceStatus> moduleInstanceStatuses = new ArrayList<>(status.getInstances().values()); Collections.sort(moduleInstanceStatuses, INSTANCE_SORTER); return assembler.toResource(new PageImpl<>(moduleInstanceStatuses), new InstanceAssembler(status)); } } throw new ResourceNotFoundException(); }
@Override public ModuleStatus status(ModuleDeploymentId id) { ModuleStatus status = status().get(id); if (status == null) { status = ModuleStatus.of(id) .with(new YarnModuleInstanceStatus(id.toString(), false, Collections.<String, String>emptyMap())) .build(); } return status; }
@RequestMapping("/{instanceId}") public ModuleInstanceStatusResource display(@PathVariable String moduleId, @PathVariable String instanceId) { ModuleDeploymentId moduleDeploymentId = ModuleDeploymentId.parse(moduleId); for (ModuleDeployer moduleDeployer : moduleDeployers) { ModuleStatus status = moduleDeployer.status(moduleDeploymentId); if (status != null) { ModuleInstanceStatus moduleInstanceStatus = status.getInstances().get(instanceId); if (moduleInstanceStatus == null) { throw new ResourceNotFoundException(); } return new InstanceAssembler(status).toResource(moduleInstanceStatus); } } throw new ResourceNotFoundException(); }
@Override protected ModuleStatusResource instantiateResource(ModuleStatus entity) { ModuleStatusResource resource = new ModuleStatusResource(entity.getModuleDeploymentId().toString(), entity.getState().name()); List<ModuleInstanceStatusResource> instanceStatusResources = new ArrayList<>(); InstanceAssembler instanceAssembler = new InstanceAssembler(entity); List<ModuleInstanceStatus> instanceStatuses = new ArrayList<>(entity.getInstances().values()); Collections.sort(instanceStatuses, INSTANCE_SORTER); for (ModuleInstanceStatus moduleInstanceStatus : instanceStatuses) { instanceStatusResources.add(instanceAssembler.toResource(moduleInstanceStatus)); } resource.setInstances(new Resources<>(instanceStatusResources)); return resource; } }