コード例 #1
0
ファイル: BaseComponent.java プロジェクト: ccrouch/rhq
  @Override
  public CreateResourceReport createResource(CreateResourceReport report) {

    if (report.getPackageDetails() != null) { // Content deployment
      return deployContent(report);
    } else {
      report.setStatus(CreateResourceStatus.INVALID_CONFIGURATION);
      Address createAddress = new Address(address);
      createAddress.add(
          report.getPluginConfiguration().getSimpleValue("path", ""),
          report.getUserSpecifiedResourceName());
      Operation op = new Operation("add", createAddress);
      for (Property prop : report.getResourceConfiguration().getProperties()) {
        if (prop instanceof PropertySimple) {
          PropertySimple ps = (PropertySimple) prop;
          String value = ps.getStringValue();
          op.addAdditionalProperty(prop.getName(), value);
        }
        // TODO more types
      }
      Result result = getASConnection().execute(op);
      if (result.isSuccess()) {
        report.setStatus(CreateResourceStatus.SUCCESS);
        report.setResourceKey(address.getPath());
        report.setResourceName(report.getUserSpecifiedResourceName());
      } else {
        report.setStatus(CreateResourceStatus.FAILURE);
        report.setErrorMessage(result.getFailureDescription());
      }
    }
    return report;
  }
コード例 #2
0
ファイル: BaseComponent.java プロジェクト: ccrouch/rhq
  @SuppressWarnings("unchecked")
  private Collection<String> getServerGroups() {
    Operation op = new ReadChildrenNames(new Address(), "server-group");
    Result res = connection.execute(op);

    return (Collection<String>) res.getResult();
  }
