@SuppressWarnings("unchecked") private Collection<String> getServerGroups() { Operation op = new ReadChildrenNames(new Address(), "server-group"); Result res = connection.execute(op); return (Collection<String>) res.getResult(); }
/** * Return availability of this resource * * @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability() */ public AvailabilityType getAvailability() { ReadResource op = new ReadResource(address); Result res = connection.execute(op); return res.isSuccess() ? AvailabilityType.UP : AvailabilityType.DOWN; }
/** * Gather measurement data * * @see * org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, * java.util.Set) */ public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception { for (MeasurementScheduleRequest req : metrics) { if (req.getName().startsWith(INTERNAL)) processPluginStats(req, report); else { // Metrics from the application server Operation op = new ReadAttribute(address, req.getName()); // TODO batching Result res = connection.execute(op, false); if (!res.isSuccess()) { log.warn( "Getting metric [" + req.getName() + "] at [ " + address + "] failed: " + res.getFailureDescription()); continue; } String val = (String) res.getResult(); if (val == null) // One of the AS7 ways of telling "This is not implemented" See also AS7-1454 continue; if (req.getDataType() == DataType.MEASUREMENT) { if (!val.equals("no metrics available")) { // AS 7 returns this try { Double d = Double.parseDouble(val); MeasurementDataNumeric data = new MeasurementDataNumeric(req, d); report.addData(data); } catch (NumberFormatException e) { log.warn("Non numeric input for [" + req.getName() + "] : [" + val + "]"); } } } else if (req.getDataType() == DataType.TRAIT) { MeasurementDataTrait data = new MeasurementDataTrait(req, val); report.addData(data); } } } }
@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; }
@SuppressWarnings({"rawtypes", "unchecked"}) @Test public void updateResourceConfigurationWithName() throws Exception { // tell the method story as it happens: mock or create dependencies and configure // those dependencies to get the method under test to completion. ResourceContext mockResourceContext = mock(ResourceContext.class); ResourceType mockResourceType = mock(ResourceType.class); when(mockResourceContext.getResourceType()).thenReturn(mockResourceType); ConfigurationDefinition mockConfigurationDefinition = mock(ConfigurationDefinition.class); when(mockResourceType.getResourceConfigurationDefinition()) .thenReturn(mockConfigurationDefinition); ConfigurationDefinition mockConfigurationDefinitionCopy = mock(ConfigurationDefinition.class); when(mockConfigurationDefinition.copy()).thenReturn(mockConfigurationDefinitionCopy); ConfigurationTemplate mockConfigurationTemplate = mock(ConfigurationTemplate.class); when(mockConfigurationDefinitionCopy.getDefaultTemplate()) .thenReturn(mockConfigurationTemplate); Configuration mockConfiguration = mock(Configuration.class); when(mockConfigurationTemplate.getConfiguration()).thenReturn(mockConfiguration); Property mockProperty = mock(Property.class); when(mockConfiguration.get(eq("__type"))).thenReturn(null); when(mockConfiguration.get(eq("__name"))).thenReturn(mockProperty); Map<String, PropertyDefinition> mockMap = (Map<String, PropertyDefinition>) mock(Map.class); when(mockConfigurationDefinitionCopy.getPropertyDefinitions()).thenReturn(mockMap); ConfigurationUpdateReport mockReport = mock(ConfigurationUpdateReport.class); when(mockReport.getConfiguration()).thenReturn(mockConfiguration); ConfigurationWriteDelegate mockConfigurationWriteDelegate = mock(ConfigurationWriteDelegate.class); PowerMockito.whenNew(ConfigurationWriteDelegate.class) .withParameterTypes(ConfigurationDefinition.class, ASConnection.class, Address.class) .withArguments( any(ConfigurationDefinition.class), any(ASConnection.class), any(Address.class)) .thenReturn(mockConfigurationWriteDelegate); ASConnection mockASConnection = mock(ASConnection.class); when(mockASConnection.execute(any(ReadResource.class))).thenReturn(new Result()); // create object to test and inject required dependencies TemplatedComponent objectUnderTest = new TemplatedComponent(); objectUnderTest.context = mockResourceContext; objectUnderTest.testConnection = mockASConnection; // run code under test objectUnderTest.updateResourceConfiguration(mockReport); // verify the results (Assert and mock verification) verify(mockMap, times(1)).remove(eq("__name")); verify(mockConfiguration, times(1)).get(eq("__type")); verify(mockConfiguration, times(1)).get(eq("__name")); verify(mockConfiguration, times(1)).remove(eq("__name")); PowerMockito.verifyNew(ConfigurationWriteDelegate.class) .withArguments( any(ConfigurationDefinition.class), eq(mockASConnection), any(Address.class)); }