package org.rhq.modules.plugins.wildfly10; import java.util.ArrayList; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.pluginapi.configuration.ConfigurationFacet; import org.rhq.core.pluginapi.operation.OperationFacet; import org.rhq.core.pluginapi.operation.OperationResult; import org.rhq.modules.plugins.wildfly10.json.Address; import org.rhq.modules.plugins.wildfly10.json.Operation; import org.rhq.modules.plugins.wildfly10.json.Result; /** * Component class for ModCluster * @author Heiko W. Rupp */ public class ModClusterComponent extends BaseComponent implements OperationFacet, ConfigurationFacet { static String DYNAMIC_PROVIDER = ",dynamic-load-provider=configuration"; @Override public OperationResult invokeOperation(String name, Configuration parameters) throws Exception { Operation op = new Operation(name, getAddress()); OperationResult operationResult = new OperationResult(); Result result = null; String modClusterKeyMesg = "Modcluster resource keys are not in correct format."; modClusterKeyMesg += " Should be {modcluster address}:{jvmRoute}:{virtual-host}:{context} but instead "; modClusterKeyMesg += " was '" + key + "'"; if ("list-proxies".equals(name)) { result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { ArrayList container = (ArrayList) result.getResult(); if ((container != null) && !container.isEmpty()) { Object type = container.get(0); String values = ""; if (type instanceof String) { for (int i = 0; i < container.size(); i++) { values += container.get(i) + ","; } values = values.substring(0, values.length() - 1); } else { values = container.toString(); } operationResult.getComplexResults().put(new PropertySimple("proxy-list", values)); } else {//return empty value. operationResult.getComplexResults().put(new PropertySimple("proxy-list", "")); } } } else if ("add-proxy".equals(name)) { addAdditionalToOp(op, parameters, "host", false); addAdditionalToOp(op, parameters, "port", false); result = getASConnection().execute(op); if (result != null && result.isSuccess()) { operationResult.setSimpleResult("Success"); } } else if ("remove-proxy".equals(name)) { addAdditionalToOp(op, parameters, "host", false); addAdditionalToOp(op, parameters, "port", false); result = getASConnection().execute(op); if (result != null && result.isSuccess()) { operationResult.setSimpleResult("Success"); } } else if ("disable-context".equals(name)) {//disable handled by base case //update the operation components with details from the resource being operated on. //Ex. {modcluster address}:{jvmRoute}:{virtual-host}:{context} String[] keyComponents = key.split(":"); if (keyComponents.length == 4) { op.addAdditionalProperty("virtualhost", keyComponents[2]); op.addAdditionalProperty("context", keyComponents[3]); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else { operationResult.setErrorMessage(modClusterKeyMesg); return operationResult; } } else if ("enable-context".equals(name)) {//enable handled by base case String currentAddress = getAddress().getPath(); //update the operation components with details from the resource being operated on. //Ex. {modcluster address}:{jvmRoute}:{virtual-host}:{context} String[] keyComponents = key.split(":"); if (keyComponents.length == 4) { op.addAdditionalProperty("virtualhost", keyComponents[2]); op.addAdditionalProperty("context", keyComponents[3]); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else { operationResult.setErrorMessage(modClusterKeyMesg); return operationResult; } } else if ("stop-context".equals(name)) { String currentAddress = getAddress().getPath(); //Ex. {modcluster address}:{jvmRoute}:{virtual-host}:{context} String[] keyComponents = key.split(":"); if (keyComponents.length == 4) { op.addAdditionalProperty("virtualhost", keyComponents[2]); op.addAdditionalProperty("context", keyComponents[3]); addAdditionalToOp(op, parameters, "waittime", true); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else { operationResult.setErrorMessage(modClusterKeyMesg); return operationResult; } } else if ("add-custom-metric".equals(name)) { //update the address and operation name. Use class name as identifier. String newOperationDestination = getAddress().getPath() + DYNAMIC_PROVIDER + ",custom-load-metric,custom-load-metric=" + retrieveNewIdentifier(parameters, "class"); op = new Operation("add", new Address(newOperationDestination)); addAdditionalToOp(op, parameters, "class", false); addAdditionalToOp(op, parameters, "weight", false); addAdditionalToOp(op, parameters, "capacity", true); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else if ("remove-custom-metric".equals(name)) { //update the address and operation name. Use class name as identifier. String newOperationDestination = getAddress().getPath() + DYNAMIC_PROVIDER + ",custom-load-metric,custom-load-metric=" + retrieveNewIdentifier(parameters, "class"); op = new Operation("remove", new Address(newOperationDestination)); addAdditionalToOp(op, parameters, "class", false); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else if ("add-metric".equals(name)) { //update the address and operation name. Use class name as identifier. String newOperationDestination = getAddress().getPath() + DYNAMIC_PROVIDER + ",custom-load-metric,load-metric=" + retrieveNewIdentifier(parameters, "type"); op = new Operation("add", new Address(newOperationDestination)); addAdditionalToOp(op, parameters, "weight", false); addAdditionalToOp(op, parameters, "capacity", true); addAdditionalToOp(op, parameters, "type", false); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else if ("remove-metric".equals(name)) { //update the address and operation name. Use class name as identifier. String newOperationDestination = getAddress().getPath() + DYNAMIC_PROVIDER + ",custom-load-metric,load-metric=" + retrieveNewIdentifier(parameters, "type"); op = new Operation("remove", new Address(newOperationDestination)); addAdditionalToOp(op, parameters, "type", false); result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { operationResult.setSimpleResult("Success"); } } else if ("read-proxies-configuration".equals(name)) { //spinder 3/25/12: Can we do better than displaying all content as massive string? // Content is unstructured/variable from httpd server. result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { ArrayList container = (ArrayList) result.getResult(); if ((container != null) && !container.isEmpty()) { Object type = container.get(0); String values = ""; if (type instanceof String) { for (int i = 0; i < container.size(); i++) { values += container.get(i) + ","; } values = values.substring(0, values.length() - 1); } else { values = container.toString(); } operationResult.getComplexResults().put(new PropertySimple("current-proxy-config", values)); } else {//return empty value. operationResult.getComplexResults().put(new PropertySimple("current-proxy-config", "")); } } } else if ("read-proxies-info".equals(name)) { //spinder 3/25/12: Can we do better than displaying all content as massive string? // Content is unstructured/variable from httpd server. result = getASConnection().execute(op); if ((result != null) && (result.isSuccess())) { ArrayList container = (ArrayList) result.getResult(); if ((container != null) && !container.isEmpty()) { Object type = container.get(0); String values = ""; if (type instanceof String) { for (int i = 0; i < container.size(); i++) { values += container.get(i) + ","; } values = values.substring(0, values.length() - 1); } else { values = container.toString(); } operationResult.getComplexResults().put(new PropertySimple("current-proxy-info", values)); } else {//return empty value. operationResult.getComplexResults().put(new PropertySimple("current-proxy-info", "")); } } } else { /* * This is a catch all for operations that are not explicitly treated above. */ result = getASConnection().execute(op); if (result.isSuccess()) { operationResult.setSimpleResult("Success"); } } if (!result.isSuccess()) { operationResult.setErrorMessage(result.getFailureDescription()); } return operationResult; } void addAdditionalToOp(Operation op, Configuration parameters, String parameterName, boolean optional) { String value = parameters.getSimpleValue(parameterName, null); if (value == null) { if (!optional) { throw new IllegalArgumentException("Required parameter [" + parameterName + "] for operation [" + op.getName() + "] is not defined."); } } else { op.addAdditionalProperty(parameterName, value); } } /** Parses the Configuration passed in and retrieves the value of the parameterName * to be used as the resource key. * * @param parameters Configuration * @param parameterName specific property value to retrieve. * @return */ String retrieveNewIdentifier(Configuration parameters, String parameterName) { String identifier = ""; //retrieve the value of the specific property identified by parameterName if ((parameters != null) && (parameterName != null) && !parameterName.isEmpty()) { identifier = parameters.getSimpleValue(parameterName, null); } return identifier; } @Override public Address getAddress() { return new Address(key); } }