コード例 #3
0
ファイル: BaseComponent.java プロジェクト: ccrouch/rhq
  /**
   * 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;
  }
コード例 #4
0
 private void ensureGlobalEJB3StatisticsEnabled() {
   if (ejb3StatisticsEnalbed != null && ejb3StatisticsEnalbed.booleanValue()) {
     return;
   }
   BaseServerComponent server = getServerComponent();
   Address ejbAddress = new Address(server.getServerAddress());
   ejbAddress.add("subsystem", "ejb3");
   try {
     ejb3StatisticsEnalbed = readAttribute(ejbAddress, "enable-statistics", Boolean.class);
     if (!Boolean.TRUE.equals(ejb3StatisticsEnalbed)) {
       getLog().debug("Enabling global EJB3 statistics");
       WriteAttribute op = new WriteAttribute(ejbAddress, "enable-statistics", true);
       Result result = getASConnection().execute(op);
       if (result.isSuccess()) {
         getLog()
             .info(
                 server.context.getResourceDetails()
                     + " Global EJB3 statistics is now enabled, because there is a request to collect EJB Calltime metrics.");
       } else {
         getLog().error("Failed to enable EJB3 statistics : " + result.getFailureDescription());
       }
     }
   } catch (Exception e) {
     getLog().error("Failed to read and enable EJB3 statistics", e);
   }
 }
コード例 #5
0
ファイル: BaseComponent.java プロジェクト: ccrouch/rhq
  /**
   * 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);
        }
      }
    }
  }
コード例 #6
0
ファイル: BaseComponent.java プロジェクト: ccrouch/rhq
  @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;
  }
コード例 #7
0
ファイル: BaseComponent.java プロジェクト: ccrouch/rhq
  /**
   * 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;
  }
コード例 #8
0
  @Override
  public CreateResourceReport createResource(CreateResourceReport report) {
    report.setStatus(CreateResourceStatus.INVALID_CONFIGURATION);
    Address createAddress = new Address(this.address);

    String path = report.getPluginConfiguration().getSimpleValue("path", "");
    String resourceName;
    if (!path.contains("=")) {
      // this is not a singleton subsystem
      // resources like  example=test1 and example=test2 can be created
      resourceName = report.getUserSpecifiedResourceName();
    } else {
      // this is a request to create a true singleton subsystem
      // both the path and the name are set at resource level configuration
      resourceName = path.substring(path.indexOf('=') + 1);
      path = path.substring(0, path.indexOf('='));
    }

    createAddress.add(path, resourceName);

    Operation op = new Operation("add", createAddress);
    for (Property prop : report.getResourceConfiguration().getProperties()) {
      SimpleEntry<String, ?> entry = null;

      boolean isEntryEligible = true;
      if (prop instanceof PropertySimple) {
        PropertySimple propertySimple = (PropertySimple) prop;
        PropertyDefinitionSimple propertyDefinition =
            this.configurationDefinition.getPropertyDefinitionSimple(propertySimple.getName());

        if (propertyDefinition == null
            || (!propertyDefinition.isRequired() && propertySimple.getStringValue() == null)) {
          isEntryEligible = false;
        } else {
          entry = preparePropertySimple(propertySimple, propertyDefinition);
        }
      } else if (prop instanceof PropertyList) {
        PropertyList propertyList = (PropertyList) prop;
        PropertyDefinitionList propertyDefinition =
            this.configurationDefinition.getPropertyDefinitionList(propertyList.getName());

        if (!propertyDefinition.isRequired() && propertyList.getList().size() == 0) {
          isEntryEligible = false;
        } else {
          entry = preparePropertyList(propertyList, propertyDefinition);
        }
      } else if (prop instanceof PropertyMap) {
        PropertyMap propertyMap = (PropertyMap) prop;
        PropertyDefinitionMap propertyDefinition =
            this.configurationDefinition.getPropertyDefinitionMap(propertyMap.getName());

        if (!propertyDefinition.isRequired() && propertyMap.getMap().size() == 0) {
          isEntryEligible = false;
        } else {
          entry = preparePropertyMap(propertyMap, propertyDefinition);
        }
      }

      if (isEntryEligible) {
        op.addAdditionalProperty(entry.getKey(), entry.getValue());
      }
    }

    Result result = this.connection.execute(op);
    if (result.isSuccess()) {
      report.setStatus(CreateResourceStatus.SUCCESS);
      report.setResourceKey(createAddress.getPath());
      report.setResourceName(report.getUserSpecifiedResourceName());
    } else {
      report.setStatus(CreateResourceStatus.FAILURE);
      report.setErrorMessage(result.getFailureDescription());
    }

    return report;
  }
コード例 #9
0
  @Override
  public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics)
      throws Exception {
    // we'll handling the rest of the metrics using the super method, but we may leave out some of
    // the requests
    // if we handle them here. Right now, just use the obtained set. We only create a copy of the
    // (unmodifiable) set
    // of requests if necessary.
    Set<MeasurementScheduleRequest> metricsToPassDown = metrics;

    for (MeasurementScheduleRequest request : metrics) {
      if (request.getDataType() == DataType.CALLTIME) {
        ensureGlobalEJB3StatisticsEnabled();
        // make a copy to pass down to super class if necessary
        if (metricsToPassDown == metrics) {
          metricsToPassDown = new HashSet<MeasurementScheduleRequest>(metrics);
        }

        metricsToPassDown.remove(request);

        // handle this ourselves
        // the name of the metric is actually the name of the stat collected for each method. we
        // then provide
        // the calltime data for each method.

        Result result = getASConnection().execute(new ReadAttribute(address, METHODS_ATTRIBUTE));
        Object value = result.getResult();
        if (value instanceof Map) {
          @SuppressWarnings("unchecked")
          Map<String, Map<String, Number>> allMethodStats =
              (Map<String, Map<String, Number>>) value;

          if (allMethodStats.isEmpty()) {
            continue;
          }

          // first we need to know since when the values were collected
          result =
              getASConnection()
                  .execute(new ReadAttribute(RUNTIME_MBEAN_ADDRESS, START_TIME_ATTRIBUTE));
          long serverStartTime = (Long) result.getResult();

          // now process the calltime value
          String requestedMetric = request.getName().substring(CALLTIME_METRIC_NAME_PREFIX_LENGTH);

          Stats lastCollection =
              getLastCallTimeCollection(requestedMetric, allMethodStats, serverStartTime);
          Stats thisCollection =
              Stats.fromMap(
                  allMethodStats, requestedMetric, System.currentTimeMillis(), serverStartTime);

          CallTimeData callTime = new CallTimeData(request);

          fillCallTimeData(callTime, thisCollection, lastCollection);

          saveCallTimeCollection(requestedMetric, thisCollection);

          report.addData(callTime);
        } else {
          OSGiVersion currentAsVersion = getASVersion();
          if (currentAsVersion == null) {
            getLog()
                .warn(
                    "Could not determine the AS version while reporting unexpected result of method"
                        + " stats. Request: "
                        + request);
          } else if (FIRST_VERSION_SUPPORTING_METHOD_STATS.compareTo(currentAsVersion) <= 0) {
            getLog()
                .error(
                    "Unexpected type of results when querying method stats for measurement request "
                        + request
                        + ". Expected map but got "
                        + (value == null ? "null" : value.getClass().getName()));
          }
        }
      }
    }

    super.getValues(report, metricsToPassDown);
  }