/*
* Copyright 2013-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.xd.shell.command;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.PagedResources;
import org.springframework.shell.core.CommandMarker;
import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
import org.springframework.shell.core.annotation.CliCommand;
import org.springframework.shell.core.annotation.CliOption;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.xd.rest.client.RuntimeOperations;
import org.springframework.xd.rest.domain.DetailedContainerResource;
import org.springframework.xd.rest.domain.ModuleMetadataResource;
import org.springframework.xd.shell.XDShell;
import org.springframework.xd.shell.util.Table;
import org.springframework.xd.shell.util.TableHeader;
import org.springframework.xd.shell.util.TableRow;
/**
* Commands to interact with cluster for containers/modules.
*
* @author Ilayaperumal Gopinathan
*/
@Component
public class RuntimeCommands implements CommandMarker {
private static final String LIST_CONTAINERS = "runtime containers";
private static final String LIST_MODULES = "runtime modules";
@Autowired
private XDShell xdShell;
@CliAvailabilityIndicator({ LIST_CONTAINERS, LIST_MODULES })
public boolean available() {
return xdShell.getSpringXDOperations() != null;
}
@CliCommand(value = LIST_CONTAINERS, help = "List runtime containers")
public Table listContainers() {
final PagedResources<DetailedContainerResource> containers = runtimeOperations().listContainers();
final Table table = new Table();
table.addHeader(1, new TableHeader("Container Id"))
.addHeader(2, new TableHeader("Host"))
.addHeader(3, new TableHeader("IP Address"))
.addHeader(4, new TableHeader("PID"))
.addHeader(5, new TableHeader("Groups"))
.addHeader(6, new TableHeader("Custom Attributes"));
for (DetailedContainerResource container : containers) {
Map<String, String> copy = new HashMap<String, String>(container.getAttributes());
final TableRow row = table.newRow();
row.addValue(1, copy.remove("id"))
.addValue(2, copy.remove("host"))
.addValue(3, copy.remove("ip"))
.addValue(4, copy.remove("pid"));
String groups = copy.remove("groups");
row.addValue(5, groups == null ? "" : groups);
row.addValue(6, copy.isEmpty() ? "" : copy.toString());
}
return table;
}
@CliCommand(value = LIST_MODULES, help = "List runtime modules")
public Table listDeployedModules(
@CliOption(mandatory = false, key = { "containerId" }, help = "to filter by container id") String containerId,
@CliOption(mandatory = false, key = { "moduleId" }, help = "to filter by module id") String moduleId) {
Iterable<ModuleMetadataResource> runtimeModules;
if (StringUtils.hasText(containerId) && StringUtils.hasText(moduleId)) {
runtimeModules = Collections.singletonList(runtimeOperations().listDeployedModule(containerId, moduleId));
}
else if (StringUtils.hasText(containerId)) {
runtimeModules = runtimeOperations().listDeployedModulesByContainer(containerId);
}
else if (StringUtils.hasText(moduleId)) {
runtimeModules = runtimeOperations().listDeployedModulesByModuleId(moduleId);
}
else {
runtimeModules = runtimeOperations().listDeployedModules();
}
final Table table = new Table();
table.addHeader(1, new TableHeader("Module Id")).addHeader(2,
new TableHeader("Container Id")).addHeader(3, new TableHeader("Options")).addHeader(4,
new TableHeader("Deployment Properties")).addHeader(5, new TableHeader("Unit status"));
for (ModuleMetadataResource module : runtimeModules) {
final TableRow row = table.newRow();
String unitStatus = (module.getDeploymentStatus() != null) ? module.getDeploymentStatus().name() : "";
row.addValue(1, String.format("%s.%s.%s", module.getUnitName(), module.getModuleType(), module.getName()))
.addValue(2, module.getContainerId()).addValue(3, module.getModuleOptions().toString()).addValue(4,
module.getDeploymentProperties().toString()).addValue(5, unitStatus);
}
return table;
}
private RuntimeOperations runtimeOperations() {
return xdShell.getSpringXDOperations().runtimeOperations();
}
}