@Override public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException, Exception { if (!name.contains(":")) { OperationResult badName = new OperationResult("Operation name did not contain a ':'"); badName.setErrorMessage("Operation name did not contain a ':'"); return badName; } int colonPos = name.indexOf(':'); String what = name.substring(0, colonPos); String op = name.substring(colonPos + 1); Operation operation = null; Address theAddress = new Address(); if (what.equals("server-group")) { String groupName = parameters.getSimpleValue("name", ""); String profile = parameters.getSimpleValue("profile", "default"); theAddress.add("server-group", groupName); operation = new Operation(op, theAddress); operation.addAdditionalProperty("profile", profile); } else if (what.equals("server")) { if (context.getResourceType().getName().equals("JBossAS-Managed")) { String host = pluginConfiguration.getSimpleValue("domainHost", "local"); theAddress.add("host", host); theAddress.add("server-config", myServerName); operation = new Operation(op, theAddress); } else if (context.getResourceType().getName().equals("Host")) { theAddress.add(address); String serverName = parameters.getSimpleValue("name", null); theAddress.add("server-config", serverName); Map<String, Object> props = new HashMap<String, Object>(); String serverGroup = parameters.getSimpleValue("group", null); props.put("group", serverGroup); if (op.equals("add")) { props.put("name", serverName); boolean autoStart = parameters.getSimple("auto-start").getBooleanValue(); props.put("auto-start", autoStart); // TODO put more properties in } operation = new Operation(op, theAddress, props); } else { operation = new Operation(op, theAddress); } } else if (what.equals("destination")) { theAddress.add(address); String newName = parameters.getSimpleValue("name", ""); String type = parameters.getSimpleValue("type", "jms-queue").toLowerCase(); theAddress.add(type, newName); PropertyList jndiNamesProp = parameters.getList("entries"); if (jndiNamesProp == null || jndiNamesProp.getList().isEmpty()) { OperationResult fail = new OperationResult(); fail.setErrorMessage("No jndi bindings given"); return fail; } List<String> jndiNames = new ArrayList<String>(); for (Property p : jndiNamesProp.getList()) { PropertySimple ps = (PropertySimple) p; jndiNames.add(ps.getStringValue()); } operation = new Operation(op, theAddress); operation.addAdditionalProperty("entries", jndiNames); if (type.equals("jms-queue")) { PropertySimple ps = (PropertySimple) parameters.get("durable"); if (ps != null) { boolean durable = ps.getBooleanValue(); operation.addAdditionalProperty("durable", durable); } String selector = parameters.getSimpleValue("selector", ""); if (!selector.isEmpty()) operation.addAdditionalProperty("selector", selector); } } else if (what.equals("managed-server")) { String chost = parameters.getSimpleValue("hostname", ""); String serverName = parameters.getSimpleValue("servername", ""); String serverGroup = parameters.getSimpleValue("server-group", ""); String socketBindings = parameters.getSimpleValue("socket-bindings", ""); String portS = parameters.getSimpleValue("port-offset", "0"); int port = Integer.parseInt(portS); String autostartS = parameters.getSimpleValue("auto-start", "false"); boolean autoStart = Boolean.getBoolean(autostartS); theAddress.add("host", chost); theAddress.add("server-config", serverName); Map<String, Object> props = new HashMap<String, Object>(); props.put("name", serverName); props.put("group", serverGroup); props.put("socket-binding-group", socketBindings); props.put("socket-binding-port-offset", port); props.put("auto-start", autoStart); operation = new Operation(op, theAddress, props); } else if (what.equals("domain")) { operation = new Operation(op, new Address()); } else if (what.equals("domain-deployment")) { if (op.equals("promote")) { String serverGroup = parameters.getSimpleValue("server-group", "-not set-"); List<String> serverGroups = new ArrayList<String>(); if (serverGroup.equals("__all")) { serverGroups.addAll(getServerGroups()); } else { serverGroups.add(serverGroup); } String resourceKey = context.getResourceKey(); resourceKey = resourceKey.substring(resourceKey.indexOf("=") + 1); log.info( "Promoting [" + resourceKey + "] to server group(s) [" + Arrays.asList(serverGroups) + "]"); PropertySimple simple = parameters.getSimple("enabled"); Boolean enabled = false; if (simple != null && simple.getBooleanValue() != null) enabled = simple.getBooleanValue(); operation = new CompositeOperation(); for (String theGroup : serverGroups) { theAddress = new Address(); theAddress.add("server-group", theGroup); theAddress.add("deployment", resourceKey); Operation step = new Operation("add", theAddress); step.addAdditionalProperty("enabled", enabled); ((CompositeOperation) operation).addStep(step); } } } else if (what.equals("naming")) { if (op.equals("jndi-view")) { theAddress.add(address); operation = new Operation("jndi-view", theAddress); } } OperationResult operationResult = new OperationResult(); if (operation != null) { Result result = connection.execute(operation); if (!result.isSuccess()) { operationResult.setErrorMessage(result.getFailureDescription()); } else { String tmp; if (result.getResult() == null) tmp = "-none provided by the server-"; else tmp = result.getResult().toString(); operationResult.setSimpleResult(tmp); } } else { operationResult.setErrorMessage("No valid operation was given for input [" + name + "]"); } return operationResult; }
/** * Do the actual fumbling with the domain api to deploy the uploaded content * * @param report CreateResourceReport to report the result * @param runtimeName File name to use as runtime name * @param deploymentName Name of the deployment * @param hash Hash of the content bytes * @return the passed report with success or failure settings */ public CreateResourceReport runDeploymentMagicOnServer( CreateResourceReport report, String runtimeName, String deploymentName, String hash) { boolean toServerGroup = context.getResourceKey().contains("server-group="); log.info("Deploying [" + runtimeName + "] to domain only= " + !toServerGroup + " ..."); ASConnection connection = getASConnection(); Operation step1 = new Operation("add", "deployment", deploymentName); // step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash)); List<Object> content = new ArrayList<Object>(1); Map<String, Object> contentValues = new HashMap<String, Object>(); contentValues.put("hash", new PROPERTY_VALUE("BYTES_VALUE", hash)); content.add(contentValues); step1.addAdditionalProperty("content", content); step1.addAdditionalProperty("name", deploymentName); step1.addAdditionalProperty("runtime-name", runtimeName); String resourceKey; Result result; CompositeOperation cop = new CompositeOperation(); cop.addStep(step1); /* * We need to check here if this is an upload to /deployment only * or if this should be deployed to a server group too */ if (!toServerGroup) { // if standalone, then :deploy the deployment anyway if (context.getResourceType().getName().contains("Standalone")) { Operation step2 = new Operation("deploy", step1.getAddress()); cop.addStep(step2); } result = connection.execute(cop); resourceKey = step1.getAddress().getPath(); } else { Address serverGroupAddress = new Address(context.getResourceKey()); serverGroupAddress.add("deployment", deploymentName); Operation step2 = new Operation("add", serverGroupAddress); cop.addStep(step2); Operation step3 = new Operation("deploy", serverGroupAddress); cop.addStep(step3); resourceKey = serverGroupAddress.getPath(); if (verbose) log.info("Deploy operation: " + cop); result = connection.execute(cop); } if ((!result.isSuccess())) { String failureDescription = result.getFailureDescription(); report.setErrorMessage(failureDescription); report.setStatus(CreateResourceStatus.FAILURE); log.warn(" ... done with failure: " + failureDescription); } else { report.setStatus(CreateResourceStatus.SUCCESS); report.setResourceName(runtimeName); report.setResourceKey(resourceKey); log.info(" ... with success and key [" + resourceKey + "]"); } return report; }