.classpath | 69 etc/eclipse-tools/maven/RHQ | 46 modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/CoreJBossASClient.java | 33 modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/LoggingJBossASClient.java | 96 modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/TransactionsJBossASClient.java | 52 modules/core/arquillian-integration/container/pom.xml | 35 modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java | 60 modules/core/arquillian-integration/container/src/main/resources/maven-properties.properties | 4 modules/core/arquillian-integration/container/src/test/java/org/rhq/test/arquillian/RhqAgentPluginContainerTest.java | 23 modules/core/domain/pom.xml | 21 modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/GroupOperationScheduleComposite.java | 12 modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationLastCompletedComposite.java | 2 modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationLastCompletedComposite.java | 4 modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationScheduleComposite.java | 4 modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java | 1 modules/core/domain/src/test/java/org/rhq/core/domain/test/AbstractEJB3Test.java | 24 modules/core/native-system/src/main/java/org/rhq/core/system/AggregateProcessInfo.java | 13 modules/core/native-system/src/main/java/org/rhq/core/system/ProcessInfo.java | 457 ++ modules/core/native-system/src/test/java/org/rhq/core/system/ProcessInfoRefreshIntervalTest.java | 175 + modules/core/native-system/src/test/resources/org/rhq/core/system/bash-watch-echo.sh | 7 modules/core/native-system/src/test/resources/org/rhq/core/system/win-watch-echo.bat | 5 modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java | 24 modules/core/plugin-test-api/pom.xml | 23 modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java | 252 - modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java | 15 modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.dll |binary modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.exe |binary modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.jar |binary modules/enterprise/gui/content_http-war/pom.xml | 2 modules/enterprise/gui/coregui/pom.xml | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java | 16 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java | 3 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java | 15 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/ServerTableView.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java | 34 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 30 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java | 13 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java | 57 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/util/MessagePortlet.java | 7 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java | 22 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java | 14 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceAgentView.java | 216 + modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java | 193 - modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java | 9 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java | 91 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java | 32 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 2 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants.properties | 4 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants_ko.properties | 54 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 49 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties | 50 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 45 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 47 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties | 1736 ++++++++++ modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 49 modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties | 251 - modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 49 modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml | 2 modules/enterprise/gui/portal-war/pom.xml | 2 modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/agentupdate/AgentUpdateServlet.java | 10 modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.dll |binary modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.exe |binary modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.jar |binary modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml | 9 modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java | 10 modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java | 29 modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ManagementService.java | 40 modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java | 57 modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerProperties.java | 1 modules/enterprise/server/itests-2/pom.xml | 34 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java | 401 ++ modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java | 97 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java | 5 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java | 81 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 66 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java | 44 modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java | 57 modules/enterprise/server/itests-2/src/test/resources/arquillian.xml | 7 modules/enterprise/server/jar/intentional-api-changes-since-4.5.1.xml | 12 modules/enterprise/server/jar/pom.xml | 2 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java | 32 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java | 21 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/AgentPluginScanner.java | 15 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 43 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java | 91 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java | 90 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java | 18 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java | 2 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java | 776 ++++ modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java | 106 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/BadArgumentException.java | 4 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/CustomExceptionMapper.java | 3 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java | 10 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java | 54 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java | 13 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java | 110 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java | 83 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java | 69 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertRest.java | 5 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java | 84 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/Datapoint.java | 65 modules/enterprise/server/plugins/alert-snmp/src/main/java/org/rhq/enterprise/server/plugins/alertSnmp/SnmpTrapSender.java | 2 modules/enterprise/server/plugins/jboss-software/pom.xml | 2 modules/enterprise/server/plugins/url/pom.xml | 2 modules/integration-tests/apache-plugin-test/src/test/java/org/rhq/plugins/apache/util/ApacheExecutionUtil.java | 9 modules/integration-tests/jndi-access/jndi-access-test/pom.xml | 25 modules/integration-tests/jndi-access/jndi-access-test/src/test/java/org/rhq/jndi/test/JndiAccessTest.java | 23 modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java | 1026 +++++ modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java | 32 modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java | 112 modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java | 93 modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java | 137 modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertNotification.java | 65 modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Group.java | 3 modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java | 11 modules/plugins/hadoop/src/main/java/org/rhq/plugins/hadoop/HadoopServerComponent.java | 70 modules/plugins/jboss-as-5/pom.xml | 36 modules/plugins/jboss-as-7/pom.xml | 61 modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java | 43 modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java | 412 +- modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java | 90 modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DeploymentComponent.java | 111 modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java | 87 modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/StandaloneASDiscovery.java | 20 modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/nonpc/AbstractIntegrationTest.java | 27 modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java | 2 modules/plugins/netservices/pom.xml | 4 modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml | 23 modules/plugins/perftest/src/main/resources/configurable-deep.xml | 49 modules/plugins/platform/src/main/java/org/rhq/plugins/platform/NetworkAdapterComponent.java | 24 modules/plugins/platform/src/main/java/org/rhq/plugins/platform/ProcessComponent.java | 27 modules/plugins/sshd/src/main/java/org/rhq/plugins/sshd/OpenSSHDComponent.java | 43 pom.xml | 24 remote-branch.sh | 134 142 files changed, 8507 insertions(+), 1567 deletions(-)
New commits: commit 9f04056a0a1b59f167b6d002f43881cf694e53f1 Merge: d68c66c 48e2ecc Author: John Mazzitelli mazz@redhat.com Date: Mon Jan 28 12:40:16 2013 -0500
Merge remote-tracking branch 'origin/master' into bug/783603
diff --cc modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java index 24952ed,16d7bbc..ccc7e7d --- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java +++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java @@@ -529,8 -508,10 +518,9 @@@ public class ResourceContext<T extends /** * @deprecated Use {@link AvailabilityContext#createAvailabilityCollectorRunnable(AvailabilityFacet, long)} */ + @Deprecated public AvailabilityCollectorRunnable createAvailabilityCollectorRunnable(AvailabilityFacet availChecker, long interval) { - return getAvailabilityContext().createAvailabilityCollectorRunnable(availChecker, interval); }
commit 48e2ecc14bd7d70b6b02909c9ef0149c24eac2bd Author: Jirka Kremser jkremser@redhat.com Date: Fri Jan 25 16:54:14 2013 +0100
[BZ [RFE] Schedule an operation using cron expression via JBoss ON CLI] Methods scheduleResourceOperationUsingCron() and scheduleGroupOperationUsingCron() have been added to the OperationManager.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java index 3ce6064..c2cb5db 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java @@ -24,8 +24,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set;
-import org.quartz.CronTrigger; - import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria; import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria; @@ -111,14 +109,12 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O throw getExceptionToThrowToClient(t); } } - + public void scheduleResourceOperation(int resourceId, String operationName, Configuration parameters, String description, int timeout, String cronString) throws RuntimeException { try { - CronTrigger cronTrigger = new CronTrigger("resource " + resourceId + "_" + operationName, "group", - cronString); - ResourceOperationSchedule opSchedule = operationManager.scheduleResourceOperation(getSessionSubject(), - resourceId, operationName, parameters, cronTrigger, description); + ResourceOperationSchedule opSchedule = operationManager.scheduleResourceOperationUsingCron(getSessionSubject(), + resourceId, operationName, cronString, timeout, parameters, description); } catch (Throwable t) { throw getExceptionToThrowToClient(t); } diff --git a/modules/enterprise/server/jar/intentional-api-changes-since-4.5.1.xml b/modules/enterprise/server/jar/intentional-api-changes-since-4.5.1.xml index c7a95dd..245503e 100644 --- a/modules/enterprise/server/jar/intentional-api-changes-since-4.5.1.xml +++ b/modules/enterprise/server/jar/intentional-api-changes-since-4.5.1.xml @@ -21,4 +21,16 @@ <justification>Removed already deprecated web services in this release, this file was used for WS client-server compatibility</justification> </difference> + <difference> + <className>org/rhq/enterprise/server/operation/OperationManagerRemote</className> + <differenceType>7012</differenceType> <!-- method added to an interface --> + <method>org.rhq.core.domain.operation.bean.ResourceOperationSchedule scheduleResourceOperationUsingCron(org.rhq.core.domain.auth.Subject, int, java.lang.String, java.lang.String, int, org.rhq.core.domain.configuration.Configuration, java.lang.String)</method> + <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification> + </difference> + <difference> + <className>org/rhq/enterprise/server/operation/OperationManagerRemote</className> + <differenceType>7012</differenceType> <!-- method added to an interface --> + <method>org.rhq.core.domain.operation.bean.GroupOperationSchedule scheduleGroupOperationUsingCron(org.rhq.core.domain.auth.Subject, int, int[], boolean, java.lang.String, org.rhq.core.domain.configuration.Configuration, java.lang.String, int, java.lang.String)</method> + <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification> + </difference> </differences> diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java index ef937c8..e7151fb 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java @@ -42,7 +42,6 @@ import org.quartz.SchedulerException; import org.quartz.SimpleTrigger; import org.quartz.Trigger;
-import org.rhq.core.clientapi.agent.configuration.ConfigurationUtility; import org.rhq.core.clientapi.agent.operation.CancelResults; import org.rhq.core.clientapi.agent.operation.CancelResults.InterruptedState; import org.rhq.core.domain.auth.Subject; @@ -50,6 +49,7 @@ import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.common.JobTrigger; import org.rhq.core.domain.common.composite.IntegerOptionItem; import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.ConfigurationUtility; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria; @@ -166,6 +166,25 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan } }
+ public ResourceOperationSchedule scheduleResourceOperationUsingCron(Subject subject, int resourceId, + String operationName, String cronExpression, int timeout, Configuration parameters, String description) + throws ScheduleException { + // if the user set a timeout, add it to our configuration + if (timeout > 0L) { + if (parameters == null) { + parameters = new Configuration(); + } + parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, timeout)); + } + try { + CronTrigger cronTrigger = new CronTrigger("resource " + resourceId + "_" + operationName, "group", + cronExpression); + return scheduleResourceOperation(subject, resourceId, operationName, parameters, cronTrigger, description); + } catch (Exception e) { + throw new ScheduleException(e); + } + } + public int scheduleResourceOperation(Subject subject, ResourceOperationSchedule schedule) throws ScheduleException { JobTrigger jobTrigger = schedule.getJobTrigger(); Trigger trigger = convertToTrigger(jobTrigger); @@ -1944,7 +1963,6 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan if (null == parameters) { parameters = new Configuration(); } - parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, timeout)); }
@@ -1955,6 +1973,27 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan } }
+ public GroupOperationSchedule scheduleGroupOperationUsingCron(Subject subject, int groupId, + int[] executionOrderResourceIds, boolean haltOnFailure, String operationName, Configuration parameters, + String cronExpression, int timeout, String description) throws ScheduleException { + + // if the user set a timeout, add it to our configuration + if (timeout > 0L) { + if (parameters == null) { + parameters = new Configuration(); + } + parameters.put(new PropertySimple(OperationDefinition.TIMEOUT_PARAM_NAME, timeout)); + } + CronTrigger cronTrigger = new CronTrigger(); + try { + cronTrigger.setCronExpression(cronExpression); + return scheduleGroupOperation(subject, groupId, executionOrderResourceIds, haltOnFailure, operationName, + parameters, cronTrigger, description); + } catch (Exception e) { + throw new ScheduleException(e); + } + } + @SuppressWarnings("unchecked") public List<OperationDefinition> findOperationDefinitionsByCriteria(Subject subject, OperationDefinitionCriteria criteria) { diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java index bf2d77c..bce2a18 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerLocal.java @@ -72,6 +72,45 @@ public interface OperationManagerLocal { * scheduled operation */ int scheduleResourceOperation(Subject subject, ResourceOperationSchedule schedule); + + + /** + * Schedules a Resource operation for execution using the cron expression. + * + * @param subject the user who is asking to schedule the job + * @param resourceId the resource that is the target of the operation + * @param operationName the actual operation to invoke + * @param cronExpression the cron expression specifying the repetition. + * For example: + * <pre> + * 0 0 12 * * ? Fire at 12pm (noon) every day + * 0 15 10 ? * * Fire at 10:15am every day + * 0 15 10 * * ? Fire at 10:15am every day + * 0 15 10 * * ? * Fire at 10:15am every day + * 0 15 10 * * ? 2005 Fire at 10:15am every day during the year 2005 + * 0 * 14 * * ? every minute starting at 2pm and ending at 2:59pm, every day + * 0 0/5 14 * * ? every 5 minutes starting at 2pm and ending at 2:55pm, ev. d. + * 0 0-5 14 * * ? Fire every minute starting at 2pm and ending at 2:05pm, every day + * 0 10,44 14 ? 3 WED Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. + * 0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday + * 0 15 10 15 * ? Fire at 10:15am on the 15th day of every month + * 0 15 10 L * ? Fire at 10:15am on the last day of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L 2002-2005 at 10:15am on every last friday of every month during the years + * 0 15 10 ? * 6#3 Fire at 10:15am on the third Friday of every month + * 0 11 11 11 11 ? Fire every November 11th at 11:11am. + * </pre> + * @param timeout the number of seconds before this operation will fail due to timeout. 0 for no timeout. + * @param parameters the names parameters for the operation. + * @param description user-entered description of the job to be scheduled + * + * @return the information on the new schedule + * + * @throws SchedulerException if failed to schedule the operation + */ + ResourceOperationSchedule scheduleResourceOperationUsingCron(Subject subject, int resourceId, String operationName, + String cronExpression, int timeout, Configuration parameters, String description) throws ScheduleException;
/** * Schedules a Resource group operation for execution. @@ -632,11 +671,59 @@ public interface OperationManagerLocal { * @param description user-entered description of the job to be scheduled * * @return the information on the new schedule - * @throws ScheduleException TODO + * @throws ScheduleException if failed to schedule the operation */ ResourceOperationSchedule scheduleResourceOperation(Subject subject, int resourceId, String operationName, long delay, long repeatInterval, int repeatCount, int timeout, Configuration parameters, String description) throws ScheduleException; + + /** + * Schedules an operation for execution on members of the given group using the cron expression. + * + * @param subject the user who is asking to schedule the job + * @param groupId the compatible group whose member resources are the target of the operation + * @param executionOrderResourceIds optional order of exection - if not<code>null</code>, these are group members + * resource IDs in the order in which the operations are invoked + * @param haltOnFailure if <code>true</code>, the group operation will halt whenever one individual + * resource fails to execute. When executing in order, this means once a failure + * occurs, the resources next in line to execute will abort and not attempt to + * execute. If not executing in any particular order, you are not guaranteed which + * will stop and which will continue since all are executed as fast as possible, + * but the group operation will attempt to stop as best it can. + * @param operationName the actual operation to invoke + * @param parameters optional parameters to pass into the operation + * @param cronExpression the cron expression specifying the repetition. + * For example: + * <pre> + * 0 0 12 * * ? Fire at 12pm (noon) every day + * 0 15 10 ? * * Fire at 10:15am every day + * 0 15 10 * * ? Fire at 10:15am every day + * 0 15 10 * * ? * Fire at 10:15am every day + * 0 15 10 * * ? 2005 Fire at 10:15am every day during the year 2005 + * 0 * 14 * * ? every minute starting at 2pm and ending at 2:59pm, every day + * 0 0/5 14 * * ? every 5 minutes starting at 2pm and ending at 2:55pm, ev. d. + * 0 0-5 14 * * ? Fire every minute starting at 2pm and ending at 2:05pm, every day + * 0 10,44 14 ? 3 WED Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. + * 0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday + * 0 15 10 15 * ? Fire at 10:15am on the 15th day of every month + * 0 15 10 L * ? Fire at 10:15am on the last day of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L 2002-2005 at 10:15am on every last friday of every month during the years + * 0 15 10 ? * 6#3 Fire at 10:15am on the third Friday of every month + * 0 11 11 11 11 ? Fire every November 11th at 11:11am. + * </pre> + * @param timeout the number of seconds before this operation will fail due to timeout. 0 for no timeout. + * are ignored and reset by this method) + * @param description user-entered description of the job to be scheduled + * + * @return the information on the new schedule + * + * @throws SchedulerException if failed to schedule the operation + */ + GroupOperationSchedule scheduleGroupOperationUsingCron(Subject subject, int groupId, + int[] executionOrderResourceIds, boolean haltOnFailure, String operationName, Configuration parameters, + String cronExpression, int timeout, String description) throws ScheduleException;
/** * Unschedules the resource operation identified with the given job ID. @@ -644,7 +731,7 @@ public interface OperationManagerLocal { * @param subject the user who is asking to unschedule the operation * @param jobId identifies the operation to unschedule * @param resourceId the ID of the resource whose operation is getting unscheduled - * @throws UnscheduleException TODO + * @throws UnscheduleException if failed to schedule the operation */ void unscheduleResourceOperation(Subject subject, String jobId, int resourceId) throws UnscheduleException;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java index c6f8da1..8a4bf1d 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerRemote.java @@ -22,6 +22,8 @@ import java.util.List;
import javax.ejb.Remote;
+import org.quartz.SchedulerException; + import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.criteria.GroupOperationHistoryCriteria; @@ -111,11 +113,49 @@ public interface OperationManagerRemote { * user-entered description of the job to be scheduled * * @return the information on the new schedule - * @throws ScheduleException TODO + * @throws ScheduleException if failed to schedule the operation */ ResourceOperationSchedule scheduleResourceOperation(Subject subject, int resourceId, String operationName, long delay, long repeatInterval, int repeatCount, int timeout, Configuration parameters, String description) throws ScheduleException; + + /** + * Schedules a Resource operation for execution using the cron expression. + * + * @param subject the user who is asking to schedule the job + * @param resourceId the resource that is the target of the operation + * @param operationName the actual operation to invoke + * @param cronExpression the cron expression specifying the repetition. + * For example: + * <pre> + * 0 0 12 * * ? Fire at 12pm (noon) every day + * 0 15 10 ? * * Fire at 10:15am every day + * 0 15 10 * * ? Fire at 10:15am every day + * 0 15 10 * * ? * Fire at 10:15am every day + * 0 15 10 * * ? 2005 Fire at 10:15am every day during the year 2005 + * 0 * 14 * * ? every minute starting at 2pm and ending at 2:59pm, every day + * 0 0/5 14 * * ? every 5 minutes starting at 2pm and ending at 2:55pm, ev. d. + * 0 0-5 14 * * ? Fire every minute starting at 2pm and ending at 2:05pm, every day + * 0 10,44 14 ? 3 WED Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. + * 0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday + * 0 15 10 15 * ? Fire at 10:15am on the 15th day of every month + * 0 15 10 L * ? Fire at 10:15am on the last day of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L 2002-2005 at 10:15am on every last friday of every month during the years + * 0 15 10 ? * 6#3 Fire at 10:15am on the third Friday of every month + * 0 11 11 11 11 ? Fire every November 11th at 11:11am. + * </pre> + * @param timeout the number of seconds before this operation will fail due to timeout. 0 for no timeout. + * @param parameters the names parameters for the operation. + * @param description user-entered description of the job to be scheduled + * + * @return the information on the new schedule + * + * @throws SchedulerException if failed to schedule the operation + */ + ResourceOperationSchedule scheduleResourceOperationUsingCron(Subject subject, int resourceId, String operationName, + String cronExpression, int timeout, Configuration parameters, String description) throws ScheduleException;
/** * Unschedules the resource operation identified with the given job ID. @@ -152,6 +192,54 @@ public interface OperationManagerRemote { throws ScheduleException;
/** + * Schedules an operation for execution on members of the given group using the cron expression. + * + * @param subject the user who is asking to schedule the job + * @param groupId the compatible group whose member resources are the target of the operation + * @param executionOrderResourceIds optional order of exection - if not<code>null</code>, these are group members + * resource IDs in the order in which the operations are invoked + * @param haltOnFailure if <code>true</code>, the group operation will halt whenever one individual + * resource fails to execute. When executing in order, this means once a failure + * occurs, the resources next in line to execute will abort and not attempt to + * execute. If not executing in any particular order, you are not guaranteed which + * will stop and which will continue since all are executed as fast as possible, + * but the group operation will attempt to stop as best it can. + * @param operationName the actual operation to invoke + * @param parameters optional parameters to pass into the operation + * @param cronExpression the cron expression specifying the repetition. + * For example: + * <pre> + * 0 0 12 * * ? Fire at 12pm (noon) every day + * 0 15 10 ? * * Fire at 10:15am every day + * 0 15 10 * * ? Fire at 10:15am every day + * 0 15 10 * * ? * Fire at 10:15am every day + * 0 15 10 * * ? 2005 Fire at 10:15am every day during the year 2005 + * 0 * 14 * * ? every minute starting at 2pm and ending at 2:59pm, every day + * 0 0/5 14 * * ? every 5 minutes starting at 2pm and ending at 2:55pm, ev. d. + * 0 0-5 14 * * ? Fire every minute starting at 2pm and ending at 2:05pm, every day + * 0 10,44 14 ? 3 WED Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. + * 0 15 10 ? * MON-FRI Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday + * 0 15 10 15 * ? Fire at 10:15am on the 15th day of every month + * 0 15 10 L * ? Fire at 10:15am on the last day of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L Fire at 10:15am on the last Friday of every month + * 0 15 10 ? * 6L 2002-2005 at 10:15am on every last friday of every month during the years + * 0 15 10 ? * 6#3 Fire at 10:15am on the third Friday of every month + * 0 11 11 11 11 ? Fire every November 11th at 11:11am. + * </pre> + * @param timeout the number of seconds before this operation will fail due to timeout. 0 for no timeout. + * are ignored and reset by this method) + * @param description user-entered description of the job to be scheduled + * + * @return the information on the new schedule + * + * @throws SchedulerException if failed to schedule the operation + */ + GroupOperationSchedule scheduleGroupOperationUsingCron(Subject subject, int groupId, + int[] executionOrderResourceIds, boolean haltOnFailure, String operationName, Configuration parameters, + String cronExpression, int timeout, String description) throws ScheduleException; + + /** * Unschedules the group operation identified with the given job ID. * * @param subject the user who is asking to unschedule the operation
commit 8e27a3acaf35b70ed191b6890cdfd1cc482d82b8 Author: John Sanda jsanda@redhat.com Date: Fri Jan 25 10:43:53 2013 -0500
make sure we clean up when downloading jboss distro
The ant script that downloads the jboss distro could time out leaving a corrupt zip file in the tmp dir. This would cause the build to fail and was also causing subsequent CI builds to fail. Once again, doing tear down in the set up fixes the problem.
diff --git a/modules/plugins/jboss-as-5/pom.xml b/modules/plugins/jboss-as-5/pom.xml index 2474eec..9c71f33 100644 --- a/modules/plugins/jboss-as-5/pom.xml +++ b/modules/plugins/jboss-as-5/pom.xml @@ -473,6 +473,21 @@ <target> <property name="as5.zipfile" location="${java.io.tmpdir}${file.separator}jboss-as-${as5.version}.zip"/> + + <!-- + Go ahead and clean up the tmp dir first. If in a prior build, + we timeout while downloading the jboss distro, we will be left + with a corrupt zip file which will cause the build to fail as + expected; however, if we do not clean up, then subsequent + builds fail as well. Alternatively we could try and set the + skipexisting attribute on the get task to false which might + also work and be faster but this way ensures we get the + correct bits. + --> + <delete file="${as5.zipfile}"/> + <delete dir="${java.io.tmpdir}/jboss-eap-${as5.version}" failonerror="false"/> + <delete dir="${jboss5.home}"/> + <get src="${as5.url}" dest="${as5.zipfile}" usetimestamp="true" verbose="true"/> <unzip src="${as5.zipfile}" dest="${java.io.tmpdir}"/> @@ -480,7 +495,7 @@ <move file="${java.io.tmpdir}/jboss-${as5.version}" tofile="${jboss5.home}" failonerror="false" overwrite="false"/> - <!-- This works for EAP versions --> + <!-- This works for EAP versions --> <move file="${java.io.tmpdir}/jboss-eap-${as5.version}/jboss-as" tofile="${jboss5.home}" failonerror="false" overwrite="false"/>
commit 33f65e91a7b5121774d4e6928bb16ec95a87836e Author: John Mazzitelli mazz@redhat.com Date: Fri Jan 25 08:50:06 2013 -0500
point to the proper RHQ wiki docs
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java index b48dd19..c5fa4dc 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java @@ -326,7 +326,7 @@ public class DashboardsView extends LocatableVLayout implements DashboardContain DashboardPortlet news = new DashboardPortlet(MashupPortlet.NAME, MashupPortlet.KEY, 300); if (isRHQ) { news.getConfiguration() - .put(new PropertySimple("address", "https://docs.jboss.org/author/display/RHQ/Home")); + .put(new PropertySimple("address", "https://docs.jboss.org/author/display/RHQ/User+Documentation")); } else { news.getConfiguration().put( new PropertySimple("address", diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants.properties index c3b641e..1e3fbe3 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants.properties @@ -35,7 +35,7 @@ view_help_section_1_item_count = 3 view_help_section_1_propTitle_1 = Frequently Asked Questions (FAQ) view_help_section_1_propUrl_1 = https://docs.jboss.org/author/display/RHQ/FAQ view_help_section_1_propTitle_2 = Documentation Set -view_help_section_1_propUrl_2 = https://docs.jboss.org/author/display/RHQ/Home +view_help_section_1_propUrl_2 = https://docs.jboss.org/author/display/RHQ/User+Documentation view_help_section_1_propTitle_3 = API Javadoc view_help_section_1_propUrl_3 = https://docs.jboss.org/author/display/RHQ/API+Documentation
@@ -48,7 +48,7 @@ view_help_section_2_propTitle_2 = Demo: Bundle Provisioning view_help_section_2_propUrl_2 = http://management-platform.blogspot.com/2011/01/bundle-provisioning-via-rhq.... view_help_section_2_propTitle_3 = How to build Group Definitions view_help_section_2_propIcon_3 = [SKIN]/../actions/help.png -view_help_section_2_propUrl_3 = http://docs.redhat.com/docs/en-US/JBoss_Operations_Network/2.4/html/Basic_Ad... +view_help_section_2_propUrl_3 = https://docs.jboss.org/author/display/RHQ/Group+Definitions view_help_section_2_propTitle_4 = How to use the Search Bar view_help_section_2_propIcon_4 = [SKIN]/../actions/help.png view_help_section_2_propUrl_4 = https://docs.jboss.org/author/display/RHQ/Search
commit 269da6354ef305638316aae2bdcd7039bde62cf3 Author: Thomas Segismont tsegismo@redhat.com Date: Fri Jan 25 10:06:43 2013 +0100
Fix Eclipse classpath file: CDI and javax.inject
diff --git a/.classpath b/.classpath index 6091ec8..9af3a50 100644 --- a/.classpath +++ b/.classpath @@ -336,7 +336,9 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/spec/javax/jms/jboss-jms-api_1.1_spec/1.0.0.Final/jboss-jms-api_1.1_spec-1.0.0.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/spec/javax/interceptor/jboss-interceptors-api_1.1_spec/1.0.0.Final/jboss-interceptors-api_1.1_spec-1.0.0.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/spec/javax/transaction/jboss-transaction-api_1.1_spec/1.0.0.Final/jboss-transaction-api_1.1_spec-1.0.0.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/remotingjmx/remoting-jmx/1.0.2.Final/remoting-jmx-1.0.2.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/remotingjmx/remoting-jmx/1.0.2.Final/remoting-jmx-1.0.2.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/javax/enterprise/cdi-api/1.0-SP4/cdi-api-1.0-SP4.jar" sourcepath="M2_REPO/javax/enterprise/cdi-api/1.0-SP4/cdi-api-1.0-SP4-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/javax/inject/javax.inject/1/javax.inject-1.jar" sourcepath="M2_REPO/javax/inject/javax.inject/1/javax.inject-1-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/mozilla/rhino/1.7R4/rhino-1.7R4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/picketbox/picketbox/4.0.7.Final/picketbox-4.0.7.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/python/jython-standalone/2.5.2/jython-standalone-2.5.2.jar"/>
commit 3ded44d88b2700c95d3e107d2cfdbe48524a41e8 Author: Thomas SEGISMONT tsegismo@redhat.com Date: Mon Dec 10 21:53:49 2012 +0100
Bug 885664 OpenSSHD and MySQL availability check may report stale data
Refactoring of ProcessInfo The class has now a subtype which groups non static data and operations on this data. The purpose is to make clear for users of the class that it caches data and only takes snaphots via SIGAR calls
OpenSSHDComponent and MySQLComponent have their availability check fixed and using this API
Other classes were updated with new API calls for isRunning method
Add lock and interval mechanism to ProcessInfo refresh This will avoid SIGAR bug when making too close calls to getProcState Add corresponding test
Fix bad log in ApacheExecutionUtil
Modified Eclipse classpath file
diff --git a/.classpath b/.classpath index e7fd638..6091ec8 100644 --- a/.classpath +++ b/.classpath @@ -13,7 +13,6 @@ <classpathentry kind="src" path="modules/cli-tests/src/main/java"/> <classpathentry kind="src" path="modules/helpers/jeeGen/src/main/java"/> <classpathentry kind="src" path="modules/helpers/bundleGen/src/main/java"/> - <classpathentry kind="src" path="modules/integration-tests/jndi-access/jndi-access-test/src/test/java"/> <classpathentry kind="src" path="modules/common/drift/src/main/java"/> <classpathentry kind="src" path="modules/common/drift/src/test/java"/> <classpathentry kind="src" path="modules/common/ant-bundle/src/test/java"/> @@ -25,8 +24,9 @@ <classpathentry kind="src" path="modules/core/util/src/test/java"/> <classpathentry kind="src" path="modules/core/dbutils/src/main/java"/> <classpathentry kind="src" path="modules/core/dbutils/src/test/java"/> - <classpathentry kind="src" path="modules/core/native-system/src/main/java"/> - <classpathentry kind="src" path="modules/core/native-system/src/test/java"/> + <classpathentry kind="src" path="modules/core/native-system/src/main/java"/> + <classpathentry kind="src" path="modules/core/native-system/src/test/java"/> + <classpathentry kind="src" path="modules/core/native-system/src/test/resources"/> <classpathentry kind="src" path="modules/core/domain/src/main/java"/> <classpathentry kind="src" path="modules/core/domain/src/test/java"/> <classpathentry kind="src" path="modules/core/plugin-api/src/main/java"/> @@ -119,7 +119,9 @@ <classpathentry kind="src" path="modules/plugins/oracle/src/main/java"/> <classpathentry kind="src" path="modules/plugins/oracle/src/test/java"/> <classpathentry kind="src" path="modules/plugins/apache/src/main/java"/> + <classpathentry kind="src" path="modules/plugins/apache/src/main/resources"/> <classpathentry kind="src" path="modules/plugins/apache/src/test/java"/> + <classpathentry kind="src" path="modules/plugins/apache/src/test/resources"/> <classpathentry kind="src" path="modules/plugins/script/src/main/java"/> <classpathentry kind="src" path="modules/plugins/netservices/src/main/java"/> <classpathentry kind="src" path="modules/plugins/ant-bundle/src/main/java"/> @@ -176,7 +178,11 @@ <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/test/java"/> <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/test/resources"/> <classpathentry kind="src" path="modules/test-utils/src/main/java"/> - <classpathentry kind="src" path="modules/integration-tests/mod_cluster-plugin-test/src/test/java"/> + <classpathentry kind="src" path="modules/integration-tests/apache-plugin-test/src/test/java"/> + <classpathentry kind="src" path="modules/integration-tests/apache-plugin-test/src/test/resources"/> + <classpathentry kind="src" path="modules/integration-tests/jndi-access/jndi-access-test/src/test/java"/> + <classpathentry kind="src" path="modules/integration-tests/jndi-access/jndi-access-test/src/test/resources"/> + <classpathentry kind="src" path="modules/integration-tests/mod_cluster-plugin-test/src/test/java"/> <classpathentry kind="src" path="etc/samples/skeleton-plugin/src/main/java"/> <classpathentry kind="src" path="etc/samples/custom-serverplugin/src/main/java"/> <classpathentry kind="src" path="etc/samples/simplereport-serverplugin/src/main/java"/> @@ -239,7 +245,7 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/ui/richfaces-ui/3.3.3.Final/richfaces-ui-3.3.3.Final.jar" sourcepath="/M2_REPO/org/richfaces/ui/richfaces-ui/3.3.0.GA/richfaces-ui-3.3.0.GA-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/postgresql/postgresql/9.2-1002.jdbc4/postgresql-9.2-1002.jdbc4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/jboss/jboss-cache/1.4.1.SP9/jboss-cache-1.4.1.SP9.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/hyperic/sigar/1.6.5.132-3/sigar-1.6.5.132-3.jar" sourcepath="/M2_REPO/org/hyperic/sigar/1.6.3.82/sigar-1.6.3.82-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/hyperic/sigar/1.6.5.132-3/sigar-1.6.5.132-3.jar" sourcepath="/M2_REPO/org/hyperic/sigar/1.6.5.132-3/sigar-1.6.5.132-3-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/jbossts/jbossjts/4.16.2.Final/jbossjts-4.16.2.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/maven/maven-project/2.0.8/maven-project-2.0.8.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/maven/maven-plugin-api/2.0.8/maven-plugin-api-2.0.8.jar"/> @@ -335,9 +341,12 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/picketbox/picketbox/4.0.7.Final/picketbox-4.0.7.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/python/jython-standalone/2.5.2/jython-standalone-2.5.2.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/com/wordnik/swagger-annotations_2.9.1/1.1.1-SNAPSHOT/swagger-annotations_2.9.1-1.1.1-20121031.024335-6.jar"/> - <classpathentry exported="true" kind="var" path="JDK_HOME/lib/tools.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/joda-time/joda-time/2.1/joda-time-2.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/cassandra/cassandra-thrift/1.1.5/cassandra-thrift-1.1.5.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/hectorclient/hector-core/1.1-1/hector-core-1.1-1.jar"/> - <classpathentry kind="output" path="eclipse-classes"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman-install/1.5.2/byteman-install-1.5.2.jar" sourcepath="M2_REPO/org/jboss/byteman/byteman-install/1.5.2/byteman-install-1.5.2-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman-submit/1.5.2/byteman-submit-1.5.2.jar" sourcepath="M2_REPO/org/jboss/byteman/byteman-submit/1.5.2/byteman-submit-1.5.2-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman-bmunit/1.5.2/byteman-bmunit-1.5.2.jar" sourcepath="M2_REPO/org/jboss/byteman/byteman-bmunit/1.5.2/byteman-bmunit-1.5.2-sources.jar"/> + <classpathentry exported="true" kind="var" path="JDK_HOME/lib/tools.jar"/> + <classpathentry kind="output" path="eclipse-classes"/> </classpath> diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/AggregateProcessInfo.java b/modules/core/native-system/src/main/java/org/rhq/core/system/AggregateProcessInfo.java index 271a869..144c4f4 100644 --- a/modules/core/native-system/src/main/java/org/rhq/core/system/AggregateProcessInfo.java +++ b/modules/core/native-system/src/main/java/org/rhq/core/system/AggregateProcessInfo.java @@ -24,10 +24,10 @@ package org.rhq.core.system;
import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.HashSet;
import org.hyperic.sigar.ProcCpu; import org.hyperic.sigar.ProcFd; @@ -110,23 +110,26 @@ public class AggregateProcessInfo extends ProcessInfo { // There are some instances where SIGAR can't get one or more of these (maybe permission issues?). // Do not bomb if we can't get one or more of these - we'll just handle nulls appropriately.
+ // It is safe to get the prior snapshot as we just called super.refresh + ProcessInfoSnapshot priorSnaphot = priorSnaphot(); + try { - procTimes.add(super.procTime); + procTimes.add(priorSnaphot.getTime()); } catch (Exception e) { }
try { - procMems.add(super.procMem); + procMems.add(priorSnaphot.getMemory()); } catch (Exception e) { }
try { - procCpus.add(super.procCpu); + procCpus.add(priorSnaphot.getCpu()); } catch (Exception e) { }
try { - procFds.add(super.procFd); + procFds.add(priorSnaphot.getFileDescriptor()); } catch (Exception e) { }
diff --git a/modules/core/native-system/src/main/java/org/rhq/core/system/ProcessInfo.java b/modules/core/native-system/src/main/java/org/rhq/core/system/ProcessInfo.java index 39b0f0f..7f994ed 100644 --- a/modules/core/native-system/src/main/java/org/rhq/core/system/ProcessInfo.java +++ b/modules/core/native-system/src/main/java/org/rhq/core/system/ProcessInfo.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2012 Red Hat, Inc. + * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -28,6 +28,8 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -49,39 +51,229 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable;
/** + * <p> * Encapsulates information about a known process. + * </p> + * <p> + * A few process properties (i.e. PID, command line) will never change during the lifetime of the process and can be + * read directly with this class accessors. Other process properties (i.e. state, cpu usage) will vary and their values + * are grouped in {@link ProcessInfoSnapshot} instances. + * </p> + * <p> + * Operations on static properties of the process must be implemented in the {@link ProcessInfo} type. Operations on + * non static properties must be implemented in the {@link ProcessInfoSnapshot} type. The {@link ProcessInfoSnapshot} + * subtype has been created to remind users of the class that they are working with cached data. + * </p> + * <p>For example, if you want to be sure a process is still alive, you should use this code:<br> + * <code>processInfo.freshSnapshot().isRunning()</code> + * </p> + * <p>Rather than:<br> + * <code>processInfo.priorSnapshot().isRunning()</code> + * </p> * * @author John Mazzitelli * @author Ian Springer + * @author Thomas Segismont */ public class ProcessInfo { - private final Log log = LogFactory.getLog(ProcessInfo.class.getName()); + + /** + * <p> + * Exposes non static process properties and operations computed on them (like {@link #isRunning()} method). + * Operations on non static process properties should all be implemented here. + * </p> + * <p> + * New snapshots are created when {@link ProcessInfo#refresh()} or {@link ProcessInfo#freshSnapshot()} are + * called. + * </p> + * <p> + * Note the current implementation does not actually encapsulate these properties for backward compatibility + * reasons (we have to keep the write access to {@link ProcessInfo} protected properties). + * </p> + */ + public final class ProcessInfoSnapshot { + + public long getParentPid() throws SystemInfoException { + return (ProcessInfo.this.procState != null) ? ProcessInfo.this.procState.getPpid() : 0L; + } + + public ProcState getState() throws SystemInfoException { + return ProcessInfo.this.procState; + } + + public ProcExe getExecutable() throws SystemInfoException { + return ProcessInfo.this.procExe; + } + + public ProcTime getTime() throws SystemInfoException { + return ProcessInfo.this.procTime; + } + + public ProcMem getMemory() throws SystemInfoException { + return ProcessInfo.this.procMem; + } + + public ProcCpu getCpu() throws SystemInfoException { + return ProcessInfo.this.procCpu; + } + + public ProcFd getFileDescriptor() throws SystemInfoException { + return ProcessInfo.this.procFd; + } + + public ProcCred getCredentials() throws SystemInfoException { + return ProcessInfo.this.procCred; + } + + public ProcCredName getCredentialsName() throws SystemInfoException { + return ProcessInfo.this.procCredName; + } + + /** + * @return null if process executable or cwd is unavailable. Otherwise the Cwd as returned from the + * process executable. + * @throws SystemInfoException + */ + public String getCurrentWorkingDirectory() throws SystemInfoException { + String result = null; + try { + if (null != ProcessInfo.this.procExe) { + result = ProcessInfo.this.procExe.getCwd(); + } + } catch (Exception e) { + ProcessInfo.this.handleSigarCallException(e, "procExe.getCwd()"); + } + return result; + } + + /** + * Checks if the process is alive. + * + * @return true if the process is running, sleeping or idle + * @throws SystemInfoException + */ + public boolean isRunning() throws SystemInfoException { + boolean running = false; + if (ProcessInfo.this.procState != null) { + running = (ProcessInfo.this.procState.getState() == ProcState.RUN + || ProcessInfo.this.procState.getState() == ProcState.SLEEP || ProcessInfo.this.procState + .getState() == ProcState.IDLE); + + } + return running; + } + + } + + private static final Log LOG = LogFactory.getLog(ProcessInfo.class); + + // This interval was introduced because of a SIGAR bug: too close calls to getProcState could + // return different values even if the underlying process state has not changed. + private static final int REFRESH_INTERVAL_MILLIS = 1000 * 2; + + // This timeout should always be greater than the refresh interval as one thread which acquired the lock + // could be waiting for the refresh interval to elapse. This value is deliberately high because multiple + // threads could wait for the lock and each of them will also have to wait for the refresh interval to elapse. + private static final int REFRESH_LOCK_ACQUIRE_TIMEOUT_SECONDS = 30; + + private static final String UNKNOWN_PROCESS_NAME = "?"; + + private static final Set<String> MS_WINDOWS_TERMINATE_SIGNAL_NAMES = new HashSet<String>(); + static { + MS_WINDOWS_TERMINATE_SIGNAL_NAMES.add("INT"); + MS_WINDOWS_TERMINATE_SIGNAL_NAMES.add("KILL"); + MS_WINDOWS_TERMINATE_SIGNAL_NAMES.add("QUIT"); + MS_WINDOWS_TERMINATE_SIGNAL_NAMES.add("TERM"); + }
protected boolean initialized;
+ protected SigarProxy sigar; + // these are static - values remain for the life of this object protected long pid; protected String name; - protected String baseName; protected String[] commandLine; + protected Map<String, String> procEnv; + + // these are computed once with static data (purposely lazy in order to speed up discovery process) protected Map<String, String> environmentVariables; - protected SigarProxy sigar; + protected String baseName; + + // this one is computed once with non static data + protected ProcessInfo parentProcess;
// these are refreshed and may change during the life of the process + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcState procState; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcExe procExe; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcTime procTime; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcMem procMem; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcCpu procCpu; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcFd procFd; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcCred procCred; + + /** + * @deprecated as of 4.6. To read this property call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated protected ProcCredName procCredName; - protected Map<String, String> procEnv; - protected transient ProcessInfo parentProcess; - protected transient boolean processDied;
+ // Set to true in handleSigarCallException + protected boolean processDied; + + // Set to true if a SIGAR permission error has already been logged private boolean loggedPermissionsError = false; - private static final String UNKNOWN = "?"; + + // The last snasphot of non static process properties + // In a future implementation a new snapshot will be created on each call to refresh + private ProcessInfoSnapshot snapshot = new ProcessInfoSnapshot(); + + private long nextRefreshTime = System.currentTimeMillis(); + + private ReentrantLock refreshLock = new ReentrantLock();
// useful for mocking this object, this is purposely not public protected ProcessInfo() { @@ -97,15 +289,58 @@ public class ProcessInfo { update(pid); }
+ /** + * Takes a fresh snapshot of non static properties of the underlying process + * + * @throws SystemInfoException + */ public void refresh() throws SystemInfoException { - update(this.pid); + // SIGAR has a bug: too close calls to getProcState could return different values even if the underlying + // process state has not changed. To be sure to get correct data, a lock and an interval were introduced. + // Calling threads must acquire the lock and then make sure the interval has elapsed before calling update. + boolean acquiredLock = false; + try { + acquiredLock = refreshLock.tryLock(REFRESH_LOCK_ACQUIRE_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOG.error("Thread interrupted while trying to acquire ProcessInfo[" + this.pid + "] refresh lock", e); + } + if (!acquiredLock) { + throw new RuntimeException("Could not acquire ProcessInfo[" + this.pid + "] refresh lock"); + } + try { + waitForNextRefreshTime(); + update(this.pid); + } finally { + nextRefreshTime = System.currentTimeMillis() + REFRESH_INTERVAL_MILLIS; + refreshLock.unlock(); + } + } + + private void waitForNextRefreshTime() { + for (;;) { + long timeToNextRefresh = nextRefreshTime - System.currentTimeMillis(); + if (timeToNextRefresh > 0) { + try { + Thread.sleep(timeToNextRefresh); + break; + } catch (InterruptedException ignore) { + } + } else { + break; + } + } }
+ // Refresh and update methods cannot be merged because subclasses may override refresh behavior + // and we can't be sure that instances will already be properly initialized. private void update(long pid) throws SystemInfoException { long startTime = System.currentTimeMillis(); try { + this.processDied = false;
+ // Get ProcState and ProcExe before static data as they can help to determine the name field in some cases. + ProcState procState = null; try { procState = sigar.getProcState(pid); @@ -138,7 +373,7 @@ public class ProcessInfo { try { this.procEnv = sigar.getProcEnv(pid); if (this.procEnv == null) { - log.debug("SIGAR returned a null environment for [" + this.baseName + "] process with pid [" + LOG.debug("SIGAR returned a null environment for [" + getBaseName() + "] process with pid [" + this.pid + "]."); } } catch (Exception e) { @@ -190,14 +425,39 @@ public class ProcessInfo { } catch (Exception e) { throw new SystemInfoException(e); } - if (log.isTraceEnabled()) { + if (LOG.isTraceEnabled()) { long elapsedTime = System.currentTimeMillis() - startTime; - log.trace("Retrieval of process info for pid " + pid + " took " + elapsedTime + " ms."); + LOG.trace("Retrieval of process info for pid " + pid + " took " + elapsedTime + " ms."); }
this.processDied = false; }
+ /** + * <p> + * Returns the last snasphot of the non static process properties. + * </p> + * <p> + * Caveat the returned may hold stale data has it was taken with previous SIGAR calls. + * Calling {@link #freshSnapshot()} instead is almost always a better idea. + * </p> + * + * @return a {@link ProcessInfoSnapshot} possibly holding stale data + */ + public ProcessInfoSnapshot priorSnaphot() { + return snapshot; + } + + /** + * Takes a fresh snapshot of the non static process properties. + * + * @return a fresh {@link ProcessInfoSnapshot} + */ + public ProcessInfoSnapshot freshSnapshot() { + refresh(); + return snapshot; + } + public void destroy() throws SystemInfoException { if (this.sigar instanceof Sigar) { try { @@ -215,7 +475,7 @@ public class ProcessInfo { return; }
- if (isWindows() && (this.pid == 0 || this.pid == 4)) { + if (OperatingSystem.IS_WIN32 && (this.pid == 0 || this.pid == 4)) { // On Windows, Pid 0 and Pid 4 are special Kernel processes (Pid 0 is the "System Idle Process" and Pid 4 is // the "System" process). For these processes, it's normal for many of the Sigar.getProc calls to fail, so // there's no need to log anything. @@ -227,29 +487,28 @@ public class ProcessInfo { if (!this.loggedPermissionsError) { // Only log permissions errors once per process. String currentUserName = System.getProperty("user.name"); - log - .trace("Unable to obtain all info for [" - + procName - + "] process with pid [" - + this.pid - + "] - call to " - + methodName - + "failed. " - + "The process is most likely owned by a user other than the user that owns the RHQ plugin container's process (" - + currentUserName + ")."); + LOG.trace("Unable to obtain all info for [" + + procName + + "] process with pid [" + + this.pid + + "] - call to " + + methodName + + "failed. " + + "The process is most likely owned by a user other than the user that owns the RHQ plugin container's process (" + + currentUserName + ")."); this.loggedPermissionsError = true; } } else if (e instanceof SigarNotImplementedException) { - log.trace("Unable to obtain all info for [" + procName + "] process with pid [" + this.pid + "] - call to " + LOG.trace("Unable to obtain all info for [" + procName + "] process with pid [" + this.pid + "] - call to " + methodName + "failed. Cause: " + e); } else { if (!exists()) { - log.debug("Attempt to refresh info for process with pid [" + this.pid - + "] failed, because the process is no longer running."); + LOG.debug("Attempt to refresh info for process with pid [" + this.pid + + "] failed, because the process is no longer running."); this.processDied = true; }
- log.debug("Unexpected error occurred while looking up info for [" + procName + "] process with pid [" + LOG.debug("Unexpected error occurred while looking up info for [" + procName + "] process with pid [" + this.pid + "] - call to " + methodName + " failed. Did the process die? Cause: " + e); } } @@ -260,7 +519,7 @@ public class ProcessInfo { pids = sigar.getProcList(); } catch (SigarException e1) { // TODO (ips, 04/30/12): It probably makes more sense to let this exception bubble up. - log.error("Failed to obtain process list.", e1); + LOG.error("Failed to obtain process list.", e1); return true; }
@@ -274,10 +533,6 @@ public class ProcessInfo { return foundProcess; }
- private static boolean isWindows() { - return File.separatorChar == '\'; - } - private String determineName(String[] procArgs, ProcExe procExe, ProcState procState) { String name; if ((procArgs != null) && (procArgs.length != 0)) { @@ -286,9 +541,10 @@ public class ProcessInfo { name = procExe.getName(); } else if ((procState != null) && (procState.getName() != null)) { String stateName = procState.getName(); - name = ((stateName.indexOf(File.separatorChar) >= 0) && (new File(stateName).exists())) ? stateName : UNKNOWN; + name = ((stateName.indexOf(File.separatorChar) >= 0) && (new File(stateName).exists())) ? stateName + : UNKNOWN_PROCESS_NAME; } else { - name = UNKNOWN; + name = UNKNOWN_PROCESS_NAME; } return name; } @@ -323,7 +579,7 @@ public class ProcessInfo { */ public String getBaseName() { if (baseName == null) { - baseName = (getName() != null) ? new File(getName()).getName() : UNKNOWN; + baseName = (getName() != null) ? new File(getName()).getName() : UNKNOWN_PROCESS_NAME; } return baseName; } @@ -361,82 +617,114 @@ public class ProcessInfo { * @return the environment value */ @Nullable - public String getEnvironmentVariable(@NotNull String name) { + public String getEnvironmentVariable(@NotNull + String name) { if (this.procEnv == null) { return null; } - SystemInfo systemInfo = SystemInfoFactory.createJavaSystemInfo(); boolean isWindows = systemInfo.getOperatingSystemType() == OperatingSystemType.WINDOWS; // Windows env names are case insensitive, so convert the specified name to all-caps before doing the lookup. return getEnvironmentVariables().get((isWindows) ? name.toUpperCase() : name); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public long getParentPid() throws SystemInfoException { - return (this.procState != null) ? this.procState.getPpid() : 0L; + return priorSnaphot().getParentPid(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcState getState() throws SystemInfoException { - return this.procState; + return priorSnaphot().getState(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcExe getExecutable() throws SystemInfoException { - return this.procExe; + return priorSnaphot().getExecutable(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcTime getTime() throws SystemInfoException { - return this.procTime; + return priorSnaphot().getTime(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcMem getMemory() throws SystemInfoException { - return this.procMem; + return priorSnaphot().getMemory(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcCpu getCpu() throws SystemInfoException { - return this.procCpu; + return priorSnaphot().getCpu(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcFd getFileDescriptor() throws SystemInfoException { - return this.procFd; + return priorSnaphot().getFileDescriptor(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcCred getCredentials() throws SystemInfoException { - return this.procCred; + return priorSnaphot().getCredentials(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public ProcCredName getCredentialsName() throws SystemInfoException { - return this.procCredName; + return priorSnaphot().getCredentialsName(); }
/** - * @return null if process executable or cwd is unavailable. Otherwise the Cwd as returned from the - * process executable. - * @throws SystemInfoException + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. */ + @Deprecated public String getCurrentWorkingDirectory() throws SystemInfoException { - String result = null; - - try { - if (null != this.procExe) { - result = this.procExe.getCwd(); - } - } catch (Exception e) { - handleSigarCallException(e, "procExe.getCwd()"); - } - - return result; + return priorSnaphot().getCurrentWorkingDirectory(); }
+ /** + * @deprecated as of 4.6. For similar purpose, call {@link #priorSnaphot()} and then corresponding method + * from the returned {@link ProcessInfoSnapshot}. + */ + @Deprecated public boolean isRunning() throws SystemInfoException { - boolean running = false; - - if (this.procState != null) { - running = (this.procState.getState() == ProcState.RUN || this.procState.getState() == ProcState.SLEEP || this.procState - .getState() == ProcState.IDLE); - - } - - return running; + return priorSnaphot().isRunning(); }
/** @@ -450,13 +738,18 @@ public class ProcessInfo { }
/** - * Returns the parent process of this process. + * Returns a {@link ProcessInfo} instance for the parent of this process. + * + * This method uses the parent process id which is not static (it can change if the parent process dies before its + * child). So in theory it should be moved to the {@link ProcessInfoSnapshot} type. + * + * In practice, it stays here because the parent {@link ProcessInfo} instance is cached after creation. * * @since 4.4 */ public ProcessInfo getParentProcess() throws SystemInfoException { if (this.parentProcess == null) { - this.parentProcess = new ProcessInfo(getParentPid(), sigar); + this.parentProcess = new ProcessInfo(priorSnaphot().getParentPid(), sigar); } else { this.parentProcess.refresh(); } @@ -515,44 +808,32 @@ public class ProcessInfo { @Override public String toString() { StringBuilder s = new StringBuilder("process: "); - s.append("pid=["); s.append(getPid()); s.append("], name=["); - s.append((!getName().equals(UNKNOWN)) ? getName() : getBaseName()); + s.append((!getName().equals(UNKNOWN_PROCESS_NAME)) ? getName() : getBaseName()); s.append("], ppid=["); try { - s.append(getParentPid()); + s.append(priorSnaphot().getParentPid()); } catch (Exception e) { s.append(e); } - s.append("]"); - return s.toString(); }
- private static final Set<String> TERMINATE_SIGNAL_NAMES = new HashSet<String>(); - static { - TERMINATE_SIGNAL_NAMES.add("INT"); - TERMINATE_SIGNAL_NAMES.add("KILL"); - TERMINATE_SIGNAL_NAMES.add("QUIT"); - TERMINATE_SIGNAL_NAMES.add("TERM"); - } - private static int getSignalNumber(String signalName) { if (signalName == null) { throw new IllegalArgumentException("Signal name is null."); } - int signalNumber; if (OperatingSystem.IS_WIN32) { - if (TERMINATE_SIGNAL_NAMES.contains(signalName)) { + if (MS_WINDOWS_TERMINATE_SIGNAL_NAMES.contains(signalName)) { signalNumber = 1; } else { throw new IllegalArgumentException("Unsupported signal name: " + signalName - + " - on Windows, the only supported signal names are " + TERMINATE_SIGNAL_NAMES - + ", all of which return 1."); + + " - on Windows, the only supported signal names are " + MS_WINDOWS_TERMINATE_SIGNAL_NAMES + + ", all of which return 1."); } } else { signalNumber = Sigar.getSigNum(signalName); diff --git a/modules/core/native-system/src/test/java/org/rhq/core/system/ProcessInfoRefreshIntervalTest.java b/modules/core/native-system/src/test/java/org/rhq/core/system/ProcessInfoRefreshIntervalTest.java new file mode 100644 index 0000000..84944ef --- /dev/null +++ b/modules/core/native-system/src/test/java/org/rhq/core/system/ProcessInfoRefreshIntervalTest.java @@ -0,0 +1,175 @@ +/* + * RHQ Management Platform + * Copyright 2013, Red Hat Middleware LLC, and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.core.system; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hyperic.sigar.OperatingSystem; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +import org.rhq.core.util.stream.StreamUtil; + +/** + * @author Thomas Segismont + */ +public class ProcessInfoRefreshIntervalTest { + + private static final Log LOG = LogFactory.getLog(ProcessInfoRefreshIntervalTest.class); + + private static final String KNOWN_ARG = "hellosigar"; + + private Process testProcess; + + private ProcessInfo testProcessInfo; + + private ExecutorService executorService; + + @BeforeTest(alwaysRun = true) + public void setup() throws Exception { + testProcess = createTestProcess(); + if (!isAlive(testProcess)) { + throw new RuntimeException("Test process is not alive"); + } + NativeSystemInfo systemInfo = new NativeSystemInfo(); + List<ProcessInfo> foundProcesses = systemInfo.getProcesses("arg|" + KNOWN_ARG + "|match=.*"); + if (foundProcesses.size() != 1) { + throw new RuntimeException("Found " + foundProcesses.size() + " with arg [" + KNOWN_ARG + "]"); + } + testProcessInfo = foundProcesses.iterator().next(); + int threadCount = Runtime.getRuntime().availableProcessors(); + executorService = Executors.newFixedThreadPool(threadCount); + if (LOG.isDebugEnabled()) { + LOG.debug("Created an executor service with " + threadCount + " threads"); + } + } + + private Process createTestProcess() throws Exception { + if (OperatingSystem.IS_WIN32) { + // On Windows run a simple bat file which behaves like 'watch echo' + File batFile = File.createTempFile("win-watch-echo", ".bat"); + batFile.deleteOnExit(); + InputStream is = getClass().getClassLoader().getResourceAsStream("org/rhq/core/system/win-watch-echo.bat"); + OutputStream os = new FileOutputStream(batFile); + StreamUtil.copy(is, os, true); + ProcessBuilder processBuilder = new ProcessBuilder("cmd", batFile.getAbsolutePath(), KNOWN_ARG); + return processBuilder.start(); + } else { + // On other systems run a simple bash file which behaves like 'watch echo' + File bashFile = File.createTempFile("bash-watch-echo", ".sh"); + bashFile.deleteOnExit(); + InputStream is = getClass().getClassLoader().getResourceAsStream("org/rhq/core/system/bash-watch-echo.sh"); + OutputStream os = new FileOutputStream(bashFile); + StreamUtil.copy(is, os, true); + ProcessBuilder processBuilder = new ProcessBuilder("bash", bashFile.getAbsolutePath(), KNOWN_ARG); + return processBuilder.start(); + } + } + + @AfterTest(alwaysRun = true) + public void tearDown() { + if (testProcess != null) { + testProcess.destroy(); + testProcess = null; + } + testProcessInfo = null; + if (executorService != null) { + executorService.shutdownNow(); + } + } + + /** + * We want to be sure that conccurent calls to refresh method will result in correct process state + * detection - see comments in {@link ProcessInfo#refresh()}. + * @throws Exception + */ + @Test(timeOut = 1000 * 60) + public void testRefreshInterval() throws Exception { + // Create and execute tasks which will ask a freshSnapshot of the processInfo and check if it is running + List<Future<Boolean>> futures = submitStateTestingTasks(); + for (Future<Boolean> future : futures) { + // All tasks should see the process running + assertTrue(future.get()); + } + // Send kill + testProcess.destroy(); + // Wait for death + while (isAlive(testProcess)) { + Thread.sleep(100); + } + // Create and execute tasks again + futures = submitStateTestingTasks(); + for (Future<Boolean> future : futures) { + // All tasks should now see the process down + assertFalse(future.get()); + } + } + + private List<Future<Boolean>> submitStateTestingTasks() { + List<Future<Boolean>> futures = new LinkedList<Future<Boolean>>(); + for (int i = 0; i < 5; i++) { + final int index = i; + futures.add(executorService.submit(new Callable<Boolean>() { + + @Override + public Boolean call() throws Exception { + if (LOG.isDebugEnabled()) { + LOG.debug("Execute state testing task[" + index + "]"); + } + boolean isRunning = testProcessInfo.freshSnapshot().isRunning(); + if (LOG.isDebugEnabled()) { + LOG.debug("State testing task[" + index + "] result: " + isRunning); + } + return isRunning; + } + })); + } + return futures; + } + + private boolean isAlive(Process process) { + if (process == null) { + return false; + } + try { + process.exitValue(); + return false; + } catch (IllegalThreadStateException e) { + return true; + } + } + +} diff --git a/modules/core/native-system/src/test/resources/org/rhq/core/system/bash-watch-echo.sh b/modules/core/native-system/src/test/resources/org/rhq/core/system/bash-watch-echo.sh new file mode 100644 index 0000000..7d0f4c0 --- /dev/null +++ b/modules/core/native-system/src/test/resources/org/rhq/core/system/bash-watch-echo.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +while : +do + echo $1 + sleep 1 +done diff --git a/modules/core/native-system/src/test/resources/org/rhq/core/system/win-watch-echo.bat b/modules/core/native-system/src/test/resources/org/rhq/core/system/win-watch-echo.bat new file mode 100644 index 0000000..4404159 --- /dev/null +++ b/modules/core/native-system/src/test/resources/org/rhq/core/system/win-watch-echo.bat @@ -0,0 +1,5 @@ +@ECHO OFF +:loop + echo %1 + timeout /t 2 +goto loop diff --git a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java index 76ccf39..16d7bbc 100644 --- a/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java +++ b/modules/core/plugin-api/src/main/java/org/rhq/core/pluginapi/inventory/ResourceContext.java @@ -310,6 +310,9 @@ public class ResourceContext<T extends ResourceComponent<?>> { * Returns the information on the native operating system process in which the managed resource is running. If * native support is not available or the process for some reason can no longer be found, this may return <code> * null</code>. + * + * The returned {@link ProcessInfo} always has a fresh snapshot of non static data: it's whether newly created + * or got refreshed in order to determine if the process was still running. * * @return information on the resource's process */ @@ -350,9 +353,9 @@ public class ResourceContext<T extends ResourceComponent<?>> {
details = this.resourceDiscoveryComponent.discoverResources(context); } - + trackedProcesses.update(details); - processInfo = trackedProcesses.getProcessInfo(resourceKey); + processInfo = trackedProcesses.getProcessInfo(resourceKey); } catch (Exception e) { LOG.warn("Cannot get native process for resource [" + this.resourceKey + "] - discovery failed", e); } @@ -366,22 +369,8 @@ public class ResourceContext<T extends ResourceComponent<?>> { return processInfo; }
- /** - * @param processInfo - * @return - */ private boolean isRediscoveryRequired(ProcessInfo processInfo) { - boolean rediscover = processInfo == null; - - if (!rediscover) { - //if the process info thinks the process is running, - //refresh it to check its facts again - if (processInfo.isRunning()) { - processInfo.refresh(); - } - rediscover = !processInfo.isRunning(); - } - return rediscover; + return processInfo == null || !processInfo.freshSnapshot().isRunning(); }
/** @@ -519,6 +508,7 @@ public class ResourceContext<T extends ResourceComponent<?>> { /** * @deprecated Use {@link AvailabilityContext#createAvailabilityCollectorRunnable(AvailabilityFacet, long)} */ + @Deprecated public AvailabilityCollectorRunnable createAvailabilityCollectorRunnable(AvailabilityFacet availChecker, long interval) {
diff --git a/modules/integration-tests/apache-plugin-test/src/test/java/org/rhq/plugins/apache/util/ApacheExecutionUtil.java b/modules/integration-tests/apache-plugin-test/src/test/java/org/rhq/plugins/apache/util/ApacheExecutionUtil.java index 64ab1c0..53f7f0c 100644 --- a/modules/integration-tests/apache-plugin-test/src/test/java/org/rhq/plugins/apache/util/ApacheExecutionUtil.java +++ b/modules/integration-tests/apache-plugin-test/src/test/java/org/rhq/plugins/apache/util/ApacheExecutionUtil.java @@ -185,8 +185,7 @@ public class ApacheExecutionUtil { OperationResult res = serverComponent.invokeOperation(operation, new Configuration());
LOG.debug("Invoked operation '" + operation + "' on " + resourceContext.getResourceKey() + " (waiting for " - + desiredState + "), attempt " + i + ": " - + res.getComplexResults().getMap().toString()); + + desiredState + "), attempt " + i + ": " + res.getComplexResults().getMap().toString());
//wait for max 30s for the operation to "express" itself int w = 0; @@ -212,7 +211,11 @@ public class ApacheExecutionUtil {
++i;
- LOG.warn("Could not detect the httpd process after invoking the start operation but the operation didn't throw any exception. I will retry at most ten times and then fail loudly. This has been attempt no. " + LOG.warn("httpd process is in an unexpected state after invoking the '" + + operation + + "' operation on " + + resourceContext.getResourceKey() + + " but the operation didn't throw any exception. I will retry at most ten times and then fail loudly. This has been attempt no. " + i); }
diff --git a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java index 5f22f83..efecc27 100644 --- a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java +++ b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java @@ -54,6 +54,7 @@ import org.rhq.core.pluginapi.util.ProcessExecutionUtility; import org.rhq.core.system.ProcessExecution; import org.rhq.core.system.ProcessExecutionResults; import org.rhq.core.system.ProcessInfo; +import org.rhq.core.system.ProcessInfo.ProcessInfoSnapshot; import org.rhq.core.system.SystemInfo; import org.rhq.core.util.exception.ThrowableUtil; import org.rhq.plugins.jmx.JMXServerComponent; @@ -73,10 +74,14 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
if (processInfo == null) { return UNKNOWN; - } else if (processInfo.isRunning()) { - return UP; } else { - return DOWN; + // It is safe to read prior snapshot as getNativeProcess always return a fresh instance + ProcessInfoSnapshot processInfoSnaphot = processInfo.priorSnaphot(); + if (processInfoSnaphot.isRunning()) { + return UP; + } else { + return DOWN; + } } }
diff --git a/modules/plugins/hadoop/src/main/java/org/rhq/plugins/hadoop/HadoopServerComponent.java b/modules/plugins/hadoop/src/main/java/org/rhq/plugins/hadoop/HadoopServerComponent.java index c3a590c..ef1c8c5 100644 --- a/modules/plugins/hadoop/src/main/java/org/rhq/plugins/hadoop/HadoopServerComponent.java +++ b/modules/plugins/hadoop/src/main/java/org/rhq/plugins/hadoop/HadoopServerComponent.java @@ -33,7 +33,6 @@ import org.mc4j.ems.connection.bean.attribute.EmsAttribute; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.ConfigurationUpdateStatus; import org.rhq.core.domain.measurement.AvailabilityType; -import org.rhq.core.domain.measurement.DataType; import org.rhq.core.domain.measurement.MeasurementDataNumeric; import org.rhq.core.domain.measurement.MeasurementDataTrait; import org.rhq.core.domain.measurement.MeasurementDefinition; @@ -52,8 +51,6 @@ import org.rhq.core.pluginapi.measurement.MeasurementFacet; import org.rhq.core.pluginapi.operation.OperationFacet; import org.rhq.core.pluginapi.operation.OperationResult; import org.rhq.core.system.ProcessInfo; -import org.rhq.plugins.hadoop.calltime.HadoopEventAndCalltimeDelegate; -import org.rhq.plugins.hadoop.calltime.JobSummary; import org.rhq.plugins.jmx.JMXComponent; import org.rhq.plugins.jmx.JMXServerComponent;
@@ -61,18 +58,18 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< JMXComponent<ResourceComponent<?>>, MeasurementFacet, OperationFacet, ConfigurationFacet {
private static final Log LOG = LogFactory.getLog(HadoopServerComponent.class); - + public static final String LOG_EVENT_TYPE = "logEntry"; public static final String LOG_POLLING_INTERVAL_PROPERTY = "logPollingInterval"; - + private Map<String, Boolean> percentageMeasurements; - + private HadoopServerConfigurationDelegate configurationDelegate; - + private HadoopOperationsDelegate operationsDelegate;
private boolean eventsRegistered; - + @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public void start(ResourceContext context) throws Exception { @@ -84,10 +81,11 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< Set<MeasurementDefinition> measDefinitions = context.getResourceType().getMetricDefinitions(); percentageMeasurements = new HashMap<String, Boolean>(measDefinitions.size()); for (MeasurementDefinition measDefinition : measDefinitions) { - percentageMeasurements.put(measDefinition.getName(), MeasurementUnits.PERCENTAGE.equals(measDefinition.getUnits())); + percentageMeasurements.put(measDefinition.getName(), + MeasurementUnits.PERCENTAGE.equals(measDefinition.getUnits())); } } - + @Override public void stop() { EventContext events = getResourceContext().getEventContext(); @@ -98,7 +96,7 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< } super.stop(); } - + /** * Return availability of this resource * @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability() @@ -106,15 +104,18 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< @Override public AvailabilityType getAvailability() { ProcessInfo process = getResourceContext().getNativeProcess(); - - AvailabilityType ret = process == null ? AvailabilityType.DOWN : (process.isRunning() ? AvailabilityType.UP : AvailabilityType.DOWN); - + + // It is safe to read prior snapshot as getNativeProcess always return a fresh instance + AvailabilityType ret = process == null ? AvailabilityType.DOWN + : (process.priorSnaphot().isRunning() ? AvailabilityType.UP : AvailabilityType.DOWN); + EventContext events = getResourceContext().getEventContext(); if (events != null) { if (ret == AvailabilityType.UP) { if (!eventsRegistered) { File logFile = determineLogFile(); - int interval = Integer.parseInt(getResourceContext().getPluginConfiguration().getSimpleValue(LOG_POLLING_INTERVAL_PROPERTY, "60")); + int interval = Integer.parseInt(getResourceContext().getPluginConfiguration().getSimpleValue( + LOG_POLLING_INTERVAL_PROPERTY, "60")); events.registerEventPoller(createNewEventPoller(events, logFile), interval); eventsRegistered = true; } @@ -124,7 +125,7 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< discardPoller(); } } - + return ret; }
@@ -148,7 +149,7 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< handleMetric(report, request); } } - + protected void handleMetric(MeasurementReport report, MeasurementScheduleRequest request) throws Exception { String name = request.getName(); int delimIndex = name.lastIndexOf(':'); @@ -169,7 +170,7 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< } else { report.addData(new MeasurementDataNumeric(request, value.doubleValue())); } - + } else { report.addData(new MeasurementDataTrait(request, valueObject.toString())); } @@ -183,14 +184,14 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< LOG.error("Failed to obtain measurement [" + name + "]", e); } } - + @Override public Configuration loadResourceConfiguration() throws Exception { return configurationDelegate.loadConfiguration(); }
@Override - public void updateResourceConfiguration(ConfigurationUpdateReport report) { + public void updateResourceConfiguration(ConfigurationUpdateReport report) { try { Configuration updatedConfiguration = report.getConfiguration(); configurationDelegate.updateConfiguration(updatedConfiguration); @@ -218,37 +219,38 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< } return result; } - + protected EventPoller createNewEventPoller(EventContext eventContext, File logFile) { - return new LogFileEventPoller(eventContext, LOG_EVENT_TYPE, logFile, new Log4JLogEntryProcessor(LOG_EVENT_TYPE, logFile)); + return new LogFileEventPoller(eventContext, LOG_EVENT_TYPE, logFile, new Log4JLogEntryProcessor(LOG_EVENT_TYPE, + logFile)); } - + protected void discardPoller() { - + } - + private File determineLogFile() { String username = getResourceContext().getNativeProcess().getCredentialsName().getUser(); String hostname = getResourceContext().getSystemInformation().getHostname(); - + String serverType = getServerType(); - + String name = "hadoop-" + username + "-" + serverType + "-" + hostname + ".log"; - + return new File(new File(getHomeDir(), "logs"), name); } - + private String getServerType() { String mainClass = getResourceContext().getPluginConfiguration().getSimpleValue("_mainClass"); int dot = mainClass.lastIndexOf('.'); String className = mainClass.substring(dot + 1); - + return className.toLowerCase(); } - + protected File getHomeDir() { - File homeDir = - new File(getResourceContext().getPluginConfiguration().getSimpleValue(HadoopServerDiscovery.HOME_DIR_PROPERTY)); + File homeDir = new File(getResourceContext().getPluginConfiguration().getSimpleValue( + HadoopServerDiscovery.HOME_DIR_PROPERTY));
if (!homeDir.exists()) { throw new IllegalArgumentException("The configured home directory of this Hadoop instance (" @@ -266,5 +268,5 @@ public class HadoopServerComponent extends JMXServerComponent<ResourceComponent< }
return homeDir; - } + } } diff --git a/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java b/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java index f1a16e4..9d7169e 100644 --- a/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java +++ b/modules/plugins/mysql/src/main/java/org/rhq/plugins/mysql/MySqlComponent.java @@ -178,7 +178,7 @@ public class MySqlComponent implements DatabaseComponent<ResourceComponent<?>>, private AggregateProcessInfo findProcessInfo() { AggregateProcessInfo result = null; // is still running reuse - if (aggregateProcessInfo != null && aggregateProcessInfo.isRunning()) { + if (aggregateProcessInfo != null && aggregateProcessInfo.freshSnapshot().isRunning()) { result = aggregateProcessInfo; } else { long pid = findPID(); diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/ProcessComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/ProcessComponent.java index c85ec42..a53b678 100644 --- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/ProcessComponent.java +++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/ProcessComponent.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2012 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -42,6 +42,7 @@ import org.rhq.core.pluginapi.inventory.ResourceContext; import org.rhq.core.pluginapi.measurement.MeasurementFacet; import org.rhq.core.system.AggregateProcessInfo; import org.rhq.core.system.ProcessInfo; +import org.rhq.core.system.ProcessInfo.ProcessInfoSnapshot; import org.rhq.core.system.SystemInfo; import org.rhq.core.util.exception.ThrowableUtil;
@@ -97,7 +98,14 @@ public class ProcessComponent implements ResourceComponent, MeasurementFacet { @Override public AvailabilityType getAvailability() { try { - return getProcess().isRunning() ? AvailabilityType.UP : AvailabilityType.DOWN; + // Get a fresh snapshot of the process + ProcessInfoSnapshot processInfoSnapshot = (this.process == null) ? null : this.process.freshSnapshot(); + if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) { + this.process = getProcessForConfiguration(); + // Safe to get prior snapshot here, we've just recreated the process info instance + processInfoSnapshot = (this.process == null) ? null : this.process.priorSnaphot(); + } + return processInfoSnapshot.isRunning() ? AvailabilityType.UP : AvailabilityType.DOWN; } catch (Exception e) { if (log.isDebugEnabled()) { log.debug("failed to get process info: " + ThrowableUtil.getAllMessages(e)); @@ -106,21 +114,6 @@ public class ProcessComponent implements ResourceComponent, MeasurementFacet { } }
- private ProcessInfo getProcess() throws Exception { - if (this.process != null && this.process.isRunning()) { - // Refresh existing ProcessInfo when underlying process is apparently running. - // ProcessInfo may hold stale data. - // SIGAR objects do not get updated when a process goes down. - this.process.refresh(); - } - if (this.process == null || !this.process.isRunning()) { - // Create ProcessInfo for the first time or when the underlying process is no longer running. - // When a process is no longer running we need to make a new PIQL or pid file discovery. - this.process = getProcessForConfiguration(); - } - return this.process; - } - private ProcessInfo getProcessForConfiguration() throws Exception { SystemInfo sysInfo = this.resourceContext.getSystemInformation(); return getProcessForConfiguration(this.type, this.pidFile, this.piql, this.fullProcessTree, sysInfo); diff --git a/modules/plugins/sshd/src/main/java/org/rhq/plugins/sshd/OpenSSHDComponent.java b/modules/plugins/sshd/src/main/java/org/rhq/plugins/sshd/OpenSSHDComponent.java index 3cbe5b2..ec518aa 100644 --- a/modules/plugins/sshd/src/main/java/org/rhq/plugins/sshd/OpenSSHDComponent.java +++ b/modules/plugins/sshd/src/main/java/org/rhq/plugins/sshd/OpenSSHDComponent.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2008 Red Hat, Inc. + * Copyright (C) 2005-2012 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -28,6 +28,9 @@ import java.util.Set;
import net.augeas.Augeas;
+import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertyList; import org.rhq.core.domain.configuration.PropertyMap; @@ -52,37 +55,62 @@ import org.rhq.core.pluginapi.util.ObjectUtil; import org.rhq.core.system.AggregateProcessInfo; import org.rhq.core.system.NetworkStats; import org.rhq.core.system.ProcessInfo; +import org.rhq.core.system.ProcessInfo.ProcessInfoSnapshot; +import org.rhq.core.util.exception.ThrowableUtil;
/** * @author Greg Hinkle */ public class OpenSSHDComponent implements ResourceComponent, ConfigurationFacet, MeasurementFacet {
+ private static final Log log = LogFactory.getLog(OpenSSHDComponent.class); + private ResourceContext resourceContext; private AggregateProcessInfo processInfo;
+ @Override public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception { this.resourceContext = resourceContext; - getSSHDProcess(); + this.processInfo = getSSHDProcess(); }
+ @Override public void stop() { }
+ @Override public AvailabilityType getAvailability() { - return (processInfo != null && processInfo.isRunning()) ? AvailabilityType.UP : AvailabilityType.DOWN; + try { + // Get a fresh snapshot of the process + ProcessInfoSnapshot processInfoSnapshot = (this.processInfo == null) ? null : this.processInfo + .freshSnapshot(); + if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) { + this.processInfo = getSSHDProcess(); + // Safe to get prior snapshot here, we've just recreated the process info instance + processInfoSnapshot = (this.processInfo == null) ? null : this.processInfo.priorSnaphot(); + } + return (this.processInfo != null && processInfoSnapshot.isRunning()) ? AvailabilityType.UP + : AvailabilityType.DOWN; + } catch (Exception e) { + if (log.isDebugEnabled()) { + log.debug("failed to get availability: " + ThrowableUtil.getAllMessages(e)); + } + return AvailabilityType.DOWN; + } }
- private void getSSHDProcess() { + private AggregateProcessInfo getSSHDProcess() {
List<ProcessInfo> procs = resourceContext.getSystemInformation().getProcesses( "process|basename|match=sshd,process|basename|nomatch|parent=sshd");
if (procs.size() == 1) { - this.processInfo = procs.get(0).getAggregateProcessTree(); + return procs.get(0).getAggregateProcessTree(); } + return null; }
+ @Override public Configuration loadResourceConfiguration() throws Exception { Configuration pluginConfiguration = resourceContext.getPluginConfiguration(); ConfigurationDefinition resourceConfigurationDefinition = resourceContext.getResourceType() @@ -172,8 +200,7 @@ public class OpenSSHDComponent implements ResourceComponent, ConfigurationFacet, // This very hackish bit of code is to suport the list-of-maps standard with a single simple definition in the map PropertyDefinitionList listDef = ((PropertyDefinitionList) p); PropertyDefinitionMap mapDef = ((PropertyDefinitionMap) listDef.getMemberDefinition()); - PropertyDefinitionSimple simpleDef = (PropertyDefinitionSimple) mapDef.getPropertyDefinitions() - .get(0); + PropertyDefinitionSimple simpleDef = (PropertyDefinitionSimple) mapDef.getPropertyDefinitions().get(0); String name = simpleDef.getName();
List<String> allValues = new ArrayList<String>(); @@ -196,9 +223,11 @@ public class OpenSSHDComponent implements ResourceComponent, ConfigurationFacet, return config; }
+ @Override public void updateResourceConfiguration(ConfigurationUpdateReport report) { }
+ @Override public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception { NetworkStats stats = resourceContext.getSystemInformation().getNetworkStats("localhost", 22); processInfo.refresh();
commit d65b4e4ce17fe7ad97b8634971490395c2521261 Author: Jirka Kremser jkremser@redhat.com Date: Thu Jan 24 16:27:28 2013 +0100
refactoring: renaming class "ResourceResourceAgentView" to "ResourceAgentView"
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java index 28ca7ab..e67d697 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java @@ -65,7 +65,7 @@ import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configura import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.configuration.ResourceConfigurationHistoryListView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.PluginConfigurationEditView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.PluginConfigurationHistoryListView; -import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.ResourceResourceAgentView; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory.ResourceAgentView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.CalltimeView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.avail.ResourceAvailabilityView; import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.schedules.ResourceSchedulesView; @@ -384,7 +384,7 @@ public class ResourceDetailView extends AbstractTwoLevelTabSetView<ResourceCompo viewFactory = (!enabled) ? null : new ViewFactory() { @Override public Canvas createView() { - return new ResourceResourceAgentView(inventoryTab.extendLocatorId("AgentView"), resourceId); + return new ResourceAgentView(inventoryTab.extendLocatorId("AgentView"), resourceId); } }; updateSubTab(this.inventoryTab, this.inventoryAgent, true, enabled, viewFactory); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceAgentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceAgentView.java new file mode 100644 index 0000000..5c91365 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceAgentView.java @@ -0,0 +1,216 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2010 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.form.fields.FormItem; +import com.smartgwt.client.widgets.form.fields.FormItemIcon; +import com.smartgwt.client.widgets.form.fields.HeaderItem; +import com.smartgwt.client.widgets.form.fields.SpacerItem; +import com.smartgwt.client.widgets.form.fields.StaticTextItem; + +import org.rhq.core.domain.resource.Agent; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.ImageManager; +import org.rhq.enterprise.gui.coregui.client.RefreshableView; +import org.rhq.enterprise.gui.coregui.client.admin.topology.AgentTableView; +import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.util.StringUtility; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; +import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility; + +/** + * The content pane for the Resource Inventory>Agent subtab. + * + * @author Simeon Pinder + */ +public class ResourceAgentView extends LocatableVLayout implements RefreshableView { + + private int resourceId; + private LocatableDynamicForm form; + private StaticTextItem nameValue; + private StaticTextItem addressValue; + private StaticTextItem portValue; + private FormItemIcon agentStatusIcon; + private StaticTextItem lastAvailReportValue; + private StaticTextItem lastAvailPingValue; + private StaticTextItem endpointValue; + private StaticTextItem topologyViewItem; + + private boolean loading = false; // will be true if loadData is currently waiting for responses + + public ResourceAgentView(String locatorId, int resourceId) { + super(locatorId); + + this.resourceId = resourceId; + } + + @Override + protected void onDraw() { + super.onDraw(); + + setLeft("10%"); + setWidth("80%"); + + this.form = new LocatableDynamicForm(extendLocatorId("Agent_Info")); + final List<FormItem> formItems = createFormItems(); + this.form.setItems(formItems.toArray(new FormItem[formItems.size()])); + loadData(); + this.addMember(this.form); + } + + @Override + public void refresh() { + loadData(); + } + + private List<FormItem> createFormItems() { + final List<FormItem> formItems = new ArrayList<FormItem>(); + HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title()); + headerItem.setValue(MSG.view_inventory_summary_agent_title()); + formItems.add(headerItem); + formItems.add(new SpacerItem()); + + // Name + nameValue = new StaticTextItem("name", MSG.common_title_name()); + formItems.add(nameValue); + + // Address + String address = "address"; + addressValue = new StaticTextItem(address, MSG.common_title_address()); + formItems.add(addressValue); + + // Port + String port = "port"; + portValue = new StaticTextItem(port, MSG.common_title_port()); + formItems.add(portValue); + + // Agent Status + agentStatusIcon = new FormItemIcon(); + agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null)); + StaticTextItem agentStatus = new StaticTextItem("agent-comm-status", MSG + .view_inventory_summary_agent_status_title()); + agentStatus.setIcons(agentStatusIcon); + agentStatus.setWrapTitle(false); + formItems.add(agentStatus); + + // Last Received Avail report + String lastAvailReport = "last-avail-report"; + lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG.view_inventory_summary_agent_last_title()); + lastAvailReportValue.setWrapTitle(false); + formItems.add(lastAvailReportValue); + + // Last Received Avail ping + lastAvailPingValue = new StaticTextItem("last-avail-ping", MSG.view_adminTopology_agent_lastAvailabilityPing()); + lastAvailPingValue.setWrapTitle(false); + formItems.add(lastAvailPingValue); + + // Full Endpoint + String fullEndpoint = "full-endpoint"; + endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint()); + formItems.add(endpointValue); + + // link to agent topology view + String topologyView = "topology-view"; + topologyViewItem = new StaticTextItem("topology-view", MSG.view_admin_topology()); + formItems.add(topologyViewItem); + + return formItems; + } + + private void loadData() { + if (loading) { + return; // we are already loading and waiting for data, no need to re-issue the same queries + } + loading = true; + + GWTServiceLookup.getAgentService().getAgentForResource(this.resourceId, new AsyncCallback<Agent>() { + @Override + public void onFailure(Throwable caught) { + loading = false; + //Permissions failure, generate message to that effect + for (Canvas child : form.getChildren()) { + child.destroy(); + } + + HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title()); + headerItem.setValue(MSG.view_inventory_summary_agent_title()); + StaticTextItem permissionsMessage = new StaticTextItem("permissions", "permissionsFailure"); + permissionsMessage.setShowTitle(false); + permissionsMessage.setValue(MSG.view_inventory_summary_agent_error3()); + permissionsMessage.setWrap(false); + form.setFields(headerItem, new SpacerItem(), permissionsMessage); + form.markForRedraw(); + } + + @Override + public void onSuccess(Agent agent) { + GWTServiceLookup.getAgentService().pingAgentForResource(resourceId, new AsyncCallback<Boolean>() { + @Override + public void onFailure(Throwable caught) { + loading = false; + CoreGUI.getErrorHandler().handleError( + MSG.view_inventory_summary_agent_error2() + " " + resourceId + ".", caught); + agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null)); + form.markForRedraw(); + } + + @Override + public void onSuccess(Boolean isUp) { + loading = false; + //update icon with correct status + agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(isUp)); + form.markForRedraw(); + } + }); + nameValue.setValue(agent.getName()); + addressValue.setValue(agent.getAddress()); + portValue.setValue(agent.getPort()); + Long lastAvailReport = agent.getLastAvailabilityReport(); + lastAvailReportValue.setValue((null != lastAvailReport) ? new Date(lastAvailReport) : MSG.common_val_none()); + Long lastAvailPing = agent.getLastAvailabilityPing(); + lastAvailPingValue.setValue((null != lastAvailPing) ? new Date(lastAvailPing) : MSG.common_val_none()); + String remoteEndpoint = agent.getRemoteEndpoint(); + if (remoteEndpoint != null) { + // some browsers (firefox in particular) won't wrap unless you put breaks in the string + // (EDIT: in FF 16 the wrapping works even without a space, so this could be possibly ommited) + remoteEndpoint = remoteEndpoint.replaceAll("&", " &"); + } else { + remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1(); + } + endpointValue.setValue(remoteEndpoint); + + // make clickable link for agent topology view + String detailsUrl = "#" + AgentTableView.VIEW_PATH + "/" + agent.getId(); + String formattedValue = StringUtility.escapeHtml(MSG.common_label_link()); + String topologyViewItemText = SeleniumUtility.getLocatableHref(detailsUrl, formattedValue, null); + topologyViewItem.setValue(topologyViewItemText); + + form.markForRedraw(); + } + }); + } + +} \ No newline at end of file diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java deleted file mode 100644 index 478207e..0000000 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2005-2010 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.inventory; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import com.google.gwt.user.client.rpc.AsyncCallback; -import com.smartgwt.client.widgets.Canvas; -import com.smartgwt.client.widgets.form.fields.FormItem; -import com.smartgwt.client.widgets.form.fields.FormItemIcon; -import com.smartgwt.client.widgets.form.fields.HeaderItem; -import com.smartgwt.client.widgets.form.fields.SpacerItem; -import com.smartgwt.client.widgets.form.fields.StaticTextItem; - -import org.rhq.core.domain.resource.Agent; -import org.rhq.enterprise.gui.coregui.client.CoreGUI; -import org.rhq.enterprise.gui.coregui.client.ImageManager; -import org.rhq.enterprise.gui.coregui.client.RefreshableView; -import org.rhq.enterprise.gui.coregui.client.admin.topology.AgentTableView; -import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; -import org.rhq.enterprise.gui.coregui.client.util.StringUtility; -import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm; -import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; -import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility; - -/** - * The content pane for the Resource Inventory>Agent subtab. - * - * @author Simeon Pinder - */ -public class ResourceResourceAgentView extends LocatableVLayout implements RefreshableView { - - private int resourceId; - private LocatableDynamicForm form; - private StaticTextItem nameValue; - private StaticTextItem addressValue; - private StaticTextItem portValue; - private FormItemIcon agentStatusIcon; - private StaticTextItem lastAvailReportValue; - private StaticTextItem lastAvailPingValue; - private StaticTextItem endpointValue; - private StaticTextItem topologyViewItem; - - private boolean loading = false; // will be true if loadData is currently waiting for responses - - public ResourceResourceAgentView(String locatorId, int resourceId) { - super(locatorId); - - this.resourceId = resourceId; - } - - @Override - protected void onDraw() { - super.onDraw(); - - setLeft("10%"); - setWidth("80%"); - - this.form = new LocatableDynamicForm(extendLocatorId("Agent_Info")); - final List<FormItem> formItems = createFormItems(); - this.form.setItems(formItems.toArray(new FormItem[formItems.size()])); - loadData(); - this.addMember(this.form); - } - - @Override - public void refresh() { - loadData(); - } - - private List<FormItem> createFormItems() { - final List<FormItem> formItems = new ArrayList<FormItem>(); - HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title()); - headerItem.setValue(MSG.view_inventory_summary_agent_title()); - formItems.add(headerItem); - formItems.add(new SpacerItem()); - - // Name - nameValue = new StaticTextItem("name", MSG.common_title_name()); - formItems.add(nameValue); - - // Address - String address = "address"; - addressValue = new StaticTextItem(address, MSG.common_title_address()); - formItems.add(addressValue); - - // Port - String port = "port"; - portValue = new StaticTextItem(port, MSG.common_title_port()); - formItems.add(portValue); - - // Agent Status - agentStatusIcon = new FormItemIcon(); - agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null)); - StaticTextItem agentStatus = new StaticTextItem("agent-comm-status", MSG - .view_inventory_summary_agent_status_title()); - agentStatus.setIcons(agentStatusIcon); - agentStatus.setWrapTitle(false); - formItems.add(agentStatus); - - // Last Received Avail report - String lastAvailReport = "last-avail-report"; - lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG.view_inventory_summary_agent_last_title()); - lastAvailReportValue.setWrapTitle(false); - formItems.add(lastAvailReportValue); - - // Last Received Avail ping - lastAvailPingValue = new StaticTextItem("last-avail-ping", MSG.view_adminTopology_agent_lastAvailabilityPing()); - lastAvailPingValue.setWrapTitle(false); - formItems.add(lastAvailPingValue); - - // Full Endpoint - String fullEndpoint = "full-endpoint"; - endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint()); - formItems.add(endpointValue); - - // link to agent topology view - String topologyView = "topology-view"; - topologyViewItem = new StaticTextItem("topology-view", MSG.view_admin_topology()); - formItems.add(topologyViewItem); - - return formItems; - } - - private void loadData() { - if (loading) { - return; // we are already loading and waiting for data, no need to re-issue the same queries - } - loading = true; - - GWTServiceLookup.getAgentService().getAgentForResource(this.resourceId, new AsyncCallback<Agent>() { - @Override - public void onFailure(Throwable caught) { - loading = false; - //Permissions failure, generate message to that effect - for (Canvas child : form.getChildren()) { - child.destroy(); - } - - HeaderItem headerItem = new HeaderItem("header", MSG.view_inventory_summary_agent_title()); - headerItem.setValue(MSG.view_inventory_summary_agent_title()); - StaticTextItem permissionsMessage = new StaticTextItem("permissions", "permissionsFailure"); - permissionsMessage.setShowTitle(false); - permissionsMessage.setValue(MSG.view_inventory_summary_agent_error3()); - permissionsMessage.setWrap(false); - form.setFields(headerItem, new SpacerItem(), permissionsMessage); - form.markForRedraw(); - } - - @Override - public void onSuccess(Agent agent) { - GWTServiceLookup.getAgentService().pingAgentForResource(resourceId, new AsyncCallback<Boolean>() { - @Override - public void onFailure(Throwable caught) { - loading = false; - CoreGUI.getErrorHandler().handleError( - MSG.view_inventory_summary_agent_error2() + " " + resourceId + ".", caught); - agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(null)); - form.markForRedraw(); - } - - @Override - public void onSuccess(Boolean isUp) { - loading = false; - //update icon with correct status - agentStatusIcon.setSrc(ImageManager.getAvailabilityLargeIcon(isUp)); - form.markForRedraw(); - } - }); - nameValue.setValue(agent.getName()); - addressValue.setValue(agent.getAddress()); - portValue.setValue(agent.getPort()); - Long lastAvailReport = agent.getLastAvailabilityReport(); - lastAvailReportValue.setValue((null != lastAvailReport) ? new Date(lastAvailReport) : MSG.common_val_none()); - Long lastAvailPing = agent.getLastAvailabilityPing(); - lastAvailPingValue.setValue((null != lastAvailPing) ? new Date(lastAvailPing) : MSG.common_val_none()); - String remoteEndpoint = agent.getRemoteEndpoint(); - if (remoteEndpoint != null) { - // some browsers (firefox in particular) won't wrap unless you put breaks in the string - // (EDIT: in FF 16 the wrapping works even without a space, so this could be possibly ommited) - remoteEndpoint = remoteEndpoint.replaceAll("&", " &"); - } else { - remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1(); - } - endpointValue.setValue(remoteEndpoint); - - // make clickable link for agent topology view - String detailsUrl = "#" + AgentTableView.VIEW_PATH + "/" + agent.getId(); - String formattedValue = StringUtility.escapeHtml(MSG.common_label_link()); - String topologyViewItemText = SeleniumUtility.getLocatableHref(detailsUrl, formattedValue, null); - topologyViewItem.setValue(topologyViewItemText); - - form.markForRedraw(); - } - }); - } - -} \ No newline at end of file
commit 875acb2dde6de2de0e5dee792ed437ace1252271 Author: Jirka Kremser jkremser@redhat.com Date: Thu Jan 24 14:47:15 2013 +0100
Adding "Last Availability Ping" to the agent detail page in topology section and to the agent detail page in Inventory->Agent tab
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java index f8de3a6..0b13a1b 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasource.java @@ -23,6 +23,7 @@ import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasour import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AFFINITY_GROUP_ID; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AGENTTOKEN; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_ID; +import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_PING; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_REPORT; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_NAME; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_PORT; @@ -101,9 +102,12 @@ public class AgentDatasource extends RPCDataSource<Agent, AgentCriteria> { fields.add(serverIdField);
fields.add(FIELD_PORT.getListGridField("90")); - ListGridField lastAvailabilityReportField = FIELD_LAST_AVAILABILITY_REPORT.getListGridField("120"); + ListGridField lastAvailabilityReportField = FIELD_LAST_AVAILABILITY_REPORT.getListGridField("125"); TimestampCellFormatter.prepareDateField(lastAvailabilityReportField); fields.add(lastAvailabilityReportField); + ListGridField lastAvailabilityPingField = FIELD_LAST_AVAILABILITY_PING.getListGridField("125"); + TimestampCellFormatter.prepareDateField(lastAvailabilityPingField); + fields.add(lastAvailabilityPingField);
if (!isAffinityGroupId) { fields.add(FIELD_AFFINITY_GROUP.getListGridField("100")); @@ -155,6 +159,7 @@ public class AgentDatasource extends RPCDataSource<Agent, AgentCriteria> { record.setAttribute(FIELD_SERVER.propertyName(), from.getServer() == null ? "" : from.getServer().getName()); record.setAttribute(FIELD_SERVER_ID.propertyName(), from.getServer() == null ? "" : from.getServer().getId()); record.setAttribute(FIELD_LAST_AVAILABILITY_REPORT.propertyName(), from.getLastAvailabilityReport()); + record.setAttribute(FIELD_LAST_AVAILABILITY_PING.propertyName(), from.getLastAvailabilityPing()); record.setAttribute(FIELD_AFFINITY_GROUP.propertyName(), from.getAffinityGroup() == null ? "" : from .getAffinityGroup().getName()); record.setAttribute(FIELD_AFFINITY_GROUP_ID.propertyName(), from.getAffinityGroup() == null ? "" : from diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java index cd736aa..132ee74 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDatasourceField.java @@ -46,6 +46,9 @@ public enum AgentDatasourceField {
FIELD_LAST_AVAILABILITY_REPORT("lastAvailabilityReport", CoreGUI.getMessages() .view_adminTopology_agent_lastAvailabilityReport()), + + FIELD_LAST_AVAILABILITY_PING("lastAvailabilityPing", CoreGUI.getMessages() + .view_adminTopology_agent_lastAvailabilityPing()),
FIELD_AGENT_TOKEN("agentToken", CoreGUI.getMessages().view_adminTopology_agentDetail_token()),
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java index b05a751..50210b5 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/AgentDetailView.java @@ -22,6 +22,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.topology; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_ADDRESS; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AFFINITY_GROUP; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_AGENT_TOKEN; +import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_PING; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_LAST_AVAILABILITY_REPORT; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_NAME; import static org.rhq.enterprise.gui.coregui.client.admin.topology.AgentDatasourceField.FIELD_PORT; @@ -177,11 +178,17 @@ public class AgentDetailView extends LocatableVLayout { final StaticTextItem tokenItem = new StaticTextItem(FIELD_AGENT_TOKEN.propertyName(), FIELD_AGENT_TOKEN.title()); tokenItem.setValue(agent.getAgentToken());
- StaticTextItem lastAvailabilityItem = new StaticTextItem(FIELD_LAST_AVAILABILITY_REPORT.propertyName(), + StaticTextItem lastAvailabilityReportItem = new StaticTextItem(FIELD_LAST_AVAILABILITY_REPORT.propertyName(), FIELD_LAST_AVAILABILITY_REPORT.title()); String lastReport = agent.getLastAvailabilityReport() == null ? "unknown" : TimestampCellFormatter.format( Long.valueOf(agent.getLastAvailabilityReport()), TimestampCellFormatter.DATE_TIME_FORMAT_LONG); - lastAvailabilityItem.setValue(lastReport); + lastAvailabilityReportItem.setValue(lastReport); + + StaticTextItem lastAvailabilityPingItem = new StaticTextItem(FIELD_LAST_AVAILABILITY_PING.propertyName(), + FIELD_LAST_AVAILABILITY_PING.title()); + String lastPing = agent.getLastAvailabilityPing() == null ? "unknown" : TimestampCellFormatter.format( + Long.valueOf(agent.getLastAvailabilityPing()), TimestampCellFormatter.DATE_TIME_FORMAT_LONG); + lastAvailabilityPingItem.setValue(lastPing);
// make clickable link for affinity group StaticTextItem affinityGroupItem = new StaticTextItem(FIELD_AFFINITY_GROUP.propertyName(), @@ -206,8 +213,8 @@ public class AgentDetailView extends LocatableVLayout { } currentServerItem.setValue(serverValue);
- form.setItems(nameItem, addressItem, remoteEndpointItem, portItem, tokenItem, lastAvailabilityItem, - affinityGroupItem, currentServerItem); + form.setItems(nameItem, addressItem, remoteEndpointItem, portItem, tokenItem, lastAvailabilityReportItem, + lastAvailabilityPingItem, affinityGroupItem, currentServerItem);
SectionStackSection section = new SectionStackSection(MSG.common_title_details()); section.setExpanded(true); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java index ff1addc..478207e 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/inventory/ResourceResourceAgentView.java @@ -34,9 +34,12 @@ import org.rhq.core.domain.resource.Agent; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.ImageManager; import org.rhq.enterprise.gui.coregui.client.RefreshableView; +import org.rhq.enterprise.gui.coregui.client.admin.topology.AgentTableView; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; +import org.rhq.enterprise.gui.coregui.client.util.StringUtility; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableDynamicForm; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; +import org.rhq.enterprise.gui.coregui.client.util.selenium.SeleniumUtility;
/** * The content pane for the Resource Inventory>Agent subtab. @@ -52,7 +55,9 @@ public class ResourceResourceAgentView extends LocatableVLayout implements Refre private StaticTextItem portValue; private FormItemIcon agentStatusIcon; private StaticTextItem lastAvailReportValue; + private StaticTextItem lastAvailPingValue; private StaticTextItem endpointValue; + private StaticTextItem topologyViewItem;
private boolean loading = false; // will be true if loadData is currently waiting for responses
@@ -116,11 +121,21 @@ public class ResourceResourceAgentView extends LocatableVLayout implements Refre lastAvailReportValue = new StaticTextItem(lastAvailReport, MSG.view_inventory_summary_agent_last_title()); lastAvailReportValue.setWrapTitle(false); formItems.add(lastAvailReportValue); + + // Last Received Avail ping + lastAvailPingValue = new StaticTextItem("last-avail-ping", MSG.view_adminTopology_agent_lastAvailabilityPing()); + lastAvailPingValue.setWrapTitle(false); + formItems.add(lastAvailPingValue);
// Full Endpoint String fullEndpoint = "full-endpoint"; endpointValue = new StaticTextItem(fullEndpoint, MSG.view_inventory_summary_agent_fullEnpoint()); formItems.add(endpointValue); + + // link to agent topology view + String topologyView = "topology-view"; + topologyViewItem = new StaticTextItem("topology-view", MSG.view_admin_topology()); + formItems.add(topologyViewItem);
return formItems; } @@ -170,20 +185,28 @@ public class ResourceResourceAgentView extends LocatableVLayout implements Refre form.markForRedraw(); } }); - nameValue.setValue(agent.getName()); addressValue.setValue(agent.getAddress()); portValue.setValue(agent.getPort()); - Long lastAvail = agent.getLastAvailabilityReport(); - lastAvailReportValue.setValue((null != lastAvail) ? new Date(lastAvail) : MSG.common_val_none()); + Long lastAvailReport = agent.getLastAvailabilityReport(); + lastAvailReportValue.setValue((null != lastAvailReport) ? new Date(lastAvailReport) : MSG.common_val_none()); + Long lastAvailPing = agent.getLastAvailabilityPing(); + lastAvailPingValue.setValue((null != lastAvailPing) ? new Date(lastAvailPing) : MSG.common_val_none()); String remoteEndpoint = agent.getRemoteEndpoint(); if (remoteEndpoint != null) { // some browsers (firefox in particular) won't wrap unless you put breaks in the string + // (EDIT: in FF 16 the wrapping works even without a space, so this could be possibly ommited) remoteEndpoint = remoteEndpoint.replaceAll("&", " &"); } else { remoteEndpoint = MSG.view_inventory_summary_agent_fullEnpoint_err1(); } endpointValue.setValue(remoteEndpoint); + + // make clickable link for agent topology view + String detailsUrl = "#" + AgentTableView.VIEW_PATH + "/" + agent.getId(); + String formattedValue = StringUtility.escapeHtml(MSG.common_label_link()); + String topologyViewItemText = SeleniumUtility.getLocatableHref(detailsUrl, formattedValue, null); + topologyViewItem.setValue(topologyViewItemText);
form.markForRedraw(); } diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties index 2068272..4c29ae3 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties @@ -551,6 +551,7 @@ view_adminTopology_agent_agentBindAddress = Agent Bind Address view_adminTopology_agent_agentBindPort = Agent Bind Port view_adminTopology_agent_agentName = Agent Name view_adminTopology_agent_connectedServer = Connected Server +view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping view_adminTopology_agent_lastAvailabilityReport = Last Availability Report view_adminTopology_agents = Agents view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number does not correspond to the number of currently connected agents. diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties index 004a414..9fa7b83 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties @@ -517,6 +517,7 @@ view_adminTopology_affinityGroups = AffinitÀtsgruppen ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server +##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report view_adminTopology_agents = Agenten ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties index 411fb71..404736b 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties @@ -549,6 +549,7 @@ view_adminTopology_affinityGroups = ã¢ãã£ããã£ã°ã«ãŒã ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server +##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report view_adminTopology_agents = ãšãŒãžã§ã³ã ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties index 29b0ba7..f358bc7 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties @@ -455,9 +455,95 @@ view_adminTemplates_prompt_disabledMetricTemplates = ìŽ ìì ì íì ëíŽ view_adminTemplates_prompt_enabledMetricTemplates = ìŽ ìì ì íì ëíŽ êž°ë³žì ìŒë¡ íì±íë íµê³ ìŒì ì view_adminTemplates_servers = ìë² view_adminTopology_affinityGroups = ì ížë 귞룹 +##view_adminTopology_affinityGroups_agentCount = Agent Count +##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group +##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +##view_adminTopology_affinityGroups_agetnMembers = Agent Members +##view_adminTopology_affinityGroups_createNew = Create New +##view_adminTopology_affinityGroups_details = Affinity Group Details +##view_adminTopology_affinityGroups_removeSelected = Remove Selected +##view_adminTopology_affinityGroups_serverCount = Server Count +##view_adminTopology_affinityGroups_serverMembers = Server Members +##view_adminTopology_agentDetail_address = Address +##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +##view_adminTopology_agentDetail_currentServer = Current Server +##view_adminTopology_agentDetail_token = Token +##view_adminTopology_agent_agentBindAddress = Agent Bind Address +##view_adminTopology_agent_agentBindPort = Agent Bind Port +##view_adminTopology_agent_agentName = Agent Name +##view_adminTopology_agent_connectedServer = Connected Server +##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping +##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report view_adminTopology_agents = ììŽì íž +##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. +##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. +##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. +##view_adminTopology_message_agroupRemovingAgentsFail = Unable to remove agents from the affinity group with id {0}. +##view_adminTopology_message_agroupRemovingServersFail = Unable to remove servers from the affinity group with id {0}. +##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. +##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. +##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. +##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. +##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. +##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). +##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. +##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. +##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. +##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. +##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. +##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. +##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. +##view_adminTopology_message_order = Order +##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. +##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? +##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? +##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). +##view_adminTopology_message_removeServerConfirm = Do you really want to remove servers {0}? +##view_adminTopology_message_removeServerFail = Unable to remove {0} server(s). +##view_adminTopology_message_removedAGroups = Removed {0} affinity group(s). +##view_adminTopology_message_removedAllPEvent = All partition events have been purged. +##view_adminTopology_message_removedAllPEventFail = Unable to purge all partition events. +##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). +##view_adminTopology_message_removedServer = Removed {0} server(s). +##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. +##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. +##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. +##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? +##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. view_adminTopology_partitionEvents = ìŽë²€íž ë²ì£Œ +##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +##view_adminTopology_partitionEventsDetail_eventDetails = Event Details +##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +##view_adminTopology_partitionEventsDetail_eventType = Event Type +##view_adminTopology_partitionEvents_details = Details +##view_adminTopology_partitionEvents_detailsFilter = Details Filter +##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter +##view_adminTopology_partitionEvents_execTime = Execution Time +##view_adminTopology_partitionEvents_executionStatus = Execution Status +##view_adminTopology_partitionEvents_forceRepartition = Force Repartition +##view_adminTopology_partitionEvents_initiatedBy = Initiated By +##view_adminTopology_partitionEvents_purgeAll = Purge All +##view_adminTopology_partitionEvents_type = Type +##view_adminTopology_partitionEvents_typeFilter = Type Filter view_adminTopology_remoteAgentInstall = ì격 ììŽì íž ì€ì¹ +##view_adminTopology_serverDetail_connectedAgents = Connected Agents +##view_adminTopology_serverDetail_installationDate = Installation Date +##view_adminTopology_serverDetail_operationMode = Operation Mode +##view_adminTopology_server_affinityGroup = Affinity Group +##view_adminTopology_server_agentCount = Agent Count +##view_adminTopology_server_endpointAddress = Endpoint Address +##view_adminTopology_server_lastUpdateTime = Last Update Time +##view_adminTopology_server_mode = Mode +##view_adminTopology_server_nonSecurePort = Nonsecure Port +##view_adminTopology_server_removeSelected = Remove Selected +##view_adminTopology_server_securePort = Secure Port +##view_adminTopology_server_setMaintenance = Set Maintenance +##view_adminTopology_server_setNormal = Set Normal view_adminTopology_servers = ìë² view_adminUsersDetails_dataTypeName = ì¬ì©ì view_adminUsers_failCreateUserWithExistingName = êž°ì¡Ž ìŽëŠ [{0}]곌 ì¬ì©ì륌 ë§ë€ì§ 못íìµëë€. ë€ë¥ž ìŽëŠì ì¬ì©íììì€. diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties index 9699756..f5121ae 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties @@ -554,6 +554,7 @@ view_adminTopology_affinityGroups = Grupos de Afinidade ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server +##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report view_adminTopology_agents = Agentes ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index 0d56ebc..d4ec501 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -516,10 +516,97 @@ #view_adminTemplates_servers = Servers #view_adminTemplates_userTemplates = User Templates #view_adminTopology_affinityGroups = Affinity Groups +##view_adminTopology_affinityGroups_agentCount = Agent Count +##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group +##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +##view_adminTopology_affinityGroups_agetnMembers = Agent Members +##view_adminTopology_affinityGroups_createNew = Create New +##view_adminTopology_affinityGroups_details = Affinity Group Details +##view_adminTopology_affinityGroups_removeSelected = Remove Selected +##view_adminTopology_affinityGroups_serverCount = Server Count +##view_adminTopology_affinityGroups_serverMembers = Server Members +##view_adminTopology_agentDetail_address = Address +##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +##view_adminTopology_agentDetail_currentServer = Current Server +##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +##view_adminTopology_agentDetail_token = Token +##view_adminTopology_agent_agentBindAddress = Agent Bind Address +##view_adminTopology_agent_agentBindPort = Agent Bind Port +##view_adminTopology_agent_agentName = Agent Name +##view_adminTopology_agent_connectedServer = Connected Server +##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping +##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report #view_adminTopology_agents = Agents +##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. +##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. +##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. +##view_adminTopology_message_agroupRemovingAgentsFail = Unable to remove agents from the affinity group with id {0}. +##view_adminTopology_message_agroupRemovingServersFail = Unable to remove servers from the affinity group with id {0}. +##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. +##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. +##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. +##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. +##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. +##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). +##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. +##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. +##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. +##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. +##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. +##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. +##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. +##view_adminTopology_message_order = Order +##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. +##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? +##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? +##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). +##view_adminTopology_message_removeServerConfirm = Do you really want to remove servers {0}? +##view_adminTopology_message_removeServerFail = Unable to remove {0} server(s). +##view_adminTopology_message_removedAGroups = Removed {0} affinity group(s). +##view_adminTopology_message_removedAllPEvent = All partition events have been purged. +##view_adminTopology_message_removedAllPEventFail = Unable to purge all partition events. +##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). +##view_adminTopology_message_removedServer = Removed {0} server(s). +##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. +##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. +##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. +##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? +##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. #view_adminTopology_partitionEvents = Partition Events +##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +##view_adminTopology_partitionEventsDetail_eventDetails = Event Details +##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +##view_adminTopology_partitionEventsDetail_eventType = Event Type +##view_adminTopology_partitionEvents_details = Details +##view_adminTopology_partitionEvents_detailsFilter = Details Filter +##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter +##view_adminTopology_partitionEvents_execTime = Execution Time +##view_adminTopology_partitionEvents_executionStatus = Execution Status +##view_adminTopology_partitionEvents_forceRepartition = Force Repartition +##view_adminTopology_partitionEvents_initiatedBy = Initiated By +##view_adminTopology_partitionEvents_purgeAll = Purge All +##view_adminTopology_partitionEvents_type = Type +##view_adminTopology_partitionEvents_typeFilter = Type Filter #view_adminTopology_remoteAgentInstall = Remote Agent Install #view_adminTopology_servers = Servers +##view_adminTopology_serverDetail_connectedAgents = Connected Agents +##view_adminTopology_serverDetail_installationDate = Installation Date +##view_adminTopology_serverDetail_operationMode = Operation Mode +##view_adminTopology_server_affinityGroup = Affinity Group +##view_adminTopology_server_agentCount = Agent Count +##view_adminTopology_server_endpointAddress = Endpoint Address +##view_adminTopology_server_lastUpdateTime = Last Update Time +##view_adminTopology_server_mode = Mode +##view_adminTopology_server_nonSecurePort = Nonsecure Port +##view_adminTopology_server_removeSelected = Remove Selected +##view_adminTopology_server_securePort = Secure Port +##view_adminTopology_server_setMaintenance = Set Maintenance +##view_adminTopology_server_setNormal = Set Normal #view_adminUsersDetails_dataTypeName = user #view_admin_administration = Administration #view_admin_configuration = Configuration diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties index f6abf6b..40a8517 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties @@ -541,6 +541,7 @@ view_adminTopology_affinityGroups = \u76f8\u5173\u7ec4 ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server +##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report view_adminTopology_agents = \u4ee3\u7406 ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents.
commit 459d29e981d402cc89c6ea5692e611720db9181f Author: John Sanda jsanda@redhat.com Date: Wed Jan 23 22:16:39 2013 -0500
adding support for making overlord available via CDI injection
Lots of tests have boiler plate code to obtain the overlord. With this commit, you can now do,
public class MyTest { @Inject @Overlord private Subject overlord; }
That will inject a cached copy of the overlord eliminating extra calls to the database.
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java index d646b29..067614e 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.List;
import javax.ejb.EJB; +import javax.inject.Inject; import javax.persistence.EntityManager;
import org.joda.time.DateTime; @@ -55,13 +56,13 @@ import org.rhq.core.domain.resource.Agent; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.util.jdbc.JDBCUtil; -import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.drift.DriftServerPluginService; import org.rhq.enterprise.server.measurement.util.MeasurementDataManagerUtility; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.test.TransactionCallback; import org.rhq.enterprise.server.test.TransactionCallbackReturnable; +import org.rhq.enterprise.server.util.Overlord; import org.rhq.enterprise.server.util.ResourceTreeHelper;
/** @@ -93,12 +94,10 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test {
private List<MeasurementSchedule> schedules;
+ @Inject @Overlord private Subject overlord;
@EJB - private SubjectManagerLocal subjectManager; - - @EJB private ResourceManagerLocal resourceManager;
@EJB @@ -115,7 +114,6 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test { prepareCustomServerPluginService(driftServerPluginService); driftServerPluginService.masterConfig.getPluginDirectory().mkdirs();
- overlord = subjectManager.getOverlord(); measurementDefs = new ArrayList<MeasurementDefinition>(); schedules = new ArrayList<MeasurementSchedule>(); createInventory(); @@ -237,9 +235,6 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test { .setParameter("defs", measurementDefs) .executeUpdate(); } -// -// em.createQuery("delete from MeasurementDefinition " + "where dataType = :dataType and " + "name = :name") -// .setParameter("dataType", MEASUREMENT).setParameter("name", DYNAMIC_DEF_NAME).executeUpdate(); }
private void deleteAgent() { @@ -367,17 +362,6 @@ public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test { }); }
- private DateTime hour0() { - DateTime rightNow = now(); - return rightNow.hourOfDay().roundFloorCopy().minusHours( - rightNow.hourOfDay().roundFloorCopy().hourOfDay().get()); - } - - private MeasurementBaseline getBaseline() { - List<MeasurementBaseline> baselines = baselineManager.findBaselinesForResource(overlord, resource.getId()); - return baselines.get(0); - } - private MeasurementBaseline baseline(MeasurementSchedule schedule, double mean, double max, double min) { MeasurementBaseline baseline = new MeasurementBaseline(); baseline.setSchedule(schedule); diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index b1b3aaf..e4dbc4b 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -40,6 +40,7 @@ import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePaths; import org.jboss.shrinkwrap.api.Filters; import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.ByteArrayAsset; import org.jboss.shrinkwrap.api.asset.ClassAsset; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.exporter.ZipExporter; @@ -121,7 +122,8 @@ public abstract class AbstractEJB3Test extends Arquillian { testClassesJar.addAsResource("test-ldap.properties"); testClassesJar.addAsResource("test-scheduler.properties"); testClassesJar - .addAsResource("org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml"); + .addAsResource( + "org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v1.xml"); testClassesJar .addAsResource("org/rhq/enterprise/server/configuration/metadata/configuration_metadata_manager_bean_test_v2.xml"); testClassesJar.addAsResource("org/rhq/enterprise/server/discovery/DiscoveryBossBeanTest.xml"); @@ -319,6 +321,8 @@ public abstract class AbstractEJB3Test extends Arquillian { testEar.add(new ClassAsset(StrippedDownStartupBeanPreparation.class), ArchivePaths .create("/rhq-enterprise-server-ejb3.jar/org/rhq/enterprise/server/test/" + "StrippedDownStartupBeanPreparation.class")); + testEar.addAsManifestResource(new ByteArrayAsset("<beans/>".getBytes()), + ArchivePaths.create("beans.xml"));
// add the test classes to the deployment testEar.addAsLibrary(testClassesJar); diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java new file mode 100644 index 0000000..b915b10 --- /dev/null +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/Overlord.java @@ -0,0 +1,44 @@ +/* + * + * * RHQ Management Platform + * * Copyright (C) 2005-2012 Red Hat, Inc. + * * All rights reserved. + * * + * * This program is free software; you can redistribute it and/or modify + * * it under the terms of the GNU General Public License, version 2, as + * * published by the Free Software Foundation, and/or the GNU Lesser + * * General Public License, version 2.1, also as published by the Free + * * Software Foundation. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License and the GNU Lesser General Public License + * * for more details. + * * + * * You should have received a copy of the GNU General Public License + * * and the GNU Lesser General Public License along with this program; + * * if not, write to the Free Software Foundation, Inc., + * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +package org.rhq.enterprise.server.util; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.inject.Qualifier; + +/** + * @author John Sanda + */ +@Qualifier +@Retention(RUNTIME) +@Target({FIELD, METHOD}) +public @interface Overlord { +} diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java new file mode 100644 index 0000000..1c25ec8 --- /dev/null +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/util/OverlordProducer.java @@ -0,0 +1,57 @@ +/* + * + * * RHQ Management Platform + * * Copyright (C) 2005-2012 Red Hat, Inc. + * * All rights reserved. + * * + * * This program is free software; you can redistribute it and/or modify + * * it under the terms of the GNU General Public License, version 2, as + * * published by the Free Software Foundation, and/or the GNU Lesser + * * General Public License, version 2.1, also as published by the Free + * * Software Foundation. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License and the GNU Lesser General Public License + * * for more details. + * * + * * You should have received a copy of the GNU General Public License + * * and the GNU Lesser General Public License along with this program; + * * if not, write to the Free Software Foundation, Inc., + * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +package org.rhq.enterprise.server.util; + +import javax.annotation.PostConstruct; +import javax.ejb.EJB; +import javax.ejb.Singleton; +import javax.enterprise.inject.Produces; + +import org.rhq.core.domain.auth.Subject; +import org.rhq.enterprise.server.auth.SubjectManagerLocal; + +/** + * @author John Sanda + */ +@Singleton +public class OverlordProducer { + + @EJB + private SubjectManagerLocal subjectManager; + + private Subject overlord; + + @PostConstruct + public void initOverlord() { + overlord = subjectManager.getOverlord(); + } + + @Produces @Overlord + public Subject getOverlord() { + return overlord; + } + +} diff --git a/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml b/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml index b32c647..72f8bdc 100644 --- a/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml +++ b/modules/enterprise/server/itests-2/src/test/resources/arquillian.xml @@ -19,6 +19,13 @@ <property name="includes">org.rhq.*</property> </extension>
+ <!-- + Uncomment this if you want to inspect the deployed archive. Useful for debugging. + --> + <!--<engine>--> + <!--<property name="deploymentExportPath">target/</property>--> + <!--</engine>--> + <container qualifier="RHQAS7" default="true">
commit 7f8e3717c15fca3d121387d0969a4ca454eea44a Author: John Sanda jsanda@redhat.com Date: Wed Jan 23 21:23:41 2013 -0500
initial commit for MeasurementOOBManagerBeanTest
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java new file mode 100644 index 0000000..d646b29 --- /dev/null +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBeanTest.java @@ -0,0 +1,417 @@ +/* + * + * * RHQ Management Platform + * * Copyright (C) 2005-2012 Red Hat, Inc. + * * All rights reserved. + * * + * * This program is free software; you can redistribute it and/or modify + * * it under the terms of the GNU General Public License, version 2, as + * * published by the Free Software Foundation, and/or the GNU Lesser + * * General Public License, version 2.1, also as published by the Free + * * Software Foundation. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License and the GNU Lesser General Public License + * * for more details. + * * + * * You should have received a copy of the GNU General Public License + * * and the GNU Lesser General Public License along with this program; + * * if not, write to the Free Software Foundation, Inc., + * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +package org.rhq.enterprise.server.measurement; + +import static java.util.Arrays.asList; +import static org.joda.time.DateTime.now; +import static org.rhq.core.domain.measurement.DataType.MEASUREMENT; +import static org.rhq.core.domain.measurement.NumericType.DYNAMIC; +import static org.rhq.core.domain.resource.ResourceCategory.SERVER; +import static org.rhq.test.AssertUtils.assertCollectionEqualsNoOrder; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import javax.ejb.EJB; +import javax.persistence.EntityManager; + +import org.joda.time.DateTime; +import org.testng.annotations.Test; + +import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.criteria.ResourceCriteria; +import org.rhq.core.domain.measurement.MeasurementBaseline; +import org.rhq.core.domain.measurement.MeasurementDefinition; +import org.rhq.core.domain.measurement.MeasurementOOB; +import org.rhq.core.domain.measurement.MeasurementSchedule; +import org.rhq.core.domain.resource.Agent; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.util.jdbc.JDBCUtil; +import org.rhq.enterprise.server.auth.SubjectManagerLocal; +import org.rhq.enterprise.server.drift.DriftServerPluginService; +import org.rhq.enterprise.server.measurement.util.MeasurementDataManagerUtility; +import org.rhq.enterprise.server.resource.ResourceManagerLocal; +import org.rhq.enterprise.server.test.AbstractEJB3Test; +import org.rhq.enterprise.server.test.TransactionCallback; +import org.rhq.enterprise.server.test.TransactionCallbackReturnable; +import org.rhq.enterprise.server.util.ResourceTreeHelper; + +/** + * @author John Sanda + */ +public class MeasurementOOBManagerBeanTest extends AbstractEJB3Test { + + private final String RESOURCE_TYPE = getClass().getName() + "_TYPE"; + + private final String PLUGIN = getClass().getName() + "_PLUGIN"; + + private final String AGENT_NAME = getClass().getName() + "_AGENT"; + + private final String DYNAMIC_DEF_NAME = getClass().getName() + "_DYNAMIC"; + + private final String RESOURCE_KEY = getClass().getName() + "_RESOURCE_KEY"; + + private final String RESOURCE_NAME = getClass().getName() + "_NAME"; + + private final String RESOURCE_UUID = getClass().getSimpleName() + "_UUID"; + + private ResourceType resourceType; + + private Agent agent; + + private Resource resource; + + private List<MeasurementDefinition> measurementDefs; + + private List<MeasurementSchedule> schedules; + + private Subject overlord; + + @EJB + private SubjectManagerLocal subjectManager; + + @EJB + private ResourceManagerLocal resourceManager; + + @EJB + private MeasurementOOBManagerLocal oobManager; + + @EJB + private MeasurementBaselineManagerLocal baselineManager; + + @Override + protected void beforeMethod() throws Exception { + // MeasurementDataManagerUtility looks up config settings from SystemManagerBean. + // SystemManagerBean.getDriftServerPluginManager method requires drift server plugin. + DriftServerPluginService driftServerPluginService = new DriftServerPluginService(); + prepareCustomServerPluginService(driftServerPluginService); + driftServerPluginService.masterConfig.getPluginDirectory().mkdirs(); + + overlord = subjectManager.getOverlord(); + measurementDefs = new ArrayList<MeasurementDefinition>(); + schedules = new ArrayList<MeasurementSchedule>(); + createInventory(); + } + + @Override + protected void afterMethod() throws Exception { + purgeDB(); + } + + /** + * Verifies that OOBs are calculated when there are both upper and lower bound + * violations. It also verifies that no OOB is generated a schedule whose values stay + * in bounds. + */ + @Test + public void calculateOOBs() { + final MeasurementSchedule schedule1 = createSchedule(); + final MeasurementSchedule schedule2 = createSchedule(); + MeasurementSchedule schedule3 = createSchedule(); + + DateTime currentHour = now().hourOfDay().roundFloorCopy(); + final DateTime lastHour = currentHour.minusHours(1); + + insertBaselines(asList( + baseline(schedule1, 4.34, 5.2, 3.9), + baseline(schedule2, 7.43, 7.49, 7.38), + baseline(schedule3, 3.2, 3.6, 2.95) + )); + + insert1HourData(asList( + // schedule1 should be out of bounds on the lower bound + new AggregateTestData(lastHour.getMillis(), schedule1.getId(), 3.8, 4.6, 2.11), + // schedule2 should be out of bounds on the upper bound + new AggregateTestData(lastHour.getMillis(), schedule2.getId(), 9.492, 9.53, 9.481), + // schedule3 should be in bounds + new AggregateTestData(lastHour.getMillis(), schedule3.getId(), 3.15, 3.59, 2.96) + )); + + oobManager.computeOOBsFromLastHour(overlord); + + executeInTransaction(new TransactionCallback() { + @Override + @SuppressWarnings("unchecked") + public void execute() throws Exception { + EntityManager em = getEntityManager(); + List<MeasurementOOB> oobs = em.createQuery("select oob from MeasurementOOB oob").getResultList(); + List<TestMeasurementOOB> actual = new ArrayList<TestMeasurementOOB>(); + for (MeasurementOOB oob : oobs) { + actual.add(new TestMeasurementOOB(oob)); + } + + List<TestMeasurementOOB> expected = asList( + new TestMeasurementOOB(schedule1.getId(), lastHour.getMillis(), 138), + new TestMeasurementOOB(schedule2.getId(), lastHour.getMillis(), 1855) + ); + + assertCollectionEqualsNoOrder(expected, actual, "The OOBs do not match"); + } + }); + } + + private void createInventory() throws Exception { + purgeDB(); + executeInTransaction(false, new TransactionCallback() { + @Override + public void execute() throws Exception { + + resourceType = new ResourceType(RESOURCE_TYPE, PLUGIN, SERVER, null); + em.persist(resourceType); + + agent = new Agent(AGENT_NAME, "localhost", 9999, "", "randomToken"); + em.persist(agent); + + resource = new Resource(RESOURCE_KEY, RESOURCE_NAME, resourceType); + resource.setUuid(RESOURCE_UUID); + resource.setAgent(agent); + + em.persist(resource); + } + }); + } + + private void purgeDB() { + purgeRawData(); + purge1HourData(); + purge6HourData(); + purge24HourData(); + purgeBaselines(); + purgeOOBs(); + + executeInTransaction(false, new TransactionCallback() { + @Override + public void execute() throws Exception { + ResourceCriteria c = new ResourceCriteria(); + c.addFilterInventoryStatus(null); + c.addFilterResourceKey(RESOURCE_KEY); + c.fetchSchedules(true); + List<Resource> r = resourceManager.findResourcesByCriteria(overlord, c); + + // Note that the order of deletes is important due to FK + // constraints. + if (!r.isEmpty()) { + assertTrue("Should be only 1 resource", r.size() == 1); + Resource doomedResource = r.get(0); + deleteMeasurementSchedules(); + deleteResource(doomedResource); + } + deleteAgent(); + deleteDynamicMeasurementDef(); + deleteResourceType(); + } + }); + } + + private void deleteDynamicMeasurementDef() { + if (!measurementDefs.isEmpty()) { + em.createQuery("delete from MeasurementDefinition d where d in :defs") + .setParameter("defs", measurementDefs) + .executeUpdate(); + } +// +// em.createQuery("delete from MeasurementDefinition " + "where dataType = :dataType and " + "name = :name") +// .setParameter("dataType", MEASUREMENT).setParameter("name", DYNAMIC_DEF_NAME).executeUpdate(); + } + + private void deleteAgent() { + em.createQuery("delete from Agent where name = :name").setParameter("name", AGENT_NAME).executeUpdate(); + } + + private void deleteResourceType() { + em.createQuery("delete from ResourceType where name = :name and plugin = :plugin") + .setParameter("name", RESOURCE_TYPE).setParameter("plugin", PLUGIN).executeUpdate(); + } + + private void deleteResource(Resource doomedResource) { + ResourceTreeHelper.deleteResource(em, doomedResource); + em.flush(); + } + + private void deleteMeasurementSchedules() { + for (MeasurementSchedule schedule : schedules) { + em.createQuery("delete from MeasurementSchedule where id = :id").setParameter("id", schedule.getId()) + .executeUpdate(); + } + em.flush(); + } + + public void purgeRawData() { + purgeTables(MeasurementDataManagerUtility.getAllRawTables()); + } + + public void purge1HourData() { + purgeTables("rhq_measurement_data_num_1h"); + } + + public void purge6HourData() { + purgeTables("rhq_measurement_data_num_6h"); + } + + public void purge24HourData() { + purgeTables("rhq_measurement_data_num_1d"); + } + + public void purgeBaselines() { + purgeTables("rhq_measurement_bline"); + } + + public void purgeOOBs() { + purgeTables("rhq_measurement_oob"); + } + + private void purgeTables(String... tables) { + // This method was previous implemented using EntityManager.createNativeQuery + // and called from within a TransactionCallback. It was causing a + // TransactionRequiredException, and I am not clear why. I suspect it is a + // configuration issue in our testing environment, but I haven't figured it out + // yet. For now, raw tables are purges in their own separate JDBC transaction. + // + // jsanda + Connection connection = null; + + try { + connection = getConnection(); + connection.setAutoCommit(false); + for (String table : tables) { + Statement statement = connection.createStatement(); + try { + statement.execute("delete from " + table); + } finally { + JDBCUtil.safeClose(statement); + } + } + connection.commit(); + } catch (SQLException e) { + try { + connection.rollback(); + } catch (SQLException e1) { + throw new RuntimeException("Failed to rollback transaction", e1); + } + throw new RuntimeException("Failed to purge data from " + tables, e); + } finally { + JDBCUtil.safeClose(connection); + } + } + + private void insert1HourData(List<AggregateTestData> data) { + Connection connection = null; + + try { + connection = getConnection(); + connection.setAutoCommit(false); + String sql = "insert into rhq_measurement_data_num_1h(time_stamp, schedule_id, value, minvalue, maxvalue) values(?, ?, ?, ?, ?)"; + PreparedStatement statement = connection.prepareStatement(sql); + + for (AggregateTestData datum : data) { + statement.setLong(1, datum.getTimestamp()); + statement.setInt(2, datum.getScheduleId()); + statement.setDouble(3, datum.getAvg()); + statement.setDouble(4, datum.getMin()); + statement.setDouble(5, datum.getMax()); + + statement.addBatch(); + } + + statement.executeBatch(); + connection.commit(); + } catch (SQLException e) { + try { + connection.rollback(); + } catch (SQLException e1) { + throw new RuntimeException("Failed to rollback transaction", e1); + } + throw new RuntimeException("Failed to insert 1 hour data", e); + } finally { + JDBCUtil.safeClose(connection); + } + } + + private void insertBaselines(final List<MeasurementBaseline> baselines) { + executeInTransaction(false, new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + for (MeasurementBaseline baseline : baselines) { + em.persist(baseline); + } + } + }); + } + + private DateTime hour0() { + DateTime rightNow = now(); + return rightNow.hourOfDay().roundFloorCopy().minusHours( + rightNow.hourOfDay().roundFloorCopy().hourOfDay().get()); + } + + private MeasurementBaseline getBaseline() { + List<MeasurementBaseline> baselines = baselineManager.findBaselinesForResource(overlord, resource.getId()); + return baselines.get(0); + } + + private MeasurementBaseline baseline(MeasurementSchedule schedule, double mean, double max, double min) { + MeasurementBaseline baseline = new MeasurementBaseline(); + baseline.setSchedule(schedule); + baseline.setMean(mean); + baseline.setMax(max); + baseline.setMin(min); + + return baseline; + } + + private MeasurementSchedule createSchedule() { + return executeInTransaction(false, new TransactionCallbackReturnable<MeasurementSchedule>() { + @Override + public MeasurementSchedule execute() throws Exception { + EntityManager em = getEntityManager(); + + MeasurementDefinition definition = new MeasurementDefinition(resourceType, DYNAMIC_DEF_NAME + + measurementDefs.size()); + definition.setDefaultOn(true); + definition.setDataType(MEASUREMENT); + definition.setMeasurementType(DYNAMIC); + em.persist(definition); + + MeasurementSchedule schedule = new MeasurementSchedule(definition, resource); + schedule.setEnabled(true); + resource.addSchedule(schedule); + em.persist(schedule); + + schedules.add(schedule); + measurementDefs.add(definition); + + return schedule; + } + }); + } + +} diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java new file mode 100644 index 0000000..c31c2e1 --- /dev/null +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/TestMeasurementOOB.java @@ -0,0 +1,97 @@ +/* + * + * * RHQ Management Platform + * * Copyright (C) 2005-2012 Red Hat, Inc. + * * All rights reserved. + * * + * * This program is free software; you can redistribute it and/or modify + * * it under the terms of the GNU General Public License, version 2, as + * * published by the Free Software Foundation, and/or the GNU Lesser + * * General Public License, version 2.1, also as published by the Free + * * Software Foundation. + * * + * * This program is distributed in the hope that it will be useful, + * * but WITHOUT ANY WARRANTY; without even the implied warranty of + * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * * GNU General Public License and the GNU Lesser General Public License + * * for more details. + * * + * * You should have received a copy of the GNU General Public License + * * and the GNU Lesser General Public License along with this program; + * * if not, write to the Free Software Foundation, Inc., + * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +package org.rhq.enterprise.server.measurement; + +import org.rhq.core.domain.measurement.MeasurementOOB; + +/** + * This is used for verifying results since the properties in {@link MeasurementOOB} are + * read only making harder to set up expected values. + * +* @author John Sanda +*/ +class TestMeasurementOOB { + // TestMeasurementOOB is used to verify results since MeasurementOOB does not expose + // setters for its properties. + private int scheduleId; + private long timestamp; + private int oobFactor; + + public TestMeasurementOOB(int scheduleId, long timestamp, int oobFactor) { + this.scheduleId = scheduleId; + this.timestamp = timestamp; + this.oobFactor = oobFactor; + } + + public TestMeasurementOOB(MeasurementOOB oob) { + scheduleId = oob.getScheduleId(); + timestamp = oob.getTimestamp(); + oobFactor = oob.getOobFactor(); + } + + public int getScheduleId() { + return scheduleId; + } + + public long getTimestamp() { + return timestamp; + } + + public int getOobFactor() { + return oobFactor; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + TestMeasurementOOB that = (TestMeasurementOOB) o; + + if (oobFactor != that.oobFactor) return false; + if (scheduleId != that.scheduleId) return false; + if (timestamp != that.timestamp) return false; + + return true; + } + + @Override + public int hashCode() { + int result = scheduleId; + result = 31 * result + (int) (timestamp ^ (timestamp >>> 32)); + result = 31 * result + oobFactor; + return result; + } + + @Override + public String toString() { + return "TestMeasurementOOB[" + + "scheduleId=" + scheduleId + + ", timestamp=" + timestamp + + ", oobFactor=" + oobFactor + + "]"; + } +}
commit 5582606714d10299af0657ac355e852a605b30c4 Author: John Mazzitelli mazz@redhat.com Date: Wed Jan 23 16:29:38 2013 -0500
allow perftest plugin to have 6-level hierarchies
diff --git a/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml index 7a34f7e..9985fe6 100644 --- a/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml +++ b/modules/plugins/perftest/src/main/resources/META-INF/rhq-plugin.xml @@ -371,6 +371,29 @@ </service> </server>
+ <server name="server-deep1" class="PerfTestComponent" discovery="PerfTestDiscoveryComponent" description="Test Server Deep1"> + <service name="service-deep2" class="PerfTestComponent" discovery="PerfTestDiscoveryComponent" description="Test Service Deep2"> + <metric property="metric000" defaultOn="true" displayType="summary"/> + <metric property="metric001" defaultOn="true" displayType="summary"/> + <service name="service-deep3" class="PerfTestComponent" discovery="PerfTestDiscoveryComponent" description="Test Service Deep3"> + <metric property="metric000" defaultOn="true" displayType="summary"/> + <metric property="metric001" defaultOn="true" displayType="summary"/> + <service name="service-deep4" class="PerfTestComponent" discovery="PerfTestDiscoveryComponent" description="Test Service Deep4"> + <metric property="metric000" defaultOn="true" displayType="summary"/> + <metric property="metric001" defaultOn="true" displayType="summary"/> + <service name="service-deep5" class="PerfTestComponent" discovery="PerfTestDiscoveryComponent" description="Test Service Deep5"> + <metric property="metric000" defaultOn="true" displayType="summary"/> + <metric property="metric001" defaultOn="true" displayType="summary"/> + <service name="service-deep6" class="PerfTestComponent" discovery="PerfTestDiscoveryComponent" description="Test Service Deep6"> + <metric property="metric000" defaultOn="true" displayType="summary"/> + <metric property="metric001" defaultOn="true" displayType="summary"/> + </service> + </service> + </service> + </service> + </service> + </server> + <server name="server-rogue" class="PerfTestRogueComponent" discovery="PerfTestRogueDiscoveryComponent" diff --git a/modules/plugins/perftest/src/main/resources/configurable-deep.xml b/modules/plugins/perftest/src/main/resources/configurable-deep.xml new file mode 100644 index 0000000..74b94aa --- /dev/null +++ b/modules/plugins/perftest/src/main/resources/configurable-deep.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> + +<scenario xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns="urn:xmlns:jboss.org:rhq-perftest"> + + <!-- + This scenario will create a deep hierarchy. + The following should be passed to the agent: + + -Drhq.perftest.scenario=configurable-deep + -Drhq.perftest.server-deep1-count=1 + -Drhq.perftest.sevice-deep2-count=10 + -Drhq.perftest.sevice-deep3-count=10 + -Drhq.perftest.sevice-deep4-count=10 + -Drhq.perftest.sevice-deep5-count=10 + -Drhq.perftest.sevice-deep6-count=4 + --> + + <resource type="server-deep1"> + <simpleResourceGenerator property="rhq.perftest.server-deep1-count"/> + <simpleNumericMeasurementGenerator/> + </resource> + + <resource type="service-deep2"> + <simpleResourceGenerator property="rhq.perftest.service-deep2-count"/> + <simpleNumericMeasurementGenerator/> + </resource> + + <resource type="service-deep3"> + <simpleResourceGenerator property="rhq.perftest.service-deep3-count"/> + <simpleNumericMeasurementGenerator/> + </resource> + + <resource type="service-deep4"> + <simpleResourceGenerator property="rhq.perftest.service-deep4-count"/> + <simpleNumericMeasurementGenerator/> + </resource> + + <resource type="service-deep5"> + <simpleResourceGenerator property="rhq.perftest.service-deep5-count"/> + <simpleNumericMeasurementGenerator/> + </resource> + + <resource type="service-deep6"> + <simpleResourceGenerator property="rhq.perftest.service-deep6-count"/> + <simpleNumericMeasurementGenerator/> + </resource> + +</scenario>
commit a5fbc0fad49bcabf3b5b880e12f452ff79394aee Author: John Mazzitelli mazz@redhat.com Date: Wed Jan 23 12:52:48 2013 -0500
[BZ 902876] make sure we are really installing in an AS7 instance that is meant to be the RHQ Server.
diff --git a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/CoreJBossASClient.java b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/CoreJBossASClient.java index e75a399..4521b35 100644 --- a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/CoreJBossASClient.java +++ b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/CoreJBossASClient.java @@ -19,9 +19,12 @@ package org.rhq.common.jbossas.client.controller;
import java.io.File; +import java.util.List; +import java.util.Properties;
import org.jboss.as.controller.client.ModelControllerClient; import org.jboss.dmr.ModelNode; +import org.jboss.dmr.Property;
/** * Provides information to some core services. @@ -42,6 +45,36 @@ public class CoreJBossASClient extends JBossASClient { super(client); }
+ /** + * This returns the system properties that are set in the AS JVM. This is not the system properties + * in the JVM of this client object - it is actually the system properties in the remote + * JVM of the AS instance that the client is talking to. + * + * @return the AS JVM's system properties + * @throws Exception + */ + public Properties getSystemProperties() throws Exception { + final String[] address = { CORE_SERVICE, PLATFORM_MBEAN, "type", "runtime" }; + final ModelNode op = createReadAttributeRequest(true, "system-properties", Address.root().add(address)); + final ModelNode results = execute(op); + if (isSuccess(results)) { + // extract the DMR representation into a java Properties object + final Properties sysprops = new Properties(); + final ModelNode node = getResults(results); + final List<Property> propertyList = node.asPropertyList(); + for (Property property : propertyList) { + final String name = property.getName(); + final ModelNode value = property.getValue(); + if (name != null) { + sysprops.put(name, value != null ? value.asString() : ""); + } + } + return sysprops; + } else { + throw new FailureException(results, "Failed to get system properties"); + } + } + public String getOperatingSystem() throws Exception { final String[] address = { CORE_SERVICE, PLATFORM_MBEAN, "type", "operating-system" }; final String osName = getStringAttribute("name", Address.root().add(address)); diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java index 6a489f4..3ece569 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java @@ -983,6 +983,10 @@ public class InstallerServiceImpl implements InstallerService { try { mcc = ModelControllerClient.Factory.create(host, port); client = new CoreJBossASClient(mcc); + Properties sysprops = client.getSystemProperties(); + if (!sysprops.containsKey("rhq.server.database.connection-url")) { + throw new Exception("Not an RHQ Server"); + } asVersion = client.getAppServerVersion(); return asVersion; } catch (Exception e) { @@ -994,7 +998,7 @@ public class InstallerServiceImpl implements InstallerService {
// if the caller didn't give us any fallback props, just immediately fail if (fallbackProps == null) { - throw new Exception("Cannot obtain client connection to the app server", e); + throw new Exception("Cannot obtain client connection to the RHQ app server", e); }
try { @@ -1013,18 +1017,22 @@ public class InstallerServiceImpl implements InstallerService { differentValues = true; } if (!differentValues) { - throw new Exception("Cannot obtain client connection to the app server", e); + throw new Exception("Cannot obtain client connection to the RHQ app server!", e); }
mcc = ModelControllerClient.Factory.create(host, port); client = new CoreJBossASClient(mcc); + Properties sysprops = client.getSystemProperties(); + if (!sysprops.containsKey("rhq.server.database.connection-url")) { + throw new Exception("Not an RHQ Server"); + } asVersion = client.getAppServerVersion(); this.installerConfiguration.setManagementHost(host); this.installerConfiguration.setManagementPort(port); return asVersion; } catch (Exception e2) { // make the cause the very first exception in case it was something other than bad host/port as the problem - throw new Exception("Cannot obtain client connection to the app server!", e); + throw new Exception("Cannot obtain client connection to the RHQ app server!!", e); } finally { safeClose(mcc); } diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ManagementService.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ManagementService.java deleted file mode 100644 index 6b9ef78..0000000 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ManagementService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2005-2012 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -package org.rhq.enterprise.server.installer; - -import org.jboss.as.controller.client.ModelControllerClient; - -/** - * @author John Mazzitelli - */ -public class ManagementService { - - /** - * The caller should call ModelControllerClient.close() when finished with the client. - * - * @return the ModelControllerClient - */ - public static ModelControllerClient getClient() { - try { - return ModelControllerClient.Factory.create("127.0.0.1", 9999); - } catch (Exception e) { - throw new RuntimeException("Cannot obtain client connection to the app server", e); - } - } -}
commit 220a24be203960c888c4a32ada9ba6e1f859d131 Author: Heiko W. Rupp hwr@redhat.com Date: Wed Jan 23 15:42:42 2013 +0100
Forgot this in my last commit wrt the rest-api changes.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/Datapoint.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/Datapoint.java new file mode 100644 index 0000000..a53656e --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/Datapoint.java @@ -0,0 +1,65 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.enterprise.server.rest.domain; + +/** + * A numerical data point keyed by the metric name. + * The resource id needs to be supplied externally. + * @author Heiko W. Rupp + */ +public class Datapoint { + + long timestamp; + String metric; + Double value; + + public Datapoint() { + } + + public Datapoint(long timestamp, String metric, Double value) { + this.timestamp = timestamp; + this.metric = metric; + this.value = value; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public String getMetric() { + return metric; + } + + public void setMetric(String metric) { + this.metric = metric; + } + + public Double getValue() { + return value; + } + + public void setValue(Double value) { + this.value = value; + } +}
commit a1f2af1126e57189a1f8c0ed1accb94acee024af Author: Jirka Kremser jkremser@redhat.com Date: Wed Jan 23 13:34:37 2013 +0100
Improvements in the "Edit Row" popup window for modyfing the configuration: close button added; buttons moved to the toolstrip
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java index 47f9c57..15b8e19 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java @@ -1263,13 +1263,15 @@ public class ConfigurationEditor extends LocatableVLayout { popup.destroy(); } }); - - HLayout buttons = new HLayout(); - buttons.setAlign(Alignment.CENTER); - buttons.setTop(10); - buttons.setMembersMargin(10); - buttons.setMembers(okButton, cancelButton); - vLayout.addMember(buttons); + + ToolStrip buttonBar = new ToolStrip(); + buttonBar.setPadding(5); + buttonBar.setWidth100(); + buttonBar.setMembersMargin(15); + buttonBar.setAlign(Alignment.CENTER); + buttonBar.setMembers(okButton, cancelButton); + + vLayout.addMember(buttonBar);
popup.addItem(vLayout); popup.show(); @@ -1711,11 +1713,13 @@ public class ConfigurationEditor extends LocatableVLayout { childForm.setHeight100(); layout.addMember(childForm);
- LocatableHLayout buttonBar = new LocatableHLayout(layout.extendLocatorId("ButtonBar")); + ToolStrip buttonBar = new ToolStrip(); + buttonBar.setPadding(5); + buttonBar.setWidth100(); + buttonBar.setMembersMargin(15); buttonBar.setAlign(Alignment.CENTER); - buttonBar.setMembersMargin(10); - - final IButton okButton = new LocatableIButton(buttonBar.extendLocatorId("OK"), MSG.common_button_ok()); + + final IButton okButton = new IButton(MSG.common_button_ok()); if (!mapReadOnly) { okButton.disable(); } @@ -1762,8 +1766,7 @@ public class ConfigurationEditor extends LocatableVLayout { buttonBar.addMember(okButton);
if (!mapReadOnly) { - final IButton cancelButton = new LocatableIButton(buttonBar.extendLocatorId("Cancel"), - MSG.common_button_cancel()); + final IButton cancelButton = new IButton(MSG.common_button_cancel()); cancelButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() { public void onClick(ClickEvent clickEvent) { layout.destroy(); @@ -1789,7 +1792,6 @@ public class ConfigurationEditor extends LocatableVLayout { popup.setHeight(height); popup.setIsModal(true); popup.setShowModalMask(true); - popup.setShowCloseButton(false); popup.centerInPage(); return popup; }
commit a37ec5ba8dd6b2188274ed8bfd5df1cb7940ba5c Author: Heiko W. Rupp hwr@redhat.com Date: Wed Jan 23 11:04:42 2013 +0100
Get jar-less plugins going again.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/AgentPluginScanner.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/AgentPluginScanner.java index cbed5c8..cf72625 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/AgentPluginScanner.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/plugin/AgentPluginScanner.java @@ -228,6 +228,18 @@ public class AgentPluginScanner { for (File pluginJar : pluginJars) { String md5 = null;
+ if (pluginJar.getName().endsWith("-rhq-plugin.xml")) { + try { + createPluginJarFromDescriptorFile(pluginJar.getAbsolutePath()); + continue; + } catch (Exception e) { + log.warn("Converting jar-less plugin failed: " + e.getMessage()); + if (e.getCause()!=null) { + log.warn(" caused by " + e.getCause().getMessage()); + } + } + } + Plugin plugin = this.agentPluginsOnFilesystem.get(pluginJar); try { if (plugin != null) { @@ -248,6 +260,9 @@ public class AgentPluginScanner { } } catch (Exception e) { log.warn("Failed to scan agent plugin [" + pluginJar + "] found on filesystem. Skipping. Cause: " + e); + if (e.getCause()!=null) { + log.warn(" caused by " + e.getCause().getMessage()); + } this.agentPluginsOnFilesystem.remove(pluginJar); // act like we never saw it updated.remove(pluginJar); }
commit f0ef3df9b57ce3de5f6a9aac9fabfce9ac7fab94 Author: Heiko W. Rupp hwr@redhat.com Date: Wed Jan 23 11:04:01 2013 +0100
A bit of cleanup. Make sure double resource creation works, allow to submit metrics with metric name instead of schedule id.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java index 409632f..52aeba0 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AbstractRestBean.java @@ -452,7 +452,7 @@ public class AbstractRestBean { return gr; }
- private static class CacheKey { + protected static class CacheKey { private String namespace; private int id;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java index 052230b..e77e8b5 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java @@ -63,7 +63,6 @@ import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; -import org.rhq.enterprise.server.RHQConstants; import org.rhq.enterprise.server.alert.AlertManagerLocal; import org.rhq.enterprise.server.rest.domain.*;
@@ -89,15 +88,12 @@ public class AlertHandlerBean extends AbstractRestBean { @Path("/") @ApiOperation(value = "List all alerts", multiValueResponse = true, responseClass = "List<AlertRest>") public Response listAlerts( - @ApiParam(value = "Page number", defaultValue = "1") @QueryParam("page") int page, - @ApiParam(value = "Limit to priority", allowableValues = "High, Medium, Low, All") @DefaultValue("All") @QueryParam("prio") String prio, - @ApiParam(value = "Should full resources and definitions be sent") @QueryParam("slim") @DefaultValue( - "false") boolean slim, - @ApiParam( - value = "If non-null only send alerts that have fired after this time, time is millisecond since epoch") - @QueryParam("since") Long since, - @ApiParam(value = "Id of a resource to limit search for") @QueryParam("resourceId") Integer resourceId, - @Context Request request, @Context UriInfo uriInfo, @Context HttpHeaders headers) { + @ApiParam(value = "Page number", defaultValue = "1") @QueryParam("page") int page, + @ApiParam(value = "Limit to priority", allowableValues = "High, Medium, Low, All") @DefaultValue("All") @QueryParam("prio") String prio, + @ApiParam(value = "Should full resources and definitions be sent") @QueryParam("slim") @DefaultValue("false") boolean slim, + @ApiParam( value = "If non-null only send alerts that have fired after this time, time is millisecond since epoch") @QueryParam("since") Long since, + @ApiParam(value = "Id of a resource to limit search for") @QueryParam("resourceId") Integer resourceId, + @Context UriInfo uriInfo, @Context HttpHeaders headers) {
AlertCriteria criteria = new AlertCriteria(); @@ -141,6 +137,7 @@ public class AlertHandlerBean extends AbstractRestBean { @ApiOperation("Return a count of alerts in the system depending on criteria") public int countAlerts(@ApiParam(value = "If non-null only send alerts that have fired after this time, time is millisecond since epoch") @QueryParam("since") Long since) { + AlertCriteria criteria = new AlertCriteria(); criteria.setPageControl(PageControl.getUnlimitedInstance()); criteria.fetchAlertDefinition(false); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java index 2f665c2..8271f46 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java @@ -29,8 +29,10 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set;
import javax.ejb.EJB; @@ -78,6 +80,8 @@ import org.rhq.core.domain.measurement.MeasurementDataTrait; import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.measurement.MeasurementSchedule; import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ResourceGroup; import org.rhq.core.util.jdbc.JDBCUtil; import org.rhq.enterprise.server.RHQConstants; @@ -89,6 +93,7 @@ import org.rhq.enterprise.server.measurement.util.MeasurementDataManagerUtility; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal; import org.rhq.enterprise.server.rest.domain.Baseline; +import org.rhq.enterprise.server.rest.domain.Datapoint; import org.rhq.enterprise.server.rest.domain.Link; import org.rhq.enterprise.server.rest.domain.MetricAggregate; import org.rhq.enterprise.server.rest.domain.MetricSchedule; @@ -723,6 +728,55 @@ public class MetricHandlerBean extends AbstractRestBean {
}
+ @POST + @Path("data/raw/{resourceId}") + @Consumes({MediaType.APPLICATION_JSON}) + @ApiOperation(value="Submit a series of (numerical) metric values for a single resource to the server",responseClass = "No response") + public Response postMetricValues2(@PathParam("resourceId") int resourceId, + Collection<Datapoint> points, @Context HttpHeaders headers) { + + MediaType mediaType = headers.getAcceptableMediaTypes().get(0); + Set<MeasurementDataNumeric> data = new HashSet<MeasurementDataNumeric>(points.size()); + for (Datapoint point : points) { + + int scheduleId = findScheduleId(resourceId, point.getMetric() ); + if (scheduleId>0) { + data.add(new MeasurementDataNumeric(point.getTimestamp(), scheduleId,point.getValue())); + } + // TODO signal bad items to the caller? + } + + dataManager.addNumericData(data); + + return Response.noContent().type(mediaType).build(); + } + + private int findScheduleId(int resourceId, String metric) { + CacheKey key = new CacheKey("schedulesForResource",resourceId); + Map<String,Integer> schedulesForResource = (Map<String, Integer>) cache.get(key); + if (schedulesForResource!=null && schedulesForResource.containsKey(metric)) { + return schedulesForResource.get(metric); + } + else { + Resource res = fetchResource(resourceId); + ResourceType resourceType = res.getResourceType(); + int[] definitionIds = new int[resourceType.getMetricDefinitions().size()]; + int i = 0; + for (MeasurementDefinition def : resourceType.getMetricDefinitions()) { + definitionIds[i]=def.getId(); + i++; + } + List<MeasurementSchedule> schedules = scheduleManager.findSchedulesByResourceIdAndDefinitionIds(caller,resourceId,definitionIds); + + schedulesForResource = new HashMap<String, Integer>(schedules.size()); + for (MeasurementSchedule schedule : schedules) { + schedulesForResource.put(schedule.getDefinition().getName(),schedule.getId()); + } + cache.put(key,schedulesForResource); + return schedulesForResource.get(metric); + } + } + @GET @Path("data/{scheduleId}/baseline") @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java index 2f1565b..be28d92 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java @@ -52,7 +52,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo;
-import com.arjuna.ats.internal.jdbc.drivers.modifiers.list; import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.ApiError; import com.wordnik.swagger.annotations.ApiOperation; @@ -528,7 +527,7 @@ public class ResourceHandlerBean extends AbstractRestBean { return links; }
- @ApiOperation(value = "Creata a new platform in the Server. If the platform already exists, this is a no-op." + + @ApiOperation(value = "Create a new platform in the Server. If the platform already exists, this is a no-op." + "The platform internally has a special name so that it will not clash with one that was generated" + "via a normal RHQ agent") @POST @@ -615,7 +614,7 @@ public class ResourceHandlerBean extends AbstractRestBean { @Path("{name}") public Response createResource( @ApiParam("Name of the new resource") @PathParam("name") String name, - @ApiParam("Name of the Resource tpye") StringValue typeValue, + @ApiParam("Name of the Resource type") StringValue typeValue, @ApiParam("Name of the plugin providing the type") @QueryParam("plugin") String plugin, @ApiParam("Id of the future parent to attach this to") @QueryParam("parentId") int parentId, @Context UriInfo uriInfo) { @@ -630,7 +629,7 @@ public class ResourceHandlerBean extends AbstractRestBean { String resourceKey = "res:" + name + ":" + parentId;
- Resource r = resMgr.getResourceByParentAndKey(caller,null,resourceKey,plugin,typeName); + Resource r = resMgr.getResourceByParentAndKey(caller,parent,resourceKey,plugin,typeName); if (r!=null) { // resource exists - return it ResourceWithType rwt = fillRWT(r,uriInfo); diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java index db49514..e8066bc 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java @@ -219,6 +219,55 @@ public class ResourcesTest extends AbstractBase { }
@Test + public void testDoubleChildCreate() throws Exception { + // a resource can be created again and again + + + Response response = + with().body("{"value":"Linux"}") + .header("Content-Type","application/json") + .header("Accept","application/json") + .expect() + .statusCode(201) + .when() + .post("/resource/platform/api-test-dummy"); + + String platformId = response.jsonPath().getString("resourceId"); + + try { + Response child = + with().body("{"value":"CPU"}") // Type of new resource + .header("Content-Type", "application/json") + .header("Accept", "application/json") + .pathParam("name", "test") + .queryParam("plugin", "Platforms") + .queryParam("parentId", platformId) + .expect() + .statusCode(201) + .log().ifError() + .when().post("/resource/{name}").andReturn(); + + child = + with().body("{"value":"CPU"}") // Type of new resource + .header("Content-Type", "application/json") + .header("Accept", "application/json") + .pathParam("name", "test") + .queryParam("plugin", "Platforms") + .queryParam("parentId", platformId) + .expect() + .statusCode(201) + .log().ifError() + .when().post("/resource/{name}").andReturn(); + } + finally { + given().pathParam("id",platformId) + .expect().statusCode(HttpStatus.SC_NO_CONTENT) + .when().delete("/resource/{id}"); + } + + } + + @Test public void testAlertsForResource() throws Exception { given() .header("Accept","application/json") @@ -251,7 +300,7 @@ public class ResourcesTest extends AbstractBase { }
@Test - public void testUpdateAvailablity() throws Exception { + public void testUpdateAvailability() throws Exception {
Response response = given() .header("Accept", "application/json")
commit 60ebe193739ef5aaccd362d10ddff5c4aefde7c1 Author: Stefan Negrea snegrea@redhat.com Date: Tue Jan 22 17:16:01 2013 -0600
Update the test to take into account the possibility that the TagManager is disabled.
diff --git a/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java b/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java index 75581bb..6e2fcf6 100644 --- a/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java +++ b/modules/enterprise/server/client-api/src/test/java/org/rhq/enterprise/client/test/LocalClientTest.java @@ -114,8 +114,16 @@ public class LocalClientTest extends JMockTest { public void testAllManagersInstantiable() throws Exception { setupFakeJndiLookup();
+ //the list of enabled rhq managers is set at compile time + //so far only the TagManager can be disabled for the purposes of this test + //take this into account when building the expected array for the assertion + HashSet<RhqManager> expected = new HashSet<RhqManager>(Arrays.asList(RhqManager.values())); + if (!RhqManager.TagManager.enabled()) { + expected.remove(RhqManager.TagManager); + } + LocalClient lc = new LocalClient(null); - assertEquals(lc.getScriptingAPI().keySet(), new HashSet<RhqManager>(Arrays.asList(RhqManager.values())), + assertEquals(lc.getScriptingAPI().keySet(), expected, "Scripting API contains different managers than expected."); }
commit edd778f0025db69ffd240ed9bd48a60554db16ae Author: John Mazzitelli mazz@redhat.com Date: Tue Jan 22 13:18:21 2013 -0500
have the installer create a org.rhq logger category at the default level of INFO. allow a user to set it in rhq-server.properties (unforunately, this is another AS7 attribute that does not support expressions so you have to run rhq-installer --reconfig to pick up the change after the initial install)
diff --git a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/LoggingJBossASClient.java b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/LoggingJBossASClient.java new file mode 100644 index 0000000..babe373 --- /dev/null +++ b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/LoggingJBossASClient.java @@ -0,0 +1,96 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2012 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.common.jbossas.client.controller; + +import org.jboss.as.controller.client.ModelControllerClient; +import org.jboss.dmr.ModelNode; + +/** + * Provides management of the logging subsystem. + * + * @author John Mazzitelli + */ +public class LoggingJBossASClient extends JBossASClient { + + public static final String LOGGING = "logging"; + public static final String LOGGER = "logger"; + + public LoggingJBossASClient(ModelControllerClient client) { + super(client); + } + + /** + * Checks to see if there is already a logger with the given name. + * + * @param loggerName the name to check (this is also known as the category name) + * @return true if there is a logger/category with the given name already in existence + */ + public boolean isLogger(String loggerName) throws Exception { + Address addr = Address.root().add(SUBSYSTEM, LOGGING, LOGGER, loggerName); + return null != readResource(addr); + } + + /** + * Returns the level of the given logger. + * + * @param loggerName the name of the logger (this is also known as the category name) + * @return level of the logger + * @throws Exception if the log level could not be obtained (typically because the logger doesn't exist) + */ + public String getLoggerLevel(String loggerName) throws Exception { + Address addr = Address.root().add(SUBSYSTEM, LOGGING, LOGGER, loggerName); + return getStringAttribute("level", addr); + } + + /** + * Sets the logger to the given level. + * If the logger does not exist yet, it will be created. + * + * @param loggerName the logger name (this is also known as the category name) + * @param level the new level of the logger (e.g. DEBUG, INFO, ERROR, etc.) + * @throws Exception + */ + public void setLoggerLevel(String loggerName, String level) throws Exception { + + final Address addr = Address.root().add(SUBSYSTEM, LOGGING, LOGGER, loggerName); + final ModelNode request; + + if (isLogger(loggerName)) { + request = createWriteAttributeRequest("level", level.toUpperCase(), addr); + } else { + final String dmrTemplate = "" // + + "{" // + + ""category" => "%s" " // + + ", "level" => "%s" " // + + ", "use-parent-handlers" => "true" " // + + "}"; + final String dmr = String.format(dmrTemplate, loggerName, level.toUpperCase()); + + request = ModelNode.fromString(dmr); + request.get(OPERATION).set(ADD); + request.get(ADDRESS).set(addr.getAddressNode()); + } + + final ModelNode response = execute(request); + if (!isSuccess(response)) { + throw new FailureException(response); + } + return; + } +} diff --git a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml index b306c3c..620a7f9 100644 --- a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml +++ b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml @@ -466,6 +466,9 @@ rhq.autoinstall.public-endpoint-address= # and should only be changed if you know what you are doing. #############################################################################
+# Enable debug messages from RHQ code +rhq.server.log-level=INFO + # Set this to true to have the server reject agent requests upon startup. rhq.server.maintenance-mode-at-startup=false
diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java index b4a73d9..6a489f4 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java @@ -251,6 +251,9 @@ public class InstallerServiceImpl implements InstallerService { // Set up the transaction manager. ServerInstallUtil.configureTransactionManager(mcc);
+ // Set up the logging subsystem + ServerInstallUtil.configureLogging(mcc, serverProperties); + // create a keystore whose cert has a CN of this server's public endpoint address File keystoreFile = ServerInstallUtil.createKeystore(serverDetails, appServerConfigDir);
@@ -568,8 +571,10 @@ public class InstallerServiceImpl implements InstallerService { if (ServerInstallUtil.isSameDatasourceSecurityDomainExisting(mcc, serverProperties)) { if (ServerInstallUtil.isSameMailServiceExisting(mcc, serverProperties)) { if (ServerInstallUtil.isSameWebConnectorsExisting(mcc, appServerConfigDir, serverProperties)) { - log("Nothing in the configuration changed that requires a reconfig - everything looks OK"); - return true; // nothing to do, return immediately + if (ServerInstallUtil.isSameLoggingExisting(mcc, serverProperties)) { + log("Nothing in the configuration changed that requires a reconfig - everything looks OK"); + return true; // nothing to do, return immediately + } } } } @@ -595,6 +600,9 @@ public class InstallerServiceImpl implements InstallerService { // setup the secure Tomcat web connectors ServerInstallUtil.setupWebConnectors(mcc, appServerConfigDir, serverProperties);
+ // setup the logging level + ServerInstallUtil.configureLogging(mcc, serverProperties); + // now restart - don't just reload, some of our stuff won't restart properly if we just reload coreClient = new CoreJBossASClient(mcc); coreClient.restart(); diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java index 8349336..ca32ef0 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java @@ -52,6 +52,7 @@ import org.rhq.common.jbossas.client.controller.DatasourceJBossASClient; import org.rhq.common.jbossas.client.controller.FailureException; import org.rhq.common.jbossas.client.controller.InfinispanJBossASClient; import org.rhq.common.jbossas.client.controller.JBossASClient; +import org.rhq.common.jbossas.client.controller.LoggingJBossASClient; import org.rhq.common.jbossas.client.controller.MessagingJBossASClient; import org.rhq.common.jbossas.client.controller.SecurityDomainJBossASClient; import org.rhq.common.jbossas.client.controller.SocketBindingJBossASClient; @@ -147,6 +148,22 @@ public class ServerInstallUtil { private static final String RHQ_MGMT_USER = "rhqadmin";
/** + * Configure the logging subsystem. + * @param mcc JBossAS management client + * @param serverProperties the server properties, which includes the default log level to use + * @throws Exception + */ + public static void configureLogging(ModelControllerClient mcc, HashMap<String, String> serverProperties) + throws Exception { + LoggingJBossASClient client = new LoggingJBossASClient(mcc); + + // we want to create our own category + String val = buildExpression(ServerProperties.PROP_LOG_LEVEL, serverProperties, false); // enable when AS7-5321 is fixed + client.setLoggerLevel("org.rhq", val); + LOG.info("Logging category org.rhq set to [" + val + "]"); + } + + /** * Configure the transaction manager. * @param mcc JBossAS management client * @throws Exception @@ -156,6 +173,7 @@ public class ServerInstallUtil {
// we want to bump up the transaction timeout client.setDefaultTransactionTimeout(600); + LOG.info("Default transaction timeout set to 600 seconds."); }
/** @@ -168,6 +186,7 @@ public class ServerInstallUtil {
// we do not want our RHQ Server to support hot deployments via the scanner client.setAppServerDefaultDeploymentScanEnabled(false); + LOG.info("Deployment scanner turned off."); }
/** @@ -1426,6 +1445,29 @@ public class ServerInstallUtil { }
/** + * This checks to see if the logging settings have the same values as those found in the given properties. + * + * THIS IS ONLY HERE TO SUPPORT INSTALLER --reconfig OPTION WHICH SHOULD + * GO AWAY ONCE AS7 SUPPORTS EXPRESSIONS WHERE WE NEED THEM - JIRA AS7-5321. + * ONCE AS7 DOES THIS, THIS METHOD CAN GO AWAY. + * + * @param mcc the JBossAS management client + * @param serverProperties contains the logging settings + * @return true if the logging settings have the same values + * @throws Exception + */ + public static boolean isSameLoggingExisting(ModelControllerClient mcc, HashMap<String, String> serverProperties) { + try { + LoggingJBossASClient client = new LoggingJBossASClient(mcc); + String currentLevel = client.getLoggerLevel("org.rhq"); + String newLevel = serverProperties.get(ServerProperties.PROP_LOG_LEVEL); + return !isEmpty(currentLevel) && currentLevel.equalsIgnoreCase(newLevel); + } catch (Exception e) { + return false; // assume they aren't the same - this may be due to the category org.rhq just missing + } + } + + /** * This checks to see if the mail service already exists * and has the same settings as those found in the given properties. * diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerProperties.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerProperties.java index f8f297c..a253743 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerProperties.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerProperties.java @@ -112,6 +112,7 @@ public class ServerProperties { public static final String PROP_HIGH_AVAILABILITY_NAME = "rhq.server.high-availability.name"; public static final String PROP_MM_AT_START = "rhq.server.maintenance-mode-at-startup"; public static final String PROP_OPERATION_TIMEOUT = "rhq.server.operation-timeout"; + public static final String PROP_LOG_LEVEL = "rhq.server.log-level";
// this list contains all the properties that are to have boolean values (true | false) public static final Set<String> BOOLEAN_PROPERTIES;
commit 108eb7c9d959ddf9bee65069eae79a50ac28498a Author: Jirka Kremser jkremser@redhat.com Date: Tue Jan 22 18:16:52 2013 +0100
[BZÂ 845363 - Bundle Deployment - Newly created Resource group which contains ~100 resources is not being <discovered> during the destination creation] The Bundle Deployment Wizzard doesn't let the user to create a mixed group or a compatible group with a resource type which can't serve for deployments. The check is done using the ResourceTypeRepository. I18n and l10n added.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java index 871329b..d6c1d07 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deploy/GetDestinationStep.java @@ -18,11 +18,15 @@ */ package org.rhq.enterprise.gui.coregui.client.bundle.deploy;
+import java.util.EnumSet; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.Map; import java.util.Set;
import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.CanvasItem; @@ -43,13 +47,18 @@ import com.smartgwt.client.widgets.layout.VLayout; import org.rhq.core.domain.bundle.BundleDestination; import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration; import org.rhq.core.domain.bundle.ResourceTypeBundleConfiguration.BundleDestinationBaseDirectory; +import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.resource.group.ResourceGroup; +import org.rhq.core.domain.util.collection.ArrayUtils; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.bundle.deploy.selection.SingleCompatibleResourceGroupSelector; import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep; import org.rhq.enterprise.gui.coregui.client.gwt.BundleGWTServiceAsync; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; import org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard.AbstractGroupCreateWizard; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.MetadataType; +import org.rhq.enterprise.gui.coregui.client.inventory.resource.type.ResourceTypeRepository.TypesLoadedCallback; import org.rhq.enterprise.gui.coregui.client.util.FormUtility; import org.rhq.enterprise.gui.coregui.client.util.message.Message; import org.rhq.enterprise.gui.coregui.client.util.message.Message.Severity; @@ -316,6 +325,31 @@ public class GetDestinationStep extends AbstractWizardStep { this.groupSelector = theSelector; }
+ @Override + public boolean createGroup() { + Integer[] ids = memberStep.getSelecterResourceTypeIds(); + if (ids == null || ids.length == 0) { + SC.warn(MSG.view_bundle_deployWizard_createGroup_error_1()); + return false; + } + ResourceTypeRepository typeRepository = ResourceTypeRepository.Cache.getInstance(); + typeRepository.getResourceTypes(ids, EnumSet.of(MetadataType.bundleConfiguration), + new TypesLoadedCallback() { + public void onTypesLoaded(Map<Integer, ResourceType> types) { + Set<ResourceType> typeSet = new HashSet<ResourceType>(types.values()); + if (typeSet.size() != 1) { + SC.warn(MSG.view_bundle_deployWizard_createGroup_error_2()); + } else if (typeSet.iterator().next().getResourceTypeBundleConfiguration() == null) { + SC.warn(MSG.view_bundle_deployWizard_createGroup_error_3()); + } else { + QuickGroupCreateWizard.super.createGroup(); + } + } + }); + return true; + } + + @Override public void groupCreateCallback(final ResourceGroup group) { // note: "group" is essentially a flyweight - it doesn't have much other than ID this.groupSelector.setValue(group.getId()); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java index 65b0a42..268d12b 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/AbstractGroupCreateWizard.java @@ -44,8 +44,8 @@ import org.rhq.enterprise.gui.coregui.client.util.message.Message; * @author John Mazzitelli */ public abstract class AbstractGroupCreateWizard extends AbstractWizard { - private GroupCreateStep createStep; - private GroupMembersStep memberStep; + protected GroupCreateStep createStep; + protected GroupMembersStep memberStep;
public AbstractGroupCreateWizard() { List<WizardStep> steps = new ArrayList<WizardStep>(); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java index 6b4e85d..7345cd4 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/wizard/GroupMembersStep.java @@ -22,10 +22,14 @@ */ package org.rhq.enterprise.gui.coregui.client.inventory.groups.wizard;
+import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.TYPE_ID; + import java.util.Set;
import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.grid.ListGridRecord;
+import org.rhq.core.domain.resource.Resource; import org.rhq.enterprise.gui.coregui.client.components.wizard.AbstractWizardStep; import org.rhq.enterprise.gui.coregui.client.inventory.resource.selection.ResourceSelector; import org.rhq.enterprise.gui.coregui.client.util.selenium.Locatable; @@ -71,4 +75,14 @@ public class GroupMembersStep extends AbstractWizardStep { } return selection; } + + public Integer[] getSelecterResourceTypeIds() { + ListGridRecord[] selectedRecords = selector.getSelectedRecords(); + Integer[] selection = new Integer[selectedRecords.length]; + int i = 0; + for (ListGridRecord record : selectedRecords) { + selection[i++] = record.getAttributeAsInt(TYPE_ID.propertyName()); + } + return selection; + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java index ba73f82..8ec2ece 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java @@ -37,6 +37,8 @@ public enum ResourceDataSourceField { KEY("resourceKey", CoreGUI.getMessages().dataSource_resources_field_key()),
TYPE("resourceType.name", CoreGUI.getMessages().common_title_type()), + + TYPE_ID("resourceType.id", CoreGUI.getMessages().common_title_type() + CoreGUI.getMessages().common_title_id()),
PLUGIN("pluginName", CoreGUI.getMessages().common_title_plugin()),
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java index 383602b..6bd323e 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java @@ -30,6 +30,7 @@ import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceD import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.NAME; import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.PLUGIN; import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.TYPE; +import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.TYPE_ID; import static org.rhq.enterprise.gui.coregui.client.inventory.resource.ResourceDataSourceField.VERSION;
import java.util.HashSet; @@ -218,6 +219,7 @@ public class ResourceDatasource extends RPCDataSource<Resource, ResourceCriteria ResourceType type = types.get(typeId); if (type != null) { record.setAttribute(TYPE.propertyName(), type.getName()); + record.setAttribute(TYPE_ID.propertyName(), type.getId()); }
// To avoid a lot of unnecessary String construction, be lazy about building ancestry hover text. diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java index 1574d17..7141b47 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/type/ResourceTypeRepository.java @@ -68,7 +68,7 @@ public class ResourceTypeRepository { */ public enum MetadataType { children, operations, measurements, content, events, pluginConfigurationDefinition, resourceConfigurationDefinition, subCategory, parentTypes, processScans, productVersions, driftDefinitionTemplates( - true); + true), bundleConfiguration;
private boolean isFetchAlways;
@@ -293,6 +293,10 @@ public class ResourceTypeRepository { case driftDefinitionTemplates: criteria.fetchDriftDefinitionTemplates(true); break; + case bundleConfiguration: + criteria.fetchBundleConfiguration(true); + break; + default: Log.error("Metadata type [" + metadataType.name() + "] not incorporated into ResourceType criteria."); } @@ -411,6 +415,9 @@ public class ResourceTypeRepository { case driftDefinitionTemplates: cachedType.setDriftDefinitionTemplates(type.getDriftDefinitionTemplates()); break; + case bundleConfiguration: + cachedType.setResourceTypeBundleConfiguration(type.getResourceTypeBundleConfiguration()); + break; default: Log.error("ERROR: metadataType " + metadataType.name() + " not merged into cached ResourceType."); diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties index 11f505d..2068272 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties @@ -1119,6 +1119,9 @@ view_bundle_createWizard_youMustChooseOne = You must choose one option in order view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted. However, this will not remove any content from remote machines. view_bundle_deploy = Deploy view_bundle_deployDir = Deploy Directory +view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms view_bundle_deployWizard_deploying = Deploying... view_bundle_deployWizard_deploymentCreated = Created Deployment... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties index 4b815c2..908df75 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties @@ -1138,6 +1138,9 @@ view_bundle_createWizard_youMustChooseOne = MusÃte zvolit jednu moÅŸnost, abyst view_bundle_deleteConfirm = Jste si jisti, ÅŸe chcete smazat tento balÃk? VÅ¡echny verze, cÃle a nasazenà pro tento balÃk budou také smazány. NicménÄ uÅŸ nasazenÃœ obsah nebude ze vzdálenÃœch stanic smazán. view_bundle_deploy = Nasadit view_bundle_deployDir = Nasadit adresáŠ+view_bundle_deployWizard_createGroup_error_1 = Skupina nebyla vytvoÅena. Skupina nemsmà bÃœt prázdná. +view_bundle_deployWizard_createGroup_error_2 = Skupina nebyla vytvoÅena. VÃœsledná skupina musà bÃœt kompatibilnà (prvky stejného typu). +view_bundle_deployWizard_createGroup_error_3 = Skupina nebyla vytvoÅena. Typ zdroje vÃœsledné skupiny nepodporuje nasazovánà balÃků. view_bundle_deployWizard_deployStep = Nasadit balÃk na cÃlové stanice view_bundle_deployWizard_deploying = NasazovánÃ... view_bundle_deployWizard_deploymentCreated = VytvoÅit nasazenÃ... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties index 2e3523d..004a414 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties @@ -1016,6 +1016,9 @@ view_bundle_createWizard_youMustChooseOne = Sie mÃŒssen eine Option auswÀhlen, ##view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted. However, this will not remove any content from remote machines. view_bundle_deploy = Deploy view_bundle_deployDir = Deploy-Verzeichnis +##view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +##view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +##view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. view_bundle_deployWizard_deployStep = Bundle auf die Zielplattformen deployen view_bundle_deployWizard_deploying = Deploying... view_bundle_deployWizard_deploymentCreated = Deployment angelegt... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties index b6fda76..411fb71 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties @@ -1114,6 +1114,9 @@ view_bundle_createWizard_youMustChooseOne = ãã³ãã«ãäœæããããã® view_bundle_deleteConfirm = ãã®ãã³ãã«ãåé€ããŠãããããã§ãã? ãã®ãã³ãã«ã®ãã¹ãŠã®ããŒãžã§ã³ãå®å ããããã€ãåé€ãããŸãã view_bundle_deploy = ããã〠view_bundle_deployDir = ãããã€ãã£ã¬ã¯ã㪠+##view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +##view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +##view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. view_bundle_deployWizard_deployStep = å®å ãã©ãããã©ãŒã ãžã®ãã³ãã«ã®ããã〠view_bundle_deployWizard_deploying = ãããã€äž... view_bundle_deployWizard_deploymentCreated = äœæããããããã€ã¡ã³ã... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties index 106d549..29b0ba7 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties @@ -878,6 +878,9 @@ view_bundle_createWizard_urlOption = URL view_bundle_createWizard_windowTitle = ë²ë€ ìì± ë§ë²ì¬ view_bundle_deploy = ë°°í¬ view_bundle_deployDir = ë°°í¬ ëë í 늬 +##view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +##view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +##view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. view_bundle_deployWizard_deployStep = ëì íë«íŒì ë²ë€ ë°°í¬ view_bundle_deployWizard_deploying = ë°°í¬ ì€... view_bundle_deployWizard_deploymentCreated = ë°°í¬ ìì±ì€... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties index 5b0c05a..9699756 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties @@ -1125,6 +1125,9 @@ view_bundle_createWizard_youMustChooseOne = \u00C9 necess\u00E1rio escolher uma view_bundle_deleteConfirm = Tem certeza que deseja excluir este bundle? Todas as vers\u00F5es, destina\u00E7\u00F5es e implanta\u00E7\u00F5es para este bundle ser\u00E3o exclu\u00EDdas. view_bundle_deploy = Deploy view_bundle_deployDir = Diret\u00F3rio de Deploy +##view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +##view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +##view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. view_bundle_deployWizard_deployStep = Implantar o Bundle nas Plataformas de Destino view_bundle_deployWizard_deploying = Implantando... view_bundle_deployWizard_deploymentCreated = Implanta\u00E7\u00E3o Criada... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index 259b1c2..0d56ebc 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -1007,6 +1007,9 @@ #view_bundle_deleteConfirm = Are you sure you want to delete this bundle? All versions, destinations and deployments for this bundle will also be deleted. However, this will not remove any content from remote machines. #view_bundle_deploy = Deploy #view_bundle_deployDir = Deploy Directory +##view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +##view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +##view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. #view_bundle_deployWizard_deployStep = Deploy Bundle to Destination Platforms #view_bundle_deployWizard_deploying = Deploying... #view_bundle_deployWizard_deploymentCreated = Created Deployment... diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties index 6ccb0e3..f6abf6b 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties @@ -1109,6 +1109,9 @@ view_bundle_createWizard_youMustChooseOne = \u4e3a\u4e86\u521b\u5efabundle\u4f60 view_bundle_deleteConfirm = \u4f60\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2abundle? \u8fd9\u4e2abundle\u6240\u6709\u7684\u7248\u672c, \u76ee\u7684\u5730\u548c\u90e8\u7f72\u5c06\u88ab\u5220\u9664. view_bundle_deploy = \u53d1\u5e03 view_bundle_deployDir = \u53d1\u5e03\u76ee\u5f55 +##view_bundle_deployWizard_createGroup_error_1 = The group was not created. Group for deployment cannot be empty. +##view_bundle_deployWizard_createGroup_error_2 = The group was not created. Resulting group must be compatible (members of the same type). +##view_bundle_deployWizard_createGroup_error_3 = The group was not created. The resource type of the resulting group does not support deployments. view_bundle_deployWizard_deployStep = \u53d1\u5e03Bundle\u5230\u76ee\u7684\u5e73\u53f0 view_bundle_deployWizard_deploying = \u53d1\u5e03\u4e2d... view_bundle_deployWizard_deploymentCreated = \u521b\u5efa\u90e8\u7f72...
commit 885f2a5574eb66dcd41140ffe6d2a97ea66fb956 Author: John Mazzitelli mazz@redhat.com Date: Mon Jan 21 13:35:35 2013 -0500
we want to bump up the default tx timeout to 10 minutes since that is what we used in older versions of RHQ (the out of box AS7 default is 5)
diff --git a/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/TransactionsJBossASClient.java b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/TransactionsJBossASClient.java new file mode 100644 index 0000000..11fa5f4 --- /dev/null +++ b/modules/common/jboss-as-dmr-client/src/main/java/org/rhq/common/jbossas/client/controller/TransactionsJBossASClient.java @@ -0,0 +1,52 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2012 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.common.jbossas.client.controller; + +import org.jboss.as.controller.client.ModelControllerClient; +import org.jboss.dmr.ModelNode; + +/** + * Provides management of the transactions subsystem. + * + * @author John Mazzitelli + */ +public class TransactionsJBossASClient extends JBossASClient { + + public static final String TRANSACTIONS = "transactions"; + + public TransactionsJBossASClient(ModelControllerClient client) { + super(client); + } + + /** + * Sets the default transaction timeout. + * @param timeoutSecs the new default transaction timeout, in seconds. + * @throws Exception + */ + public void setDefaultTransactionTimeout(int timeoutSecs) throws Exception { + final Address address = Address.root().add(SUBSYSTEM, TRANSACTIONS); + final ModelNode req = createWriteAttributeRequest("default-timeout", String.valueOf(timeoutSecs), address); + final ModelNode response = execute(req); + + if (!isSuccess(response)) { + throw new FailureException(response); + } + return; + } +} diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java index de729cf..b4a73d9 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/InstallerServiceImpl.java @@ -248,6 +248,9 @@ public class InstallerServiceImpl implements InstallerService { // Make sure our deployment scanner is configured as we need it ServerInstallUtil.configureDeploymentScanner(mcc);
+ // Set up the transaction manager. + ServerInstallUtil.configureTransactionManager(mcc); + // create a keystore whose cert has a CN of this server's public endpoint address File keystoreFile = ServerInstallUtil.createKeystore(serverDetails, appServerConfigDir);
diff --git a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java index f7bd3c0..8349336 100644 --- a/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java +++ b/modules/enterprise/server/installer/src/main/java/org/rhq/enterprise/server/installer/ServerInstallUtil.java @@ -55,6 +55,7 @@ import org.rhq.common.jbossas.client.controller.JBossASClient; import org.rhq.common.jbossas.client.controller.MessagingJBossASClient; import org.rhq.common.jbossas.client.controller.SecurityDomainJBossASClient; import org.rhq.common.jbossas.client.controller.SocketBindingJBossASClient; +import org.rhq.common.jbossas.client.controller.TransactionsJBossASClient; import org.rhq.common.jbossas.client.controller.WebJBossASClient; import org.rhq.common.jbossas.client.controller.WebJBossASClient.ConnectorConfiguration; import org.rhq.common.jbossas.client.controller.WebJBossASClient.SSLConfiguration; @@ -146,7 +147,19 @@ public class ServerInstallUtil { private static final String RHQ_MGMT_USER = "rhqadmin";
/** - * Configure the deployment scanner to get ready to deploy the application. + * Configure the transaction manager. + * @param mcc JBossAS management client + * @throws Exception + */ + public static void configureTransactionManager(ModelControllerClient mcc) throws Exception { + TransactionsJBossASClient client = new TransactionsJBossASClient(mcc); + + // we want to bump up the transaction timeout + client.setDefaultTransactionTimeout(600); + } + + /** + * Configure the deployment scanner. * @param mcc JBossAS management client * @throws Exception */
commit 84b4cbcc2016590189eda3e3adfe48e4f10f1ac7 Author: Thomas SEGISMONT tsegismo@redhat.com Date: Tue Dec 18 17:56:46 2012 +0100
AS7 plugin upload connection now with httpclient
Add common property for commons-httpclient version and update POMs Add httpclient dependency Make as7 integration test launch generic Integation tests: make rid of SigarInstaller hard coded Sigar version ANT version to 1.8.4 Fix eclipse classpath issues
diff --git a/.classpath b/.classpath index 4d6da55..e7fd638 100644 --- a/.classpath +++ b/.classpath @@ -124,6 +124,7 @@ <classpathentry kind="src" path="modules/plugins/netservices/src/main/java"/> <classpathentry kind="src" path="modules/plugins/ant-bundle/src/main/java"/> <classpathentry kind="src" path="modules/plugins/ant-bundle/src/test/java"/> + <classpathentry kind="src" path="modules/plugins/ant-bundle/src/test/resources"/> <classpathentry kind="src" path="modules/plugins/filetemplate-bundle/src/main/java"/> <classpathentry kind="src" path="modules/plugins/filetemplate-bundle/src/test/java"/> <classpathentry kind="src" path="modules/plugins/snmptrapd/src/main/java"/> @@ -169,9 +170,11 @@ <classpathentry kind="src" path="modules/helpers/rtfilter/src/main/java"/> <classpathentry kind="src" path="modules/core/plugin-container-itest/src/test/java"/> <classpathentry kind="src" path="modules/core/plugin-test-util/src/main/java"/> - <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/test/java"/> <classpathentry kind="src" path="modules/core/arquillian-integration/archive/src/main/java"/> <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/main/java"/> + <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/main/resources"/> + <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/test/java"/> + <classpathentry kind="src" path="modules/core/arquillian-integration/container/src/test/resources"/> <classpathentry kind="src" path="modules/test-utils/src/main/java"/> <classpathentry kind="src" path="modules/integration-tests/mod_cluster-plugin-test/src/test/java"/> <classpathentry kind="src" path="etc/samples/skeleton-plugin/src/main/java"/> @@ -190,12 +193,12 @@ <classpathentry exported="true" kind="var" path="M2_REPO/com/sun/xml/bind/jaxb-impl/2.2.4/jaxb-impl-2.2.4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/i18nlog/i18nlog/1.0.10/i18nlog-1.0.10.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/gnu-getopt/getopt/1.0.13/getopt-1.0.13.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.0.1/commons-httpclient-3.0.1.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/commons-httpclient/commons-httpclient/3.0.1/commons-httpclient-3.0.1.jar" sourcepath="/M2_REPO/commons-httpclient/commons-httpclient/3.0.1/commons-httpclient-3.0.1-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/jboss/jboss-remoting/2.2.2.SP8/jboss-remoting-2.2.2.SP8.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/oswego-concurrent/concurrent/1.3.4/concurrent-1.3.4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/rss4j/rss4j/0.92-on.2/rss4j-0.92-on.2.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/ant/ant/1.8.0/ant-1.8.0.jar" sourcepath="M2_REPO/org/apache/ant/ant/1.8.0/ant-1.8.0-sources.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/ant/ant-nodeps/1.8.0/ant-nodeps-1.8.0.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/ant/ant/1.8.4/ant-1.8.4.jar" sourcepath="M2_REPO/org/apache/ant/ant/1.8.4/ant-1.8.4-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.8.4/ant-launcher-1.8.4.jar" sourcepath="M2_REPO/org/apache/ant/ant-launcher/1.8.4/ant-launcher-1.8.4-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/javax/servlet/servlet-api/2.4/servlet-api-2.4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/struts/struts/1.2.9/struts-1.2.9.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/javax/servlet/jsp-api/2.0/jsp-api-2.0.jar"/> @@ -220,9 +223,8 @@ <classpathentry exported="true" kind="var" path="M2_REPO/javax/xml/bind/jsr173_api/1.0/jsr173_api-1.0.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/jboss/jbpm/3.1.1/jbpm-3.1.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jetbrains/annotations/7.0.2/annotations-7.0.2.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/apache/ant/ant-launcher/1.8.0/ant-launcher-1.8.0.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar" sourcepath="/M2_REPO/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/commons-lang/commons-lang/2.4/commons-lang-2.4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/javax/faces/jsf-api/1.2_14/jsf-api-1.2_14.jar" sourcepath="/M2_REPO/javax/faces/jsf-api/1.2_14/jsf-api-1.2_14-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/javax/faces/jsf-impl/1.2_14/jsf-impl-1.2_14.jar" sourcepath="/M2_REPO/javax/faces/jsf-impl/1.2_14/jsf-impl-1.2_14-sources.jar"/> @@ -235,7 +237,7 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-api/3.3.3.Final/richfaces-api-3.3.3.Final.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-api/3.1.3.GA/richfaces-api-3.1.3.GA-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/framework/richfaces-impl/3.3.3.Final/richfaces-impl-3.3.3.Final.jar" sourcepath="/M2_REPO/org/richfaces/framework/richfaces-impl/3.3.0.GA/richfaces-impl-3.3.0.GA-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/richfaces/ui/richfaces-ui/3.3.3.Final/richfaces-ui-3.3.3.Final.jar" sourcepath="/M2_REPO/org/richfaces/ui/richfaces-ui/3.3.0.GA/richfaces-ui-3.3.0.GA-sources.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/postgresql/postgresql/9.1-902.jdbc4/postgresql-9.1-902.jdbc4.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/postgresql/postgresql/9.2-1002.jdbc4/postgresql-9.2-1002.jdbc4.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/jboss/jboss-cache/1.4.1.SP9/jboss-cache-1.4.1.SP9.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/hyperic/sigar/1.6.5.132-3/sigar-1.6.5.132-3.jar" sourcepath="/M2_REPO/org/hyperic/sigar/1.6.3.82/sigar-1.6.3.82-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/jbossts/jbossjts/4.16.2.Final/jbossjts-4.16.2.Final.jar"/> @@ -274,8 +276,8 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/unitils/unitils-dbunit/3.1/unitils-dbunit-3.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/unitils/unitils-orm/3.1/unitils-orm-3.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/unitils/unitils-testng/3.1/unitils-testng-3.1.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/codehaus/jackson/jackson-core-asl/1.8.5/jackson-core-asl-1.8.5.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/codehaus/jackson/jackson-mapper-asl/1.8.5/jackson-mapper-asl-1.8.5.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/codehaus/jackson/jackson-core-asl/1.8.5/jackson-core-asl-1.8.5.jar" sourcepath="/M2_REPO/org/codehaus/jackson/jackson-core-asl/1.8.5/jackson-core-asl-1.8.5-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/codehaus/jackson/jackson-mapper-asl/1.8.5/jackson-mapper-asl-1.8.5.jar" sourcepath="/M2_REPO/org/codehaus/jackson/jackson-mapper-asl/1.8.5/jackson-mapper-asl-1.8.5-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/mongodb/mongo-java-driver/2.6.5/mongo-java-driver-2.6.5.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/com/googlecode/java-diff-utils/diffutils/1.2.1/diffutils-1.2.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/com/google/code/morphia/morphia/0.99/morphia-0.99.jar"/> @@ -311,8 +313,8 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/shrinkwrap-api/1.0.1/shrinkwrap-api-1.0.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/shrinkwrap-spi/1.0.1/shrinkwrap-spi-1.0.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/descriptors/shrinkwrap-descriptors-api-base/2.0.0-alpha-3/shrinkwrap-descriptors-api-base-2.0.0-alpha-3.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/2.0.0-alpha-7/shrinkwrap-resolver-api-2.0.0-alpha-7.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/2.0.0-alpha-7/shrinkwrap-resolver-api-maven-2.0.0-alpha-7.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/2.0.0-alpha-7/shrinkwrap-resolver-api-2.0.0-alpha-7.jar" sourcepath="/M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/2.0.0-alpha-7/shrinkwrap-resolver-api-2.0.0-alpha-7-sources.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/2.0.0-alpha-7/shrinkwrap-resolver-api-maven-2.0.0-alpha-7.jar" sourcepath="/M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/2.0.0-alpha-7/shrinkwrap-resolver-api-maven-2.0.0-alpha-7-sources.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-spi/1.0.3.Final/arquillian-test-spi-1.0.3.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-api/1.0.3.Final/arquillian-test-api-1.0.3.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/core/arquillian-core-spi/1.0.3.Final/arquillian-core-spi-1.0.3.Final.jar"/> diff --git a/modules/core/arquillian-integration/container/pom.xml b/modules/core/arquillian-integration/container/pom.xml index 36be907..65043aa 100644 --- a/modules/core/arquillian-integration/container/pom.xml +++ b/modules/core/arquillian-integration/container/pom.xml @@ -20,6 +20,28 @@ <name>RHQ Arquillian Plugin Container</name> <description>RHQ Embedded Agent Plugin Container integration for Arquillian</description>
+ <build> + <resources> + <resource> + <directory>src/main/resources</directory> + <filtering>true</filtering> + <includes> + <include>maven-properties.properties</include> + </includes> + </resource> + <resource> + <directory>src/main/resources</directory> + <filtering>false</filtering> + <includes> + <include>**/*</include> + </includes> + <excludes> + <exclude>maven-properties.properties</exclude> + </excludes> + </resource> + </resources> + </build> + <!-- Dependencies --> <dependencies>
diff --git a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java index a07c139..34726a3 100644 --- a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java +++ b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java @@ -21,6 +21,8 @@ package org.rhq.test.arquillian.impl.util; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; import java.util.UUID;
import org.apache.commons.logging.Log; @@ -28,7 +30,6 @@ import org.apache.commons.logging.LogFactory;
import org.jboss.shrinkwrap.resolver.api.maven.Maven; import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact; -import org.jboss.shrinkwrap.resolver.api.maven.MavenResolverSystem;
import org.rhq.core.util.ZipUtil; import org.rhq.core.util.file.FileUtil; @@ -42,7 +43,6 @@ public class SigarInstaller {
private static final Log LOG = LogFactory.getLog(SigarInstaller.class);
- private static final String USER_HOME = System.getProperty("user.home"); private static final String TMP_DIR = System.getProperty("java.io.tmpdir");
private File rootDir; @@ -54,12 +54,31 @@ public class SigarInstaller { }
private void init() { - MavenResolverSystem mavenDependencyResolver = Maven.resolver();
- // artifact specifier format is "<groupId>:<artifactId>[:<extension>[:<classifier>]][:<version >]" - // TODO (ips, 05/02/12): Figure out how to make this work without hard-coding the version. - sigarDistArtifact = mavenDependencyResolver.offline().loadPomFromFile("pom.xml") - .resolve("org.hyperic:sigar-dist:zip:1.6.5.132-3").withoutTransitivity().asSingleResolvedArtifact(); + // Read the properties from the Maven filtered resource file + Properties pomProperties = new Properties(); + InputStream propertyFileInputStream = getClass().getClassLoader().getResourceAsStream( + "maven-properties.properties"); + try { + pomProperties.load(propertyFileInputStream); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (propertyFileInputStream != null) { + try { + propertyFileInputStream.close(); + } catch (IOException ignore) { + } + } + } + + String sigarVersion = pomProperties.getProperty("sigar.version"); + if (sigarVersion == null) { + throw new RuntimeException("Could not read Sigar version from the properties file"); + } + + sigarDistArtifact = Maven.resolver().offline().loadPomFromFile("pom.xml") + .resolve("org.hyperic:sigar-dist:zip:" + sigarVersion).withoutTransitivity().asSingleResolvedArtifact(); }
public boolean isSigarAvailable() { diff --git a/modules/core/arquillian-integration/container/src/main/resources/maven-properties.properties b/modules/core/arquillian-integration/container/src/main/resources/maven-properties.properties new file mode 100644 index 0000000..0eb80b4 --- /dev/null +++ b/modules/core/arquillian-integration/container/src/main/resources/maven-properties.properties @@ -0,0 +1,4 @@ +#This file helps test classes to load properties coming from Maven POM +#It is filtered during the process-resources phase of a Maven build +#Add the properties you need here +sigar.version=${sigar.version} \ No newline at end of file diff --git a/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java b/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java index bf020ca..59a09f2 100644 --- a/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java +++ b/modules/core/util/src/main/java/org/rhq/core/util/StringUtil.java @@ -284,7 +284,7 @@ public class StringUtil {
for (int i = 0; i < (size - 1); i++) { buf.append(objs.get(i).toString()); - buf.append( delim); + buf.append(delim); }
if (size != 0) { @@ -553,4 +553,17 @@ public class StringUtil { public static boolean isEmpty(String s) { return s == null || s.length() == 0; } + + public static boolean isNotEmpty(String s) { + return !isEmpty(s); + } + + public static boolean isBlank(String s) { + return s == null || s.trim().length() == 0; + } + + public static boolean isNotBlank(String s) { + return !isBlank(s); + } + } \ No newline at end of file diff --git a/modules/enterprise/gui/content_http-war/pom.xml b/modules/enterprise/gui/content_http-war/pom.xml index 6ca6272..104b50d 100644 --- a/modules/enterprise/gui/content_http-war/pom.xml +++ b/modules/enterprise/gui/content_http-war/pom.xml @@ -96,7 +96,7 @@ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> <scope>provided</scope> <!-- by JBossAS --> </dependency>
diff --git a/modules/enterprise/gui/portal-war/pom.xml b/modules/enterprise/gui/portal-war/pom.xml index afe8498..d032b6d 100644 --- a/modules/enterprise/gui/portal-war/pom.xml +++ b/modules/enterprise/gui/portal-war/pom.xml @@ -94,7 +94,7 @@ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> <scope>provided</scope> <!-- by JBossAS --> </dependency>
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml index 2033a2c..3b9f92d 100644 --- a/modules/enterprise/server/jar/pom.xml +++ b/modules/enterprise/server/jar/pom.xml @@ -197,7 +197,7 @@ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> </dependency>
<dependency> diff --git a/modules/enterprise/server/plugins/jboss-software/pom.xml b/modules/enterprise/server/plugins/jboss-software/pom.xml index b2b1775..55b2aea 100644 --- a/modules/enterprise/server/plugins/jboss-software/pom.xml +++ b/modules/enterprise/server/plugins/jboss-software/pom.xml @@ -26,7 +26,7 @@ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> <scope>provided</scope> </dependency>
diff --git a/modules/enterprise/server/plugins/url/pom.xml b/modules/enterprise/server/plugins/url/pom.xml index c141d2a..e4f17ed 100644 --- a/modules/enterprise/server/plugins/url/pom.xml +++ b/modules/enterprise/server/plugins/url/pom.xml @@ -29,7 +29,7 @@ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> <scope>provided</scope> </dependency>
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml index c6265ae..bee2bbb 100644 --- a/modules/plugins/jboss-as-7/pom.xml +++ b/modules/plugins/jboss-as-7/pom.xml @@ -65,7 +65,27 @@ <artifactId>jboss-sasl</artifactId> <version>${jboss.sasl.version}</version> </dependency> - + + <!-- For communication with AS7 http management interface --> + + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>${commons-httpclient.version}</version> + <exclusions> + <exclusion> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>${commons-codec.version}</version> + </dependency> + <!-- === Test Deps === -->
<dependency> @@ -119,6 +139,16 @@ <groupId>org.jboss.sasl</groupId> <artifactId>jboss-sasl</artifactId> </artifactItem> + + <artifactItem> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + </artifactItem> + + <artifactItem> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + </artifactItem>
</artifactItems> <outputDirectory>${project.build.outputDirectory}/lib</outputDirectory> @@ -298,19 +328,20 @@ </goals> <configuration> <target> - <condition property="as7.product" value="eap" else="as"> - <matches pattern="^6\." string="${as7.version}"/> - </condition> - <property name="as7.zipfile" - location="${java.io.tmpdir}/jboss-${as7.product}-${as7.version}.zip"/> - <delete file="${as7.zipfile}"/> - <get src="${as7.url}" dest="${as7.zipfile}" usetimestamp="true" verbose="true"/> - <unzip src="${as7.zipfile}" dest="${java.io.tmpdir}"/> - <!-- What was this supposed to do? Right now, it'd delete the AS7 deployment we just unzipped. --> - <!-- <delete dir="${jboss7.home}" verbose="true"/> --> - <move file="${java.io.tmpdir}/jboss-eap-6.0" - tofile="${jboss7.home}" failonerror="false"/> - + <!-- Set as7.zipfile name before download --> + <property name="as7.zipfile" location="${java.io.tmpdir}/jboss-as7-${as7.version}.zip"/> + <!-- Defensive clean (jboss7.home is a POM property) --> + <delete dir="${jboss7.home}" quiet="true"/> + <!-- Download as7 dist if not already present --> + <get src="${as7.url}" dest="${as7.zipfile}" usetimestamp="true" verbose="true" /> + <!-- Unzip as7 dist to jboss7.home --> + <unzip src="${as7.zipfile}" dest="${jboss7.home}"> + <!-- cutdirsmapper available since ANT 1.8.2. See http://ant.apache.org/manual/Types/mapper.html --> + <!-- All as7 dist zip files have a top level directory in their hierarchy --> + <!-- Sometimes this top level directory is not even named like the zip file (e.g. snapshot dists) --> + <!-- So we use the cutdirsmapper to extract as7 files straight to as7.home --> + <cutdirsmapper dirs="1"/> + </unzip> <chmod perm="u+rx"> <fileset dir="${jboss7.home}/bin" includes="*.sh"/> </chmod> @@ -334,7 +365,7 @@ </goals> <configuration> <target> - <delete dir="${jboss7.home}" verbose="true"/> + <delete dir="${jboss7.home}" /> </target> </configuration> </execution> diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java index 0687516..2a5640d 100644 --- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java +++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASConnection.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2012 Red Hat, Inc. + * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -32,6 +32,7 @@ import java.net.SocketTimeoutException; import java.net.URL; import java.util.StringTokenizer;
+import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.JsonNode; @@ -77,6 +78,8 @@ public class ASConnection { private String host; private int port;
+ private UsernamePasswordCredentials credentials; + /** * Construct an ASConnection object. The real "physical" connection is done in {@link #executeRaw(Operation)}. * @@ -105,6 +108,10 @@ public class ASConnection { passwordAuthenticator = new AS7Authenticator(user, password); Authenticator.setDefault(passwordAuthenticator);
+ // This will hold a reference to user and password + // and will be used in the future when switching this class communication layer to httpclient + credentials = new UsernamePasswordCredentials(user, password); + // read system property "as7plugin.verbose" verbose = Boolean.getBoolean("as7plugin.verbose");
@@ -217,17 +224,18 @@ public class ASConnection { if (responseStatus.getResponseCode() >= 400) { if (verbose) { log.debug(operation + " failed with " + responseStatus + " - response body was [" + responseBody - + "]."); + + "]."); }
- if (responseBody.contains("JBAS014807") || responseBody.contains("JBAS010850") || responseBody.contains("JBAS014793")) { + if (responseBody.contains("JBAS014807") || responseBody.contains("JBAS010850") + || responseBody.contains("JBAS014793")) { // management resource not found or not readable or no known child-type if (log.isDebugEnabled()) { log.debug("Requested management resource not found: " + operation.getAddress().getPath()); } } else { - log.warn("Received " + responseStatus + " response to " + operation + " - response body was [" + - responseBody + "]."); + log.warn("Received " + responseStatus + " response to " + operation + " - response body was [" + + responseBody + "]."); } }
@@ -237,11 +245,12 @@ public class ASConnection { operationResult = mapper.readTree(responseBody); } catch (IOException ioe) { log.error("Failed to deserialize response to " + operation + " to JsonNode - response status was " - + responseStatus + ", and body was [" + responseBody + "]: " + ioe); + + responseStatus + ", and body was [" + responseBody + "]: " + ioe); Result result = new Result(); result.setOutcome("failure"); - result.setFailureDescription("Failed to deserialize response to " + operation + " to JsonNode - response status was " - + responseStatus + ", and body was [" + responseBody + "]: " + ioe); + result.setFailureDescription("Failed to deserialize response to " + operation + + " to JsonNode - response status was " + responseStatus + ", and body was [" + responseBody + + "]: " + ioe); result.setRolledBack(responseBody.contains("rolled-back=true")); result.setRhqThrowable(ioe); operationResult = mapper.valueToTree(result); @@ -304,7 +313,7 @@ public class ASConnection { private void handleAuthorizationFailureResponse(Operation operation, ResponseStatus responseStatus) { if (log.isDebugEnabled()) { log.debug("Response to " + operation + " was " + responseStatus - + " - throwing InvalidPluginConfigurationException..."); + + " - throwing InvalidPluginConfigurationException..."); } // Throw a InvalidPluginConfigurationException, so the user will get a yellow plugin connection // warning message in the GUI. @@ -317,14 +326,6 @@ public class ASConnection { throw new InvalidPluginConfigurationException(message); }
- private String getResponseMessage(HttpURLConnection conn) throws IOException { - String responseMessage = conn.getResponseMessage(); - if ((responseMessage == null) && (conn.getResponseCode() == HTTP_TEMPORARY_REDIRECT)) { - responseMessage = "Temporary Redirect"; - } - return responseMessage; - } - /** Method parses Operation.getAddress().getPath() for invalid spaces in the path passed in. * * @param path Operation.getAddress().getPath() value. @@ -454,6 +455,14 @@ public class ASConnection { return port; }
+ public String getUser() { + return credentials.getUserName(); + } + + public String getPassword() { + return credentials.getPassword(); + } + @NotNull private String getResponseBody(HttpURLConnection connection) { InputStream inputStream; diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java index a7fe82d..9a55eb7 100644 --- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java +++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ASUploadConnection.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2011 Red Hat, Inc. + * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -19,200 +19,328 @@ package org.rhq.modules.plugins.jbossas7;
import java.io.BufferedOutputStream; -import java.io.BufferedReader; import java.io.Closeable; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.Authenticator; -import java.net.HttpURLConnection; -import java.net.URL;
+import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.SimpleHttpConnectionManager; +import org.apache.commons.httpclient.UsernamePasswordCredentials; +import org.apache.commons.httpclient.auth.AuthScope; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.multipart.FilePart; +import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity; +import org.apache.commons.httpclient.methods.multipart.Part; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper;
+import org.rhq.core.util.StringUtil; +import org.rhq.modules.plugins.jbossas7.helper.ServerPluginConfiguration; + /** * Connection for uploading of content. - * Partially taken from https://github.com/jbossas/jboss-as/blob/master/testsuite/smoke/src/test/jav... + * + * This class needs to cache the content to be uploaded. Users of this class should: + * <ol> + * <li>Call {@link #getOutputStream()} an write their content to the returned {@link OutputStream}</li> + * <li>Call {@link #finishUpload()} to actually upload the content</li> + * </ol> + * + * As instances of this class held some resources it is the caller responsibility to call {@link #cancelUpload()} + * instead of {@link #finishUpload()} if, for example, an {@link IOException} occured while writing their content + * to the {@link OutputStream}. + * + * Original code taken from https://github.com/jbossas/jboss-as/blob/master/testsuite/smoke/src/test/jav... * * @author Jonathan Pearlin (of the original code) * @author Heiko W. Rupp + * @author Thomas Segismont */ public class ASUploadConnection {
- private static final String BOUNDARY_PARAM = "NeAG1QNIHHOyB5joAS7Rox!!"; + private static final String HTTP_SCHEME = "http";
- private static final String BOUNDARY = "--" + BOUNDARY_PARAM; + private static final int SOCKET_CONNECTION_TIMEOUT = 30 * 1000; // 60sec
- private static final String CRLF = "\r\n"; + private static final int SOCKET_READ_TIMEOUT = 60 * 1000; // 30sec
- private static final String POST_REQUEST_METHOD = "POST"; + private static final String TRIGGER_AUTH_URL_PATH = ASConnection.MANAGEMENT;
private static final String UPLOAD_URL_PATH = ASConnection.MANAGEMENT + "/add-content";
+ private static final int FILE_POST_MAX_LOGGABLE_RESPONSE_LENGTH = 1024 * 2; // 2k max + + private static final String SYSTEM_LINE_SEPARATOR = System.getProperty("line.separator"); + + private static final String EMPTY_JSON_TREE = "{}"; + + private static final String JSON_NODE_FAILURE_DESCRIPTION = "failure-description"; + + private static final String JSON_NODE_FAILURE_DESCRIPTION_VALUE_DEFAULT = "FailureDescription: -input was null-"; + + private static final String JSON_NODE_OUTCOME = "outcome"; + + private static final String JSON_NODE_OUTCOME_VALUE_FAILED = "failed"; + private static final Log log = LogFactory.getLog(ASUploadConnection.class);
- Authenticator passwordAuthenticator ; - BufferedOutputStream os = null; - InputStream is = null; - private HttpURLConnection connection; + private String scheme = HTTP_SCHEME; + private String host; + private int port; + + private UsernamePasswordCredentials credentials; + + private String fileName; + private int timeout; - private static final int DEFAULT_TIMEOUT = 60; // 60sec
- public ASUploadConnection(String dcHost, int port, String user, String password) { - if (dcHost == null) { + private File cacheFile; + + private BufferedOutputStream cacheOutputStream; + + /** + * @deprecated as of 4.6. This class is not reusable so there is no reason not to provide the filename to the + * constructor. Use {@link #ASUploadConnection(String, int, String, String, String)} instead. + */ + @Deprecated + public ASUploadConnection(String host, int port, String user, String password) { + this(host, port, user, password, null); + } + + /** + * Creates a new {@link ASUploadConnection} for a remote http management interface. + * + * If null user or password is given, this instance will not be able to reply to an authentication challenge. + * + * It's the responsibility of the caller to make sure either {@link #finishUpload()} or {@link #cancelUpload()} + * will be called to free resources this class helds. + * + * @param host - hostname of the remote http management interface + * @param port - port of the remote http management interface + * @param user - username to logon with to the remote http management interface. + * @param password - password to logon with to the remote http management interface + * @param fileName - fileName of the content (to provide in multipart post request) + */ + public ASUploadConnection(String host, int port, String user, String password, String fileName) { + if (host == null) { throw new IllegalArgumentException("Management host cannot be null."); } if (port <= 0 || port > 65535) { throw new IllegalArgumentException("Invalid port: " + port); } - this.host = dcHost; + if (StringUtil.isBlank(fileName)) { + throw new IllegalArgumentException("Filename cannot be blank"); + } + this.host = host; this.port = port; - if (user != null) { - passwordAuthenticator = new AS7Authenticator(user,password); - Authenticator.setDefault(passwordAuthenticator); + if (user != null && password != null) { + credentials = new UsernamePasswordCredentials(user, password); } - timeout = DEFAULT_TIMEOUT; + this.fileName = fileName; + this.timeout = SOCKET_READ_TIMEOUT; }
+ /** + * @deprecated as of 4.6. This class is not reusable so there is no reason not to provide the filename to the + * constructor. Use {@link #ASUploadConnection(ASConnection, String) instead. + */ + @Deprecated public ASUploadConnection(ASConnection asConnection) { - this.host=asConnection.getHost(); - this.port=asConnection.getPort(); - this.timeout = DEFAULT_TIMEOUT; + this(asConnection.getHost(), asConnection.getPort(), asConnection.getUser(), asConnection.getPassword(), null); }
+ /** + * Creates a new {@link ASUploadConnection} from an existing {@link ASConnection}. + * + * This constructor has the same requirements as {@link #ASUploadConnection(String, int, String, String, String)} + * which it uses internally. + * + * @param asConnection - existing {@link ASConnection} instance + * @param fileName - fileName of the content (to provide in multipart post request) + */ + public ASUploadConnection(ASConnection asConnection, String fileName) { + this(asConnection.getHost(), asConnection.getPort(), asConnection.getUser(), asConnection.getPassword(), + fileName); + }
- public OutputStream getOutputStream(String fileName) { - String url = "http://" + host + ":" + port + UPLOAD_URL_PATH; - try { - // Create the HTTP connection to the upload URL - connection = (HttpURLConnection) new URL(url).openConnection(); - connection.setConnectTimeout(30 * 1000); // 30s - connection.setReadTimeout(timeout * 1000); // default 60s - connection.setDoInput(true); - connection.setDoOutput(true); - connection.setRequestMethod(POST_REQUEST_METHOD); - connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY_PARAM); - - // Grab the test WAR file and get a stream to its contents to be included in the POST. - os = new BufferedOutputStream(connection.getOutputStream()); - os.write(buildPostRequestHeader(fileName)); - - return os; - } - catch (Exception e) { - log.error("Failed to open output stream to URL [" + url + "]: " + e, e); - } + /** + * This factory method simplifies creation of a new {@link ASUploadConnection} instance given the caller has + * access to the {@link ServerPluginConfiguration}. + * + * @param pluginConfig - the {@link ServerPluginConfiguration} + * @param fileName - fileName of the content (to provide in multipart post request) + * @return + */ + public static ASUploadConnection newInstanceForServerPluginConfiguration(ServerPluginConfiguration pluginConfig, + String fileName) { + return new ASUploadConnection(pluginConfig.getHostname(), pluginConfig.getPort(), pluginConfig.getUser(), + pluginConfig.getPassword(), fileName); + }
- return null; + /** + * @deprecated as of 4.6. Instances of this class should be created with fileName supplied to the constructor. + * If the caller does that there is no reason for late initialization of fileName. Then use + * {@link #getOutputStream()} instead. + */ + @Deprecated + public OutputStream getOutputStream(String fileName) { + this.fileName = fileName; + return getOutputStream(); }
- public JsonNode finishUpload() { - JsonNode tree = null; + /** + * Gives an outpustream where callers should write the content which will be uploaded to AS7 + * when {@link #finishUpload()} will be called. + * + * @return an {@link OutputStream} or null if it could not be created. + */ + public OutputStream getOutputStream() { try { - os.write(buildPostRequestFooter()); - os.flush(); + cacheFile = File.createTempFile(getClass().getSimpleName(), ".cache"); + cacheOutputStream = new BufferedOutputStream(new FileOutputStream(cacheFile)); + return cacheOutputStream; + } catch (IOException e) { + log.error("Could not create outputstream for " + fileName, e); + } + return null; + }
- int code = connection.getResponseCode(); - if (code != 200) { - log.warn("Response code for file upload: " + code + " " + connection.getResponseMessage()); - } - if (code == 500) - is = connection.getErrorStream(); - else - is = connection.getInputStream(); - - if (is != null) { - BufferedReader in = new BufferedReader(new InputStreamReader(is)); - String line; - StringBuilder builder = new StringBuilder(); - while ((line = in.readLine()) != null) { - builder.append(line); - } + /** + * To be called instead of {@link #finishUpload()} if one doesn't want to upload the cached content. + * + * It's important to call this method if not actually uploading as it frees resources this class helds. + */ + public void cancelUpload() { + closeQuietly(cacheOutputStream); + deleteCacheFile(); + }
- ObjectMapper mapper = new ObjectMapper(); + /** + * Triggers the real upload to the AS7 instance. At this point the caller should have written + * the content in the {@link OutputStream} given by {@link #getOutputStream()}. + * + * @return a {@link JsonNode} instance read from the upload response body or null if something went wrong. + */ + public JsonNode finishUpload() {
- String s = builder.toString(); - if (s!=null) - tree = mapper.readTree(s); - else - log.warn("- no result received from InputStream -"); - } - else - log.warn("- no InputStream available -"); + if (fileName == null) { + // At this point the fileName should have been set whether at instanciation or in #getOutputStream(String) + throw new IllegalStateException("Upload fileName is null"); + }
- } catch (IOException e) { - log.error(e); + closeQuietly(cacheOutputStream); + + // We will first send a simple get request in order to trigger authentication challenge. + // This allows to send the potentially big file only once to the server + // The typical resulting http exchange would be: + // + // GET without auth <- 401 (start auth challenge : the server will name the realm and the scheme) + // GET with auth <- 200 + // POST big file + // + // Note this only works because we use SimpleHttpConnectionManager which maintains + // only one HttpConnection + // + // A better way to avoid uploading a big file multiple times would be to use header Expect: Continue + // Unfortunately AS7 responds 100 Continue even if the authentication headers are not yet present + + SimpleHttpConnectionManager httpConnectionManager = new SimpleHttpConnectionManager(); + HttpClient client = new HttpClient(httpConnectionManager); + if (credentialsProvided()) { + client.getState().setCredentials(new AuthScope(host, port, AuthScope.ANY_REALM), credentials); } - finally { - closeQuietly(is); - closeQuietly(os); + client.getHttpConnectionManager().getParams().setConnectionTimeout(SOCKET_CONNECTION_TIMEOUT); + client.getHttpConnectionManager().getParams().setSoTimeout(timeout); + + String triggerAuthURL = scheme + "://" + host + ":" + port + TRIGGER_AUTH_URL_PATH; + GetMethod triggerAuthGET = new GetMethod(triggerAuthURL); + try { + // Send GET request in order to trigger authentication + // We don't check response code because we're not already uploading the file + client.executeMethod(triggerAuthGET); + } catch (Exception ignore) { + // We don't stop trying upload if triggerAuthGET raises exception + // See comment above + } finally { + triggerAuthGET.releaseConnection(); }
- return tree; - } + String uploadURL = scheme + "://" + host + ":" + port + UPLOAD_URL_PATH; + PostMethod filePOST = new PostMethod(uploadURL); + try {
+ // Now upload file with multipart POST request + Part[] parts = { new FilePart(fileName, cacheFile) }; + filePOST.setRequestEntity(new MultipartRequestEntity(parts, filePOST.getParams())); + int responseCode = client.executeMethod(filePOST); + if (responseCode != HttpStatus.SC_OK) { + logUploadDoesNotEndWithHttpOkStatus(filePOST, responseCode); + return null; + }
- private byte[] buildPostRequestHeader(String fileName) throws UnsupportedEncodingException { - final StringBuilder builder = new StringBuilder(); - builder.append(buildPostRequestHeaderSection("form-data; name="file"; filename=""+fileName+""", "application/octet-stream", "")); - return builder.toString().getBytes("US-ASCII"); - } + ObjectMapper objectMapper = new ObjectMapper(); + InputStream responseBodyAsStream = filePOST.getResponseBodyAsStream(); + if (responseBodyAsStream == null) { + log.warn("POST request has no response body"); + return objectMapper.readTree(EMPTY_JSON_TREE); + } + return objectMapper.readTree(responseBodyAsStream);
- private StringBuilder buildPostRequestHeaderSection(final String contentDisposition, final String contentType, final String content) { - final StringBuilder builder = new StringBuilder(); - builder.append(BOUNDARY); - builder.append(CRLF); - if(contentDisposition != null && contentDisposition.length() > 0) { - builder.append(String.format("Content-Disposition: %s", contentDisposition)); - } - builder.append(CRLF); - if(contentType != null && contentType.length() > 0) { - builder.append(String.format("Content-Type: %s", contentType)); - } - builder.append(CRLF); - if(content != null && content.length() > 0) { - builder.append(content); + } catch (Exception e) { + log.error(e); + return null; + } finally { + // First release connection + filePOST.releaseConnection(); + // Then force close + httpConnectionManager.closeIdleConnections(0); + deleteCacheFile(); } - builder.append(CRLF); - return builder; - } - - private byte[] buildPostRequestFooter() throws UnsupportedEncodingException{ - final StringBuilder builder = new StringBuilder(); - builder.append(CRLF); - builder.append(BOUNDARY); - builder.append("--"); - builder.append(CRLF); - return builder.toString().getBytes("US-ASCII"); }
+ /** + * Inspects the supplied {@link JsonNode} instance and returns the json 'failure-description' node value as text. + * + * @param jsonNode + * @return + */ public static String getFailureDescription(JsonNode jsonNode) { - if (jsonNode==null) - return "getFailureDescription: -input was null-"; - JsonNode node = jsonNode.findValue("failure-description"); + if (jsonNode == null) { + return JSON_NODE_FAILURE_DESCRIPTION_VALUE_DEFAULT; + } + JsonNode node = jsonNode.findValue(JSON_NODE_FAILURE_DESCRIPTION); + if (node == null) { + return JSON_NODE_FAILURE_DESCRIPTION_VALUE_DEFAULT; + } return node.getValueAsText(); }
- static boolean isErrorReply(JsonNode in) { - if (in == null) + /** + * Inspects the supplied {@link JsonNode} instance to determine if it represents an error outcome. + * + * @param jsonNode + * @return + */ + public static boolean isErrorReply(JsonNode jsonNode) { + if (jsonNode == null) { return true; + }
- if (in.has("outcome")) { + if (jsonNode.has(JSON_NODE_OUTCOME)) { String outcome = null; try { - JsonNode outcomeNode = in.findValue("outcome"); + JsonNode outcomeNode = jsonNode.findValue(JSON_NODE_OUTCOME); outcome = outcomeNode.getTextValue(); - if (outcome.equals("failed")) { - JsonNode reasonNode = in.findValue("failure-description"); - - String reason = reasonNode.getTextValue(); + if (outcome.equals(JSON_NODE_OUTCOME_VALUE_FAILED)) { return true; } } catch (Exception e) { @@ -223,8 +351,31 @@ public class ASUploadConnection { return false; }
+ private boolean credentialsProvided() { + // If null user or password is given to the constructor + // no credentials instance is created + return credentials != null; + } + + private void logUploadDoesNotEndWithHttpOkStatus(PostMethod filePOST, int responseCode) { + StringBuilder logMessageBuilder = new StringBuilder("File upload failed: ").append(HttpStatus + .getStatusText(responseCode)); + // If it's sure there is a response body and it's not too long + if (filePOST.getResponseContentLength() > 0 + && filePOST.getResponseContentLength() < FILE_POST_MAX_LOGGABLE_RESPONSE_LENGTH) { + try { + // It is safe to call getResponseBodyAsString as we know the body is not too long + String responseBodyAsString = filePOST.getResponseBodyAsString(); + logMessageBuilder.append(SYSTEM_LINE_SEPARATOR).append(responseBodyAsString); + } catch (IOException ignore) { + // If we can't get the response body, we'll just not log it + } + } + log.warn(logMessageBuilder.toString()); + } + private void closeQuietly(final Closeable closeable) { - if(closeable != null) { + if (closeable != null) { try { closeable.close(); } catch (final IOException ignore) { @@ -232,6 +383,12 @@ public class ASUploadConnection { } }
+ private void deleteCacheFile() { + if (cacheFile != null) { + cacheFile.delete(); + } + } + /** * Get the currently active upload timeout * @return timeout in seconds @@ -247,4 +404,5 @@ public class ASUploadConnection { public void setTimeout(int timeout) { this.timeout = timeout; } + } diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java index 080c60f..2451728 100644 --- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java +++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseComponent.java @@ -63,7 +63,6 @@ import org.rhq.core.pluginapi.measurement.MeasurementFacet; import org.rhq.core.pluginapi.operation.OperationFacet; import org.rhq.core.pluginapi.operation.OperationResult; import org.rhq.core.pluginapi.util.StartScriptConfiguration; -import org.rhq.modules.plugins.jbossas7.helper.ServerPluginConfiguration; import org.rhq.modules.plugins.jbossas7.json.Address; import org.rhq.modules.plugins.jbossas7.json.CompositeOperation; import org.rhq.modules.plugins.jbossas7.json.Operation; @@ -80,7 +79,7 @@ import org.rhq.modules.plugins.jbossas7.json.Result; * @param <T> the type of the component's parent resource component */ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Component<T>, MeasurementFacet, - ConfigurationFacet, DeleteResourceFacet, CreateChildResourceFacet, OperationFacet { + ConfigurationFacet, DeleteResourceFacet, CreateChildResourceFacet, OperationFacet {
private static final String INTERNAL = "_internal:"; private static final int INTERNAL_SIZE = INTERNAL.length(); @@ -105,6 +104,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone * Start the resource connection * @see org.rhq.core.pluginapi.inventory.ResourceComponent#start(org.rhq.core.pluginapi.inventory.ResourceContext) */ + @Override public void start(ResourceContext<T> context) throws InvalidPluginConfigurationException, Exception { this.context = context; pluginConfiguration = context.getPluginConfiguration(); @@ -132,6 +132,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone * Return availability of this resource * @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability() */ + @Override public AvailabilityType getAvailability() { ReadResource op = new ReadResource(address); Result res = getASConnection().execute(op); @@ -147,7 +148,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone while ((component != null) && !(component instanceof BaseServerComponent)) { component = (BaseComponent<?>) component.context.getParentResourceComponent(); } - return (BaseServerComponent)component; + return (BaseServerComponent) component; }
public BaseServerComponent getServerComponent() { @@ -158,6 +159,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone * Gather measurement data * @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set) */ + @Override public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
for (MeasurementScheduleRequest req : metrics) { @@ -262,19 +264,22 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone report.addData(data); }
+ @Override public ASConnection getASConnection() { return (this.testConnection != null) ? this.testConnection : getServerComponent().getASConnection(); }
+ @Override public String getPath() { return path; }
+ @Override public Configuration loadResourceConfiguration() throws Exception {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition(); ConfigurationLoadDelegate delegate = new ConfigurationLoadDelegate(configDef, getASConnection(), address, - includeRuntime); + includeRuntime); Configuration configuration = delegate.loadResourceConfiguration();
// Read server state @@ -289,7 +294,8 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone }
if (res.isReloadRequired()) { - PropertySimple oobMessage = new PropertySimple("__OOB","The server needs a reload for the latest changes to come effective."); + PropertySimple oobMessage = new PropertySimple("__OOB", + "The server needs a reload for the latest changes to come effective."); configuration.put(oobMessage); } if (res.isRestartRequired()) { @@ -300,6 +306,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone return configuration; }
+ @Override public void updateResourceConfiguration(ConfigurationUpdateReport report) {
ConfigurationDefinition configDef = context.getResourceType().getResourceConfigurationDefinition(); @@ -354,18 +361,19 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone // check if there is already a child with th desired type is present Configuration pluginConfig = report.getPluginConfiguration(); PropertySimple pathProperty = pluginConfig.getSimple("path"); - if (path==null || path.isEmpty()) { + if (path == null || path.isEmpty()) { report.setErrorMessage("No path property found in plugin configuration"); report.setStatus(CreateResourceStatus.INVALID_CONFIGURATION); return report; }
- ReadChildrenNames op = new ReadChildrenNames(address,pathProperty.getStringValue()); + ReadChildrenNames op = new ReadChildrenNames(address, pathProperty.getStringValue()); Result res = connection.execute(op); if (res.isSuccess()) { List<String> entries = (List<String>) res.getResult(); if (!entries.isEmpty()) { - report.setErrorMessage("Resource is a singleton, but there are already children " + entries + " please remove them and retry"); + report.setErrorMessage("Resource is a singleton, but there are already children " + entries + + " please remove them and retry"); report.setStatus(CreateResourceStatus.FAILURE); return report; } @@ -395,11 +403,23 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone ContentServices contentServices = cctx.getContentServices(); String resourceTypeName = report.getResourceType().getName();
- ServerPluginConfiguration serverPluginConfig = getServerComponent().getServerPluginConfiguration(); - ASUploadConnection uploadConnection = new ASUploadConnection(serverPluginConfig.getHostname(), - serverPluginConfig.getPort(), serverPluginConfig.getUser(), serverPluginConfig.getPassword()); - OutputStream out = uploadConnection.getOutputStream(details.getKey().getName()); - contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out); + ASUploadConnection uploadConnection = ASUploadConnection.newInstanceForServerPluginConfiguration( + getServerComponent().getServerPluginConfiguration(), details.getKey().getName()); + + OutputStream out = uploadConnection.getOutputStream(); + if (out == null) { + report.setStatus(CreateResourceStatus.FAILURE); + report.setErrorMessage("An error occured while the agent was preparing for content download"); + return report; + } + try { + contentServices.downloadPackageBitsForChildResource(cctx, resourceTypeName, details.getKey(), out); + } catch (Exception e) { + uploadConnection.cancelUpload(); + report.setStatus(CreateResourceStatus.FAILURE); + report.setErrorMessage("An error occured while the agent was downloading the content"); + return report; + }
JsonNode uploadResult = uploadConnection.finishUpload(); if (verbose) { @@ -409,12 +429,11 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone if (ASUploadConnection.isErrorReply(uploadResult)) { report.setStatus(CreateResourceStatus.FAILURE); report.setErrorMessage(ASUploadConnection.getFailureDescription(uploadResult)); - return report; }
// Key is available from UI and CLI - String fileName = details.getKey().getName(); + String fileName = details.getKey().getName();
String runtimeName = report.getPackageDetails().getDeploymentTimeConfiguration().getSimpleValue("runtimeName"); if (runtimeName == null || runtimeName.isEmpty()) { @@ -523,14 +542,12 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone int colonPos = name.indexOf(':'); what = name.substring(0, colonPos); op = name.substring(colonPos + 1); - } - else { - what=""; // dummy value + } else { + what = ""; // dummy value op = name; } Operation operation = null;
- Address theAddress = new Address();
if (what.equals("server-group")) { @@ -583,11 +600,10 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone if (prop instanceof PropertySimple) { PropertySimple ps = (PropertySimple) prop; if (ps.getStringValue() != null) { - Object val = getObjectForProperty(ps,op); - operation.addAdditionalProperty(ps.getName(),val); + Object val = getObjectForProperty(ps, op); + operation.addAdditionalProperty(ps.getName(), val); } - } - else if (prop instanceof PropertyList) { + } else if (prop instanceof PropertyList) { PropertyList pl = (PropertyList) prop; List<Object> items = new ArrayList<Object>(pl.getList().size()); // Loop over the inner elements of the list @@ -595,14 +611,13 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone if (p2 instanceof PropertySimple) { PropertySimple ps = (PropertySimple) p2; if (ps.getStringValue() != null) { - Object val = getObjectForPropertyList(ps,pl,op); + Object val = getObjectForPropertyList(ps, pl, op); items.add(val); } } } - operation.addAdditionalProperty(pl.getName(),items); - } - else { + operation.addAdditionalProperty(pl.getName(), items); + } else { log.error("PropertyMap for " + prop.getName() + " not yet supported"); } } @@ -637,7 +652,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone */ Object getObjectForProperty(PropertySimple prop, String operationName) { ConfigurationDefinition parameterDefinitions = getParameterDefinitionsForOperation(operationName); - if (parameterDefinitions==null) + if (parameterDefinitions == null) return null;
PropertyDefinition pd = parameterDefinitions.get(prop.getName()); @@ -660,14 +675,14 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone */ Object getObjectForPropertyList(PropertySimple prop, PropertyList propertyList, String operationName) { ConfigurationDefinition parameterDefinitions = getParameterDefinitionsForOperation(operationName); - if (parameterDefinitions==null) + if (parameterDefinitions == null) return null;
PropertyDefinition def = parameterDefinitions.get(propertyList.getName()); - if (def instanceof PropertyDefinitionList) { + if (def instanceof PropertyDefinitionList) { PropertyDefinitionList definitionList = (PropertyDefinitionList) def; PropertyDefinition tmp = definitionList.getMemberDefinition(); - if (tmp instanceof PropertyDefinitionSimple) { + if (tmp instanceof PropertyDefinitionSimple) { return getObjectForProperty(prop, (PropertyDefinitionSimple) tmp); } } @@ -755,7 +770,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone Result res = getASConnection().execute(op); if (!res.isSuccess()) { throw new Exception("Failed to read attribute [" + name + "] of address [" + getAddress().getPath() - + "] - response: " + res); + + "] - response: " + res); } return (T) res.getResult(); } @@ -797,11 +812,13 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone int endIndex = expressionValue.indexOf('}', beginIndex); if (endIndex >= 0) { String expression = expressionValue.substring(beginIndex + 2, endIndex); - StartScriptConfiguration startScriptConfig = getServerComponent().getStartScriptConfiguration(); + StartScriptConfiguration startScriptConfig = getServerComponent() + .getStartScriptConfiguration(); List<String> startScriptArgs = startScriptConfig.getStartScriptArgs(); for (String startScriptArg : startScriptArgs) { if (startScriptArg.startsWith("-Djboss.default.multicast.address=")) { - multicastHost = startScriptArg.substring("-Djboss.default.multicast.address=".length()); + multicastHost = startScriptArg.substring("-Djboss.default.multicast.address=" + .length()); break; } } @@ -812,7 +829,7 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone multicastHost = defaultValue; } else { log.error("Failed to resolve expression value [" + expressionValue - + "] of 'multicast-address' attribute."); + + "] of 'multicast-address' attribute."); } } } @@ -822,7 +839,8 @@ public class BaseComponent<T extends ResourceComponent<?>> implements AS7Compone } multicastPort = readAttribute(jgroupsSocketBindingAddress, "multicast-port", Integer.class); } catch (Exception e) { - throw new RuntimeException("Failed to lookup multicast address for socket binding [" + socketBinding + "]."); + throw new RuntimeException("Failed to lookup multicast address for socket binding [" + socketBinding + + "]."); }
if (multicastHost != null && multicastPort != null) { diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DeploymentComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DeploymentComponent.java index 3cf2cdb..0d166b4 100644 --- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DeploymentComponent.java +++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/DeploymentComponent.java @@ -50,34 +50,35 @@ import org.rhq.modules.plugins.jbossas7.json.Result; * Deal with deployments * @author Heiko W. Rupp */ -public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> implements OperationFacet, ContentFacet { +public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> implements OperationFacet, ContentFacet {
private static final String DOMAIN_DATA_CONTENT_SUBDIR = "/data/content"; private boolean verbose = ASConnection.verbose; private File deploymentFile;
@Override - public void start(ResourceContext<ResourceComponent<?>> context) throws InvalidPluginConfigurationException, Exception { + public void start(ResourceContext<ResourceComponent<?>> context) throws InvalidPluginConfigurationException, + Exception { super.start(context); deploymentFile = determineDeploymentFile(); }
@Override public AvailabilityType getAvailability() { - Operation op = new ReadAttribute(getAddress(),"enabled"); + Operation op = new ReadAttribute(getAddress(), "enabled"); Result res = getASConnection().execute(op); if (!res.isSuccess()) return AvailabilityType.DOWN;
- if (res.getResult()== null || !(Boolean)(res.getResult())) + if (res.getResult() == null || !(Boolean) (res.getResult())) return AvailabilityType.DOWN;
return AvailabilityType.UP; }
@Override - public OperationResult invokeOperation(String name, - Configuration parameters) throws InterruptedException, Exception { + public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException, + Exception {
if (name.equals("enable")) { return invokeSimpleOperation("deploy"); @@ -86,7 +87,7 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp } else if (name.equals("restart")) { OperationResult result = invokeSimpleOperation("undeploy");
- if(result.getErrorMessage() == null){ + if (result.getErrorMessage() == null) { result = invokeSimpleOperation("deploy"); }
@@ -97,7 +98,7 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp }
private OperationResult invokeSimpleOperation(String action) { - Operation op = new Operation(action,getAddress()); + Operation op = new Operation(action, getAddress()); Result res = getASConnection().execute(op); OperationResult result = new OperationResult(); if (res.isSuccess()) { @@ -115,19 +116,17 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp return result; }
- @Override public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) { return new ArrayList<DeployPackageStep>(); }
@Override - public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, - ContentServices contentServices) { + public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, ContentServices contentServices) { log.debug("Starting deployment.."); DeployPackagesResponse response = new DeployPackagesResponse();
- if (packages.size()!=1) { + if (packages.size() != 1) { response.setOverallRequestResult(ContentResponseResult.FAILURE); response.setOverallRequestErrorMessage("Can only deploy one package at a time"); log.warn("deployPackages can only deploy one package at a time"); @@ -135,14 +134,27 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp
ResourcePackageDetails detail = packages.iterator().next();
- ASUploadConnection uploadConnection = new ASUploadConnection(getASConnection()); - OutputStream out = uploadConnection.getOutputStream(detail.getKey().getName()); + ASUploadConnection uploadConnection = ASUploadConnection.newInstanceForServerPluginConfiguration( + getServerComponent().getServerPluginConfiguration(), detail.getKey().getName()); + OutputStream out = uploadConnection.getOutputStream(); + if (out == null) { + response.setOverallRequestResult(ContentResponseResult.FAILURE); + response + .setOverallRequestErrorMessage("An error occured while the agent was preparing for content download"); + return response; + } ResourceType resourceType = context.getResourceType();
- log.info("Deploying " + resourceType.getName() + " Resource with key [" + detail.getKey() +"]..."); + log.info("Deploying " + resourceType.getName() + " Resource with key [" + detail.getKey() + "]...");
- contentServices.downloadPackageBits(context.getContentContext(), - detail.getKey(), out, true); + try { + contentServices.downloadPackageBits(context.getContentContext(), detail.getKey(), out, true); + } catch (Exception e) { + uploadConnection.cancelUpload(); + response.setOverallRequestResult(ContentResponseResult.FAILURE); + response.setOverallRequestErrorMessage("An error occured while the agent was downloading the content"); + return response; + }
JsonNode uploadResult = uploadConnection.finishUpload(); if (verbose) { @@ -152,32 +164,29 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp if (ASUploadConnection.isErrorReply(uploadResult)) { response.setOverallRequestResult(ContentResponseResult.FAILURE); response.setOverallRequestErrorMessage(ASUploadConnection.getFailureDescription(uploadResult)); - return response; } + JsonNode resultNode = uploadResult.get("result"); String hash = resultNode.get("BYTES_VALUE").getTextValue();
- - CreateResourceReport report1 = new CreateResourceReport("", resourceType, new Configuration(), - new Configuration(), detail); - //CreateResourceReport report = runDeploymentMagicOnServer(report1,detail.getKey().getName(),hash, hash); + new CreateResourceReport("", resourceType, new Configuration(), new Configuration(), detail);
try { redeployOnServer(detail.getKey().getName(), hash); response.setOverallRequestResult(ContentResponseResult.SUCCESS); //we just deployed a different file on the AS7 server, so let's refresh ourselves deploymentFile = determineDeploymentFile(); - DeployIndividualPackageResponse packageResponse = new DeployIndividualPackageResponse(detail.getKey(), ContentResponseResult.SUCCESS); - response.addPackageResponse(packageResponse); + DeployIndividualPackageResponse packageResponse = new DeployIndividualPackageResponse(detail.getKey(), + ContentResponseResult.SUCCESS); + response.addPackageResponse(packageResponse);
- } - catch (Exception e) { + } catch (Exception e) { response.setOverallRequestResult(ContentResponseResult.FAILURE); }
- log.info("Result of deployment of " + resourceType.getName() + " Resource with key [" + detail.getKey() - + "]: " + response); + log.info("Result of deployment of " + resourceType.getName() + " Resource with key [" + detail.getKey() + "]: " + + response);
return response; } @@ -185,12 +194,12 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp private void redeployOnServer(String name, String hash) throws Exception {
Operation op = new Operation("full-replace-deployment", new Address()); - op.addAdditionalProperty("name",name); + op.addAdditionalProperty("name", name); List<Object> content = new ArrayList<Object>(1); - Map<String,Object> contentValues = new HashMap<String,Object>(); - contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE",hash)); + Map<String, Object> contentValues = new HashMap<String, Object>(); + contentValues.put("hash", new PROPERTY_VALUE("BYTES_VALUE", hash)); content.add(contentValues); - op.addAdditionalProperty("content",content); + op.addAdditionalProperty("content", content); Result result = getASConnection().execute(op); if (result.isRolledBack()) throw new Exception(result.getFailureDescription()); @@ -257,12 +266,12 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp // No content -> check for server group if (path.startsWith(("server-group="))) { // Server group has no content of its own - use the domain deployment - String name = (String) path.substring(path.lastIndexOf("=")+1); - op = new ReadResource(new Address("deployment",name)); + String name = (String) path.substring(path.lastIndexOf("=") + 1); + op = new ReadResource(new Address("deployment", name)); result = getASConnection().execute(op); if (result.isSuccess()) { @SuppressWarnings("unchecked") - Map<String,Object> contentMap = (Map<String, Object>) result.getResult(); + Map<String, Object> contentMap = (Map<String, Object>) result.getResult(); content = (List<Map<String, Object>>) contentMap.get("content"); if (content.get(0).containsKey("path")) { String path = (String) content.get(0).get("path"); @@ -270,19 +279,21 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp deploymentFile = getDeploymentFileFromPath(relativeTo, path); } else if (content.get(0).containsKey("hash")) { @SuppressWarnings("unchecked") - String base64Hash = ((Map<String, String>)content.get(0).get("hash")).get("BYTES_VALUE"); + String base64Hash = ((Map<String, String>) content.get(0).get("hash")).get("BYTES_VALUE"); byte[] hash = Base64.decode(base64Hash); ServerGroupComponent sgc = (ServerGroupComponent) context.getParentResourceComponent(); - String baseDir = ((HostControllerComponent) sgc.context.getParentResourceComponent()).pluginConfiguration.getSimpleValue("baseDir"); - String contentPath = new File(baseDir , "/data/content").getAbsolutePath(); + String baseDir = ((HostControllerComponent) sgc.context.getParentResourceComponent()).pluginConfiguration + .getSimpleValue("baseDir"); + String contentPath = new File(baseDir, "/data/content").getAbsolutePath(); deploymentFile = getDeploymentFileFromHash(hash, contentPath); } return deploymentFile; } + } else { + log.warn("Could not determine the location of the deployment - the content descriptor wasn't found for deployment" + + getAddress() + "."); + return null; } - else { - log.warn("Could not determine the location of the deployment - the content descriptor wasn't found for deployment" + getAddress() + "."); - return null;} }
Boolean archive = (Boolean) content.get(0).get("archive"); @@ -298,17 +309,16 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp deploymentFile = getDeploymentFileFromPath(relativeTo, path); } else if (content.get(0).containsKey("hash")) { @SuppressWarnings("unchecked") - String base64Hash = ((Map<String, String>)content.get(0).get("hash")).get("BYTES_VALUE"); + String base64Hash = ((Map<String, String>) content.get(0).get("hash")).get("BYTES_VALUE"); byte[] hash = Base64.decode(base64Hash); Address contentPathAddress; if (context.getParentResourceComponent() instanceof ManagedASComponent) { // -> managed server we need to check for host=x/server=y, but the path brings host=x,server-config=y String p = ((ManagedASComponent) context.getParentResourceComponent()).getPath(); - p = p.replaceAll("server-config=","server="); + p = p.replaceAll("server-config=", "server="); contentPathAddress = new Address(p); contentPathAddress.add("core-service", "server-environment"); - } - else { + } else { // standalone contentPathAddress = new Address("core-service", "server-environment"); } @@ -321,16 +331,17 @@ public class DeploymentComponent extends BaseComponent<ResourceComponent<?>> imp } else { // No success above -> check if this is a domain deployment if (this instanceof DomainDeploymentComponent) { - String baseDir = ((HostControllerComponent) context.getParentResourceComponent()).pluginConfiguration.getSimpleValue("baseDir"); - contentPath = new File(baseDir , DOMAIN_DATA_CONTENT_SUBDIR).getAbsolutePath(); - } - else { + String baseDir = ((HostControllerComponent) context.getParentResourceComponent()).pluginConfiguration + .getSimpleValue("baseDir"); + contentPath = new File(baseDir, DOMAIN_DATA_CONTENT_SUBDIR).getAbsolutePath(); + } else { contentPath = "-unknown-"; } } deploymentFile = getDeploymentFileFromHash(hash, contentPath); } else { - log.warn("Failed to determine the deployment file of " + getAddress() + " deployment. Neither path nor hash attributes were available."); + log.warn("Failed to determine the deployment file of " + getAddress() + + " deployment. Neither path nor hash attributes were available."); }
return deploymentFile; diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java index 82b1042..71967e5 100644 --- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java +++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ServerGroupComponent.java @@ -44,7 +44,6 @@ import org.rhq.core.pluginapi.content.ContentServices; import org.rhq.core.pluginapi.inventory.CreateChildResourceFacet; import org.rhq.core.pluginapi.operation.OperationFacet; import org.rhq.core.pluginapi.operation.OperationResult; -import org.rhq.modules.plugins.jbossas7.helper.ServerPluginConfiguration; import org.rhq.modules.plugins.jbossas7.json.Address; import org.rhq.modules.plugins.jbossas7.json.CompositeOperation; import org.rhq.modules.plugins.jbossas7.json.Operation; @@ -58,24 +57,23 @@ import org.rhq.modules.plugins.jbossas7.json.Result; */ @SuppressWarnings("unused") public class ServerGroupComponent extends BaseComponent implements ContentFacet, CreateChildResourceFacet, - OperationFacet { + OperationFacet {
private static final String SUCCESS = "success"; private static final String OUTCOME = "outcome";
@Override - public OperationResult invokeOperation(String name, - Configuration parameters) throws InterruptedException, Exception { + public OperationResult invokeOperation(String name, Configuration parameters) throws InterruptedException, + Exception {
- Operation op = new Operation(name,getAddress()); + Operation op = new Operation(name, getAddress()); Result res = getASConnection().execute(op);
OperationResult result = new OperationResult();
if (res.isSuccess()) { result.setSimpleResult(SUCCESS); - } - else { + } else { result.setErrorMessage(res.getFailureDescription()); } return result; @@ -84,13 +82,12 @@ public class ServerGroupComponent extends BaseComponent implements ContentFacet,
@Override public List<DeployPackageStep> generateInstallationSteps(ResourcePackageDetails packageDetails) { - return null; // TODO: Customise this generated block + return null; // TODO: Customise this generated block }
// TODO I think this package code is not used. @Override - public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, - ContentServices contentServices) { + public DeployPackagesResponse deployPackages(Set<ResourcePackageDetails> packages, ContentServices contentServices) {
ContentContext cctx = context.getContentContext();
@@ -98,13 +95,28 @@ public class ServerGroupComponent extends BaseComponent implements ContentFacet,
for (ResourcePackageDetails details : packages) {
- ServerPluginConfiguration serverPluginConfig = getServerComponent().getServerPluginConfiguration(); - ASUploadConnection uploadConnection = new ASUploadConnection(serverPluginConfig.getHostname(), - serverPluginConfig.getPort(), serverPluginConfig.getUser(), serverPluginConfig.getPassword()); String packageName = details.getName(); - OutputStream out = uploadConnection.getOutputStream(packageName); - contentServices.downloadPackageBits(cctx, details.getKey(), out, false); + + ASUploadConnection uploadConnection = ASUploadConnection.newInstanceForServerPluginConfiguration( + getServerComponent().getServerPluginConfiguration(), packageName); + OutputStream out = uploadConnection.getOutputStream(); + if (out == null) { + response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(), + ContentResponseResult.FAILURE)); + continue; + } + + try { + contentServices.downloadPackageBits(cctx, details.getKey(), out, false); + } catch (Exception e) { + uploadConnection.cancelUpload(); + response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(), + ContentResponseResult.FAILURE)); + continue; + } + JsonNode uploadResult = uploadConnection.finishUpload(); + if (uploadResult.has(OUTCOME)) { String outcome = uploadResult.get(OUTCOME).getTextValue(); if (outcome.equals(SUCCESS)) { // Upload was successful, so now add the file to the server group @@ -114,20 +126,20 @@ public class ServerGroupComponent extends BaseComponent implements ContentFacet,
Address deploymentsAddress = new Address(); deploymentsAddress.add("deployment", packageName); - Operation step1 = new Operation("add",deploymentsAddress); -// step1.addAdditionalProperty("hash", new PROPERTY_VALUE("BYTES_VALUE", hash)); + Operation step1 = new Operation("add", deploymentsAddress); + // 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)); + 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("content", content);
step1.addAdditionalProperty("name", packageName);
Address serverGroupAddress = new Address(context.getResourceKey()); serverGroupAddress.add("deployment", packageName); - Operation step2 = new Operation("add",serverGroupAddress); - Operation step3 = new Operation("deploy",serverGroupAddress); + Operation step2 = new Operation("add", serverGroupAddress); + Operation step3 = new Operation("deploy", serverGroupAddress);
CompositeOperation cop = new CompositeOperation(); cop.addStep(step1); @@ -136,36 +148,35 @@ public class ServerGroupComponent extends BaseComponent implements ContentFacet,
Result result = connection.execute(cop); if (!result.isSuccess()) // TODO get failure message into response - response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE)); + response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(), + ContentResponseResult.FAILURE)); else { DeployIndividualPackageResponse individualPackageResponse = new DeployIndividualPackageResponse( - details.getKey(), ContentResponseResult.SUCCESS); + details.getKey(), ContentResponseResult.SUCCESS); response.addPackageResponse(individualPackageResponse); response.setOverallRequestResult(ContentResponseResult.SUCCESS); } - } - else - response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(),ContentResponseResult.FAILURE)); - } - else { - response.addPackageResponse( - new DeployIndividualPackageResponse(details.getKey(), ContentResponseResult.FAILURE)); + } else + response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(), + ContentResponseResult.FAILURE)); + } else { + response.addPackageResponse(new DeployIndividualPackageResponse(details.getKey(), + ContentResponseResult.FAILURE)); } }
- return response; }
@Override public RemovePackagesResponse removePackages(Set<ResourcePackageDetails> packages) { - return null; // TODO: Customise this generated block + return null; // TODO: Customise this generated block }
@Override public Set<ResourcePackageDetails> discoverDeployedPackages(PackageType type) {
- Operation op = new ReadChildrenNames(address,"deployment"); // TODO read full packages not only names + Operation op = new ReadChildrenNames(address, "deployment"); // TODO read full packages not only names Result node = getASConnection().execute(op); if (!node.isSuccess()) return null; @@ -175,11 +186,11 @@ public class ServerGroupComponent extends BaseComponent implements ContentFacet, for (String file : resultList) { String t; if (file.contains(".")) - t = file.substring(file.lastIndexOf(".")+1); + t = file.substring(file.lastIndexOf(".") + 1); else t = "-none-";
- ResourcePackageDetails detail = new ResourcePackageDetails(new PackageDetailsKey(file,"1.0",t,"all")); + ResourcePackageDetails detail = new ResourcePackageDetails(new PackageDetailsKey(file, "1.0", t, "all")); details.add(detail); } return details; @@ -188,11 +199,11 @@ public class ServerGroupComponent extends BaseComponent implements ContentFacet,
@Override public InputStream retrievePackageBits(ResourcePackageDetails packageDetails) { - return null; // TODO: Customise this generated block + return null; // TODO: Customise this generated block }
private String serverGroupFromKey() { String key1 = context.getResourceKey(); - return key1.substring(key1.lastIndexOf("/")+1); + return key1.substring(key1.lastIndexOf("/") + 1); } } diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/nonpc/AbstractIntegrationTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/nonpc/AbstractIntegrationTest.java index 130f7f3..428f854 100644 --- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/nonpc/AbstractIntegrationTest.java +++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/nonpc/AbstractIntegrationTest.java @@ -59,7 +59,7 @@ import org.rhq.modules.plugins.jbossas7.json.PROPERTY_VALUE; * * @author Heiko W. Rupp */ -@Test(groups = {"integration", "nonpc"}, dependsOnGroups = "discovery") +@Test(groups = { "integration", "nonpc" }, dependsOnGroups = "discovery") public abstract class AbstractIntegrationTest {
protected static final String PLUGIN_NAME = "JBossAS7"; @@ -71,19 +71,19 @@ public abstract class AbstractIntegrationTest { protected static final String MAVEN_REPO_LOCAL = System.getProperty("settings.localRepository");
String uploadToAs(String deploymentPath) throws IOException { - ASUploadConnection conn = new ASUploadConnection(DC_HOST, DC_HTTP_PORT, DC_USER, DC_PASS); String fileName = new File(deploymentPath).getName(); - OutputStream os = conn.getOutputStream(fileName); + ASUploadConnection conn = new ASUploadConnection(DC_HOST, DC_HTTP_PORT, DC_USER, DC_PASS, fileName); + OutputStream os = conn.getOutputStream();
-// URL url = getClass().getClassLoader().getResource("."); -// System.out.println(url); + // URL url = getClass().getClassLoader().getResource("."); + // System.out.println(url);
InputStream fis = getClass().getClassLoader().getResourceAsStream(deploymentPath); if (fis == null) { File inputFile = new File(deploymentPath); if (!inputFile.canRead()) { throw new FileNotFoundException("Input stream for path [" + deploymentPath - + "] could not be opened - does the file exist either in the test classpath or on the filesystem?"); + + "] could not be opened - does the file exist either in the test classpath or on the filesystem?"); } fis = new FileInputStream(inputFile); } @@ -96,7 +96,7 @@ public abstract class AbstractIntegrationTest { }
JsonNode node = conn.finishUpload(); -// System.out.println(node); + // System.out.println(node); assert node != null : "No result from upload - node was null"; assert node.has("outcome") : "No outcome from upload"; String outcome = node.get("outcome").getTextValue(); @@ -111,13 +111,12 @@ public abstract class AbstractIntegrationTest { return connection; }
- Operation addDeployment(String deploymentName, String bytes_value) - { + Operation addDeployment(String deploymentName, String bytes_value) { Address deploymentsAddress = new Address("deployment", deploymentName); Operation op = new Operation("add", deploymentsAddress); List<Object> content = new ArrayList<Object>(1); - Map<String,Object> contentValues = new HashMap<String,Object>(); - contentValues.put("hash",new PROPERTY_VALUE("BYTES_VALUE", bytes_value)); + Map<String, Object> contentValues = new HashMap<String, Object>(); + contentValues.put("hash", new PROPERTY_VALUE("BYTES_VALUE", bytes_value)); content.add(contentValues); op.addAdditionalProperty("content", content); op.addAdditionalProperty("name", deploymentName); // this needs to be unique per upload @@ -156,7 +155,8 @@ public abstract class AbstractIntegrationTest { List<ServerDescriptor> servers = pluginDescriptor.getServers();
ServerDescriptor serverDescriptor = findServer(serverName, servers); - assert serverDescriptor != null : "Server descriptor for server [" + serverName + "] not found in test plugin descriptor"; + assert serverDescriptor != null : "Server descriptor for server [" + serverName + + "] not found in test plugin descriptor";
return ConfigurationMetadataParser.parse("null", serverDescriptor.getResourceConfiguration()); } @@ -165,7 +165,8 @@ public abstract class AbstractIntegrationTest { List<ServiceDescriptor> services = pluginDescriptor.getServices();
ServiceDescriptor serviceDescriptor = findService(serviceName, services); - assert serviceDescriptor != null : "Service descriptor for service [" + serviceName + "] not found in plugin descriptor"; + assert serviceDescriptor != null : "Service descriptor for service [" + serviceName + + "] not found in plugin descriptor";
return ConfigurationMetadataParser.parse("null", serviceDescriptor.getResourceConfiguration()); } diff --git a/modules/plugins/netservices/pom.xml b/modules/plugins/netservices/pom.xml index db8f6ba..7805daa 100644 --- a/modules/plugins/netservices/pom.xml +++ b/modules/plugins/netservices/pom.xml @@ -22,7 +22,7 @@ <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> </dependency> <dependency> <groupId>commons-codec</groupId> @@ -50,7 +50,7 @@ <artifactItem> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> + <version>${commons-httpclient.version}</version> </artifactItem> <artifactItem> <groupId>commons-codec</groupId> diff --git a/pom.xml b/pom.xml index 87b833a..0c51f00 100644 --- a/pom.xml +++ b/pom.xml @@ -148,6 +148,7 @@ <shrinkwrap-resolver.version>2.0.0-alpha-7</shrinkwrap-resolver.version> <xercesImpl.version>2.9.1-jbossas-2</xercesImpl.version> <!-- see BZ-820629 and CVE-2009-2625 --> <opencsv.version>1.8</opencsv.version> + <commons-httpclient.version>3.0.1</commons-httpclient.version>
<rhq.db.admin.username>rhqadmin</rhq.db.admin.username> <rhq.db.admin.password>rhqadmin</rhq.db.admin.password> @@ -690,11 +691,11 @@ <artifactId>maven-antrun-plugin</artifactId> <version>1.7</version> <dependencies> - <!-- This includes all the "optional" tasks. --> + <!-- Standard ANT dist (no more "nodeps" since 1.8.2) --> <dependency> <groupId>org.apache.ant</groupId> - <artifactId>ant-nodeps</artifactId> - <version>1.8.1</version> + <artifactId>ant</artifactId> + <version>1.8.4</version> </dependency>
<!-- This includes the <if> task, and a bunch of other handy tasks. -->
commit e554bc75c9a653924a518609c93e8134da32ab87 Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 18 20:08:05 2013 -0500
Try to fix issues in AS5 itests due to shrinkwrap upgrade
diff --git a/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java b/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java index 8b850aa..544c1ce 100644 --- a/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java +++ b/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java @@ -135,8 +135,9 @@ public abstract class AbstractAgentPluginTest extends Arquillian { // Pull in any required plugins from our pom's dependencies.
Collection<RhqAgentPluginArchive> requiredPlugins = Arrays.asList(mavenDependencyResolver - .loadPomFromFile("pom.xml").importRuntimeDependencies(new AcceptScopesStrategy(ScopeType.PROVIDED)) + .loadPomFromFile("pom.xml").importRuntimeAndTestDependencies(new AcceptScopesStrategy(ScopeType.PROVIDED)) .as(RhqAgentPluginArchive.class)); + return ShrinkWrap.create(ZipImporter.class, pluginJarFile.getName()).importFrom(pluginJarFile) .as(RhqAgentPluginArchive.class).withRequiredPluginsFrom(requiredPlugins); } diff --git a/modules/plugins/jboss-as-5/pom.xml b/modules/plugins/jboss-as-5/pom.xml index fff3f1d..2474eec 100644 --- a/modules/plugins/jboss-as-5/pom.xml +++ b/modules/plugins/jboss-as-5/pom.xml @@ -447,7 +447,14 @@ </properties>
<dependencies> - + + <dependency> + <groupId>org.jboss.shrinkwrap.resolver</groupId> + <artifactId>shrinkwrap-resolver-depchain</artifactId> + <type>pom</type> + <scope>test</scope> + </dependency> + </dependencies>
<build>
commit 9b513917ec33631c96a8fe2cfbb135f09984500d Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 18 19:58:27 2013 -0500
trivial, remove commented code
diff --git a/modules/enterprise/server/itests-2/pom.xml b/modules/enterprise/server/itests-2/pom.xml index 8895077..5c0da0d 100644 --- a/modules/enterprise/server/itests-2/pom.xml +++ b/modules/enterprise/server/itests-2/pom.xml @@ -65,8 +65,7 @@ <artifactId>arquillian-testng-container</artifactId> <scope>test</scope> </dependency> - <!-- <dependency> <groupId>org.jboss.shrinkwrap</groupId> <artifactId>shrinkwrap-impl-base</artifactId> <scope>test</scope> - </dependency> --> + <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-depchain</artifactId>
commit 86671512862efc76878f0c137e67ca10ac644405 Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 18 19:58:06 2013 -0500
Update Eclipse .classpath to latest shrinkwrap resolver
diff --git a/.classpath b/.classpath index cd7c799..4d6da55 100644 --- a/.classpath +++ b/.classpath @@ -311,8 +311,8 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/shrinkwrap-api/1.0.1/shrinkwrap-api-1.0.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/shrinkwrap-spi/1.0.1/shrinkwrap-spi-1.0.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/descriptors/shrinkwrap-descriptors-api-base/2.0.0-alpha-3/shrinkwrap-descriptors-api-base-2.0.0-alpha-3.jar"/> - <classpathentry kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/2.0.0-alpha-6/shrinkwrap-resolver-api-2.0.0-alpha-6.jar"/> - <classpathentry kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/2.0.0-alpha-6/shrinkwrap-resolver-api-maven-2.0.0-alpha-6.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/2.0.0-alpha-7/shrinkwrap-resolver-api-2.0.0-alpha-7.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/2.0.0-alpha-7/shrinkwrap-resolver-api-maven-2.0.0-alpha-7.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-spi/1.0.3.Final/arquillian-test-spi-1.0.3.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-api/1.0.3.Final/arquillian-test-api-1.0.3.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/core/arquillian-core-spi/1.0.3.Final/arquillian-core-spi-1.0.3.Final.jar"/>
commit 35fb42d2d85c659f856a2c6c2b00ba3271654a08 Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 18 15:49:32 2013 -0500
[Bug 901700 - RHQ Server resource being named as vanilla standalone AS7 on Windows] Add logic to make the distinction on windows. Since the .bat files don't use the JAVA_OPTS var as does linux, a different approach was needed.
note, I think the -Dapp.name=rhq-server could be taken out of rhq-server-wrapper.conf but I left it in just as another identifier, although it was not easily accessible at discovery time.
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/StandaloneASDiscovery.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/StandaloneASDiscovery.java index 1220aaf..34cd79b 100644 --- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/StandaloneASDiscovery.java +++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/StandaloneASDiscovery.java @@ -18,6 +18,9 @@ */ package org.rhq.modules.plugins.jbossas7;
+import java.io.File; +import java.util.Arrays; + import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails; import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext; import org.rhq.core.system.ProcessInfo; @@ -98,9 +101,22 @@ public class StandaloneASDiscovery extends BaseProcessDiscovery {
private boolean isRhqServer(ProcessInfo process) {
- String javaOpts = process.getEnvironmentVariable("JAVA_OPTS"); + // LINUX + if (File.separatorChar == '/') { + String prop = process.getEnvironmentVariable("JAVA_OPTS"); + return (null != prop && prop.contains("-Dapp.name=rhq-server")); + } + + // Windows + ProcessInfo parentProcess = process.getParentProcess(); + if (null != parentProcess) { + String commandLine = Arrays.toString(parentProcess.getCommandLine()); + if (null != commandLine && commandLine.contains("rhq-server-wrapper.conf")) { + return true; + } + }
- return (null != javaOpts && javaOpts.contains("-Dapp.name=rhq-server")); + return false; }
}
commit 9dc14ed91d0e3fa4260644d649503c522eea0c2e Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 18 15:01:23 2013 -0500
[Bug 797331 - RHQ discovers network adapters that don't exist] It is OK to DISABLE some NetworkAdapters at component start. But do this once-per-start check in a thread because for DOWN adapters this could be a slow call, also the disable() method requires a server round trip. Together this can seemingly hang agent startup (actually plugin container startup) as component starts are done sequentially.
diff --git a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/NetworkAdapterComponent.java b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/NetworkAdapterComponent.java index 72cea4e..a293f2b 100644 --- a/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/NetworkAdapterComponent.java +++ b/modules/plugins/platform/src/main/java/org/rhq/plugins/platform/NetworkAdapterComponent.java @@ -48,10 +48,26 @@ public class NetworkAdapterComponent implements ResourceComponent<PlatformCompon
public void start(ResourceContext<PlatformComponent> resourceContext) { this.context = resourceContext; - if (getInfo().getOperationalStatus()==NetworkAdapterInfo.OperationState.DOWN) { - context.getAvailabilityContext().disable(); - log.info("Disabled " + context.getResourceKey() + " as it was down on start"); - } + + // BZ 797331 - Since we expect some NetworkAdapters to be inactive, just DISABLE them at the start. Do + // this once-per-start check in a thread because for DOWN adapters this could be a slow call, also + // the disable() method requires a server round trip. Together this can seemingly hang agent startup (actually + // plugin container startup) as component starts are done sequentially. + Thread t = new Thread(new Runnable() { + public void run() { + NetworkAdapterInfo.OperationState operationState; + try { + operationState = getInfo().getOperationalStatus(); + } catch (Throwable t) { + operationState = NetworkAdapterInfo.OperationState.DOWN; + } + if (NetworkAdapterInfo.OperationState.DOWN.equals(operationState)) { + context.getAvailabilityContext().disable(); + log.info("Disabled " + context.getResourceKey() + " as it was down at component start"); + } + } + }); + t.start(); }
public void stop() {
commit 7a2eaf9e40731c894c202cf680c27bfd26bd8bc3 Author: Jirka Kremser jkremser@redhat.com Date: Fri Jan 18 18:29:06 2013 +0100
Added itests (regression tests) for BZ 878117
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java index cb349fe..1fbeb3c 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/test/ResourceManagerBeanTest.java @@ -28,12 +28,17 @@ import javax.transaction.SystemException; import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.criteria.ResourceGroupCriteria; import org.rhq.core.domain.resource.Agent; +import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; import org.rhq.core.domain.resource.ResourceError; import org.rhq.core.domain.resource.ResourceErrorType; import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.resource.group.GroupCategory; +import org.rhq.core.domain.resource.group.ResourceGroup; +import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.auth.SessionManager; import org.rhq.enterprise.server.auth.SessionNotFoundException; import org.rhq.enterprise.server.discovery.DiscoveryServerServiceImpl; @@ -41,6 +46,7 @@ import org.rhq.enterprise.server.operation.OperationDefinitionNotFoundException; import org.rhq.enterprise.server.resource.ResourceManagerLocal; import org.rhq.enterprise.server.resource.ResourceNotFoundException; import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException; +import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal; import org.rhq.enterprise.server.resource.group.ResourceGroupNotFoundException; import org.rhq.enterprise.server.resource.group.definition.exception.GroupDefinitionNotFoundException; import org.rhq.enterprise.server.resource.metadata.test.UpdatePluginMetadataTestBase; @@ -54,6 +60,8 @@ import org.rhq.enterprise.server.util.LookupUtil; public class ResourceManagerBeanTest extends UpdatePluginMetadataTestBase { private Subject overlord; private Resource newResource; + private ResourceGroup newGroup; + private ResourceGroupManagerLocal groupManager;
TestServerCommunicationsService agentServiceContainer;
@@ -63,10 +71,15 @@ public class ResourceManagerBeanTest extends UpdatePluginMetadataTestBase {
overlord = LookupUtil.getSubjectManager().getOverlord(); newResource = createNewResourceWithNewType(); + groupManager = LookupUtil.getResourceGroupManager(); + newGroup = createNewGroup(); }
@Override protected void afterMethod() throws Exception { + if (newGroup != null) { + groupManager.deleteResourceGroup(overlord, newGroup.getId()); + } deleteNewResourceAgentResourceType(newResource);
super.afterMethod(); @@ -198,6 +211,67 @@ public class ResourceManagerBeanTest extends UpdatePluginMetadataTestBase { } }
+ public void testAddResorceToGroup() { + ResourceGroupCriteria criteria = new ResourceGroupCriteria(); + criteria.addFilterId(newGroup.getId()); + criteria.fetchExplicitResources(true); + PageList<ResourceGroup> persistedGroups = groupManager.findResourceGroupsByCriteria(overlord, criteria); + assertEquals("There should be just one group with id " + newGroup.getId(), 1, + persistedGroups.size()); + + // equals is based on the name of a group + assertEquals("Persisted group should be the same as the group created in before method.", newGroup, + persistedGroups.get(0)); + assertEquals("There should be no explicit members in the newly created group.", 0, persistedGroups.get(0) + .getExplicitResources().size()); + + // add resource to group + groupManager.addResourcesToGroup(overlord, newGroup.getId(), new int[] { newResource.getId() }); + persistedGroups = groupManager.findResourceGroupsByCriteria(overlord, criteria); + assertEquals("There should be one member in the newly created group.", 1, persistedGroups.get(0).getExplicitResources() + .size()); + } + + public void testResourceUninventorization() { + // partly a regression test for BZ 878117 + ResourceGroupCriteria criteria = new ResourceGroupCriteria(); + criteria.addFilterId(newGroup.getId()); + criteria.fetchExplicitResources(true); + PageList<ResourceGroup> persistedGroups = groupManager.findResourceGroupsByCriteria(overlord, criteria); + assertEquals("There should be just one group with id " + newGroup.getId(), 1, + persistedGroups.size()); + assertEquals("An empty group is considered as MIXED.", GroupCategory.MIXED, persistedGroups.get(0) + .getGroupCategory()); + + // add resource to group + groupManager.addResourcesToGroup(overlord, persistedGroups.get(0).getId(), new int[] { newResource.getId() }); + persistedGroups = groupManager.findResourceGroupsByCriteria(overlord, criteria); + assertEquals("A group with just one explicit member is considered as COMPATIBLE.", GroupCategory.COMPATIBLE, + persistedGroups.get(0).getGroupCategory()); + + // now uninventorize the only resource + resourceManager.uninventoryResource(overlord, newResource.getId()); + persistedGroups = groupManager.findResourceGroupsByCriteria(overlord, criteria); + assertEquals("An empty group is considered as MIXED.", GroupCategory.MIXED, persistedGroups.get(0) + .getGroupCategory()); + } + + public void testResourceRemovalFromGroup() { + ResourceGroup persistedGroup = groupManager.getResourceGroup(overlord, newGroup.getId()); + assertEquals("An empty group is considered as MIXED.", GroupCategory.MIXED, persistedGroup.getGroupCategory()); + + // add resource to group + groupManager.addResourcesToGroup(overlord, persistedGroup.getId(), new int[] { newResource.getId() }); + persistedGroup = groupManager.getResourceGroup(overlord, newGroup.getId()); + assertEquals("A group with just one explicit member is considered as COMPATIBLE.", GroupCategory.COMPATIBLE, + persistedGroup.getGroupCategory()); + + // now remove the only resource from the group + groupManager.removeResourcesFromGroup(overlord, persistedGroup.getId(), new int[] { newResource.getId() }); + persistedGroup = groupManager.getResourceGroup(overlord, newGroup.getId()); + assertEquals("An empty group is considered as MIXED.", GroupCategory.MIXED, persistedGroup.getGroupCategory()); + } + private int givenASampleResourceHierarchy() throws NotSupportedException, SystemException { getTransactionManager().begin();
@@ -272,6 +346,7 @@ public class ResourceManagerBeanTest extends UpdatePluginMetadataTestBase { resource = new Resource("reskey" + System.currentTimeMillis(), "resname", resourceType); resource.setUuid("" + new Random().nextInt()); resource.setAgent(agent); + resource.setInventoryStatus(InventoryStatus.COMMITTED); em.persist(resource); } catch (Exception e) { System.out.println("CANNOT PREPARE TEST: " + e); @@ -284,6 +359,12 @@ public class ResourceManagerBeanTest extends UpdatePluginMetadataTestBase { return resource; }
+ private ResourceGroup createNewGroup() { + ResourceGroup group = new ResourceGroup("testGroup"); + groupManager.createResourceGroup(overlord, group); + return group; + } + private void deleteNewResourceAgentResourceType(Resource resource) throws Exception { if (resource != null) { getTransactionManager().begin();
commit 9e0eea5e5792f7113f6d7fe4cc4b51c8f60386f2 Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 18 09:19:04 2013 -0500
Let arquillian/shrinkwrap dependency mgmt be handled by the root pom, because there is specific ordering in place to use newer shrinkwrap resolver than what the arquillian-bom pulls in.
diff --git a/modules/plugins/jboss-as-5/pom.xml b/modules/plugins/jboss-as-5/pom.xml index 4dbe87c..fff3f1d 100644 --- a/modules/plugins/jboss-as-5/pom.xml +++ b/modules/plugins/jboss-as-5/pom.xml @@ -28,16 +28,6 @@
<dependencyManagement> <dependencies> - - <!-- This will pull in the compatible versions of the shrinkwrap and shrinkwrap-resolver deps too. --> - <dependency> - <groupId>org.jboss.arquillian</groupId> - <artifactId>arquillian-bom</artifactId> - <version>${arquillian.version}</version> - <type>pom</type> - <scope>import</scope> - </dependency> - <dependency> <groupId>org.jboss.jbossas</groupId> <artifactId>jboss-as-parent</artifactId>
commit c5539a4d9ff8304230fa1571de4dc336c6278ee4 Author: Jirka Kremser jkremser@redhat.com Date: Fri Jan 18 14:50:07 2013 +0100
[BZ 880960 - SNMP Trap notifications sent from JON using incorrect port] typo: default port for snmptrapd has been set to 162
diff --git a/modules/enterprise/server/plugins/alert-snmp/src/main/java/org/rhq/enterprise/server/plugins/alertSnmp/SnmpTrapSender.java b/modules/enterprise/server/plugins/alert-snmp/src/main/java/org/rhq/enterprise/server/plugins/alertSnmp/SnmpTrapSender.java index 53bfd85..92fc838 100644 --- a/modules/enterprise/server/plugins/alert-snmp/src/main/java/org/rhq/enterprise/server/plugins/alertSnmp/SnmpTrapSender.java +++ b/modules/enterprise/server/plugins/alert-snmp/src/main/java/org/rhq/enterprise/server/plugins/alertSnmp/SnmpTrapSender.java @@ -340,7 +340,7 @@ public class SnmpTrapSender implements PDUFactory { // TODO: Make transport configurable (ips, 09/12/07).
String host = properties.getSimpleValue("host",null); - String portS = properties.getSimpleValue("port","161"); + String portS = properties.getSimpleValue("port","162"); Integer port = Integer.valueOf(portS);
final String transport = UDP_TRANSPORT;
commit 263bbd7c7543935c9ef0d82c17f04d31c28d05fc Author: Jirka Kremser jkremser@redhat.com Date: Fri Jan 18 12:12:34 2013 +0100
Trivial: comments added for changes made in commit 091b0903f
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java index b5a185f..fd41368 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java @@ -380,6 +380,7 @@ public class ResourceSearchView extends Table {
protected void onUninventorySuccess() { refresh(true); + // the group type may have changed CoreGUI.refresh(); }
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java index a08e0d2..1c6409e 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java @@ -467,7 +467,10 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage }
private boolean uninventoryResourcesBulkDelete(Subject overlord, List<Integer> resourceIds) { - // obtain group ids of affected groups + // Obtain group ids of affected groups, i.e. groups where resources act as the explicit resources. + // The RHQ_RESOURCE_GROUP_RES_EXP_MAP table is used, because the resource type of a group is set to a + // non null value iff the number of unique resource types of the member _EXPLICIT_ resources is equal to 1. + // In other words, the implicit resources of a group have no impact on the group type (compatible/mixed). Query nativeQuery = entityManager.createNativeQuery(ResourceGroup.QUERY_GET_GROUP_IDS_BY_RESOURCE_IDS); nativeQuery.setParameter("resourceIds", resourceIds); List<Integer> groupIds = nativeQuery.getResultList(); @@ -484,7 +487,7 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage resourceIds); }
- // update the resource type on affected groups + // update the resource type of affected groups by calling setResouceType() for (int groupId : groupIds) { try { resourceGroupManager.setResourceType(groupId);
commit e589761e0751ff4253231f7f79d550e1631db8c0 Author: Jay Shaughnessy jshaughn@redhat.com Date: Thu Jan 17 16:15:16 2013 -0500
Updates to move to Shrinkwrap 2 API and get associated SW fixes. - change poms to use the shrinkwrap-resolver-depchain pom dep in order to suck in the necessary jars - other minor 2.0 API tweaks
diff --git a/modules/core/arquillian-integration/container/pom.xml b/modules/core/arquillian-integration/container/pom.xml index f01d018..36be907 100644 --- a/modules/core/arquillian-integration/container/pom.xml +++ b/modules/core/arquillian-integration/container/pom.xml @@ -53,18 +53,15 @@
<dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api-maven</artifactId> + <artifactId>shrinkwrap-resolver-impl-maven</artifactId> + <scope>compile</scope> </dependency>
<dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-impl-maven</artifactId> - <scope>compile</scope> + <artifactId>shrinkwrap-resolver-depchain</artifactId> + <type>pom</type> + <scope>test</scope> </dependency>
<!-- org.rhq --> diff --git a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java index 779a9e5..a07c139 100644 --- a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java +++ b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java @@ -26,12 +26,11 @@ import java.util.UUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
-import org.jboss.shrinkwrap.api.Archive; -import org.jboss.shrinkwrap.api.exporter.ExplodedExporter; -import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact; import org.jboss.shrinkwrap.resolver.api.maven.MavenResolverSystem;
+import org.rhq.core.util.ZipUtil; import org.rhq.core.util.file.FileUtil;
/** @@ -47,7 +46,7 @@ public class SigarInstaller { private static final String TMP_DIR = System.getProperty("java.io.tmpdir");
private File rootDir; - private Archive<?> sigarDistArtifact; + private MavenResolvedArtifact sigarDistArtifact;
public SigarInstaller(File rootDir) { this.rootDir = rootDir; @@ -60,7 +59,7 @@ public class SigarInstaller { // artifact specifier format is "<groupId>:<artifactId>[:<extension>[:<classifier>]][:<version >]" // TODO (ips, 05/02/12): Figure out how to make this work without hard-coding the version. sigarDistArtifact = mavenDependencyResolver.offline().loadPomFromFile("pom.xml") - .resolve("org.hyperic:sigar-dist:zip:1.6.5.132-3").withoutTransitivity().asSingle(JavaArchive.class); + .resolve("org.hyperic:sigar-dist:zip:1.6.5.132-3").withoutTransitivity().asSingleResolvedArtifact(); }
public boolean isSigarAvailable() { @@ -74,12 +73,14 @@ public class SigarInstaller { if (!tempDir.exists()) { tempDir.mkdirs(); } - String explodedDirName = "sigar-dist"; - LOG.debug("Unzipping " + sigarDistArtifact + " to " + tempDir + "..."); - sigarDistArtifact.as(ExplodedExporter.class).exportExploded(tempDir, explodedDirName); + File sigarLibDir = null; try { - sigarLibDir = findSigarLibDir(new File(tempDir, explodedDirName)); + File explodedDir = new File(tempDir, "sigar-dist"); + LOG.debug("Unzipping " + sigarDistArtifact + " to " + tempDir + "..."); + ZipUtil.unzipFile(sigarDistArtifact.asFile(), explodedDir); + + sigarLibDir = findSigarLibDir(explodedDir); // Make sure the target dir does not exist, since FileUtil.copyDirectory() requires that to be the case. FileUtil.purge(rootDir, true);
diff --git a/modules/core/domain/pom.xml b/modules/core/domain/pom.xml index d8fd034..5b2bc60 100644 --- a/modules/core/domain/pom.xml +++ b/modules/core/domain/pom.xml @@ -127,29 +127,9 @@ </dependency>
<dependency> - <groupId>org.jboss.shrinkwrap</groupId> - <artifactId>shrinkwrap-impl-base</artifactId> - <scope>test</scope> - </dependency> - - <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api</artifactId> - <version>${shrinkwrap-resolver.version}</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api-maven</artifactId> - <version>${shrinkwrap-resolver.version}</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-impl-maven</artifactId> - <version>${shrinkwrap-resolver.version}</version> + <artifactId>shrinkwrap-resolver-depchain</artifactId> + <type>pom</type> <scope>test</scope> </dependency>
diff --git a/modules/core/plugin-test-api/pom.xml b/modules/core/plugin-test-api/pom.xml index 0307c46..5d80afc 100644 --- a/modules/core/plugin-test-api/pom.xml +++ b/modules/core/plugin-test-api/pom.xml @@ -74,28 +74,9 @@ </dependency>
<dependency> - <groupId>org.jboss.shrinkwrap</groupId> - <artifactId>shrinkwrap-api</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap</groupId> - <artifactId>shrinkwrap-impl-base</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api</artifactId> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api-maven</artifactId> - </dependency> - - <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-impl-maven</artifactId> + <artifactId>shrinkwrap-resolver-depchain</artifactId> + <type>pom</type> </dependency>
</dependencies> diff --git a/modules/integration-tests/jndi-access/jndi-access-test/pom.xml b/modules/integration-tests/jndi-access/jndi-access-test/pom.xml index a0cffa7..b619cb2 100644 --- a/modules/integration-tests/jndi-access/jndi-access-test/pom.xml +++ b/modules/integration-tests/jndi-access/jndi-access-test/pom.xml @@ -107,27 +107,10 @@ </dependency>
<dependency> - <groupId>org.jboss.shrinkwrap</groupId> - <artifactId>shrinkwrap-api</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api-maven</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-impl-maven</artifactId> - <scope>test</scope> + <groupId>org.jboss.shrinkwrap.resolver</groupId> + <artifactId>shrinkwrap-resolver-depchain</artifactId> + <type>pom</type> + <scope>test</scope> </dependency>
<!-- We'll try remote connections using JNP -->
commit c6d6f8315e2955feab237cf883630e5932624987 Author: Jay Shaughnessy jshaughn@redhat.com Date: Thu Jan 17 14:28:26 2013 -0500
trivial code tweak while debugging tests
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java index 0444ea0..5d3bf77 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MetadataBeanTest.java @@ -64,8 +64,9 @@ public class MetadataBeanTest extends AbstractEJB3Test { protected void afterClassWork() throws Exception { PluginManagerLocal pluginMgr = LookupUtil.getPluginManager(); Subject overlord = LookupUtil.getSubjectManager().getOverlord(); - pluginMgr.deletePlugins(overlord, new ArrayList(pluginIds)); - pluginMgr.markPluginsForPurge(overlord, new ArrayList(pluginIds)); + List<Integer> doomedPlugins = new ArrayList<Integer>(pluginIds); + pluginMgr.deletePlugins(overlord, doomedPlugins); + pluginMgr.markPluginsForPurge(overlord, new ArrayList(doomedPlugins)); new PurgeResourceTypesJob().executeJobCode(null); new PurgePluginsJob().executeJobCode(null);
commit 7f48ab51203b91165a4516d7dc702ace16670c3a Author: Jay Shaughnessy jshaughn@redhat.com Date: Thu Jan 17 14:27:51 2013 -0500
Add back in the test-jar dep that does not get pulled automatically. The new version of shrinkwrap did not change the behavior. I don't know if it's a bug or not, maybe not.
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index 9a92ab0..b1b3aaf 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -360,12 +360,10 @@ public abstract class AbstractEJB3Test extends Arquillian { .as(JavaArchive.class))); }
- // Transitive deps required by the above and for some reason not sucked in. Note that - // these require an explicit version. TODO (jshaughn): Can we make these transitive or - // avoid the explicit version? - // dep required byt rhq-core-client-api test-jar - //dependencies.addAll(Arrays.asList(resolver.resolve("commons-jxpath:commons-jxpath:1.3").withTransitivity() - // .as(JavaArchive.class))); + // Transitive test dep required by rhq-core-client-api above and for some reason not sucked in. + // TODO: pass in version from pom property + dependencies.addAll(Arrays.asList(resolver.resolve("commons-jxpath:commons-jxpath:1.3").withTransitivity() + .as(JavaArchive.class)));
// exclude any transitive deps we don't want String[] excludeFilters = { "testng.*jdk", "rhq-core-domain.*jar" };
commit bf58bca419d78a07137c3f4465937a78fc2ea418 Author: Jay Shaughnessy jshaughn@redhat.com Date: Thu Jan 17 11:03:31 2013 -0500
Shrinkwrap-resolver 2.0.0-alpha-7 is released and should contain fixes for our reported issues. Update version and retest.
diff --git a/modules/enterprise/server/itests-2/pom.xml b/modules/enterprise/server/itests-2/pom.xml index 4e7acbb..8895077 100644 --- a/modules/enterprise/server/itests-2/pom.xml +++ b/modules/enterprise/server/itests-2/pom.xml @@ -34,30 +34,6 @@ <liquibase.version>2.0.3</liquibase.version> </properties>
- <!-- In Shrinkwrap 2.0.0-alpha-6 it's necessary to provide a depMgmt entry in order for the resolver to determine the version. - So, do that for the 3rd party libs we need to add to the deployment jar. --> - <dependencyManagement> - <dependencies> - <dependency> - <groupId>joda-time</groupId> - <artifactId>joda-time</artifactId> - <version>2.1</version> - </dependency> - - <dependency> - <groupId>org.liquibase</groupId> - <artifactId>liquibase-core</artifactId> - <version>${liquibase.version}</version> - </dependency> - - <dependency> - <groupId>org.powermock</groupId> - <artifactId>powermock-api-mockito</artifactId> - <version>${powermock.version}</version> - </dependency> - </dependencies> - </dependencyManagement> - <dependencies> <!--================ Test Deps ================ -->
@@ -198,6 +174,7 @@ <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> + <version>${powermock.version}</version> <scope>test</scope> </dependency>
@@ -210,12 +187,14 @@ <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> + <version>${liquibase.version}</version> <scope>test</scope> </dependency>
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> + <version>2.1</version> <scope>test</scope> </dependency> </dependencies> diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index 28c75bb..9a92ab0 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -337,7 +337,7 @@ public abstract class AbstractEJB3Test extends Arquillian { thirdPartyDeps.add("org.liquibase:liquibase-core"); thirdPartyDeps.add("org.powermock:powermock-api-mockito"); thirdPartyDeps.add("org.rhq.helpers:perftest-support:" + projectVersion); - //thirdPartyDeps.add("org.rhq:rhq-core-client-api:jar:tests:" + projectVersion); + thirdPartyDeps.add("org.rhq:rhq-core-client-api:jar:tests:" + projectVersion); thirdPartyDeps.add("org.rhq:test-utils:" + projectVersion);
MavenResolverSystem resolver = Maven.resolver(); @@ -346,12 +346,6 @@ public abstract class AbstractEJB3Test extends Arquillian { dependencies.addAll(Arrays.asList(resolver.loadPomFromFile("pom.xml").resolve(thirdPartyDeps) .withTransitivity().as(JavaArchive.class)));
- System.out.println("******* " - + Arrays.asList(resolver.loadPomFromFile("pom.xml") - .resolve("org.rhq:rhq-core-client-api:jar:tests:" + projectVersion).withTransitivity() - .as(JavaArchive.class))); - System.out.println("******* "); - // If we're running oracle we need to include the OJDBC driver because dbunit needs it. Note that we need // add it explicitly even though it is a provided module used by the datasource. if (!Boolean.valueOf(System.getProperty("rhq.skip.oracle"))) { @@ -383,7 +377,7 @@ public abstract class AbstractEJB3Test extends Arquillian { //System.out.println("** The Deployment EAR: " + testEar.toString(true) + "\n");
// Save the test EAR to a zip file for inspection (set file explicitly) - exportZip(testEar, new File("c:/temp/test-ear.ear")); + //exportZip(testEar, new File("c:/temp/test-ear.ear"));
return testEar; } diff --git a/pom.xml b/pom.xml index 21ea002..87b833a 100644 --- a/pom.xml +++ b/pom.xml @@ -145,7 +145,7 @@ <freemarker.version>2.3.18</freemarker.version> <powermock.version>1.4.12</powermock.version> <arquillian.version>1.0.3.Final</arquillian.version> - <shrinkwrap-resolver.version>2.0.0-alpha-6</shrinkwrap-resolver.version> + <shrinkwrap-resolver.version>2.0.0-alpha-7</shrinkwrap-resolver.version> <xercesImpl.version>2.9.1-jbossas-2</xercesImpl.version> <!-- see BZ-820629 and CVE-2009-2625 --> <opencsv.version>1.8</opencsv.version>
commit aab423814949cfaeea2d7c518e815e15f887dd8f Author: Jay Shaughnessy jshaughn@redhat.com Date: Fri Jan 11 15:31:54 2013 -0500
Initial conversion to Shrinkwrap 2 API
diff --git a/.classpath b/.classpath index 128fe61..cd7c799 100644 --- a/.classpath +++ b/.classpath @@ -311,17 +311,17 @@ <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/shrinkwrap-api/1.0.1/shrinkwrap-api-1.0.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/shrinkwrap-spi/1.0.1/shrinkwrap-spi-1.0.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/descriptors/shrinkwrap-descriptors-api-base/2.0.0-alpha-3/shrinkwrap-descriptors-api-base-2.0.0-alpha-3.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/1.0.0-beta-7/shrinkwrap-resolver-api-1.0.0-beta-7.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/1.0.0-beta-7/shrinkwrap-resolver-api-maven-1.0.0-beta-7.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-spi/1.0.2.Final/arquillian-test-spi-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-api/1.0.2.Final/arquillian-test-api-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/core/arquillian-core-spi/1.0.2.Final/arquillian-core-spi-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/core/arquillian-core-api/1.0.2.Final/arquillian-core-api-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/container/arquillian-container-spi/1.0.2.Final/arquillian-container-spi-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/container/arquillian-container-test-api/1.0.2.Final/arquillian-container-test-api-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/config/arquillian-config-api/1.0.2.Final/arquillian-config-api-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/container/arquillian-container-test-impl-base/1.0.2.Final/arquillian-container-test-impl-base-1.0.2.Final.jar"/> - <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/testng/arquillian-testng-core/1.0.2.Final/arquillian-testng-core-1.0.2.Final.jar"/> + <classpathentry kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api/2.0.0-alpha-6/shrinkwrap-resolver-api-2.0.0-alpha-6.jar"/> + <classpathentry kind="var" path="M2_REPO/org/jboss/shrinkwrap/resolver/shrinkwrap-resolver-api-maven/2.0.0-alpha-6/shrinkwrap-resolver-api-maven-2.0.0-alpha-6.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-spi/1.0.3.Final/arquillian-test-spi-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/test/arquillian-test-api/1.0.3.Final/arquillian-test-api-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/core/arquillian-core-spi/1.0.3.Final/arquillian-core-spi-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/core/arquillian-core-api/1.0.3.Final/arquillian-core-api-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/container/arquillian-container-spi/1.0.3.Final/arquillian-container-spi-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/container/arquillian-container-test-api/1.0.3.Final/arquillian-container-test-api-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/config/arquillian-config-api/1.0.3.Final/arquillian-config-api-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/container/arquillian-container-test-impl-base/1.0.3.Final/arquillian-container-test-impl-base-1.0.3.Final.jar"/> + <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/arquillian/testng/arquillian-testng-core/1.0.3.Final/arquillian-testng-core-1.0.3.Final.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/byteman/byteman/1.2.1/byteman-1.2.1.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/ejb3/jboss-ejb3-ext-api/2.0.0/jboss-ejb3-ext-api-2.0.0.jar"/> <classpathentry exported="true" kind="var" path="M2_REPO/org/jboss/spec/javax/ejb/jboss-ejb-api_3.1_spec/1.0.2.Final/jboss-ejb-api_3.1_spec-1.0.2.Final.jar"/> diff --git a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java index 97b6df8..779a9e5 100644 --- a/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java +++ b/modules/core/arquillian-integration/container/src/main/java/org/rhq/test/arquillian/impl/util/SigarInstaller.java @@ -21,7 +21,6 @@ package org.rhq.test.arquillian.impl.util; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; -import java.util.Collection; import java.util.UUID;
import org.apache.commons.logging.Log; @@ -30,8 +29,8 @@ import org.apache.commons.logging.LogFactory; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.exporter.ExplodedExporter; import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.jboss.shrinkwrap.resolver.api.DependencyResolvers; -import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.MavenResolverSystem;
import org.rhq.core.util.file.FileUtil;
@@ -56,21 +55,12 @@ public class SigarInstaller { }
private void init() { - MavenDependencyResolver mavenDependencyResolver = DependencyResolvers.use(MavenDependencyResolver.class); + MavenResolverSystem mavenDependencyResolver = Maven.resolver();
// artifact specifier format is "<groupId>:<artifactId>[:<extension>[:<classifier>]][:<version >]" - Collection<JavaArchive> sigars = mavenDependencyResolver - .loadMetadataFromPom("pom.xml") - .goOffline() - // TODO (ips, 05/02/12): Figure out how to make this work without hard-coding the version. - .artifact("org.hyperic:sigar-dist:zip:1.6.5.132-3") - .resolveAs(JavaArchive.class); - - if (sigars.size() > 1) { - LOG.warn("More than 1 org.hyperic:sigar-dist artifact found in the current POM: " + sigars); - } - - sigarDistArtifact = sigars.iterator().next(); + // TODO (ips, 05/02/12): Figure out how to make this work without hard-coding the version. + sigarDistArtifact = mavenDependencyResolver.offline().loadPomFromFile("pom.xml") + .resolve("org.hyperic:sigar-dist:zip:1.6.5.132-3").withoutTransitivity().asSingle(JavaArchive.class); }
public boolean isSigarAvailable() { diff --git a/modules/core/arquillian-integration/container/src/test/java/org/rhq/test/arquillian/RhqAgentPluginContainerTest.java b/modules/core/arquillian-integration/container/src/test/java/org/rhq/test/arquillian/RhqAgentPluginContainerTest.java index 6c71d6b..8472981 100644 --- a/modules/core/arquillian-integration/container/src/test/java/org/rhq/test/arquillian/RhqAgentPluginContainerTest.java +++ b/modules/core/arquillian-integration/container/src/test/java/org/rhq/test/arquillian/RhqAgentPluginContainerTest.java @@ -12,9 +12,9 @@ import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.jboss.shrinkwrap.resolver.api.DependencyResolvers; -import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver; -import org.jboss.shrinkwrap.resolver.api.maven.filter.ScopeFilter; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.ScopeType; +import org.jboss.shrinkwrap.resolver.api.maven.strategy.AcceptScopesStrategy;
import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceCategory; @@ -43,9 +43,8 @@ public class RhqAgentPluginContainerTest extends Arquillian { .addClasses(TestDiscoveryComponent.class, TestResourceComponent.class) .setPluginDescriptor("test-dependent-rhq-plugin.xml") .withRequiredPluginsFrom( - DependencyResolvers.use(MavenDependencyResolver.class) - .includeDependenciesFromPom("pom.xml") - .resolveAs(JavaArchive.class, new ScopeFilter("test"))); + Maven.resolver().loadPomFromFile("pom.xml") + .importRuntimeAndTestDependencies(new AcceptScopesStrategy(ScopeType.TEST)).as(JavaArchive.class)); }
@Deployment(name = "manuallyDeployed", managed = false) @@ -66,13 +65,13 @@ public class RhqAgentPluginContainerTest extends Arquillian {
@ResourceComponentInstances(plugin = "testDependentPlugin", resourceType = "TestServer") private Set<TestResourceComponent> dependentComponents; - + @ResourceContainers(plugin = "testDependentPlugin", resourceType = "TestServer") private Set<ResourceContainer> dependentResourceContainers; - + @ArquillianResource private ContainerController pcController; - + @ArquillianResource private Deployer pluginDeployer;
@@ -106,15 +105,15 @@ public class RhqAgentPluginContainerTest extends Arquillian { public void testResourceContainersAssigned() { Assert.assertEquals(dependentResourceContainers.size(), 1, "There should be one resource container available"); } - + @Test public void manualDeployment() { pluginDeployer.deploy("manuallyDeployed");
pluginContainer.getInventoryManager().executeServerScanImmediately();
- ResourceType expectedResourceType = - new ResourceType("TestServer", "testManualPlugin", ResourceCategory.SERVER, null); + ResourceType expectedResourceType = new ResourceType("TestServer", "testManualPlugin", ResourceCategory.SERVER, + null);
Set<Resource> resources = pluginContainer.getInventoryManager().getResourcesWithType(expectedResourceType);
diff --git a/modules/core/domain/pom.xml b/modules/core/domain/pom.xml index 23d5fe0..d8fd034 100644 --- a/modules/core/domain/pom.xml +++ b/modules/core/domain/pom.xml @@ -135,18 +135,21 @@ <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-api</artifactId> + <version>${shrinkwrap-resolver.version}</version> <scope>test</scope> </dependency>
<dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-api-maven</artifactId> + <version>${shrinkwrap-resolver.version}</version> <scope>test</scope> </dependency>
<dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> <artifactId>shrinkwrap-resolver-impl-maven</artifactId> + <version>${shrinkwrap-resolver.version}</version> <scope>test</scope> </dependency>
diff --git a/modules/core/domain/src/test/java/org/rhq/core/domain/test/AbstractEJB3Test.java b/modules/core/domain/src/test/java/org/rhq/core/domain/test/AbstractEJB3Test.java index 4eff131..8b7b57c 100644 --- a/modules/core/domain/src/test/java/org/rhq/core/domain/test/AbstractEJB3Test.java +++ b/modules/core/domain/src/test/java/org/rhq/core/domain/test/AbstractEJB3Test.java @@ -2,6 +2,8 @@ package org.rhq.core.domain.test;
import java.io.File; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashSet; @@ -29,8 +31,8 @@ import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.jboss.shrinkwrap.resolver.api.DependencyResolvers; -import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.MavenResolverSystem;
import org.rhq.core.domain.shared.TransactionCallback; import org.rhq.core.util.MessageDigestGenerator; @@ -105,16 +107,20 @@ public abstract class AbstractEJB3Test extends Arquillian { // we still end up having to do some exclusion filtering. Since Shrinkwrap has weak and buggy // filtering, we have some homegrown filtering methods below. // TODO: Is there any way to not have to specify the versions for the transitive deps? This is brittle as is. + // Can pass the version in as a system prop if necessary...
//load 3rd party deps explicitly - MavenDependencyResolver resolver = DependencyResolvers.use(MavenDependencyResolver.class); - resolver.loadMetadataFromPom("pom.xml"); + Collection thirdPartyDeps = new ArrayList(); + thirdPartyDeps.add("commons-beanutils:commons-beanutils:1.8.2"); + thirdPartyDeps.add("commons-codec:commons-codec"); + thirdPartyDeps.add("commons-io:commons-io"); + thirdPartyDeps.add("org.unitils:unitils-testng:3.1"); + + MavenResolverSystem resolver = Maven.resolver(); + Collection<JavaArchive> dependencies = new HashSet<JavaArchive>(); - dependencies - .addAll(resolver.artifact("commons-beanutils:commons-beanutils:1.8.2").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("commons-codec:commons-codec").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("commons-io:commons-io").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("org.unitils:unitils-testng:3.1").resolveAs(JavaArchive.class)); + dependencies.addAll(Arrays.asList(resolver.loadPomFromFile("pom.xml").resolve(thirdPartyDeps) + .withTransitivity().as(JavaArchive.class)));
String[] excludeFilters = { "testng.*jdk" };
diff --git a/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java b/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java index e60349c..8b850aa 100644 --- a/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java +++ b/modules/core/plugin-test-util/src/main/java/org/rhq/core/plugin/testutil/AbstractAgentPluginTest.java @@ -50,8 +50,10 @@ import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.importer.ZipImporter; -import org.jboss.shrinkwrap.resolver.api.DependencyResolvers; -import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.MavenResolverSystem; +import org.jboss.shrinkwrap.resolver.api.maven.ScopeType; +import org.jboss.shrinkwrap.resolver.api.maven.strategy.AcceptScopesStrategy;
import org.rhq.core.clientapi.agent.PluginContainerException; import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest; @@ -116,14 +118,10 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
@Deployment(name = "platform", order = 1) public static RhqAgentPluginArchive getPlatformPlugin() throws Exception { - MavenDependencyResolver mavenDependencyResolver = DependencyResolvers.use(MavenDependencyResolver.class); + MavenResolverSystem mavenDependencyResolver = Maven.resolver(); String platformPluginArtifact = "org.rhq:rhq-platform-plugin:jar:" + getRhqVersion(); - Collection<RhqAgentPluginArchive> plugins = mavenDependencyResolver - .loadMetadataFromPom("pom.xml") - .goOffline() - .artifact(platformPluginArtifact) - .resolveAs(RhqAgentPluginArchive.class); - return plugins.iterator().next(); + return mavenDependencyResolver.offline().loadPomFromFile("pom.xml").resolve(platformPluginArtifact) + .withoutTransitivity().asSingle(RhqAgentPluginArchive.class); }
@Deployment(name = "pluginUnderTest", order = 2) @@ -133,14 +131,12 @@ public abstract class AbstractAgentPluginTest extends Arquillian { // jar, freshly assembled from the classes being tested. File pluginJarFile = getPluginJarFile(); System.out.println("Using plugin jar [" + pluginJarFile + "]..."); - MavenDependencyResolver mavenDependencyResolver = DependencyResolvers.use(MavenDependencyResolver.class); + MavenResolverSystem mavenDependencyResolver = Maven.resolver(); // Pull in any required plugins from our pom's dependencies. - Collection<RhqAgentPluginArchive> requiredPlugins = mavenDependencyResolver - .loadMetadataFromPom("pom.xml") - //.goOffline() - .includeDependenciesFromPom("pom.xml") - .scope("provided") - .resolveAs(RhqAgentPluginArchive.class); + + Collection<RhqAgentPluginArchive> requiredPlugins = Arrays.asList(mavenDependencyResolver + .loadPomFromFile("pom.xml").importRuntimeDependencies(new AcceptScopesStrategy(ScopeType.PROVIDED)) + .as(RhqAgentPluginArchive.class)); return ShrinkWrap.create(ZipImporter.class, pluginJarFile.getName()).importFrom(pluginJarFile) .as(RhqAgentPluginArchive.class).withRequiredPluginsFrom(requiredPlugins); } @@ -171,8 +167,10 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
try { this.serverServices.resetMocks(); - Mockito.when(this.serverServices.getDiscoveryServerService().mergeInventoryReport(Mockito.any(InventoryReport.class))).then( - serverInventory.mergeInventoryReport(InventoryStatus.COMMITTED)); + Mockito.when( + this.serverServices.getDiscoveryServerService() + .mergeInventoryReport(Mockito.any(InventoryReport.class))).then( + serverInventory.mergeInventoryReport(InventoryStatus.COMMITTED)); } catch (Exception e) { e.printStackTrace(); } @@ -201,12 +199,11 @@ public abstract class AbstractAgentPluginTest extends Arquillian { * @return the report containing the collected data */ @NotNull - protected AvailabilityType getAvailability(Resource resource) - throws PluginContainerException { + protected AvailabilityType getAvailability(Resource resource) throws PluginContainerException { ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); long timeoutMillis = 5000; AvailabilityFacet availFacet = resourceContainer.createResourceComponentProxy(AvailabilityFacet.class, - FacetLockType.READ, timeoutMillis, false, false); + FacetLockType.READ, timeoutMillis, false, false); AvailabilityType avail; try { avail = availFacet.getAvailability(); @@ -227,31 +224,31 @@ public abstract class AbstractAgentPluginTest extends Arquillian { * @return the result of the operation */ @NotNull - protected OperationResult invokeOperation(Resource resource, String operationName, @Nullable Configuration params) - throws PluginContainerException { + protected OperationResult invokeOperation(Resource resource, String operationName, @Nullable + Configuration params) throws PluginContainerException { ResourceType resourceType = resource.getResourceType(); OperationDefinition operationDefinition = ResourceTypeUtility.getOperationDefinition(resourceType, - operationName); - assertNotNull(operationDefinition, "No operation named [" + operationName - + "] is defined for ResourceType {" + resourceType.getPlugin() + "}" + resourceType.getName() + "."); + operationName); + assertNotNull(operationDefinition, "No operation named [" + operationName + "] is defined for ResourceType {" + + resourceType.getPlugin() + "}" + resourceType.getName() + ".");
long timeout = getDefaultTimeout(resource.getResourceType(), operationName); System.out.println("=== Invoking operation [" + operationName + "] with parameters [" - + ((params != null) ? params.toString(true) : params) + "] on " + resource + "..."); + + ((params != null) ? params.toString(true) : params) + "] on " + resource + "..."); ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); long timeoutMillis = timeout * 1000; OperationFacet operationFacet = resourceContainer.createResourceComponentProxy(OperationFacet.class, - FacetLockType.WRITE, timeoutMillis, false, false); + FacetLockType.WRITE, timeoutMillis, false, false); OperationResult operationResult; try { operationResult = operationFacet.invokeOperation(operationName, params); } catch (Exception e) { String paramsString = (params != null) ? params.toString(true) : String.valueOf(params); System.out.println("====== Error occurred during invocation of operation [" + operationName - + "] with parameters [" + paramsString + "] on " + resource + ": " + e); + + "] with parameters [" + paramsString + "] on " + resource + ": " + e); e.printStackTrace(System.out); throw new RuntimeException("Error occurred during invocation of operation [" + operationName - + "] with parameters [" + paramsString + "] on " + resource + ".", e); + + "] with parameters [" + paramsString + "] on " + resource + ".", e); } return operationResult; } @@ -264,21 +261,22 @@ public abstract class AbstractAgentPluginTest extends Arquillian { System.out.println("=== Loading Resource config for " + resource + "..."); ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); long timeoutMillis = 5000; - ConfigurationFacet configurationFacet = resourceContainer.createResourceComponentProxy(ConfigurationFacet.class, - FacetLockType.READ, timeoutMillis, false, false); + ConfigurationFacet configurationFacet = resourceContainer.createResourceComponentProxy( + ConfigurationFacet.class, FacetLockType.READ, timeoutMillis, false, false); return configurationFacet.loadResourceConfiguration(); }
@NotNull - protected ConfigurationUpdateReport updateResourceConfiguration(Resource resource, Configuration resourceConfig) throws Exception { + protected ConfigurationUpdateReport updateResourceConfiguration(Resource resource, Configuration resourceConfig) + throws Exception { ResourceType resourceType = resource.getResourceType(); ConfigurationDefinition resourceConfigDef = resourceType.getResourceConfigurationDefinition(); assertNotNull(resourceConfigDef, "No resource config is defined for ResourceType " + resourceType + "."); System.out.println("=== Updating Resource config for " + resource + "..."); ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); long timeoutMillis = 5000; - ConfigurationFacet configurationFacet = resourceContainer.createResourceComponentProxy(ConfigurationFacet.class, - FacetLockType.WRITE, timeoutMillis, false, false); + ConfigurationFacet configurationFacet = resourceContainer.createResourceComponentProxy( + ConfigurationFacet.class, FacetLockType.WRITE, timeoutMillis, false, false); ConfigurationUpdateReport report = new ConfigurationUpdateReport(resourceConfig); configurationFacet.updateResourceConfiguration(report); return report; @@ -286,25 +284,23 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
protected void assertAllResourceComponentsStarted() throws Exception { Resource platform = this.pluginContainer.getInventoryManager().getPlatform(); - Map<ResourceType, ResourceContainer> nonStartedResourceContainersByType = - new LinkedHashMap<ResourceType, ResourceContainer>(); + Map<ResourceType, ResourceContainer> nonStartedResourceContainersByType = new LinkedHashMap<ResourceType, ResourceContainer>(); findNonStartedResourceComponentsRecursively(platform, nonStartedResourceContainersByType); assertTrue(nonStartedResourceContainersByType.isEmpty(), - "Resource containers with non-started Resource components by type: " - + nonStartedResourceContainersByType); + "Resource containers with non-started Resource components by type: " + nonStartedResourceContainersByType); }
private void findNonStartedResourceComponentsRecursively(Resource resource, - Map<ResourceType, ResourceContainer> nonStartedResourceContainersByType) - throws Exception { + Map<ResourceType, ResourceContainer> nonStartedResourceContainersByType) throws Exception { ResourceType resourceType = resource.getResourceType(); if (!nonStartedResourceContainersByType.containsKey(resourceType)) { - ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); + ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer( + resource); if (resourceContainer.getResourceComponentState() != ResourceContainer.ResourceComponentState.STARTED) { nonStartedResourceContainersByType.put(resourceType, resourceContainer); } else if (resourceContainer.getResourceComponent() == null) { System.err.println("****** Resource container " + resourceContainer - + " says its Resource component is started, but the component is null. ******"); + + " says its Resource component is started, but the component is null. ******"); nonStartedResourceContainersByType.put(resourceType, resourceContainer); } } @@ -319,19 +315,19 @@ public abstract class AbstractAgentPluginTest extends Arquillian { Resource platform = this.pluginContainer.getInventoryManager().getPlatform(); Map<ResourceType, Exception> resourceConfigLoadExceptionsByType = new LinkedHashMap<ResourceType, Exception>(); findResourceConfigsThatFailToLoadRecursively(platform, resourceConfigLoadExceptionsByType); - assertTrue(resourceConfigLoadExceptionsByType.isEmpty(), "Resource configs that failed to load by type: " + - resourceConfigLoadExceptionsByType); + assertTrue(resourceConfigLoadExceptionsByType.isEmpty(), "Resource configs that failed to load by type: " + + resourceConfigLoadExceptionsByType); }
private void findResourceConfigsThatFailToLoadRecursively(Resource resource, - Map<ResourceType, Exception> resourceConfigLoadExceptionsByType) - throws Exception { + Map<ResourceType, Exception> resourceConfigLoadExceptionsByType) throws Exception { ResourceType resourceType = resource.getResourceType(); // Only check resource configs on types of Resources from the plugin under test. - if (resourceType.getPlugin().equals(getPluginName()) && - (resourceType.getResourceConfigurationDefinition() != null) && - !resourceConfigLoadExceptionsByType.containsKey(resourceType)) { - ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); + if (resourceType.getPlugin().equals(getPluginName()) + && (resourceType.getResourceConfigurationDefinition() != null) + && !resourceConfigLoadExceptionsByType.containsKey(resourceType)) { + ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer( + resource); if (resourceContainer.getResourceComponentState() != ResourceContainer.ResourceComponentState.STARTED) { return; } @@ -339,9 +335,8 @@ public abstract class AbstractAgentPluginTest extends Arquillian { Exception exception = null; try { Configuration resourceConfig = loadResourceConfiguration(resource); - List<String> validationErrors = - ConfigurationUtility.validateConfiguration(resourceConfig, - resourceType.getResourceConfigurationDefinition()); + List<String> validationErrors = ConfigurationUtility.validateConfiguration(resourceConfig, + resourceType.getResourceConfigurationDefinition()); if (!validationErrors.isEmpty()) { exception = new Exception("Resource config is not valid: " + validationErrors.toString()); } @@ -360,17 +355,19 @@ public abstract class AbstractAgentPluginTest extends Arquillian { }
protected void assertAllNumericMetricsAndTraitsHaveNonNullValues( - Map<ResourceType, String[]> excludedMetricNamesByType) throws Exception { + Map<ResourceType, String[]> excludedMetricNamesByType) throws Exception { Resource platform = this.pluginContainer.getInventoryManager().getPlatform(); LinkedHashMap<ResourceType, Set<String>> metricsWithNullValuesByType = new LinkedHashMap<ResourceType, Set<String>>(); findNumericMetricsAndTraitsWithNullValuesRecursively(platform, metricsWithNullValuesByType); removeExcludedMetricNames(metricsWithNullValuesByType, excludedMetricNamesByType); - assertTrue(metricsWithNullValuesByType.isEmpty(), "Metrics with null values by type: " + - metricsWithNullValuesByType); + assertTrue(metricsWithNullValuesByType.isEmpty(), "Metrics with null values by type: " + + metricsWithNullValuesByType); }
- private void removeExcludedMetricNames(LinkedHashMap<ResourceType, Set<String>> metricsWithNullValuesByType, Map<ResourceType, String[]> excludedMetricNamesByType) { - for (Iterator<ResourceType> mapIterator = metricsWithNullValuesByType.keySet().iterator(); mapIterator.hasNext(); ) { + private void removeExcludedMetricNames(LinkedHashMap<ResourceType, Set<String>> metricsWithNullValuesByType, + Map<ResourceType, String[]> excludedMetricNamesByType) { + for (Iterator<ResourceType> mapIterator = metricsWithNullValuesByType.keySet().iterator(); mapIterator + .hasNext();) { ResourceType resourceType = mapIterator.next(); if (excludedMetricNamesByType.get(resourceType) == null) { continue; @@ -378,7 +375,7 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
Set<String> namesOfMetricsWithNullValues = metricsWithNullValuesByType.get(resourceType); List<String> excludedMetricNames = Arrays.asList(excludedMetricNamesByType.get(resourceType)); - for (Iterator<String> setIterator = namesOfMetricsWithNullValues.iterator(); setIterator.hasNext(); ) { + for (Iterator<String> setIterator = namesOfMetricsWithNullValues.iterator(); setIterator.hasNext();) { String nameOfMetricWithNullValue = setIterator.next(); if (excludedMetricNames.contains(nameOfMetricWithNullValue)) { setIterator.remove(); @@ -391,12 +388,12 @@ public abstract class AbstractAgentPluginTest extends Arquillian { }
private void findNumericMetricsAndTraitsWithNullValuesRecursively(Resource resource, - Map<ResourceType, Set<String>> metricsWithNullValuesByType) - throws Exception { + Map<ResourceType, Set<String>> metricsWithNullValuesByType) throws Exception { ResourceType resourceType = resource.getResourceType(); // Only check metrics on types of Resources from the plugin under test. if (resourceType.getPlugin().equals(getPluginName())) { - ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); + ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer( + resource); if (resourceContainer.getResourceComponentState() != ResourceContainer.ResourceComponentState.STARTED) { return; } @@ -420,21 +417,20 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
protected Set<String> getNumericMetricsAndTraitsWithNullValues(Resource resource) throws Exception { ResourceType type = resource.getResourceType(); - Set<MeasurementDefinition> numericMetricAndTraitDefs = - ResourceTypeUtility.getMeasurementDefinitions(type, - new MeasurementDefinitionFilter() { - private final Set<DataType> acceptableDataTypes = EnumSet.of(DataType.MEASUREMENT, DataType.TRAIT); + Set<MeasurementDefinition> numericMetricAndTraitDefs = ResourceTypeUtility.getMeasurementDefinitions(type, + new MeasurementDefinitionFilter() { + private final Set<DataType> acceptableDataTypes = EnumSet.of(DataType.MEASUREMENT, DataType.TRAIT);
- public boolean accept(MeasurementDefinition metricDef) { - return acceptableDataTypes.contains(metricDef.getDataType()); - } - }); + public boolean accept(MeasurementDefinition metricDef) { + return acceptableDataTypes.contains(metricDef.getDataType()); + } + }); Set<String> metricsWithNullValues = getMetricsWithNullValues(resource, numericMetricAndTraitDefs); return metricsWithNullValues; }
protected Set<String> getMetricsWithNullValues(Resource resource, Set<MeasurementDefinition> metricDefs) - throws Exception { + throws Exception { Set<String> metricsWithNullValues = new TreeSet<String>(); for (MeasurementDefinition metricDef : metricDefs) { if (!metricDef.getResourceType().equals(resource.getResourceType())) { @@ -442,12 +438,14 @@ public abstract class AbstractAgentPluginTest extends Arquillian { } Object value; switch (metricDef.getDataType()) { - case MEASUREMENT: - value = collectNumericMetric(resource, metricDef.getName()); break; - case TRAIT: - value = collectTrait(resource, metricDef.getName()); break; - default: - throw new IllegalArgumentException("Unsupported metric type: " + metricDef.getDataType()); + case MEASUREMENT: + value = collectNumericMetric(resource, metricDef.getName()); + break; + case TRAIT: + value = collectTrait(resource, metricDef.getName()); + break; + default: + throw new IllegalArgumentException("Unsupported metric type: " + metricDef.getDataType()); } if (value == null) { metricsWithNullValues.add(metricDef.getName()); @@ -463,28 +461,29 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
Double value; if (report.getNumericData().isEmpty()) { - assertEquals(report.getTraitData().size(), 0, - "Metric [" + metricName + "] for Resource type " + resource.getResourceType() - + " is defined as a numeric metric, but the plugin returned one or more traits!: " - + report.getTraitData()); + assertEquals( + report.getTraitData().size(), + 0, + "Metric [" + metricName + "] for Resource type " + resource.getResourceType() + + " is defined as a numeric metric, but the plugin returned one or more traits!: " + + report.getTraitData()); assertEquals(report.getCallTimeData().size(), 0, - "Metric [" + metricName + "] for Resource type " + resource.getResourceType() - + " is defined as a numeric metric, but the plugin returned one or more call-time metrics!: " - + report.getCallTimeData()); + "Metric [" + metricName + "] for Resource type " + resource.getResourceType() + + " is defined as a numeric metric, but the plugin returned one or more call-time metrics!: " + + report.getCallTimeData()); value = null; } else { assertEquals(report.getNumericData().size(), 1, - "Requested a single metric, but plugin returned more than one datum: " + report.getNumericData()); + "Requested a single metric, but plugin returned more than one datum: " + report.getNumericData()); MeasurementDataNumeric datum = report.getNumericData().iterator().next(); - assertEquals(datum.getName(), metricName, - "Numeric metric [" + metricName + "] for Resource type " + resource.getResourceType() - + " was requested, but the plugin returned a numeric metric with name [" - + datum.getName() + "] and value [" + datum.getValue() + "]!"); + assertEquals(datum.getName(), metricName, "Numeric metric [" + metricName + "] for Resource type " + + resource.getResourceType() + " was requested, but the plugin returned a numeric metric with name [" + + datum.getName() + "] and value [" + datum.getValue() + "]!"); // Normalize NaN or infinite to null, as the PC does. value = (datum.getValue().isNaN() || datum.getValue().isInfinite()) ? null : datum.getValue(); } System.out.println("====== Collected numeric metric [" + metricName + "] with value of [" + value + "] for " - + resource + "."); + + resource + ".");
return value; } @@ -496,27 +495,31 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
String value; if (report.getTraitData().isEmpty()) { - assertEquals(report.getNumericData().size(), 0, - "Metric [" + traitName + "] for Resource type " + resource.getResourceType() - + " is defined as a trait, but the plugin returned one or more numeric metrics!: " - + report.getNumericData()); - assertEquals(report.getCallTimeData().size(), 0, - "Metric [" + traitName + "] for Resource type " + resource.getResourceType() - + " is defined as a trait, but the plugin returned one or more call-time metrics!: " - + report.getCallTimeData()); + assertEquals( + report.getNumericData().size(), + 0, + "Metric [" + traitName + "] for Resource type " + resource.getResourceType() + + " is defined as a trait, but the plugin returned one or more numeric metrics!: " + + report.getNumericData()); + assertEquals( + report.getCallTimeData().size(), + 0, + "Metric [" + traitName + "] for Resource type " + resource.getResourceType() + + " is defined as a trait, but the plugin returned one or more call-time metrics!: " + + report.getCallTimeData()); value = null; } else { assertEquals(report.getTraitData().size(), 1, - "Requested a single trait, but plugin returned more than one datum: " + report.getTraitData()); + "Requested a single trait, but plugin returned more than one datum: " + report.getTraitData()); MeasurementDataTrait datum = report.getTraitData().iterator().next(); assertEquals(datum.getName(), traitName, - "Trait [" + traitName + "] for Resource type " + resource.getResourceType() - + " was requested, but the plugin returned a trait with name [" - + datum.getName() + "] and value [" + datum.getValue() + "]!"); + "Trait [" + traitName + "] for Resource type " + resource.getResourceType() + + " was requested, but the plugin returned a trait with name [" + datum.getName() + "] and value [" + + datum.getValue() + "]!"); value = datum.getValue(); } - System.out.println("====== Collected trait [" + traitName + "] with value of [" + value + "] for " - + resource + "."); + System.out.println("====== Collected trait [" + traitName + "] with value of [" + value + "] for " + resource + + ".");
return value; } @@ -530,13 +533,12 @@ public abstract class AbstractAgentPluginTest extends Arquillian { * @return the report containing the collected data */ @NotNull - private MeasurementReport collectMetric(Resource resource, String metricName) - throws Exception { + private MeasurementReport collectMetric(Resource resource, String metricName) throws Exception { ResourceType resourceType = resource.getResourceType(); MeasurementDefinition measurementDefinition = ResourceTypeUtility.getMeasurementDefinition(resourceType, - metricName); - assertNotNull(measurementDefinition, "No metric named [" + metricName - + "] is defined for ResourceType {" + resourceType.getPlugin() + "}" + resourceType.getName() + "."); + metricName); + assertNotNull(measurementDefinition, "No metric named [" + metricName + "] is defined for ResourceType {" + + resourceType.getPlugin() + "}" + resourceType.getName() + ".");
ResourceContainer resourceContainer = this.pluginContainer.getInventoryManager().getResourceContainer(resource); long timeoutMillis = 5000; @@ -544,26 +546,25 @@ public abstract class AbstractAgentPluginTest extends Arquillian { throw new IllegalStateException("Resource component for " + resource + " has not yet been started."); } MeasurementFacet measurementFacet = resourceContainer.createResourceComponentProxy(MeasurementFacet.class, - FacetLockType.READ, timeoutMillis, false, false); + FacetLockType.READ, timeoutMillis, false, false); MeasurementReport report = new MeasurementReport(); MeasurementScheduleRequest request = new MeasurementScheduleRequest(-1, metricName, -1, true, - measurementDefinition.getDataType(), measurementDefinition.getRawNumericType()); + measurementDefinition.getDataType(), measurementDefinition.getRawNumericType()); Set<MeasurementScheduleRequest> requests = new HashSet<MeasurementScheduleRequest>(); requests.add(request); try { measurementFacet.getValues(report, requests); } catch (Exception e) { - System.out.println("====== Error occurred during collection of metric [" + metricName - + "] on " + resource + ": " + e); - throw new RuntimeException("Error occurred during collection of metric [" + metricName - + "] on " + resource + ": " + e); + System.out.println("====== Error occurred during collection of metric [" + metricName + "] on " + resource + + ": " + e); + throw new RuntimeException("Error occurred during collection of metric [" + metricName + "] on " + resource + + ": " + e); } return report; }
- protected OperationResult invokeOperationAndAssertSuccess(Resource resource, String operationName, - @Nullable Configuration params) - throws PluginContainerException { + protected OperationResult invokeOperationAndAssertSuccess(Resource resource, String operationName, @Nullable + Configuration params) throws PluginContainerException { OperationResult result = invokeOperation(resource, operationName, params); assertOperationSucceeded(operationName, params, result); return result; @@ -571,10 +572,10 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
private long getDefaultTimeout(ResourceType resourceType, String operationName) { OperationDefinition operationDefinition = ResourceTypeUtility.getOperationDefinition(resourceType, - operationName); + operationName); // Note: The PC's default timeout is 10 minutes. - return (operationDefinition.getTimeout() != null) ? operationDefinition.getTimeout() : - this.pluginContainerConfiguration.getOperationInvocationTimeout(); + return (operationDefinition.getTimeout() != null) ? operationDefinition.getTimeout() + : this.pluginContainerConfiguration.getOperationInvocationTimeout(); }
private static String getRhqVersion() { @@ -589,8 +590,8 @@ public abstract class AbstractAgentPluginTest extends Arquillian {
protected void assertOperationSucceeded(String operationName, Configuration params, OperationResult result) { String paramsString = (params != null) ? params.toString(true) : String.valueOf(params); - assertNull(result.getErrorMessage(), "Operation [" + operationName + "] with parameters " - + paramsString + " returned an error: " + result.getErrorMessage()); + assertNull(result.getErrorMessage(), "Operation [" + operationName + "] with parameters " + paramsString + + " returned an error: " + result.getErrorMessage()); }
protected abstract String getPluginName(); @@ -708,7 +709,7 @@ public abstract class AbstractAgentPluginTest extends Arquillian { List<String> ignoredResources) { for (Resource childResource : rootResource.getChildResources()) { if (childResource.getInventoryStatus().equals(InventoryStatus.COMMITTED)) { - if( !ignoredResources.contains(childResource.getResourceType().getName())) { + if (!ignoredResources.contains(childResource.getResourceType().getName())) { accumulatorCollection.add(childResource); } } else { diff --git a/modules/enterprise/server/itests-2/pom.xml b/modules/enterprise/server/itests-2/pom.xml index dceb4b7..4e7acbb 100644 --- a/modules/enterprise/server/itests-2/pom.xml +++ b/modules/enterprise/server/itests-2/pom.xml @@ -30,13 +30,38 @@ Postgres, specify -Pitest.oracle to use Oracle --> <skip.postgres>false</skip.postgres> <skip.oracle>true</skip.oracle> + + <liquibase.version>2.0.3</liquibase.version> </properties>
+ <!-- In Shrinkwrap 2.0.0-alpha-6 it's necessary to provide a depMgmt entry in order for the resolver to determine the version. + So, do that for the 3rd party libs we need to add to the deployment jar. --> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + <version>2.1</version> + </dependency> + + <dependency> + <groupId>org.liquibase</groupId> + <artifactId>liquibase-core</artifactId> + <version>${liquibase.version}</version> + </dependency> + + <dependency> + <groupId>org.powermock</groupId> + <artifactId>powermock-api-mockito</artifactId> + <version>${powermock.version}</version> + </dependency> + </dependencies> + </dependencyManagement> + <dependencies> <!--================ Test Deps ================ -->
<!-- Note, the test dep ordering can be important. Maven orders the [test] classpath in the order listed in the pom. --> - <dependency> <groupId>org.jboss.as</groupId> <artifactId>jboss-as-dist</artifactId> @@ -64,28 +89,12 @@ <artifactId>arquillian-testng-container</artifactId> <scope>test</scope> </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap</groupId> - <artifactId>shrinkwrap-impl-base</artifactId> - <scope>test</scope> - </dependency> - + <!-- <dependency> <groupId>org.jboss.shrinkwrap</groupId> <artifactId>shrinkwrap-impl-base</artifactId> <scope>test</scope> + </dependency> --> <dependency> <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-api-maven</artifactId> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jboss.shrinkwrap.resolver</groupId> - <artifactId>shrinkwrap-resolver-impl-maven</artifactId> + <artifactId>shrinkwrap-resolver-depchain</artifactId> + <type>pom</type> <scope>test</scope> </dependency>
@@ -157,13 +166,13 @@ <groupId>org.rhq</groupId> <artifactId>test-utils</artifactId> <version>${project.version}</version> - <scope>test</scope> <exclusions> <exclusion> <groupId>org.testng</groupId> <artifactId>testng</artifactId> </exclusion> </exclusions> + <scope>test</scope> </dependency>
<dependency> @@ -189,7 +198,6 @@ <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> - <version>${powermock.version}</version> <scope>test</scope> </dependency>
@@ -202,14 +210,12 @@ <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> - <version>2.0.3</version> <scope>test</scope> </dependency>
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> - <version>2.1</version> <scope>test</scope> </dependency> </dependencies> @@ -254,7 +260,7 @@ <copy file="${jboss.conf}" tofile="${jboss.conf.safe}" /> </else> </if> - + <echo>Will now add test configuration to JBossAS config file: ${jboss.conf}</echo> <replace file="${jboss.conf}">
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index c8dadf8..28c75bb 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -10,6 +10,7 @@ import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; @@ -45,8 +46,9 @@ import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.impl.base.exporter.zip.ZipExporterImpl; -import org.jboss.shrinkwrap.resolver.api.DependencyResolvers; -import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver; +import org.jboss.shrinkwrap.resolver.api.Resolvers; +import org.jboss.shrinkwrap.resolver.api.maven.Maven; +import org.jboss.shrinkwrap.resolver.api.maven.MavenResolverSystem;
import org.rhq.core.db.DatabaseTypeFactory; import org.rhq.core.domain.auth.Subject; @@ -290,14 +292,15 @@ public abstract class AbstractEJB3Test extends Arquillian { testClassesJar.addAsResource("test/metadata/resource-type/updateResourceTypeBundleTarget-v2.xml");
// create test ear by starting with rhq.ear and thinning it - MavenDependencyResolver earResolver = DependencyResolvers.use(MavenDependencyResolver.class); + MavenResolverSystem earResolver = Resolvers.use(MavenResolverSystem.class); + earResolver.offline(); // this must be named rhq.ear because the "rhq" portion is used in the jndi names EnterpriseArchive testEar = ShrinkWrap.create(EnterpriseArchive.class, "rhq.ear"); - EnterpriseArchive rhqEar = earResolver.artifact("org.rhq:rhq-enterprise-server-ear:ear:4.6.0-SNAPSHOT") - .resolveAs(EnterpriseArchive.class).iterator().next(); + EnterpriseArchive rhqEar = earResolver.resolve("org.rhq:rhq-enterprise-server-ear:ear:4.6.0-SNAPSHOT") + .withoutTransitivity().asSingle(EnterpriseArchive.class); // merge rhq.ear into testEar but include only the EJB jars and the supporting libraries. Note that we // don't include the services sar because tests are responsible for prepare/unprepare of all required services, - // we don't want the production services performig any unexpected work. + // we don't want the production services performing any unexpected work. testEar = testEar.merge(rhqEar, Filters.include("/lib.*|/rhq.*ejb3\.jar.*")); // remove startup beans and shutdown listeners, we don't want this to be a full server deployment. The tests // start/stop what they need, typically with test services or mocks. @@ -326,18 +329,28 @@ public abstract class AbstractEJB3Test extends Arquillian { // add the application xml declaring the ejb jars testEar.setApplicationXML("application.xml");
- // add additional 3rd party dependent jars needed to support test classes - MavenDependencyResolver resolver = DependencyResolvers.use(MavenDependencyResolver.class); - resolver.loadMetadataFromPom("pom.xml"); + // add additional 3rd party dependent jars needed to support test classes + Collection thirdPartyDeps = new ArrayList(); + String projectVersion = System.getProperty("project.version"); + thirdPartyDeps.add("joda-time:joda-time"); + thirdPartyDeps.add("org.jboss.shrinkwrap:shrinkwrap-impl-base"); + thirdPartyDeps.add("org.liquibase:liquibase-core"); + thirdPartyDeps.add("org.powermock:powermock-api-mockito"); + thirdPartyDeps.add("org.rhq.helpers:perftest-support:" + projectVersion); + //thirdPartyDeps.add("org.rhq:rhq-core-client-api:jar:tests:" + projectVersion); + thirdPartyDeps.add("org.rhq:test-utils:" + projectVersion); + + MavenResolverSystem resolver = Maven.resolver(); + Collection<JavaArchive> dependencies = new HashSet<JavaArchive>(); - dependencies.addAll(resolver.artifact("org.powermock:powermock-api-mockito").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("org.liquibase:liquibase-core").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("joda-time:joda-time").resolveAs(JavaArchive.class)); - dependencies - .addAll(resolver.artifact("org.jboss.shrinkwrap:shrinkwrap-impl-base").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("org.rhq:rhq-core-client-api:jar:tests").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("org.rhq:test-utils").resolveAs(JavaArchive.class)); - dependencies.addAll(resolver.artifact("org.rhq.helpers:perftest-support").resolveAs(JavaArchive.class)); + dependencies.addAll(Arrays.asList(resolver.loadPomFromFile("pom.xml").resolve(thirdPartyDeps) + .withTransitivity().as(JavaArchive.class))); + + System.out.println("******* " + + Arrays.asList(resolver.loadPomFromFile("pom.xml") + .resolve("org.rhq:rhq-core-client-api:jar:tests:" + projectVersion).withTransitivity() + .as(JavaArchive.class))); + System.out.println("******* ");
// If we're running oracle we need to include the OJDBC driver because dbunit needs it. Note that we need // add it explicitly even though it is a provided module used by the datasource. @@ -347,16 +360,18 @@ public abstract class AbstractEJB3Test extends Arquillian { // at this point to force local repo resolution since the oracle driver is not in public repos. // see http://stackoverflow.com/questions/6291146/arquillian-shrinkwrap-mavendepend... // Last verified this problem using: Arquillian 1.0.3 bom - resolver.goOffline(); - dependencies.addAll(resolver.artifact("com.oracle:ojdbc6:jar:" + System.getProperty("rhq.ojdbc.version")) - .resolveAs(JavaArchive.class)); + resolver.offline(); + dependencies.addAll(Arrays.asList(resolver + .resolve("com.oracle:ojdbc6:jar:" + System.getProperty("rhq.ojdbc.version")).withTransitivity() + .as(JavaArchive.class))); }
// Transitive deps required by the above and for some reason not sucked in. Note that // these require an explicit version. TODO (jshaughn): Can we make these transitive or // avoid the explicit version? // dep required byt rhq-core-client-api test-jar - dependencies.addAll(resolver.artifact("commons-jxpath:commons-jxpath:1.3").resolveAs(JavaArchive.class)); + //dependencies.addAll(Arrays.asList(resolver.resolve("commons-jxpath:commons-jxpath:1.3").withTransitivity() + // .as(JavaArchive.class)));
// exclude any transitive deps we don't want String[] excludeFilters = { "testng.*jdk", "rhq-core-domain.*jar" }; @@ -368,7 +383,7 @@ public abstract class AbstractEJB3Test extends Arquillian { //System.out.println("** The Deployment EAR: " + testEar.toString(true) + "\n");
// Save the test EAR to a zip file for inspection (set file explicitly) - //exportZip(testEar, new File("/home/jshaughn/temp/test-ear.ear")); + exportZip(testEar, new File("c:/temp/test-ear.ear"));
return testEar; } diff --git a/modules/integration-tests/jndi-access/jndi-access-test/src/test/java/org/rhq/jndi/test/JndiAccessTest.java b/modules/integration-tests/jndi-access/jndi-access-test/src/test/java/org/rhq/jndi/test/JndiAccessTest.java index 2e088f8..dfc9ca9 100644 --- a/modules/integration-tests/jndi-access/jndi-access-test/src/test/java/org/rhq/jndi/test/JndiAccessTest.java +++ b/modules/integration-tests/jndi-access/jndi-access-test/src/test/java/org/rhq/jndi/test/JndiAccessTest.java @@ -25,6 +25,8 @@ import static org.testng.Assert.fail; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Properties; @@ -47,8 +49,7 @@ import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; -import org.jboss.shrinkwrap.resolver.api.DependencyResolvers; -import org.jboss.shrinkwrap.resolver.api.maven.MavenDependencyResolver; +import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.rhq.bindings.StandardScriptPermissions; import org.rhq.enterprise.server.AllowRhqServerInternalsAccessPermission; @@ -77,25 +78,29 @@ public class JndiAccessTest extends Arquillian { JavaArchive testEjb = ShrinkWrap.create(JavaArchive.class, "test-ejb.jar").addClass(TestEjb.class) .addClass(TestEjbBean.class).addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));
- Collection<JavaArchive> deps = DependencyResolvers.use(MavenDependencyResolver.class) - .loadMetadataFromPom("pom.xml") - .artifacts("jboss:jnp-client", "org.rhq:rhq-scripting-api", "org.rhq:rhq-scripting-javascript", - "org.rhq:rhq-scripting-python").scope("test").resolveAs(JavaArchive.class); + Collection thirdPartyDeps = new ArrayList(); + thirdPartyDeps.add("jboss:jnp-client"); + thirdPartyDeps.add("org.rhq:rhq-scripting-api"); + thirdPartyDeps.add("org.rhq:rhq-scripting-javascript"); + thirdPartyDeps.add("org.rhq:rhq-scripting-python"); + + Collection<JavaArchive> deps = Arrays.asList(Maven.resolver().loadPomFromFile("pom.xml") + .resolve(thirdPartyDeps).withTransitivity().as(JavaArchive.class));
//we need to pull in the naming hack classes from the server jar so that our EAR behaves the same testEjb.addPackages(true, "org.rhq.enterprise.server.naming").addClass( AllowRhqServerInternalsAccessPermission.class); - + //we also need to pull in the special startup beans from the server/itests-2 that will initialize the naming //subsystem testEjb.addClasses(StrippedDownStartupBean.class, StrippedDownStartupBeanPreparation.class); - + //to work around https://issues.jboss.org/browse/ARQ-659 //we need to include this test class in the EAR manually
//Instead of pulling the whole rhq-script-bindings (which has a lot of deps), we're just picking the //StandardScriptPermissions from there so that it can be used in the tests - JavaArchive classes = ShrinkWrap.create(JavaArchive.class, "test-class.jar").addClasses(JndiAccessTest.class, + JavaArchive classes = ShrinkWrap.create(JavaArchive.class, "test-class.jar").addClasses(JndiAccessTest.class, StandardScriptPermissions.class);
return ShrinkWrap.create(EnterpriseArchive.class, "test-ear.ear").addAsModule(testEjb).addAsLibraries(deps) diff --git a/pom.xml b/pom.xml index 20455a5..21ea002 100644 --- a/pom.xml +++ b/pom.xml @@ -145,6 +145,7 @@ <freemarker.version>2.3.18</freemarker.version> <powermock.version>1.4.12</powermock.version> <arquillian.version>1.0.3.Final</arquillian.version> + <shrinkwrap-resolver.version>2.0.0-alpha-6</shrinkwrap-resolver.version> <xercesImpl.version>2.9.1-jbossas-2</xercesImpl.version> <!-- see BZ-820629 and CVE-2009-2625 --> <opencsv.version>1.8</opencsv.version>
@@ -610,7 +611,17 @@ <scope>import</scope> </dependency>
- <!-- This will pull in the compatible versions of the shrinkwrap and shrinkwrap-resolver deps too. --> + <!-- We want the shrinkwrap dependency resolver to be newer than that included in the Arquillian BOM. + This must go *BEFORE* the Arquillian BOM. --> + <dependency> + <groupId>org.jboss.shrinkwrap.resolver</groupId> + <artifactId>shrinkwrap-resolver-bom</artifactId> + <version>${shrinkwrap-resolver.version}</version> + <scope>import</scope> + <type>pom</type> + </dependency> + <!-- This will pull in the compatible versions of shrinkwrap deps too. Note that we want to use an explicit + version for the shrinkwrap resolver, which revs more often and has bugfixes. --> <dependency> <groupId>org.jboss.arquillian</groupId> <artifactId>arquillian-bom</artifactId> @@ -618,7 +629,7 @@ <type>pom</type> <scope>import</scope> </dependency> - + <dependency> <groupId>org.jboss.arquillian.extension</groupId> <artifactId>arquillian-jacoco</artifactId>
commit 091b0903f045b2a659d7623d928e8944b5844683 Author: Jirka Kremser jkremser@redhat.com Date: Thu Jan 17 13:35:27 2013 +0100
[BZ 878117 - Empty group is displayed among compatible groups] Added support for recalculating the group's resource type after resource uninventorization.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java index 6818fa2..954568d 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/resource/group/ResourceGroup.java @@ -228,6 +228,7 @@ public class ResourceGroup extends Group {
public static final String QUERY_DELETE_EXPLICIT_BY_RESOURCE_IDS = "DELETE FROM RHQ_RESOURCE_GROUP_RES_EXP_MAP WHERE RESOURCE_ID IN ( :resourceIds )"; public static final String QUERY_DELETE_IMPLICIT_BY_RESOURCE_IDS = "DELETE FROM RHQ_RESOURCE_GROUP_RES_IMP_MAP WHERE RESOURCE_ID IN ( :resourceIds )"; + public static final String QUERY_GET_GROUP_IDS_BY_RESOURCE_IDS = "SELECT DISTINCT RESOURCE_GROUP_ID FROM RHQ_RESOURCE_GROUP_RES_EXP_MAP WHERE RESOURCE_ID IN ( :resourceIds )"; public static final String QUERY_FIND_ALL_FILTERED_COUNT = "ResourceGroup.findAllFiltered_Count"; public static final String QUERY_FIND_ALL_FILTERED_COUNT_ADMIN = "ResourceGroup.findAllFiltered_Count_Admin";
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java index 0e59b6d..b5a185f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceSearchView.java @@ -380,6 +380,7 @@ public class ResourceSearchView extends Table {
protected void onUninventorySuccess() { refresh(true); + CoreGUI.refresh(); }
protected List<ListGridField> createFields() { diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java index 08ab0e2..a08e0d2 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/resource/ResourceManagerBean.java @@ -124,6 +124,7 @@ import org.rhq.enterprise.server.discovery.DiscoveryServerServiceImpl; import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal; import org.rhq.enterprise.server.resource.disambiguation.DisambiguationUpdateStrategy; import org.rhq.enterprise.server.resource.disambiguation.Disambiguator; +import org.rhq.enterprise.server.resource.group.ResourceGroupDeleteException; import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal; import org.rhq.enterprise.server.util.CriteriaQueryGenerator; import org.rhq.enterprise.server.util.CriteriaQueryRunner; @@ -466,6 +467,11 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage }
private boolean uninventoryResourcesBulkDelete(Subject overlord, List<Integer> resourceIds) { + // obtain group ids of affected groups + Query nativeQuery = entityManager.createNativeQuery(ResourceGroup.QUERY_GET_GROUP_IDS_BY_RESOURCE_IDS); + nativeQuery.setParameter("resourceIds", resourceIds); + List<Integer> groupIds = nativeQuery.getResultList(); + String[] nativeQueriesToExecute = new String[] { // ResourceGroup.QUERY_DELETE_EXPLICIT_BY_RESOURCE_IDS, // unmap from explicit groups ResourceGroup.QUERY_DELETE_IMPLICIT_BY_RESOURCE_IDS // unmap from implicit groups @@ -477,6 +483,15 @@ public class ResourceManagerBean implements ResourceManagerLocal, ResourceManage hasErrors |= resourceManager.bulkNativeQueryDeleteInNewTransaction(overlord, nativeQueryToExecute, resourceIds); } + + // update the resource type on affected groups + for (int groupId : groupIds) { + try { + resourceGroupManager.setResourceType(groupId); + } catch (ResourceGroupDeleteException rgde) { + log.warn("Unable to change resource type for group with id [" + groupId + "]", rgde); + } + }
return hasErrors; }
commit 6917de4e4b3b1473958540a57118bbf2aa01c728 Author: Simeon Pinder spinder@spinder.csb Date: Wed Jan 16 18:16:06 2013 -0500
Add linux script to build remote branches from current state on source branch.
diff --git a/remote-branch.sh b/remote-branch.sh new file mode 100755 index 0000000..b6fecb9 --- /dev/null +++ b/remote-branch.sh @@ -0,0 +1,134 @@ +# See usage function. +# +# Description: +# Script to create new remote branches in Git. +# +# Options: +# See usage function. +#======================================================================================== +#======================================================================================== +# Description: Display usage information then abort the script. +#======================================================================================== + +#include the utility library +source `dirname $0`/rhq_bash.lib + +usage() +{ + USAGE=$( +cat << EOF +USAGE: remote-branch.sh OPTIONS + + --source-branch=git_branch [REQUIRED] + The branch to base the new remote branch on. Ex. release/jon3.1.x, or master. Script assumes the + most recent commits from the 'source-branch' are to be replicated to the new 'release-branch'. + + --new-remote-branch=git_branch_name [REQUIRED] + Git branch name to be created. Assumes no such local or remote branch by this name already exists. + +EOF +) + + EXAMPLE="remote-branch.sh --source-branch="release/jon3.1.x" --new-remote-branch="rc/jon3.1.2.GA"" + + abort "$@" "$USAGE" "$EXAMPLE" +} + +#======================================================================================== +# Description: Validate and parse input arguments +#======================================================================================== +parse_and_validate_options() +{ + print_function_information $FUNCNAME + + SOURCE_BRANCH= + NEW_REMOTE_BRANCH= + + short_options="h" + long_options="help,source-branch:,new-remote-branch:" + + PROGNAME=${0##*/} + ARGS=$(getopt -s bash --options $short_options --longoptions $long_options --name $PROGNAME -- "$@" ) + eval set -- "$ARGS" + + while true; do + case $1 in + -h|--help) + usage + ;; + --source-branch) + shift + SOURCE_BRANCH="$1" + shift + ;; + --new-remote-branch) + shift + NEW_REMOTE_BRANCH="$1" + shift + ;; + --) + shift + break + ;; + *) + usage + ;; + esac + done + + if [ -z "$SOURCE_BRANCH" ]; + then + usage "Git source branch not specified!" + fi + + if [ -z "$NEW_REMOTE_BRANCH" ]; + then + usage "New remote branch name not specified!" + fi + + print_centered "Script Options" + script_options=( "SOURCE_BRANCH" "NEW_REMOTE_BRANCH") + print_variables "${script_options[@]}" +} + +#======================================================================================== +# Description: Set all the local and environment variables required by the script. +#======================================================================================== +synch_build_branch_and_push() +{ + +# checkout the source branch +echo "git checkout $GIT_SOURCE_BRANCH" +git checkout $GIT_SOURCE_BRANCH + +# fetch all changes in remotes since last fetch +echo "git fetch --all" +git fetch --all + +# synch the current branch with the latest on source branch +echo "git pull --rebase" +git pull --rebase + +# echo current local branches +echo "git branch" +git branch + +# create new git branch with last commit to source branch +echo "git checkout -b $NEW_REMOTE_BRANCH" +git checkout -b $NEW_REMOTE_BRANCH + +# push new local branch remote. Local and remote branch has same name. +echo "git push origin $NEW_REMOTE_BRANCH:$NEW_REMOTE_BRANCH" +git push origin $NEW_REMOTE_BRANCH:$NEW_REMOTE_BRANCH + +# set local branch to track remote git branch of the same name +echo "branch --set-upstream $NEW_REMOTE_BRANCH origin/$NEW_REMOTE_BRANCH" +git branch --set-upstream $NEW_REMOTE_BRANCH origin/$NEW_REMOTE_BRANCH + +} + +############ MAIN SCRIPT ############ + +parse_and_validate_options $@ + +synch_build_branch_and_push
commit 731dd8f8b5d38b62ec99687752af35021b7fb503 Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Jan 16 17:07:26 2013 -0500
Don't let dashboards come back in random order. Order alphabetically by name.\ This also provides a poor-mans's way of starting with a favorite dash, or ordering/grouping in a certain fashion.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java index cae2d20..b48dd19 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/DashboardsView.java @@ -52,6 +52,7 @@ import org.rhq.core.domain.dashboard.Dashboard; import org.rhq.core.domain.dashboard.DashboardCategory; import org.rhq.core.domain.dashboard.DashboardPortlet; import org.rhq.core.domain.util.PageList; +import org.rhq.core.domain.util.PageOrdering; import org.rhq.enterprise.gui.coregui.client.BookmarkableView; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.InitializableView; @@ -120,6 +121,7 @@ public class DashboardsView extends LocatableVLayout implements DashboardContain super.onInit();
DashboardCriteria criteria = new DashboardCriteria(); + criteria.addSortName(PageOrdering.ASC); dashboardService.findDashboardsByCriteria(criteria, new AsyncCallback<PageList<Dashboard>>() { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError(MSG.view_dashboardsManager_error1(), caught);
commit fb4cf0ac7e03ab153c940d4742670cad9de5b5f0 Author: Heiko W. Rupp hwr@redhat.com Date: Wed Jan 16 22:17:34 2013 +0100
Update russian translations from the translation project.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index e82a173..259b1c2 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -3,7 +3,7 @@ ## ## Developers: See the following wiki page for how to work with this file: ## -## https://docs.jboss.org/author/display/RHQ/Working+with+the+Resource+Bundles +## http://rhq-project.org/display/RHQ/Working+with+the+Resource+Bundles ## #################################### #common_alert_high = High @@ -403,12 +403,6 @@ #filter_from_date = From #filter_to_date = To #group_tree_partialClusterTooltip = {0} out of {1} group members have a ''{2}'' resource -##search_invalid_search_expression = Invalid search expression. -##search_failed_to_save_search = Failed to Save Search: {0} -##search_failed_to_retrieve_saved_search = Failed to retrieve saved search -##search_failed_to_retrieve_search_suggestion = Failed to retrieve search suggestion -##search_name_your_search = name you searci -##search_successfully_saved_search = Successfully Saved Search: {0} #util_ancestry_parentAncestry = Parent Ancestry for: #util_errorHandler_nullException = exception was null #util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status. @@ -436,7 +430,6 @@ #view_adminContent_contentSources = Content Sources #view_adminRoles_assignedGroups = Assigned Resource Groups #view_adminRoles_assignedSubjects = Assigned Subjects -##view_adminRoles_failCreateRoleWithExistingName = Failed to create role with existing name [{0}]. Please use another name. #view_adminRoles_failLdap = Failed to determine if LDAP configured - assuming no LDAP. #view_adminRoles_failLdapGroups = Failed to retrieve available LDAP groups - assuming no LDAP groups. #view_adminRoles_failLdapGroupsRole = Failed to load LDAP groups available for role. @@ -523,98 +516,11 @@ #view_adminTemplates_servers = Servers #view_adminTemplates_userTemplates = User Templates #view_adminTopology_affinityGroups = Affinity Groups -#view_adminTopology_affinityGroups_agentCount = Agent Count -#view_adminTopology_affinityGroups_agetnMembers = Agent Members -#view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group -#view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group -#view_adminTopology_affinityGroups_createNew = Create New -#view_adminTopology_affinityGroups_details = Affinity Group Details -#view_adminTopology_affinityGroups_removeSelected = Remove Selected -#view_adminTopology_affinityGroups_serverCount = Server Count -#view_adminTopology_affinityGroups_serverMembers = Server Members #view_adminTopology_agents = Agents -#view_adminTopology_agent_agentBindAddress = Agent Bind Address -#view_adminTopology_agent_agentBindPort = Agent Bind Port -#view_adminTopology_agent_agentName = Agent Name -#view_adminTopology_agent_connectedServer = Connected Server -#view_adminTopology_agent_lastAvailabilityReport = Last Availability Report -#view_adminTopology_agentDetail_address = Address -#view_adminTopology_agentDetail_agentFailoverList = Agent Failover List -#view_adminTopology_agentDetail_currentServer = Current Server -#view_adminTopology_agentDetail_token = Token -##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint -##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. -##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. -##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. -##view_adminTopology_message_agroupRemovingAgentsFail = Unable to remove agents from the affinity group with id {0}. -##view_adminTopology_message_agroupRemovingServersFail = Unable to remove servers from the affinity group with id {0}. -##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. -##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. -##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. -##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. -##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. -##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. -##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). -##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. -##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. -##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. -##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. -##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. -##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. -##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. -##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. -##view_adminTopology_message_order = Order -##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. -##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? -##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? -##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? -##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). -##view_adminTopology_message_removeServerConfirm = Do you really want to remove servers {0}? -##view_adminTopology_message_removeServerFail = Unable to remove {0} server(s). -##view_adminTopology_message_removedAGroups = Removed {0} affinity group(s). -##view_adminTopology_message_removedAllPEvent = All partition events have been purged. -##view_adminTopology_message_removedAllPEventFail = Unable to purge all partition events. -##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). -##view_adminTopology_message_removedServer = Removed {0} server(s). -##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. -##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. -##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. -##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. -##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? -##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. #view_adminTopology_partitionEvents = Partition Events -##view_adminTopology_partitionEvents_details = Details -##view_adminTopology_partitionEvents_detailsFilter = Details Filter -##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter -##view_adminTopology_partitionEvents_execTime = Execution Time -##view_adminTopology_partitionEvents_executionStatus = Execution Status -##view_adminTopology_partitionEvents_forceRepartition = Force Repartition -##view_adminTopology_partitionEvents_initiatedBy = Initiated By -##view_adminTopology_partitionEvents_purgeAll = Purge All -##view_adminTopology_partitionEvents_type = Type -##view_adminTopology_partitionEvents_typeFilter = Type Filter -##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments -##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event -##view_adminTopology_partitionEventsDetail_eventDetails = Event Details -##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time -##view_adminTopology_partitionEventsDetail_eventType = Event Type #view_adminTopology_remoteAgentInstall = Remote Agent Install -#view_adminTopology_server_affinityGroup = Affinity Group -#view_adminTopology_server_agentCount = Agent Count -#view_adminTopology_server_endpointAddress = Endpoint Address -#view_adminTopology_server_lastUpdateTime = Last Update Time -#view_adminTopology_server_mode = Mode -#view_adminTopology_server_nonSecurePort = Nonsecure Port -#view_adminTopology_server_removeSelected = Remove Selected -#view_adminTopology_server_securePort = Secure Port -#view_adminTopology_server_setMaintenance = Set Maintenance -#view_adminTopology_server_setNormal = Set Normal -#view_adminTopology_serverDetail_connectedAgents = Connected Agents -#view_adminTopology_serverDetail_installationDate = Installation Date -#view_adminTopology_serverDetail_operationMode = Operation Mode #view_adminTopology_servers = Servers #view_adminUsersDetails_dataTypeName = user -##view_adminUsers_failCreateUserWithExistingName = Failed to create user with existing name [{0}]. Please use another name. #view_admin_administration = Administration #view_admin_configuration = Configuration #view_admin_content = Content @@ -1259,8 +1165,6 @@ #view_configEdit_files = Files #view_configEdit_hideAll = Hide All #view_configEdit_jumpToSection = Jump to Section -##view_configEdit_maxBoundsExceeded = Cannot add another entry because the maximum size bounds has been met: {0} -##view_configEdit_minBoundsExceeded = Cannot delete this entry as the minimum has been set to: {0} #view_configEdit_msg_1 = Added property [{0}] to the set. #view_configEdit_msg_2 = Removed properties from the set. #view_configEdit_msg_3 = [{0} {1}] deleted from list. @@ -1668,7 +1572,6 @@ #view_measureTable_getLive = Get Live Value #view_measureTable_getLive_failure = Cannot get live values for those metrics. Make sure the agent is running and the managed resource is up. #view_measureTable_live_title = Live Data -##view_measureTable_startBeforeEnd = Start time should be before the end time. #view_measure_nan = --no data available-- #view_measurementOob_title = Suspect Metrics #view_menuBar_logout = Logout @@ -2103,8 +2006,8 @@ #widget_resourceFactoryWizard_infoStep_loadFail = Failed to get available Architectures #widget_resourceFactoryWizard_namePrompt = New Resource Name #widget_resourceFactoryWizard_templatePrompt = Connection Settings Template -#widget_resourceFactoryWizard_timeoutHelp = A timeout duration that if specified will override the default timeout for child resource creation (on the {0} Agent). The default timeout is set to 60 seconds. A higher value may be useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure. Note that if there is a timeout failure, it is still possible that the resource deployment succeeded. In the event of a timeout you may want to execute a discovery scan before attempting to redeploy the resource. -#widget_resourceFactoryWizard_timeoutFailure = Timed out +#widget_resourceFactoryWizard_timeoutHelp = A timeout duration. If specified will override the default timeout for child resource creation (on the {0} Agent). The default timeout is set to 60 seconds. Useful for particularly long create actions, like deployment of a large application. Usually used if a previous attempt suffered a timeout failure. +#widget_resourceFactoryWizard_timeoutFailure = Timed out. Note that it is possible that the deployment may still succeed. #widget_resourceFactoryWizard_uploadFailure = Failed to upload file #widget_resourceFactoryWizard_uploadFileStepName = Upload Resource Content File #widget_resourceFactoryWizard_uploadInProgress = The upload is in progress... This can take several minutes to complete for large distribution files. @@ -2190,10 +2093,7 @@ common_label_users = пПлÑзПваÑелО common_label_week = ÐœÐµÐŽÐµÐ»Ñ common_label_yesterday = ÐÑеÑа common_msg_areYouSure = ÐÑ ÑвеÑеМÑ? -##common_msg_asyncTimeout = {0}. This occurred because the server is taking a long time to complete this request. Please be aware that the server may still be processing your request and it may complete shortly. You can check the server logs to see if any abnormal errors occurred. common_msg_changeAutoDetected = ÐвÑППбМаÑÑжеМОе ОзЌеМеМОй -##common_msg_deleteConfirm = Are you sure you want to delete the # selected {0}? -##common_msg_deleted = {0} {1} deleted. common_msg_emphasizedNotePrefix = ÐÑОЌеÑаМОе: common_msg_loading = ÐагÑÑзка... common_msg_noItemsToShow = ÐÑÑÑÑÑÑвÑÑÑ ÑлеЌеМÑÑ ÐŽÐ»Ñ ÐŸÑПбÑÐ°Ð¶ÐµÐœÐžÑ @@ -2254,7 +2154,6 @@ common_title_edit = ÐзЌеМОÑÑ? common_title_edit_mode = РежОЌ ÑеЎакÑОÑÐŸÐ²Ð°ÐœÐžÑ common_title_enabled = ÐкÑОвОÑПваÑÑ? common_title_end = ÐÐŸÐœÐµÑ -common_title_favorites = ÐзбÑаММÑе common_title_generalProp = ÐбÑОе ÑвПйÑÑва common_title_group = ÐÑÑппа common_title_group_def_total = ÐпÑеЎелеМОе кПлОÑеÑÑва гÑÑпп @@ -2262,7 +2161,6 @@ common_title_group_member_health = СПÑÑПÑМОе ÑлеМа гÑÑÐ¿Ð¿Ñ common_title_groups = ÐÑÑÐ¿Ð¿Ñ common_title_help = ÐПЌПÑÑ common_title_host = Host -common_title_icon = ÐкПМка common_title_id = ID common_title_id_parent = РПЎОÑелÑÑкОй ID common_title_interval = ÐÐœÑеÑвал @@ -2396,11 +2294,6 @@ dataSource_configurationHistory_currentConfig = ÐÑП ÑекÑÑÐ°Ñ ÐºÐŸÐœÑО dataSource_configurationHistory_dateCompleted = ÐаÑа завеÑÑÐµÐœÐžÑ dataSource_configurationHistory_dateSubmitted = ÐаÑа пПЎÑвеÑÐ¶ÐŽÐµÐœÐžÑ dataSource_configurationHistory_error_fetchFailure = Ðе ÑЎалПÑÑ Ð·Ð°Ð³ÑÑзОÑÑ ÐžÑÑПÑÐžÑ ÐºÐŸÐœÑОгÑÑаÑОО -dataSource_configurationHistory_field_createdTime = ÐлПжеММÑй -dataSource_configurationHistory_field_id = ID -dataSource_configurationHistory_field_resource = РеÑÑÑÑ -dataSource_configurationHistory_field_status = СÑаÑÑÑ -dataSource_configurationHistory_field_subject = ÐПлÑзПваÑÐµÐ»Ñ dataSource_configurationHistory_updateType = ТОп ÐŸÐ±ÐœÐŸÐ²Ð»ÐµÐœÐžÑ dataSource_configurationHistory_updateType_group = ÐÑÑппа dataSource_configurationHistory_updateType_individual = ÐМЎОвОЎÑалÑÐœÑй @@ -2504,9 +2397,7 @@ favorites_recentlyViewed = ÐеЎавМП пÑПÑЌПÑÑеММÑе favorites_resources = ÐзбÑаММÑе ÑеÑÑÑÑÑ filter_from_date = ÐÑ filter_to_date = ÐП -##group_tree_groupOfResourceType = Group of [{0}] group_tree_partialClusterTooltip = {0} Оз {1} ÑлеМПв гÑÑÐ¿Ð¿Ñ ÐžÐŒÐµÑÑ ÑеÑÑÑÑ ''{2}'' -util_disambiguationReportDecorator_pluginSuffix = ({0} ÐлагОМ) util_errorHandler_nullException = ÐПзМОклП null ОÑклÑÑеМОе util_monitoringRequestCallback_error_checkServerStatusFailure = Ðе ÑЎаеÑÑÑ ÐŸÐ¿ÑеЎелОÑÑ ÑÑаÑÑÑ Ð°Ð²ÑПÑОзаÑОО - пÑПвеÑÑÑе ÑПÑÑПÑМОе ÑеÑвеÑа. util_userPerm_loadFailGlobal = Ðе ÑЎаеÑÑÑ Ð·Ð°Ð³ÑÑзОÑÑ Ð²Ð°ÑО глПбалÑÐœÑе пПлМПЌПÑÐžÑ - Ме пÑеЎПÑÑавлеМÑ. @@ -2551,24 +2442,16 @@ view_admin_downloads_cli_version = ÐеÑÑÐžÑ CLI ##view_admin_downloads_connectors_help = Connectors are software that is needed in order for some products to be manageable by {0}. You install connectors into some managed products so {0} agents can talk to them. See the documentation for more information. ##view_admin_downloads_connectors_loadError = Cannot get connectors info ##view_admin_downloads_connectors_none = No connectors are available for download -##view_admin_downloads_scriptModulesDownload = Script Modules Download -##view_admin_downloads_scriptModules_help = <p> Script modules are reusable components provided by RHQ to be used in your scripts (either alert scripts or CLI scripts). You can access them by using the "rhq://downloads/<module-name-without-file-extension>" URI in your scripting language of choice (i.e. in javascript, you would use the "require" function).</p> -##view_admin_downloads_scriptModules_loadError = Cannot load the list of available script modules -##view_admin_downloads_scriptModules_none = No script modules are available for download -##view_admin_systemSettings_serverDetails_productName = Product Name -##view_admin_systemSettings_serverDetails_serverName = Server Name -##view_alert_definition_condition_editor_availabilityDuration_state = Availability State -##view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration should be long enough (several minutes) to give the agent time to detect another availability state change that may correct the problem. -##view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The amount of time the resource must be at the given availability state before the condition is met. ##view_alert_details_field_resource_ancestry = Resource Ancestry ##view_alert_details_field_watched_resource = Watched Resource -##view_bundle_list_error4 = No bundles found in this repository ##view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From] {0} [REVERT To] {1} -##view_configEdit_property = Property +##view_configEdit_description = Description +##view_configEdit_property = Vlastnost ##view_configEdit_unset = Unset? ##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> ##view_group_common_emptyGroup = An empty group is always considered as mixed. ##view_inventory_resources_disableSuccessful = You have successfully disabled the selected resources and their children, [{0}] resources. +##view_configEdit_value = Value ##view_messageCenter_messageRootCause = Root Cause ##view_operationHistoryList_cancelConfirm = Are you sure you want to cancel the selected operations? NOTE: Only those selected operations that are currently "in progress" will be attempted to be canceled. ##view_operationHistoryList_cancelFailure = The cancel request failed for the operation with the history ID of [{0}]. @@ -2577,10 +2460,120 @@ view_admin_downloads_cli_version = ÐеÑÑÐžÑ CLI ##view_operationHistoryList_deleteFailure = Failed to delete operation history [{0}]. ##view_operationHistoryList_deletePartialSuccess = Deleted [{0}] operation history items, but failed to delete the items with the following IDs: {1} ##view_operationHistoryList_deleteSuccess = Deleted [{0}] operation history items. -##view_resource_monitor_calltime_destinationFilter = Destination Filter -##view_resource_monitor_calltime_loadFailed = Could not load call time data -##view_resource_monitor_calltime_total = Total Time -##widget_recordEditor_info_recordCreatedConcise = {0} created. -##widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] created. -##widget_recordEditor_info_recordUpdatedConcise = {0} updated. -##widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] updated. +view_admin_plugins_server=СеÑÐ²ÐµÑ +view_admin_security=ÐезПпаÑМПÑÑÑ +view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc=ÐÑлО в ÑеÑеМОе ÑÑПгП кПлОÑеÑÑва +view_adminConfig_downloads=ÐагÑÑзкО +view_adminConfig_systemSettings=СОÑÑеЌМÑе МаÑÑÑПйкО +view_adminContent_contentSources=ÐÑÑПÑМОкО кПМÑеМÑа +view_adminRoles_assignedGroups=ÐазМаÑеММÑе гÑÑÐ¿Ð¿Ñ ÑеÑÑÑÑПв +view_adminRoles_assignedSubjects=ÐазМаÑеММÑе ÑÑбÑекÑÑ +view_adminRoles_failLdap=Ðе ÑЎалПÑÑ ÐŸÐ¿ÑеЎелОÑÑ, МаÑÑÑПеМ лО LDAP - пÑеЎпПлПжОÑелÑМП LDAP ПÑÑÑÑÑÑвÑеÑ. +view_adminRoles_failLdapGroups=Ðе ÑЎалПÑÑ Ð¿ÐŸÐ»ÑÑОÑÑ LDAP-гÑÑппÑ. ÐÑеЎпПлПжОÑелÑМП LDAP гÑÑÐ¿Ð¿Ñ ÐŸÑÑÑÑÑÑвÑÑÑ +view_adminRoles_failLdapGroupsRole=Ðе ÑЎалПÑÑ Ð·Ð°Ð³ÑÑзОÑÑ LDAP гÑÑппÑ, ЎПÑÑÑпМÑе ÐŽÐ»Ñ ÑПлО. +view_adminRoles_failRoles=Ðе ÑЎалПÑÑ Ð¿ÐŸÐ»ÑÑОÑÑ ÑПлО. +view_adminRoles_globalPerms=ÐлПбалÑÐœÑе пПлМПЌПÑÐžÑ +view_adminRoles_ldapGroups=LDAP-гÑÑÐ¿Ð¿Ñ +view_adminRoles_ldapGroupsReadOnly=ЎаММÑе LDAP гÑÑпп ЎПÑÑÑÐ¿ÐœÑ ÑПлÑкП ÐŽÐ»Ñ ÑÑÐµÐœÐžÑ +view_adminRoles_permissions_autoselecting_configureRead_implied=ÐвÑПЌаÑОÑеÑкО ПÑклÑÑеМП CONFIGURE_WRITE пПлМПЌПÑОе, пПÑкПлÑÐºÑ ÐŸÑÑÑÑÑÑвÑÐµÑ CONFIGURE_READ... +view_adminRoles_permissions_autoselecting_configureWrite_implied=ÐвÑПЌаÑОÑеÑкО вÑбÑаМП CONFIGURE_READ пПлМПЌПÑОе, пПÑкПлÑÐºÑ CONFIGURE_WRITE пПЎÑазÑЌеваеÑ, ÑÑП ... +view_adminRoles_permissions_autoselecting_manageInventory_implied=ÐвÑПЌаÑОÑеÑкО ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ ÐœÐµ вÑбÑаММÑе пПлМПЌПÑÐžÑ ÑеÑÑÑÑÑПв, пПÑкПлÑÐºÑ MANAGE_INVENTORY пÑÐµÐŽÐ¿ÐŸÐ»Ð°Ð³Ð°ÐµÑ Ð²Ñе пПлМПЌПÑÐžÑ ÑеÑÑÑÑа... +view_adminRoles_permissions_autoselecting_manageSecurity_implied=ÐвÑПЌаÑОÑеÑкО ÑÑÑÐ°ÐœÐŸÐ²Ð»ÐµÐœÑ ÐœÐµÐ²ÑбÑаММÑе пПлМПЌПÑОÑ, пПÑкПлÑÐºÑ MANAGE_SECURITY вклÑÑÐ°ÐµÑ Ð²Ñе ÐŽÑÑгОе пПлМПЌПÑОÑ... +view_adminRoles_permissions_globalPermissions=ÐлПбалÑÐœÑе пПлМПЌÑÐžÑ +view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection={0} пПлМПЌПÑÐžÑ ÐœÐ° ÑÑеМОе Ме ЌПгÑÑ Ð±ÑÑÑ ÐŸÑклÑÑеМÑ, пПка пÑеЎваÑОÑелÑМП {0} пПлМПЌПÑÐžÑ Ð·Ð°Ð¿ÐžÑО, кПÑПÑÑе вклÑÑаÑÑ Ð¿ÐŸÐ»ÐœÐŸÐŒÐŸÑÐžÑ ÐœÐ° ÑÑеМОе, Ме бÑÐŽÑÑ ÐŸÑклÑÑеМÑ. +view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection={0} пПлМПЌПÑÐžÑ ÐœÐµ ЌПгÑÑ Ð±ÑÑÑ ÐŸÑклÑÑеМÑ, пПка пÑеЎваÑОÑелÑМП Manage Inventory, кПÑПÑÐ°Ñ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð²Ñе пПлМПЌПÑÐžÑ ÑеÑÑÑÑа, Ме бÑÐŽÐµÑ ÐŸÑклÑÑеМП. +view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection={0} пПлМПЌПÑÐžÑ ÐœÐµ ЌПгÑÑ Ð±ÑÑÑ ÐŸÑклÑÑеМÑ, пПка пÑеЎваÑОлÑМП Manage Security пПлМПЌПÑОе, кПÑПÑПе вклÑÑÐ°ÐµÑ Ð²Ñе ÐŽÑÑгОе пПлМПЌПÑОÑ, Ме бÑÐŽÐµÑ ÐŸÑклÑÑеМП. +view_adminRoles_permissions_isAuthorized=ÐвÑПÑОзПваМÑ? +view_adminRoles_permissions_isRead=ЧОÑаÑÑ? +view_adminRoles_permissions_isWrite=ÐапОÑÑ? +view_adminRoles_permissions_permDesc_manageBundles=ÐПжМП ÑПзЎаваÑÑ, ПбМПвлÑÑÑ Ðž ÑЎалÑÑÑ ÑÐ·Ð»Ñ Ð¿ÑеЎПÑÑÐ°Ð²Ð»ÐµÐœÐžÑ (пÑПÑЌПÑÑ Ð¿ÑеЎПÑÑавлÑеÑÑÑ Ð²ÑеЌ) +view_adminRoles_permissions_permDesc_manageInventory=ÐŸÐ±Ð»Ð°ÐŽÐ°ÐµÑ Ð¿ÐŸÐ»ÐœÑЌО пПлМПЌПÑОÑЌО ÑеÑÑÑÑа, как ПпОÑаМП МОже, ÐŽÐ»Ñ Ð²ÑÐµÑ ÑеÑÑÑÑПв; ЌПжМП ÑПзЎаваÑÑ, ПбМПвлÑÑÑ Ðž ÑЎалÑÑÑ Ð³ÑÑппÑ; ЌПжМП ОЌпПÑÑОÑПваÑÑ Ð°Ð²ÑПЌаÑОÑеÑкО-ПбМаÑÑжОваеЌÑе О ПбМаÑÑжОваеЌÑе вÑÑÑÐœÑÑ ÑеÑÑÑÑÑ +view_adminRoles_permissions_permDesc_manageRepositories=ЌПжМП ÑПзЎаваÑÑ, ПбМПвлÑÑÑ ÐžÐ»Ðž ÑЎалÑÑÑ ÑепПзОÑПÑОО лÑбПгП пПлÑзПваÑÐµÐ»Ñ (кажЎÑй ÐŒÐŸÐ¶ÐµÑ ÑПзЎаваÑÑ ÑвПО ÑПбÑÑвеММÑе ÑепПзОÑПÑОО), ЌПжМП аÑÑПÑООÑПваÑÑ ÐžÑÑПÑМОкО кПМÑеМÑа Ñ ÑезпПзОÑПÑОÑЌО. +view_adminRoles_permissions_permDesc_manageSecurity=ЌПжМП ÑПзЎаваÑÑ, ПбМПвлÑÑÑ ÐžÐ»Ðž ÑЎалÑÑÑ Ð¿ÐŸÐ»ÑзПваÑелей О ÑПлО - вклÑÑÐ°ÐµÑ Ð²Ñе ÐŽÑÑгОе пПлМПЌПÑÐžÑ +view_adminRoles_permissions_permReadDesc_configure=пÑПÑЌПÑÑ ÐºÐŸÐœÑОгÑÑаÑОО ÑеÑÑÑÑа О ОÑÑПÑÐžÑ Ð²ÐµÑÑОй кПМÑОгÑÑаÑОО ÑеÑÑÑÑа +view_adminRoles_permissions_permReadDesc_control=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÐŽÐŸÑÑÑпМÑÑ ÐŸÐ¿ÐµÑаÑОй О ОÑПÑОО вÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÑ ÐŸÐ¿ÐµÑаÑОО +view_adminRoles_permissions_permReadDesc_createChildResources=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÐžÑÑПÑОО ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐŽÐŸÑеÑМегП ÑеÑÑÑÑа +view_adminRoles_permissions_permReadDesc_deleteChildResources=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÐžÑÑПÑОО ÑÐŽÐ°Ð»ÐµÐœÐžÑ ÐŽÐŸÑеÑМегП ÑеÑÑÑÑа +view_adminRoles_permissions_permReadDesc_inventory=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÑвПйÑÑв ÑеÑÑÑÑа (МаОЌеМПваМОе, ПпОÑаМОе, веÑÑÐžÑ Ðž Ñ.ÐŽ.), МаÑÑÑПйкО пПЎклÑÑеМОÑ, О ОÑÑПÑÐžÑ ÐœÐ°ÑÑÑПек пПЎклÑÑÐµÐœÐžÑ +view_adminRoles_permissions_permReadDesc_manageAlerts=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÐŸÐ¿ÑеЎелеМОй пÑеЎÑпÑежЎеМОй О ОÑÑПÑОО пÑеЎÑпÑÐµÐ¶ÐŽÐµÐœÐžÑ +view_adminRoles_permissions_permReadDesc_manageContent=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÑÑÑаМПвлеММÑÑ Ðž ЎПÑÑÑпМÑÑ Ð¿Ð°ÐºÐµÑПв; пÑПÑЌПÑÑ ÐžÑÑПÑОО ÑÑÑаМПвкО пакеÑа +view_adminRoles_permissions_permReadDesc_manageEvents=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÑПбÑÑОй +view_adminRoles_permissions_permReadDesc_manageMeasurements=(ÐÐÐÐ ÐÐУÐÐÐÐÐÐЫÐ) пÑПÑЌПÑÑ ÐŽÐ°ÐœÐœÑÑ ÐŒÐµÑÑОкО О кПллекÑОО плаМОÑПвÑОкПв +view_adminRoles_permissions_permWriteDesc_configure=ПбМПвОÑÑ ÐºÐŸÐœÑОгÑÑаÑÐžÑ ÑеÑÑÑÑа; ÑЎалОÑÑ ÑлеЌеМÑÑ ÐžÑÑПÑОО веÑÑОй кПМÑОгÑÑаÑОО ÑеÑÑÑÑа +view_adminRoles_permissions_permWriteDesc_control=вÑпПлМÑÑÑ ÐŸÐ¿ÐµÑаÑОО; ÑЎалОÑÑ ÑлеЌеМÑÑ ÐžÑÑПÑОО вÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÑ ÐŸÐ¿ÐµÑаÑОй +view_adminRoles_permissions_permWriteDesc_createChildResources=ÑПзЎаÑÑ ÐœÐŸÐ²Ñй ЎПÑеÑМОй ÑеÑÑÑÑÑ (ÐŽÐ»Ñ ÑОпПв ЎПÑеÑÐœÐžÑ ÑеÑÑÑÑПв, кПÑПÑÑе ЌПгÑÑ Ð±ÑÑÑ ÑПзЎаМÑ) +view_adminRoles_permissions_permWriteDesc_deleteChildResources=ÑбÑаÑÑ ÑеÑÑÑÑ ÐžÐ· ОМвеМÑаÑОзаÑОО; ÑЎалОÑÑ ÑеÑÑÑÑÑ (ÐŽÐ»Ñ ÑОпПв ÑеÑÑÑÑПв, кПÑПÑÑе ЌПгÑÑ Ð±ÑÑÑ ÑЎалеМÑ) +view_adminRoles_permissions_permWriteDesc_inventory=ПбМПвОÑÑ ÐœÐ°ÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÐµ ÑеÑÑÑÑа, веÑÑОÑ, ПпОÑаМОе О МаÑÑÑПйкО пПЎклÑÑеМОÑ; ÑЎалОÑÑ ÑлеЌеМÑÑ ÐžÑÑПÑОО МаÑÑÑПек пПЎклÑÑÐµÐœÐžÑ +view_adminRoles_permissions_permWriteDesc_manageAlerts=ÑПзЎаÑÑ, ПбМПвОÑÑ Ðž ÑЎалОÑÑ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÑвеЎПЌлеМОй; пПЎÑвеÑжЎаÑÑ Ðž ÑЎалÑÑÑ ÑлеЌеМÑÑ ÐžÑÑПÑОО пÑеЎÑпÑежЎеМОй +view_adminRoles_permissions_permWriteDesc_manageContent=пПЎпОÑаÑÑÑÑ ÐœÐ° ОÑÑПÑМОкО кПМÑеМÑа; ÑÑÑаМавлОваÑÑ Ðž ÑЎалÑÑÑ Ð¿Ð°ÐºÐµÑÑ +view_adminRoles_permissions_permWriteDesc_manageEvents=ÑЎалÑÑÑ ÑПбÑÑÐžÑ +view_adminRoles_permissions_permWriteDesc_manageMeasurements=ПбМПвлеМОе ЌеÑÑОк кПллекÑОО плаМОÑПвÑОкПв +view_adminRoles_permissions_perm_configure=ÐПМÑОгÑÑаÑÐžÑ +view_adminRoles_permissions_perm_control=УпÑавлеМОе +view_adminRoles_permissions_perm_createChildResources=СПзЎаМОе ЎПÑеÑÐœÐžÑ ÑеÑÑÑÑПв +view_adminRoles_permissions_perm_deleteChildResources=УЎалеМОе ЎПÑеÑÐœÐžÑ ÑеÑÑÑÑПв +view_adminRoles_permissions_perm_inventory=ÐМвеМÑаÑОзаÑÐžÑ +view_adminRoles_permissions_perm_manageAlerts=УпÑавлеМОе пÑеЎÑпÑежЎеМОÑЌО +view_adminRoles_permissions_perm_manageBundles=УпÑавлеМОе ÑзлаЌО +view_adminRoles_permissions_perm_manageContent=УпÑавлеМОе кПМÑеМÑПЌ +view_adminRoles_permissions_perm_manageEvents=УпÑавлеМОе ÑПбÑÑОÑЌО +view_adminRoles_permissions_perm_manageInventory=УпÑавлеМОе ОМвеМÑаÑОзаÑОей +view_adminRoles_permissions_perm_manageMeasurements=УпÑавлеМОе ОзЌеÑеМОÑЌО +view_adminRoles_permissions_perm_manageRepositories=УпÑавлеМОе ÑепПзОÑПÑОÑЌО +view_adminRoles_permissions_perm_manageSecurity=УпÑавлеМОе безПпаÑМПÑÑÑÑ +view_adminRoles_permissions_perm_manageSettings=УпÑавлеМОе МаÑÑÑПйкаЌО +view_adminRoles_permissions_read=ЧÑеМОе: +view_adminRoles_permissions_readAccessImplied=ÐПÑÑÑп ÑÑÐµÐœÐžÑ ÐŽÐ»Ñ {0} пПлМПЌПÑÐžÑ Ð¿ÐŸÐŽÑазÑЌеваеÑÑÑ Ðž Ме ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ Ð·Ð°ÐºÑÑÑ. +view_adminRoles_permissions_resourcePermissions=ÐПлМПЌÑÐžÑ ÑеÑÑÑÑа +view_adminRoles_permissions_write=ÐапОÑÑ: +view_adminRoles_resourcePerms=ÐПлМПЌПÑÐžÑ ÑеÑÑÑÑа +view_adminRoles_roleAdded=Ð ÐŸÐ»Ñ [{0}] ЎПбавлеМа. +view_adminRoles_roleDeleteFailed=Ðе ÑЎалПÑÑ ÑЎалОÑÑ ÑÐŸÐ»Ñ [{0}]. +view_adminRoles_roleDeleted=Ð ÐŸÐ»Ñ [{0}] ÑЎалеМа +view_adminRoles_roleUpdateFailed=Ðе ÑЎалПÑÑ ÐŸÐ±ÐœÐŸÐ²ÐžÑÑ ÑÐŸÐ»Ñ [{0}]. +view_adminRoles_roleUpdated=Ð ÐŸÐ»Ñ [{0}] ПбМПвлеМа. +view_adminTemplates_editAlertTemplate=РеЎакÑОÑПваÑÑ ÑаблПМ пÑеЎÑпÑÐµÐ¶ÐŽÐµÐœÐžÑ +view_adminTemplates_platformServices=СеÑвОÑÑ Ð¿Ð»Ð°ÑÑПÑÐŒÑ +view_adminTemplates_platforms=ÐлаÑÑПÑÐŒÑ +view_adminTemplates_prompt_disabledAlertTemplates=ÐПлОÑеÑÑвП ÑаблПМПв пÑеЎÑпÑежЎеМОй, кПÑПÑÑе бÑлО ÑПзЎаМÑ, МП закÑÑÑÑ ÐŽÐ»Ñ ÑÑПгП ÑОпа ÑеÑÑÑÑПв +view_adminTemplates_prompt_disabledMetricTemplates=ÐПлОÑеÑÑвП плаМОÑПвÑОкПЌ ЌеÑÑОк, кПÑПÑÑе закÑÑÑÑ Ð¿ÐŸ ÑЌПлÑÐ°ÐœÐžÑ ÐŽÐ»Ñ ÑÑПгП ÑОпа ÑеÑÑÑÑПв +view_adminTemplates_prompt_enabledAlertTemplates=ÐПлОÑеÑÑвП ÑаблПМПв ÑвеЎПЌлеМОй, кПÑПÑÑе вклÑÑÐµÐœÑ ÐŽÐ»Ñ ÑÑПгП ÑОпа ÑеÑÑÑÑПв +view_adminTemplates_prompt_enabledMetricTemplates=ÐПлОÑеÑÑвП плаМОÑПвÑОкПв ЌеÑÑОк, кПÑПÑÑе вклÑÑÐµÐœÑ Ð¿ÐŸ ÑЌПлÑÐ°ÐœÐžÑ ÐŽÐ»Ñ ÑÑПгП ÑОпа ÑеÑÑÑÑПв +view_adminTemplates_servers=СеÑвеÑÑ +view_adminTopology_affinityGroups=ÐÐŸÑ ÐŸÐ¶ÐžÐµ гÑÑÐ¿Ð¿Ñ +view_adminTopology_agents=ÐгеМÑÑ +view_adminTopology_partitionEvents=СПбÑÑÐžÑ ÑазЎела +view_adminTopology_remoteAgentInstall=УÑÑаМПвка ÑЎалеММПгП агеМÑа +view_adminTopology_servers=СеÑвеÑÑ +view_adminUsersDetails_dataTypeName=пПлÑзПваÑÐµÐ»Ñ +view_admin_systemSettings_AgentMaxQuietTimeAllowed_name=ÐакÑОЌалÑМП ЎПпÑÑÑОЌПе вÑÐµÐŒÑ "ЌПлÑаМОÑ" агеМÑа +view_admin_systemSettings_AlertPurge_desc=Ðак ЎПлгП ОÑÑПÑÐžÑ Ð¿ÑеЎÑпÑежЎеМОй ЎПлжМа Ñ ÑаМОÑÑÑÑ Ð¿ÑежЎе ÑеЌ бÑÐŽÐµÑ ÐŸÑОÑеМа Оз ÐÐ. УказÑваеÑÑÑ Ð² ÐŽÐœÑÑ . +view_admin_systemSettings_AlertPurge_name=УЎалОÑÑ Ð¿ÑеЎÑпÑежЎеМОÑ, ÑÑаÑÑе ÑеЌ +view_admin_systemSettings_AvailabilityPurge_desc=Ðак ЎПлгП ЎаММÑе П ЎПÑÑÑпМПÑÑО ÐŽÐŸÐ»Ð¶ÐœÑ Ñ ÑаМОÑÑÑÑ, пÑежЎе ÑеЌ бÑÐŽÑÑ ÐŸÑОÑÐµÐœÑ ÐžÐ· ÐÐ. УказÑваеÑÑÑ Ð² ÐŽÐœÑÑ . +view_admin_systemSettings_AvailabilityPurge_name=УЎалОÑÑ ÐŽÐ°ÐœÐœÑе П ЎПÑÑÑпМПÑÑО, ÑÑаÑÑе ÑеЌ +view_admin_systemSettings_BaseURL_desc=URL GUI ÑеÑвеÑа, ОÑпПлÑзÑеЌÑй главМÑÐŒ ПбÑазПЌ ÐŽÐ»Ñ Ð¿ÑеЎÑпÑежЎеМОй пПÑÑеЎÑÑвПЌ email ÑвеЎПЌлеМОй. +view_admin_systemSettings_BaseURL_name=URL GUI кПМÑПлО +view_admin_systemSettings_BaselineDataSet_desc=ÐПлОÑеÑÑвП пÑПÑеЎÑÐžÑ ÐžÐ·ÐŒÐµÑеМОй, ОÑпПлÑзÑеЌÑÑ ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ Ð±Ð°Ð·ÐŸÐ²ÐŸÐ¹ лОМОО. УказÑваеÑÑÑ Ð² ÐŽÐœÑÑ . +view_admin_systemSettings_BaselineDataSet_name=ÐÐ°Ð±ÐŸÑ ÐŽÐ°ÐœÐœÑÑ Ð±Ð°Ð·ÐŸÐ²ÐŸÐ¹ лОМОО +view_admin_systemSettings_BaselineFrequency_desc=ЧаÑÑПÑа, Ñ ÐºÐŸÑПÑПй вÑпПлМÑеÑÑÑ Ð°Ð²ÑП-ÑаÑÑÐµÑ Ð±Ð°Ð·ÐŸÐ²ÑÑ Ð»ÐžÐœÐžÐ¹. ÐÑлО 0, авÑП-ÑаÑÑÐµÑ Ð±Ð°Ð·ÐŸÐ²ÐŸÐ¹ лОМОО ПÑклÑÑеМ. УказÑваеÑÑÑ Ð² ÐŽÐœÑÑ . ÐакÑОЌалÑМПе зМаÑеМОе - 'Baseline Dataset'. +view_admin_systemSettings_BaselineFrequency_name=ЧаÑÑПÑа вÑÑОÑÐ»ÐµÐœÐžÑ Ð±Ð°Ð·ÐŸÐ²ÐŸÐ¹ лОМОО +view_admin_systemSettings_DataMaintenance_desc=Ðак ÑаÑÑП вÑпПлМÑеÑÑÑ ÐŸÐ±ÑлÑжОваМОе ÐÐ (МапÑОЌеÑ, vacuuming еÑлО ОÑпПлÑзÑеÑÑÑ Postgres). УказÑваеÑÑÑ Ð² ÑаÑÐ°Ñ . +view_admin_systemSettings_DataMaintenance_name=ÐеÑОПЎ ПбÑлÑÐ¶ÐžÐ²Ð°ÐœÐžÑ ÐÐ +view_admin_systemSettings_DataReindex_desc=ÐÑлО вклÑÑеМП, ПпÑеЎелеММÑе ÑаблОÑÑ ÐРбÑÐŽÑÑ Ð¿ÐµÑОПЎОÑеÑкО пеÑеОМЎекÑОÑПваÑÑÑÑ. +view_admin_systemSettings_DataReindex_name=ÐеÑеОМЎекÑОÑПваÑÑ ÑаблОÑÑ ÐŽÐ°ÐœÐœÑÑ ÐºÐ°Ð¶ÐŽÑÑ ÐœÐŸÑÑ +view_admin_systemSettings_EnableAgentAutoUpdate_desc=ÐпÑеЎелÑеÑ, ÑазÑеÑÐ°ÐµÑ Ð»Ðž ÑеÑÐ²ÐµÑ Ð°Ð³ÐµÐœÑаЌ ÑаЌПÑÑПÑÑелÑМПе авÑППбМПвлеМОе. ÐÑ ÐœÐµ ÑЌПжеÑе загÑÑзОÑÑ ÐŽÐžÑÑÑОбÑÑÐžÐ²Ñ Ð°Ð³ÐµÐœÑа Ñ ÑеÑвеÑа, еÑлО ÑÑа ПпÑÐžÑ ÐŸÑклÑÑеМа. +view_admin_systemSettings_EnableAgentAutoUpdate_name=ÐклÑÑОÑÑ Ð°Ð²ÑППбМПвлеМОе агеМÑПв +view_admin_systemSettings_EnableDebugMode_desc=ÐÑлО вклÑÑеМП, ÑеÑÐ²ÐµÑ Ð±ÑÐŽÐµÑ Ð²Ñ ÐŸÐŽÐžÑÑ Ð² ПÑлаЎПÑÐœÑй ÑежОЌ. +view_admin_systemSettings_EnableDebugMode_name=ÐклÑÑОÑÑ ÑежОЌ ПÑлаЎкО +view_admin_systemSettings_EnableExperimentalFeatures_desc=ÐÑлО вклÑÑеМП, лÑбÑе ÑкÑпеÑОЌеМÑалÑÐœÑе Ñ Ð°ÑакÑеÑОÑÑОкО, кПÑПÑÑе ÑÑÑеÑÑвÑÑÑ Ð² ÑекÑÑеЌ пÑПЎÑкÑе бÑÐŽÑÑ ÐŽÐŸÑÑÑпМÑ. +view_admin_systemSettings_EnableExperimentalFeatures_name=ÐклÑÑОÑÑ ÑкÑпеÑОЌеМÑалÑÐœÑе Ñ Ð°ÑакÑеÑОÑÑОкО +view_admin_systemSettings_EventPurge_desc=Ðак ЎПлгП ЎаММÑе ÑПбÑÑОй ÐŽÐŸÐ»Ð¶ÐœÑ Ñ ÑаМОÑÑÑÑ, пÑежЎе ÑеЌ бÑÐŽÑÑ ÑÐŽÐ°Ð»ÐµÐœÑ ÐžÐ· ÐÐ. УказÑваеÑÑÑ Ð² ÐŽÐœÑÑ . +view_admin_systemSettings_EventPurge_name=УЎалОÑÑ ÑПбÑÑОÑ, ÑÑаÑÑе ÑеЌ +view_admin_systemSettings_LDAPBaseDN_name=ÐПОÑк в базе +view_admin_systemSettings_LDAPBindDN_desc=ÐÐŒÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ ÐŽÐ»Ñ Ð¿ÐŸÐŽÐºÐ»ÑÑÐµÐœÐžÑ Ðº LDAP-ÑеÑвеÑÑ Ð¿ÑО запÑПÑе LDAP Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ . Ðак пÑавОлП, ÑÑП пПлМПе ПÑлОÑОÑелÑМПе ÐžÐŒÑ (DN) LDAP ЌеМеЎжеÑа пПлÑзПваÑелÑ, МапÑÐžÐŒÐµÑ cn=Manager,dc=redhat,dc=com +view_admin_systemSettings_LDAPBindDN_name=ÐÐŒÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ +view_admin_systemSettings_LDAPBindPW_desc=ÐЎеМÑОÑОкаÑÐžÐŸÐœÐœÐ°Ñ ÐžÐœÑПÑЌаÑÐžÑ Ð¿ÐŸÐ»ÑзПваÑÐµÐ»Ñ ÐŽÐ»Ñ Ð¿ÐŸÐŽÐºÐ»ÑÑÐµÐœÐžÑ Ðº LDAP ÑеÑвеÑÑ Ð¿ÑО запÑПÑе LDAP Ð±Ð°Ð·Ñ ÐŽÐ°ÐœÐœÑÑ +view_admin_systemSettings_LDAPBindPW_name=ÐаÑÐŸÐ»Ñ +view_admin_systemSettings_JAASProvider_desc=ÐÑпПлÑзПваÑÑ LDAP ÐŽÐ»Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÐžÐŽÐµÐœÑОÑМПÑÑО пПлÑзПваÑелÑ? +view_admin_systemSettings_JAASProvider_name=ÐклÑÑОÑÑ LDAP +view_admin_systemSettings_LDAPBaseDN_desc=ÐÑМПваМОе ЎеÑева каÑалПгПв ÐŽÐ»Ñ Ð¿ÐŸÐžÑка ОЌеМ пПлÑзПваÑелей О паÑПлей пÑО аÑÑеМÑОÑОкаÑОО пПлÑзПваÑелей, МапÑÐžÐŒÐµÑ ou=People,dc=redhat,dc=com
commit a79c9c0ed72195da23d1b735bec6b091d56988ce Author: Stefan Negrea snegrea@redhat.com Date: Wed Jan 16 14:56:45 2013 -0600
Add korean locale to the list of default locales build by core gui.
diff --git a/modules/enterprise/gui/coregui/pom.xml b/modules/enterprise/gui/coregui/pom.xml index 4b5c522..0f58d9b 100644 --- a/modules/enterprise/gui/coregui/pom.xml +++ b/modules/enterprise/gui/coregui/pom.xml @@ -68,7 +68,7 @@ should each have two corresponding message bundle properties files under src/main/resources/org/rhq/enterprise/gui/coregui/client/. For example, the "ja" locale has Messages_ja.properties and MessageConstants_ja.properties. --> - <gwt.locale>en,de,ja,pt,zh,ru,cs</gwt.locale> + <gwt.locale>en,de,ja,pt,zh,ru,cs,ko</gwt.locale>
<!-- The locale that GWT should fallback to if the user specified an unsupported locale via the 'locale' query string parameter. -->
commit dcacb5d5b465810940b023397ed9cfd3e839e957 Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Jan 16 14:39:36 2013 -0500
Try to make the Welcome message portlet cleaner and more useful by removing useless canned text and offering a few basic links.
** Note - I18N needed for the non-EN locales **
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java index 08632732..b3420f1 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java @@ -191,6 +191,10 @@ public class LinkManager { return getEntityTabLink(group, "Monitoring", "Graphs"); }
+ public static String getAllResourcesLink() { + return "#Inventory/Resources/AllResources"; + } + public static String getGroupDefinitionLink(int groupDefinitionId) { if (GWT) { return "#Inventory/Groups/DynagroupDefinitions/" + groupDefinitionId; @@ -276,7 +280,7 @@ public class LinkManager {
public static String getAutodiscoveryQueueLink() { if (GWT) { - return "#Administration/Security/Auto%20Discovery%20Queue"; + return "#Inventory/Resources/AutodiscoveryQueue"; } else { return "/rhq/discovery/queue.xhtml"; } @@ -556,4 +560,9 @@ public class LinkManager {
return result + "/Snapshot"; } + + public static String getHelpLink() { + return "#Help"; + } + } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/util/MessagePortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/util/MessagePortlet.java index 9b8e4e0..95df516 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/util/MessagePortlet.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/util/MessagePortlet.java @@ -33,6 +33,7 @@ import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.core.domain.configuration.definition.PropertySimpleType; import org.rhq.core.domain.dashboard.DashboardPortlet; import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.LinkManager; import org.rhq.enterprise.gui.coregui.client.UserSessionManager; import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource; import org.rhq.enterprise.gui.coregui.client.dashboard.ConfigurablePortlet; @@ -57,7 +58,11 @@ public class MessagePortlet extends LocatableHTMLPane implements ConfigurablePor private static String DEFAULT_MESSAGE; { ProductInfo productInfo = CoreGUI.get().getProductInfo(); - DEFAULT_MESSAGE = MSG.view_dashboardsManager_message_title_details(productInfo.getShortName()); + String link1 = LinkManager.getAutodiscoveryQueueLink(); + String link2 = LinkManager.getAllResourcesLink(); + String link3 = LinkManager.getHelpLink(); + DEFAULT_MESSAGE = MSG.view_dashboardsManager_message_title_details(productInfo.getShortName(), link1, link2, + link3); }
public MessagePortlet(String locatorId) { diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties index ee61a32..11f505d 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties @@ -1330,7 +1330,7 @@ view_dashboardManager_saved = Saved dashboard {0} to server view_dashboardManager_success = Saved dashboard view_dashboard_favorites_error1 = Failed to load favorite Resources. view_dashboardsManager_error1 = Failed to add new dashboard -view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>The RHQ project is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p> +view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboards_confirm1 = Are you sure you want to delete view_dashboards_portlets_refresh_fail1 = Failed to update interval for portlets that auto-refresh view_dashboards_portlets_refresh_fail2 = Failed to disable reload for portlets that auto-refresh diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties index 42733b7..4b815c2 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties @@ -1348,7 +1348,7 @@ view_dashboardManager_saved = Dashboard {0} byl uloÅŸen na server view_dashboardManager_success = Dashboard uloÅŸen view_dashboard_favorites_error1 = NepodaÅilo se naÄÃst oblÃbené zdroje. view_dashboardsManager_error1 = NepodaÅilo se pÅidat novÃœ dashboard -view_dashboardsManager_message_title_details = <h1>VÃtejte v {0}</h1>\n<p>RHQ projekt je abstraktnà a modulárnÄ zaloÅŸená platforma pro management, která poskytuje systémy pro ÅÃzenà a správu mnoha produktů a jinÃœch platforem napÅÃÄ mnoÅŸinou klÃÄovÃœch vlastnostÃ. CelÃœ projekt je navrÅŸen do do vrstvenÃœch modulů, které poskytujà flexibilnà architekturu pro nasazenÃ. Poskytuje centrálnà uÅŸivatelské rozhranà pro audit a správu historickÃœch informacà napÅÃÄ celÃœm podnikem. Architektura Server/Agenti poskytuje vzdálenou správu a zásuvné moduly implementujà vÅ¡echny specifické poÅŸadavky pro jednotlivé spravované produkty.</p>\n <p>Tento vÃœchozà dashboard (palubnà deska) můşe bÃœt editován kliknutÃm na tlaÄÃtko (editaÄnà mód) nahoÅe.</p> +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboards_confirm1 = Jste si jisti, ÅŸe to chcete smazat view_dashboards_portlets_refresh_fail1 = NepodaÅilo se zmÄnit interval auto aktualizace pro portlety view_dashboards_portlets_refresh_fail2 = NepodaÅilo se zneplatnit obnovovánà pro portlety diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties index 31c4f0a..2e3523d 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties @@ -1201,7 +1201,7 @@ view_dashboardManager_saved = Das Dashboard {0} wurde auf dem Server geichert view_dashboardManager_success = Dashboard gespeichert view_dashboard_favorites_error1 = Konnte die Ressoucen-Lesezeichen nicht laden view_dashboardsManager_error1 = Konnte das neue Dashboard nicht hinzufÃŒgen -##view_dashboardsManager_message_title_details = <h1>Willkommen bei RHQ</h1>\n<p>Das RHQ-Projekt is an abstraction and plug-in based systems management suite that provides extensible and integrated systems management for multiple products and platforms across a set of core features. The project is designed with layered modules that provide a flexible architecture for deployment. It delivers a core user interface that delivers audited and historical management across an entire enterprise. A Server/Agent architecture provides remote management and plugins implement all specific support for managed products.</p>\n <p>This default dashboard can be edited by clicking the (edit mode) button above.</p> +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboards_confirm1 = Sind Sie sicher, dass Sie löschen möchten view_dashboards_title = Dashboard ##view_drift_button_detectNow = Detect Now diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties index 8c84707..b6fda76 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties @@ -1327,7 +1327,7 @@ view_dashboardManager_saved = ããã·ã¥ããŒã {0} ããµãŒããŒãžä¿å view_dashboardManager_success = ããã·ã¥ããŒããä¿åããŸãã view_dashboard_favorites_error1 = 奜ã¿ã®ãªãœãŒã¹ãããŒãããã®ã«å€±æããŸãã view_dashboardsManager_error1 = æ°ããããã·ã¥ããŒããè¿œå ããã®ã«å€±æããŸãã -view_dashboardsManager_message_title_details = <h1>{0}ãžãããã</h1>\n<p>RHQãããžã§ã¯ãã¯äžé£ã®ã³ã¢æ©èœãæœè±¡åãããã©ã°ã€ã³ããŒã¹ã®ã·ã¹ãã 管çã¹ã€ãŒãã§ãè€æ°ã®ãããã¯ãããã©ãããã©ãŒã ã®ããã®çµ±ååãããã·ã¹ãã 管çæ©èœãæäŸããŸãããã®ãããžã§ã¯ãã¯ã¬ã€ã€åãããã¢ãžã¥ãŒã«ã«ãã£ãŠèšèšãããŠããŠããããã€ã®ããã®æè»ãªã¢ãŒããã¯ãã£ãæäŸããŸããããã¯äŒæ¥å šäœã«å¯Ÿããç£æ»ãšå±¥æŽã®ç®¡çãæäŸããã³ã¢ãšãªããŠãŒã¶ãŒã€ã³ã¿ãã§ãŒã¹ãå°å ¥ããŸãããµãŒããŒ/ãšãŒãžã§ã³ãã¢ãŒããã¯ãã£ã¯ãªã¢ãŒãã§ã®ç®¡çãšç¹å®ãããã¯ãã®ãµããŒããå®çŸãããã©ã°ã€ã³ãæäŸããŸãã </p>\n <p>ãã®ããã©ã«ãã®ããã·ã¥ããŒãã¯äžã®ãç·šéã¢ãŒãããã¿ã³ãããããšã§ç·šéå¯èœã§ãã</p> +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboards_confirm1 = åé€ããŠãããããã§ãã view_dashboards_portlets_refresh_fail1 = èªåãªãã¬ãã·ã¥ããããŒãã¬ããã®ãªãã¬ãã·ã¥ééã®æŽæ°ã«å€±æããŸãã view_dashboards_portlets_refresh_fail2 = èªåãªãã¬ãã·ã¥ããããŒãã¬ããã®ãªããŒãã®ç¡å¹åã«å€±æããŸãã diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties index d846547..106d549 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties @@ -23,7 +23,6 @@ common_button_create_child = ìì ìì± common_button_delete = ìì common_button_delete_all = ì 첎 ìì common_button_disable = ë¹íì± -common_button_dump_sysInfo_to_log = ë€í ìì€í ì 볎 common_button_edit = ížì§ common_button_enable = íì± common_button_execute = ì€í @@ -73,15 +72,12 @@ common_label_none = ìì common_label_none2 = ìì common_label_role = ìí common_label_roles = ìí -common_label_scheduled_operations = ììœë ìì -common_label_selected_resources = ì íë ìì common_label_unlimited = 묎ì í common_label_user = ì¬ì©ì common_label_users = ì¬ì©ì common_label_week = 죌 common_label_yesterday = ìŽì common_msg_areYouSure = íì€í©ëê¹? -common_msg_asyncTimeout = {0}. ìŽ ë°ìí ê²ì ìë²ê° ìŽ ìì²ì ìë£íë ë° ìê°ìŽ ì€ë 겜곌í ë묞ì ëë€. ìë²ê° ìì²ì ìì§ ì²ëŠ¬ì€ìŽë©° ëšìê°ì ìë£ í ì ìëì§ì£Œìíììì€. ìë² ë¡ê·žë¥Œ ê²ì¬íì¬ ë¹ì ìì ìž ì€ë¥ê° ë°ìíëì§ ì¬ë¶ë¥Œ ì ì ììµëë€. common_msg_changeAutoDetected = ë³ê²œìŽ ìë ê°ì§ëììµëë€. common_msg_deleteConfirm = ì íë {0} ì ìì íìê² ìµëê¹? common_msg_deleted = {0} {1} ìì ëš. @@ -93,7 +89,6 @@ common_msg_see_more = ììží볎Ʞ... common_msg_step_x_of_y = ëšê³ {0} ì€ {1} ë²ì§ž common_severity_debug = ëë²ê·ž common_severity_error = ìë¬ -common_severity_fatal = ì¹ëª ì ì€ë¥ common_severity_info = ì 볎 common_severity_warn = ê²œê³ common_status_canceled = ì·šì @@ -119,14 +114,12 @@ common_title_average_metrics = ë¶ë¹ íê· íµê³ common_title_background = 배겜ì common_title_bundle = ë²ë€ common_title_bundles = ë²ë€ -common_title_category = 칎í ê³ ëŠ¬ common_title_change_refresh_time = ìë¡ê³ 칚 죌Ʞ common_title_columns = ì»¬ëŒ common_title_compare_metrics = íµê³ ë¹êµ common_title_compatibleGroups = íží ê°ë¥ 귞룹 common_title_compatibleGroups_total = ìŽ íží ê°ë¥ 귞룹 common_title_component_errors = 구ì±ìì ì€ë¥ -common_title_config_update_status = ì ë°ìŽíž ìí common_title_configuration = í겜ì€ì common_title_count = 칎ìŽíž common_title_createTime = ìì± ìê° @@ -137,15 +130,12 @@ common_title_dateRange = êž°ê° common_title_default = êž°ë³žê° common_title_definition = ì ì common_title_definitions = ì ì -common_title_description = ì€ëª common_title_details = ììž common_title_display = íì -common_title_display_name = íìëª common_title_duration = êž°ê° common_title_edit = ížì§ common_title_edit_mode = ížì§ 몚ë common_title_enabled = íì±í -common_title_end = ì¢ ë£ common_title_generalProp = ìŒë° ìì± common_title_group = 귞룹 common_title_group_def_total = ì 첎 귞룹 ì ì @@ -159,11 +149,7 @@ common_title_in_compliance = ì€ìì¬ë¶ common_title_interval = ê°ê²© common_title_inventory = ìžë²€í 늬 common_title_inventorySummary = ìžë²€í 늬 ììœ -common_title_kind = ì¢ ë¥ -common_title_lastUpdated = ìµì¢ ì ë°ìŽíž -common_title_lastUpdatedBy = ìµì¢ ì ë°ìŽíž common_title_ldapGroups = LDAP 귞룹 -common_title_mashup = 맀ìì common_title_members_reporting = ë©€ë² ëŠ¬í¬íž common_title_message = ë©ìì§ common_title_metric = ìž¡ì í목 @@ -177,7 +163,6 @@ common_title_numeric_type = ì«ì ì í common_title_operation = ìŽì common_title_operation_status = ìŽì ìí common_title_operations = ìŽì -common_title_operations_range = ìì ë²ì common_title_over = Over common_title_password = ë¹ë°ë²íž common_title_path = ê²œë¡ @@ -189,12 +174,10 @@ common_title_port = í¬íž common_title_providers = ê³µêžì common_title_recent_alerts = ìµê·Œ ì늌 common_title_recent_bundle_deployments = ìµê·Œ ë²ë€ ë°°í¬ -common_title_recent_configuration_updates = ìµê·Œ ì€ì ì ë°ìŽíž common_title_recent_drifts = ìµê·Œ ë늬ííž common_title_recent_event_counts = ìµê·Œ ìŽë²€íž ì common_title_recent_measurements = ìµê·Œ ìž¡ì common_title_recent_oob_metrics = ìµê·Œ ë²ì ìžì íµê³ -common_title_recent_operations = ìµê·Œ ìì common_title_recent_pkg_history = ìµê·Œ íší€ì§ êž°ë¡ common_title_recently_added = ìµê·Œ ì¶ê° ë common_title_remove_column = ì»¬ëŒ ìì @@ -205,14 +188,12 @@ common_title_resource_group = 늬ìì€ ê·žë£¹ common_title_resource_id = 늬ìì€ ID common_title_resource_inventory = 늬ìì€ ìžë²€í 늬 common_title_resource_key = 늬ìì€ í€ -common_title_resource_name = 늬ìì€ëª common_title_resource_type = 늬ìì€ ì í common_title_resources = 늬ìì€ common_title_results_count = 결곌 칎ìŽíž common_title_results_count_tooltip = 결곌 칎ìŽíž íì common_title_role = ìí common_title_roles = ìí -common_title_scheduled_operations = ììœë ìì common_title_search = ê²ì common_title_selected_resources = ì íë ìì common_title_server = ìë² @@ -228,7 +209,6 @@ common_title_status = ìí common_title_stop = ì ì§ common_title_summary = ììœ common_title_tag_cloud = íê·ž íŽëŒì°ë -common_title_the = common_title_timestamp = ë ì§/ìê° common_title_total = ìŽ common_title_type = ì í @@ -274,7 +254,6 @@ common_unit_months = ì common_unit_seconds = ìŽ common_unit_times = í common_unit_weeks = 죌 -common_unit_years = ë common_val_for = for common_val_n1st = {0} ë² common_val_n2nd = {0} ë² @@ -291,7 +270,6 @@ dataSource_ContentRepoTree_error_load = ì ì¥ì ë¡ë© ì€ë¥ dataSource_ContentRepoTree_field_parentId = ë¶ëªš ID dataSource_bundle_loadFailed = ë²ë€ ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€. dataSource_configurationHistory_clickToSeeError = ëëž íŽëŠíì¬ ì€ë¥ë©ìì§ë¥Œ íìžíììì€ -dataSource_configurationHistory_currentConfig = ìŽê²ì íì¬ ì€ì ì ëë€. dataSource_configurationHistory_dateCompleted = ìë£ìŒ dataSource_configurationHistory_dateSubmitted = ë°íìŒ dataSource_configurationHistory_error_fetchFailure = ì€ì êž°ë¡ì ë¡ëí ì ììµëë€. @@ -306,12 +284,9 @@ dataSource_measurementOob_field_formattedOutlier = ììëŒìŽë dataSource_measurementOob_field_parentName = ë¶ëªš dataSource_measurementOob_field_resourceName = ìì dataSource_measurementOob_field_scheduleName = ìž¡ì í목 -dataSource_operationHistory_error_fetchFailure = ì€íŒë ìŽì êž°ë¡ ë¡ë ì€íš. dataSource_operationHistory_field_createdTime = ìì± ìê° -dataSource_operationHistory_field_operationName = ìì ìŽëŠ dataSource_operationHistory_field_startedTime = ìì ìê° dataSource_operationHistory_field_subject = ìì²ì -dataSource_operationSchedule_field_description = ë žíž dataSource_operationSchedule_field_id = ìŒì ID dataSource_operationSchedule_field_nextFireTime = ë€ì ì€í dataSource_operationSchedule_field_operationDisplayName = ìŽì @@ -332,47 +307,31 @@ dataSource_resourceErrors_clickStatusIcon = ììží ëŽì©ì ììŽìœì íŽ dataSource_resourceErrors_deleteFailure = ìì ìë¬ ìì ì ì€íšíìµëë€. dataSource_resourceErrors_deleteSuccess = [{0}] 늬ìì€ ìë¬ ë©ìì§ë¥Œ ìì íëë° ì±ê³µíìµëë€. dataSource_resourceErrors_error_fetchFailure = [{0}] ID륌 ê°ì§ ììì ìë¬ë¥Œ ì°Ÿëë° ì€íšíìµëë€. -dataSource_resourceErrors_field_errorType = ìë¬ íì dataSource_resourceErrors_field_summary = ììœ dataSource_resourceErrors_field_timeOccured = ìê° dataSource_resourceGroups_loadFailed = ìì 귞룹 ë¡ëì ì€íšíìµëë€. dataSource_resources_field_discoveryTime = ë°ê²¬ ìê° dataSource_resources_field_importTime = ê°ì žì€êž° ìê° dataSource_resources_field_key = í€ -dataSource_resources_field_lastModifiedTime = ìµì¢ ìì ìê° -dataSource_resources_field_lastModifier = ìµì¢ ìì ì dataSource_resources_field_location = ìì¹ dataSource_rpc_error_transformRequestFailure = {0} ìì²ì ì²ëŠ¬íë ëì ë°ìŽí° ìì€ìì ì€íš. dataSource_rpc_error_unsupportedArrayFilterType = ì í {0}ì ë°°ìŽ íí° íµê³Œë¥Œ ì§ìíì§ ììµëë€ dataSource_rpc_error_unsupportedEnumType = RPCDataSource.getEnumArray(Class)ì enum {0}ì ëí ì ì í ìœëëžë¡ì ì¶ê°íììì. dataSource_rpc_no = ìëì€ dataSource_rpc_yes = ì -dataSource_scheduledOperations_error_fetchFailure = ììœë ìì ë¡ëì ì€íšíìµëë€. dataSource_scheduledOperations_field_location = ìì¹ dataSource_scheduledOperations_field_operation = ìŽì dataSource_scheduledOperations_field_resource = ìì -dataSource_schedules_disableFailure_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] íµê³ ìì§ì íŽì íëë° ì€íšíìµëë€. íì±íë íµê³ë [{2}]ì ëë€ -dataSource_schedules_disableFailure_resource = ID [{1}]ì ê°ì§ ììì [{0}] íµê³ ìì§ì íŽì íëë° ì€íšíìµëë€. íì±íë íµê³ë [{2}]ì ëë€ dataSource_schedules_disableSuccessful_concise = [{0}] ìž¡ì ìì§ì íŽì íìµëë€ -dataSource_schedules_disableSuccessful_full_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] íµê³ ìì§ì íŽì íìµëë€. ë¹íì±íë íµê³ë [{2}]ì ëë€ -dataSource_schedules_disableSuccessful_full_resource = ID [{1}]ì ê°ì§ ììì [{0}] íµê³ ìì§ì íŽì íìµëë€. ë¹íì±íë íµê³ë [{2}]ì ëë€ -dataSource_schedules_enableFailure_group = ID [{1}]ì ê°ì§ 귞룹ì ëí [{0}] íµê³ ìì§ì íì±ííëë° ì€íšíìµëë€. íµê³ë [{2}]ì ëë€ -dataSource_schedules_enableFailure_resource = ID [{1}]ì ê°ì§ 늬ìì€ì ëí [{0}] íµê³ ìì§ì íì±ííëë° ì€íšíìµëë€. íµê³ë [{2}]ì ëë€ dataSource_schedules_enableSuccessful_concise = [{0}] ìž¡ì ìì§ì íì±ííìµëë€ -dataSource_schedules_enableSuccessful_full_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] ìž¡ì ìì§ì íì±ííìµëë€. íì±íë ìž¡ì ì [{2}]ì ëë€ -dataSource_schedules_enableSuccessful_full_resource = ID [{1}]ì ê°ì§ ììì [{0}] ìž¡ì ìì§ì íì±ííìµëë€. íì±íë ìž¡ì ì [{2}]ì ëë€ dataSource_schedules_field_resourceGroupId = 귞룹 ID dataSource_schedules_loadFailed = íµê³ ìŒì ë¡ëì ì€íšíìµëë€. -dataSource_schedules_loadFailedContext = 컚í ì€íž [{0}]ì ëí íµê³ ìŒì ë¡ëì ì€íšíìµëë€. dataSource_schedules_loadFailedCriteria = êž°ì€ ì¡°ê±Ž [{0}]ì ëí íµê³ ìŒì ë¡ëì ì€íšíìµëë€. dataSource_schedules_updateFailure_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] íµê³ ìì§ ê°ê²© ì€ì ì ì€íšíìµëë€. íµê³ë [{2}], ìì§ ê°ê²©ì [{3}]ìŽ ìŽììµëë€. dataSource_schedules_updateFailure_resource = ID [{1}]ì ê°ì§ ììì [{0}] íµê³ ìì§ ê°ê²© ì€ì ì ì€íšíìµëë€. íµê³ë [{2}], ìì§ ê°ê²©ì [{3}]ìŽ ìŽììµëë€. dataSource_schedules_updateSuccessful_concise = [{0}]ìŽ ìë¡ìŽ ìì§ê±°ëŠ¬ê° [{1}] ìž¡ì ì ì€ì ëììµëë€. -dataSource_schedules_updateSuccessful_full_group = [{0}]ìŽ ìë¡ìŽ ìì§ê±°ëŠ¬ê° ID [{2}]ì ê°ì§ 늬ìì€ ê·žë£¹ì [{1}] ìž¡ì ìŒë¡ ì€ì ëììµëë€. ì ë°ìŽíž ë ìž¡ì ì [{3}]ì ëë€. -dataSource_schedules_updateSuccessful_full_resource = [{0}]ìŽ ìë¡ìŽ ìì§ê±°ëŠ¬ê° ID [{2}]ì ê°ì§ ììì [{1}] ìž¡ì ìŒë¡ ì€ì ëììµëë€. ì ë°ìŽíž ë ìž¡ì ì [{3}]ì ëë€. dataSource_traits_failFetch = êž°ì€ ì¡°ê±Ž [{0}]ì ëí í¹ì±ì ìžì¶íëë° ì€íšíìµëë€. dataSource_traits_field_definitionID = ì ì ID -dataSource_traits_field_lastChanged = ìµì¢ ì ë°ìŽíž dataSource_traits_field_primaryKey = êž°ë³ží€ dataSource_traits_field_trait = í¹ì± dataSource_traits_group_field_groupId = 귞룹 ID @@ -406,7 +365,6 @@ favorites_groups = ìŠê²šì°Ÿêž° 귞룹 favorites_recentlyViewed = ìµê·Œì 볞 í목 favorites_resources = ìŠê²šì°Ÿêž° 늬ìì€ filter_from_date = ìì -filter_to_date = ì¢ ë£ group_tree_groupOfResourceType = Group of [{0}] group_tree_partialClusterTooltip = {1} ì€ {0} 귞룹 ë©€ë²ê° ''{2}'' ììì ê°ì§ê³ ììµëë€. search_failed_to_retrieve_saved_search = ì ì¥ë ê²ìì ê²ìíì§ ëª»íìµëë€ @@ -433,13 +391,8 @@ view_aboutBox_jbossByRedHat = JBoss by Red Hat view_aboutBox_title = {0}ì êŽíì¬ view_aboutBox_version = ë²ì : view_adminConfig_agentPlugins = ììŽì íž íë¬ê·žìž -view_adminConfig_alertDefTemplates = 겜볎 ì ì í í늿 view_adminConfig_downloads = ë€ìŽë¡ë -view_adminConfig_driftDefTemplates = ë늬ííž ì ì í í늿 -view_adminConfig_metricTemplates = íµê³ ìì§ í í늿 view_adminConfig_serverPlugins = ìë² íë¬ê·žìž -view_adminConfig_systemSettings = ìì€í ì€ì -view_adminContent_contentSources = 컚í ìž ìì€ view_adminRoles_assignedGroups = í ë¹ë ìì 귞룹 view_adminRoles_assignedSubjects = í ë¹ë Subjects view_adminRoles_failCreateRoleWithExistingName = êž°ì¡Ž ìŽëŠ [{0}]곌 ìí ì ë§ë€ì§ 못íìµëë€. ë€ë¥ž ìŽëŠì ì¬ì©íììì€. @@ -449,42 +402,26 @@ view_adminRoles_failLdapGroupsRole = ìí ì ìíŽ ì¬ì©ê°ë¥í LDAP ê·ž view_adminRoles_failRoles = ìí ì ê±°ì ì€íšíìµëë€. view_adminRoles_globalPerms = êžë¡ë² ê¶í view_adminRoles_ldapGroups = LDAP 귞룹 -view_adminRoles_ldapGroupsReadOnly = LDAP 귞룹 ë°ìŽí°ë ìœêž° ì ì©ì ëë€. view_adminRoles_noLdap = LDAP 볎ì íµí©ìŽ ì€ì ëì§ ìììµëë€. LDAPì 구ì±íë €ë©Ž <a {0}>{1}</a>ë¡ ê°ììì. -view_adminRoles_permissions_autoselecting_configureRead_implied = CONFIGURE_WRITE ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž CONFIGURE_READê° ìë ê²ìŽ ê·žê²ì ììíê³ ìêž° ë묞ì ëë€. -view_adminRoles_permissions_autoselecting_configureWrite_implied = CONFIGURE_READ ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž CONFIGURE_WRITEê° ê·žê²ì ììíê³ ìêž° ë묞ì ëë€. -view_adminRoles_permissions_autoselecting_manageInventory_implied = ì ííì§ ìì 늬ìì€ ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž MANAGE_INVENTORY 몚ë 늬ìì€ ì¬ì© ê¶íì ììíê³ ìêž° ë묞ì ëë€. -view_adminRoles_permissions_autoselecting_manageSecurity_implied = ì ííì§ ìì ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž MANAGE_SECURITY ë€ë¥ž 몚ë ê¶íì ììíê³ ìêž° ë묞ì ëë€. view_adminRoles_permissions_globalPermissions = êžë¡ë² ê¶í view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} ìœêž° ê¶íì ì í íŽì í ì ììµëë€. ìœêž° ê¶íì ììíë {0} ì°êž° ê¶íìŽ ëšŒì ì í íŽì ëìŽìŒ ê·žê²ì ìíí ì ììµëë€. view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} ê¶íì ì í íŽì í ì ììµëë€. ë€ë¥ž 몚ë ììì ììíë êŽëŠ¬ ìžë²€í ëŠ¬ê° ëšŒì ì í íŽì ëìŽìŒ ê·žê²ì ìíí ì ììµëë€. view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} ê¶íì ì í íŽì í ì ììµëë€. ë€ë¥ž 몚ë ê¶íì ììíë êŽëŠ¬ 볎ì ê¶íìŽ ëšŒì ì í íŽì ëìŽìŒ ê·žê²ì ìíí ì ììµëë€. view_adminRoles_permissions_isAuthorized = ê¶íìŽ ììµëê¹? -view_adminRoles_permissions_isRead = ìœêž°ì ëê¹? -view_adminRoles_permissions_isWrite = ì°êž°ì ëê¹? -view_adminRoles_permissions_permDesc_manageBundles = íë¡ì§ë²ë ë²ë€ ë§ë€êž°, ì ë°ìŽíž, ìì ê° ê°ë¥í©ëë€. (ë구ë ììì ìŒë¡ ìŽëê°ë¥) view_adminRoles_permissions_permDesc_manageInventory = 몚ë ììì 몚ë ìì ê¶íì ê°ìµëë€. ìŠ, 귞룹ì ìì±, ìì , ìëê°ì§ ëë ìëìŒë¡ ê²ì¶ë ììì ê°ì žì¬ì ììµëë€. -view_adminRoles_permissions_permDesc_manageRepositories = ì¬ì©ì ì ì¥ì ë§ë€êž°, ì ë°ìŽíž, ìì ê° ê°ë¥. (ë구ë ì ì¥ì륌 ë§ë€ì ìì) 컚í ìž ìì€ì ì ì¥ìë ì°ê²°ìŽ ê°ë¥í©ëë€. -view_adminRoles_permissions_permDesc_manageSecurity = ì¬ì©ì ë° ìí ë§ë€êž°, ì ë°ìŽíž, ìì , êž°í 몚ë ê¶íìŽ ììµëë€. view_adminRoles_permissions_permDesc_manageSettings = {0} ìë²ì ìì ë° ëªšë ìë² êŽë š êž°ë¥ì ìíí ì ììµëë€. view_adminRoles_permissions_permDesc_viewUsers = ë€ë¥ž ì¬ì©ì륌 볌 ì ììµëë€. ê·žë¬ë ê·žë€ìê² í ë¹ë ìí ì 볎ìŽì§ ììµëë€. view_adminRoles_permissions_permReadDesc_configure = ìì ì€ì ë° ìì ì€ì ìì êž°ë¡ ë³Žêž° -view_adminRoles_permissions_permReadDesc_control = (ììì ) ì¬ì© ê°ë¥í ëª ë ¹; ìì ì€í êž°ë¡ ë³Žêž° view_adminRoles_permissions_permReadDesc_createChildResources = (ììì ) ìì 늬ìì€ ë§ë€êž° êž°ë¡ ë³Žêž° view_adminRoles_permissions_permReadDesc_deleteChildResources = (ììì ) ìì 늬ìì€ ìì êž°ë¡ ë³Žêž° -view_adminRoles_permissions_permReadDesc_inventory = (ììì ) ìì ìì± (ìŽëŠ, ì€ëª , ë²ì , êž°í.), ì°ê²° ì€ì , ì°ê²° ì€ì êž°ë¡ ë³Žêž° view_adminRoles_permissions_permReadDesc_manageAlerts = (ììì ) ê²œê³ ì ì ë° ê²œê³ êž°ë¡ ë³Žêž° view_adminRoles_permissions_permReadDesc_manageContent = (ììì ) ì€ì¹ëìŽ ì¬ì©ê°ë¥í íší€ì§; íší€ì§ ì€ì¹ êž°ë¡ ë³Žêž° view_adminRoles_permissions_permReadDesc_manageDrift = (ììì ) ë늬ííž ì ìì ë늬ííž êž°ë¡ ë³Žêž° view_adminRoles_permissions_permReadDesc_manageEvents = (ììì ) ìŽë²€íž 볎Ʞ view_adminRoles_permissions_permReadDesc_manageMeasurements = (ììì ) íµê³ ë°ìŽí° ë° ìì§ ì€ìŒì¥Ž 볎Ʞ -view_adminRoles_permissions_permWriteDesc_configure = ìì ì€ì ì ë°ìŽíž; ìì ì€ì ìì êž°ë¡ ìì -view_adminRoles_permissions_permWriteDesc_control = ëª ë ¹ ì€í; ìì ì€í êž°ë¡ ìì view_adminRoles_permissions_permWriteDesc_createChildResources = (ìì± ê°ë¥í ì íì ìì 늬ìì€ì ëí) ìë¡ìŽ ìì 늬ìì€ ë§ë€êž° view_adminRoles_permissions_permWriteDesc_deleteChildResources = ìì ì ê±° ìžë²€í 늬; (ìì ê°ë¥í ì íì ììì ëí) 늬ìì€ ìì -view_adminRoles_permissions_permWriteDesc_inventory = ììì ìŽëŠ, ë²ì , ì€ëª , ì°ê²° ì€ì ì ë°ìŽíž; ì°ê²° ì€ì êž°ë¡ ìì view_adminRoles_permissions_permWriteDesc_manageAlerts = ê²œê³ ì ì륌 ë§ë€êž°, ìì , ìì ; ê²œê³ êž°ë¡ íìž ë° ìì -view_adminRoles_permissions_permWriteDesc_manageContent = 컚í ìž ìì€ ë±ë¡; íší€ì§ ì€ì¹ ë° ì ê±° view_adminRoles_permissions_permWriteDesc_manageDrift = ë늬ííž ì ì ë§ë€êž°, ìì , ìì ; ë늬ííž ìžì€íŽì€ êŽëŠ¬ view_adminRoles_permissions_permWriteDesc_manageEvents = ìŽë²€íž ìì view_adminRoles_permissions_permWriteDesc_manageMeasurements = íµê³ ìì§ ì€ìŒì¥Ž ìì @@ -495,7 +432,6 @@ view_adminRoles_permissions_perm_deleteChildResources = ìì 늬ìì€ ìì view_adminRoles_permissions_perm_inventory = ìžë²€í 늬 view_adminRoles_permissions_perm_manageAlerts = ê²œê³ êŽëŠ¬ view_adminRoles_permissions_perm_manageBundles = ë²ë€ êŽëŠ¬ -view_adminRoles_permissions_perm_manageContent = 컚í ìž êŽëŠ¬ view_adminRoles_permissions_perm_manageDrift = ë늬ííž êŽëŠ¬ view_adminRoles_permissions_perm_manageEvents = ìŽë²€íž êŽëŠ¬ view_adminRoles_permissions_perm_manageInventory = ìžë²€í 늬 êŽëŠ¬ @@ -512,22 +448,12 @@ view_adminRoles_resourcePerms = 늬ìì€ ê¶í view_adminRoles_roleAdded = ìí [{0}]ìŽ ì¶ê°ëììµëë€. view_adminRoles_roleDeleteFailed = ìí [{0}]ì ìì ì ì€íšíìµëë€. view_adminRoles_roleDeleted = ìí [{0}]ìŽ ìì ëììµëë€. -view_adminRoles_roleUpdateFailed = ìí [{0}]ì ì ë°ìŽížì ì€íšíìµëë€. -view_adminRoles_roleUpdated = ìí [{0}]ê° ì ë°ìŽížëììµëë€. view_adminTemplates_definedBy = ì ì -view_adminTemplates_disabledTemplates = ë¹íì±íë í í늿 -view_adminTemplates_editAlertTemplate = ê²œê³ í í늿 ížì§ -view_adminTemplates_editTemplates = í í늿 ížì§ -view_adminTemplates_enabledTemplates = íì±íë í í늿 view_adminTemplates_platformServices = íë«íŒ ìë¹ì€ view_adminTemplates_platforms = íë«íŒ -view_adminTemplates_pluginTemplates = íë¬ê·žìž í í늿 -view_adminTemplates_prompt_disabledAlertTemplates = ìŽ ìì ì íì ëíŽ ìì±íì§ë§ ë¹íì±íë ê²œê³ í í늿 ì view_adminTemplates_prompt_disabledMetricTemplates = ìŽ ìì ì íì ëíŽ êž°ë³žì ìŒë¡ ë¹íì±íë íµê³ ìŒì ì -view_adminTemplates_prompt_enabledAlertTemplates = ìŽ ìì ì íì ëíŽ íì±íë ê²œê³ í í늿 ì view_adminTemplates_prompt_enabledMetricTemplates = ìŽ ìì ì íì ëíŽ êž°ë³žì ìŒë¡ íì±íë íµê³ ìŒì ì view_adminTemplates_servers = ìë² -view_adminTemplates_userTemplates = ì¬ì©ì í í늿 view_adminTopology_affinityGroups = ì ížë 귞룹 view_adminTopology_agents = ììŽì íž view_adminTopology_partitionEvents = ìŽë²€íž ë²ì£Œ @@ -537,40 +463,31 @@ view_adminUsersDetails_dataTypeName = ì¬ì©ì view_adminUsers_failCreateUserWithExistingName = êž°ì¡Ž ìŽëŠ [{0}]곌 ì¬ì©ì륌 ë§ë€ì§ 못íìµëë€. ë€ë¥ž ìŽëŠì ì¬ì©íììì€. view_admin_administration = êŽëŠ¬ view_admin_configuration = êµ¬ì± -view_admin_content = ìœí ìž view_admin_downloads_agentDownload = ììŽì íž ë€ìŽë¡ë view_admin_downloads_agent_buildNumber = ììŽì íž ë¹ë -view_admin_downloads_agent_help = <p> ìŽê²ì {0} ììŽì ížì ì ë°ìŽíž jar íìŒì ëë€. ìŽ jar íìŒì 목ì ì ì¬ì©ìê° ììŽì ížê° ìë ìì€í ì ì ììŽì ížë¥Œ ì€ì¹í ì ìëë¡ íë ê²ìŒë¡, ìŽë¯ž ì€ì¹ë ììŽì ížë¥Œ ì ë°ìŽíž í ì ìëë¡ íêž° ìíŽìì ëë€. ììží ëŽì©ì, ë€ìŽë¡ë ë°ì ììŽì íž jarìì ë€ì곌 ê°ìŽ --help ëª ë ¹ ìµì ì ë¶ì¬ ì€ííììì€.<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>ììŽì íž ì€ì¹</h3> <p> <b>java -jar <agent-download.jar> --install[=<ì ììŽì íž ëë í 늬>]</b><br/> ìŽ ëª ë ¹ì ìë¡ìŽ ììŽì ížë¥Œ ì€ì¹í©ëë€. ë§ìœ ìë¡ìŽ ëë í 늬륌 ì§ì íì§ ììŒë©Ž Ʞ볞ê°ì "."ì ëë€.</p> <h3>ììŽì íž ì ë°ìŽíž</h3> <p> <b>java -jar <agent-download.jar> --update[=<ìŽì ììŽì íž ëë í 늬>]</b><br/> ìŽê²ì ìŽë¯ž ì€ì¹ë êž°ì¡Žì ììŽì í žë¥Œ ì ë°ìŽíží©ëë€. ë§ìœ ìŽì ì êž°ì¡Ž ììŽì ížê° ì€ì¹ë ëë í 늬륌 ì§ì íì§ ìììŒë©Ž "rhq-agent" ëë í ëŠ¬ë¡ ì¶ì ë©ëë€. </p> view_admin_downloads_agent_link_value = ììŽì íž {0} ({1})ì ë€ìŽë¡ë view_admin_downloads_agent_loadError = ììŽì ížì ë²ì ì 볎륌 ê°ì žì¬ ì ììµëë€. view_admin_downloads_agent_md5 = ììŽì íž MD5 view_admin_downloads_agent_version = ììŽì íž ë²ì view_admin_downloads_bundleDownload = ë²ë€ Deployer ë€ìŽë¡ë -view_admin_downloads_bundle_help = <p> ìŽê²ì ë²ë€ Deployer ë구ì ëë€. ê·žê²ì ë구ìì {0} ë²ë€ ë° íší€ì§ ê°ë°ìì ìíŽ ì¬ì©ë©ëë€. ìŽ ë 늜 ì€íí ë구륌 ì¬ì©íë©Ž ë²ë€ìŽë ìœììì ì ì¡°ë²ì í ì€íž í ì ììµëë€. </p> view_admin_downloads_bundle_link_value = ë²ë€ Deployer {0} ë€ìŽë¡ë view_admin_downloads_bundle_loadError = ë²ë€ deployer ì 볎륌 ê°ì žì¬ ì ììµëë€. view_admin_downloads_cliAlertScriptsDownload = CLI ê²œê³ ì€í¬ëŠœíž ë€ìŽë¡ë -view_admin_downloads_cliAlertScripts_help = CLI ê²œê³ ì€í¬ëŠœížë ì€í¬ëŠœíž ë ê²œê³ ë¥Œ ë§ëëë° ì¬ì©í ì ìë 믞늬 ìì±ë ì€í¬ëŠœížì ëë€.ìŒë°ì ìŒë¡ ì€í¬ëŠœížë í¹ì ê²œê³ ì ìì ëí íµì§ë¡ ì¬ì©íêž° ìíŽìë 믞늬 ì¡°ì ì íŽìŒ í©ëë€. view_admin_downloads_cliAlertScripts_loadError = ë€ìŽë¡ë íëë° ì¬ì©í ì ìë CLI ê²œê³ ì€í¬ëŠœížì ììžì€ í ì ììµëë€. view_admin_downloads_cliAlertScripts_none = ë€ìŽë¡ë íëë° ì¬ì©í ì ìë CLI ê²œê³ ì€í¬ëŠœížê° íëë ììµëë€. view_admin_downloads_cliDownload = 컀맚ë ëŒìž íŽëŒìŽìžíž ë€ìŽë¡ë view_admin_downloads_cli_buildNumber = CLI ë¹ë -view_admin_downloads_cli_help = <p> ìŽê²ì 컀맚ë ëŒìž íŽëŒìŽìžíž ëêµ¬ë¡ CLIëŒê³ ë í©ëë€. ìœììì ì€ííë ë 늜í ë구ìì {0} ìë²ì 컀맚ë ëŒìž ìží°íìŽì€ë¥Œ ì ê³µí©ëë€. ìëíë ìì ì ìííë CLIë run ì€í¬ëŠœížë¥Œ íµíŽ ëª ë ¹ì ížì¶í ì ììµëë€. CLIì ì€ì¹ ë°©ë² ë° ì¬ì© ë°©ë²ì ëí ììží ëŽì©ì 묞ì륌 ì°žì¡°íììì€. </p> view_admin_downloads_cli_link_value = CLI {0} ({1}) ë€ìŽë¡ë view_admin_downloads_cli_loadError = CLI ë²ì ì 볎륌 ê°ì žì¬ ì ììµëë€. view_admin_downloads_cli_md5 = CLI MD5 view_admin_downloads_cli_version = CLI ë²ì view_admin_downloads_connectorsDownload = 컀ë¥í° ë€ìŽë¡ë -view_admin_downloads_connectors_help = 컀ë¥í° ì íì {0}ìì êŽëŠ¬ ê°ë¥íêž° ë묞ì íìí ìíížìšìŽì ëë€. {0} ììŽì ížê° íµì í ì ìëë¡ êŽëŠ¬ì íì 컀ë¥í°ë¥Œ ì€ì¹í©ëë€. ììží ëŽì©ì 묞ì륌 ì°žì¡°íììì€. view_admin_downloads_connectors_loadError = 컀ë¥í° ì 볎륌 ê°ì žì¬ ì ììµëë€ view_admin_downloads_connectors_none = ë€ìŽë¡ë륌 ìí 컀ë¥í°ë¥Œ ì°Ÿì ì ììµëë€ view_admin_downloads_scriptModulesDownload = ì€í¬ëŠœíž 몚ë ë€ìŽë¡ë -view_admin_downloads_scriptModules_help = <p> ì€í¬ëŠœíž 몚ëì (ê²œê³ ì€í¬ëŠœížë CLI ì€í¬ëŠœížì€) ë¹ì ìŽ ë§ë ì€í¬ëŠœížì ì¬ì©í ì ìë RHQìì ì ê³µíë ì¬ì¬ì© ê°ë¥í 구ì±ììì ëë€. ì íí ì€í¬ëŠœíž ìžìŽ (ìë°ì€í¬ëŠœíž, ìŠ "íìí" êž°ë¥ì ì¬ì©í©ëë€) ìì "rhq://downloads/<module-name-without-file-extension>" URI륌 ì¬ì©íì¬ ì¡ìžì€ í ì ììµëë€. </p> view_admin_downloads_scriptModules_loadError = ì¬ì© ê°ë¥í ì€í¬ëŠœíž 몚ë 목ë¡ì ë¡ëí ì ììµëë€ view_admin_downloads_scriptModules_none = ìŽë€ ì€í¬ëŠœíž 몚ëì ë€ìŽë¡ë í ì ììµëë€ view_admin_landing = ìŽ ë¶ë¶ìì {0} ì ì ì€ì ì êŽëŠ¬í©ëë€. ìŽê²ì 볎ì 구ì±, íë¬ê·žìž ì€ì , {0} ìë² ë° ììŽì íž êŽëŠ¬ë¥Œ í¬íší©ëë€. -view_admin_measTemplates_updateExisting_title = êž°ì¡Ž ìŒì ì ë°ìŽíž -view_admin_measTemplates_updateExisting_tooltip = ìŽ ìì륌 ì ííë©Ž ìŽ ì íì 몚ë ììì ëììŒë¡ ì íí íµê³ ìì§ ìŒì ì ì ë°ìŽíží©ëë€. ë§ìœ ìŽê²ìŽ 첎í¬ëì§ ììŒë©Ž, í í늿 ì€ìŒì¥ŽìŽ í¥í ìžë²€í 늬ì ì¶ê°ëë ìŽ ì íì ì ììì ì ì©ëë ê²ì ìëëë€. view_admin_plugins_agent = ììŽì íž view_admin_plugins_agentDeleteConfirm = <b>ê²œê³ !</b><br/>\në€ì ììŽì íž íë¬ê·žìžìŽ ìì ë ë €ê³ íê³ ììµëë€:<br/>\n{0}<br/>\nì ë§ë¡ ìì íìê² ìµëê¹? view_admin_plugins_agentDisableConfirm = <b>ê²œê³ !</b><br/>\në€ì ììŽì íž íë¬ê·žìžìŽ íŽì ë ë €ê³ íê³ ììµëë€:<br/>\n{0}<br/>\nì ë§ë¡ íŽì íìê² ìµëê¹? @@ -588,40 +505,28 @@ view_admin_plugins_enabledServerPluginsFailure = ìë² íë¬ê·žìžì íì± view_admin_plugins_hideDeleted = ìì ë í목 ìšêž°êž° view_admin_plugins_hideUndeployed = ë°°í¬ ì ê±° í목 ìšêž°êž° view_admin_plugins_loadFailure = íë¬ê·žìž ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€. -view_admin_plugins_purgedAgentPlugins = ììŽì íž íë¬ê·žìž {0}ì ì ê±°íêž° ìí ì€ë¹ë¥Œ íê³ ììµëë€.ìŽê²ì ëª ë¶ ì ë 걞늎ìë ììµëë€. ê·žë¬ë©Ž íë¬ê·žìžìì 몚ë ì í ì ìë 뚌ì ìì€í ìì ì ê±°ëìŽìŒíêž° ë묞ì ëë€. ìŽë¬í íë¬ê·žìžì ì ê±°ë ëê¹ì§ ìŽ íìŽì§ìì 볎ì¬ì§ëë€. íŒì§ê° ì€íëê³ ìë ëì íë¬ê·žìžì ë€ì ì€ì¹íì§ ìë ê²ì ì ìíììì€. ê·žë ì§ ììŒë©Ž ì€íší ê²ì ëë€. ë°ëŒì ìŽ íŒì§ê° ìë£ë ëê¹ì§ ìì€í ì íë¬ê·žìž ì¬ì€ì¹ë¥Œ êž°ë€ë €ì£Œìžì. view_admin_plugins_purgedAgentPluginsFailure = ììŽì íž íë¬ê·žìž ì ê±°ì ì€íšíìµëë€. view_admin_plugins_purgedServerPlugins = ì ê±°ë ìë² íë¬ê·žìž: {0}. view_admin_plugins_purgedServerPluginsFailure = ìë² íë¬ê·žìž ì ê±°ì ì€íšíìµëë€. -view_admin_plugins_restartMasterPC = ë§ì€í° íë¬ê·žìž 컚í ìŽë륌 ì¬ìì -view_admin_plugins_restartMasterPCComplete = ë§ì€í° íë¬ê·žìž 컚í ìŽëê° ì¬ììëììµëë€. -view_admin_plugins_restartMasterPCFailure = ë§ì€í° íë¬ê·žìž 컚í ìŽëê° ì¬ììì ì€íšíìµëë€. -view_admin_plugins_restartMasterPCStarted = ë§ì€í° íë¬ê·žìž 컚í ìŽë ì¬ììì€... view_admin_plugins_scan = ê°±ì ì ìí ê²ì¬ -view_admin_plugins_scanComplete = ì ë°ìŽížë íë¬ê·žìžì ìí ê²ì¬ë¥Œ ìë£ -view_admin_plugins_scanFailure = ì ë°ìŽížë íë¬ê·žìžì ìí ê²ì¬ì ì€íšíìµëë€. view_admin_plugins_server = ìë² view_admin_plugins_serverConfig = íë¬ê·žìž ì€ì -view_admin_plugins_serverConfig_badSettings = ì¬ë°ë¥ž ì€ì ì ì ë ¥íììì€ view_admin_plugins_serverConfig_saveFailed = ì€ì ì ì ì¥íëë° ì€íšíìµëë€ view_admin_plugins_serverConfig_settingsSaved = ì€ì ìŽ ì ì¥ëììµëë€. view_admin_plugins_serverControls = 컚ížë¡€ -view_admin_plugins_serverControls_badParams = ì¬ë°ë¥ž ë§€ê° ë³ì륌 ì ë ¥íììì€ view_admin_plugins_serverControls_clickForError = ì€ë¥ ë©ìì§ë¥Œ íŽëŠíììì€ view_admin_plugins_serverControls_invokeFailure = 컚ížë¡€ ížì¶ì ì€íšíìµëë€ view_admin_plugins_serverControls_name = 컚ížë¡€ view_admin_plugins_serverControls_parameters = 맀ê°ë³ì view_admin_plugins_serverControls_results = 결곌 view_admin_plugins_serverDisableConfirm = <b>ê²œê³ !</b><br/>\në€ì ìë² íë¬ê·žìžì íŽì íë €ê³ í©ëë€ :<br/>\n{0}<br/>\nì ë§ë¡ íŽì íëë¡ íìê² ìµëê¹? -view_admin_plugins_serverScheduleJobs = ììœë ìì view_admin_plugins_serverUndeployConfirm = <b>ê²œê³ !</b><br/>\në€ì ìë² íë¬ê·žìžìŽ ë°°í¬ íŽì ëë €ê³ í©ëë€ :<br/>\n{0}<br/>\nì ë§ë¡ ë°°í¬ íŽì 륌 íìê² ìµëê¹? view_admin_plugins_showDeleted = ìì ë í목 볎Ʞ view_admin_plugins_showUndeployed = ë°°í¬ ì ê±° í목 볎Ʞ view_admin_plugins_undeploy = ë°°í¬ ì ê° view_admin_plugins_undeployedServerPlugins = ë°°í¬ ì ê±°ë ìë² íë¬ê·žìž: {0} view_admin_plugins_undeployedServerPluginsFailure = ìë² íë¬ê·žìž ë°°í¬ ì ê±°ì ì€íšíìµëë€. -view_admin_plugins_upload = íë¬ê·žìž ì ë¡ë view_admin_security = 볎ì -view_admin_systemSettings_ActiveDriftServerPlugin_desc = ë늬ííž êŽë š ììì ìœí ìž ì ì§ìì±ì êŽëŠ¬íë ë늬ííž ìë² íë¬ê·žìž view_admin_systemSettings_ActiveDriftServerPlugin_name = íì±í ë늬ííž ìë² íë¬ê·žìž view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = ë§ìœ ììŽì ížìì ì묎ê²ë ë°ì§ ìê³ ìŽ ìê°ìŽ 겜곌íë€ë©Ž, ê·ž ììŽì ížë ë€ìŽë ê²ìŒë¡ ê°ì£Œë©ëë€. ìŽ ê°ì ë¶ ëšìë¡ ì§ì ë©ëë€. view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = ììŽì íž ìµë ë¹íì± ìê° @@ -632,17 +537,11 @@ view_admin_systemSettings_AvailabilityPurge_name = ì€ëë ê°ì©ì± ë°ìŽí° view_admin_systemSettings_BaseURL_desc = ìë² GUIì URL, ì£Œë¡ ê²œê³ ìŽë©ìŒ ìëŠŒìŽ ì¬ì©ë©ëë€. view_admin_systemSettings_BaseURL_name = GUI ìœì URL view_admin_systemSettings_BaselineDataSet_desc = êž°ì€ì ì ê²°ì íëë° ì¬ì©ëë 곌거ì ìž¡ì ë°ìŽí°ì ì. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. -view_admin_systemSettings_BaselineDataSet_name = Ʞ볞 ë°ìŽí°ì -view_admin_systemSettings_BaselineFrequency_desc = êž°ì€ ìë ê³ì° ë¹ëê° ê³ì°ë©ëë€. ëšìœ 0ìŽëŒë©Ž, êž°ì€ ìëê³ì°ì ë¹íì±íë©ëë€. ìŽê²ì ìŒëšìë¡ ì§ì ë©ëë€. ìµëê°ì 'Ʞ볞 ë°ìŽí°ì 'ì ëë€. view_admin_systemSettings_BaselineFrequency_name = êž°ì€ ê³ì° ë¹ë view_admin_systemSettings_DataMaintenance_desc = ë°ìŽí°ë² ìŽì€ ì ì§ êŽëŠ¬ê° ì€íëë ë¹ë (ì, Postgres륌 ì¬ì©íë ì§ê³µ ë±). ìŽê²ì ìê°ëšìë¡ ì§ì ë©ëë€. view_admin_systemSettings_DataMaintenance_name = ë°ìŽí°ë² ìŽì€ ì ì§ ë³Žì êž°ê° -view_admin_systemSettings_DataReindex_desc = ë§ìœ ì íšíë©Ž, ë°ìŽí°ë² ìŽì€ í ìŽëžì ì êž°ì ìŒë¡ ìžë±ì€ê° ë€ì ìì±ë©ëë€. -view_admin_systemSettings_DataReindex_name = ë°ìŽí° í ìŽëžì ìŒê° ìžë±ì€ ë€ì ìì± view_admin_systemSettings_DriftFilePurge_desc = ë°±ìëìì ì ê±° ë ëì. 믞ì¬ì©íê³ ë¶ëªšê° ìë ë늬ííž íìŒì ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. view_admin_systemSettings_DriftFilePurge_name = 믞ì¬ì© ë늬ííž íìŒ ìì -view_admin_systemSettings_EnableAgentAutoUpdate_desc = ìë²ê° ììŽì ížê° ìëìŒë¡ ì ë°ìŽížë¥Œ íì©í ì§ ì¬ë¶ë¥Œ ê²°ì í©ëë€. ë§ìœ ì¬ì© ì€ì§íë 겜ì°ìë ìë²ìì ììŽì íž ë°°í¬ë¥Œ ë€ìŽë¡ë í ì ììµëë€. -view_admin_systemSettings_EnableAgentAutoUpdate_name = ììŽì ížì ìë ì ë°ìŽížë¥Œ íì±í view_admin_systemSettings_EnableDebugMode_desc = ì íšíë©Ž ìë²ê° ëë²ê·ž 몚ëë¡ ë€ìŽê°ëë€. view_admin_systemSettings_EnableDebugMode_name = ëë²ê·ž 몚ë íì±í view_admin_systemSettings_EnableExperimentalFeatures_desc = ì íšíë©Ž, íì¬ì ì íì í¬íšë 몚ë ì€íì ìž êž°ë¥ì ì¬ì©í ì ììµëë€. @@ -676,27 +575,20 @@ view_admin_systemSettings_RtDataPurge_name = ì€ëë ìëµìê° ìì view_admin_systemSettings_TraitPurge_desc = ë°ìŽí°ë² ìŽì€ìì ì ê±°ëêž° ì ì ìž¡ì ížë ìŽíž ë°ìŽí°ì ì ì§ ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. view_admin_systemSettings_TraitPurge_name = ì€ëë ìž¡ì ížë ìŽíž ìì view_admin_systemSettings_cannotLoadServerDetails = ìë² ììžì 볎륌 ë¡ëí ì ììµëë€. -view_admin_systemSettings_cannotLoadSettings = íì¬ ìì€í ì€ì ì ê°ì žì¬ ì ììµëë€. -view_admin_systemSettings_dumpToLogFailed = ìë² ë¡ê·ž íìŒì ìì€í ì 볎륌 ì°êž°ê° ì€íšíìµëë€. -view_admin_systemSettings_dumpedToLog = ì±ê³µì ìŒë¡ ìì€í ë¡ê·ž íìŒì êž°ë¡ë ìì€í ì 볎 view_admin_systemSettings_fixBeforeSaving = ì ì¥ì ì ì못ë ê°ì ìì íììì€ view_admin_systemSettings_group_baseline = ìë Ʞ볞 êµ¬ì± ìì± view_admin_systemSettings_group_dataMgr = ë°ìŽí° êŽëŠ¬ì êµ¬ì± ìì± view_admin_systemSettings_group_drift = ë늬ííž ìë² êµ¬ì± ìì± view_admin_systemSettings_group_general = ìŒë° êµ¬ì± ìì± view_admin_systemSettings_group_ldap = LDAP êµ¬ì± ìì± -view_admin_systemSettings_saveFailure = ìì€í ì€ì ì ì ì¥íëë° ì€íšíìµëë€ -view_admin_systemSettings_savedSettings = ìì€í ìì±ì ì ì¥ì ì±ê³µíììµëë€ view_admin_systemSettings_serverDetails = ìë² ììžì 볎 view_admin_systemSettings_serverDetails_buildNumber = ë¹ë ë²íž -view_admin_systemSettings_serverDetails_currentTable = íì¬ ìž¡ì ë¡ì° í ìŽëž view_admin_systemSettings_serverDetails_dbDriverName = ë°ìŽí°ë² ìŽì€ ëëŒìŽë² ìŽëŠ view_admin_systemSettings_serverDetails_dbDriverVersion = ë°ìŽí°ë² ìŽì€ ëëŒìŽë² ë²ì view_admin_systemSettings_serverDetails_dbName = ë°ìŽí°ë² ìŽì€ ì í ìŽëŠ view_admin_systemSettings_serverDetails_dbUrl = ë°ìŽí°ë² ìŽì€ ì ì URL view_admin_systemSettings_serverDetails_dbVersion = ë°ìŽí°ë² ìŽì€ ì í ë²ì view_admin_systemSettings_serverDetails_installDir = ìë² ì€ì¹ ëë í 늬 -view_admin_systemSettings_serverDetails_nextRotation = ë€ì ìž¡ì í ìŽëž êµì²Ž view_admin_systemSettings_serverDetails_productName = ì í ìŽëŠ view_admin_systemSettings_serverDetails_serverName = ìë² ìŽëŠ view_admin_systemSettings_serverDetails_time = ìë² ë¡ì»¬ ìê° @@ -734,7 +626,6 @@ view_alert_common_tab_conditions_type_metric_range_outside_exclusive = íµê³ê° view_alert_common_tab_conditions_type_metric_range_outside_inclusive = íµê³ê°ì ë²ì: [{0}] : [{1}] ë° [{2}] ìžë¶ (겜ê³ê° í¬íš) view_alert_common_tab_conditions_type_metric_threshold = íµê³ ìê³ ê° view_alert_common_tab_conditions_type_metric_trait_change = ížë ìŽížì ë³í -view_alert_common_tab_conditions_type_operation = ì€íŒë ìŽì ì ì€í view_alert_common_tab_conditions_type_operation_status = 결곌 ìíìžê° view_alert_common_tab_conditions_type_resource_configuration = ìì 구ì±ì ë³í view_alert_common_tab_dampening = ê°ì @@ -751,14 +642,10 @@ view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = 조걎 view_alert_common_tab_dampening_duration_occurrences_label = ë°ì view_alert_common_tab_dampening_duration_occurrences_label_tooltip = íì ìëŠŒìŽ ì€íëêž° ì ì 조걎ì§í©ì ì§ì ë êž°ê°ëì 충족íŽìŒ í©ëë€. view_alert_common_tab_dampening_duration_period_label = ìê° ê°ê²© -view_alert_common_tab_dampening_duration_period_label_tooltip = 죌ìŽì§ ë°ì íìê° trueìžì§ ì¬ë¶ë¥Œ íìžíêž° ìíŽ ì¡°ì ì í ì€ížíë ìê°ë²ì. view_alert_common_tab_dampening_partial_evalatuions_label = íê° -view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = 죌ìŽì§ ë°ì íìê° trueìžì§ ì¬ë¶ë¥Œ íìžíêž° ìíŽ ì¡°ê±Ž ì€ì ìŽ í ì€ížëë ìŽ íì. view_alert_common_tab_dampening_partial_occurrences_label = ë°ì view_alert_common_tab_dampening_partial_occurrences_label_tooltip = ê²œê³ ê° ë°ìíêž° ì ì ìµê·Œ Nê°ì íê°ì¬ìŽìì 조걎 ì€ì ìŽ trueìŽìŽìŒ íë€ë íì. view_alert_common_tab_general = ìŒë° ìì± -view_alert_common_tab_invalid_condition_category = ì못ë 조걎 칎í ê³ ëŠ¬ - ì¬ííŒ ìŽê²ì ë²ê·žë¡ ë³Žê³ íììì€: {0} -view_alert_common_tab_invalid_dampening_category = ì못ë ë€í 칎í ê³ ëŠ¬ - ì¬ííŒ ìŽê²ì ë²ê·žë¡ ë³Žê³ íììì€: {0} view_alert_common_tab_invalid_time_units = ì못ë ìê° ëšì - ì¬ííŒ ìŽê²ì ë²ê·žë¡ ë³Žê³ íììì€: {0} view_alert_common_tab_notifications = ì늌 view_alert_common_tab_notifications_message = ë©ìì§ @@ -775,21 +662,17 @@ view_alert_definition_condition_editor_common_max = ìµë view_alert_definition_condition_editor_common_min = ìµì view_alert_definition_condition_editor_delete_confirm = ì íë ê²œê³ ì ì륌 ìì íìê² ìµëê¹? view_alert_definition_condition_editor_drift_configname_regex = ë늬ííž ì ì ìŽëŠ -view_alert_definition_condition_editor_drift_configname_regex_tooltip = ë§ìœ ì§ì ë 겜ì°, ìŽë ë°ê²¬ë ë늬íížë¥Œ ìí ì± ìì ê°ì§ ë늬ííž ì ì ìŽëŠì ëë€. ìŽê²ì ì¬ë¬ ë늬ííž ì ì ìŽëŠê³Œ ìŒì¹íê³ ì¶ë€ë©Ž ìµì ìŒë¡ ì ê·íí í ì ììµëë€. view_alert_definition_condition_editor_drift_pathname_regex = ê²œë¡ ì ê· ííì view_alert_definition_condition_editor_drift_pathname_regex_tooltip = ë§ìœ ì§ì ë 겜ì°, ìŽë ë늬íížë íìŒì ê²œë¡ ìŽëŠê³Œ ìŒì¹íŽìŒ íë€ë ì ê·ííìŽ ë©ëë€. view_alert_definition_condition_editor_drift_tooltip = ìŽ ì¡°ê±Žì ë늬íížê° ê°ì§ë ë ížëŠ¬ê±°ë©ëë€. view_alert_definition_condition_editor_event_regex = ì ê· ííì view_alert_definition_condition_editor_event_regex_tooltip = ë§ìœ ì§ì ë 겜ì°, ìŽê²ì ì ê·ííììŽë©°, ìŽ ì¡°ê±Žì ì ëíêž° ìíì¬ ìì§ë ìŽë²€íž ë©ìì§ì ìŒì¹íŽìŒ í©ëë€. view_alert_definition_condition_editor_event_severity = ìŽë²€íž ì¬ê°ë -view_alert_definition_condition_editor_event_tooltip = ìŽ ì¡°ê±Žì ì ëíêž° ìíì¬ ìŽë²€íž ë©ìì§ê° ë³Žê³ ë íìê° ìë ìŽë²€íž ì¬ê°ë륌 ì§ì í©ëë€. ë§ìœ ìµì ìŽ ëë ì ê·ííìì ì§ì íë€ë©Ž, ìŽë²€íž ë©ìì§ë íŽë¹ ì¡°ê±ŽìŽ ë°ìíêž° ë묞ì ìŽë²€íž ë©ìì§ë ì ê·ííì곌 ìŒì¹íŽìŒ í©ëë€. view_alert_definition_condition_editor_metric_baseline_percentage = êž°ì€ ë°±ë¶ìš view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = ì íë ë¹êµ ì°ì°ì륌 ì¬ì©íì¬ ì íë êž°ì€ ê°ì ë¹ìšì ë¹êµí ë ìì§ë íµê³ê°ìŽ ì¡°ê±ŽìŽ ë°ìí©ëë€. -view_alert_definition_condition_editor_metric_baseline_tooltip = 조걎ì ì ëíêž° ìíì¬ ìë°ë íìê° ìë Ʞ볞ê°ì ì§ì í©ëë€. ì§ì íë ê°ì 죌ìŽì§ Ʞ볞ê°ì ë°±ë¶ìšì ëë€. view_alert_definition_condition_editor_metric_baseline_value = êž°ì€ view_alert_definition_condition_editor_metric_calltime_change_percentage = ë°±ë¶ìš ë³í view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = ì ìŽë ì íë ížì¶ìê° ì íê°ì ë°±ë¶ìšê³Œ ë€ë¥ž 겜ì°, ìì§ë ížì¶ìê°ìŽ 조걎ì ìŒìŒíµëë€. -view_alert_definition_condition_editor_metric_calltime_change_tooltip = 조걎ì ìŒìŒí€ë ìµìí ì§ì ë ìì ë³íê° ë°ìíì ëì ížì¶ê°ì ì§ì í©ëë€. (ìµì, ìµë, íê· íµí ìê°ê°)륌 íìžíêž° ìíŽ ížì¶ìê° ì íì ì¢ ë¥ì ë°ìì íìí ë³íì ë¹ìšì ì§ì íŽìŒ í©ëë€. view_alert_definition_condition_editor_metric_calltime_common_comparator = ë¹êµêž° view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = ë³í view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = ìŠë @@ -800,7 +683,6 @@ view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = view_alert_definition_condition_editor_metric_calltime_common_name = ížì¶ ìê° íµê³ view_alert_definition_condition_editor_metric_calltime_common_regex = ì ê· ííì view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = ë§ìœ ì§ì ëë€ë©Ž, ìŽê²ì ì ê·ííììŽë©°, 조걎ì ì ëíêž° ìíì¬ ížì¶ ëì곌 ìŒì¹íŽìŒ í©ëë€. -view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = ìë°íìë, 조걎ì ìŒìŒí€ë ížì¶ ìê° íê³ë¥Œ ì§ì í©ëë€. ì§ì íë ê°ì ìµì ì ëšì륌 ë°ë¥ž ì ëê°ìŽ ë©ëë€. (ìµì, ìµë, íê· íµí ìê°ê°) ê°ì ë¹êµíêž° ìíŽ ížì¶ìê° ì íì ì¢ ë¥ë¥Œ ì§ì íŽìŒí©ëë€. view_alert_definition_condition_editor_metric_calltime_threshold_value = ížì¶ ìê° ê° view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = ì íë ë¹êµì(comparator)륌 ì¬ì©íì¬ ë¹êµí ë ì¡°ê±ŽìŽ ìŒìŽë íµê³ ìê³ê° view_alert_definition_condition_editor_metric_change_tooltip = 조걎ì ì ëíêž° ìíŽ ë³ê²œíŽìŒ íë ê° íµê³ë¥Œ ì§ì í©ëë€. @@ -813,9 +695,7 @@ view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = ìžë¶ìì 겜ê³ê°ì í¬íš view_alert_definition_condition_editor_metric_range_comparator_tooltip = íµê³ê°ìŽ ë²ì ëŽì ìëì§ ë²ì륌 ë²ìŽë 겜ì°, ìŽ ì¡°ê±Žì ížëŠ¬ê±°ê° ë ì§ ì¬ë¶ë¥Œ ê²°ì í©ëë€. view_alert_definition_condition_editor_metric_range_hivalue = ëì ê° -view_alert_definition_condition_editor_metric_range_hivalue_tooltip = ë²ìì ëì ìê³ê°ì ëë€. view_alert_definition_condition_editor_metric_range_lovalue = ë®ì ê° -view_alert_definition_condition_editor_metric_range_lovalue_tooltip = ë²ìì ë®ì ìê³ê°ì ëë€. view_alert_definition_condition_editor_metric_range_tooltip = íµê³ê°ê³Œ 죌ìŽì§ ë²ì (ë®ì ê°ê³Œ ëì ê°)륌 ë¹êµí©ëë€. view_alert_definition_condition_editor_metric_threshold_comparator = ë¹êµ ì°ì°ì view_alert_definition_condition_editor_metric_threshold_comparator_equal = ëìŒí @@ -823,14 +703,12 @@ view_alert_definition_condition_editor_metric_threshold_comparator_greater = ë view_alert_definition_condition_editor_metric_threshold_comparator_less = ë ìì view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = ìì§ë íµê³ê°ìŽ 죌ìŽì§ ìê³ê°ê³Œ ë¹êµíë ë°©ë² view_alert_definition_condition_editor_metric_threshold_name = íµê³ -view_alert_definition_condition_editor_metric_threshold_tooltip = ìë°íìëì 조걎 ížëŠ¬ê±°íë ìê³ê°ì ì§ì í©ëë€. ì§ì íë ê°ì ìµì ìŽ ëë ëšìì ì ëê° view_alert_definition_condition_editor_metric_threshold_value = íµê³ê° view_alert_definition_condition_editor_metric_threshold_value_tooltip = íµê³ ìê³ê°ì ì íë ë¹êµë¥Œ ì¬ì©íì¬ ë¹êµë ë 조걎 ížëŠ¬ê±°ë©ëë€. view_alert_definition_condition_editor_metric_trait_change_tooltip = 조걎ì ì ëíêž° ìíŽ ë³ê²œíŽìŒ íë ê° í¹ì±ì ì§ì í©ëë€. view_alert_definition_condition_editor_metric_trait_change_value = í¹ì± view_alert_definition_condition_editor_metricswarning = 몚ë ì°ê²°ì ì¬ì©í ëë ê°ì íµê³ë¥Œ ì¬ì©, ì¬ë¬ 조걎ì ì§ì í ì ììµëë€. ìŽ ê²œê³ ì ìë íµê³ [{0}]륌 ì¬ì© ì¬ë¬ 조걎ì ê°ì§ê³ ììµëë€. view_alert_definition_condition_editor_operation_status = ìŽì ìí -view_alert_definition_condition_editor_operation_tooltip = ì íí ìì ìŽ ì€íëë©Ž 조걎ì ì€ííêž° ìíŽì ë°ìíŽìŒ íë 결곌륌 ì§ì . view_alert_definition_condition_editor_operator_availability_durationDown = ì ì§ ìí view_alert_definition_condition_editor_operator_availability_durationNotUp = ììíì§ ìì ìí view_alert_definition_condition_editor_operator_availability_goesDisabled = ë¹íì±íëë€ @@ -849,11 +727,9 @@ view_alert_definition_condition_editor_option_metric_change = ìž¡ì ê°ì ë³ view_alert_definition_condition_editor_option_metric_range = ìž¡ì ê°ì ë²ì view_alert_definition_condition_editor_option_metric_threshold = ìž¡ì ì ëì¹ íê³ view_alert_definition_condition_editor_option_metric_trait_change = í¹ì±ê°ì ë³í -view_alert_definition_condition_editor_option_operation = ì€íŒë ìŽì ì ì€í view_alert_definition_condition_editor_option_resource_configuration = ìì 구ì±ì ë³í view_alert_definition_condition_editor_resource_configuration_tooltip = ìŽ ì¡°ê±Žì ìì 구ì±ìŽ ë³ê²œëë©Ž ë°ìí©ëë€. view_alert_definition_for_group = ë·° 귞룹 ì ì -view_alert_definition_for_type = ë·° í í늿 view_alert_definition_notification_cliScript_editor_anotherUser = ë€ë¥ž ì¬ì©ì view_alert_definition_notification_cliScript_editor_existingScript = êž°ì¡Žì ì€í¬ëŠœíž view_alert_definition_notification_cliScript_editor_loadFailed = CLI ì늌 ížì§êž°ì ë¡ëì ì€íšíìµëë€. @@ -863,13 +739,11 @@ view_alert_definition_notification_cliScript_editor_script = ì€í¬ëŠœíž view_alert_definition_notification_cliScript_editor_selectRepo = ì€í¬ëŠœížê° ë€ìŽìë ì ì¥ì륌 ì ííììì€ view_alert_definition_notification_cliScript_editor_selectRepoFirst = ì ì¥ì륌 뚌ì ì ííììì€. view_alert_definition_notification_cliScript_editor_thisUser = ìì -view_alert_definition_notification_cliScript_editor_uploadNewScript = ì ì€í¬ëŠœíž ì ë¡ë view_alert_definition_notification_cliScript_editor_verifyAuthentication = íìž view_alert_definition_notification_cliScript_editor_whichUser = ì€í¬ëŠœížë¥Œ ì€ííë ì¬ì©ì view_alert_definition_notification_editor_delete_confirm = ì íí ê²œê³ ìëì ìì íìê² ìµëê¹? view_alert_definition_notification_editor_field_configuration = êµ¬ì± view_alert_definition_notification_editor_field_configuration_loadFailed = ì늌 구ì±ì 믞늬 ê°ì žì€ëë° ì€íšíìµëë€ -view_alert_definition_notification_editor_field_configuration_not_loaded = ë¶ëª view_alert_definition_notification_editor_field_sender = ë³Žëž ì¬ë view_alert_definition_notification_editor_loadFailed = ê²œê³ ë³Žëž ì¬ëì ê²ìí ì ììµëë€ view_alert_definition_notification_editor_loadFailed_single = ê²œê³ ë³Žëž ì¬ë êµ¬ì± ì ì륌 ê°ì žì¬ ì ììµëë€ @@ -883,20 +757,12 @@ view_alert_definition_notification_operation_editor_mode_relative = êŽë š 늬 view_alert_definition_notification_operation_editor_mode_specific = í¹ì 늬ìì€ view_alert_definition_notification_operation_editor_mode_this = ìŽ ëŠ¬ìì€ view_alert_definition_notification_operation_editor_mode_title = 늬ìì€ ì í 몚ë -view_alert_definition_notification_operation_editor_mode_unknown = ì ì ìë ìµì - ìŽê²ì ë²ê·žì ëë€ -view_alert_definition_notification_operation_editor_operations_loadFailed = ì¬ì© ê°ë¥í ìì 목ë¡ì ë¡ëíëë° ì€íšíìµëë€ -view_alert_definition_notification_operation_editor_operations_no_parameters = ìŽ ìì ì íëë ë§€ê° ë³ì륌 ì¬ì©íì§ ììµëë€ view_alert_definition_notification_operation_editor_relative_ancestor = ê²ì ìì -view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = íì ì ì¡°ìì ê°ì žì¬ ì ììµëë€. -view_alert_definition_notification_operation_editor_relative_ancestor_root = ë£šíž ì¡°ì íì -view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = íì ê³ìžµì í±ì ì íí©ëë€. ê·žê²ì ì íì íí°ë¥Œ ìíŽ ìì ížëŠ¬ë¥Œ ê²ìíë êž°ë°ìŽ ë©ëë€. view_alert_definition_notification_operation_editor_relative_descendant = ë€ìì íí° -view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = ì íí ì íì íŽë¹íë ì¬ë¬ ìììŽ ììŒë©Ž ììì ê³ ì íê² ìë³íë 구첎ì ìž ìŽëŠ. ìŽê²ì ì íí íì ê³ìžµ 구조ìì íŽë¹ ìì íì ì ì ìŒí ìì ë°ì ìë 겜ì°ë ìµì ì ëë€. view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = ì íì ììì ì»ì ì ììµëë€ view_alert_definition_notification_operation_editor_relative_descendant_tooltip = ê²ììì ì íì ì ìë ê²œë¡ ì íìì ì°Ÿêž° 늬ìì€ ì í view_alert_definition_notification_operation_editor_specific_pick_button = ì í view_alert_definition_notification_operation_editor_specific_pick_error_invalid = 늬ìì€ë¥Œ ì ííììì€ -view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = íë ìŽìì ìì ì ì¬ì©íì¬ ëŠ¬ìì€ë¥Œ ì ííììì€ view_alert_definition_notification_operation_editor_specific_pick_text = 늬ìì€ë¥Œ ì í... view_alert_definition_notification_operation_editor_specific_resource = 늬ìì€ view_alert_definition_notification_role_editor_loadFailed = íì¬ì ìí ì ê²°ì í ì ììµëë€ - ë¹ ìíë¡ ììí©ëë€ @@ -926,8 +792,6 @@ view_alert_definitions_loadFailed = ê²œê³ ì ì ë°ìŽí°ë¥Œ ê²ìíëë° view_alert_definitions_loadFailed_single = ID {0}ìŽ ë¶ì ê²œê³ ì ì ë°ìŽí°ë¥Œ ê²ìíëë° ì€íšíìµëë€ view_alert_definitions_table_title_group = 귞룹 ê²œê³ ì ì view_alert_definitions_table_title_resource = 늬ìì€ ê²œê³ ì ì -view_alert_definitions_update_failure = ê²œê³ ì ì ì ë°ìŽížì ì€íšíìµëë€ -view_alert_definitions_update_success = ê²œê³ ì ì ì ë°ìŽížì ì±ê³µíìµëë€ view_alert_details_field_ack_at = ë€ì ìì¹ìì íìžíìµëë€ view_alert_details_field_ack_by = ë€ì ì¬ëì ìíŽ íìžëììµëë€ view_alert_details_field_recovery_info = 복구 ì 볎 @@ -951,7 +815,6 @@ view_alerts_field_ack_status_noAck = 믞íìž view_alerts_field_ack_status_noAckHover = ìì§ íìžëì§ ìììµëë€ view_alerts_field_ack_subject = íìž ì£Œì view_alerts_field_ack_time = íìž ìê° -view_alerts_field_condition_text = ì¡°ê±Žë¶ í ì€íž view_alerts_field_condition_text_many = ë€ì€ 조걎 view_alerts_field_condition_text_none = 조걎ììŽ view_alerts_field_condition_value = ì¡°ê±Žê° @@ -998,45 +861,30 @@ view_bundle_bundleDeployment = ë²ë€ ë°°í¬ view_bundle_bundleDeployments = ë²ë€ ë°°í¬ view_bundle_bundleDestinations = ë²ë€ ëì view_bundle_bundleFiles = ë²ë€ íìŒ -view_bundle_bundleType = ë²ë€ íì view_bundle_bundleVersion = ë²ë€ ë²ì view_bundle_bundleVersions = ë²ë€ ë²ì view_bundle_bundles = ë²ë€ view_bundle_createWizard_bundleDistro = ë²ë€ ë°°í¬ -view_bundle_createWizard_cancelFailure = ë²ë€ [{0}], ë²ì = [{1}] ìì±ì ì 첎 ì·šìì ì€íšíìµëë€. - ë²ë€ì ë°ìŽí°ë² ìŽì€ì ìì§ ëšì ììì§ë ëªšëŠ ëë€. view_bundle_createWizard_cancelSuccessful = ë²ë€ [{0}], ë²ì = [{1}]ì ìì±ì ì·šìíìµëë€. view_bundle_createWizard_clickToUploadRecipe = ë ìíŒ íìŒì ë¡ëíêž° ìíŽ íŽëŠíììì€ view_bundle_createWizard_createFailure = ë²ë€ ìì±ì ì€íšíìµëë€ view_bundle_createWizard_createSuccessful = ë²ì [{1}]ì [{0}]ëŒë ë²ë€ ìì±ì ì±ê³µíìµëë€. view_bundle_createWizard_enterRecipe = ì¬ë°ë¥ž ë ìíŒë¥Œ ì ê³µíììì€ -view_bundle_createWizard_enterUrl = ë²ë€ ë°°í¬ íìŒì ë€ìŽë¡ë í URLì ì ë ¥íììì€ -view_bundle_createWizard_failedToUploadDistroFile = ë²ë€ ë°°í¬ íìŒ ì ë¡ëì ì€íšíìµëë€ -view_bundle_createWizard_failedToUploadFile = ë²ë€ íìŒ ì ë¡ëì ì€íšíìµëë€ view_bundle_createWizard_loadBundleFileFailure = ìë²ìì ë²ë€ íìŒ ì 볎륌 íë í ì ììµëë€ -view_bundle_createWizard_noAdditionalFilesNeeded = ìŽ ë²ë€ì ìíŽ ì ë¡ë íŽìŒíë ì¶ê° íìŒìŽ ììµëë€ -view_bundle_createWizard_noBundleTypesAvail = ë²ë€ íì ì ì¬ì©í ì ììµëë€ -view_bundle_createWizard_noBundleTypesSupported = ë²ë€ íì ì íëë ì§ìíì§ ììµëë€ - ë²ë€ ë°°í¬ë¥Œ ì§ìíë ì¬ë°ë¥ž íë¬ê·žìžì ë°°í¬íŽìŒ í©ëë€ view_bundle_createWizard_provideBundleDistro = ë²ë€ ë°°í¬ ì ê³µ view_bundle_createWizard_recipeOption = ë ìíŒ view_bundle_createWizard_title = ë²ë€ ìì± -view_bundle_createWizard_uploadInProgress = ì ë¡ë ì€ì ëë€... ìŽ ìì ì í° íìŒì 겜ì°ìë ëª ë¶ ì ë 걞늎 ì ììµëë€ -view_bundle_createWizard_uploadOption = ì ë¡ë -view_bundle_createWizard_uploadStepName = ë²ë€ íìŒ ì ë¡ë view_bundle_createWizard_urlOption = URL view_bundle_createWizard_windowTitle = ë²ë€ ìì± ë§ë²ì¬ -view_bundle_createWizard_youMustChooseOne = ë²ë€ì ìì±íë ìµì ì ì ííŽìŒ í©ëë€! -view_bundle_deleteConfirm = ìŽ ë²ë€ì ìì íìê² ìµëê¹? ìŽ ë²ë€ì 몚ë ë²ì , ëì, ë°°í¬ë ìì ë©ëë€. ê·žë¬ë, ì격 컎íší°ìì 컚í ìž ë¥Œ ì ê±°íì§ë ììµëë€ view_bundle_deploy = ë°°í¬ view_bundle_deployDir = ë°°í¬ ëë í 늬 view_bundle_deployWizard_deployStep = ëì íë«íŒì ë²ë€ ë°°í¬ view_bundle_deployWizard_deploying = ë°°í¬ ì€... view_bundle_deployWizard_deploymentCreated = ë°°í¬ ìì±ì€... -view_bundle_deployWizard_deploymentCreatedDetail = ì€ëª [{1}] ë°°í¬ [{0}]ì ë§ë€ììµëë€ view_bundle_deployWizard_deploymentCreatedDetail_concise = ë°°í¬ [{0}]ì ë§ë€ììµëë€ view_bundle_deployWizard_deploymentScheduled = ë²ë€ ë°°í¬ê° ììœëììµëë€! view_bundle_deployWizard_deploymentScheduledDetail = ë²ë€ ë°°í¬ [{0}]ì ëì 귞룹 [{1}] ììœëììµëë€ view_bundle_deployWizard_deploymentScheduledDetail_concise = ë²ë€ ë°°í¬ê° ììœëììµëë€ -view_bundle_deployWizard_destinationCreatedDetail = ì€ëª [{1}] ë°°í¬ [{0}]ì ë§ë€ììµëë€ view_bundle_deployWizard_destinationCreatedDetail_concise = ëì [{0}]ì ë§ë€ììµëë€ view_bundle_deployWizard_error_1 = ì·šìì ëí ìë¡ìŽ ë°°í¬ ì ê±°ì ì€íšíìµëë€ view_bundle_deployWizard_error_10 = ìŽë¯ž ì¡Žì¬íëì§ë 몚륎ë ëì ìì±ì ì€íšíìµëë€. (죌ì, ëì ë·°ìì êž°ì¡Ž ëì ë°°í¬ë¥Œ ìí) @@ -1050,22 +898,16 @@ view_bundle_deployWizard_error_6 = ë°°í¬ ìì±ì ì€íšíìµëë€: {0} view_bundle_deployWizard_error_7 = ë°°í¬ ìŽëŠì ê°ì žì€ëë° ì€íšíìµëë€ view_bundle_deployWizard_error_8 = ëë¡ ë€ìŽìì ì¬ë°ë¥ž 늬ìì€ ê·žë£¹ì ì ííŽìŒ í©ëë€ view_bundle_deployWizard_error_9 = ë€ì íìŽì§ìì ì ëì ìì ì ì€íšíìµëë€ -view_bundle_deployWizard_error_noBundleConfig = ë²ë€ ëì ì 볎ì ì·šëì ì€íšíìµëë€. ì íí 귞룹ì ë²ë€ ë°°í¬ ëììŽ ë ì ìë ì¬ë°ë¥ž íží 귞룹ì ëê¹? view_bundle_deployWizard_getConfigSkip = ìŽ ë²ë€ ë²ì ìë ì€ì ìŽ íìíì§ ììµëë€. view_bundle_deployWizard_getConfigStep = ë°°í¬ êµ¬ì± ì€ì view_bundle_deployWizard_getDestStep = ìë¡ìŽ ëì view_bundle_deployWizard_getDest_deployDir = ë°°í¬ ëë í 늬 -view_bundle_deployWizard_getDest_deployDir_help = ë²ë€ìŽ ë°°í¬ë ëë í 늬. ìŽ ëë í 늬ë 몚ë 늬ìì€ì ëíŽ ë°°í¬íêž° ìíŽ ëìŒí ê²ìŽ ì¬ì©ëì§ë§ ëì Ʞ볞 ëë í 늬ì ëí ìë 겜ë¡ì ëë€. ìŽë ë€ë¥ž ëì 늬ìì€ì ëí Ʞ볞 ëë í 늬 ë°°ì¹ê° ìŽëì ìëê° íëê²ì ë°ëŒ, ì ë ëë í 늬ë ë€ë¥ž ëì 늬ìì€ì ë°ëŒ 겜ë¡ê° ë ì ììì ì믞í©ëë€. -view_bundle_deployWizard_getDest_desc = ëì ì€ëª view_bundle_deployWizard_getDest_destBaseDirName = Ʞ볞 ìì¹ view_bundle_deployWizard_getDest_group_help = 귞룹ì íììŽ ëªšë ë²ë€ ë°°í¬ë¥Œ ìí ëì. ë²ë€ ë°°í¬ë¥Œ ì§ìíë ììì í¬íšíë íží ê·žë£¹ë§ ì í ê°ë¥í©ëë€. view_bundle_deployWizard_getDest_name = ëì ìŽëŠ view_bundle_deployWizard_getDest_name_help = ëì ìŽëŠ, ê·žê²ì 늬ìì€ì í¹ì 귞룹곌 í¹ì ë²ë€ 늬ìì€ì ëí ëì ëë í 늬륌 ìë³í©ëë€. view_bundle_deployWizard_getInfoStep = ë°°í¬ ì 볎 ì ê³µ -view_bundle_deployWizard_getInfo_clean = íŽëŠ° ë°°í¬ì ëê¹? (ëì íë«íŒìì ë°°í¬ ëë í 늬륌 ì²ìíë) -view_bundle_deployWizard_getInfo_deploymentDesc = ë°°í¬ ì€ëª view_bundle_deployWizard_getInfo_deploymentName = ë°°í¬ ìŽëŠ -view_bundle_deployWizard_getOptionsStep = ë°°í¬ ìµì view_bundle_deployWizard_getOptions_deployLater = ëì€ì ë°°í¬ view_bundle_deployWizard_getOptions_deployNow = ì§êž ë°°í¬ view_bundle_deployWizard_getOptions_deployTime = ë°°í¬ ìê° @@ -1076,7 +918,6 @@ view_bundle_deployWizard_selectVersion_latest = ìµì ë²ì [{0}] view_bundle_deployWizard_selectVersion_live = ìë ë²ì [{0}] view_bundle_deployWizard_selectVersion_select = 목ë¡ìì ë²ì ì ì ííììì€ : view_bundle_deployWizard_title = ë²ë€ ë°°í¬ ë§ë²ì¬ -view_bundle_deploy_action = ì¡ì view_bundle_deploy_backButton = ëììŒë¡ ëìê°êž° view_bundle_deploy_clickForError = ìë¬ ë©ìì§ ììŽìœì íŽëŠíììì€ view_bundle_deploy_deleteConfirm = ìŽ ë²ë€ ë°°í¬ë¥Œ ìì íìê² ìµëê¹? ìŽê²ì ë°ìŽí°ë² ìŽì€ììë§ ìì í©ëë€; ì격 컎íší°ì ë°°í¬ë 몚ë ë²ë€ ëŽì©ìŽ ì ì§ë©ëë€. @@ -1090,8 +931,6 @@ view_bundle_deploy_loadDeployFailure = ë²ë€ ë°°í¬ ë¡ëì ì€íšíìµë view_bundle_deploy_loadFailure = ë²ë€ ë°°í¬ ë¡ëì ì€íšíìµëë€ view_bundle_deploy_name = ë°°í¬ ìŽëŠ view_bundle_deploy_selectARow = ì€ì¹ ì 볎륌 íìíë íì ì ííììì€ -view_bundle_deploy_tagUpdateFailure = ë²ë€ ë°°í¬ íê·žì ì ë°ìŽížì ì€íšíìµëë€ -view_bundle_deploy_tagUpdateSuccessful = ë²ë€ ë°°í¬ íì€ì ì ë°ìŽížì ì±ê³µíìµëë€ view_bundle_deploy_time = ë°°í¬ ìê° view_bundle_deployed = ë°°í¬ view_bundle_deployments = ë°°í¬ @@ -1108,12 +947,9 @@ view_bundle_dest_lastDeploymentDate = ë§ì§ë§ ë°°í¬ ë ì§ view_bundle_dest_lastDeploymentStatus = ë§ì§ë§ ë°°í¬ ìí view_bundle_dest_loadFailure = ë²ë€ ëìì ë¡ëíëë° ì€íšíìµëë€ view_bundle_dest_loadFailureVersionInfo = ë°°í¬ë ë²ë€ ëìì ë²ì ì 볎 ë¡ëì ì€íšíìµëë€ -view_bundle_dest_purgeConfirm = ìŽ ìì ì 몚ë ì격 컎íší°ìì ë²ë€ 컚í ìž ë¥Œ ì ê±°í©ëë€. ìŽê²ì ìííìê² ìµëê¹? view_bundle_dest_purgeFailure = ì격 컎íší°ì ìŒë¶ ëë ì ë¶ìì ë²ë€ ëì [{0}]ì ì ê±°ì ì€íšíìµëë€. view_bundle_dest_purgeSuccessful = ì격 컎íší°ì ìŒë¶ ëë ì ë¶ìì ë²ë€ ëì [{0}]ì ì ê±°ì ì±ê³µíìµëë€. view_bundle_dest_revertConfirm = ìŽê²ì 몚ë ì격 컎íší°ë¥Œ ìŽë² ë²ë€ ë°°í¬ë¡ ëë늜ëë€. ìŽê²ì ìííìê² ìµëê¹? -view_bundle_dest_tagUpdateFailure = ë²ë€ ëì íê·ž ì ë°ìŽížì ì€íšíìµëë€ -view_bundle_dest_tagUpdateSuccessful = ë²ë€ ëì íê·ž ì ë°ìŽížì ì±ê³µíìµëë€ view_bundle_destinations = ëì view_bundle_fileListView_fileSize = íìŒ í¬êž° view_bundle_fileListView_loadFailure = ë²ë€ íìŒ ë°ìŽí° ë¡ëì ì€íšíìµëë€ @@ -1122,7 +958,6 @@ view_bundle_fileListView_sha256 = SHA256 view_bundle_files = íìŒ view_bundle_latestVersion = ìµì ë²ì view_bundle_list_backToAll = 몚ë ë²ë€ ëë늬Ʞ -view_bundle_list_deleteConfirm = ì íë ë²ë€ì ìì íìê² ìµëê¹? ë°ìŽí°ë² ìŽì€ìì ìì ì ë²ì , ëì, ë°°í¬ë¥Œ 몚ë ìì í©ëë€. ê·žë¬ë ì격 컎íší°ììë 컚í ìž ë¥Œ ì ê±°íì§ ììµëë€. view_bundle_list_deleteFailure = ë²ë€ [{0}]ì ìì ì ì€íšíìµëë€ view_bundle_list_deleteSuccessful = ë²ë€ [{0}]ì ìì ì ì±ê³µíìµëë€ view_bundle_list_deletesFailure = ë²ë€ì ìì ì ì€íšíìµëë€ @@ -1135,14 +970,11 @@ view_bundle_list_error4 = ìŽ ì ì¥ììì ë²ë€ì ì°Ÿì ì ììµëë€ view_bundle_list_loadFailure = ë°°í¬ëë ë²ë€ [{0}]ì ë¡ëì ì€íšíìµëë€ view_bundle_list_loadWithLatestFailure = ìµì ë²ì ë°ìŽí°ì ë²ë€ ë¡ê·žì ì€íšíìµëë€ view_bundle_list_singleLoadFailure = ë°°í¬ë ëšìŒ ë²ë€ [{0}]ì ê°ì žì€ëë° ì€íšíìµëë€ -view_bundle_list_tagUpdateFailure = ë²ë€ íê·ž ì ë°ìŽížì ì€íšíìµëë€ -view_bundle_list_tagUpdateSuccessful = ë²ë€ íê·ž ì ë°ìŽížì ì±ê³µíìµëë€ view_bundle_list_versionsCount = ë²ì 칎ìŽíž view_bundle_purge = ì ê±° view_bundle_recipe = ë ìíŒ view_bundle_resDeployDS_loadFailure = ë²ë€ 늬ìì€ ë°°í¬ì ë¡ëì ì€íšíìµëë€ view_bundle_revert = ì·šì -view_bundle_revertWizard_confirmStep_confirmation = ìŽì ë°°í¬ìì ì€í ì€ìž ë°°í¬ë¥Œ ëë늬ë ì€ì ëë€. ê³ìíë €ë©Ž "ë€ì"ì íŽëŠíììì€... view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = ì€í ì€ìž ë°°í¬ë¥Œ ì°Ÿì ì ììµëë€. ëë늎 ì ììµëë€. view_bundle_revertWizard_confirmStep_liveDeployment = ì€í ì€ìž ë°°í¬ view_bundle_revertWizard_confirmStep_name = ì·šì ë°°í¬ íìž @@ -1154,7 +986,6 @@ view_bundle_revertWizard_confirmStep_prevDeployment = ìŽì ë°°í¬ view_bundle_revertWizard_getInfoStep_cleanDeploy = ë°°í¬ë¥Œ ìì íìê² ìµëê¹? (ìŽê²ì ì€ëë êž°ì¡Žì ë°°í¬ ëë í 늬륌 ì·šì ë°°í¬ë¥Œ ììíêž° ì ì ìì í©ëë€) view_bundle_revertWizard_getInfoStep_getNameFailure = ì·šì ë°°í¬ ìŽëŠì ê°ì žì€ëë° ì€íšíìµëë€ view_bundle_revertWizard_getInfoStep_name = ì·šì ì 볎 ì ê³µ -view_bundle_revertWizard_getInfoStep_revertDeployDesc = ë°°í¬ ì€ëª ì·šì view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [ì·šì ì ]\n{0}\n\n[ì·šì í]\n{1} view_bundle_revertWizard_getInfoStep_revertDeployName = ë°°í¬ ìŽëŠ ì·šì view_bundle_revertWizard_revertStep_name = ëì íë«íŒì ë²ë€ì ë°°í¬ @@ -1166,9 +997,6 @@ view_bundle_revertWizard_title = ë²ë€ ì·šì view_bundle_revertWizard_windowTitle = ë²ë€ ì·šì ë§ë²ì¬ view_bundle_tree_loadFailure = ë²ë€ ë°ìŽí° ë¡ëì ì€íšíìµëë€ view_bundle_version_backToBundle = ë€ë¡ ê°êž° -view_bundle_version_bundleVersionTagUpdateFailure = ë²ë€ ë²ì íê·ž ì ë°ìŽížì ì€íšíìµëë€ -view_bundle_version_bundleVersionTagUpdateSuccessful = ë²ë€ ë²ì íê·ž ì ë°ìŽížì ì±ê³µíìµëë€ -view_bundle_version_deleteConfirm = ë²ë€ ë²ì ì ìì íìê² ìµëê¹? ìŽê²ì ì격 컎íší°ì ìŽë€ 컚í ìž ë ìì íì§ ììµëë€. view_bundle_version_deleteFailure = ë²ë€ ë²ì [{0}]ì ìì íëë° ì€íšíìµëë€ view_bundle_version_deleteSuccessful = ë²ë€ ë²ì [{0}]ì ìì íëë° ì±ê³µíìµëë€ view_bundle_version_loadFailure = ë²ë€ ë²ì ì ë¡ëíëë° ì€íšíìµëë€ @@ -1180,13 +1008,11 @@ view_configEdit_confirm_1 = ë¹ì ìŽ ìžížìì ì íí ìì±ì ìì í view_configEdit_confirm_2 = íŽë¹ íì ìì íìê² ìµëê¹? view_configEdit_confirm_3 = [{1}]ìŽ ì íë [{0}]ì ìì íìê² ìµëê¹? view_configEdit_editRow = í ížì§ -view_configEdit_enterPropName = ì¶ê°í ìì±ì ìŽëŠì ì ë ¥íììì€. view_configEdit_error_1 = ì€ì ìŽ ìŽ ëŠ¬ìì€ìì ì§ìíì§ ììµëë€. view_configEdit_error_2 = ì°ê²° ì€ì ìŽ ìŽ ëŠ¬ìì€ìì ì§ìíì§ ììµëë€. view_configEdit_error_3 = [{0}]ëŒë ìì±ì ì¶ê°í ì ììµëë€. ìì± ìŽëŠì ìŽë¯ž ìžížìì ì¬ì©ëê³ ììµëë€. view_configEdit_files = íìŒ view_configEdit_hideAll = 몚ë ìšêž°êž° -view_configEdit_jumpToSection = ì¹ì ìŒë¡ ìŽë view_configEdit_maxBoundsExceeded = ìµë í¬êž° ë²ìê° ì¶©ì¡±ëìêž° ë묞ì ë ë€ë¥ž í목ì ì¶ê°í ì ììµëë€: {0} view_configEdit_minBoundsExceeded = ìµìë¡ ì€ì ëììŒë¯ë¡ ìŽ í목ì ìì í ì ììµëë€: {0} view_configEdit_msg_1 = ìì± [{0}]ì ìžížì ì¶ê°íìµëë€. @@ -1200,31 +1026,20 @@ view_configEdit_tooltip_2 = 목ë¡ì í목ì ì¶ê°í©ëë€. view_configEdit_unset = Unset? view_configEdit_viewRow = í 볎Ʞ view_configurationDetails_allPropertiesValid = 몚ë ì€ì ìì±ì ì¬ë°ë¥ž ê°ìŽë¯ë¡, ìŽ ì€ì ì ì§êž ì ì¥ ê°ë¥í©ëë€. -view_configurationDetails_configNotUpdatedDueToNoChange = ì€ì ì ì ë°ìŽížëì§ ìììµëë€, ìëíë©Ž ìë¡ìŽ ì€ì ì íì¬ì ì€ì 곌 ëìŒíêž° ë묞ì ëë€. -view_configurationDetails_error_updateFailure = ì€ì ì ì ë°ìŽížíì§ ëª»íìµëë€. -view_configurationDetails_messageConcise = ì€ì ìŽ ì ë°ìŽížëììµëë€ - íì¬ ë²ì ì {0} ì ëë€. -view_configurationDetails_messageDetailed = 늬ìì€ [{1}]ì ì€ì ì {0} ë²ì ìŒë¡ ì ë°ìŽíž ëììµëë€. view_configurationDetails_noConfigurationFetched = ì€ì ì ê²ìëì§ ììµëë€. ìŽê²ì íë¬ê·žìž ì€ì ëë ì€ì 몚ìì ëšìí ì°ê²° ì€ì ìŽ êºŒì žì ë¡ëíì§ ëª»íìì ì믞í©ëë€. view_configurationDetails_noPermission = ìŽ ëŠ¬ìì€ì ì€ì ì ížì§í ì ìë ê¶íìŽ ììµëë€. view_configurationDetails_somePropertiesInvalid = ë€ì ì€ì ìì±ì ì못ë ê° : {0}. ìŽ ê°ì ì€ì ìŽ ì ì¥ëêž° ì ì ê³ ì³ì žìŒ í©ëë€. view_configurationHistoryDetails_error_loadFailure = ì€ì ëŽìì ë¡ëí ì ììµëë€. view_configurationHistoryList_cannotDeleteCurrent = ì íë êž°ë¡ì íì¬ ì€ì ìŽ í¬íšëìŽ ììµëë€ - ê·žê²ì ìì í ì ììµëë€. -view_configurationHistoryList_cannotDeleteGroupItems = ì íë ì€ì ëŽìì 귞룹 ì€ì ì ì ë°ìŽížë¥Œ í¬íší©ëë€. ê°ë³ 늬ìì€ êž°ë¡ì ìì í ì ìëë¡ íêž° ì ì ë¶ëªšì 귞룹 êž°ë¡ì ì ê±°íŽìŒ í©ëë€. view_configurationHistoryList_delete_failure = ì€ì êž°ë¡ ìì ì ì€íšíìµëë€. view_configurationHistoryList_delete_success = ì íë ì€ì êž°ë¡ ìì ì ì±ê³µíìµëë€. view_configurationHistoryList_rollback = 례백 view_configurationHistoryList_rollback_failure = ì€ì 례백ì ì€íšíìµëë€. ìë ì€ì ì ì¬ì í ì íší©ëë€. view_configurationHistoryList_rollback_success = ì íë ìŽì ì€ì ìì ì€ì ì 례백íëë° ì±ê³µíìµëë€. view_configurationHistoryList_table_clickStatusIcon = ììží ëŽì©ì ìí ììŽìœì íŽëŠíììì€ -view_configurationHistoryList_table_statusFailure = ì€ì ì ë°ìŽíž ì€íš -view_configurationHistoryList_table_statusInprogress = ì€ì ì ë°ìŽížë ìì§ ì§íì€ì ëë€ view_configurationHistoryList_table_statusNochange = ì€ì ì ë³ê²œëì§ ììµëë€ -view_configurationHistoryList_table_statusSuccess = ì€ì ì ë°ìŽížê° ì±ê³µíìµëë€ view_configurationHistoryList_title = ì€ì ìŽë ¥ view_connectionSettingsDetails_allPropertiesValid = 몚ë ì°ê²° ì€ì ìŽ ì¬ë°ë¥ž ê°ìŽë¯ë¡, ì€ì ì ì ì¥ê°ë¥í©ëë€. -view_connectionSettingsDetails_error_updateFailure = ì°ê²° ì€ì ì ë°ìŽížì ì€íšíìµëë€. -view_connectionSettingsDetails_messageConcise_updateSuccess = ì°ê²° ì€ì ìŽ ì ë°ìŽíž ëììµëë€. -view_connectionSettingsDetails_messageDetailed_updateSuccess = 늬ìì€ [{0}]ì ëí ì°ê²° ì€ì ìŽ ì ë°ìŽíž ëììµëë€. view_connectionSettingsDetails_noPermission = ìŽ ëŠ¬ìì€ì ì°ê²° ì€ì ì ížì§í ê¶íìŽ ììµëë€. view_connectionSettingsDetails_somePropertiesInvalid = ë€ì ì°ê²° ì€ì ì ì못ë ê° : {0}. ìŽ ê°ì ì€ì ìŽ ì ì¥ëêž° ì ì ê³ ì³ì žìŒ í©ëë€. view_core_loggedOut = ë¡ê·ž ìì @@ -1239,9 +1054,8 @@ view_dashboardManager_saved = ìë²ì ëì 볎ë {0}ì ì ì¥íìµëë€ view_dashboardManager_success = ëì 볎ë륌 ì ì¥íìµëë€ view_dashboard_favorites_error1 = ìŠê²šì°Ÿêž° 늬ìì€ë¥Œ ë¡ëíëë° ì€íšíìµëë€. view_dashboardsManager_error1 = ìë¡ìŽ ëì 볎ë ì¶ê°ì ì€íšíìµëë€ -view_dashboardsManager_message_title_details = <h1>{0}ì ì€ì ê²ì íìí©ëë€</h1>\n<p>RHQ íë¡ì ížë ìŒë šì íµì¬ êž°ë¥ì ì¶ìííë íë¬ê·žìž êž°ë° ìì€í êŽëŠ¬ ì íêµ°ìì ì¬ë¬ ì í곌 íë«íŒì ìí íµí©ë ìì€í êŽëŠ¬ êž°ë¥ì ì ê³µí©ëë€. ìŽ íë¡ì ížë ê³ìžµíë 몚ëì ìíŽ ì€ê³ë ë°°í¬ë¥Œ ìí ì ì°í ìí€í ì²ë¥Œ ì ê³µí©ëë€.ê·žê²ì êž°ì ì 첎ì ëí ê°ì¬ ë° êž°ë¡ êŽëŠ¬ë¥Œ ì ê³µíë íµì¬ ì¬ì©ì ìží°íìŽì€ë¥Œ ëì í©ëë€. ìë²/ììŽì íž ìí€í ì²ë ì격êŽëŠ¬ ë° í¹ì ì íì ëí ì§ìì ì ê³µíë íë¬ê·žìžì ì ê³µí©ëë€.</p>\n <p>ìŽ êž°ë³ž ëì 볎ëì (ížì§ 몚ë) ë²íŒì íŽëŠíšìŒë¡ìš ížì§ í ì ììµëë€.</p> +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboards_confirm1 = ìì íìê² ìµëê¹ -view_dashboards_portlets_refresh_fail1 = ìë ìë¡ê³ 칚 í¬í늿ì ëí 늬íë ì ì ë°ìŽížì ì€íšíìµëë€ view_dashboards_portlets_refresh_fail2 = ìë ìë¡ê³ 칚 í¬í늿ì ëí 늬ë¡ë ë¹íì±íì ì€íšíìµëë€ view_dashboards_portlets_refresh_multiple_min = {0} ë¶ view_dashboards_portlets_refresh_none = ìë¡ê³ 칚 íì§ ìì @@ -1251,81 +1065,32 @@ view_dashboards_portlets_refresh_success2 = ìë ìë¡ê³ 칚 í¬í늿 ìë¡ view_dashboards_title = ëì 볎ë view_drift_button_detectNow = ì§êž ê²ì view_drift_button_pinToDef = ì ìë¡ í ê³ ì -view_drift_button_pinToDef_confirm = í ê³ ì ìŽ ì€ë ì·ì ì ì ì€ë ì· 0ìŒë¡ ì€ì í©ëë€. êž°í 몚ë ì€ë ì·ì ê·ž ì ììì ìì ë©ëë€. ê·ž ì ìë í ê³ ì ë ê²ìŒë¡ íìëìŽ ìŽíì ë늬íížë íì í ê³ ì ë ì€ë ì·ì ë³Žê³ ë©ëë€. ìŽ ì€ë ì·ì ê·ž ì ìì í ê³ ì íìê² ìµëê¹? -view_drift_button_pinToTemplate = í í늿ìŒë¡ í ê³ ì -view_drift_button_pinToTemplate_confirm = í ê³ ì í, ìŽ ì€ë ì·ì ê·ž í í늿ì ì¬ì©íì¬ ë§ë 몚ë ì ì륌 ìíŽ ìŽêž° ì€ë ì·ìŒë¡ ì€ì ë©ëë€. ë§ìœ êž°ì¡Ž í í늿ì í ê³ ì ëë€ë©Ž í í늿ì êž°ì¡Ž ì ìë ìë¡ìŽ ìŽêž° ì€ë ì·ì í ê³ ì ëê³ ê·ž êž°ì¡Žì ì€ë ì·ì ìì ë©ëë€. ì íí ê²ì í í늿íêž° ìíŽ ê³ìíìê² ìµëê¹? -view_drift_carousel_sizeFilterLabel = ì€ë ì·ì ìµë íì ì -view_drift_carousel_startFilterLabel = ì€ë ì· ìì view_drift_category_fileAdded = ì¶ê° íìŒ view_drift_category_fileChanged = ë³ê²œ íìŒ view_drift_category_fileNew = ìë¡ ë°ê²¬ë íìŒ view_drift_category_fileRemoved = ìì íìŒ view_drift_confirm_deleteAllDefs = 몚ë ë늬ííž ê²ì ì ì륌 ìì íìê² ìµëê¹? view_drift_confirm_deleteDefs = ì íë ë늬ííž ê²ì ì ì륌 ìì íìê² ìµëê¹? -view_drift_confirm_deleteTemplate = ê²œê³ ! ìŽ í í늿ì ìì íë©Ž ì°ê²°ë 몚ë ë늬ííž ì ì ëí ìì íê² ë©ëë€. ìì ì 몚ë ì€ë ì·ê³Œ íšê» ìŽë¬í 첚ë¶ë ì ìê° ì구ì ìŒë¡ ìì€í ìì ì ê±°ë©ëë€. ê³ìíìê² ìµëê¹? view_drift_failure_deleteDefs = ìŒë¶ ëë 몚ë ë늬ííž ê²ì ì ì ìì ì ì€íšíìµëë€. -view_drift_failure_deleteTemplates = ìŒë¶ ëë 몚ë ë늬ííž í í늿 ìì ì ì€íšíìµëë€ view_drift_failure_detectNow = ë늬ííž ê²ì ì€í ìì²ì 볎ëŽëë° ì€íšíìµëë€ view_drift_failure_load = ë늬ííž ìžì€íŽì€ì ì ê±°ì ì€íšíìµëë€ -view_drift_failure_pinToDef = ì ìì ì€ë ì·ì í ê³ ì ì ì€íšíìµëë€ -view_drift_success_defUpdated = ë늬ííž ê²ì ì ìê° ì ë°ìŽíž ëììµëë€. ìŽê²ì ê·ì ëë¡ ë€ì ê²ì ì€íì ìí¥ì ë¯žì¹ ê²ì ëë€. view_drift_success_delete = ë늬ííž ìžì€íŽì€ {0} ìì ì ì±ê³µíìµëë€ view_drift_success_deleteDefs = ë늬ííž ê²ì ì ì {0} ìì ì ì±ê³µíìµëë€ -view_drift_success_deleteTemplate = ë늬ííž í í늿 {0} ìì ì ì±ê³µíìµëë€ view_drift_success_detectNow = ë늬ííž ê²ì ì€í ìì²ì 볎ëŽëë° ì±ê³µíìµëë€ -view_drift_success_pinToDef = ë늬ííž ì ìì ì€ë ì· {0} í ê³ ì ì ì±ê³µíìµëë€. -view_drift_success_templateUpdated = ë늬ííž í íëŠ¿ìŽ ì ë°ìŽíž ëììµëë€. ë늬ííž í í늿 ì ë°ìŽíž ë° ë³ê²œ ì¬íì 첚ë¶ë ì ìì ì ì©. view_drift_table_attached = 첚ë¶ë? view_drift_table_baseDir = Ʞ볞 ëë í 늬 view_drift_table_driftHandlingMode = ë늬ííž ížë€ë§ view_drift_table_driftHandlingMode_normal = ë³Žíµ view_drift_table_driftHandlingMode_plannedChanges = ê³í ë³ê²œ -view_drift_table_hover_defNotPinned = ê·ž ë늬ííž ì ìë í ê³ ì ëì§ ììµëë€. íŽëŠíì¬ ìŽêž° ì€ë ì·ì 볎ììì€. -view_drift_table_hover_defPinned = ê·ž ë늬ííž ì ìë ìŽêž° ì€ë ì·ì í ê³ ì ëìŽ ììµëë€. íŽëŠíì¬ ìŽêž° ì€ë ì·ì 볎ììì€. -view_drift_table_hover_edit = íŽëŠíì¬ ë늬ííž ì ì ëë í í늿 ìì±ì 볎거ë ížì§íììì€. view_drift_table_hover_outOfCompliance_drift = ë늬ííž view_drift_table_hover_outOfCompliance_noBaseDir = Ʞ볞 ëë í 늬ë ì¡Žì¬íì§ ììµëë€. -view_drift_table_hover_templateNotPinned = ê·ž ë늬ííž í í늿ì ìŽë€ ì€ë ì·ë í ê³ ì ëì§ ììµëë€. -view_drift_table_hover_templatePinned = ê·ž ë늬ííž í í늿ì ì€ë ì·ì í ê³ ì ëìŽ ììµëë€. íŽëŠíì¬ í ê³ ì ë ì€ë ì·ì 볎ììì€. view_drift_table_newFile = ìë¡ìŽ íìŒ view_drift_table_oldFile = ìŽì íìŒ view_drift_table_pinned = í ê³ ì view_drift_table_resourceDef = 늬ìì€ ë늬ííž ê²ì ì ì view_drift_table_resourceHistory = 늬ìì€ ë늬ííž êž°ë¡ -view_drift_table_snapshot = ì€ë ì· -view_drift_table_snapshotTime = ì€ë ì· ìê° -view_drift_table_template = í í늿 -view_drift_table_title_initialSnapshot = ì ì [{0}]ì ëí ìŽêž° ì€ë ì· : í ê³ ì = [{1}] -view_drift_table_title_snapshot = ì ì [{1}]ì ëí ì€ë ì· [{0}] -view_drift_table_title_templateSnapshot = í í늿 [{0}]ì ëí í ê³ ì ë ì€ë ì· view_drift_wizard_addDef_failure = ë늬ííž ê²ì ì ì [{0}]ì ì ê· ì¶ê°ì ì€íšíìµëë€ -view_drift_wizard_addDef_infoStepHelp = ê° ë늬ííž ê²ì ì ìë ë늬ííž ëªšëí°ë§ì ìíí ì ìë íìŒì ì§í©ì ì€ëª í©ëë€. ì ìê° íì±ííê³ ë¹íì±í í ì ììµëë€. ê²ì ì€í ê°ê²©ì ì ìíê³ êž°ë³ž ëë í 늬 ë° ìµì íìŒ íí°ë¥Œ ì§ì í©ëë€. ê° ëŠ¬ìì€ ì íì ì ê³µ ë늬ííž ê²ì ë€ìì ížì§ í ì ììµëë€. ìì ì ìë¡ ì¬ì©í ì ìë íë ìŽìì 믞늬 ì ì ë í í늿 ìì ê²ì ëë€. -view_drift_wizard_addDef_infoStepName = ìë¡ìŽ ë늬ííž ê°ì§ ì ìì ëí í í늿ì ì íí©ëë€ -view_drift_wizard_addDef_success = ì ê· ë늬ííž ê²ì ì ì [{0}] ì¶ê°ì ì±ê³µíìµëë€. ììŽì ížë ì ë°ìŽíž ë©ëë€. -view_drift_wizard_addDef_templatePrompt = ë늬ííž ì ì í í늿 -view_drift_wizard_addDef_title = 늬ìì€ íì [{0}]륌 ìí ë늬ííž ê²ì ì ì륌 ì¶ê°íììì€. view_drift_wizard_addDef_windowTitle = ë늬ííž ê°ì§ ì ì ë§ë²ì¬ ì¶ê° -view_drift_wizard_addTemplate_failure = ì ê· ë늬ííž í í늿 [{0}]ì ì¶ê°ì ì€íšíìµëë€ -view_drift_wizard_addTemplate_infoStepHelp = ê° ë늬ííž í í늿ì êž°ì¡Ž í í늿ìì íìë©ëë€. ìŽ êž°ì¡Žì í í늿곌 ì ì¬, ëë íë¬ê·žìž ì ì í í늿ìê²ì ì í í늿ì 구ì¶íë ë¹ ë¥ž ë°©ë²ì ì ê³µí©ëë€. ë늬ííž ì ìì²ëŒ, í í늿 ë늬íížê° 몚ëí°ë§ì ìí í ììë íìŒì ì§í©ì ì€ëª í©ëë€. ìí©ì ë°ëŒ í í늿ìì íìë ì ì íìŒ ì€ì ì ë³ê²œíê±°ë, êž°í ì€ì ì ë³ê²œí ì ìë 겜ì°ë ììµëë€. í í늿 ìŽëŠì ìì ì í ëŽìì ê³ ì íŽìŒí©ëë€. -view_drift_wizard_addTemplate_infoStepName = ìì í í늿 ì í -view_drift_wizard_addTemplate_success = ì ê· ë늬ííž í í늿 [{0}] ì¶ê°ì ì±ê³µíìµëë€. -view_drift_wizard_addTemplate_title = íì [{0}]ì ë늬ííž ì ì í í늿ì ì¶ê°íììì€ -view_drift_wizard_addTemplate_windowTitle = ë늬ííž ì ì í í늿 ì¶ê° ë§ë²ì¬ -view_drift_wizard_pinTemplate_confirmNotPinned = í í늿ì ëí íì¬ì 믞ëì ê° ë늬ííž ì ìê° ìŒëš í ê³ ì ëë©Ž ê·ž í í늿ì ìŽêž° ì€ë ì·ìŽ í í늿ì í ê³ ì ë ì€ë ì·ìŒë¡ ì€ì ëëë¡ í©ëë€. ìŽ í í늿ì êž°ì¡Ž ì ìë ìë¡ìŽ ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ë©ëë€. ìŽ í í늿ì êž°ì¡Ž ì ìë ì ê· ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ëê³ ëªšë êž°ì¡Ž ì€ë ì·ì ìì ë©ëë€. ì€ë ì·ì í í늿 í ê³ ì ì ê³ìíìê² ìµëê¹? -view_drift_wizard_pinTemplate_confirmPinned = ê²œê³ !ìŽ í í늿ì ìŽë¯ž í ê³ ì ëìŽ ììµëë€. í íëŠ¿ìŽ ì ì€ë ì·ì ë€ì í ê³ ì í ì ììµëë€. í í늿ì ëí íì¬ì 믞ëì ê° ë늬ííž ì ìê° ìŒëš í ê³ ì ëë©Ž ê·ž í í늿ì ìŽêž° ì€ë ì·ìŽ í í늿ìŽìë í ê³ ì ë ì€ë ì·ìŒë¡ ì€ì ëëë¡í©ëë€. ìŽ í í늿ì êž°ì¡Ž ì ìë ì ê· ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ëê³ ëªšë êž°ì¡Ž ì€ë ì·ì ìì ë©ëë€. ìŽ ìë¡ìŽ ì€ë ì·ì í í늿ì í ê³ ì ì ê³ìíìê² ìµëê¹? -view_drift_wizard_pinTemplate_duplicate_name_error = í í늿 ìŽëŠì ê³ ì íŽìŒ í©ëë€ -view_drift_wizard_pinTemplate_failure = ë늬ííž í í늿 [{0}]ì ì€ë ì·ì í ê³ ì íëë° ì€íšíìµëë€ -view_drift_wizard_pinTemplate_infoStepExistingTemplate = íì¬ í í늿ì í ê³ ì -view_drift_wizard_pinTemplate_infoStepHelp = í ê³ ì ì íë í í늿ì ì ííììì€. í í늿ì ëí íì¬ì 믞ëì ê° ë늬ííž ì ìê° ìŒëš í ê³ ì ëë©Ž ê·ž í í늿ì ìŽêž° ì€ë ì·ìŽ í íëŠ¿ìŽ ìë í ê³ ì ë ì€ë ì·ìŒë¡ 구ì±ë ê²ì ê°ê² ëëë¡ í©ëë€. ê·žëŠ¬ê³ ê·ž ì ì ì첎ë í ê³ ì ë ê²ìŒë¡ íìë©ëë€. ìŽê²ì êž°ëëë íìŒ ìžížìì ë늬íížë¥Œ ê°ì§íë ë° ì¬ì©ë©ëë€. ìŽ í í늿ì ëí êž°ì¡Ž ì ìë ìë¡ìŽ ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ëê³ ëªšë êž°ì¡Ž ì€ë ì·ì ìì ëë ì ì ì ìíììì€. -view_drift_wizard_pinTemplate_infoStepName = í ê³ ì ëë í í늿 ì í -view_drift_wizard_pinTemplate_infoStepNewTemplate = ì í í늿ì í ê³ ì (ì€ë ì· ë늬ííž ì ììì ëì¶ ë ê²) -view_drift_wizard_pinTemplate_infoStepRadioHelp = ì€ë ì·ì ì ê· ëë êž°ì¡Žì ë늬ííž í í늿ì í ê³ ì í ì ììµëë€. ìŽ 'ì í í늿' ìµì ì ì¬ì©ìì ìì ìíŽ ì 뢰 ì ìì ì€ë ì·, 늬ìì€ ìì€ê³Œ íì ìì€ìì í í늿í í ì ìëë¡ í©ëë€. ê·ž ì í í늿ì ë€ì íŽë¹ íì ì 구ì±ìì ì ì©í ì ììµëë€. ê·ž ì í í늿ì ìŽêž°ìë ì€ë ì· ë늬ííž ì ì륌 ë³µì¬íì§ë§ ë€ì ëšê³ìì ížì§ í ì ììµëë€. ê·ž ìŽëŠì ë³ê²œíŽìŒ íê³ , ê·ž íì ì ë í¹í ë늬ííž í í늿 ìŽëŠìŽìŽìŒ í©ëë€. 'êž°ì¡Ž í í늿' ìµì ì ì¬ì©ìê° ì íí ì€ë ì·ì êž°ì¡Ž í í늿ì ëí í ê³ ì ëë ë€ì í ê³ ì ì í ì ìê² í©ëë€. ì¬ë°ë¥Žê² ì€ì íë €ë©Ž, êž°ì¡Ž í í늿ì ê°ì ëë í 늬륌 ì€ë ì· ì ìë¡ ëªšëí°ë§ í ì ììŽìŒ í©ëë€. ì í ììë ì ë¹í êž°ì¡Ž í íëŠ¿ë§ íìí©ë ë€. ë§ìœ ì ë¹íì§ ìì êž°ì¡Ž í íëŠ¿ìŽ ì¡Žì¬íëëŒë ìŽ ìµì ì ì íëì§ ììµëë€. -view_drift_wizard_pinTemplate_infoStepRadioTitle = í í늿 ì í -view_drift_wizard_pinTemplate_infoStepSelectBlocked = êž°ì¡Ž í í늿ìì ì€ë ì·ì ì ìì ê°ì ëë í 늬륌 ê°ìíë ê²ì ì¡Žì¬íì§ ììµëë€. ê³ìíë €ë©Ž 'ì í í늿' ìµì ì ì ííììì€. -view_drift_wizard_pinTemplate_infoStepSelectTitle = êž°ì¡Ž í í늿 -view_drift_wizard_pinTemplate_success = ë늬ííž í í늿 [{0}]ì í ê³ ì ì ì±ê³µíìµëë€. -view_drift_wizard_pinTemplate_title = íì [{2}] ë늬ííž í í늿ì ì ì [{1}]ì ì€ë ì· [{0}]ì í ê³ ì -view_drift_wizard_pinTemplate_windowTitle = í ê³ ì ë늬ííž ì ì í í늿 ë§ë²ì¬ view_dynagroup_children = ëì 귞룹ì ìì view_dynagroup_compatible = íží view_dynagroup_definitionAlreadyExists = ìŽë¯ž ìŽ ìŽëŠì 귞룹 ì ìê° ì¡Žì¬í©ëë€ @@ -1336,37 +1101,24 @@ view_dynagroup_deleteFailureSelection = ì íí 귞룹 ì ì ìì ì ì€íš view_dynagroup_deleteSuccessfulSelection = 귞룹 ì ì [{0}] ìì ì ì±ê³µíìµëë€ view_dynagroup_editing = [{0}]ì ížì§ì€ view_dynagroup_exprBuilder_addExpression = ì ì¶ê° -view_dynagroup_exprBuilder_comparisonType = ë¹êµ íì view_dynagroup_exprBuilder_comparisonType_contains = í¬íš view_dynagroup_exprBuilder_comparisonType_endsWith = ë¡ ëëë view_dynagroup_exprBuilder_comparisonType_equals = ëìŒ view_dynagroup_exprBuilder_comparisonType_startsWith = ë¡ ììíë -view_dynagroup_exprBuilder_comparisonType_tooltip = ë¹êµ íì view_dynagroup_exprBuilder_definingPlugin = ì ì íë¬ê·žìž view_dynagroup_exprBuilder_definingPlugin_tooltip = ê²ìì ìí íë¬ê·žìž view_dynagroup_exprBuilder_expression = ì -view_dynagroup_exprBuilder_expressionType = ì íì view_dynagroup_exprBuilder_expressionType_pluginConfig = íë¬ê·žìž ì€ì view_dynagroup_exprBuilder_expressionType_resource = 늬ìì€ -view_dynagroup_exprBuilder_expressionType_resourceCategory = 늬ìì€ ì¹Ží ê³ ëŠ¬ view_dynagroup_exprBuilder_expressionType_resourceConfig = 늬ìì€ ì€ì -view_dynagroup_exprBuilder_expressionType_resourceType = 늬ìì€ íì -view_dynagroup_exprBuilder_expressionType_tooltip = ìŽ ì ìì±ì ë€ììŒë¡ ì íë©ëë€ :<br/> <b>늬ìì€</b>: ìŽëŠê³Œ ë²ì ë± ëŠ¬ìì€ ìì±<br/> <b>늬ìì€ íì </b>: í¹ì íì ì 늬ìì€ ê²ì<br/> <b>늬ìì€ ì¹Ží ê³ ëŠ¬</b>: íë«íŒ, ìë², ìë¹ì€ ë± ì¹Ží ê³ ëŠ¬ë³ ëŠ¬ìì€ ê²ì<br/> <b>í¹ì±</b>: 몚ëí°ë í¹ì± ìíŽì ì íí ê° ëŠ¬ìì€<br/> <b>íë¬ê·žìž ì€ì </b>: ì€ì ììì íë¬ê·žìž 컎í¬ëíž êµ¬ì± ì€ì ì ìí ê²ì<br/> <b>늬ìì€ ì€ì </b>: êŽëŠ¬ ììì êµ¬ì± ì€ì ì ìí ê²ì view_dynagroup_exprBuilder_expressionType_trait = í¹ì± -view_dynagroup_exprBuilder_expression_tooltip = ìŽê²ì ë€ì ììì ì íì ìíŽ ííëë ì 첎 ìì ëë€. ìŽ í ì€ížë "ìì ì¶ê°" ë²íŒì íŽëŠíë©Ž 귞룹 ì ì ìì í ì€ížì ì¶ê°ë©ëë€. view_dynagroup_exprBuilder_groupBy = Group by -view_dynagroup_exprBuilder_groupBy_tooltip = GroupByë ìì€í ìŽ ì ë ¥ ìì ê°ì íŒë² ë¶ì í ì ìê² í©ëë€. ì륌 ë€ìŽ, íŽë¬ì€í° ìŽëŠì GroupByíì¬ ëªšë íŽë¬ì€í° 구ì±ìì ê·ž ìì í¬íšë ê°ì íŽë¬ì€í° 귞룹ì ë§ëëë€. view_dynagroup_exprBuilder_noPlugins = --íë¬ê·žìž ììŽ-- view_dynagroup_exprBuilder_noProperties = --ìì± ììŽ-- -view_dynagroup_exprBuilder_noResourceTypes = --늬ìì€ íì ìì-- view_dynagroup_exprBuilder_pluginLoadFailure = íë¬ê·žìž 목ë¡ì ê°ì žì¬ ì ììµëë€ view_dynagroup_exprBuilder_propLoadFailure = ìì±ì 늬ì€ížë¥Œ ê°ì žì¬ ì ììµëë€ view_dynagroup_exprBuilder_propertyName = ìì± ìŽëŠ -view_dynagroup_exprBuilder_propertyName_tooltip = 쿌늬ì ëí ìì± ìŽëŠ. ìŽê²ì 늬ìì€ íì 곌 ë§ì°¬ê°ì§ë¡ ì íì ì ë°ëŒ ì ìë©ëë€. -view_dynagroup_exprBuilder_resTypeLoadFailure = íë¬ê·žìž [{0}] 늬ìì€ íì 목ë¡ì ê°ì žì¬ ì ììµëë€ view_dynagroup_exprBuilder_resource = 늬ìì€ -view_dynagroup_exprBuilder_resourceType = 늬ìì€ íì -view_dynagroup_exprBuilder_resourceType_tooltip = 늬ìì€ì íì view_dynagroup_exprBuilder_resource_child = ìì view_dynagroup_exprBuilder_resource_grandparent = ì¡°ë¶ëªš view_dynagroup_exprBuilder_resource_greatGrandparent = ìŠì¡°ë¶ìŽëšžë @@ -1382,7 +1134,6 @@ view_dynagroup_exprBuilder_value_tooltip = 쿌늬ì ìì ìí 묞ììŽ ê° view_dynagroup_expression = ì view_dynagroup_expressionBuilderIconTooltip = ì ìì±êž°... view_dynagroup_expressionSet = ì ìžíž -view_dynagroup_lastCalculationTime = ìµì¢ ê³ì° ìê° view_dynagroup_loadDefinitionFailure = 귞룹 ì ì [{0}]ì ë¡ëíëë° ì€íšíìµëë€ view_dynagroup_loadDefinitionMissing = [{0}]ëŒë IDì 귞룹 ì ìë ì¡Žì¬íì§ ììµëë€ view_dynagroup_mixed = íŒí© @@ -1404,12 +1155,10 @@ view_dynagroup_template_customExpression = ì¬ì©ì ì ì ì... view_dynagroup_template_downedResources = 몚ë 늬ìì€ë¥Œ íì¬ ë€ìŽí©ëë€ view_dynagroup_template_jbossas4_clusters = JBossAS 4 - íŽë¬ì€í° view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - íŽë¬ì€í° EARs -view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - 몚ë ížì€í íë "ìì ì" ìì©íë¡ê·žëš view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - ìì íì§ ìì 몚ë ê² view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - ê³ ì ë²ì view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - íŽë¬ì€í° view_dynagroup_template_platforms = ìžë²€í 늬 íë«íŒ 늬ìì€ -view_dynagroup_template_uniqueResourceTypes = ìžë²€í 늬 ê³ ì 늬ìì€ íì view_groupConfigEdit_member = ë©€ë² view_groupConfigEdit_noListProps = 귞룹 ì€ì ì íì¬ ì§ìëì§ ìë ìì± ëª©ë¡ view_groupConfigEdit_saveReminder = ì€ì ìŽ ë³ê²œëììµëë€ - ìŽë¬í ë³ê²œ ì¬íì ì ì¥íë ê²ì ìì§ ë§ììì€. - ê·žë ì§ ììŒë©Ž ìì€ë©ëë€\n @@ -1427,17 +1176,12 @@ view_groupCreateWizard_createSuccessful_full = [{2}] íì 늬ìì€ë¥Œ í¬íš view_groupCreateWizard_membersStepName = ì íë ë©€ë² view_groupCreateWizard_title = 귞룹 ë§ë€êž° view_groupCreateWizard_windowTitle = 귞룹 ë§ë€êž° -view_groupInventoryMembers_button_updateMembership = 구ì±ì ì ë°ìŽíž... -view_groupInventoryMembers_title_updateMembership = 구ì±ì ì ë°ìŽíž view_group_common_emptyGroup = ë¹ ê·žë£¹ì íì íŒí©ìŒë¡ ê°ì£Œë©ëë€ view_group_detail_failLoad = ID [{0}]ìŽ ìë 귞룹ì ë¡ëì ì€íšíìµëë€ view_group_detail_failLoadComp = ID [{0}] ê·žë£¹ìŽ ì¡Žì¬íì§ ìê±°ë ììžì€í ì ììµëë€ -view_group_detail_failRecursiveChange = 귞룹 [{0}]ì ì¬ê· ì€ì ì ë°ìŽížì ì€íšíìµëë€ view_group_detail_recursiveChange = 귞룹 [{0}]ì ì¬ê· ì€ì ë³ê²œì ì±ê³µíìµëë€ view_group_inventory_activity_no_recent_metrics = ìŽ ê·žë£¹ì ìµê·Œ íµê³ë ììµëë€ view_group_meas_schedules_title = 귞룹 íµê³ ìì§ ìŒì -view_group_membership_failFetch = 늬ìì€ ê·žë£¹ì ë°ì ì ì€íšíìµëë€ -view_group_membership_saveFailure = 귞룹 [{0}]ì 구ì±ì ì ë°ìŽíž ì€íš view_group_membership_saveSuccessful = 귞룹 [{0}]ì íì ì격ì ê°±ì íìµëë€ view_group_operationScheduleDetails_failedToLoadMembers = 귞룹 ë©€ë² ëŠ¬ìì€ì ë¡ëì ì€íšíìµëë€. view_group_operationScheduleDetails_field_execute = ì€í @@ -1448,19 +1192,11 @@ view_group_operationScheduleDetails_value_sequential = ìëì ëìŽë ì view_group_pluginConfig_edit_currentGroupProperties = íì¬ ê·žë£¹ ìì± view_group_pluginConfig_edit_invalid = ë€ì ì°ê²° ì€ì ìì±ì ì못ë ê°ìŽ ì€ì ëìŽ ìêž° ë묞ì, ì°ê²° ì€ì ìŽ ì ì¥ëêž° ì ì ìì íŽìŒ í©ëë€ : [{0}] view_group_pluginConfig_edit_noperm = ìŽ ê·žë£¹ ì°ê²° ì€ì ì ížì§í ê¶íìŽ ììµëë€ -view_group_pluginConfig_edit_saveFailure = 귞룹 ìŽëŠ [{1}]곌 íží [{0}]ì ëí 귞룹 ì€ì ì ë°ìŽíž ììì ì€íšíìµëë€ -view_group_pluginConfig_edit_saveInitiated_concise = 귞룹 ì°ê²° ì€ì ì ë°ìŽížê° ììëììµëë€ -view_group_pluginConfig_edit_saveInitiated_full = 귞룹 ì°ê²° ì€ì ì ë°ìŽížë 귞룹 ìŽëŠ [{1}]곌 íží [{0}]ì ìíŽ ììëììµëë€ -view_group_pluginConfig_edit_saveTooltip = 몚ë 귞룹 구ì±ìì ì°ê²° ì€ì ì ì ë°ìŽíží©ëë€ view_group_pluginConfig_edit_valid = 몚ë ì°ê²° ì€ì ìì±ì ì¬ë°ë¥ž ê°ìŽ ì€ì ëìŽ ìêž° ë묞ì, ì°ê²° ì€ì ì ì ì¥í ì ììµëë€ view_group_pluginConfig_members_fetchFailure = 귞룹 [{0}]ì íìì ìí íë¬ê·žìž êµ¬ì± ë³ê²œì ê°ì žì€ëë° ì€íšíìµëë€ view_group_pluginConfig_members_fetchFailureConn = [{0}]ì ëí ë©€ë² ì°ê²° ì€ì ì ê±°ì ì€íšíìµëë€ -view_group_pluginConfig_members_fetchFailureConnInProgress = 귞룹 íë¬ê·žìž êµ¬ì± ì ë°ìŽížë íì¬ ì§í ì€ì ëë€. 귞룹 ì€ì ì ê²ìíêž° ì ì ì ë°ìŽížê° ìë£ ë ëê¹ì§ êž°ë€ëŠ¬ììì€. view_group_pluginConfig_members_statusDetails = ìí ì 볎 -view_group_pluginConfig_members_statusFailure = ìŽ êµ¬ì± ì ë°ìŽížë ìì ìë ìŽì ë¡ ì€íš -view_group_pluginConfig_members_statusInprogress = ìŽ êµ¬ì± ì ë°ìŽížë ìì§ ì§í ì€ì ëë€ view_group_pluginConfig_members_statusNochange = ìŽ êµ¬ì±ìë ë³íê° ììµëë€ -view_group_pluginConfig_members_statusSuccess = ìŽ êµ¬ì± ì ë°ìŽížê° ì±ê³µíìµëë€ view_group_pluginConfig_members_title = 귞룹 ì°ê²° ì€ì ë©€ë² êž°ë¡ view_group_pluginConfig_table_clickStatusIcon = ììží ëŽì©ì ìí ììŽìœì íŽëŠíììì€ view_group_pluginConfig_table_deleteFailure = 귞룹 íë¬ê·žìž ì€ì êž°ë¡ì ìì íì§ ëª»íìµëë€ @@ -1468,10 +1204,7 @@ view_group_pluginConfig_table_deleteSuccessful = [{0}] êž°ë¡ í목ì ìì view_group_pluginConfig_table_failFetch = 귞룹 êµ¬ì± ëŽìì ì·šëì ì€íšíìµëë€ view_group_pluginConfig_table_msg1 = ê°ë³ 늬ìì€ì ìíë íì êž°ë¡ì ì°Ÿì 볌 ì ììµëë€ view_group_pluginConfig_table_statusDetails = ìí ìžë¶ ì 볎 -view_group_pluginConfig_table_statusFailure = ìŽ ê·žë£¹ êµ¬ì± ì ë°ìŽížê° ì€íšíìµëë€ -view_group_pluginConfig_table_statusInprogress = ìŽ ê·žë£¹ 구ì±ì ì ë°ìŽížë ìì§ ì§í ì€ì ëë€ view_group_pluginConfig_table_statusNochange = ìŽ ê·žë£¹ 구ì±ì ëí ë³ê²œì ììµëë€ -view_group_pluginConfig_table_statusSuccess = ìŽ ê·žë£¹ êµ¬ì± ì ë°ìŽížê° ì±ê³µíìµëë€ view_group_pluginConfig_table_title = 귞룹 ì°ê²° ì€ì ëŽì view_group_pluginConfig_table_viewMemberHistory = íì êž°ë¡ë³Žêž° view_group_pluginConfig_table_viewSettings = ì€ì 볎Ʞ @@ -1480,19 +1213,11 @@ view_group_pluginConfig_view_noperm = ë¹ì ì ì°ê²° ì€ì ì 볌 ì ìë view_group_resConfig_edit_invalid = ë€ì êµ¬ì± ìì±ì ì못ë ê°ì í¬íšíë¯ë¡ ê·ž 구ì±ì ì ì¥íìêž° ì ì ìì ëìŽìŒ í©ëë€: [{0}] view_group_resConfig_edit_loadFail = [{0}]ì ëí íì 늬ìì€ êµ¬ì±ì 꺌ëŽëë° ì€íšíìµëë€ view_group_resConfig_edit_noperm = ìŽ ê·žë£¹ 구ì±ì ížì§í ì ìë ê¶íìŽ ììµëë€ -view_group_resConfig_edit_saveFailure = [{1}]ëŒë 귞룹 ìŽëŠê³Œ íží [{0}]ì ìí 귞룹 êµ¬ì± ì ë°ìŽíž ììì ì€íšíìµëë€ -view_group_resConfig_edit_saveInitiated_concise = 귞룹 êµ¬ì± ì ë°ìŽížë ìŽêž°í ëììµëë€ -view_group_resConfig_edit_saveInitiated_full = [{1}]ëŒë 귞룹 ìŽëŠê³Œ íží [{0}]ì ìí êµ¬ì± ì ë°ìŽížê° ììëììµëë€ -view_group_resConfig_edit_saveTooltip = 몚ë 귞룹 ë©€ë² êµ¬ì±ì ì ë°ìŽíží©ëë€ view_group_resConfig_edit_valid = 몚ë êµ¬ì± ìì±ì ì¬ë°ë¥ž ê°ìŽë¯ë¡, ê·ž ì€ì ì ì ì¥ê°ë¥í©ëë€ view_group_resConfig_members_fetchFailure = 귞룹 [{0}]ì íìì ìí 늬ìì€ êµ¬ì± ë³ê²œì ê°ì žì€ëë° ì€íšíìµëë€ view_group_resConfig_members_fetchFailureConfig = [{0}]ì ëí íì 늬ìì€ êµ¬ì± ì€ì ì ì ê±°ì ì€íšíìµëë€ -view_group_resConfig_members_fetchFailureConfigInProgress = 귞룹 늬ìì€ êµ¬ì±ì ì ë°ìŽížê° ì§íì€ì ëë€. 귞룹 ì€ì ì ê²ìíêž° ì ì ì ë°ìŽížê° ìë£ë ëê¹ì§ êž°ë€ë €ì£Œììì€. view_group_resConfig_members_statusDetails = ìí ìžë¶ ì 볎 -view_group_resConfig_members_statusFailure = ìŽ ì€ì ì ë°ìŽížë ì ì ìë ìŽì ë¡ ì€íšíìµëë€ -view_group_resConfig_members_statusInprogress = ìŽ ì€ì ì ë°ìŽížë ìì§ ì§íì€ì ëë€ view_group_resConfig_members_statusNochange = ìŽ ì€ì ì ë³ê²œëì§ ìììµëë€ -view_group_resConfig_members_statusSuccess = ìŽ ì€ì ì ë°ìŽížê° ì±ê³µíìµëë€ view_group_resConfig_members_title = 귞룹 늬ìì€ ì€ì ì ë©€ë² êž°ë¡ view_group_resConfig_table_clickStatusIcon = ììží ëŽì©ì ìí ììŽìœì íŽëŠíììì€ view_group_resConfig_table_deleteFailure = 귞룹 늬ìì€ êµ¬ì± êž°ë¡ ìì ì ì€íšíìµëë€ @@ -1500,23 +1225,16 @@ view_group_resConfig_table_deleteSuccessful = [{0}] êž°ë¡ì ìì íìµëë€ view_group_resConfig_table_failFetch = 귞룹 늬ìì€ êµ¬ì± ëŽìì ê°ì žì€ëë° ì€íšíìµëë€ view_group_resConfig_table_msg1 = ê°ë³ 늬ìì€ì ìíë íì êž°ë¡ì ì°Ÿì 볌 ì ììµëë€ view_group_resConfig_table_statusDetails = ìí ìžë¶ ì 볎 -view_group_resConfig_table_statusFailure = ìŽ ê·žë£¹ ì€ì ì ë°ìŽížê° ì€íšíìµëë€ -view_group_resConfig_table_statusInprogress = ìŽ ê·žë£¹ ì€ì ì ë°ìŽížë ìì§ ì§íì€ì ëë€ view_group_resConfig_table_statusNochange = ìŽ ê·žë£¹ ì€ì ì ëí ë³ê²œì ììµëë€ -view_group_resConfig_table_statusSuccess = ìŽ ê·žë£¹ ì€ì ì ë°ìŽížê° ì±ê³µíìµëë€ view_group_resConfig_table_title = 귞룹 늬ìì€ ì€ì ëŽì view_group_resConfig_table_viewMemberHistory = íì êž°ë¡ ë³Žêž° view_group_resConfig_table_viewSettings = ê²ì ì€ì view_group_resConfig_view_groupProperties = 귞룹 ìì± view_group_resConfig_view_noperm = 늬ìì€ êµ¬ì± ì€ì ì 볌 ì ìë ê¶íìŽ ììµëë€ view_group_summary_compatible = ížíì± -view_group_summary_descUpdateFailure = ID [{0}]ì ê°ì§ 늬ìì€ ê·žë£¹ì ì€ëª ì ë³ê²œí ì ììµëë€ -view_group_summary_descUpdateSuccessful = ìŽ ëŠ¬ìì€ ê·žë£¹ì ì€ëª ì ë³ê²œíìµëë€ view_group_summary_dynamic = ëì -view_group_summary_dynamicNote = ëì 귞룹 ìŽëŠê³Œ ì€ëª ì êŽëŠ¬ë¥Œ ìíŽì ížì§í ì ììµëë€ view_group_summary_groupDefinition = 귞룹 ì ì view_group_summary_memberCount = ë©€ë² ì -view_group_summary_memberType = ë©€ë² íì view_group_summary_mixed = íŒí© view_group_summary_nameUpdateFailure = ID [{0}]ì ê°ì§ 늬ìì€ ê·žë£¹ì ìŽëŠ ë³ê²œì ì€íšíìµëë€ - [{1}]ìì [{2}]륌 ë³ê²œí ì ììµëë€ view_group_summary_nameUpdateSuccessful = ID [{0}]ì ê°ì§ 늬ìì€ ê·žë£¹ì [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€ @@ -1568,7 +1286,6 @@ view_inventory_resources_members = ë©€ë² ëŠ¬ìì€ view_inventory_resources_uninventoryConfirm = ì íí 늬ìì€ë¥Œ ìžë²€í 늬ìì ì ê±°íìê² ìµëê¹? ë§ìœ ì íí 늬ìì€ê° ì¡Žì¬íê³ ìë€ë©Ž, ê·ž ììŽì ížì ë€ì ëì€ì»€ë²ëŠ¬ ì€ìº ì¬ìŽì ê·žê²ì ì¬ë°ê²¬ë©ëë€. view_inventory_resources_uninventoryFailed = ì íë 늬ìì€ ìžë²€í 늬 ì ê±°ì ì€íšíìµëë€ view_inventory_resources_uninventorySuccessful = ì íë 늬ìì€ì ìžë²€í 늬 ì ê±°ì ì±ê³µíìµëë€ -view_inventory_sectionHelp = ìŽ ì¹ì ìì ìë¡ ë°ê²¬ë 늬ìì€ ìžë²€í 늬ì ë±ë¡ë 늬ìì€ ê·žë£¹ì ëììŒë¡ í íì ë° êŽëŠ¬ê° ìŽë£šìŽì§ëë€. view_inventory_servers = ìë² view_inventory_serversTop = ìë² - ìµìì ê°ì žì€êž° view_inventory_services = ìë¹ì€ @@ -1581,18 +1298,14 @@ view_inventory_summary_agent_last_title = ë§ì§ë§ìŒë¡ ë°ì ê°ì©ì± 늬 view_inventory_summary_agent_status_title = ììŽì íž íµì ìí view_inventory_summary_agent_title = ìŽ ëŠ¬ìì€ë¥Œ êŽëŠ¬íë ììŽì íž view_inventory_unavailableServers = ì¬ì©í ì ìë ìë² -view_leftNav_unknownPage = ì¹ì [{1}] ìì ìë íìŽì§ ìŽëŠ [{0}] - URLìŽ ì못ëììµëë€ view_login_invalidEmail = ì못ë ìŽë©ìŒ 죌ì view_login_login = ë¡ê·žìž view_login_logout = ë¡ê·žìì view_login_noBackend = ë°±ìë ë°ìŽí°ìì€ë¥Œ ì¬ì©í ì ììµëë€. -view_login_noLdap = 죌ì: LDAP ì 볎ì 몚ë ì ê±°ë ì±ê³µíì§ ëª»íìµëë€. ìëìŒë¡ ì ë ¥ìŽ ì구ë©ëë€. -view_login_noUser = ì ë ¥ë ì¬ì©ì ìŽëŠìŽë ìížê° êž°ë¡ë ê²ê³Œ ìŒì¹íì§ ììµëë€. view_login_prompt = ë¡ê·žìžíììì€ view_login_registerLater = (ì·šì - ë±ë¡ì ëì€ì ìë£íŽ 죌ììì€.) view_login_registerLdapSuccess = ìë¡ìŽ LDAP ì¬ì©ì ë±ë¡ì ì±ê³µíìµëë€. view_login_registerUser = ì¬ì©ì ë±ë¡ -view_login_welcomeMsg = {0}ì ì€ì ê²ì íìí©ëë€! <br/><br/> ë±ë¡ì ìì±ìí€êž° ìíŽ ë€ì íë륌 ì ë ¥/ìì íììì€.<br/> "OK"륌 íŽëŠí í ë¡ê·žìží©ëë€.<br/><br/> view_measureRange_last = ìê° ë²ì - ìŽì view_measureRange_simple = ëšì... view_measureRange_start = ìê° ë²ì - ìì @@ -1618,33 +1331,15 @@ view_metric_traits = í¹ì± view_metric_viewTraitHistory = í¹ì± [{0}]ì ëí ê° êž°ë¡ view_operationHistoryDetails_dateCompleted = ìë£ìŒ view_operationHistoryDetails_dateSubmitted = ë°íìŒ -view_operationHistoryDetails_error_fetchFailure = ì€íŒë ìŽì êž°ë¡ ë¡ë ì€íš -view_operationHistoryDetails_noResults = ìŽ ìì ì ê°ì ë°ííì§ ììµëë€. view_operationHistoryDetails_operation = ìŽì view_operationHistoryDetails_parameters = 맀ê°ë³ì view_operationHistoryDetails_requestor = ìì²ì view_operationHistoryDetails_results = 결곌 view_operationHistoryDetails_status = ìí view_operationHistoryList_button_forceDelete = ê°ì ìì -view_operationHistoryList_button_runOperation = ì€íŒë ìŽì ì ì€í -view_operationHistoryList_cancelConfirm = ë¹ì ìŽ ì íí ìì ì ì·šìíìê² ìµëê¹? ì°žê³ : íì¬ "ì§íì€"ìŽ ì íë ìì ì ì·šì륌 ìëí©ëë€. -view_operationHistoryList_cancelFailure = [{0}]ì ëŽì IDì ìì ì ì·šì ìì²ìŽ ì€íšíìµëë€. -view_operationHistoryList_cancelSubmitted = ì·šìì ëí ìì² [{0}]ì "ì§íì€" ìì ì ì ì¶ëììµëë€. -view_operationHistoryList_cancelSuccess = [{0}]ì ëŽì IDì ìì ì ì·šì ìì²ìŽ ìŽìì ì ì¶ëììµëë€. -view_operationHistoryList_deleteFailure = ìì ëŽì [{0}]ì ìì ì ì€íšíìµëë€. -view_operationHistoryList_deletePartialSuccess = ìì ëŽì í목 [{0}]ìŽ ìì ëš, ê·žë¬ë ë€ìì ID: {1}ì í목ì ìì ì ì€íšíìµëë€. -view_operationHistoryList_deleteSuccess = ìì ëŽì ììŽí [{0}]ìŽ ìì ëš. view_operationHistoryList_notYetStarted = ìì§ ììíì§ ìììµëë€ -view_operationHistoryList_title = ìì ëŽì -view_operationScheduleDetails_enterParametersBelow = ë€ì ë§€ê° ë³ì륌 ì ë ¥íììì€... -view_operationScheduleDetails_fieldDefault_description = ì€ëª ì ë³Žë €ë©Ž ìì ì ì ííììì€. -view_operationScheduleDetails_fieldDefault_parameters = ë§€ê° ë³ì륌 볎Ʞ ìíŽ ìì ì ì ííììì€. -view_operationScheduleDetails_fieldHelp_description = ìŽ ììœë ìì ì ëí 몚ë ì€ëª (ì. ìŒê° 볎ì륌 ìí ìŽí늬ìŒìŽì ìë² ì¬ìì) -view_operationScheduleDetails_fieldHelp_timeout = ìê° ê°ê²© - ë§ìœ ì§ì ëìŽ ê·ž ê°ê²©ìŽ ììœë ìì ì€íìŽ ìë£ëêž° ì ì 겜곌íë€ë©Ž {0} ìë²ë ìŽìì ì ííê³ ê·žê²ì ì€íšíë ê²ì ê²í í©ëë€. 죌ì : ìŽë¯ž ììë 겜ì°ë ì€ì§ Ʞ볞 êŽëŠ¬ ìì ìŽìì ìŒë°ì ìŒë¡ ë¶ê°ë¥í©ëë€. -view_operationScheduleDetails_field_description = ì€ëª view_operationScheduleDetails_field_parameters = 맀ê°ë³ì view_operationScheduleDetails_field_timeout = íì ìì -view_operationScheduleDetails_noParameters = ìŽ ìì ì ë§€ê° ë³ì륌 ì¬ì©íì§ ììµëë€. view_operationScheduleDetails_operationSchedule = ìŽì ê³í view_portlet_autodiscovery_setting_platforms = ë°ê²¬ë íë«íŒ view_portlet_configure_definitionDesc = í¬í늿ì ëí êµ¬ì± ì€ì . @@ -1660,12 +1355,9 @@ view_portlet_defaultName_group_config_updates = 귞룹: êµ¬ì± ê°±ì view_portlet_defaultName_group_events = 귞룹: ìŽë²€íž 칎ìŽíž view_portlet_defaultName_group_metrics = 귞룹: íµê³ view_portlet_defaultName_group_oobs = 귞룹: OOB 조걎 -view_portlet_defaultName_group_operations = 귞룹: ì€íŒë ìŽì view_portlet_defaultName_group_pkg_hisory = 귞룹: íší€ì§ êž°ë¡ view_portlet_defaultName_inventorySummary = ìžë²€í 늬 ììœ -view_portlet_defaultName_mashup = 맀ìì view_portlet_defaultName_message = ë©ìì§ -view_portlet_defaultName_operations = ìµê·Œ ìì view_portlet_defaultName_platformSummary = íë«íŒ íì© view_portlet_defaultName_problemResources = ê²œê³ ëë ì¬ì©í ì ìë 늬ìì€ view_portlet_defaultName_recentAlerts = ìµê·Œ ê²œê³ @@ -1677,12 +1369,9 @@ view_portlet_defaultName_resource_config_updates = 늬ìì€: ì€ì ê°±ì view_portlet_defaultName_resource_events = 늬ìì€: ìŽë²€íž 칎ìŽíž view_portlet_defaultName_resource_metrics = 늬ìì€: ìž¡ì view_portlet_defaultName_resource_oobs = 늬ìì€: OOB íµê³ -view_portlet_defaultName_resource_operations = 늬ìì€: ì€íŒë ìŽì view_portlet_defaultName_resource_pkg_hisory = 늬ìì€: íší€ì§ êž°ë¡ -view_portlet_factory_invalidPortlet = ìŽê²ì ì íšíì§ ìì ì€ëë í¬í늿ì ëë€. ìì íììì€. view_portlet_graph_configure_metricDefinition_graph = ê·žëí륌 귞늬Ʞ ìí íµê³ ì ì ID view_portlet_graph_configure_resource_graph = ê·žëí 늬ìì€ -view_portlet_help_autodiscovery = ìŽ í¬í늿ì ìë¡ ë°ê²¬ë 늬ìì€ë¥Œ ê°ì ž ì€ê±°ë í¹ì 묎ì í ì ììµëë€. ê°ì žìš 늬ìì€ ëªšëí°ë§ ë° êŽëŠ¬ë¥Œ ìí ìžë²€í 늬ì ì¶ê° í ì ììµëë€. 묎ìë ììì ê°ì žì€ì§ ìê³ , ëª ìì ìŒë¡ 묎ì륌 íŽì íì§ ìì í ë·°ìì ìšê²šì§ëë€. view_portlet_help_bundle_deps = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì êž°ë°ìŒë¡ í êŽë š ë²ë€ ë°°í¬ë¥Œ íìí©ëë€. view_portlet_help_config_updates = ìŽ í¬í늿ì êµ¬ì± ì€ì 곌 ìŒì¹íë ìµê·Œì êµ¬ì± ë³ê²œì íìí©ëë€. view_portlet_help_eventcounts = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì ìŒì¹íë ìŽë²€íž ì륌 íìí©ëë€. @@ -1694,30 +1383,20 @@ view_portlet_help_message = ìŽ í¬í늿ì ì ì HTML ë©ìì§ë¥Œ íìí© view_portlet_help_metrics = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì êž°ë°ìŒë¡ êŽë š íµê³ ë°ìŽí°ë¥Œ ê·žëí륌 귞늜ëë€. view_portlet_help_none = ìŽ í¬í늿ì ëí ëìë§ì ì¬ì©í ì ììµëë€. view_portlet_help_oobs = ìŽ í¬íëŠ¿ìŽ ë²ì륌 ë²ìŽëì íµê³ 조걎ì íìí©ëë€. -view_portlet_help_operations = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìžë²€í 늬륌 ìíŽ ê°ì¥ ìµê·Œì ì€íë ìì ì íìí©ëë€. -view_portlet_help_operations_criteria = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì ìŒì¹íë ìì ì íìí©ëë€. view_portlet_help_pkg_history = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì êž°ë°ìŒë¡ êŽë š íší€ì§ ëŽì©ì íìí©ëë€. view_portlet_help_platformSummary = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ì¡ìžì€ ìë íë«íŒ 늬ìì€ì ëí (íì¬ CPUì ë©ëªšëŠ¬ ì¬ì© ë±) ì¬ì© ë°ìŽí°ë¥Œ íìí©ëë€. view_portlet_help_problemResources = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ë³ê²œ ëë ì¬ì©í ì ìë 늬ìì€ë¥Œ íìí©ëë€. view_portlet_help_recentAlerts = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ë³Œ ì ìë ìžë²€í 늬ìì ë°ìí ê²œê³ ë¥Œ íìí©ëë€. view_portlet_help_recentDrifts = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ë³Œ ì ìë ìžë²€í 늬ìì ìµê·Œ íìŒ ë늬íížë¥Œ íìí©ëë€. -view_portlet_help_recentlyAdded = ìŽ í¬í늿ì ìžë²€í 늬ì ìµê·Œ ë°ì ë 늬ìì€ë¥Œ íìí©ëë€. -view_portlet_help_scheduledOperations = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìžë²€í 늬륌 ìíŽ ë€ì ììœë ìì ì íìí©ëë€. view_portlet_help_tagCloud = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìžë²€í 늬ì ëí êŽë š íê·ž ì륌 íìí©ëë€. view_portlet_inventory_error1 = ìžë²€í 늬 ììœ ì ê±°ì ì€íšíìµëë€ view_portlet_inventory_tooltip_collapse = íŽëŠíë©Ž ìŽ ëŠ¬ìì€ ì 볎륌 ìšê¹ëë€. view_portlet_inventory_tooltip_expand = íŽëŠíë©Ž ìŽ ëŠ¬ìì€ ì 볎륌 íìí©ëë€. view_portlet_message_title = íì ë©ìì§ -view_portlet_operations_config_completed = ìë£í ìì -view_portlet_operations_config_completed_enable = ëì 볎ë륌 ìíŽ ê·žë£¹íë ìë£ë ìì 결곌륌 ì¬ì©í ì§ ì¬ë¶. -view_portlet_operations_config_completed_maximum = ìë£ë ìì ì ìµë íì ì. -view_portlet_operations_config_scheduled_enable = ëì 볎ë륌 ìíŽ ê·žë£¹íë ììœë ìì ì ì¬ì©í ì§ ì¬ë¶. -view_portlet_operations_config_scheduled_maximum = ììœë ìì ì ìµë íì ì. view_portlet_operations_config_show_last = ë§ì§ë§ 볎Ʞ view_portlet_operations_config_show_next = ë€ì 볎Ʞ view_portlet_operations_disabled = (결곌ë íì¬ ë¹íì±íëìŽ ììµëë€. 결곌륌 ì¬ì©íë €ë©Ž ì€ì ì ë³ê²œíììì€. view_portlet_platform_platform_error_1 = íë«íŒ íµê³ì ë¡ëì ì€íšíìµëë€ -view_portlet_platform_type_error_1 = íì ë°ìŽí°ë¥Œ ë¡ëí ì ììµëë€ view_portlet_problemResources_config_display_maximum = 묞ì 늬ìì€ì ìµë íì ì. view_portlet_problemResources_config_display_range = ì¬êž°ìì ëªìê° ê±°ì¬ë¬ 묞ì 늬ìì€ë¥Œ íì. view_portlet_problemResources_config_display_range2 = {0}ìì {1}ê¹ì§ @@ -1730,7 +1409,6 @@ view_portlet_recentlyAdded_error1 = ìµê·Œ ì¶ê°ë 늬ìì€ë¥Œ ë¡ëíë view_portlet_recentlyAdded_setting_addedPlatforms = ìµê·Œ ì¶ê°ë íë«íŒ view_portlet_results_empty = ì§ì ë íëš ì¡°ê±Žì 결곌륌 ì°Ÿì ì ììµëë€. view_remoteAgentInstall_agentStatus = ììŽì íž ìí -view_remoteAgentInstall_agentStatusDefault = -ìí ì ë°ìŽíž ë²íŒì íŽëŠœíììì€- view_remoteAgentInstall_buttonFindAgent = ììŽì íž ì°Ÿêž° view_remoteAgentInstall_connInfo = ì°ê²° ì 볎 view_remoteAgentInstall_error_1 = ììŽì ížì ì€ì¹ 겜ë¡ë¥Œ ì°Ÿë ëì ì€ë¥ê° ë°ìíìµëë€ @@ -1744,9 +1422,7 @@ view_remoteAgentInstall_installInfo = ììŽì íž ì€ì¹ ì 볎 view_remoteAgentInstall_installPath = ììŽì íž ì€ì¹ ê²œë¡ view_remoteAgentInstall_owner = ìì ì view_remoteAgentInstall_promptHost = ììŽì ížê° ì€ì¹ëìŽ ìê±°ë ììŒë¡ ì€ì¹ëë ížì€íž -view_remoteAgentInstall_promptInstallPath = ììŽì ížê° ì€ì¹ëìŽ ìê±°ë ììŒë¡ ì€ì¹ëë ì¥ì. ìŽëì ì€ì¹ëëì§ íì ìŽ ìë€ë©Ž, ë¶ëªš ëë í 늬륌 ì ë ¥íì¬ 'ììŽì íž ì°Ÿêž°'ë²íŒì íŽëŠíì¬ ê·ž ëë í 늬 ìŽí륌 ê²ìíììì€. ë¹ ê²œë¡ë¥Œ ì ë ¥í 겜ì°, ììŽì ížë¥Œ ì€ì¹íë ížì€ížì ê³µíµ ìì¹ê° ê²ìë©ëë€. view_remoteAgentInstall_promptPassword = SSH륌 íµíŽ ížì€ížì ì¬ì©ì륌 ìžìŠíëë° ì¬ì©ëë ìžìŠ -view_remoteAgentInstall_promptPort = SSH ìë²ê° ìì íë í¬íž. ì§ì ëì§ ììŒë©Ž, Ʞ볞ê°ì 22ì ëë€ view_remoteAgentInstall_promptUser = SSH륌 íµíŽ ížì€ížë¡ ì ë¬ëë ìžìŠì ê°ì§ ì¬ì©ìì ìŽëŠ view_remoteAgentInstall_result = 결곌 view_remoteAgentInstall_resultCode = 결곌 ìœë @@ -1756,19 +1432,13 @@ view_remoteAgentInstall_step = ëšê³ view_remoteAgentInstall_stopAgent = ììŽì íž ì€ì§ view_remoteAgentInstall_stopAgentResults = ììŽì íž ì€ì§ 결곌: [{0}] view_remoteAgentInstall_success = ììŽì íž ì€ì¹ ìë£ -view_remoteAgentInstall_updateStatus = ìí ì ë°ìŽíž -view_reportsTop_description = ìŽ ì¹ì ì êžë¡ë² 늬í¬ížì ëí ììžì€ë¥Œ ì ê³µí©ëë€. view_reportsTop_title = ë³Žê³ ì view_reports_alertDefinitions = ê²œê³ ì ì view_reports_alertDefinitions_parentHover = íŽëŠíë©Ž ë¶ëªšì ê²œê³ ì ìì ê°ëë€ -view_reports_alertDefinitions_resTypeLoadError = í í늿 늬ìì€ íì ì ê°ì žì¬ ì ììµëë€ - ì늌 í í늿ì ìŽë í ì ììµëë€. view_reports_driftCompliance = ë늬ííž ì€ì view_reports_inventorySummary_failFetch = ìžë²€í 늬 ììœì ê°ì žì€ëë° ì€íšíìµëë€ view_reports_platforms = íë«íŒ íì© -view_reports_subsystems = ìëž ìì€í view_resourceResourceGroupList_error_fetchFailure = 늬ìì€ ê·žë£¹ì ì·šëì ì€íšíìµëë€. -view_resourceResourceGroupList_error_updateFailure = í ë¹ë 늬ìì€ ê·žë£¹ì ì ë°ìŽížì ì€íšíìµëë€. -view_resourceResourceGroupList_message_updateSuccess = [{0}]ì ìíŽ ì ë°ìŽížë 귞룹 구ì±ì. view_resource_inventory_activity_changed_by = ìì í ì¬ë view_resource_inventory_activity_criteria_no_recent_events = íì íëš ì¡°ê±Žì ë°ëŒ ìŽë²€ížê° ììµëë€. view_resource_inventory_activity_no_recent_alerts = ìµê·Œ ê²œê³ ë ììµëë€ @@ -1777,7 +1447,6 @@ view_resource_inventory_activity_no_recent_config_history = êµ¬ì± ë³ê²œ êž°ë¡ view_resource_inventory_activity_no_recent_events = ìµê·Œ 24ìê° ìŽëŽ ìŽë²€ížê° ììµëë€ view_resource_inventory_activity_no_recent_metrics = ìŽ ëŠ¬ìì€ë ìµê·Œ íµê³ê° ììµëë€ view_resource_inventory_activity_no_recent_oob = ë²ì ìžì 조걎ì ì°Ÿì ì ììµëë€ -view_resource_inventory_activity_no_recent_operations = ìµê·Œ ìì êž°ë¡ì ììµëë€ view_resource_inventory_activity_no_recent_pkg_history = ìµê·Œ íší€ì§ êž°ë¡ì ììµëë€ view_resource_inventory_childhistory_createdChild = ìì±ìíš ì view_resource_inventory_childhistory_deletedChild = ìì ë ì @@ -1786,13 +1455,10 @@ view_resource_inventory_childhistory_status_invalidArtifact = ì못ë ìì± view_resource_inventory_childhistory_status_invalidConfig = ì못ë êµ¬ì± view_resource_monitor_availability_availability = ê°ì©ì± view_resource_monitor_availability_availability_tooltip = ìê°ì ë¹ìšì 늬ìì€ UPê° ëŽë € ìê°ì ë¹íŽ ì¬ì© ì€ì§ëììµëë€ -view_resource_monitor_availability_currentAsOf = ìŽ ë°ìŽí°ë {0} íì¬ì ê²ì ëë€ view_resource_monitor_availability_currentStatus = íì¬ ìí -view_resource_monitor_availability_currentStatus_value = ìŽ ììì {1} {0}ì ìíì ëë€ view_resource_monitor_availability_disabled = ë¹íì±í view_resource_monitor_availability_disabledTime = ë¹íì±í ë ìê° view_resource_monitor_availability_disabledTime_tooltip = 늬ìì€ê° DISABLED ìíë¡ ììë ëì ìê° -view_resource_monitor_availability_disabled_tooltip = 늬ìì€ê° DISABLEDë¡ íë ìê°ì ìì곌 ì¢ ë£ ìê°ì ë¹êµí ë°±ë¶ìš view_resource_monitor_availability_down = ì ì§ view_resource_monitor_availability_down_tooltip = 늬ìì€ê° DOWNíê³ ìê°ì ììíê±°ë ì€ì§ìí¬ ìê°ê³Œ ë¹êµí ë°±ë¶ìš view_resource_monitor_availability_downtime = ì ì§ìê° @@ -1835,7 +1501,6 @@ view_resource_title_component_errors_tooltip = êŽëŠ¬ êµ¬ì± ìì ì€ë¥ í view_resource_title_tagUpdateFailed = 늬ìì€ íê·ž ê°±ì ì ì€íšíìµëë€ view_searchBar_defaultPattern = íšíŽ ìŽëŠì ë¶ì¬ì£Œìžì view_searchBar_instructional_failSuggest = ì ìì ìì±íì§ ëª»íìµëë€. ë°ìí ì ìë ì€ë¥ì ëí ìë² ë¡ê·žë¥Œ ì°žì¡°íììì€ -view_searchBar_instructional_noSuggest = í 걎ë ìŒì¹íì§ ìììµëë€. ë€ë¥ž íšíŽì ì ë ¥íììì€. view_searchBar_instructional_refresh = ì ì¥ë ê²ì ì ê±°ì ì€íšíìµëë€. íìŽì§ë¥Œ ìë¡ê³ 칚 íììì€ view_searchBar_savedSearch_delete = ì ì¥ë ê²ì [{0}]ì ì ê±°íëë° ì±ê³µíìµëë€ view_searchBar_savedSearch_failDelete = [{0}]ëŒë ì ì¥ë ê²ìì ìì íëë° ì€íšíìµëë€ @@ -1848,28 +1513,20 @@ view_searchGUI_loginStatus = ë¡ê·žìž ìí륌 íëší ì ììµëë€, ì view_selector_assigned = í ë¹ë {0} view_selector_available = ì¬ì©ê°ë¥í {0} view_subTab_error_disabled = ë¹íì±í ë íì í [{0}]ì ì íí ì ììµëë€. -view_summaryDashboard_resetConfirm = Ʞ볞 ììœ ëì볎ë륌 ì¬ì€ì íìê² ìµëê¹ (íì¬ ë³ê²œì ììŽë²ëŠŽì§ë ëªšëŠ ëë€)? -view_summaryOverviewForm_error_descriptionChangeFailure = ID {0}ìž ëŠ¬ìì€ì ì€ëª ì [{1}]ìì [{2}]ë¡ ë³ê²œíëë° ì€íšíìµëë€. view_summaryOverviewForm_error_locationChangeFailure = ID {0}ìž ëŠ¬ìì€ì ìì¹ë¥Œ [{1}]ìì [{2}]ë¡ ë³ê²œíëë° ì€íšíìµëë€. view_summaryOverviewForm_error_nameChangeFailure = ID {0}ìž ëŠ¬ìì€ì ìŽëŠì [{1}]ìì [{2}]ë¡ ë³ê²œíëë° ì€íšíìµëë€. view_summaryOverviewForm_error_traitsLoadFailure = {0}ì ëí í¹ì± ë¡ëì ì€íšíìµëë€ -view_summaryOverviewForm_field_description = ì€ëª view_summaryOverviewForm_field_location = ìì¹ view_summaryOverviewForm_field_name = ìŽëŠ -view_summaryOverviewForm_field_type = íì view_summaryOverviewForm_field_version = ë²ì view_summaryOverviewForm_header_summary = ììœ view_summaryOverviewForm_label_plugin = íë¬ê·žìž: -view_summaryOverviewForm_message_descriptionChangeSuccess = ID {0}ìž ëŠ¬ìì€ì ì€ëª ì [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€. view_summaryOverviewForm_message_locationChangeSuccess = ID {0}ìž ëŠ¬ìì€ì ìì¹ë¥Œ [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€. view_summaryOverviewForm_message_nameChangeSuccess = ID {0}ìž ëŠ¬ìì€ì ìŽëŠì [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€. view_summaryOverview_header_detectedErrors = ë°ê²¬ë ì€ë¥ view_summaryOverview_title_errorDetailsWindow = ì€ë¥ ììží 볎Ʞ -view_summaryOverview_tooltip_detectedErrors = íì íŽëŠíì¬ ì€ë¥ë¥Œ ììží ëŽ ëë€. view_tableSection_backButton = ëª©ë¡ ê°êž° view_tableSection_error_badId = [{0}]ì ì 볎륌 볌 ì ììµëë€. ì못ë 'id': [{1}]. ìŽ ë²ê·žë¡ ë³Žê³ íììì€ -view_tableSection_error_noId = í ìŽëž [{0}]ì ë ìœëìì 'id' ìì±ìŽ ìë ê²ìŽ ì¡Žì¬íì§ ììµëë€ - ìŽ ë²ê·žë¡ ë³Žê³ íììì€. -view_table_drawFail = í ìŽëž [{0}]륌 귞늬ëë° ì€íšíìµëë€. view_table_matchingRows = ìŒì¹íë í: {0} (ì íëš: {1}) view_table_totalRows = ì 첎 í: {0} (ì íëš: {1}) view_table_totalRowsUnknown = ì 첎 í: ? @@ -1881,7 +1538,6 @@ view_tabs_common_child_history = ìì ëŽì view_tabs_common_child_resources = ìì 늬ìì€ view_tabs_common_connectionSettings = ì°ê²° ì€ì view_tabs_common_connectionSettingsHistory = ì°ê²° ì€ì ëŽì -view_tabs_common_content = ìœí ìž view_tabs_common_current = íì¬ view_tabs_common_dashboard = ëì볎ë view_tabs_common_deployed = ë°°í¬ë @@ -1898,8 +1554,6 @@ view_tabs_common_monitoring = 몚ëí°ë§ view_tabs_common_overview = ê°ì view_tabs_common_schedule = ì€ìŒì¥Ž view_tabs_common_schedules = ì€ìŒì¥Ž -view_tabs_common_subscriptions = 구ë -view_tabs_common_tables = í ìŽëž view_tabs_common_timeline = íìëŒìž view_tabs_common_traits = í¹ì± view_tabs_invalidSubTab = ì못ë íì í: {0} @@ -1914,9 +1568,6 @@ view_tags_error_1 = í귞륌 ë¡ëíëë° ì€íšíìµëë€ view_tags_tags = íê·ž view_tags_tooltip_1 = íŽëŠíë©Ž ìŽ í귞륌 ì ê±°í©ëë€ view_tags_tooltip_2 = íŽëŠíë©Ž í귞륌 ížì§í©ëë€ -view_tags_tooltip_3 = ë€ì íìì í귞륌 ì ë ¥íììì€: (namespace:)(semantic=)tagname (ì. it:env=QA, ëë owner=John) -view_testTop_description = ìŽ ì¹ì ì ë€ìí GUI êµ¬ì± ìì륌 í ì€íž í ì ìë íìŽì§ê° í¬íšëìŽ ììµëë€. -view_testTop_title = í ì€íž view_titleBar_common_addedFav = [{0}] ìŠê²šì°Ÿêž°ì ì¶ê°íìµëë€ view_titleBar_common_addedFavFailure = [{0}] ìŠê²šì°Ÿêž°ì ì¶ê°íëë° ì€íšíìµëë€ view_titleBar_common_clickToAddFav = íŽëŠíë©Ž ìŽ ìŠê²šì°Ÿêž°ì ì¶ê°í©ëë€ @@ -1924,8 +1575,6 @@ view_titleBar_common_clickToRemoveFav = íŽëŠíë©Ž ìŽ ìŠê²šì°Ÿêž°ë¥Œ ìì view_titleBar_common_loadTagsFailure = [{0}]ì ëí í귞륌 ë¡ëíëë° ì€íšíìµëë€ view_titleBar_common_removedFav = ìŠê²šì°Ÿêž°ìì [{0}]륌 ìì íìµëë€ view_titleBar_common_removedFavFailure = ìŠê²šì°Ÿêž°ìì [{0}]륌 ìì íëë° ì€íšíìµëë€ -view_titleBar_common_updateTagsFailure = [{0}]ì íê·ž ì ë°ìŽížì ì€íšíìµëë€ -view_titleBar_common_updateTagsSuccessful = [{0}] íê·žê° ì ë°ìŽíž ëììµëë€ view_titleBar_group_failInfo = ID [{1}]륌 ê°ì§ 귞룹 [{0}]ì ëí ìŒë° ì 볎륌 ê°ì žì€ëë° ì€íšíìµëë€ view_titleBar_group_summary_collapsedTooltip = íŽëŠíë©Ž ìŽ ê·žë£¹ì ëí ììží ì 볎륌 íìí©ëë€ view_titleBar_group_summary_expandedTooltip = íŽëŠ¬ê°ë©Ž ìŽ ê·žë£¹ì ëí ììží ì 볎륌 ìšê¹ëë€. @@ -1935,61 +1584,26 @@ view_tree_common_contextMenu_editResourceConfiguration = [{0}] 늬ìì€ êµ¬ì± view_tree_common_contextMenu_groupGraph = 귞룹 íµê³ ê·žëí view_tree_common_contextMenu_loadFail_children = ììì ìëìŒë¡ ì¶ê°íêž° ìí íë«íŒ ë¡ëì ì€íšíìµëë€ view_tree_common_contextMenu_loadFail_dashboards = ì¬ì©ì ëì 볎ë륌 ë¡ëíëë° ì€íšíìµëë€ -view_tree_common_contextMenu_loadFail_group = 컚í ì€íž ë©ëŽì ëí 귞룹ì ë¡ëì ì€íšíìµëë€ view_tree_common_contextMenu_loadFailed_dashboard = ì¬ì©ì ëì 볎ë륌 ë¡ëíëë° ì€íšíìµëë€ view_tree_common_contextMenu_loadFailed_manualAddChildren = ììì ìëìŒë¡ ì¶ê°íêž° ìí íë«íŒ ë¡ëì ì€íšíìµëë€ -view_tree_common_contextMenu_loadFailed_operations = ìì ì ì€íì ìíŽ ë§ë²ì¬ë¥Œ ììíëë° ì€íšíìµëë€ view_tree_common_contextMenu_measurements = ìž¡ì view_tree_common_contextMenu_resourceConfiguration = 늬ìì€ ì€ì view_tree_common_contextMenu_resourceGraph = 늬ìì€ íµê³ ê·žëí view_tree_common_contextMenu_saveChartToDashboardFailure = ëì볎ë ì ì¥ì ì€íšíìµëë€ view_tree_common_contextMenu_saveChartToDashboardSuccessful = ëì볎ë [{0}]륌 ì ì¥íìµëë€ -view_tree_common_contextMenu_type_name_label = íì : {0} -view_tree_common_createFailed_autoCluster = ìë íŽë¬ì€í° ë°±ì 귞룹ì ë§ë€ê±°ë ì ë°ìŽížíëë° ì€íšíìµëë€ -view_tree_common_loadFailed_children = ë žëì ììì ë¡ëíëë° ì€íšíìµëë€ -view_tree_common_loadFailed_create = ìŽ ë žëì 볎Ʞ륌 ë§ëëë° ì€íšíìµëë€ view_tree_common_loadFailed_descendants = ížëŠ¬ì ììì ë¡ëíëë° ì€íšíìµëë€ view_tree_common_loadFailed_generic = ížëŠ¬ì ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ view_tree_common_loadFailed_group = ID [{0}]륌 ê°ì§ 귞룹ì ë¡ëíëë° ì€íšíìµëë€ view_tree_common_loadFailed_groupTree = 귞룹 ížëŠ¬ë¥Œ ë¡ëíëë° ì€íšíìµëë€ -view_tree_common_loadFailed_node = ìŽ ë žëì ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ view_tree_common_loadFailed_root = ížëŠ¬ì 룚ížë¥Œ ë¡ëíëë° ì€íšíìµëë€ -view_tree_common_loadFailed_selection = ìŽ ë žë륌 ì ííëë° ì€íšíìµëë€ -view_tree_common_loadFailed_update = ìŽ ë žëì ëí 뷰륌 ì ë°ìŽížíëë° ì€íšíìµëë€ -view_tree_group_error_updateAutoCluster = ìë íŽë¬ì€í° ë°±ì 귞룹ì ë§ë€ê±°ë ì ë°ìŽížíëë° ì€íšíìµëë€. í€: [{0}] view_type_parentId = ë¶ëªš ID -view_type_resourceTypes = 늬ìì€ íì -view_type_typeTreeLoadFailure = 늬ìì€ íì ížëŠ¬ ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ -view_upload_alreadyUploaded = íìŒì ìŽë¯ž ì ë°ìŽíž ëììµëë€ view_upload_bundleDistFile = ë¶ì° íìŒ -view_upload_error_bundleDistFile = ë²ë€ ë°°í¬ íìŒ ì ë¡ë ì€ë¥ -view_upload_error_file = íìŒ ì ë¡ë ì€ë¥ -view_upload_error_fileName = íìŒ ì ë¡ë ì€ë¥ [{0}] -view_upload_error_fileName_2 = [{0}] íìŒ ì ë¡ë ì€ë¥, ì못ë íìŒ ê²œë¡ë¥Œ íìžíììì€. -view_upload_error_packageVersionFile = íší€ì§ ë²ì íìŒ ì ë¡ë ì€ë¥ -view_upload_error_results = íìŒ ì ë¡ë ì€ë¥, ìêž°ì¹ ìì 결곌: [{0}] -view_upload_inProgress = ë³ŽëŒ ì ììµëë€, ì ë¡ëë íì¬ ì§íì€ì ëë€ -view_upload_prompt_1 = ì ë¡ë íìŒ [{0}]륌 ì ííììì€ -view_upload_prompt_2 = ì ë¡ë íìŒ -view_upload_success = íìŒ ì ë¡ëì ì±ê³µíìµëë€ -view_upload_tooltip_1a = ì ë¡ëí íìŒì ì ííê³ , ì ë¡ëë ë€ìì íŽëŠíììì€ -view_upload_tooltip_1b = ì ë¡ëí íìŒì ì ííê³ , ë€ìì íŽëŠíììì€ -view_upload_tooltip_2 = íìŒìŽ ì ë¡ë ìŽì ì ì€íšíìµëë€ -view_upload_upload = ì ë¡ë -view_upload_uploadFile = ì ë¡ëíìŒ widget_colorPicker_tooltip = ì ììì ì ííêž° ìíŽ íŽëŠíììì€ -widget_durationItem_inputUnitLessThanTargetUnit = ì ë ¥ ëšìë ëì ëšì 믞ë§ìŽ ììë©ëë€. -widget_durationItem_unitTypeNotSupported = ëšìì íì [{0}]ìŽ DurationItemìì ì§ìëì§ ììµëë€. -widget_jobTriggerEditor_fieldHelp_repeatDuration = ìŽ ìì ì ì¬ë¬ë² ì€ííê±°ë ì§ì ë ìê°ìŽ ëë ëê¹ì§ ê³ì ì€íë©ëë€ -widget_jobTriggerEditor_fieldHelp_repeatInterval = ìì ìŽ ì€íëë ë¹ë -widget_jobTriggerEditor_fieldHelp_startDelay = ì§ì ë ìê°ìŽ ì¢ ë£í íì ìì ì ì€íì ììí©ëë€ widget_jobTriggerEditor_field_cronExpression = Cron ííì widget_jobTriggerEditor_field_mode = ì€ìŒì¥Žë§ widget_jobTriggerEditor_field_repeatInterval_later = 맀í widget_jobTriggerEditor_field_repeatInterval_now = íì¬ì ë§€ë² ì€í widget_jobTriggerEditor_field_startType = ì€í -widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = ì¢ ë£ ìê°ì ìì ìê° ìŽíì¬ìŒ í©ëë€. -widget_jobTriggerEditor_message_endTimeMustBeInFuture = ì¢ ë£ ìê°ì 믞ëìŽìŽìŒ í©ëë€. widget_jobTriggerEditor_message_startTimeMustBeInFuture = ìì ìê°ì 믞ëìŽìŽìŒ í©ëë€. widget_jobTriggerEditor_tab_examples = ìì widget_jobTriggerEditor_tab_format = í¬ë§· @@ -2007,52 +1621,27 @@ widget_jobTriggerEditor_value_until = Until widget_recordEditor_error_invalidViewPath = ì못ë ë·° 겜ë¡: [{0}] widget_recordEditor_error_multipleRecords = ì¬ë¬ ë ìœëê° ë°ê²¬ - íëë§ êž°ëíê³ ììµëë€. widget_recordEditor_error_noRecords = ë ìœë륌 íëë ì°Ÿì ì ììµëë€ - íëë§ êž°ëíê³ ììµëë€. -widget_recordEditor_error_operation = ìì ìŽ ì€íšíìµëë€. ì€ë¥ê° ë°ìíìµëë€ -widget_recordEditor_error_operationInvalidValues = ìì ìŽ ì€íšíìµëë€ - íë ìŽìì íëê° ì못ë ê°ì ê°ì§ê³ ììµëë€ widget_recordEditor_error_permissionCreate = [{0}]륌 ìë¡ ë§ëëë° íìí ê¶íì ê°ì§ê³ ìì§ ììµëë€ -widget_recordEditor_error_unsupportedOperationType = ì§ìëì§ ìë ìŽì íì : [{0}] widget_recordEditor_info_recordCreatedConcise = {0} ìŽ ìì±ëììµëë€. widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] ìŽ ìì±ëììµëë€. -widget_recordEditor_info_recordUpdatedConcise = {0} ìŽ ì ë°ìŽíž ëììµëë€. -widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] ìŽ ì ë°ìŽíž ëììµëë€. widget_recordEditor_title_edit = ížì§ {0} [{1}] widget_recordEditor_title_new = ìë¡ ë§ë€êž° {0} widget_recordEditor_title_view = 볎Ʞ {0} [{1}] widget_recordEditor_warn_validation = íë ìŽìì íëê° ì못ë ê°ì ê°ì§ê³ ììµëë€. ìŽ [{0}]ë ê°ìŽ ìì ë ëê¹ì§ ì ì¥í ì ììµëë€ -widget_resourceFactoryWizard_archPrompt = íší€ì§ ìí€í ì³ -widget_resourceFactoryWizard_configTemplatePrompt = 늬ìì€ êµ¬ì± í í늿 -widget_resourceFactoryWizard_contentTemplatePrompt = ë°°í¬ êµ¬ì± í í늿 widget_resourceFactoryWizard_createSubmit = ìŽëŠ [{0}] 늬ìì€ë¥Œ ê°ì§ ì 늬ìì€ ë§ë€êž° ìì² ì ì¡ìŽ ì±ê³µíìµëë€. -widget_resourceFactoryWizard_createSubmitType = íì [{0}]ì ì 늬ìì€ ë§ë€êž° ìì²ì 볎ëŽëë° ì±ê³µíìµëë€. -widget_resourceFactoryWizard_createWizardTitle = íì [{0}]ì ì 늬ìì€ ë§ë€êž° widget_resourceFactoryWizard_createWizardWindowTitle = 늬ìì€ ìì± ë§ë²ì¬ -widget_resourceFactoryWizard_editConfigStepName = ë°°í¬ ìµì widget_resourceFactoryWizard_execute1 = ì 늬ìì€ ë§ë€êž°ì ì€íšíìµëë€ - íší€ì§ ë²ì ìŽ ì¡Žì¬íì§ ììµëë€ widget_resourceFactoryWizard_execute2 = ì 늬ìì€ ë§ë€êž°ì ì€íšíìµëë€. ìŽ ììŽì ížì ì°ê²°í ì ììµëë€. ìŽ ììŽì ížê° ë€ìŽë ê²ì ì믞í ì ììµëë€. widget_resourceFactoryWizard_execute3 = ìë¡ìŽ 늬ìì€ ìì±ì ì€íšíìµëë€ widget_resourceFactoryWizard_failedToDeleteVersion = 늬ìì€ ìì± ì·šìì íší€ì§ ë²ì ìì ì ì€íšíìµëë€ -widget_resourceFactoryWizard_failedToGetType = ì 늬ìì€ íší€ì§ íì ì ê°ì žì€ëë° ì€íšíìµëë€ widget_resourceFactoryWizard_importFailure = ìëìŒë¡ 늬ìì€ë¥Œ ê°ì žì€ëë° ì€íšíìµëë€ widget_resourceFactoryWizard_importFailure2 = ìëìŒë¡ 늬ìì€ë¥Œ ê°ì žì€ì§ 못íìµëë€. ìŽ ììŽì ížì ì°ê²°í ì ììµëë€. ìŽ ììŽì ížê° ë€ìŽë ê²ì ì믞í ì ììµëë€. -widget_resourceFactoryWizard_importSubmitted = ì 늬ìì€ íì [{0}] ê°ì žì€êž° ìì²ìŽ ì ì¡ëììµëë€ -widget_resourceFactoryWizard_importWizardTitle = ì 늬ìì€ íì [{0}] ê°ì žì€êž° widget_resourceFactoryWizard_importWizardWindowTitle = 늬ìì€ ê°ì žì€êž° ë§ë²ì¬ widget_resourceFactoryWizard_infoStepName = 늬ìì€ ì 볎 -widget_resourceFactoryWizard_infoStep_loadFail = ìí€í ì³ë¥Œ ìŽì© ê°ë¥íê² íëë° ì€íšíìµëë€ widget_resourceFactoryWizard_namePrompt = ì 늬ìì€ ìŽëŠ -widget_resourceFactoryWizard_templatePrompt = ì°ê²° ì€ì í í늿 widget_resourceFactoryWizard_timeoutFailure = íì ìì -widget_resourceFactoryWizard_timeoutHelp = ìê° ê°ê²©. ë§ìœ ì§ì ëë€ë©Ž ({0} ììŽì ížìì) ìì 늬ìì€ë¥Œ ë§ë€êž° ìí Ʞ볞 íìììì 묎ìí©ëë€. í° ìì©íë¡ê·žëšì ë°°í¬ì ê°ì ìê°ìŽ ì€ë 걞늬ë ìì± ìì ì ì ì©í©ëë€. ìŒë°ì ìŒë¡ ìŽì ì ìëê° íìììì ì€íšìž 겜ì°ì ì¬ì©ë©ëë€. -widget_resourceFactoryWizard_uploadFailure = íìŒ ì ë¡ë ì€íš -widget_resourceFactoryWizard_uploadFileStepName = 늬ìì€ ì»ší ìž íìŒì ì ë¡ë -widget_resourceFactoryWizard_uploadInProgress = ì ë¡ëê° ì§íì€ì ëë€... í° íìŒì ë°°í¬íëë° ëª ë¶ìŽ 걞늎 ì ììµëë€. widget_resourceFactoryWizard_versionPrompt = íší€ì§ ë²ì -widget_resourceSelector_groupCategory = 귞룹 칎í ê³ ëŠ¬ widget_resourceSelector_pleaseSelectMultipleResource = íë ìŽìì 늬ìì€ë¥Œ ì ííììì€ widget_resourceSelector_pleaseSelectResource = 늬ìì€ë¥Œ ì ííììì€ widget_resourceSelector_selectMultipleResources = 늬ìì€ë¥Œ ì í widget_resourceSelector_selectResource = 늬ìì€ë¥Œ ì í -widget_typeCache_loadFail = 늬ìì€ íì ë©íë°ìŽí°ì ë¡ëì ì€íšíìµëë€ -widget_typeTree_badTemplateType = ì못ë URL. ì ì ìë í í늿 íì [{0}] -widget_typeTree_badTypeId = ì못ë URL. ì못ë 늬ìì€ íì ID [{0}] -widget_typeTree_loadFail = 늬ìì€ íì ë¡ëì ì€íšíìµëë€ diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties index 3472c92..5b0c05a 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties @@ -1341,7 +1341,7 @@ view_dashboardsManager_error1 = Falha ao adicionar novo dashboad view_dashboardsManager_inventory_title = Sum\u00E1rio do Invent\u00E1rio view_dashboardsManager_mashup_title = Novidades do RHQ view_dashboardsManager_message_title = Bem vindo ao RHQ -##view_dashboardsManager_message_title_details = <h1>Bem vindo ao RHQ</h1>\n<p> O projeto RHQ \u00E9 uma abstra\u00E7\u00E3o e uma suite de gerenciamento de sistemas baseada em plug-ins que fornece uma solu\u00E7\u00E3o extens\u00EDvel e integrada para o gerenciamento de m\u00FAltiplas plataformas atrav\u00E9s de um conjunto de funcionalidades que faz parte de seu n\u00FAcleo. O projeto foi concebido com m\u00F3dulos em camadas que fornecem uma arquitetura flexivel para sua implanta\u00E7\u00E3o. Ele possui uma interface de usu\u00E1rio que propcia o hist\u00F3rico e a auditoria do gerenciamento de recursos por toda a empresa. Sua arquitetura baseada em Agente-Servidor permite o gerenciamento remoto atrav\u00E9s de plugins que implementam todo o suporte espec\u00EDfico aos recursos gerenciados.<p> <p>Este dashboard padr\u00E3o pode ser modificado clicando o bot\u00E3o (modo edi\u00E7\u00E3o) acima.</p> +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboardsManager_tagcloud_title = Nuvem de Tags view_dashboards_confirm1 = Tem certeza de que deseja excluir? view_dashboards_portlets_refresh_fail1 = Falha ao alterar o intervalo de atualizaᅵᅵo de portlets dinï¿œmicos. diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index e4a4564..e82a173 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -2566,6 +2566,7 @@ view_admin_downloads_cli_version = ÐеÑÑÐžÑ CLI ##view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [REVERT From] {0} [REVERT To] {1} ##view_configEdit_property = Property ##view_configEdit_unset = Unset? +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> ##view_group_common_emptyGroup = An empty group is always considered as mixed. ##view_inventory_resources_disableSuccessful = You have successfully disabled the selected resources and their children, [{0}] resources. ##view_messageCenter_messageRootCause = Root Cause diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties index 07d2730..6ccb0e3 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties @@ -1320,7 +1320,7 @@ view_dashboardManager_saved = \u4fdd\u5b58\u7edf\u8ba1\u8868\u76d8{0} view_dashboardManager_success = \u6210\u529f\u4fdd\u5b58\u7edf\u8ba1\u8868\u76d8 view_dashboard_favorites_error1 = \u52a0\u8f7d\u5e38\u7528\u8d44\u6e90\u5931\u8d25. view_dashboardsManager_error1 = \u6dfb\u52a0\u65b0\u7edf\u8ba1\u8868\u76d8\u5931\u8d25 -##view_dashboardsManager_message_title_details = <h1>\u6b22\u8fce\u4f7f\u7528RHQ</h1>\n<p>RHQ\u9879\u76ee\u662f\u4e00\u4e2a\u62bd\u8c61\u7684\u3001\u57fa\u4e8e\u63d2\u4ef6\u7684\u7cfb\u7edf\u7ba1\u7406\u5957\u4ef6\u3002\u901a\u8fc7\u4e00\u7cfb\u5217\u6838\u5fc3\u529f\u80fd\u63d0\u4f9b\u591a\u4ea7\u54c1\u548c\u5e73\u53f0\u7684\u53ef\u6269\u5c55\u7684\u96c6\u6210\u7ba1\u7406. \u672c\u9879\u76ee\u5206\u5c42\u6a21\u5757\u5177\u6709\u7075\u6d3b\u53d1\u5e03\u67b6\u6784. \u5b83\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6838\u5fc3\u7528\u6237\u754c\u9762\u4f9b\u8de8\u6574\u4e2a\u4f01\u4e1a\u7684\u5ba1\u8ba1\u548c\u5386\u53f2\u7ba1\u7406. \u670d\u52a1\u5668/\u4ee3\u7406\u67b6\u6784\u63d0\u4f9b\u8fdc\u7a0b\u7ba1\u7406,\u63d2\u4ef6\u63d0\u4f9b\u7279\u5b9a\u4ea7\u54c1\u7684\u7ba1\u7406\u652f\u6301.</p>\n <p>\u901a\u8fc7\u5355\u51fb(\u7f16\u8f91\u6a21\u5f0f)\u6309\u94ae\u53ef\u4ee5\u7f16\u8f91\u9ed8\u8ba4\u7edf\u8ba1\u8868\u76d8.</p> +##view_dashboardsManager_message_title_details = <h1>Welcome to {0}</h1>\n<p>This dashboard can be edited by clicking the (Edit Mode) button above.</p>\n<p>What would you like to do?</p>\n<p> <a href="{1}">Import newly discovered resources.</a></p>\n<p> <a href="{2}">Search for resources.</a></p>\n<p> <a href="{3}">See help and documentation.</a></p> view_dashboards_confirm1 = \u60a8\u786e\u5b9a\u8981\u5220\u9664\uff1f view_dashboards_portlets_refresh_fail1 = \u4fee\u6539portlets\u81ea\u52a8\u5237\u65b0\u7684\u95f4\u9694\u65f6\u95f4\u5931\u8d25 view_dashboards_portlets_refresh_fail2 = \u505c\u7528portlets\u81ea\u52a8\u5237\u65b0\u7684\u91cd\u8f7d\u5931\u8d25
commit 017100bf86d17e897fed05f315d4649f18584c4a Author: Heiko W. Rupp hwr@redhat.com Date: Tue Jan 15 16:12:53 2013 +0100
Further work on the AlertDefinition part of the Rest-api: - Support for alert dampening. - Split alert handler and definition handler. - Allow to create alert definitions for groups and resource types as well.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java new file mode 100644 index 0000000..d0bb88e --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertDefinitionHandlerBean.java @@ -0,0 +1,776 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.enterprise.server.rest; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.ejb.EJB; +import javax.ejb.Stateless; +import javax.interceptor.Interceptors; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.EntityTag; +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Request; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; +import javax.ws.rs.core.UriInfo; + +import com.wordnik.swagger.annotations.Api; +import com.wordnik.swagger.annotations.ApiOperation; +import com.wordnik.swagger.annotations.ApiParam; + +import org.jboss.resteasy.annotations.GZIP; + +import org.rhq.core.domain.alert.AlertCondition; +import org.rhq.core.domain.alert.AlertConditionCategory; +import org.rhq.core.domain.alert.AlertConditionOperator; +import org.rhq.core.domain.alert.AlertDampening; +import org.rhq.core.domain.alert.AlertDefinition; +import org.rhq.core.domain.alert.AlertPriority; +import org.rhq.core.domain.alert.BooleanExpression; +import org.rhq.core.domain.alert.notification.AlertNotification; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.PropertySimple; +import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; +import org.rhq.core.domain.configuration.definition.PropertyDefinition; +import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; +import org.rhq.core.domain.criteria.AlertDefinitionCriteria; +import org.rhq.core.domain.measurement.MeasurementDefinition; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.resource.group.ResourceGroup; +import org.rhq.enterprise.server.RHQConstants; +import org.rhq.enterprise.server.alert.AlertConditionManagerLocal; +import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; +import org.rhq.enterprise.server.alert.AlertManagerLocal; +import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal; +import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderInfo; +import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderPluginManager; +import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal; +import org.rhq.enterprise.server.resource.group.ResourceGroupManagerLocal; +import org.rhq.enterprise.server.rest.domain.AlertConditionRest; +import org.rhq.enterprise.server.rest.domain.AlertDefinitionRest; +import org.rhq.enterprise.server.rest.domain.AlertNotificationRest; +import org.rhq.enterprise.server.rest.domain.AlertSender; +import org.rhq.enterprise.server.rest.domain.Link; + +/** + * Deal with Alert Definitions. Note that this class shares the /alert/ sub-context with the + * AlertHandlerBean + * @author Heiko W. Rupp + */ +@Produces({"application/json","application/xml","text/plain"}) +@Path("/alert") +@Api(value = "Deal with Alert Definitions",description = "This api deals with alert definitions. Everything " + + " is purely experimental at the moment and can change without notice at any time.") +@Stateless +@Interceptors(SetCallerInterceptor.class) +public class AlertDefinitionHandlerBean extends AbstractRestBean { + + @EJB + AlertDefinitionManagerLocal alertDefinitionManager; + + @EJB + AlertNotificationManagerLocal notificationMgr; + + @EJB + AlertConditionManagerLocal conditionMgr; + + @EJB + AlertManagerLocal alertManager; + + @EJB + ResourceGroupManagerLocal resourceGroupMgr; + + @EJB + ResourceTypeManagerLocal resourceTypeMgr; + + + @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) + private EntityManager entityManager; + + + + @GET + @Path("/definition") + public Response redirectDefinitionToDefinitions(@Context UriInfo uriInfo) { + UriBuilder uriBuilder = uriInfo.getRequestUriBuilder(); + uriBuilder.replacePath("/rest/alert/definitions"); // TODO there needs to be a better way + Response.ResponseBuilder builder = Response.seeOther(uriBuilder.build()); + return builder.build(); + } + + @GZIP + @GET + @Path("/definitions") + @ApiOperation("List all Alert Definition") + public List<AlertDefinitionRest> listAlertDefinitions( + @ApiParam(value = "Page number", defaultValue = "0") @QueryParam("page") int page, + @ApiParam(value = "Limit to status, UNUSED AT THE MOMENT ") @QueryParam("status") String status) { + + AlertDefinitionCriteria criteria = new AlertDefinitionCriteria(); + criteria.setPaging(page,20); // TODO add link to next page + List<AlertDefinition> defs = alertDefinitionManager.findAlertDefinitionsByCriteria(caller, criteria); + List<AlertDefinitionRest> ret = new ArrayList<AlertDefinitionRest>(defs.size()); + for (AlertDefinition def : defs) { + AlertDefinitionRest adr = definitionToDomain(def, false); + ret.add(adr); + } + return ret; + } + + @GET + @Path("/definition/{id}") + @ApiOperation(value = "Get one AlertDefinition by id", responseClass = "AlertDefinitionRest") + public Response getAlertDefinition(@ApiParam("Id of the alert definition to retrieve") @PathParam("id") int definitionId, + @ApiParam("Should conditions be returned too?") @QueryParam("full") @DefaultValue("false") boolean full, + @Context Request request) { + + AlertDefinition def = alertDefinitionManager.getAlertDefinition(caller, definitionId); + if (def==null) + throw new StuffNotFoundException("AlertDefinition with id " + definitionId ); + + EntityTag eTag = new EntityTag(Integer.toHexString(def.hashCode())); + Response.ResponseBuilder builder = request.evaluatePreconditions(eTag); + if (builder==null) { + AlertDefinitionRest adr = definitionToDomain(def, full); + builder = Response.ok(adr); + } + builder.tag(eTag); + + return builder.build(); + } + + @POST + @Path("/definitions") + @ApiOperation("Create an AlertDefinition for the resource/group/resource type passed as query param. Only one of the three params may be given at any time.") + public Response createAlertDefinition(@QueryParam("resourceId") Integer resourceId, + @QueryParam("groupId") Integer groupId, + @QueryParam("resourceTypeId") Integer resourceTypeId, + AlertDefinitionRest adr, + @Context UriInfo uriInfo) { + + int i = 0; + if (resourceId!=null) i++; + if (groupId!=null) i++; + if (resourceTypeId!=null) i++; + + if (i!=1) { + throw new BadArgumentException("query param","You must give exactly one query param out of 'resourceId', 'groupId' or 'resourceTypeId'"); + } + + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName(adr.getName()); + alertDefinition.setEnabled(adr.isEnabled()); + if (adr.getPriority()==null) { + adr.setPriority("LOW"); + } + alertDefinition.setPriority(AlertPriority.valueOf(adr.getPriority().toUpperCase())); + alertDefinition.setConditionExpression(BooleanExpression.valueOf(adr.getConditionMode().toUpperCase())); + alertDefinition.setRecoveryId(adr.getRecoveryId()); + + if (groupId!=null) { + ResourceGroup group = resourceGroupMgr.getResourceGroup(caller,groupId); + alertDefinition.setResourceGroup(group); + } + if (resourceTypeId!=null) { + ResourceType type = resourceTypeMgr.getResourceTypeById(caller,resourceTypeId); + alertDefinition.setResourceType(type); + } + + Set<AlertCondition> conditions = new HashSet<AlertCondition>(adr.getConditions().size()); + for (AlertConditionRest acr : adr.getConditions()) { + AlertCondition condition = conditionRestToCondition(acr); + conditions.add(condition); + } + alertDefinition.setConditions(conditions); + + List<AlertNotification> notifications = new ArrayList<AlertNotification>(adr.getNotifications().size()); + // check if the sender by name exists + AlertSenderPluginManager pluginManager = alertManager.getAlertPluginManager(); + + for (AlertNotificationRest anr : adr.getNotifications()) { + + AlertNotification notification = notificationRestToNotification(alertDefinition, anr); + if (pluginManager.getAlertSenderForNotification(notification)==null) { + throw new StuffNotFoundException("AlertSender with name [" + anr.getSenderName() +"]"); + } + + notifications.add(notification); + } + + alertDefinition.setAlertNotifications(notifications); + setDampeningFromRest(alertDefinition, adr); + + // Set the recovery id if such a definition exists at all + if (adr.getRecoveryId()>0) { + AlertDefinition recoveryDef = alertDefinitionManager.getAlertDefinition(caller,adr.getRecoveryId()); + if (recoveryDef!=null) + alertDefinition.setRecoveryId(adr.getRecoveryId()); + } + + int definitionId = alertDefinitionManager.createAlertDefinition(caller, alertDefinition, resourceId, false); + + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + AlertDefinitionRest uadr = definitionToDomain(updatedDefinition,true) ; // TODO param 'full' ? + + uadr.setId(definitionId); + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/definition/{id}"); + URI uri = uriBuilder.build(definitionId); + + + Response.ResponseBuilder builder = Response.created(uri); + builder.entity(uadr); + return builder.build(); + } + + @PUT + @Path("/definition/{id}") + @ApiOperation(value = "Update the alert definition (priority, enablement, dampening, recovery)", notes = "Priority must be HIGH,LOW,MEDIUM") + public Response updateDefinition( + @ApiParam("Id of the alert definition to update") @PathParam("id") int definitionId, + AlertDefinitionRest definitionRest) { + + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + if (definition==null) + throw new StuffNotFoundException("AlertDefinition with id " + definitionId); + + definition = new AlertDefinition(definition); // detach + + definition.setEnabled(definitionRest.isEnabled()); + definition.setPriority(AlertPriority.valueOf(definitionRest.getPriority())); + setDampeningFromRest(definition, definitionRest); + + // Set the recovery id if such a definition exists at all + if (definitionRest.getRecoveryId()>0) { + AlertDefinition recoveryDef = alertDefinitionManager.getAlertDefinition(caller,definitionRest.getRecoveryId()); + if (recoveryDef!=null) + definition.setRecoveryId(definitionRest.getRecoveryId()); + } + + + definition = alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, true, + true, true); + entityManager.flush(); + + EntityTag eTag = new EntityTag(Integer.toHexString(definition.hashCode())); + AlertDefinitionRest adr = definitionToDomain(definition, false); + + Response.ResponseBuilder builder = Response.ok(adr); + builder.tag(eTag); + + return builder.build(); + + } + + @DELETE + @Path("definition/{id}") + @ApiOperation("Delete an alert definition") + public Response deleteDefinition(@PathParam("id") int definitionId) { + + int count = alertDefinitionManager.removeAlertDefinitions(caller, new int[]{definitionId}); + + return Response.noContent().build(); + } + + + private void setDampeningFromRest(AlertDefinition alertDefinition, AlertDefinitionRest adr) { + AlertDampening.Category dampeningCategory; + try { + dampeningCategory = AlertDampening.Category.valueOf(adr.getDampeningCategory()); + } + catch (Exception e) { + AlertDampening.Category[] vals = AlertDampening.Category.values(); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < vals.length ; i++) { + builder.append(vals[i].name()); + if (i < vals.length-1) + builder.append(", "); + } + throw new BadArgumentException("dampening category","Allowed values are: " + builder.toString()); + } + AlertDampening dampening = new AlertDampening(dampeningCategory); + if (adr.getDampeningCount()!=null) { + if (adr.getDampeningCount().contains(" ")) { + String tmp = adr.getDampeningCount().trim(); + int num = Integer.parseInt(tmp.substring(0,tmp.indexOf(' '))); + tmp = tmp.substring(tmp.lastIndexOf(' ')).trim(); + dampening.setValue(num); + dampening.setValueUnits(AlertDampening.TimeUnits.valueOf(tmp.toUpperCase())); + } + else { + dampening.setValue(Integer.parseInt(adr.getDampeningCount())); + } + } + if (adr.getDampeningPeriod()!=null) { + if (adr.getDampeningPeriod().contains(" ")) { + String tmp = adr.getDampeningPeriod().trim(); + int num = Integer.parseInt(tmp.substring(0,tmp.indexOf(' '))); + tmp = tmp.substring(tmp.lastIndexOf(' ')).trim(); + dampening.setPeriod(num); + dampening.setPeriodUnits(AlertDampening.TimeUnits.valueOf(tmp.toUpperCase())); + } + else { + dampening.setPeriod(Integer.parseInt(adr.getDampeningPeriod())); + } + } + + alertDefinition.setAlertDampening(dampening); + } + + private AlertNotification notificationRestToNotification(AlertDefinition alertDefinition, + AlertNotificationRest anr) { + AlertNotification notification = new AlertNotification(anr.getSenderName()); + // TODO validate sender + notification.setAlertDefinition(alertDefinition); + Configuration configuration = new Configuration(); + for (Map.Entry<String,Object> entry: anr.getConfig().entrySet()) { + configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); + } + notification.setConfiguration(configuration); + // TODO extra configuration (?) + return notification; + } + + + + @POST + @Path("definition/{id}/conditions") + public Response addConditionToDefinition(@PathParam("id") int definitionId, AlertConditionRest conditionRest, @Context UriInfo uriInfo) { + + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + if (definition==null) + throw new StuffNotFoundException("AlertDefinition with id " + definitionId); + + AlertCondition condition = conditionRestToCondition(conditionRest); + + definition.addCondition(condition); + + alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition,false); + + Response.ResponseBuilder builder = getResponseBuilderForCondition(definitionId, uriInfo, condition, true); + + return builder.build(); + } + + @DELETE + @Path("condition/{cid}") + public Response deleteCondition(@PathParam("cid") int conditionId) { + Integer definitionId = findDefinitionIdForConditionId(conditionId); + + AlertDefinition definition2 = entityManager.find(AlertDefinition.class,definitionId); + AlertCondition condition=null; + for (AlertCondition c: definition2.getConditions()) { + if (c.getId() == conditionId) + condition=c; + } + + definition2.getConditions().remove(condition); + + alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition2,true); + + return Response.noContent().build(); + } + + private Integer findDefinitionIdForConditionId(int conditionId) { + /* + // this returns a proxy object, which is not fully initialized + // and all the further work will fail + AlertCondition condition = conditionMgr.getAlertConditionById(conditionId); + AlertDefinition def = condition.getAlertDefinition() + + // So we need to "manually" pull that information in + */ + + Query q = entityManager.createQuery("SELECT condition.alertDefinition.id FROM AlertCondition condition WHERE condition.id = :id "); + q.setParameter("id",conditionId); + Object o = q.getSingleResult(); + return (Integer)o; + } + + @PUT + @Path("condition/{cid}") + public Response updateCondition(@PathParam("cid") int conditionId, AlertConditionRest conditionRest, @Context UriInfo uriInfo) { + + Integer definitionId = findDefinitionIdForConditionId(conditionId); + + AlertDefinition definition = entityManager.find(AlertDefinition.class,definitionId); + AlertCondition condition=null; + + for (Iterator<AlertCondition> iterator = definition.getConditions().iterator(); iterator.hasNext(); ) { + AlertCondition oldCondition = iterator.next(); + if (oldCondition.getId() == conditionId) { + condition = new AlertCondition(oldCondition); + oldCondition.setAlertDefinition(null); + iterator.remove(); + entityManager.remove(oldCondition); + } + } + + + AlertCondition restCondition = conditionRestToCondition(conditionRest); + + condition.setOption(conditionRest.getOption()); + condition.setComparator(conditionRest.getComparator()); + condition.setMeasurementDefinition(restCondition.getMeasurementDefinition()); + condition.setThreshold(conditionRest.getThreshold()); + condition.setTriggerId(conditionRest.getTriggerId()); + definition.getConditions().add(condition); + + alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, true, true, true); + + entityManager.flush(); + + Response.ResponseBuilder builder = getResponseBuilderForCondition(definitionId,uriInfo,condition,false); + return builder.build(); + + } + + @GET + @Path("condition/{cid}") + public Response getCondition(@PathParam("cid") int conditionId) { + + AlertCondition condition = conditionMgr.getAlertConditionById(conditionId); + AlertConditionRest acr = conditionToConditionRest(condition); + + return Response.ok(acr).build(); + + } + + private AlertCondition conditionRestToCondition(AlertConditionRest conditionRest) { + AlertCondition condition = new AlertCondition(); + condition.setName(conditionRest.getName().name()); + condition.setCategory(AlertConditionCategory.valueOf(conditionRest.getCategory().getName())); + condition.setOption(conditionRest.getOption()); + condition.setComparator(conditionRest.getComparator()); + MeasurementDefinition md = entityManager.find(MeasurementDefinition.class, + conditionRest.getMeasurementDefinition()); + condition.setMeasurementDefinition(md); + condition.setThreshold(conditionRest.getThreshold()); + condition.setTriggerId(conditionRest.getTriggerId()); + + return condition; + } + + private Response.ResponseBuilder getResponseBuilderForCondition(int definitionId, UriInfo uriInfo, + AlertCondition originalCondition, boolean isCreate) { + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + Set<AlertCondition> conditions = updatedDefinition.getConditions(); + int conditionId=-1; + AlertCondition createdCondition = null; + for (AlertCondition cond :conditions) { + if (cond.getName().equals(originalCondition.getName())) { + conditionId = cond.getId(); + createdCondition = cond; + } + } + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/condition/{cid}"); + URI uri = uriBuilder.build(conditionId); + + AlertConditionRest result = conditionToConditionRest(createdCondition); + + Response.ResponseBuilder builder; + if (isCreate) + builder = Response.created(uri); + else { + builder = Response.ok(); + builder.location(uri); + } + builder.entity(result); + return builder; + } + + @GET + @Path("notification/{nid}") + public Response getNotification(@PathParam("nid") int notificationId) { + + AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); + AlertNotificationRest anr = notificationToNotificationRest(notification); + + return Response.ok(anr).build(); + } + + @DELETE + @Path("notification/{nid}") + public Response deleteNotification(@PathParam("nid") int notificationId) { + + AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,notification.getAlertDefinition().getId()); + + definition.getAlertNotifications().remove(notification); + + alertDefinitionManager.updateAlertDefinitionInternal(caller,definition.getId(),definition,true,true,true); +// alertDefinitionManager.updateAlertDefinition(caller, definition.getId(), copiedDef, true); + + entityManager.flush(); + + return Response.noContent().build(); + } + + @PUT + @Path("notification/{nid}") + public Response updateNotification(@PathParam("nid") int notificationId, AlertNotificationRest notificationRest) { + + AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,notification.getAlertDefinition().getId()); + + AlertNotification newNotif = notificationRestToNotification(definition,notificationRest); + notification.setConfiguration(newNotif.getConfiguration()); + notification.setExtraConfiguration(newNotif.getExtraConfiguration()); + // id and sender need to stay the same + + alertDefinitionManager.updateAlertDefinitionInternal(caller,definition.getId(),definition,true,true,true); + entityManager.flush(); + + List<AlertNotification> notifications = definition.getAlertNotifications(); + int newNotifId = 0; + for (AlertNotification n : notifications) { + if (n.getSenderName().equals(notification.getSenderName())) + newNotifId = n.getId(); + } + + AlertNotification result = notificationMgr.getAlertNotification(caller,newNotifId); + AlertNotificationRest resultRest = notificationToNotificationRest(result); + + return Response.ok(resultRest).build(); // TODO + } + + + + @POST + @Path("definition/{id}/notifications") + public Response addNotificationToDefinition(@PathParam("id") int definitionId, AlertNotificationRest notificationRest, @Context UriInfo uriInfo) { + + AlertNotification notification = new AlertNotification(notificationRest.getSenderName()); + + // first check if the sender by name exists + AlertSenderPluginManager pluginManager = alertManager.getAlertPluginManager(); + if (pluginManager.getAlertSenderForNotification(notification)==null) { + throw new StuffNotFoundException("AlertSender with name [" + notificationRest.getSenderName() +"]"); + } + + // Now check if the definition exists as well + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + if (definition==null) + throw new StuffNotFoundException("AlertDefinition with id " + definitionId); + + // definition and sender are valid, continue + int existingNotificationCount = definition.getAlertNotifications().size(); + +// notification.setAlertDefinition(definition); setting this will result in duplicated notifications + definition.addAlertNotification(notification); + + Configuration configuration = new Configuration(); + for (Map.Entry<String,Object> entry: notificationRest.getConfig().entrySet()) { + configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); + } + notification.setConfiguration(configuration); + // TODO extra configuration (?) + + + alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, false, true, true); + + + alertDefinitionManager.getAlertDefinition(caller,definitionId); + + entityManager.flush(); + + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinitionById(caller,definitionId); + + List<AlertNotification> notifs = updatedDefinition.getAlertNotifications(); + + assert notifs.size() == existingNotificationCount +1; + + AlertNotification updatedNotification = notifs.get(existingNotificationCount); + AlertNotificationRest updatedNotificationRest = notificationToNotificationRest(updatedNotification); + + int notificationId = updatedNotification.getId(); + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/notification/{nid}"); + URI uri = uriBuilder.build(notificationId ); + + Response.ResponseBuilder builder = Response.created(uri); + builder.entity(updatedNotificationRest); + + return builder.build(); + + } + + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) + @ApiOperation("Return a list of alert notification senders with a short description. The list does not include the configuration definition.") + @GET @GZIP + @Path("senders") + public Response getAlertSenders(@Context UriInfo uriInfo) { + + List<String> senderNames = notificationMgr.listAllAlertSenders(); + List<AlertSender> senderList = new ArrayList<AlertSender>(senderNames.size()); + for (String senderName : senderNames) { + AlertSenderInfo info = notificationMgr.getAlertInfoForSender(senderName); + AlertSender sender = new AlertSender(senderName); + sender.setDescription(info.getDescription()); + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/sender/{name}"); + URI uri = uriBuilder.build(sender.getSenderName()); + Link self = new Link("self",uri.toString()); + sender.setLink(self); + + senderList.add(sender); + } + + GenericEntity<List<AlertSender>> entity = new GenericEntity<List<AlertSender>>(senderList) {}; + + Response.ResponseBuilder builder = Response.ok(entity); + + return builder.build(); + + } + + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) + @ApiOperation("Return an alert notification sender by name. This includes information about the configuration it expects") + @GET @GZIP + @Path("sender/{name}") + public Response getAlertSenderByName(@PathParam("name")String senderName, @Context UriInfo uriInfo) { + + AlertSenderInfo info = notificationMgr.getAlertInfoForSender(senderName); + if (info==null) { + throw new StuffNotFoundException("Alert sender with name [" + senderName + "]"); + } + AlertSender sender = new AlertSender(senderName); + sender.setDescription(info.getDescription()); + + ConfigurationDefinition definition = notificationMgr.getConfigurationDefinitionForSender(senderName); + for (PropertyDefinition pd : definition.getPropertyDefinitions().values()) { + if (pd instanceof PropertyDefinitionSimple) { + PropertyDefinitionSimple pds = (PropertyDefinitionSimple) pd; + sender.getConfigDefinition().put(pds.getName(),pds.getType().name()); + } + else { + log.warn("Property " + pd.getName() + " for sender " + senderName + " is not of a supported type"); + } + } + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/sender/{name}"); + URI uri = uriBuilder.build(sender.getSenderName()); + Link self = new Link("self",uri.toString()); + sender.setLink(self); + + + Response.ResponseBuilder builder = Response.ok(sender); + + return builder.build(); + + } + + + AlertDefinitionRest definitionToDomain(AlertDefinition def, boolean full) { + AlertDefinitionRest adr = new AlertDefinitionRest(def.getId()); + adr.setName(def.getName()); + adr.setEnabled(def.getEnabled()); + adr.setPriority(def.getPriority().getName()); + adr.setConditionMode(def.getConditionExpression().toString()); + adr.setRecoveryId(def.getRecoveryId()); + + if (full) { + Set<AlertCondition> conditions = def.getConditions(); + if (conditions.size() > 0) { + List<AlertConditionRest> conditionRestList = new ArrayList<AlertConditionRest>(conditions.size()); + for (AlertCondition condition : conditions) { + AlertConditionRest acr = conditionToConditionRest(condition); + conditionRestList.add(acr); + } + adr.setConditions(conditionRestList); + } + List<AlertNotification> notifications = def.getAlertNotifications(); + if (notifications.size() > 0) { + List<AlertNotificationRest> notificationRestList = new ArrayList<AlertNotificationRest>(notifications.size()); + for (AlertNotification notification : notifications) { + AlertNotificationRest anr = notificationToNotificationRest(notification); + notificationRestList.add(anr); + } + adr.setNotifications(notificationRestList); + } + } + + AlertDampening dampening = def.getAlertDampening(); + adr.setDampeningCategory(dampening.getCategory().name()); + AlertDampening.TimeUnits units = dampening.getValueUnits(); + String s = units != null ? " " + units.name() : ""; + adr.setDampeningCount(dampening.getValue() + s); + units = dampening.getPeriodUnits(); + s = units != null ? " " + units.name() : ""; + adr.setDampeningPeriod(dampening.getPeriod() + s); + + return adr; + } + + private AlertNotificationRest notificationToNotificationRest(AlertNotification notification) { + AlertNotificationRest anr = new AlertNotificationRest(); + anr.setId(notification.getId()); + anr.setSenderName(notification.getSenderName()); + + for (Map.Entry<String, PropertySimple> entry : notification.getConfiguration().getSimpleProperties().entrySet()) { + anr.getConfig().put(entry.getKey(),entry.getValue().getStringValue()); // TODO correct type conversion of 2nd argument + } + // TODO Extra Configuration + + return anr; + } + + private AlertConditionRest conditionToConditionRest(AlertCondition condition) { + AlertConditionRest acr = new AlertConditionRest(); + acr.setId(condition.getId()); + acr.setName(AlertConditionOperator.valueOf(condition.getName())); + acr.setCategory(condition.getCategory()); + acr.setOption(condition.getOption()); + acr.setComparator(condition.getComparator()); + acr.setMeasurementDefinition(condition.getMeasurementDefinition()==null?0:condition.getMeasurementDefinition().getId()); + acr.setThreshold(condition.getThreshold()); + acr.setTriggerId(condition.getTriggerId()); // TODO what's that? + + return acr; + } + + +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java index 27165b4..052230b 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java @@ -20,22 +20,15 @@ package org.rhq.enterprise.server.rest;
import java.net.URI; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Set;
import javax.ejb.EJB; import javax.ejb.Stateless; import javax.interceptor.Interceptors; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; -import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -60,32 +53,18 @@ import org.jboss.resteasy.annotations.cache.Cache;
import org.rhq.core.domain.alert.Alert; import org.rhq.core.domain.alert.AlertCondition; -import org.rhq.core.domain.alert.AlertConditionCategory; import org.rhq.core.domain.alert.AlertConditionLog; -import org.rhq.core.domain.alert.AlertConditionOperator; -import org.rhq.core.domain.alert.AlertDampening; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.alert.AlertPriority; -import org.rhq.core.domain.alert.BooleanExpression; -import org.rhq.core.domain.alert.notification.AlertNotification; import org.rhq.core.domain.alert.notification.AlertNotificationLog; -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.criteria.AlertCriteria; -import org.rhq.core.domain.criteria.AlertDefinitionCriteria; import org.rhq.core.domain.criteria.Criteria; -import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; import org.rhq.enterprise.server.RHQConstants; -import org.rhq.enterprise.server.alert.AlertConditionManagerLocal; -import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; import org.rhq.enterprise.server.alert.AlertManagerLocal; -import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal; -import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderInfo; -import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderPluginManager; import org.rhq.enterprise.server.rest.domain.*;
/** @@ -94,8 +73,7 @@ import org.rhq.enterprise.server.rest.domain.*; */ @Produces({"application/json","application/xml","text/plain"}) @Path("/alert") -@Api(value = "Deal with Alerts",description = "This api deals with alerts that have fired. It does not offer to create/update AlertDefinitions (yet). Everything " + - "related to creating / updating Alert Definitions is purely experimental at the moment and can change without notice at any time.") +@Api(value = "Deal with Alerts",description = "This api deals with alerts that have fired.") @Stateless @Interceptors(SetCallerInterceptor.class) public class AlertHandlerBean extends AbstractRestBean { @@ -105,19 +83,6 @@ public class AlertHandlerBean extends AbstractRestBean { @EJB AlertManagerLocal alertManager;
- @EJB - AlertDefinitionManagerLocal alertDefinitionManager; - - @EJB - AlertNotificationManagerLocal notificationMgr; - - @EJB - AlertConditionManagerLocal conditionMgr; - - @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) - private EntityManager entityManager; - -
@GZIP @GET @@ -329,522 +294,11 @@ public class AlertHandlerBean extends AbstractRestBean { public AlertDefinitionRest getDefinitionForAlert(@ApiParam("Id of the alert to show the definition") @PathParam("id") int alertId) { Alert al = findAlertWithId(alertId); AlertDefinition def = al.getAlertDefinition(); - AlertDefinitionRest ret = definitionToDomain(def, false); // TODO allow 'full' parameter? + AlertDefinitionHandlerBean adhb = new AlertDefinitionHandlerBean(); + AlertDefinitionRest ret = adhb.definitionToDomain(def, false); // TODO allow 'full' parameter? return ret; }
- @GET - @Path("/definition") - public Response redirectDefinitionToDefinitions(@Context UriInfo uriInfo) { - UriBuilder uriBuilder = uriInfo.getRequestUriBuilder(); - uriBuilder.replacePath("/rest/alert/definitions"); // TODO there needs to be a better way - Response.ResponseBuilder builder = Response.seeOther(uriBuilder.build()); - return builder.build(); - } - - @GZIP - @GET - @Path("/definitions") - @ApiOperation("List all Alert Definition") - public List<AlertDefinitionRest> listAlertDefinitions( - @ApiParam(value = "Page number", defaultValue = "0") @QueryParam("page") int page, - @ApiParam(value = "Limit to status, UNUSED AT THE MOMENT ") @QueryParam("status") String status) { - - AlertDefinitionCriteria criteria = new AlertDefinitionCriteria(); - criteria.setPaging(page,20); // TODO add link to next page - List<AlertDefinition> defs = alertDefinitionManager.findAlertDefinitionsByCriteria(caller, criteria); - List<AlertDefinitionRest> ret = new ArrayList<AlertDefinitionRest>(defs.size()); - for (AlertDefinition def : defs) { - AlertDefinitionRest adr = definitionToDomain(def, false); - ret.add(adr); - } - return ret; - } - - @GET - @Path("/definition/{id}") - @ApiOperation(value = "Get one AlertDefinition by id", responseClass = "AlertDefinitionRest") - public Response getAlertDefinition(@ApiParam("Id of the alert definition to retrieve") @PathParam("id") int definitionId, - @ApiParam("Should conditions be returned too?") @QueryParam("full") @DefaultValue("false") boolean full, - @Context Request request) { - - AlertDefinition def = alertDefinitionManager.getAlertDefinition(caller, definitionId); - if (def==null) - throw new StuffNotFoundException("AlertDefinition with id " + definitionId ); - - EntityTag eTag = new EntityTag(Integer.toHexString(def.hashCode())); - Response.ResponseBuilder builder = request.evaluatePreconditions(eTag); - if (builder==null) { - AlertDefinitionRest adr = definitionToDomain(def, full); - builder = Response.ok(adr); - } - builder.tag(eTag); - - return builder.build(); - } - - @POST - @Path("/definitions") - @ApiOperation("Create an AlertDefinition for the resource passed as query param") - public Response createAlertDefinitionForResource(@QueryParam("resourceId") int resourceId, AlertDefinitionRest adr, - @Context UriInfo uriInfo) { - - AlertDefinition alertDefinition = new AlertDefinition(); - alertDefinition.setName(adr.getName()); - alertDefinition.setEnabled(adr.isEnabled()); - alertDefinition.setPriority(AlertPriority.valueOf(adr.getPriority().toUpperCase())); - alertDefinition.setConditionExpression(BooleanExpression.valueOf(adr.getConditionMode().toUpperCase())); - alertDefinition.setRecoveryId(adr.getRecoveryId()); - - Set<AlertCondition> conditions = new HashSet<AlertCondition>(adr.getConditions().size()); - for (AlertConditionRest acr : adr.getConditions()) { - AlertCondition condition = conditionRestToCondition(acr); - conditions.add(condition); - } - alertDefinition.setConditions(conditions); - - List<AlertNotification> notifications = new ArrayList<AlertNotification>(adr.getNotifications().size()); - for (AlertNotificationRest anr : adr.getNotifications()) { - AlertNotification notification = notificationRestToNotification(alertDefinition, anr); - - notifications.add(notification); - } - - alertDefinition.setAlertNotifications(notifications); - - - // TODO for all things below - alertDefinition.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE)); - - - - - int definitionId = alertDefinitionManager.createAlertDefinition(caller,alertDefinition,resourceId,false); - - AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); - AlertDefinitionRest uadr = definitionToDomain(updatedDefinition,true) ; // TODO param 'full' - - uadr.setId(definitionId); - - UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); - uriBuilder.path("/alert/definition/{id}"); - URI uri = uriBuilder.build(definitionId); - - - Response.ResponseBuilder builder = Response.created(uri); - builder.entity(uadr); - return builder.build(); - } - - private AlertNotification notificationRestToNotification(AlertDefinition alertDefinition, - AlertNotificationRest anr) { - AlertNotification notification = new AlertNotification(anr.getSenderName()); - // TODO validate sender - notification.setAlertDefinition(alertDefinition); - Configuration configuration = new Configuration(); - for (Map.Entry<String,Object> entry: anr.getConfig().entrySet()) { - configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); - } - notification.setConfiguration(configuration); - // TODO extra configuration (?) - return notification; - } - - @PUT - @Path("/definition/{id}") - @ApiOperation(value = "Update the alert definition (priority, enablement)", notes = "Priority must be HIGH,LOW,MEDIUM") - public Response updateDefinition( - @ApiParam("Id of the alert definition to update") @PathParam("id") int definitionId, - AlertDefinitionRest definitionRest) { - AlertDefinition def = alertDefinitionManager.getAlertDefinition(caller,definitionId); - if (def==null) - throw new StuffNotFoundException("AlertDefinition with id " + definitionId); - - def.setEnabled(definitionRest.isEnabled()); - def.setPriority(AlertPriority.valueOf(definitionRest.getPriority())); - - def = alertDefinitionManager.updateAlertDefinition(caller,def.getId(),def,false); // TODO set to true once we allow to change any/all - - EntityTag eTag = new EntityTag(Integer.toHexString(def.hashCode())); - AlertDefinitionRest adr = definitionToDomain(def, false); - - Response.ResponseBuilder builder = Response.ok(adr); - builder.tag(eTag); - - return builder.build(); - - } - - @DELETE - @Path("definition/{id}") - @ApiOperation("Delete an alert definition") - public Response deleteDefinition(@PathParam("id") int definitionId) { - - int count = alertDefinitionManager.removeAlertDefinitions(caller, new int[]{definitionId}); - - return Response.noContent().build(); - } - - - @POST - @Path("definition/{id}/conditions") - public Response addConditionToDefinition(@PathParam("id") int definitionId, AlertConditionRest conditionRest, @Context UriInfo uriInfo) { - - AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); - if (definition==null) - throw new StuffNotFoundException("AlertDefinition with id " + definitionId); - - AlertCondition condition = conditionRestToCondition(conditionRest); - - definition.addCondition(condition); - - alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition,false); - - Response.ResponseBuilder builder = getResponseBuilderForCondition(definitionId, uriInfo, condition, true); - - return builder.build(); - } - - private Response.ResponseBuilder getResponseBuilderForCondition(int definitionId, UriInfo uriInfo, - AlertCondition originalCondition, boolean isCreate) { - AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); - Set<AlertCondition> conditions = updatedDefinition.getConditions(); - int conditionId=-1; - AlertCondition createdCondition = null; - for (AlertCondition cond :conditions) { - if (cond.getName().equals(originalCondition.getName())) { - conditionId = cond.getId(); - createdCondition = cond; - } - } - - UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); - uriBuilder.path("/alert/condition/{cid}"); - URI uri = uriBuilder.build(conditionId); - - AlertConditionRest result = conditionToConditionRest(createdCondition); - - Response.ResponseBuilder builder; - if (isCreate) - builder = Response.created(uri); - else { - builder = Response.ok(); - builder.location(uri); - } - builder.entity(result); - return builder; - } - - @GET - @Path("notification/{nid}") - public Response getNotification(@PathParam("nid") int notificationId) { - - AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); - AlertNotificationRest anr = notificationToNotificationRest(notification); - - return Response.ok(anr).build(); - } - - @DELETE - @Path("notification/{nid}") - public Response deleteNotification(@PathParam("nid") int notificationId) { - - AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); - AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,notification.getAlertDefinition().getId()); - - definition.getAlertNotifications().remove(notification); - - alertDefinitionManager.updateAlertDefinitionInternal(caller,definition.getId(),definition,true,true,true); -// alertDefinitionManager.updateAlertDefinition(caller, definition.getId(), copiedDef, true); - - entityManager.flush(); - - return Response.noContent().build(); - } - - @PUT - @Path("notification/{nid}") - public Response updateNotification(@PathParam("nid") int notificationId, AlertNotificationRest notificationRest) { - - AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); - AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,notification.getAlertDefinition().getId()); - - AlertNotification newNotif = notificationRestToNotification(definition,notificationRest); - notification.setConfiguration(newNotif.getConfiguration()); - notification.setExtraConfiguration(newNotif.getExtraConfiguration()); - // id and sender need to stay the same - - alertDefinitionManager.updateAlertDefinitionInternal(caller,definition.getId(),definition,true,true,true); - entityManager.flush(); - - List<AlertNotification> notifications = definition.getAlertNotifications(); - int newNotifId = 0; - for (AlertNotification n : notifications) { - if (n.getSenderName().equals(notification.getSenderName())) - newNotifId = n.getId(); - } - - AlertNotification result = notificationMgr.getAlertNotification(caller,newNotifId); - AlertNotificationRest resultRest = notificationToNotificationRest(result); - - return Response.ok(resultRest).build(); // TODO - } - - - @DELETE - @Path("condition/{cid}") - public Response deleteCondition(@PathParam("cid") int conditionId) { - Integer definitionId = findDefinitionIdForConditionId(conditionId); - - AlertDefinition definition2 = entityManager.find(AlertDefinition.class,definitionId); - AlertCondition condition=null; - for (AlertCondition c: definition2.getConditions()) { - if (c.getId() == conditionId) - condition=c; - } - - definition2.getConditions().remove(condition); - - alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition2,true); - - return Response.noContent().build(); - } - - private Integer findDefinitionIdForConditionId(int conditionId) { - /* - // this returns a proxy object, which is not fully initialized - // and all the further work will fail - AlertCondition condition = conditionMgr.getAlertConditionById(conditionId); - AlertDefinition def = condition.getAlertDefinition() - - // So we need to "manually" pull that information in - */ - - Query q = entityManager.createQuery("SELECT condition.alertDefinition.id FROM AlertCondition condition WHERE condition.id = :id "); - q.setParameter("id",conditionId); - Object o = q.getSingleResult(); - return (Integer)o; - } - - @PUT - @Path("condition/{cid}") - public Response updateCondition(@PathParam("cid") int conditionId, AlertConditionRest conditionRest, @Context UriInfo uriInfo) { - - Integer definitionId = findDefinitionIdForConditionId(conditionId); - - AlertDefinition definition = entityManager.find(AlertDefinition.class,definitionId); - AlertCondition condition=null; - - for (Iterator<AlertCondition> iterator = definition.getConditions().iterator(); iterator.hasNext(); ) { - AlertCondition oldCondition = iterator.next(); - if (oldCondition.getId() == conditionId) { - condition = new AlertCondition(oldCondition); - oldCondition.setAlertDefinition(null); - iterator.remove(); - entityManager.remove(oldCondition); - } - } - - - AlertCondition restCondition = conditionRestToCondition(conditionRest); - - condition.setOption(conditionRest.getOption()); - condition.setComparator(conditionRest.getComparator()); - condition.setMeasurementDefinition(restCondition.getMeasurementDefinition()); - condition.setThreshold(conditionRest.getThreshold()); - condition.setTriggerId(conditionRest.getTriggerId()); - definition.getConditions().add(condition); - - alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, true, true, true); - - entityManager.flush(); - - Response.ResponseBuilder builder = getResponseBuilderForCondition(definitionId,uriInfo,condition,false); - return builder.build(); - - } - - @GET - @Path("condition/{cid}") - public Response getCondition(@PathParam("cid") int conditionId) { - - AlertCondition condition = conditionMgr.getAlertConditionById(conditionId); - AlertConditionRest acr = conditionToConditionRest(condition); - - return Response.ok(acr).build(); - - } - - private AlertCondition conditionRestToCondition(AlertConditionRest conditionRest) { - AlertCondition condition = new AlertCondition(); - condition.setName(conditionRest.getName().name()); - condition.setCategory(AlertConditionCategory.valueOf(conditionRest.getCategory().getName())); - condition.setOption(conditionRest.getOption()); - condition.setComparator(conditionRest.getComparator()); - MeasurementDefinition md = entityManager.find(MeasurementDefinition.class,conditionRest.getMeasurementDefinition()); - condition.setMeasurementDefinition(md); - condition.setThreshold(conditionRest.getThreshold()); - condition.setTriggerId(conditionRest.getTriggerId()); - - return condition; - } - - @POST - @Path("definition/{id}/notifications") - public Response addNotificationToDefinition(@PathParam("id") int definitionId, AlertNotificationRest notificationRest, @Context UriInfo uriInfo) { - - AlertNotification notification = new AlertNotification(notificationRest.getSenderName()); - - // first check if the sender by name exists - AlertSenderPluginManager pluginManager = alertManager.getAlertPluginManager(); - if (pluginManager.getAlertSenderForNotification(notification)==null) { - throw new StuffNotFoundException("AlertSender with name [" + notificationRest.getSenderName() +"]"); - } - - // Now check if the definition exists as well - AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); - if (definition==null) - throw new StuffNotFoundException("AlertDefinition with id " + definitionId); - - // definition and sender are valid, continue - int existingNotificationCount = definition.getAlertNotifications().size(); - -// notification.setAlertDefinition(definition); setting this will result in duplicated notifications - definition.addAlertNotification(notification); - - Configuration configuration = new Configuration(); - for (Map.Entry<String,Object> entry: notificationRest.getConfig().entrySet()) { - configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); - } - notification.setConfiguration(configuration); - // TODO extra configuration (?) - - - alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, false, true, true); - - - alertDefinitionManager.getAlertDefinition(caller,definitionId); - - entityManager.flush(); - - AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinitionById(caller,definitionId); - - List<AlertNotification> notifs = updatedDefinition.getAlertNotifications(); - - assert notifs.size() == existingNotificationCount +1; - - AlertNotification updatedNotification = notifs.get(existingNotificationCount); - AlertNotificationRest updatedNotificationRest = notificationToNotificationRest(updatedNotification); - - int notificationId = updatedNotification.getId(); - - UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); - uriBuilder.path("/alert/notification/{nid}"); - URI uri = uriBuilder.build(notificationId ); - - Response.ResponseBuilder builder = Response.created(uri); - builder.entity(updatedNotificationRest); - - return builder.build(); - - } - - @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) - @ApiOperation("Return a list of alert notification senders") - @GET @GZIP - @Path("senders") - public Response getAlertSenders(@Context UriInfo uriInfo) { - - List<String> senderNames = notificationMgr.listAllAlertSenders(); - List<AlertSender> senderList = new ArrayList<AlertSender>(senderNames.size()); - for (String senderName : senderNames) { - AlertSenderInfo info = notificationMgr.getAlertInfoForSender(senderName); - AlertSender sender = new AlertSender(senderName); - sender.setDescription(info.getDescription()); - senderList.add(sender); - } - - Response.ResponseBuilder builder = Response.ok(senderList); // TODO XML - - return builder.build(); - - } - - @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) - @ApiOperation("Return an alert notification senders by name") - @GET @GZIP - @Path("sender/{name}") - public Response getAlertSenderByName(@PathParam("name")String senderName, @Context UriInfo uriInfo) { - - AlertSenderInfo info = notificationMgr.getAlertInfoForSender(senderName); - if (info==null) { - throw new StuffNotFoundException("Alert sender with name [" + senderName + "]"); - } - AlertSender sender = new AlertSender(senderName); - sender.setDescription(info.getDescription()); - - Response.ResponseBuilder builder = Response.ok(sender); // TODO XML - - return builder.build(); - - } - - - private AlertDefinitionRest definitionToDomain(AlertDefinition def, boolean full) { - AlertDefinitionRest adr = new AlertDefinitionRest(def.getId()); - adr.setName(def.getName()); - adr.setEnabled(def.getEnabled()); - adr.setPriority(def.getPriority().getName()); - adr.setConditionMode(def.getConditionExpression().toString()); - - Set<AlertCondition> conditions = def.getConditions(); - if (full && conditions.size()>0) { - List<AlertConditionRest> conditionRestList = new ArrayList<AlertConditionRest>(conditions.size()); - for (AlertCondition condition : conditions) { - AlertConditionRest acr = conditionToConditionRest(condition); - conditionRestList.add(acr); - } - adr.setConditions(conditionRestList); - } - List<AlertNotification> notifications = def.getAlertNotifications(); - if (full && notifications.size()>0) { - List<AlertNotificationRest> notificationRestList = new ArrayList<AlertNotificationRest>(notifications.size()); - for (AlertNotification notification : notifications) { - AlertNotificationRest anr = notificationToNotificationRest(notification); - notificationRestList.add(anr); - } - adr.setNotifications(notificationRestList); - } - - return adr; - } - - private AlertNotificationRest notificationToNotificationRest(AlertNotification notification) { - AlertNotificationRest anr = new AlertNotificationRest(); - anr.setId(notification.getId()); - anr.setSenderName(notification.getSenderName()); - - for (Map.Entry<String, PropertySimple> entry : notification.getConfiguration().getSimpleProperties().entrySet()) { - anr.getConfig().put(entry.getKey(),entry.getValue().getStringValue()); // TODO correct type conversion of 2nd argument - } - // TODO Extra Configuration - - return anr; - } - - private AlertConditionRest conditionToConditionRest(AlertCondition condition) { - AlertConditionRest acr = new AlertConditionRest(); - acr.setId(condition.getId()); - acr.setName(AlertConditionOperator.valueOf(condition.getName())); - acr.setCategory(condition.getCategory()); - acr.setOption(condition.getOption()); - acr.setComparator(condition.getComparator()); - acr.setMeasurementDefinition(condition.getMeasurementDefinition()==null?0:condition.getMeasurementDefinition().getId()); - acr.setThreshold(condition.getThreshold()); - acr.setTriggerId(condition.getTriggerId()); // TODO what's that? - - return acr; - }
/** * Retrieve the alert with id id. @@ -871,7 +325,8 @@ public class AlertHandlerBean extends AbstractRestBean { if (slim) { alertDefinitionRest = new AlertDefinitionRest(alertDefinition.getId()); } else { - alertDefinitionRest = definitionToDomain(alertDefinition, false); + AlertDefinitionHandlerBean adhb = new AlertDefinitionHandlerBean(); + alertDefinitionRest = adhb.definitionToDomain(alertDefinition, false); } ret.setAlertDefinition(alertDefinitionRest); ret.setDefinitionEnabled(alertDefinition.getEnabled()); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/BadArgumentException.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/BadArgumentException.java index d938623..c07b4ce 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/BadArgumentException.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/BadArgumentException.java @@ -31,6 +31,10 @@ public class BadArgumentException extends RuntimeException {
private static final long serialVersionUID = 1L;
+ public BadArgumentException(String message) { + super("Bad parameter given: " + message); + } + /** * Construct a new instance of this Exception. * @param parameterName Denotes which parameter is bad diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/CustomExceptionMapper.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/CustomExceptionMapper.java index 71654dc..3003990 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/CustomExceptionMapper.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/CustomExceptionMapper.java @@ -31,6 +31,7 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.enterprise.server.authz.PermissionException; import org.rhq.enterprise.server.resource.ResourceNotFoundException; +import org.rhq.enterprise.server.resource.ResourceTypeNotFoundException; import org.rhq.enterprise.server.resource.group.ResourceGroupNotFoundException; import org.rhq.enterprise.server.rest.domain.RHQErrorWrapper;
@@ -58,6 +59,8 @@ public class CustomExceptionMapper implements ExceptionMapper<Exception> { status = Response.Status.NOT_FOUND; else if (e instanceof ResourceGroupNotFoundException) status = Response.Status.NOT_FOUND; + else if (e instanceof ResourceTypeNotFoundException) + status = Response.Status.NOT_FOUND; else if (e instanceof ParameterMissingException) status = Response.Status.NOT_ACCEPTABLE; else if (e instanceof BadArgumentException) diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java index 59739b1..f9143ce 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/GroupHandlerBean.java @@ -170,6 +170,11 @@ public class GroupHandlerBean extends AbstractRestBean { @ApiParam(value = "A GroupRest object containing at least a name for the group") GroupRest group, @Context HttpHeaders headers, @Context UriInfo uriInfo) {
+ if (group==null) + throw new BadArgumentException("A group must be provided"); + if (group.getName()==null) + throw new BadArgumentException("A group name is required"); + ResourceGroup newGroup = new ResourceGroup(group.getName()); if (group.getResourceTypeId()!=null) {
@@ -182,6 +187,7 @@ public class GroupHandlerBean extends AbstractRestBean { } }
+ MediaType mediaType = headers.getAcceptableMediaTypes().get(0); Response.ResponseBuilder builder; try { newGroup = resourceGroupManager.createResourceGroup(caller, newGroup); @@ -190,10 +196,12 @@ public class GroupHandlerBean extends AbstractRestBean { URI uri = uriBuilder.build(newGroup.getId());
builder=Response.created(uri); + builder.type(mediaType); putToCache(newGroup.getId(),ResourceGroup.class,newGroup); } catch (Exception e) { - e.printStackTrace(); // TODO: Customise this generated block builder=Response.status(Response.Status.NOT_ACCEPTABLE); + builder.type(mediaType); + builder.entity(e.getCause()); } return builder.build(); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java index 2c47704..890a3fe 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java @@ -29,7 +29,7 @@ import org.rhq.core.domain.alert.AlertConditionOperator; * An alert definition can have any number of definitions * @author Heiko W. Rupp */ -@XmlRootElement +@XmlRootElement(name = "condition") public class AlertConditionRest {
private AlertConditionOperator name; diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java index f333516..0e6b351 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java @@ -26,12 +26,14 @@ import javax.xml.bind.annotation.XmlRootElement; import com.wordnik.swagger.annotations.ApiClass; import com.wordnik.swagger.annotations.ApiProperty;
+import org.rhq.core.domain.alert.AlertDampening; + /** * Alert Definition * @author Heiko W. Rupp */ @ApiClass("Representation of an AlertDefinition") -@XmlRootElement +@XmlRootElement(name = "definition") public class AlertDefinitionRest {
int id; @@ -42,7 +44,9 @@ public class AlertDefinitionRest { String conditionMode = "ANY"; // ANY, ALL List<AlertConditionRest> conditions = new ArrayList<AlertConditionRest>(); List<AlertNotificationRest> notifications = new ArrayList<AlertNotificationRest>(); - + String dampeningCategory; + String dampeningCount; + String dampeningPeriod;
public AlertDefinitionRest() { } @@ -123,4 +127,28 @@ public class AlertDefinitionRest { public void setNotifications(List<AlertNotificationRest> notifications) { this.notifications = notifications; } + + public String getDampeningCategory() { + return dampeningCategory; + } + + public void setDampeningCategory(String dampeningCategory) { + this.dampeningCategory = dampeningCategory; + } + + public String getDampeningCount() { + return dampeningCount; + } + + public void setDampeningCount(String dampeningCount) { + this.dampeningCount = dampeningCount; + } + + public String getDampeningPeriod() { + return dampeningPeriod; + } + + public void setDampeningPeriod(String dampeningPeriod) { + this.dampeningPeriod = dampeningPeriod; + } } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java index 0fd5599..1b6a46b 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java @@ -32,7 +32,7 @@ import com.wordnik.swagger.annotations.ApiProperty; * @author Heiko W. Rupp */ @ApiClass("Represents an alert notification") -@XmlRootElement +@XmlRootElement(name = "notification") public class AlertNotificationRest {
private int id; diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertRest.java index db44a3b..022c403 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertRest.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertRest.java @@ -21,20 +21,17 @@ package org.rhq.enterprise.server.rest.domain; import java.util.ArrayList; import java.util.List;
-import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement;
import com.wordnik.swagger.annotations.ApiClass; import com.wordnik.swagger.annotations.ApiProperty;
-import org.jboss.resteasy.links.RESTServiceDiscovery; - /** * A single alert * @author Heiko W. Rupp */ @ApiClass(value = "This class represents a single fired alert.") -@XmlRootElement +@XmlRootElement(name = "alert") public class AlertRest {
private int id; diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java index 3d4e39c..5e54671 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java @@ -19,14 +19,26 @@
package org.rhq.enterprise.server.rest.domain;
+import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.annotation.XmlRootElement; + +import com.wordnik.swagger.annotations.ApiClass; +import com.wordnik.swagger.annotations.ApiProperty; + /** * An Alert notification sender * @author Heiko W. Rupp */ +@ApiClass +@XmlRootElement public class AlertSender {
String senderName; String description; + Link link; + private Map<String, String> configDefinition = new HashMap<String, String>();
public AlertSender() { } @@ -35,6 +47,7 @@ public class AlertSender { this.senderName = senderName; }
+ @ApiProperty("Name of the alert sender - this is also its unique identifier") public String getSenderName() { return senderName; } @@ -43,6 +56,7 @@ public class AlertSender { this.senderName = senderName; }
+ @ApiProperty("A description of this sender") public String getDescription() { return description; } @@ -50,4 +64,21 @@ public class AlertSender { public void setDescription(String description) { this.description = description; } + + public Link getLink() { + return link; + } + + public void setLink(Link link) { + this.link = link; + } + + @ApiProperty("The configuration definition of the sender") + public Map<String, String> getConfigDefinition() { + return configDefinition; + } + + public void setConfigDefinition(Map<String, String> configDefinition) { + this.configDefinition = configDefinition; + } } diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java index 3e3fb98..8370b6a 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java @@ -26,7 +26,9 @@ import org.junit.Test; import org.rhq.modules.integrationTests.restApi.d.AlertCondition; import org.rhq.modules.integrationTests.restApi.d.AlertDefinition; import org.rhq.modules.integrationTests.restApi.d.AlertNotification; +import org.rhq.modules.integrationTests.restApi.d.Group;
+import static com.jayway.restassured.RestAssured.delete; import static com.jayway.restassured.RestAssured.expect; import static com.jayway.restassured.RestAssured.given; import static org.hamcrest.Matchers.is; @@ -91,6 +93,17 @@ public class AlertTest extends AbstractBase { }
@Test + public void testGetAlertSendersXML() throws Exception { + given() + .header(acceptXml) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/senders"); + } + + @Test public void testGetSenderByName() throws Exception { given() .header(acceptJson) @@ -103,6 +116,18 @@ public class AlertTest extends AbstractBase { }
@Test + public void testGetSenderByNameXML() throws Exception { + given() + .header(acceptXml) + .pathParam("name", "Direct Emails") + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/sender/{name}"); + } + + @Test public void testGetUnknownSenderByName() throws Exception { given() .header(acceptJson) @@ -123,6 +148,131 @@ public class AlertTest extends AbstractBase { }
@Test + public void testCreateDeleteBasicAlertDefinitionNoneDampening() throws Exception { + + int definitionId=0; + try { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("LOW"); + alertDefinition.setDampeningCategory("NONE"); + + AlertDefinition result = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceId",10001) + .expect() + .statusCode(201) + .body("dampeningCategory",is("NONE")) + .body("dampeningCount",is("0")) + .body("dampeningPeriod",is("0")) + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + definitionId = result.getId(); + + } finally { + cleanupDefinition(definitionId); + } + } + + @Test + public void testCreateDeleteBasicAlertDefinitionBadDampeningCategory() throws Exception { + + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("LOW"); + alertDefinition.setDampeningCategory("Hulla"); + + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceId",10001) + .expect() + .statusCode(406) + .log().everything() + .when() + .post("/alert/definitions"); + + } + + @Test + public void testCreateDeleteBasicAlertDefinition3of5Dampening() throws Exception { + + int definitionId=0; + try { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("LOW"); + alertDefinition.setDampeningCategory("PARTIAL_COUNT"); + alertDefinition.setDampeningCount("3"); + alertDefinition.setDampeningPeriod("5"); + + AlertDefinition result = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceId",10001) + .expect() + .statusCode(201) + .body("dampeningCategory",is("PARTIAL_COUNT")) + .body("dampeningCount",is("3")) + .body("dampeningPeriod",is("5")) + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + definitionId = result.getId(); + + } finally { + cleanupDefinition(definitionId); + } + } + + @Test + public void testCreateDeleteBasicAlertDefinitionOncein3MinDampening() throws Exception { + + int definitionId=0; + try { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("LOW"); + alertDefinition.setDampeningCategory("DURATION_COUNT"); + alertDefinition.setDampeningCount("1"); + alertDefinition.setDampeningPeriod("3 minutes"); + + AlertDefinition result = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceId", 10001) + .expect() + .statusCode(201) + .body("dampeningCategory",is("DURATION_COUNT")) + .body("dampeningCount", is("1")) + .body("dampeningPeriod", is("3 MINUTES")) + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + definitionId = result.getId(); + + } finally { + cleanupDefinition(definitionId); + } + } + + @Test public void testCreateDeleteAlertDefinitionWith1Condition() throws Exception {
int definitionId = createEmptyAlertDefinition(); @@ -387,12 +537,12 @@ public class AlertTest extends AbstractBase { .header(acceptJson) .contentType(ContentType.JSON) .body(condition) - .pathParam("cid",cid) + .pathParam("cid", cid) .expect() .statusCode(200) .log().ifError() - .body("option",is("23456")) - .body("comparator",is(">")) + .body("option", is("23456")) + .body("comparator", is(">")) .when() .put("/alert/condition/{cid}");
@@ -626,7 +776,7 @@ public class AlertTest extends AbstractBase { .body("priority", is("HIGH")) .body("conditions", iterableWithSize(1)) .body("notifications", iterableWithSize(1)) - .body("name",is("-x-test-full-definition2")) + .body("name", is("-x-test-full-definition2")) .log().everything() .when() .post("/alert/definitions") @@ -705,6 +855,137 @@ public class AlertTest extends AbstractBase { } }
+ @Test + public void testUpdateDefinition() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + try { + AlertDefinition definition = + given() + .header(acceptXml) + .pathParam("did",definitionId) + .expect() + .statusCode(200) + .when() + .get("/alert/definition/{did}") + .as(AlertDefinition.class); + + definition.setEnabled(true); + definition.setDampeningCategory("ONCE"); + + given() + .contentType(ContentType.XML) + .header(acceptJson) + .body(definition) + .pathParam("did",definitionId) + .expect() + .statusCode(200) + .log().ifError() + .body("enabled", is(true)) + .body("dampeningCategory",is("ONCE")) + .when() + .put("/alert/definition/{did}"); + + } + finally { + cleanupDefinition(definitionId); + } + } + + @Test + public void testCreateDefinitionForResourceAndGroup() throws Exception { + + // This is supposed to fail, as we specify both a resource and a group + // to work on + + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceId",10001) + .queryParam("groupId",10001) + .expect() + .statusCode(406) + .log().ifError() + .when() + .post("/alert/definitions"); + } + + @Test + public void testCreateDefinitionForGroup() throws Exception { + + // Create a group + Group group = new Group("test-group-" + System.currentTimeMillis()/1000); + group.setCategory("COMPATIBLE"); + group.setResourceTypeId(10001); + + String groupUri = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(group) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/group/") + .header("Location"); + + int groupId = Integer.parseInt(groupUri.substring(groupUri.lastIndexOf("/")+1)); + + int definitionId = 0; + try { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + + alertDefinition = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("groupId", groupId) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + definitionId = alertDefinition.getId(); + } finally { + cleanupDefinition(definitionId); + delete(groupUri); + } + } + + @Test + public void testCreateDefinitionForResourceType() throws Exception { + + // This is supposed to fail, as we specify both a resource and a group + // to work on + + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + + AlertDefinition result = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceTypeId",10001) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + cleanupDefinition(result.getId()); + } + private void cleanupDefinition(int definitionId) {
if (definitionId==0) @@ -723,6 +1004,7 @@ public class AlertTest extends AbstractBase { alertDefinition.setName("-x-test-definition"); alertDefinition.setEnabled(false); alertDefinition.setPriority("LOW"); + alertDefinition.setDampeningCategory("NONE");
AlertDefinition result = given() diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java index 2194281..3023732 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/GroupTest.java @@ -466,4 +466,36 @@ public class GroupTest extends AbstractBase { .delete("/group/definition/" + defintionId); } } + + @Test + public void testCreatingBadGroup1() throws Exception { + + given() + .contentType(ContentType.XML) + .header(acceptJson) + .expect() + .statusCode(406) + .when() + .post("/group/"); + + } + + @Test + public void testCreatingBadGroup2() throws Exception { + + Group group = new Group(); + group.setCategory("COMPATIBLE"); + group.setResourceTypeId(10001); + + given() + .contentType(ContentType.XML) + .header(acceptJson) + .body(group) + .expect() + .statusCode(406) + .log().everything() + .when() + .post("/group/"); + + } } diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java index 609299c..8113ead 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2012 Red Hat, Inc. + * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -22,10 +22,13 @@ package org.rhq.modules.integrationTests.restApi.d; import java.util.ArrayList; import java.util.List;
+import javax.xml.bind.annotation.XmlRootElement; + /** * An AlertDefinition for testing purposes * @author Heiko W. Rupp */ +@XmlRootElement(name = "definition") public class AlertDefinition {
int id; @@ -36,6 +39,10 @@ public class AlertDefinition { String conditionMode = "ANY"; List<AlertCondition> conditions = new ArrayList<AlertCondition>(); List<AlertNotification> notifications = new ArrayList<AlertNotification>(); + String dampeningCategory = "NONE"; + String dampeningCount; + String dampeningPeriod; +
public AlertDefinition() { } @@ -103,4 +110,28 @@ public class AlertDefinition { public void setNotifications(List<AlertNotification> notifications) { this.notifications = notifications; } + + public String getDampeningCategory() { + return dampeningCategory; + } + + public void setDampeningCategory(String dampeningCategory) { + this.dampeningCategory = dampeningCategory; + } + + public String getDampeningCount() { + return dampeningCount; + } + + public void setDampeningCount(String dampeningCount) { + this.dampeningCount = dampeningCount; + } + + public String getDampeningPeriod() { + return dampeningPeriod; + } + + public void setDampeningPeriod(String dampeningPeriod) { + this.dampeningPeriod = dampeningPeriod; + } } diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Group.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Group.java index d576f4e..eaf8130 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Group.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Group.java @@ -22,10 +22,13 @@ */ package org.rhq.modules.integrationTests.restApi.d;
+import javax.xml.bind.annotation.XmlRootElement; + /** * A group for testing * @author Heiko W. Rupp */ +@XmlRootElement(name = "groupRest") public class Group {
String name;
commit ca5d5ad8e2fe0c5d8c8a9f920f22395ae2da443d Author: Jay Shaughnessy jshaughn@redhat.com Date: Tue Jan 15 13:35:03 2013 -0500
Fix issue with the jndi names used for the report exports.
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml b/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml index a17f947..abf45de 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml +++ b/modules/enterprise/gui/coregui/src/main/webapp/WEB-INF/web.xml @@ -9,7 +9,7 @@
<context-param> <param-name>resteasy.jndi.resources</param-name> - <param-value>rhq/InventorySummaryHandler/local,rhq/AlertDefinitionHandler/local,rhq/ConfigurationHistoryHandler/local,rhq/RecentAlertHandler/local,rhq/SuspectMetricHandler/local,rhq/DriftComplianceHandler/local,rhq/RecentOperationsHandler/local,rhq/RecentDriftHandler/local,rhq/PlatformUtilizationHandler/local</param-value> + <param-value>java:app/rhq-enterprise-server-ejb3/InventorySummaryHandler,java:app/rhq-enterprise-server-ejb3/AlertDefinitionHandler,java:app/rhq-enterprise-server-ejb3/ConfigurationHistoryHandler,java:app/rhq-enterprise-server-ejb3/RecentAlertHandler,java:app/rhq-enterprise-server-ejb3/SuspectMetricHandler,java:app/rhq-enterprise-server-ejb3/DriftComplianceHandler,java:app/rhq-enterprise-server-ejb3/RecentOperationsHandler,java:app/rhq-enterprise-server-ejb3/RecentDriftHandler,java:app/rhq-enterprise-server-ejb3/PlatformUtilizationHandler</param-value> <!--<description>List of jndi names of EJBs local interfaces that define REST stuff</description>--> </context-param> <context-param>
commit 5adfb817554307a6615e25cb6f952e1c1e9025bd Author: Jirka Kremser jkremser@redhat.com Date: Tue Jan 15 19:32:10 2013 +0100
[BZ 895664 - Globally uncaught exception on navigating a resource after adding 'Resource Metric Graph' portlet to dashboard] Gflot now doesn't use its own version of jQuery. This bug was caused by the fact that Gflot lazily loads the jQuery to the page, so if user visited the dashboard before the page when Sparkline is used (resource summary tab), the exception was thrown.
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml index c3e18d3..04c31e9 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml @@ -13,7 +13,7 @@
<inherits name='ca.nanometrics.gflot.GFlot'/> - + <set-property name="gflot.load.jquery" value="EXTERNAL" />
<!-- ============================ gwt logging ============================= --> <set-property name="gwt.logging.enabled" value="TRUE"/>
commit c760a7d294290e54e18b7d3d32e8aa300504d538 Author: John Mazzitelli mazz@redhat.com Date: Tue Jan 15 12:11:50 2013 -0500
fix some messages for avail duration alert condition editor
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java index 2687a87..d90aba7 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/alert/definitions/NewConditionEditor.java @@ -815,7 +815,7 @@ public class NewConditionEditor extends LocatableDynamicForm { formItems.add(helpItem);
SelectItem selection = new SortedSelectItem(AVAILABILITY_DURATION_ITEMNAME, - MSG.view_alert_definition_condition_editor_availabilityDuration()); + MSG.view_alert_definition_condition_editor_availabilityDuration_state()); LinkedHashMap<String, String> avails = new LinkedHashMap<String, String>(2); avails.put(AlertConditionOperator.AVAIL_DURATION_DOWN.name(), MSG.view_alert_definition_condition_editor_operator_availability_durationDown()); diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties index dc05c46..ee61a32 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties @@ -534,25 +534,25 @@ view_adminTemplates_servers = Servers view_adminTemplates_userTemplates = User Templates view_adminTopology_affinityGroups = Affinity Groups view_adminTopology_affinityGroups_agentCount = Agent Count -view_adminTopology_affinityGroups_agetnMembers = Agent Members view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +view_adminTopology_affinityGroups_agetnMembers = Agent Members view_adminTopology_affinityGroups_createNew = Create New view_adminTopology_affinityGroups_details = Affinity Group Details view_adminTopology_affinityGroups_removeSelected = Remove Selected view_adminTopology_affinityGroups_serverCount = Server Count view_adminTopology_affinityGroups_serverMembers = Server Members -view_adminTopology_agents = Agents +view_adminTopology_agentDetail_address = Address +view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +view_adminTopology_agentDetail_currentServer = Current Server +view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +view_adminTopology_agentDetail_token = Token view_adminTopology_agent_agentBindAddress = Agent Bind Address view_adminTopology_agent_agentBindPort = Agent Bind Port view_adminTopology_agent_agentName = Agent Name view_adminTopology_agent_connectedServer = Connected Server view_adminTopology_agent_lastAvailabilityReport = Last Availability Report -view_adminTopology_agentDetail_address = Address -view_adminTopology_agentDetail_agentFailoverList = Agent Failover List -view_adminTopology_agentDetail_currentServer = Current Server -view_adminTopology_agentDetail_token = Token -view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +view_adminTopology_agents = Agents view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number does not correspond to the number of currently connected agents. view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. @@ -561,21 +561,21 @@ view_adminTopology_message_agroupRemovingServersFail = Unable to remove servers view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. -view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. -view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. view_adminTopology_message_forceRepartitionFail = Unable to run repartition. view_adminTopology_message_order = Order -view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). @@ -587,12 +587,17 @@ view_adminTopology_message_removedAllPEventFail = Unable to purge all partition view_adminTopology_message_removedPEvent = Removed {0} partition events(s). view_adminTopology_message_removedServer = Removed {0} server(s). view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. -view_adminTopology_message_serverUpdated = The server {0} was successfully updated. view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +view_adminTopology_message_serverUpdated = The server {0} was successfully updated. view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. view_adminTopology_partitionEvents = Partition Events +view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +view_adminTopology_partitionEventsDetail_eventDetails = Event Details +view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +view_adminTopology_partitionEventsDetail_eventType = Event Type view_adminTopology_partitionEvents_details = Details view_adminTopology_partitionEvents_detailsFilter = Details Filter view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter @@ -603,12 +608,10 @@ view_adminTopology_partitionEvents_initiatedBy = Initiated By view_adminTopology_partitionEvents_purgeAll = Purge All view_adminTopology_partitionEvents_type = Type view_adminTopology_partitionEvents_typeFilter = Type Filter -view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments -view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event -view_adminTopology_partitionEventsDetail_eventDetails = Event Details -view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time -view_adminTopology_partitionEventsDetail_eventType = Event Type view_adminTopology_remoteAgentInstall = Remote Agent Install +view_adminTopology_serverDetail_connectedAgents = Connected Agents +view_adminTopology_serverDetail_installationDate = Installation Date +view_adminTopology_serverDetail_operationMode = Operation Mode view_adminTopology_server_affinityGroup = Affinity Group view_adminTopology_server_agentCount = Agent Count view_adminTopology_server_endpointAddress = Endpoint Address @@ -619,9 +622,6 @@ view_adminTopology_server_removeSelected = Remove Selected view_adminTopology_server_securePort = Secure Port view_adminTopology_server_setMaintenance = Set Maintenance view_adminTopology_server_setNormal = Set Normal -view_adminTopology_serverDetail_connectedAgents = Connected Agents -view_adminTopology_serverDetail_installationDate = Installation Date -view_adminTopology_serverDetail_operationMode = Operation Mode view_adminTopology_servers = Servers view_adminUsersDetails_dataTypeName = user view_adminUsers_failCreateUserWithExistingName = Failed to create user with existing name [{0}]. Please use another name. @@ -856,8 +856,9 @@ view_alert_common_tab_notifications_sender = Sender view_alert_common_tab_notifications_status = Status view_alert_common_tab_recovery = Recovery view_alert_definition_condition_editor_availabilityDuration = Availability Duration -view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration is in minutes and should be long enough, several minutes, to give the agent time to detect another availability state change that may correct the problem. -view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The number of minutes the resource must be at the given availability before the condition is met. +view_alert_definition_condition_editor_availabilityDuration_state = Availability State +view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration should be long enough (several minutes) to give the agent time to detect another availability state change that may correct the problem. +view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The amount of time the resource must be at the given availability state before the condition is met. view_alert_definition_condition_editor_availability_tooltip = Specify the availability state change that will trigger the condition. view_alert_definition_condition_editor_availability_value = Availability view_alert_definition_condition_editor_common_avg = Average diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties index 6978427..42733b7 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties @@ -553,25 +553,25 @@ view_adminTemplates_servers = Servery view_adminTemplates_userTemplates = UÅŸivatelské Å¡ablony view_adminTopology_affinityGroups = Afinitnà skupiny view_adminTopology_affinityGroups_agentCount = PoÄet agentů -view_adminTopology_affinityGroups_agetnMembers = ÄlenÅ¡tà agenti view_adminTopology_affinityGroups_agentsInThisGroup = Agenti této skupiny view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agenti mimo tuto skupinu +view_adminTopology_affinityGroups_agetnMembers = ÄlenÅ¡tà agenti view_adminTopology_affinityGroups_createNew = VytvoÅit novou view_adminTopology_affinityGroups_details = Detaily afinitnà skupiny view_adminTopology_affinityGroups_removeSelected = Odstanit vybrané view_adminTopology_affinityGroups_serverCount = PoÄet serverů view_adminTopology_affinityGroups_serverMembers = Älenské servery -view_adminTopology_agents = Agenti +view_adminTopology_agentDetail_address = Adresa +view_adminTopology_agentDetail_agentFailoverList = Agentův failover list +view_adminTopology_agentDetail_currentServer = SouÄasnÃœ server +view_adminTopology_agentDetail_remoteEndpoint = PÅÃpojnÃœ bod +view_adminTopology_agentDetail_token = Token view_adminTopology_agent_agentBindAddress = Adresa agenta view_adminTopology_agent_agentBindPort = Port agenta view_adminTopology_agent_agentName = Jméno agenta view_adminTopology_agent_connectedServer = PÅipojenÃœ server view_adminTopology_agent_lastAvailabilityReport = Poslednà report dostupnosti -view_adminTopology_agentDetail_address = Adresa -view_adminTopology_agentDetail_agentFailoverList = Agentův failover list -view_adminTopology_agentDetail_currentServer = SouÄasnÃœ server -view_adminTopology_agentDetail_token = Token -view_adminTopology_agentDetail_remoteEndpoint = PÅÃpojnÃœ bod +view_adminTopology_agents = Agenti view_adminTopology_message_agentsCount = K serveru je zaregistrováno {0} agentů. Toto ÄÃslo neznamená poÄet aktuálnÄ pÅipojenÃœch agentů. view_adminTopology_message_agroupAssingAgentsFail = NepodaÅilo se pÅiÅadit agenty do afinitnà skupiny s id {0}. view_adminTopology_message_agroupAssingServersFail = NepodaÅilo se pÅiÅadit servery do afinitnà skupiny s id {0}. @@ -580,21 +580,21 @@ view_adminTopology_message_agroupRemovingServersFail = NepodaÅilo se odstranit view_adminTopology_message_agroupRenamed = Afinitnà skupina s id {0} a jménem {1} byla pÅejmenována na {2}. view_adminTopology_message_agroupRenamingFail = NepodaÅilo se pÅejmenovat afinitnà skupinu s id {0} a jménem {1}. view_adminTopology_message_fetchAgentFail = NepodaÅilo se zÃskat detaily o agentovi s id {0}. -view_adminTopology_message_fetchAgentsFail = NepodaÅilo se agenty pro afinitnà skupinu s id {0}. view_adminTopology_message_fetchAgents2Fail = NepodaÅilo se zÃskat agenty. +view_adminTopology_message_fetchAgentsFail = NepodaÅilo se agenty pro afinitnà skupinu s id {0}. view_adminTopology_message_fetchAgroupFail = NepodaÅilo se zÃskat detaily o afinitnà skupinÄ s id {0}. view_adminTopology_message_fetchAgroupsFail = NepodaÅilo se zÃskat afinitnà skupiny. view_adminTopology_message_fetchFailOverLists = NepodaÅilo se zÃskat dataily failover listu. view_adminTopology_message_fetchPEventDetailsFail = NepodaÅilo se zÃskat detaily události clusteru s id {0}. view_adminTopology_message_fetchPEventFail = NepodaÅilo se zÃskat události clusteru. view_adminTopology_message_fetchServerFail = NepodaÅilo se zÃskat detaily o serveru s id {0}. -view_adminTopology_message_fetchServersFail = NepodaÅilo se zÃskat servery pro afinitnà skupinu s id {0}. view_adminTopology_message_fetchServers2Fail = NepodaÅilo se zÃskat servery. +view_adminTopology_message_fetchServersFail = NepodaÅilo se zÃskat servery pro afinitnà skupinu s id {0}. view_adminTopology_message_forceRepartition = PÅejete si opravdu vynutit pÅerozdÄlenà celého clusteru? PÅimÄje to kaÅŸdého z agentů pÅipojit se na svůj preferovanÃœ server tzn. prvnà ve failover listu. view_adminTopology_message_forceRepartitionFail = NepodaÅilo se spustit pÅerozdÄlenÃ. view_adminTopology_message_order = PoÅadà -view_adminTopology_message_removeAGroupsFail = NepodaÅilo se odstranit následujÃcà afinitnà skupiny {0}. view_adminTopology_message_removeAGroupsConfirm = PÅejete si opravdu odstanit následujÃcà afinitnà skupiny {0}? +view_adminTopology_message_removeAGroupsFail = NepodaÅilo se odstranit následujÃcà afinitnà skupiny {0}. view_adminTopology_message_removeAllPEventConfirm = PÅejete si opravdu odstranit vÅ¡echny události clusteru? view_adminTopology_message_removePEventConfirm = Chcete opravdu odstranit následujÃcà události clusteru {0}? view_adminTopology_message_removePEventFail = NepodaÅilo se odstranit {0} události clusteru. @@ -604,14 +604,19 @@ view_adminTopology_message_removedAGroups = OdstranÄno {0} afinitnÃch skupin. view_adminTopology_message_removedAllPEvent = VÅ¡echnz události clusteru byly smazány. view_adminTopology_message_removedAllPEventFail = NepodaÅilo se odstranit vÅ¡echny události clusteru. view_adminTopology_message_removedPEvent = OdstranÄno {0} událostà clusteru. -view_adminTopology_message_removedServer =OdstranÄno {0} serverů. +view_adminTopology_message_removedServer = OdstranÄno {0} serverů. view_adminTopology_message_repartitioned = Operace pÅerozdÄlenà clusteru byla úspÄÅ¡nÄ spuÅ¡tÄna. -view_adminTopology_message_serverUpdated = Server {0} byl úspÄÅ¡nÄ zmÄnÄn. view_adminTopology_message_serverUpdateFail = NepodaÅilo se zmÄnit server {0}. -view_adminTopology_message_setMode =Nastaveno {0} serverů do {1} módu. +view_adminTopology_message_serverUpdated = Server {0} byl úspÄÅ¡nÄ zmÄnÄn. +view_adminTopology_message_setMode = Nastaveno {0} serverů do {1} módu. view_adminTopology_message_setModeConfirm = PÅejete si opravdu nastavit servery {0} do {1} módu? view_adminTopology_message_setModeFail = NepodaÅilo se nastavit {0} serverů do {1} módu. view_adminTopology_partitionEvents = Události o clusteru +view_adminTopology_partitionEventsDetail_agentAssignments = PÅiÅazenà agenta +view_adminTopology_partitionEventsDetail_agentAssignments_nothing = Tato událost nezpůsobila pÅiÅazenà şádného agenta +view_adminTopology_partitionEventsDetail_eventDetails = Detaily události +view_adminTopology_partitionEventsDetail_eventExecutionTime = Doba provedenà události +view_adminTopology_partitionEventsDetail_eventType = Typ události view_adminTopology_partitionEvents_details = Detaily view_adminTopology_partitionEvents_detailsFilter = Filtrovat podle detailu view_adminTopology_partitionEvents_execStatusFilter = Filtrovat podle stavu provedenà @@ -622,12 +627,10 @@ view_adminTopology_partitionEvents_initiatedBy = Iniciováno kÃœm view_adminTopology_partitionEvents_purgeAll = Smazat vÅ¡echny view_adminTopology_partitionEvents_type = Typ view_adminTopology_partitionEvents_typeFilter = Filtrovat podle typu -view_adminTopology_partitionEventsDetail_agentAssignments = PÅiÅazenà agenta -view_adminTopology_partitionEventsDetail_agentAssignments_nothing = Tato událost nezpůsobila pÅiÅazenà şádného agenta -view_adminTopology_partitionEventsDetail_eventDetails = Detaily události -view_adminTopology_partitionEventsDetail_eventExecutionTime = Doba provedenà události -view_adminTopology_partitionEventsDetail_eventType = Typ události view_adminTopology_remoteAgentInstall = Nainstalovat vzdálenÄ agenta +view_adminTopology_serverDetail_connectedAgents = PÅipojenà agenti +view_adminTopology_serverDetail_installationDate = Datum instalace +view_adminTopology_serverDetail_operationMode = Mód provozu view_adminTopology_server_affinityGroup = Afinitnà skupina view_adminTopology_server_agentCount = PoÄet agentů view_adminTopology_server_endpointAddress = Adresa koncového bodu @@ -638,9 +641,6 @@ view_adminTopology_server_removeSelected = Odstanit vybrané view_adminTopology_server_securePort = ZabezpeÄenÃœ port view_adminTopology_server_setMaintenance = Nastavit údrÅŸbu view_adminTopology_server_setNormal = Nastavit do normálu -view_adminTopology_serverDetail_connectedAgents = PÅipojenà agenti -view_adminTopology_serverDetail_installationDate = Datum instalace -view_adminTopology_serverDetail_operationMode = Mód provozu view_adminTopology_servers = Servery view_adminUsersDetails_dataTypeName = uÅŸivatel view_adminUsers_failCreateUserWithExistingName = NepodaÅilo se vytvoÅit uÅŸivatele s existujÃcÃm jménem [{0}]. PouÅŸÃjte prosÃm jiné jméno. @@ -875,7 +875,8 @@ view_alert_common_tab_notifications_sender = OdesÃlatel view_alert_common_tab_notifications_status = Stav view_alert_common_tab_recovery = Obnova view_alert_definition_condition_editor_availabilityDuration = Doba dostupnosti -##view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration is in minutes and should be long enough, several minutes, to give the agent time to detect another availability state change that may correct the problem. +##view_alert_definition_condition_editor_availabilityDuration_state = Availability State +##view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration should be long enough (several minutes) to give the agent time to detect another availability state change that may correct the problem. view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = PoÄet minut po kterÃœch musà bÃœt zdroj v daném stavu dostupnosti, aby byla splnÄna podmÃnka view_alert_definition_condition_editor_availability_tooltip = Specifikujte stav dostupnosti, kterÃœ poté splnà podmÃnku. view_alert_definition_condition_editor_availability_value = Dostupnost diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties index b0f72d4..31c4f0a 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties @@ -501,24 +501,24 @@ view_adminTemplates_servers = Server view_adminTemplates_userTemplates = Nutzers-spezifische Vorlagen view_adminTopology_affinityGroups = AffinitÀtsgruppen ##view_adminTopology_affinityGroups_agentCount = Agent Count -##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group ##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_createNew = Create New ##view_adminTopology_affinityGroups_details = Affinity Group Details ##view_adminTopology_affinityGroups_removeSelected = Remove Selected ##view_adminTopology_affinityGroups_serverCount = Server Count ##view_adminTopology_affinityGroups_serverMembers = Server Members -view_adminTopology_agents = Agenten +##view_adminTopology_agentDetail_address = Address +##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +##view_adminTopology_agentDetail_currentServer = Current Server +##view_adminTopology_agentDetail_token = Token ##view_adminTopology_agent_agentBindAddress = Agent Bind Address ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report -##view_adminTopology_agentDetail_address = Address -##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List -##view_adminTopology_agentDetail_currentServer = Current Server -##view_adminTopology_agentDetail_token = Token +view_adminTopology_agents = Agenten ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. ##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. ##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. @@ -527,21 +527,21 @@ view_adminTopology_agents = Agenten ##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. ##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. ##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. -##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. ##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). ##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. ##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. ##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. ##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. -##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. ##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. ##view_adminTopology_message_order = Order -##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? ##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? ##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). @@ -553,12 +553,17 @@ view_adminTopology_agents = Agenten ##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). ##view_adminTopology_message_removedServer = Removed {0} server(s). ##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. -##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. ##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? ##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. view_adminTopology_partitionEvents = Partitionierungs-Ereignisse +##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +##view_adminTopology_partitionEventsDetail_eventDetails = Event Details +##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +##view_adminTopology_partitionEventsDetail_eventType = Event Type ##view_adminTopology_partitionEvents_details = Details ##view_adminTopology_partitionEvents_detailsFilter = Details Filter ##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter @@ -569,12 +574,10 @@ view_adminTopology_partitionEvents = Partitionierungs-Ereignisse ##view_adminTopology_partitionEvents_purgeAll = Purge All ##view_adminTopology_partitionEvents_type = Type ##view_adminTopology_partitionEvents_typeFilter = Type Filter -##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments -##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event -##view_adminTopology_partitionEventsDetail_eventDetails = Event Details -##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time -##view_adminTopology_partitionEventsDetail_eventType = Event Type view_adminTopology_remoteAgentInstall = Installation entfernter Agenten +##view_adminTopology_serverDetail_connectedAgents = Connected Agents +##view_adminTopology_serverDetail_installationDate = Installation Date +##view_adminTopology_serverDetail_operationMode = Operation Mode ##view_adminTopology_server_affinityGroup = Affinity Group ##view_adminTopology_server_agentCount = Agent Count ##view_adminTopology_server_endpointAddress = Endpoint Address @@ -585,9 +588,6 @@ view_adminTopology_remoteAgentInstall = Installation entfernter Agenten ##view_adminTopology_server_securePort = Secure Port ##view_adminTopology_server_setMaintenance = Set Maintenance ##view_adminTopology_server_setNormal = Set Normal -##view_adminTopology_serverDetail_connectedAgents = Connected Agents -##view_adminTopology_serverDetail_installationDate = Installation Date -##view_adminTopology_serverDetail_operationMode = Operation Mode view_adminTopology_servers = Server view_adminUsersDetails_dataTypeName = Benutzer ##view_adminUsers_failCreateUserWithExistingName = Failed to create user with existing name [{0}]. Please use another name. @@ -767,6 +767,7 @@ view_alert_common_tab_notifications_sender = Sender view_alert_common_tab_notifications_status = Status view_alert_common_tab_recovery = Erholung view_alert_definition_condition_editor_availabilityDuration = Dauer der VerfÃŒgbarkeit +##view_alert_definition_condition_editor_availabilityDuration_state = Availability State view_alert_definition_condition_editor_availabilityDuration_tooltip = Geben Sie die Ãnderung der VerfÃŒgbarkeit und die LÀnge der Dauer des Zustandes an damit die Bedingung zutrifft. Die Dauer ist in Minuten und sollte lang genug sein (mehrere Minuten), um dem Agent Zeit zugeben eine potentielle Ãnderung des Zustands zu erkennen. view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = Die Anzahl der Minuten in der die Ressource die gegeben VerfÃŒgbarkeit haben muss, bevor die Bedingung zutrifft. view_alert_definition_condition_editor_availability_tooltip = Geben Sie die Ãnderung des VerfÃŒgbarkeitszustandes an, um die Bedingung auszulösen. @@ -1478,8 +1479,8 @@ view_measureRange_simple = Einfach... view_measureRange_start = Zeitraum - Start view_measureTable_chartMetricValues = Graphen fÃŒr ausgewÀhlte Metriken anzeigen view_measureTable_getLive = Aktuellen Wert holen -view_measure_nan = --keine Daten verfÃŒgbar-- ##view_measureTable_startBeforeEnd = Start time should be before the end time. +view_measure_nan = --keine Daten verfÃŒgbar-- view_measurementOob_title = VerdÀchtige Metriken view_menuBar_logout = Ausloggen view_messageCenter_button_messages = Nachrichten diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties index 318e2b3..8c84707 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties @@ -532,25 +532,25 @@ view_adminTemplates_servers = ãµãŒãã¹ view_adminTemplates_userTemplates = ãŠãŒã¶ãŒãã³ãã¬ãŒã view_adminTopology_affinityGroups = ã¢ãã£ããã£ã°ã«ãŒã ##view_adminTopology_affinityGroups_agentCount = Agent Count -##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group ##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_createNew = Create New ##view_adminTopology_affinityGroups_details = Affinity Group Details ##view_adminTopology_affinityGroups_removeSelected = Remove Selected ##view_adminTopology_affinityGroups_serverCount = Server Count ##view_adminTopology_affinityGroups_serverMembers = Server Members -view_adminTopology_agents = ãšãŒãžã§ã³ã +##view_adminTopology_agentDetail_address = Address +##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +##view_adminTopology_agentDetail_currentServer = Current Server +##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +##view_adminTopology_agentDetail_token = Token ##view_adminTopology_agent_agentBindAddress = Agent Bind Address ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report -##view_adminTopology_agentDetail_address = Address -##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List -##view_adminTopology_agentDetail_currentServer = Current Server -##view_adminTopology_agentDetail_token = Token -##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +view_adminTopology_agents = ãšãŒãžã§ã³ã ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. ##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. ##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. @@ -559,21 +559,21 @@ view_adminTopology_agents = ãšãŒãžã§ã³ã ##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. ##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. ##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. -##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. ##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). ##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. ##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. ##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. ##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. -##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. ##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. ##view_adminTopology_message_order = Order -##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? ##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? ##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). @@ -585,12 +585,17 @@ view_adminTopology_agents = ãšãŒãžã§ã³ã ##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). ##view_adminTopology_message_removedServer = Removed {0} server(s). ##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. -##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. ##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? ##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. view_adminTopology_partitionEvents = ã€ãã³ãã®åé¡ +##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +##view_adminTopology_partitionEventsDetail_eventDetails = Event Details +##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +##view_adminTopology_partitionEventsDetail_eventType = Event Type ##view_adminTopology_partitionEvents_details = Details ##view_adminTopology_partitionEvents_detailsFilter = Details Filter ##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter @@ -601,12 +606,10 @@ view_adminTopology_partitionEvents = ã€ãã³ãã®åé¡ ##view_adminTopology_partitionEvents_purgeAll = Purge All ##view_adminTopology_partitionEvents_type = Type ##view_adminTopology_partitionEvents_typeFilter = Type Filter -##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments -##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event -##view_adminTopology_partitionEventsDetail_eventDetails = Event Details -##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time -##view_adminTopology_partitionEventsDetail_eventType = Event Type view_adminTopology_remoteAgentInstall = ãªã¢ãŒããšãŒãžã§ã³ãã®ã€ã³ã¹ããŒã« +##view_adminTopology_serverDetail_connectedAgents = Connected Agents +##view_adminTopology_serverDetail_installationDate = Installation Date +##view_adminTopology_serverDetail_operationMode = Operation Mode ##view_adminTopology_server_affinityGroup = Affinity Group ##view_adminTopology_server_agentCount = Agent Count ##view_adminTopology_server_endpointAddress = Endpoint Address @@ -617,9 +620,6 @@ view_adminTopology_remoteAgentInstall = ãªã¢ãŒããšãŒãžã§ã³ãã®ã€ã³ ##view_adminTopology_server_securePort = Secure Port ##view_adminTopology_server_setMaintenance = Set Maintenance ##view_adminTopology_server_setNormal = Set Normal -##view_adminTopology_serverDetail_connectedAgents = Connected Agents -##view_adminTopology_serverDetail_installationDate = Installation Date -##view_adminTopology_serverDetail_operationMode = Operation Mode view_adminTopology_servers = ãµãŒã㌠view_adminUsersDetails_dataTypeName = ãŠãŒã¶ãŒ ##view_adminUsers_failCreateUserWithExistingName = Failed to create user with existing name [{0}]. Please use another name. @@ -850,6 +850,7 @@ view_alert_common_tab_notifications_sender = ã»ã³ã㌠view_alert_common_tab_notifications_status = ã¹ããŒã¿ã¹ view_alert_common_tab_recovery = ãªã«ã㪠view_alert_definition_condition_editor_availabilityDuration = ã¢ãã€ã©ããªãã£éé +##view_alert_definition_condition_editor_availabilityDuration_state = Availability State view_alert_definition_condition_editor_availabilityDuration_tooltip = ã¢ãã€ã©ããªãã£ã®æ¡ä»¶ãããªã¬ãŒããããã«ä¿åãããŠããªããã°ãªããªãã¢ãã€ã©ããªãã£ç¶æ ã®å€åãšééãæå®ããŸãããã®ééã¯ååäœã§æå®ãããŸãããšãŒãžã§ã³ããã¢ãã€ã©ããªãã£ç¶æ ã®å€æŽãæ€åºããŠåé¡ãä¿®æ£ã§ããããã«ããããã«ã¯ããšãŒãžã§ã³ãã«æå®ããæéãšããŠã¯ãæ°åãšããé·ãã§ååã§ãã view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = ã¢ãã€ã©ããªãã£ã®æ¡ä»¶ãæºããããã«ãªãœãŒã¹ãæå®ãããã¢ãã€ã©ããªãã£ã«ãªãå¿ èŠãããæéã®é·ãïŒå)ã§ãã view_alert_definition_condition_editor_availability_tooltip = æ¡ä»¶ã®ããªã¬ãŒãšãªãã¢ãã€ã©ããªãã£ç¶æ ã®å€åãæå®ããŸã @@ -1678,8 +1679,8 @@ view_measureTable_chartMetricValues = éžæãããã¡ããªãã¯ã¹ãå³ã« view_measureTable_getLive = åäœäžã®å€ã®ååŸ view_measureTable_getLive_failure = ãããã®ã¡ããªãã¯ã¹ã®åäœäžã®å€ãååŸã§ããŸããã§ããã ãšãŒãžã§ã³ãã¯å®è¡äžã§ç®¡çãªãœãŒã¹ã¯äœåäžã§ããããšã確èªããŠãã ããã view_measureTable_live_title = ã©ã€ãããŒã¿ -view_measure_nan = --ããŒã¿ã¯ååšããŸãã-- ##view_measureTable_startBeforeEnd = Start time should be before the end time. +view_measure_nan = --ããŒã¿ã¯ååšããŸãã-- view_measurementOob_title = çãããã¡ããªãã¯ã¹ view_menuBar_logout = ãã°ã¢ãŠã view_messageCenter_clearAllMessages = ãã¹ãŠã®ã¡ãã»ãŒãžãã¯ãªã¢ diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties index 6e2413c..3472c92 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties @@ -537,25 +537,25 @@ view_adminTemplates_servers = Servidores ##view_adminTemplates_userTemplates = User Templates view_adminTopology_affinityGroups = Grupos de Afinidade ##view_adminTopology_affinityGroups_agentCount = Agent Count -##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group ##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_createNew = Create New ##view_adminTopology_affinityGroups_details = Affinity Group Details ##view_adminTopology_affinityGroups_removeSelected = Remove Selected ##view_adminTopology_affinityGroups_serverCount = Server Count ##view_adminTopology_affinityGroups_serverMembers = Server Members -view_adminTopology_agents = Agentes +##view_adminTopology_agentDetail_address = Address +##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +##view_adminTopology_agentDetail_currentServer = Current Server +##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +##view_adminTopology_agentDetail_token = Token ##view_adminTopology_agent_agentBindAddress = Agent Bind Address ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report -##view_adminTopology_agentDetail_address = Address -##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List -##view_adminTopology_agentDetail_currentServer = Current Server -##view_adminTopology_agentDetail_token = Token -##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +view_adminTopology_agents = Agentes ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. ##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. ##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. @@ -564,21 +564,21 @@ view_adminTopology_agents = Agentes ##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. ##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. ##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. -##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. ##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). ##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. ##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. ##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. ##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. -##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. ##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. ##view_adminTopology_message_order = Order -##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? ##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? ##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). @@ -590,12 +590,17 @@ view_adminTopology_agents = Agentes ##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). ##view_adminTopology_message_removedServer = Removed {0} server(s). ##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. -##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. ##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? ##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. view_adminTopology_partitionEvents = Eventos na Parti\u00E7\u00E3o +##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +##view_adminTopology_partitionEventsDetail_eventDetails = Event Details +##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +##view_adminTopology_partitionEventsDetail_eventType = Event Type ##view_adminTopology_partitionEvents_details = Details ##view_adminTopology_partitionEvents_detailsFilter = Details Filter ##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter @@ -606,12 +611,10 @@ view_adminTopology_partitionEvents = Eventos na Parti\u00E7\u00E3o ##view_adminTopology_partitionEvents_purgeAll = Purge All ##view_adminTopology_partitionEvents_type = Type ##view_adminTopology_partitionEvents_typeFilter = Type Filter -##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments -##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event -##view_adminTopology_partitionEventsDetail_eventDetails = Event Details -##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time -##view_adminTopology_partitionEventsDetail_eventType = Event Type view_adminTopology_remoteAgentInstall = Instala\u00E7\u00E3o Remota de Agentes +##view_adminTopology_serverDetail_connectedAgents = Connected Agents +##view_adminTopology_serverDetail_installationDate = Installation Date +##view_adminTopology_serverDetail_operationMode = Operation Mode ##view_adminTopology_server_affinityGroup = Affinity Group ##view_adminTopology_server_agentCount = Agent Count ##view_adminTopology_server_endpointAddress = Endpoint Address @@ -622,9 +625,6 @@ view_adminTopology_remoteAgentInstall = Instala\u00E7\u00E3o Remota de Agentes ##view_adminTopology_server_securePort = Secure Port ##view_adminTopology_server_setMaintenance = Set Maintenance ##view_adminTopology_server_setNormal = Set Normal -##view_adminTopology_serverDetail_connectedAgents = Connected Agents -##view_adminTopology_serverDetail_installationDate = Installation Date -##view_adminTopology_serverDetail_operationMode = Operation Mode view_adminTopology_servers = Servidores view_adminUsersDetails_dataTypeName = usu\u00E1rio ##view_adminUsers_failCreateUserWithExistingName = Failed to create user with existing name [{0}]. Please use another name. @@ -858,8 +858,9 @@ view_alert_common_tab_notifications_sender = Remetente view_alert_common_tab_notifications_status = Status view_alert_common_tab_recovery = Recupera\u00E7\u00E3o ##view_alert_definition_condition_editor_availabilityDuration = Availability Duration -view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration is in minutes and should be long enough, several minutes, to give the agent time to detect another availability state change that may correct the problem. -##view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The number of minutes the resource must be at the given availability before the condition is met. +##view_alert_definition_condition_editor_availabilityDuration_state = Availability State +##view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration should be long enough (several minutes) to give the agent time to detect another availability state change that may correct the problem. +##view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The amount of time the resource must be at the given availability state before the condition is met. view_alert_definition_condition_editor_availability_tooltip = Especifica a mudan\u00E7a de estado na disponibilidade do recurso que ir\u00E1 disparar a condi\u00E7\u00E3o. view_alert_definition_condition_editor_availability_value = Disponibilidade view_alert_definition_condition_editor_common_avg = M\u00E9dio diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties index 2a48c2b..e4a4564 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties @@ -2557,6 +2557,9 @@ view_admin_downloads_cli_version = ÐеÑÑÐžÑ CLI ##view_admin_downloads_scriptModules_none = No script modules are available for download ##view_admin_systemSettings_serverDetails_productName = Product Name ##view_admin_systemSettings_serverDetails_serverName = Server Name +##view_alert_definition_condition_editor_availabilityDuration_state = Availability State +##view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration should be long enough (several minutes) to give the agent time to detect another availability state change that may correct the problem. +##view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The amount of time the resource must be at the given availability state before the condition is met. ##view_alert_details_field_resource_ancestry = Resource Ancestry ##view_alert_details_field_watched_resource = Watched Resource ##view_bundle_list_error4 = No bundles found in this repository diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties index 69a255b..07d2730 100644 --- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties @@ -524,25 +524,25 @@ view_adminTemplates_servers = \u670d\u52a1\u5668 ##view_adminTemplates_userTemplates = User Templates view_adminTopology_affinityGroups = \u76f8\u5173\u7ec4 ##view_adminTopology_affinityGroups_agentCount = Agent Count -##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group ##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group +##view_adminTopology_affinityGroups_agetnMembers = Agent Members ##view_adminTopology_affinityGroups_createNew = Create New ##view_adminTopology_affinityGroups_details = Affinity Group Details ##view_adminTopology_affinityGroups_removeSelected = Remove Selected ##view_adminTopology_affinityGroups_serverCount = Server Count ##view_adminTopology_affinityGroups_serverMembers = Server Members -view_adminTopology_agents = \u4ee3\u7406 +##view_adminTopology_agentDetail_address = Address +##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List +##view_adminTopology_agentDetail_currentServer = Current Server +##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +##view_adminTopology_agentDetail_token = Token ##view_adminTopology_agent_agentBindAddress = Agent Bind Address ##view_adminTopology_agent_agentBindPort = Agent Bind Port ##view_adminTopology_agent_agentName = Agent Name ##view_adminTopology_agent_connectedServer = Connected Server ##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report -##view_adminTopology_agentDetail_address = Address -##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List -##view_adminTopology_agentDetail_currentServer = Current Server -##view_adminTopology_agentDetail_token = Token -##view_adminTopology_agentDetail_remoteEndpoint = Remote Endpoint +view_adminTopology_agents = \u4ee3\u7406 ##view_adminTopology_message_agentsCount = There are {0} agents registered to this server. This number doesn't correspond to the number of currently connected agents. ##view_adminTopology_message_agroupAssingAgentsFail = Unable to assign agents to the affinity group with id {0}. ##view_adminTopology_message_agroupAssingServersFail = Unable to assign servers to the affinity group with id {0}. @@ -551,21 +551,21 @@ view_adminTopology_agents = \u4ee3\u7406 ##view_adminTopology_message_agroupRenamed = Affinity group with id {0} and name {1} was renamed to {2}. ##view_adminTopology_message_agroupRenamingFail = Unable to rename affinity group with id {0} and name {1}. ##view_adminTopology_message_fetchAgentFail = Unable to fetch agent details for agent with id {0}. -##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgents2Fail = Unable to fetch agents. +##view_adminTopology_message_fetchAgentsFail = Unable to fetch agent(s) for affinity group with id {0}. ##view_adminTopology_message_fetchAgroupFail = Unable to fetch affinity group details for group with id {0}. ##view_adminTopology_message_fetchAgroupsFail = Unable to fetch affinity group(s). ##view_adminTopology_message_fetchFailOverLists = Unable to fetch fail over list details. ##view_adminTopology_message_fetchPEventDetailsFail = Unable to fetch partition event details for event with id {0}. ##view_adminTopology_message_fetchPEventFail = Unable to fetch partition events. ##view_adminTopology_message_fetchServerFail = Unable to fetch server details for server with id {0}. -##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_fetchServers2Fail = Unable to fetch servers. +##view_adminTopology_message_fetchServersFail = Unable to fetch server(s) for affinity group with id {0}. ##view_adminTopology_message_forceRepartition = Do you really want to force a repartition of whole cluster? It will force all the agents to connect to its most preferred server. ##view_adminTopology_message_forceRepartitionFail = Unable to run repartition. ##view_adminTopology_message_order = Order -##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAGroupsConfirm = Do you really want to remove following affinity groups {0}? +##view_adminTopology_message_removeAGroupsFail = Unable to remove following affinity groups(s) {0}. ##view_adminTopology_message_removeAllPEventConfirm = Do you really want to purge all partition events? ##view_adminTopology_message_removePEventConfirm = Do you really want to remove following partition events {0}? ##view_adminTopology_message_removePEventFail = Unable to remove {0} partition events(s). @@ -577,12 +577,17 @@ view_adminTopology_agents = \u4ee3\u7406 ##view_adminTopology_message_removedPEvent = Removed {0} partition events(s). ##view_adminTopology_message_removedServer = Removed {0} server(s). ##view_adminTopology_message_repartitioned = The cluster repartitioning was successfully invoked. -##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_serverUpdateFail = Unable to update server {0}. +##view_adminTopology_message_serverUpdated = The server {0} was successfully updated. ##view_adminTopology_message_setMode = Set {0} server(s) to {1} mode. ##view_adminTopology_message_setModeConfirm = Do you really want to set servers {0} to {1} mode? ##view_adminTopology_message_setModeFail = Unable to set {0} server(s) to {1} mode. view_adminTopology_partitionEvents = Partition\u4e8b\u4ef6 +##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments +##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event +##view_adminTopology_partitionEventsDetail_eventDetails = Event Details +##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time +##view_adminTopology_partitionEventsDetail_eventType = Event Type ##view_adminTopology_partitionEvents_details = Details ##view_adminTopology_partitionEvents_detailsFilter = Details Filter ##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter @@ -593,12 +598,10 @@ view_adminTopology_partitionEvents = Partition\u4e8b\u4ef6 ##view_adminTopology_partitionEvents_purgeAll = Purge All ##view_adminTopology_partitionEvents_type = Type ##view_adminTopology_partitionEvents_typeFilter = Type Filter -##view_adminTopology_partitionEventsDetail_agentAssignments = Agent Assignments -##view_adminTopology_partitionEventsDetail_agentAssignments_nothing = No agents were reassigned as a result of this partition event -##view_adminTopology_partitionEventsDetail_eventDetails = Event Details -##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time -##view_adminTopology_partitionEventsDetail_eventType = Event Type view_adminTopology_remoteAgentInstall = \u8fdc\u7a0b\u4ee3\u7406\u5b89\u88c5 +##view_adminTopology_serverDetail_connectedAgents = Connected Agents +##view_adminTopology_serverDetail_installationDate = Installation Date +##view_adminTopology_serverDetail_operationMode = Operation Mode ##view_adminTopology_server_affinityGroup = Affinity Group ##view_adminTopology_server_agentCount = Agent Count ##view_adminTopology_server_endpointAddress = Endpoint Address @@ -609,9 +612,6 @@ view_adminTopology_remoteAgentInstall = \u8fdc\u7a0b\u4ee3\u7406\u5b89\u88c5 ##view_adminTopology_server_securePort = Secure Port ##view_adminTopology_server_setMaintenance = Set Maintenance ##view_adminTopology_server_setNormal = Set Normal -##view_adminTopology_serverDetail_connectedAgents = Connected Agents -##view_adminTopology_serverDetail_installationDate = Installation Date -##view_adminTopology_serverDetail_operationMode = Operation Mode view_adminTopology_servers = \u670d\u52a1\u5668 view_adminUsersDetails_dataTypeName = user ##view_adminUsers_failCreateUserWithExistingName = Failed to create user with existing name [{0}]. Please use another name. @@ -844,8 +844,9 @@ view_alert_common_tab_notifications_sender = \u53d1\u9001\u8005 view_alert_common_tab_notifications_status = \u72b6\u6001 view_alert_common_tab_recovery = \u8fd8\u539f ##view_alert_definition_condition_editor_availabilityDuration = Availability Duration -view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration is in minutes and should be long enough, several minutes, to give the agent time to detect another availability state change that may correct the problem. -##view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The number of minutes the resource must be at the given availability before the condition is met. +##view_alert_definition_condition_editor_availabilityDuration_state = Availability State +##view_alert_definition_condition_editor_availabilityDuration_tooltip = Specify the availability state change and the duration that state must persist in order to trigger the condition. The duration should be long enough (several minutes) to give the agent time to detect another availability state change that may correct the problem. +##view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = The amount of time the resource must be at the given availability state before the condition is met. view_alert_definition_condition_editor_availability_tooltip = Specify the availability state change that will trigger the condition. view_alert_definition_condition_editor_availability_value = \u53ef\u7528\u6027 view_alert_definition_condition_editor_common_avg = \u5e73\u5747
commit f7b83d7464b126b66621d92bfd4014532f139289 Author: SungUk Jeon allnewangel@gmail.com Date: Mon Jan 14 11:27:42 2013 +0100
Korean translations
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants_ko.properties new file mode 100644 index 0000000..159d9af --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/MessageConstants_ko.properties @@ -0,0 +1,54 @@ +# +# RHQ GUI i18n Message Constants - Locale: KO (korean) +# This file should be UTF-8 encoded. +# +# This is used specifically for properties needing lookup by name, at runtime. These +# constant properties can be localized but can not have arguments. +################################### + +#=================== Help URLs ===================== +# The Help sections and entries are table driven via property lookups. The following property +# names are expected: +# +# The number of help sections: +# +# view_help_section_count = numSectionsInteger +# +# For each section: +# N = 1..numSections +# +# view_help_section_N_title = localized title for section in the sectionStack +# view_help_section_N_item_count = numSectionItemsInteger +# +# For each url entry in the section N: +# M = 1..numSectionItems +# +# view_help_section_N_propTitle_M = localized title for the help (required) +# view_help_section_N_propIcon_M = icon path (optional, defaults to document icon) +# view_help_section_N_propUrl_M = url for the help (required) +# +view_help_section_count = 2 + +view_help_section_1_title = 묞ì +view_help_section_1_item_count = 3 + +view_help_section_1_propTitle_1 = ì죌 묻ë ì§ë¬ž (FAQ) +view_help_section_1_propUrl_1 = https://docs.jboss.org/author/display/RHQ/FAQ +view_help_section_1_propTitle_2 = 묞ì ìžíž +view_help_section_1_propUrl_2 = https://docs.jboss.org/author/display/RHQ/Home +view_help_section_1_propTitle_3 = API Javadoc +view_help_section_1_propUrl_3 = https://docs.jboss.org/author/display/RHQ/API+Documentation + +view_help_section_2_title = ììµì +view_help_section_2_item_count = 4 + +view_help_section_2_propTitle_1 = ë°ëªš: 몚ë ë°ëªš +view_help_section_2_propUrl_1 = https://docs.jboss.org/author/display/RHQ/Demos +view_help_section_2_propTitle_2 = ë°ëªš: ë²ë€ ì ê³µ +view_help_section_2_propUrl_2 = http://management-platform.blogspot.com/2011/01/bundle-provisioning-via-rhq.... +view_help_section_2_propTitle_3 = 귞룹 í겜 ì ìì êµ¬ì¶ ë°©ë² +view_help_section_2_propIcon_3 = [SKIN]/../actions/help.png +view_help_section_2_propUrl_3 = http://docs.redhat.com/docs/en-US/JBoss_Operations_Network/2.4/html/Basic_Ad... +view_help_section_2_propTitle_4 = ê²ìì°œ ì¬ì© ë°©ë² +view_help_section_2_propIcon_4 = [SKIN]/../actions/help.png +view_help_section_2_propUrl_4 = https://docs.jboss.org/author/display/RHQ/Search diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties new file mode 100644 index 0000000..d846547 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties @@ -0,0 +1,2058 @@ +# suppress inspection "UnusedProperty" for whole file +# +# RHQ GUI i18n Messages - ko (Korean) +# +# Developers: See the following wiki page for how to work with this file: +# +# https://docs.jboss.org/author/display/RHQ/Working+with+the+Resource+Bundles +# +################################### +common_alert_high = ëì +common_alert_low = ë®ì +common_alert_medium = ì€ê° +common_buildInfo_gwtVersion = ${gwt.version} +common_button_ack = íìž +common_button_ack_all = ì 첎 íìž +common_button_add = ì¶ê° +common_button_advanced = ê³ êž ì€ì ... +common_button_apply = ì ì© +common_button_cancel = ì·šì +common_button_close = ë«êž° +common_button_compare = ë¹êµ +common_button_create_child = ìì ìì± +common_button_delete = ìì +common_button_delete_all = ì 첎 ìì +common_button_disable = ë¹íì± +common_button_dump_sysInfo_to_log = ë€í ìì€í ì 볎 +common_button_edit = ížì§ +common_button_enable = íì± +common_button_execute = ì€í +common_button_finish = ìë£ +common_button_fixedWidth = ê³ ì í +common_button_import = ê°ì žì€êž° +common_button_new = ì ê· +common_button_next = ë€ì +common_button_ok = íìž +common_button_previous = ìŽì +common_button_purge = ì ê±° +common_button_purgeAll = ì 첎 ì ê±° +common_button_refresh = ìë¡ ê³ ì¹š +common_button_reports_export = ëŽë³ŽëŽêž° +common_button_reset = ì¬ì€ì +common_button_save = ì ì¥ +common_button_scaleToFit = í¬êž° ì¡°ì +common_button_schedule = ìŒì +common_button_search = ê²ì +common_button_set = ì€ì +common_button_showDetails = ììží볎Ʞ... +common_button_uninventory = ìžë²€í 늬 ì ê±° +common_calendar_april_short = 4ì +common_calendar_august_short = 8ì +common_calendar_december_short = 12ì +common_calendar_february_short = 2ì +common_calendar_january_short = 1ì +common_calendar_july_short = 7ì +common_calendar_june_short = 6ì +common_calendar_march_short = 3ì +common_calendar_may_short = 5ì +common_calendar_november_short = 11ì +common_calendar_october_short = 10ì +common_calendar_september_short = 9ì +common_label_ago = {0} ì +common_label_all = ì 첎 +common_label_all_resources = 몚ë ìì +common_label_day = ìŒ +common_label_error = ì€ë¥ +common_label_filters = íí° +common_label_hour = ìê° +common_label_item = í목 +common_label_items = í목 +common_label_link = ë§í¬ +common_label_month = ì +common_label_none = ìì +common_label_none2 = ìì +common_label_role = ìí +common_label_roles = ìí +common_label_scheduled_operations = ììœë ìì +common_label_selected_resources = ì íë ìì +common_label_unlimited = 묎ì í +common_label_user = ì¬ì©ì +common_label_users = ì¬ì©ì +common_label_week = 죌 +common_label_yesterday = ìŽì +common_msg_areYouSure = íì€í©ëê¹? +common_msg_asyncTimeout = {0}. ìŽ ë°ìí ê²ì ìë²ê° ìŽ ìì²ì ìë£íë ë° ìê°ìŽ ì€ë 겜곌í ë묞ì ëë€. ìë²ê° ìì²ì ìì§ ì²ëŠ¬ì€ìŽë©° ëšìê°ì ìë£ í ì ìëì§ì£Œìíììì€. ìë² ë¡ê·žë¥Œ ê²ì¬íì¬ ë¹ì ìì ìž ì€ë¥ê° ë°ìíëì§ ì¬ë¶ë¥Œ ì ì ììµëë€. +common_msg_changeAutoDetected = ë³ê²œìŽ ìë ê°ì§ëììµëë€. +common_msg_deleteConfirm = ì íë {0} ì ìì íìê² ìµëê¹? +common_msg_deleted = {0} {1} ìì ëš. +common_msg_emphasizedNotePrefix = 죌ì: +common_msg_loading = ë¡ë©ì€... +common_msg_noItemsToShow = íìí íëª©ìŽ ììµëë€. +common_msg_notYetImplemented = 구íëì§ ìììµëë€. +common_msg_see_more = ììží볎Ʞ... +common_msg_step_x_of_y = ëšê³ {0} ì€ {1} ë²ì§ž +common_severity_debug = ëë²ê·ž +common_severity_error = ìë¬ +common_severity_fatal = ì¹ëª ì ì€ë¥ +common_severity_info = ì 볎 +common_severity_warn = ê²œê³ +common_status_canceled = ì·šì +common_status_deferred = ì°êž° +common_status_failed = ì€íš +common_status_inprogress = ì§íì€ +common_status_nochange = ë³ê²œìì +common_status_partial = ë¶ë¶ë³ê²œ +common_status_success = ì±ê³µ +common_status_timedOut = íììì. +common_status_unknown = ìììì +common_title_acknowledged = ì¹ìž +common_title_add_column = ì»¬ëŒ ì¶ê° +common_title_add_graph_to_view = 몚ëí°ë³Žêž°ì ì°šížì¶ê° +common_title_add_portlet = í¬í늿 ì¶ê° +common_title_address = 죌ì +common_title_alerts = ê²œê³ +common_title_alerts_range = ê²œê³ ë²ì +common_title_ancestry = ê³íµ +common_title_availability = ê°ì©ì± +common_title_available_resources = ì¬ì© ê°ë¥í ìì +common_title_average_metrics = ë¶ë¹ íê· íµê³ +common_title_background = 배겜ì +common_title_bundle = ë²ë€ +common_title_bundles = ë²ë€ +common_title_category = 칎í ê³ ëŠ¬ +common_title_change_refresh_time = ìë¡ê³ 칚 죌Ʞ +common_title_columns = ì»¬ëŒ +common_title_compare_metrics = íµê³ ë¹êµ +common_title_compatibleGroups = íží ê°ë¥ 귞룹 +common_title_compatibleGroups_total = ìŽ íží ê°ë¥ 귞룹 +common_title_component_errors = 구ì±ìì ì€ë¥ +common_title_config_update_status = ì ë°ìŽíž ìí +common_title_configuration = í겜ì€ì +common_title_count = 칎ìŽíž +common_title_createTime = ìì± ìê° +common_title_custom = ì¬ì©ìì§ì +common_title_dashboard_name = ëì볎ë ìŽëŠ +common_title_dateCreated = ìì±ìŒ +common_title_dateRange = êž°ê° +common_title_default = êž°ë³žê° +common_title_definition = ì ì +common_title_definitions = ì ì +common_title_description = ì€ëª +common_title_details = ììž +common_title_display = íì +common_title_display_name = íìëª +common_title_duration = êž°ê° +common_title_edit = ížì§ +common_title_edit_mode = ížì§ 몚ë +common_title_enabled = íì±í +common_title_end = ì¢ ë£ +common_title_generalProp = ìŒë° ìì± +common_title_group = 귞룹 +common_title_group_def_total = ì 첎 귞룹 ì ì +common_title_group_member_health = ê·žë£¹ë©€ë² ìí +common_title_groups = 귞룹 +common_title_help = ëìë§ +common_title_host = ížì€íž +common_title_id = ID +common_title_id_parent = ë¶ëªšID +common_title_in_compliance = ì€ìì¬ë¶ +common_title_interval = ê°ê²© +common_title_inventory = ìžë²€í 늬 +common_title_inventorySummary = ìžë²€í 늬 ììœ +common_title_kind = ì¢ ë¥ +common_title_lastUpdated = ìµì¢ ì ë°ìŽíž +common_title_lastUpdatedBy = ìµì¢ ì ë°ìŽíž +common_title_ldapGroups = LDAP 귞룹 +common_title_mashup = 맀ìì +common_title_members_reporting = ë©€ë² ëŠ¬í¬íž +common_title_message = ë©ìì§ +common_title_metric = ìž¡ì í목 +common_title_metric_chart = íµê³ ì°šíž +common_title_mixedGroups = íŒí© 귞룹 +common_title_mixedGroups_total = ì 첎 íŒí© 귞룹 +common_title_name = ìŽëŠ +common_title_new_dashboard = ìë¡ìŽ ëì볎ë +common_title_numeric_metrics = ìì¹íµê³ +common_title_numeric_type = ì«ì ì í +common_title_operation = ìŽì +common_title_operation_status = ìŽì ìí +common_title_operations = ìŽì +common_title_operations_range = ìì ë²ì +common_title_over = Over +common_title_password = ë¹ë°ë²íž +common_title_path = ê²œë¡ +common_title_permissions = ê¶í +common_title_platform = íë«íŒ +common_title_platform_total = ì 첎 íë«íŒ +common_title_plugin = íë¬ê·žìž +common_title_port = í¬íž +common_title_providers = ê³µêžì +common_title_recent_alerts = ìµê·Œ ì늌 +common_title_recent_bundle_deployments = ìµê·Œ ë²ë€ ë°°í¬ +common_title_recent_configuration_updates = ìµê·Œ ì€ì ì ë°ìŽíž +common_title_recent_drifts = ìµê·Œ ë늬ííž +common_title_recent_event_counts = ìµê·Œ ìŽë²€íž ì +common_title_recent_measurements = ìµê·Œ ìž¡ì +common_title_recent_oob_metrics = ìµê·Œ ë²ì ìžì íµê³ +common_title_recent_operations = ìµê·Œ ìì +common_title_recent_pkg_history = ìµê·Œ íší€ì§ êž°ë¡ +common_title_recently_added = ìµê·Œ ì¶ê° ë +common_title_remove_column = ì»¬ëŒ ìì +common_title_repositories = ì ì¥ì +common_title_resource = 늬ìì€ +common_title_resourceGroups = 늬ìì€ ê·žë£¹ +common_title_resource_group = 늬ìì€ ê·žë£¹ +common_title_resource_id = 늬ìì€ ID +common_title_resource_inventory = 늬ìì€ ìžë²€í 늬 +common_title_resource_key = 늬ìì€ í€ +common_title_resource_name = 늬ìì€ëª +common_title_resource_type = 늬ìì€ ì í +common_title_resources = 늬ìì€ +common_title_results_count = 결곌 칎ìŽíž +common_title_results_count_tooltip = 결곌 칎ìŽíž íì +common_title_role = ìí +common_title_roles = ìí +common_title_scheduled_operations = ììœë ìì +common_title_search = ê²ì +common_title_selected_resources = ì íë ìì +common_title_server = ìë² +common_title_server_total = ì 첎 ìë² +common_title_service = ìë¹ì€ +common_title_service_total = ì 첎 ìë¹ì€ +common_title_settings = ì€ì +common_title_show = íì +common_title_sort_order = ì ë ¬ ìì +common_title_sort_order_tooltip = 결곌ì ì ë ¬ ìì륌 ì€ì +common_title_start = ìì +common_title_status = ìí +common_title_stop = ì ì§ +common_title_summary = ììœ +common_title_tag_cloud = íê·ž íŽëŒì°ë +common_title_the = +common_title_timestamp = ë ì§/ìê° +common_title_total = ìŽ +common_title_type = ì í +common_title_units = ëšì +common_title_user = ì¬ì©ì +common_title_users = ì¬ì©ì +common_title_value = ê° +common_title_version = ë²ì +common_title_view_mode = ë·° 몚ë +common_title_web_address = ì¹ ì£Œì +common_title_welcome = íì +common_unit_abbrev_bits = b +common_unit_abbrev_bytes = B +common_unit_abbrev_celsius = C +common_unit_abbrev_days = d +common_unit_abbrev_fahrenheight = F +common_unit_abbrev_gigabits = Gb +common_unit_abbrev_gigabytes = GB +common_unit_abbrev_hours = h +common_unit_abbrev_jiffys = j +common_unit_abbrev_kelvin = K +common_unit_abbrev_kilobits = Kb +common_unit_abbrev_kilobytes = KB +common_unit_abbrev_megabits = Mb +common_unit_abbrev_megabytes = MB +common_unit_abbrev_microseconds = us +common_unit_abbrev_milliseconds = ms +common_unit_abbrev_minutes = m +common_unit_abbrev_nanoseconds = ns +common_unit_abbrev_percentage = % +common_unit_abbrev_petabits = Pb +common_unit_abbrev_petabytes = PB +common_unit_abbrev_seconds = s +common_unit_abbrev_terabits = Tb +common_unit_abbrev_terabytes = TB +common_unit_days = ìŒ +common_unit_days2 = ìŒ +common_unit_hours = ìê° +common_unit_milliseconds = ë°ëŠ¬ ìŽ +common_unit_minute = ë¶ +common_unit_minutes = ë¶ +common_unit_months = ì +common_unit_seconds = ìŽ +common_unit_times = í +common_unit_weeks = 죌 +common_unit_years = ë +common_val_for = for +common_val_n1st = {0} ë² +common_val_n2nd = {0} ë² +common_val_n3rd = {0} ë² +common_val_na = N/A +common_val_never = ê²°ìœ +common_val_no = ìëì€ +common_val_no_lower = ìëì€ +common_val_none = ìì +common_val_nth = {0} ë² +common_val_yes = ì +common_val_yes_lower = ì +dataSource_ContentRepoTree_error_load = ì ì¥ì ë¡ë© ì€ë¥ +dataSource_ContentRepoTree_field_parentId = ë¶ëªš ID +dataSource_bundle_loadFailed = ë²ë€ ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€. +dataSource_configurationHistory_clickToSeeError = ëëž íŽëŠíì¬ ì€ë¥ë©ìì§ë¥Œ íìžíììì€ +dataSource_configurationHistory_currentConfig = ìŽê²ì íì¬ ì€ì ì ëë€. +dataSource_configurationHistory_dateCompleted = ìë£ìŒ +dataSource_configurationHistory_dateSubmitted = ë°íìŒ +dataSource_configurationHistory_error_fetchFailure = ì€ì êž°ë¡ì ë¡ëí ì ììµëë€. +dataSource_configurationHistory_updateType = ê°±ì ì í +dataSource_configurationHistory_updateType_group = 귞룹 +dataSource_configurationHistory_updateType_individual = ê°ìž +dataSource_definitions_loadFailed = ìž¡ì í목 ì ì륌 ë¡ëíì§ ëª»íìµëë€. +dataSource_measurementOob_error_fetchFailure = ë²ì ìžë¶ ì 볎ì ìž¡ì ì ë¡ëíëë° ì€íšíìµëë€. +dataSource_measurementOob_field_factor = ë²ì ìžë¶ í©í° (%) +dataSource_measurementOob_field_formattedBaseband = ë°Žë +dataSource_measurementOob_field_formattedOutlier = ììëŒìŽë +dataSource_measurementOob_field_parentName = ë¶ëªš +dataSource_measurementOob_field_resourceName = ìì +dataSource_measurementOob_field_scheduleName = ìž¡ì í목 +dataSource_operationHistory_error_fetchFailure = ì€íŒë ìŽì êž°ë¡ ë¡ë ì€íš. +dataSource_operationHistory_field_createdTime = ìì± ìê° +dataSource_operationHistory_field_operationName = ìì ìŽëŠ +dataSource_operationHistory_field_startedTime = ìì ìê° +dataSource_operationHistory_field_subject = ìì²ì +dataSource_operationSchedule_field_description = ë žíž +dataSource_operationSchedule_field_id = ìŒì ID +dataSource_operationSchedule_field_nextFireTime = ë€ì ì€í +dataSource_operationSchedule_field_operationDisplayName = ìŽì +dataSource_operationSchedule_field_operationName = ìŽì +dataSource_operationSchedule_field_subject = ìì ì +dataSource_operationSchedule_field_timeout = íììì (ìŽ) +dataSource_platforms_field_cpu = CPU +dataSource_platforms_field_memory = ë©ëªšëŠ¬ +dataSource_platforms_field_swap = ì€ì +dataSource_problemResources_error_fetchFailure = ê²œê³ /ë¹ê°ì©ì± ììì ë¡ëì ì€íšíìµëë€. +dataSource_problemResources_field_available = íì¬ ê°ì©ì± +dataSource_recentOperations_error_fetchFailure = ìµê·Œ ìë£ë ììì ë¡ëì ì€íšíìµëë€. +dataSource_recentOperations_field_location = ìì¹ +dataSource_recentOperations_field_operation = ìŽì +dataSource_recentOperations_field_resource = ìì +dataSource_recentOperations_field_status = ìí +dataSource_resourceErrors_clickStatusIcon = ììží ëŽì©ì ììŽìœì íŽëŠíììì +dataSource_resourceErrors_deleteFailure = ìì ìë¬ ìì ì ì€íšíìµëë€. +dataSource_resourceErrors_deleteSuccess = [{0}] 늬ìì€ ìë¬ ë©ìì§ë¥Œ ìì íëë° ì±ê³µíìµëë€. +dataSource_resourceErrors_error_fetchFailure = [{0}] ID륌 ê°ì§ ììì ìë¬ë¥Œ ì°Ÿëë° ì€íšíìµëë€. +dataSource_resourceErrors_field_errorType = ìë¬ íì +dataSource_resourceErrors_field_summary = ììœ +dataSource_resourceErrors_field_timeOccured = ìê° +dataSource_resourceGroups_loadFailed = ìì 귞룹 ë¡ëì ì€íšíìµëë€. +dataSource_resources_field_discoveryTime = ë°ê²¬ ìê° +dataSource_resources_field_importTime = ê°ì žì€êž° ìê° +dataSource_resources_field_key = í€ +dataSource_resources_field_lastModifiedTime = ìµì¢ ìì ìê° +dataSource_resources_field_lastModifier = ìµì¢ ìì ì +dataSource_resources_field_location = ìì¹ +dataSource_rpc_error_transformRequestFailure = {0} ìì²ì ì²ëŠ¬íë ëì ë°ìŽí° ìì€ìì ì€íš. +dataSource_rpc_error_unsupportedArrayFilterType = ì í {0}ì ë°°ìŽ íí° íµê³Œë¥Œ ì§ìíì§ ììµëë€ +dataSource_rpc_error_unsupportedEnumType = RPCDataSource.getEnumArray(Class)ì enum {0}ì ëí ì ì í ìœëëžë¡ì ì¶ê°íììì. +dataSource_rpc_no = ìëì€ +dataSource_rpc_yes = ì +dataSource_scheduledOperations_error_fetchFailure = ììœë ìì ë¡ëì ì€íšíìµëë€. +dataSource_scheduledOperations_field_location = ìì¹ +dataSource_scheduledOperations_field_operation = ìŽì +dataSource_scheduledOperations_field_resource = ìì +dataSource_schedules_disableFailure_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] íµê³ ìì§ì íŽì íëë° ì€íšíìµëë€. íì±íë íµê³ë [{2}]ì ëë€ +dataSource_schedules_disableFailure_resource = ID [{1}]ì ê°ì§ ììì [{0}] íµê³ ìì§ì íŽì íëë° ì€íšíìµëë€. íì±íë íµê³ë [{2}]ì ëë€ +dataSource_schedules_disableSuccessful_concise = [{0}] ìž¡ì ìì§ì íŽì íìµëë€ +dataSource_schedules_disableSuccessful_full_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] íµê³ ìì§ì íŽì íìµëë€. ë¹íì±íë íµê³ë [{2}]ì ëë€ +dataSource_schedules_disableSuccessful_full_resource = ID [{1}]ì ê°ì§ ììì [{0}] íµê³ ìì§ì íŽì íìµëë€. ë¹íì±íë íµê³ë [{2}]ì ëë€ +dataSource_schedules_enableFailure_group = ID [{1}]ì ê°ì§ 귞룹ì ëí [{0}] íµê³ ìì§ì íì±ííëë° ì€íšíìµëë€. íµê³ë [{2}]ì ëë€ +dataSource_schedules_enableFailure_resource = ID [{1}]ì ê°ì§ 늬ìì€ì ëí [{0}] íµê³ ìì§ì íì±ííëë° ì€íšíìµëë€. íµê³ë [{2}]ì ëë€ +dataSource_schedules_enableSuccessful_concise = [{0}] ìž¡ì ìì§ì íì±ííìµëë€ +dataSource_schedules_enableSuccessful_full_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] ìž¡ì ìì§ì íì±ííìµëë€. íì±íë ìž¡ì ì [{2}]ì ëë€ +dataSource_schedules_enableSuccessful_full_resource = ID [{1}]ì ê°ì§ ììì [{0}] ìž¡ì ìì§ì íì±ííìµëë€. íì±íë ìž¡ì ì [{2}]ì ëë€ +dataSource_schedules_field_resourceGroupId = 귞룹 ID +dataSource_schedules_loadFailed = íµê³ ìŒì ë¡ëì ì€íšíìµëë€. +dataSource_schedules_loadFailedContext = 컚í ì€íž [{0}]ì ëí íµê³ ìŒì ë¡ëì ì€íšíìµëë€. +dataSource_schedules_loadFailedCriteria = êž°ì€ ì¡°ê±Ž [{0}]ì ëí íµê³ ìŒì ë¡ëì ì€íšíìµëë€. +dataSource_schedules_updateFailure_group = ID [{1}]ì ê°ì§ 늬ìì€ ê·žë£¹ìì [{0}] íµê³ ìì§ ê°ê²© ì€ì ì ì€íšíìµëë€. íµê³ë [{2}], ìì§ ê°ê²©ì [{3}]ìŽ ìŽììµëë€. +dataSource_schedules_updateFailure_resource = ID [{1}]ì ê°ì§ ììì [{0}] íµê³ ìì§ ê°ê²© ì€ì ì ì€íšíìµëë€. íµê³ë [{2}], ìì§ ê°ê²©ì [{3}]ìŽ ìŽììµëë€. +dataSource_schedules_updateSuccessful_concise = [{0}]ìŽ ìë¡ìŽ ìì§ê±°ëŠ¬ê° [{1}] ìž¡ì ì ì€ì ëììµëë€. +dataSource_schedules_updateSuccessful_full_group = [{0}]ìŽ ìë¡ìŽ ìì§ê±°ëŠ¬ê° ID [{2}]ì ê°ì§ 늬ìì€ ê·žë£¹ì [{1}] ìž¡ì ìŒë¡ ì€ì ëììµëë€. ì ë°ìŽíž ë ìž¡ì ì [{3}]ì ëë€. +dataSource_schedules_updateSuccessful_full_resource = [{0}]ìŽ ìë¡ìŽ ìì§ê±°ëŠ¬ê° ID [{2}]ì ê°ì§ ììì [{1}] ìž¡ì ìŒë¡ ì€ì ëììµëë€. ì ë°ìŽíž ë ìž¡ì ì [{3}]ì ëë€. +dataSource_traits_failFetch = êž°ì€ ì¡°ê±Ž [{0}]ì ëí í¹ì±ì ìžì¶íëë° ì€íšíìµëë€. +dataSource_traits_field_definitionID = ì ì ID +dataSource_traits_field_lastChanged = ìµì¢ ì ë°ìŽíž +dataSource_traits_field_primaryKey = êž°ë³ží€ +dataSource_traits_field_trait = í¹ì± +dataSource_traits_group_field_groupId = 귞룹 ID +dataSource_users_delete = ìì ë ì¬ì©ì [{0}] +dataSource_users_deleteFailed = ì¬ì©ì [{0}]ì ìì ì ì€íšíìµëë€. +dataSource_users_field_department = ë¶ë¬ž +dataSource_users_field_emailAddress = ìŽë©ìŒ 죌ì +dataSource_users_field_factive = ë¡ê·žìž íì±í? +dataSource_users_field_firstName = ìŽëŠ +dataSource_users_field_id = ID +dataSource_users_field_lastName = ì± +dataSource_users_field_ldap = LDAP ë¡ê·žìž? +dataSource_users_field_name = ì¬ì©ì ìŽëŠ +dataSource_users_field_passwordVerify = ìíž íìž +dataSource_users_field_phoneNumber = ì í ë²íž +dataSource_users_invalidEmailAddress = ì못ë ìŽë©ìŒ 죌ì +dataSource_users_passwordsDoNotMatch = ë¹ë°ë²ížê° ìŒì¹íì§ ìì +datasource_roles_field_ldapGroups = LDAP 귞룹 +datasource_roles_field_subjects = 죌ì +datasource_templateSchedules_disabled = ì íë íµê³ [{0}]ì ìì§ì íŽì íìµëë€. +datasource_templateSchedules_disabled_detailed = ID [{2}]륌 ê°ì§ ìì ì íì ìíŽ êž°ë³žì ìŒë¡ íµê³ [{0}] [{1}]ì ìì§ì íŽì íìµëë€. +datasource_templateSchedules_disabled_failed = ID [{2}]륌 ê°ì§ ìì ì íì ìíŽ êž°ë³žì ìŒë¡ íµê³ [{0}] [{1}]ì ìì§ì íŽì íëë° ì€íšíìµëë€. +datasource_templateSchedules_enabled = ì íë íµê³ [{0}]ì ìì§ì íì±ííìµëë€. +datasource_templateSchedules_enabled_detailed = ID [{2}]륌 ê°ì§ ìì ì íì ìíŽ êž°ë³žì ìŒë¡ íµê³ [{0}] [{1}]ì ìì§ì íì±ííìµëë€. +datasource_templateSchedules_enabled_failed = ID [{2}]륌 ê°ì§ ìì ì íì ìíŽ êž°ë³žì ìŒë¡ íµê³ [{0}] [{1}]ì ìì§ì íì±ííëë° ì€íšíìµëë€. +datasource_templateSchedules_updated = ì íë íµê³ [{0}]ì ìì§ ê°ê²©ì ê°±ì íìµëë€. +datasource_templateSchedules_updated_detail = ID [{2}]륌 ê°ì§ ìì ì íì ìíŽ êž°ë³žì ìŒë¡ íµê³ [{0}] [{1}]ì ìì§ ê°ê²©ìŽ [{3}]ìŽë¡ ì€ì ëììµëë€. +datasource_templateSchedules_updated_failed = ID [{2}]륌 ê°ì§ ìì ì íì ìíŽ êž°ë³žì ìŒë¡ íµê³ [{0}] [{1}]ì ìì§ ê°ê²©ìŽ [{3}]ìŽë¡ ì€ì ëëë° ì€íšíìµëë€. +favorites = ìŠê²šì°Ÿêž° +favorites_groups = ìŠê²šì°Ÿêž° 귞룹 +favorites_recentlyViewed = ìµê·Œì 볞 í목 +favorites_resources = ìŠê²šì°Ÿêž° 늬ìì€ +filter_from_date = ìì +filter_to_date = ì¢ ë£ +group_tree_groupOfResourceType = Group of [{0}] +group_tree_partialClusterTooltip = {1} ì€ {0} 귞룹 ë©€ë²ê° ''{2}'' ììì ê°ì§ê³ ììµëë€. +search_failed_to_retrieve_saved_search = ì ì¥ë ê²ìì ê²ìíì§ ëª»íìµëë€ +search_failed_to_retrieve_search_suggestion = ì¶ì² ê²ììŽë¥Œ ê²ìíì§ ëª»íìµëë€ +search_failed_to_save_search = ê²ìì ì ì¥íì§ ëª»íìµëë€: {0} +search_invalid_search_expression = ì못ë ê²ì íí. +search_name_your_search = ê²ì ìŽëŠ +search_successfully_saved_search = ì±ê³µì ìŒë¡ ì ì¥ë ê²ì: {0} +util_ancestry_parentAncestry = ë¶ëªšì ì¡°ì: +util_errorHandler_nullException = ììžë nullìŽììµëë€. +util_monitoringRequestCallback_error_checkServerStatusFailure = ë¡ê·žìž ìí륌 íìží ì ììµëë€ - ìë²ì ìí륌 íìžíììì +util_rpcManager_activeRequests = {0} íì±í ìì² +util_userPerm_loadFailGlobal = êžë¡ë² ê¶íì ë¡ëíëë° ì€íšíìµëë€ - ì묎ê²ë íì©ëì§ ììµëë€. +util_userPerm_loadFailGroup = ID [{0}] 늬ìì€ ê·žë£¹ì ëí ê¶íì ë¡ëíëë° ì€íšíìµëë€ - ì묎ê²ë íì©ëì§ ììµëë€. +util_userPerm_loadFailResource = ID [{0}] 늬ìì€ì ëí ê¶íì ë¡ëíëë° ì€íšíìµëë€ - ì묎ê²ë íì©ëì§ ììµëë€. +util_userSession_loadFailSubject = UserSessionManager: ì¬ì©ì Subject ë¡ëì ì€íšíìµëë€. +util_userSession_logoutFail = ë¡ê·žììì ì€íšíìµëë€ +util_widgetsField_unlimited = 묎ì í +view_aboutBox_allRightsReserved = All Rights Reserved. +view_aboutBox_buildNumber = ë¹ë ë²íž: +view_aboutBox_failedToLoad = ì í ì 볎ì ë¡ëì ì€íšíìµëë€.. +view_aboutBox_homepage = ííìŽì§ +view_aboutBox_jbossByRedHat = JBoss by Red Hat +view_aboutBox_title = {0}ì êŽíì¬ +view_aboutBox_version = ë²ì : +view_adminConfig_agentPlugins = ììŽì íž íë¬ê·žìž +view_adminConfig_alertDefTemplates = 겜볎 ì ì í í늿 +view_adminConfig_downloads = ë€ìŽë¡ë +view_adminConfig_driftDefTemplates = ë늬ííž ì ì í í늿 +view_adminConfig_metricTemplates = íµê³ ìì§ í í늿 +view_adminConfig_serverPlugins = ìë² íë¬ê·žìž +view_adminConfig_systemSettings = ìì€í ì€ì +view_adminContent_contentSources = 컚í ìž ìì€ +view_adminRoles_assignedGroups = í ë¹ë ìì 귞룹 +view_adminRoles_assignedSubjects = í ë¹ë Subjects +view_adminRoles_failCreateRoleWithExistingName = êž°ì¡Ž ìŽëŠ [{0}]곌 ìí ì ë§ë€ì§ 못íìµëë€. ë€ë¥ž ìŽëŠì ì¬ì©íììì€. +view_adminRoles_failLdap = LDAPìŽ ì€ì ëìëì§ ì¬ë¶ì ê²°ì ì ì€íšíìµëë€ - LDAPìŽ ìë ê²ì ê°ì í©ëë€. +view_adminRoles_failLdapGroups = ì¬ì©ê°ë¥í LDAP 귞룹ì ìœëë° ì€íšíìµëë€ - LDAP ê·žë£¹ìŽ ìë ê²ì ê°ì í©ëë€. +view_adminRoles_failLdapGroupsRole = ìí ì ìíŽ ì¬ì©ê°ë¥í LDAP 귞룹ì ë¡ëíëë° ì€íšíìµëë€. +view_adminRoles_failRoles = ìí ì ê±°ì ì€íšíìµëë€. +view_adminRoles_globalPerms = êžë¡ë² ê¶í +view_adminRoles_ldapGroups = LDAP 귞룹 +view_adminRoles_ldapGroupsReadOnly = LDAP 귞룹 ë°ìŽí°ë ìœêž° ì ì©ì ëë€. +view_adminRoles_noLdap = LDAP 볎ì íµí©ìŽ ì€ì ëì§ ìììµëë€. LDAPì 구ì±íë €ë©Ž <a {0}>{1}</a>ë¡ ê°ììì. +view_adminRoles_permissions_autoselecting_configureRead_implied = CONFIGURE_WRITE ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž CONFIGURE_READê° ìë ê²ìŽ ê·žê²ì ììíê³ ìêž° ë묞ì ëë€. +view_adminRoles_permissions_autoselecting_configureWrite_implied = CONFIGURE_READ ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž CONFIGURE_WRITEê° ê·žê²ì ììíê³ ìêž° ë묞ì ëë€. +view_adminRoles_permissions_autoselecting_manageInventory_implied = ì ííì§ ìì 늬ìì€ ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž MANAGE_INVENTORY 몚ë 늬ìì€ ì¬ì© ê¶íì ììíê³ ìêž° ë묞ì ëë€. +view_adminRoles_permissions_autoselecting_manageSecurity_implied = ì ííì§ ìì ê¶íìŽ ìëìŒë¡ ì íëììµëë€. ìëíë©Ž MANAGE_SECURITY ë€ë¥ž 몚ë ê¶íì ììíê³ ìêž° ë묞ì ëë€. +view_adminRoles_permissions_globalPermissions = êžë¡ë² ê¶í +view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelection = {0} ìœêž° ê¶íì ì í íŽì í ì ììµëë€. ìœêž° ê¶íì ììíë {0} ì°êž° ê¶íìŽ ëšŒì ì í íŽì ëìŽìŒ ê·žê²ì ìíí ì ììµëë€. +view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} ê¶íì ì í íŽì í ì ììµëë€. ë€ë¥ž 몚ë ììì ììíë êŽëŠ¬ ìžë²€í ëŠ¬ê° ëšŒì ì í íŽì ëìŽìŒ ê·žê²ì ìíí ì ììµëë€. +view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} ê¶íì ì í íŽì í ì ììµëë€. ë€ë¥ž 몚ë ê¶íì ììíë êŽëŠ¬ 볎ì ê¶íìŽ ëšŒì ì í íŽì ëìŽìŒ ê·žê²ì ìíí ì ììµëë€. +view_adminRoles_permissions_isAuthorized = ê¶íìŽ ììµëê¹? +view_adminRoles_permissions_isRead = ìœêž°ì ëê¹? +view_adminRoles_permissions_isWrite = ì°êž°ì ëê¹? +view_adminRoles_permissions_permDesc_manageBundles = íë¡ì§ë²ë ë²ë€ ë§ë€êž°, ì ë°ìŽíž, ìì ê° ê°ë¥í©ëë€. (ë구ë ììì ìŒë¡ ìŽëê°ë¥) +view_adminRoles_permissions_permDesc_manageInventory = 몚ë ììì 몚ë ìì ê¶íì ê°ìµëë€. ìŠ, 귞룹ì ìì±, ìì , ìëê°ì§ ëë ìëìŒë¡ ê²ì¶ë ììì ê°ì žì¬ì ììµëë€. +view_adminRoles_permissions_permDesc_manageRepositories = ì¬ì©ì ì ì¥ì ë§ë€êž°, ì ë°ìŽíž, ìì ê° ê°ë¥. (ë구ë ì ì¥ì륌 ë§ë€ì ìì) 컚í ìž ìì€ì ì ì¥ìë ì°ê²°ìŽ ê°ë¥í©ëë€. +view_adminRoles_permissions_permDesc_manageSecurity = ì¬ì©ì ë° ìí ë§ë€êž°, ì ë°ìŽíž, ìì , êž°í 몚ë ê¶íìŽ ììµëë€. +view_adminRoles_permissions_permDesc_manageSettings = {0} ìë²ì ìì ë° ëªšë ìë² êŽë š êž°ë¥ì ìíí ì ììµëë€. +view_adminRoles_permissions_permDesc_viewUsers = ë€ë¥ž ì¬ì©ì륌 볌 ì ììµëë€. ê·žë¬ë ê·žë€ìê² í ë¹ë ìí ì 볎ìŽì§ ììµëë€. +view_adminRoles_permissions_permReadDesc_configure = ìì ì€ì ë° ìì ì€ì ìì êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_control = (ììì ) ì¬ì© ê°ë¥í ëª ë ¹; ìì ì€í êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_createChildResources = (ììì ) ìì 늬ìì€ ë§ë€êž° êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_deleteChildResources = (ììì ) ìì 늬ìì€ ìì êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_inventory = (ììì ) ìì ìì± (ìŽëŠ, ì€ëª , ë²ì , êž°í.), ì°ê²° ì€ì , ì°ê²° ì€ì êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_manageAlerts = (ììì ) ê²œê³ ì ì ë° ê²œê³ êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_manageContent = (ììì ) ì€ì¹ëìŽ ì¬ì©ê°ë¥í íší€ì§; íší€ì§ ì€ì¹ êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_manageDrift = (ììì ) ë늬ííž ì ìì ë늬ííž êž°ë¡ ë³Žêž° +view_adminRoles_permissions_permReadDesc_manageEvents = (ììì ) ìŽë²€íž 볎Ʞ +view_adminRoles_permissions_permReadDesc_manageMeasurements = (ììì ) íµê³ ë°ìŽí° ë° ìì§ ì€ìŒì¥Ž 볎Ʞ +view_adminRoles_permissions_permWriteDesc_configure = ìì ì€ì ì ë°ìŽíž; ìì ì€ì ìì êž°ë¡ ìì +view_adminRoles_permissions_permWriteDesc_control = ëª ë ¹ ì€í; ìì ì€í êž°ë¡ ìì +view_adminRoles_permissions_permWriteDesc_createChildResources = (ìì± ê°ë¥í ì íì ìì 늬ìì€ì ëí) ìë¡ìŽ ìì 늬ìì€ ë§ë€êž° +view_adminRoles_permissions_permWriteDesc_deleteChildResources = ìì ì ê±° ìžë²€í 늬; (ìì ê°ë¥í ì íì ììì ëí) 늬ìì€ ìì +view_adminRoles_permissions_permWriteDesc_inventory = ììì ìŽëŠ, ë²ì , ì€ëª , ì°ê²° ì€ì ì ë°ìŽíž; ì°ê²° ì€ì êž°ë¡ ìì +view_adminRoles_permissions_permWriteDesc_manageAlerts = ê²œê³ ì ì륌 ë§ë€êž°, ìì , ìì ; ê²œê³ êž°ë¡ íìž ë° ìì +view_adminRoles_permissions_permWriteDesc_manageContent = 컚í ìž ìì€ ë±ë¡; íší€ì§ ì€ì¹ ë° ì ê±° +view_adminRoles_permissions_permWriteDesc_manageDrift = ë늬ííž ì ì ë§ë€êž°, ìì , ìì ; ë늬ííž ìžì€íŽì€ êŽëŠ¬ +view_adminRoles_permissions_permWriteDesc_manageEvents = ìŽë²€íž ìì +view_adminRoles_permissions_permWriteDesc_manageMeasurements = íµê³ ìì§ ì€ìŒì¥Ž ìì +view_adminRoles_permissions_perm_configure = êµ¬ì± +view_adminRoles_permissions_perm_control = ì ìŽ +view_adminRoles_permissions_perm_createChildResources = ìì 늬ìì€ ë§ë€êž° +view_adminRoles_permissions_perm_deleteChildResources = ìì 늬ìì€ ìì +view_adminRoles_permissions_perm_inventory = ìžë²€í 늬 +view_adminRoles_permissions_perm_manageAlerts = ê²œê³ êŽëŠ¬ +view_adminRoles_permissions_perm_manageBundles = ë²ë€ êŽëŠ¬ +view_adminRoles_permissions_perm_manageContent = 컚í ìž êŽëŠ¬ +view_adminRoles_permissions_perm_manageDrift = ë늬ííž êŽëŠ¬ +view_adminRoles_permissions_perm_manageEvents = ìŽë²€íž êŽëŠ¬ +view_adminRoles_permissions_perm_manageInventory = ìžë²€í 늬 êŽëŠ¬ +view_adminRoles_permissions_perm_manageMeasurements = ìž¡ì êŽëŠ¬ +view_adminRoles_permissions_perm_manageRepositories = ì ì¥ì êŽëŠ¬ +view_adminRoles_permissions_perm_manageSecurity = 볎ì êŽëŠ¬ +view_adminRoles_permissions_perm_manageSettings = ì€ì êŽëŠ¬ +view_adminRoles_permissions_perm_viewUsers = ì¬ì©ì 볎Ʞ +view_adminRoles_permissions_read = ìœêž°: +view_adminRoles_permissions_readAccessImplied = {0} ê¶íì ëí ìœêž° ììžì€ë¥Œ ììíŽ íŽì í ì ììµëë€. +view_adminRoles_permissions_resourcePermissions = ìì ê¶í +view_adminRoles_permissions_write = ì°êž°: +view_adminRoles_resourcePerms = 늬ìì€ ê¶í +view_adminRoles_roleAdded = ìí [{0}]ìŽ ì¶ê°ëììµëë€. +view_adminRoles_roleDeleteFailed = ìí [{0}]ì ìì ì ì€íšíìµëë€. +view_adminRoles_roleDeleted = ìí [{0}]ìŽ ìì ëììµëë€. +view_adminRoles_roleUpdateFailed = ìí [{0}]ì ì ë°ìŽížì ì€íšíìµëë€. +view_adminRoles_roleUpdated = ìí [{0}]ê° ì ë°ìŽížëììµëë€. +view_adminTemplates_definedBy = ì ì +view_adminTemplates_disabledTemplates = ë¹íì±íë í í늿 +view_adminTemplates_editAlertTemplate = ê²œê³ í í늿 ížì§ +view_adminTemplates_editTemplates = í í늿 ížì§ +view_adminTemplates_enabledTemplates = íì±íë í í늿 +view_adminTemplates_platformServices = íë«íŒ ìë¹ì€ +view_adminTemplates_platforms = íë«íŒ +view_adminTemplates_pluginTemplates = íë¬ê·žìž í í늿 +view_adminTemplates_prompt_disabledAlertTemplates = ìŽ ìì ì íì ëíŽ ìì±íì§ë§ ë¹íì±íë ê²œê³ í í늿 ì +view_adminTemplates_prompt_disabledMetricTemplates = ìŽ ìì ì íì ëíŽ êž°ë³žì ìŒë¡ ë¹íì±íë íµê³ ìŒì ì +view_adminTemplates_prompt_enabledAlertTemplates = ìŽ ìì ì íì ëíŽ íì±íë ê²œê³ í í늿 ì +view_adminTemplates_prompt_enabledMetricTemplates = ìŽ ìì ì íì ëíŽ êž°ë³žì ìŒë¡ íì±íë íµê³ ìŒì ì +view_adminTemplates_servers = ìë² +view_adminTemplates_userTemplates = ì¬ì©ì í í늿 +view_adminTopology_affinityGroups = ì ížë 귞룹 +view_adminTopology_agents = ììŽì íž +view_adminTopology_partitionEvents = ìŽë²€íž ë²ì£Œ +view_adminTopology_remoteAgentInstall = ì격 ììŽì íž ì€ì¹ +view_adminTopology_servers = ìë² +view_adminUsersDetails_dataTypeName = ì¬ì©ì +view_adminUsers_failCreateUserWithExistingName = êž°ì¡Ž ìŽëŠ [{0}]곌 ì¬ì©ì륌 ë§ë€ì§ 못íìµëë€. ë€ë¥ž ìŽëŠì ì¬ì©íììì€. +view_admin_administration = êŽëŠ¬ +view_admin_configuration = êµ¬ì± +view_admin_content = ìœí ìž +view_admin_downloads_agentDownload = ììŽì íž ë€ìŽë¡ë +view_admin_downloads_agent_buildNumber = ììŽì íž ë¹ë +view_admin_downloads_agent_help = <p> ìŽê²ì {0} ììŽì ížì ì ë°ìŽíž jar íìŒì ëë€. ìŽ jar íìŒì 목ì ì ì¬ì©ìê° ììŽì ížê° ìë ìì€í ì ì ììŽì ížë¥Œ ì€ì¹í ì ìëë¡ íë ê²ìŒë¡, ìŽë¯ž ì€ì¹ë ììŽì ížë¥Œ ì ë°ìŽíž í ì ìëë¡ íêž° ìíŽìì ëë€. ììží ëŽì©ì, ë€ìŽë¡ë ë°ì ììŽì íž jarìì ë€ì곌 ê°ìŽ --help ëª ë ¹ ìµì ì ë¶ì¬ ì€ííììì€.<br/> <b>java -jar <agent-download.jar> --help</b> </p> <h3>ììŽì íž ì€ì¹</h3> <p> <b>java -jar <agent-download.jar> --install[=<ì ììŽì íž ëë í 늬>]</b><br/> ìŽ ëª ë ¹ì ìë¡ìŽ ììŽì ížë¥Œ ì€ì¹í©ëë€. ë§ìœ ìë¡ìŽ ëë í 늬륌 ì§ì íì§ ììŒë©Ž Ʞ볞ê°ì "."ì ëë€.</p> <h3>ììŽì íž ì ë°ìŽíž</h3> <p> <b>java -jar <agent-download.jar> --update[=<ìŽì ììŽì íž ëë í 늬>]</b><br/> ìŽê²ì ìŽë¯ž ì€ì¹ë êž°ì¡Žì ììŽì í žë¥Œ ì ë°ìŽíží©ëë€. ë§ìœ ìŽì ì êž°ì¡Ž ììŽì ížê° ì€ì¹ë ëë í 늬륌 ì§ì íì§ ìììŒë©Ž "rhq-agent" ëë í ëŠ¬ë¡ ì¶ì ë©ëë€. </p> +view_admin_downloads_agent_link_value = ììŽì íž {0} ({1})ì ë€ìŽë¡ë +view_admin_downloads_agent_loadError = ììŽì ížì ë²ì ì 볎륌 ê°ì žì¬ ì ììµëë€. +view_admin_downloads_agent_md5 = ììŽì íž MD5 +view_admin_downloads_agent_version = ììŽì íž ë²ì +view_admin_downloads_bundleDownload = ë²ë€ Deployer ë€ìŽë¡ë +view_admin_downloads_bundle_help = <p> ìŽê²ì ë²ë€ Deployer ë구ì ëë€. ê·žê²ì ë구ìì {0} ë²ë€ ë° íší€ì§ ê°ë°ìì ìíŽ ì¬ì©ë©ëë€. ìŽ ë 늜 ì€íí ë구륌 ì¬ì©íë©Ž ë²ë€ìŽë ìœììì ì ì¡°ë²ì í ì€íž í ì ììµëë€. </p> +view_admin_downloads_bundle_link_value = ë²ë€ Deployer {0} ë€ìŽë¡ë +view_admin_downloads_bundle_loadError = ë²ë€ deployer ì 볎륌 ê°ì žì¬ ì ììµëë€. +view_admin_downloads_cliAlertScriptsDownload = CLI ê²œê³ ì€í¬ëŠœíž ë€ìŽë¡ë +view_admin_downloads_cliAlertScripts_help = CLI ê²œê³ ì€í¬ëŠœížë ì€í¬ëŠœíž ë ê²œê³ ë¥Œ ë§ëëë° ì¬ì©í ì ìë 믞늬 ìì±ë ì€í¬ëŠœížì ëë€.ìŒë°ì ìŒë¡ ì€í¬ëŠœížë í¹ì ê²œê³ ì ìì ëí íµì§ë¡ ì¬ì©íêž° ìíŽìë 믞늬 ì¡°ì ì íŽìŒ í©ëë€. +view_admin_downloads_cliAlertScripts_loadError = ë€ìŽë¡ë íëë° ì¬ì©í ì ìë CLI ê²œê³ ì€í¬ëŠœížì ììžì€ í ì ììµëë€. +view_admin_downloads_cliAlertScripts_none = ë€ìŽë¡ë íëë° ì¬ì©í ì ìë CLI ê²œê³ ì€í¬ëŠœížê° íëë ììµëë€. +view_admin_downloads_cliDownload = 컀맚ë ëŒìž íŽëŒìŽìžíž ë€ìŽë¡ë +view_admin_downloads_cli_buildNumber = CLI ë¹ë +view_admin_downloads_cli_help = <p> ìŽê²ì 컀맚ë ëŒìž íŽëŒìŽìžíž ëêµ¬ë¡ CLIëŒê³ ë í©ëë€. ìœììì ì€ííë ë 늜í ë구ìì {0} ìë²ì 컀맚ë ëŒìž ìží°íìŽì€ë¥Œ ì ê³µí©ëë€. ìëíë ìì ì ìííë CLIë run ì€í¬ëŠœížë¥Œ íµíŽ ëª ë ¹ì ížì¶í ì ììµëë€. CLIì ì€ì¹ ë°©ë² ë° ì¬ì© ë°©ë²ì ëí ììží ëŽì©ì 묞ì륌 ì°žì¡°íììì€. </p> +view_admin_downloads_cli_link_value = CLI {0} ({1}) ë€ìŽë¡ë +view_admin_downloads_cli_loadError = CLI ë²ì ì 볎륌 ê°ì žì¬ ì ììµëë€. +view_admin_downloads_cli_md5 = CLI MD5 +view_admin_downloads_cli_version = CLI ë²ì +view_admin_downloads_connectorsDownload = 컀ë¥í° ë€ìŽë¡ë +view_admin_downloads_connectors_help = 컀ë¥í° ì íì {0}ìì êŽëŠ¬ ê°ë¥íêž° ë묞ì íìí ìíížìšìŽì ëë€. {0} ììŽì ížê° íµì í ì ìëë¡ êŽëŠ¬ì íì 컀ë¥í°ë¥Œ ì€ì¹í©ëë€. ììží ëŽì©ì 묞ì륌 ì°žì¡°íììì€. +view_admin_downloads_connectors_loadError = 컀ë¥í° ì 볎륌 ê°ì žì¬ ì ììµëë€ +view_admin_downloads_connectors_none = ë€ìŽë¡ë륌 ìí 컀ë¥í°ë¥Œ ì°Ÿì ì ììµëë€ +view_admin_downloads_scriptModulesDownload = ì€í¬ëŠœíž 몚ë ë€ìŽë¡ë +view_admin_downloads_scriptModules_help = <p> ì€í¬ëŠœíž 몚ëì (ê²œê³ ì€í¬ëŠœížë CLI ì€í¬ëŠœížì€) ë¹ì ìŽ ë§ë ì€í¬ëŠœížì ì¬ì©í ì ìë RHQìì ì ê³µíë ì¬ì¬ì© ê°ë¥í 구ì±ììì ëë€. ì íí ì€í¬ëŠœíž ìžìŽ (ìë°ì€í¬ëŠœíž, ìŠ "íìí" êž°ë¥ì ì¬ì©í©ëë€) ìì "rhq://downloads/<module-name-without-file-extension>" URI륌 ì¬ì©íì¬ ì¡ìžì€ í ì ììµëë€. </p> +view_admin_downloads_scriptModules_loadError = ì¬ì© ê°ë¥í ì€í¬ëŠœíž 몚ë 목ë¡ì ë¡ëí ì ììµëë€ +view_admin_downloads_scriptModules_none = ìŽë€ ì€í¬ëŠœíž 몚ëì ë€ìŽë¡ë í ì ììµëë€ +view_admin_landing = ìŽ ë¶ë¶ìì {0} ì ì ì€ì ì êŽëŠ¬í©ëë€. ìŽê²ì 볎ì 구ì±, íë¬ê·žìž ì€ì , {0} ìë² ë° ììŽì íž êŽëŠ¬ë¥Œ í¬íší©ëë€. +view_admin_measTemplates_updateExisting_title = êž°ì¡Ž ìŒì ì ë°ìŽíž +view_admin_measTemplates_updateExisting_tooltip = ìŽ ìì륌 ì ííë©Ž ìŽ ì íì 몚ë ììì ëììŒë¡ ì íí íµê³ ìì§ ìŒì ì ì ë°ìŽíží©ëë€. ë§ìœ ìŽê²ìŽ 첎í¬ëì§ ììŒë©Ž, í í늿 ì€ìŒì¥ŽìŽ í¥í ìžë²€í 늬ì ì¶ê°ëë ìŽ ì íì ì ììì ì ì©ëë ê²ì ìëëë€. +view_admin_plugins_agent = ììŽì íž +view_admin_plugins_agentDeleteConfirm = <b>ê²œê³ !</b><br/>\në€ì ììŽì íž íë¬ê·žìžìŽ ìì ë ë €ê³ íê³ ììµëë€:<br/>\n{0}<br/>\nì ë§ë¡ ìì íìê² ìµëê¹? +view_admin_plugins_agentDisableConfirm = <b>ê²œê³ !</b><br/>\në€ì ììŽì íž íë¬ê·žìžìŽ íŽì ë ë €ê³ íê³ ììµëë€:<br/>\n{0}<br/>\nì ë§ë¡ íŽì íìê² ìµëê¹? +view_admin_plugins_deletedAgentPlugins = ìì ë ììŽì íž íë¬ê·žìž: {0} +view_admin_plugins_deletedAgentPluginsFailure = ììŽì íž íë¬ê·žìž ìì ì ì€íšíìµëë€. +view_admin_plugins_deployed = ë°°í¬íìê² ìµëê¹? +view_admin_plugins_disabledAgentPlugins = ë¹íì±íë ììŽì íž íë¬ê·žìž: {0} +view_admin_plugins_disabledAgentPluginsFailure = ììŽì íž íë¬ê·žìžì ë¹íì±íëëë° ì€íšíìµëë€. +view_admin_plugins_disabledServerPlugins = ë¹íì±íë ìë² íë¬ê·žìž: {0} +view_admin_plugins_disabledServerPluginsFailure = ìë² íë¬ê·žìžì ë¹íì±ííëë° ì€íšíìµëë€. +view_admin_plugins_enabledAgentPlugins = íì±íë ììŽì íž íë¬ê·žìž: {0} +view_admin_plugins_enabledAgentPluginsFailure = ììŽì íž íë¬ê·žìžì íì±ííëë° ì€íšíìµëë€. +view_admin_plugins_enabledServerPlugins = íì±íë ìë² íë¬ê·žìž: {0} +view_admin_plugins_enabledServerPluginsFailure = ìë² íë¬ê·žìžì íì±ííëë° ì€íšíìµëë€. +view_admin_plugins_hideDeleted = ìì ë í목 ìšêž°êž° +view_admin_plugins_hideUndeployed = ë°°í¬ ì ê±° í목 ìšêž°êž° +view_admin_plugins_loadFailure = íë¬ê·žìž ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€. +view_admin_plugins_purgedAgentPlugins = ììŽì íž íë¬ê·žìž {0}ì ì ê±°íêž° ìí ì€ë¹ë¥Œ íê³ ììµëë€.ìŽê²ì ëª ë¶ ì ë 걞늎ìë ììµëë€. ê·žë¬ë©Ž íë¬ê·žìžìì 몚ë ì í ì ìë 뚌ì ìì€í ìì ì ê±°ëìŽìŒíêž° ë묞ì ëë€. ìŽë¬í íë¬ê·žìžì ì ê±°ë ëê¹ì§ ìŽ íìŽì§ìì 볎ì¬ì§ëë€. íŒì§ê° ì€íëê³ ìë ëì íë¬ê·žìžì ë€ì ì€ì¹íì§ ìë ê²ì ì ìíììì€. ê·žë ì§ ììŒë©Ž ì€íší ê²ì ëë€. ë°ëŒì ìŽ íŒì§ê° ìë£ë ëê¹ì§ ìì€í ì íë¬ê·žìž ì¬ì€ì¹ë¥Œ êž°ë€ë €ì£Œìžì. +view_admin_plugins_purgedAgentPluginsFailure = ììŽì íž íë¬ê·žìž ì ê±°ì ì€íšíìµëë€. +view_admin_plugins_purgedServerPlugins = ì ê±°ë ìë² íë¬ê·žìž: {0}. +view_admin_plugins_purgedServerPluginsFailure = ìë² íë¬ê·žìž ì ê±°ì ì€íšíìµëë€. +view_admin_plugins_restartMasterPC = ë§ì€í° íë¬ê·žìž 컚í ìŽë륌 ì¬ìì +view_admin_plugins_restartMasterPCComplete = ë§ì€í° íë¬ê·žìž 컚í ìŽëê° ì¬ììëììµëë€. +view_admin_plugins_restartMasterPCFailure = ë§ì€í° íë¬ê·žìž 컚í ìŽëê° ì¬ììì ì€íšíìµëë€. +view_admin_plugins_restartMasterPCStarted = ë§ì€í° íë¬ê·žìž 컚í ìŽë ì¬ììì€... +view_admin_plugins_scan = ê°±ì ì ìí ê²ì¬ +view_admin_plugins_scanComplete = ì ë°ìŽížë íë¬ê·žìžì ìí ê²ì¬ë¥Œ ìë£ +view_admin_plugins_scanFailure = ì ë°ìŽížë íë¬ê·žìžì ìí ê²ì¬ì ì€íšíìµëë€. +view_admin_plugins_server = ìë² +view_admin_plugins_serverConfig = íë¬ê·žìž ì€ì +view_admin_plugins_serverConfig_badSettings = ì¬ë°ë¥ž ì€ì ì ì ë ¥íììì€ +view_admin_plugins_serverConfig_saveFailed = ì€ì ì ì ì¥íëë° ì€íšíìµëë€ +view_admin_plugins_serverConfig_settingsSaved = ì€ì ìŽ ì ì¥ëììµëë€. +view_admin_plugins_serverControls = 컚ížë¡€ +view_admin_plugins_serverControls_badParams = ì¬ë°ë¥ž ë§€ê° ë³ì륌 ì ë ¥íììì€ +view_admin_plugins_serverControls_clickForError = ì€ë¥ ë©ìì§ë¥Œ íŽëŠíììì€ +view_admin_plugins_serverControls_invokeFailure = 컚ížë¡€ ížì¶ì ì€íšíìµëë€ +view_admin_plugins_serverControls_name = 컚ížë¡€ +view_admin_plugins_serverControls_parameters = 맀ê°ë³ì +view_admin_plugins_serverControls_results = 결곌 +view_admin_plugins_serverDisableConfirm = <b>ê²œê³ !</b><br/>\në€ì ìë² íë¬ê·žìžì íŽì íë €ê³ í©ëë€ :<br/>\n{0}<br/>\nì ë§ë¡ íŽì íëë¡ íìê² ìµëê¹? +view_admin_plugins_serverScheduleJobs = ììœë ìì +view_admin_plugins_serverUndeployConfirm = <b>ê²œê³ !</b><br/>\në€ì ìë² íë¬ê·žìžìŽ ë°°í¬ íŽì ëë €ê³ í©ëë€ :<br/>\n{0}<br/>\nì ë§ë¡ ë°°í¬ íŽì 륌 íìê² ìµëê¹? +view_admin_plugins_showDeleted = ìì ë í목 볎Ʞ +view_admin_plugins_showUndeployed = ë°°í¬ ì ê±° í목 볎Ʞ +view_admin_plugins_undeploy = ë°°í¬ ì ê° +view_admin_plugins_undeployedServerPlugins = ë°°í¬ ì ê±°ë ìë² íë¬ê·žìž: {0} +view_admin_plugins_undeployedServerPluginsFailure = ìë² íë¬ê·žìž ë°°í¬ ì ê±°ì ì€íšíìµëë€. +view_admin_plugins_upload = íë¬ê·žìž ì ë¡ë +view_admin_security = 볎ì +view_admin_systemSettings_ActiveDriftServerPlugin_desc = ë늬ííž êŽë š ììì ìœí ìž ì ì§ìì±ì êŽëŠ¬íë ë늬ííž ìë² íë¬ê·žìž +view_admin_systemSettings_ActiveDriftServerPlugin_name = íì±í ë늬ííž ìë² íë¬ê·žìž +view_admin_systemSettings_AgentMaxQuietTimeAllowed_desc = ë§ìœ ììŽì ížìì ì묎ê²ë ë°ì§ ìê³ ìŽ ìê°ìŽ 겜곌íë€ë©Ž, ê·ž ììŽì ížë ë€ìŽë ê²ìŒë¡ ê°ì£Œë©ëë€. ìŽ ê°ì ë¶ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_AgentMaxQuietTimeAllowed_name = ììŽì íž ìµë ë¹íì± ìê° +view_admin_systemSettings_AlertPurge_desc = ë°ìŽí°ë² ìŽì€ìì ì ê±°ëêž° ì ì ê²œê³ êž°ë¡ì ì ì§ ìê°, ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_AlertPurge_name = ì€ëë ê²œê³ ë¥Œ ìì +view_admin_systemSettings_AvailabilityPurge_desc = ë°ìŽí°ë² ìŽì€ìì ì ê±°ëêž° ì ì ê°ì©ì± ë°ìŽí° 볎졎 ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_AvailabilityPurge_name = ì€ëë ê°ì©ì± ë°ìŽí° ìì +view_admin_systemSettings_BaseURL_desc = ìë² GUIì URL, ì£Œë¡ ê²œê³ ìŽë©ìŒ ìëŠŒìŽ ì¬ì©ë©ëë€. +view_admin_systemSettings_BaseURL_name = GUI ìœì URL +view_admin_systemSettings_BaselineDataSet_desc = êž°ì€ì ì ê²°ì íëë° ì¬ì©ëë 곌거ì ìž¡ì ë°ìŽí°ì ì. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_BaselineDataSet_name = Ʞ볞 ë°ìŽí°ì +view_admin_systemSettings_BaselineFrequency_desc = êž°ì€ ìë ê³ì° ë¹ëê° ê³ì°ë©ëë€. ëšìœ 0ìŽëŒë©Ž, êž°ì€ ìëê³ì°ì ë¹íì±íë©ëë€. ìŽê²ì ìŒëšìë¡ ì§ì ë©ëë€. ìµëê°ì 'Ʞ볞 ë°ìŽí°ì 'ì ëë€. +view_admin_systemSettings_BaselineFrequency_name = êž°ì€ ê³ì° ë¹ë +view_admin_systemSettings_DataMaintenance_desc = ë°ìŽí°ë² ìŽì€ ì ì§ êŽëŠ¬ê° ì€íëë ë¹ë (ì, Postgres륌 ì¬ì©íë ì§ê³µ ë±). ìŽê²ì ìê°ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_DataMaintenance_name = ë°ìŽí°ë² ìŽì€ ì ì§ ë³Žì êž°ê° +view_admin_systemSettings_DataReindex_desc = ë§ìœ ì íšíë©Ž, ë°ìŽí°ë² ìŽì€ í ìŽëžì ì êž°ì ìŒë¡ ìžë±ì€ê° ë€ì ìì±ë©ëë€. +view_admin_systemSettings_DataReindex_name = ë°ìŽí° í ìŽëžì ìŒê° ìžë±ì€ ë€ì ìì± +view_admin_systemSettings_DriftFilePurge_desc = ë°±ìëìì ì ê±° ë ëì. 믞ì¬ì©íê³ ë¶ëªšê° ìë ë늬ííž íìŒì ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_DriftFilePurge_name = 믞ì¬ì© ë늬ííž íìŒ ìì +view_admin_systemSettings_EnableAgentAutoUpdate_desc = ìë²ê° ììŽì ížê° ìëìŒë¡ ì ë°ìŽížë¥Œ íì©í ì§ ì¬ë¶ë¥Œ ê²°ì í©ëë€. ë§ìœ ì¬ì© ì€ì§íë 겜ì°ìë ìë²ìì ììŽì íž ë°°í¬ë¥Œ ë€ìŽë¡ë í ì ììµëë€. +view_admin_systemSettings_EnableAgentAutoUpdate_name = ììŽì ížì ìë ì ë°ìŽížë¥Œ íì±í +view_admin_systemSettings_EnableDebugMode_desc = ì íšíë©Ž ìë²ê° ëë²ê·ž 몚ëë¡ ë€ìŽê°ëë€. +view_admin_systemSettings_EnableDebugMode_name = ëë²ê·ž 몚ë íì±í +view_admin_systemSettings_EnableExperimentalFeatures_desc = ì íšíë©Ž, íì¬ì ì íì í¬íšë 몚ë ì€íì ìž êž°ë¥ì ì¬ì©í ì ììµëë€. +view_admin_systemSettings_EnableExperimentalFeatures_name = ì€íì ìž êž°ë¥ì íì±í +view_admin_systemSettings_EventPurge_desc = ë°ìŽí°ë² ìŽì€ìì ì ê±°ëêž° ì ì ìŽë²€íž ë°ìŽí°ì ì ì§ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_EventPurge_name = ì€ëë ìŽë²€íž ìì +view_admin_systemSettings_JAASProvider_desc = ì¬ì©ì ID륌 ê²°ì íëë° LDAPìŽ ì¬ì©ëìŽìŒ í©ëê¹? +view_admin_systemSettings_JAASProvider_name = LDAP íì±í +view_admin_systemSettings_LDAPBaseDN_desc = ì¬ì©ì ìžìŠ ì¬ìŽì ì¬ì©ì ìŽëŠê³Œ ìížë¥Œ ê²ìíë ëë í 늬 ížëŠ¬ì êž°ë°. ì : ou=People, dc=redhat, dc=com +view_admin_systemSettings_LDAPBaseDN_name = ê²ì êž°ë° +view_admin_systemSettings_LDAPBindDN_desc = LDAP ì¬ì©ì ë°ìŽí°ë² ìŽì€ì 묞ìì LDAP ìë²ì ì°ê²°íë ì¬ì©ì ìŽëŠ. ìŽê²ì ë³Žíµ ë§€ëì ì¬ì©ì ì 첎 LDAP ê³ ì ìŽëŠ(DN)ìŽ ëë€. ì : cn=Manager, dc=redhat, dc=com +view_admin_systemSettings_LDAPBindDN_name = ì¬ì©ììŽëŠ +view_admin_systemSettings_LDAPBindPW_desc = LDAP ì¬ì©ì ë°ìŽí°ë² ìŽì€ì 묞ìì LDAP ìë²ì ì°ê²°íêž° ìí ì¬ì©ì ìžìŠ. +view_admin_systemSettings_LDAPBindPW_name = ìíž +view_admin_systemSettings_LDAPFilter_desc = LDAP ê²ì ì€ì ì ì©ëë ì¶ê° ê°ë¥í 몚ë íí°. ìŽê²ì ìžìŠíë ì¬ëìŽ ì§ì ë LDAP ìì±ì íµíŽ íìžëë€ë©Ž ì ì©í©ëë€. ì : RHQUser=true +view_admin_systemSettings_LDAPFilter_name = ê²ì íí° +view_admin_systemSettings_LDAPGroupFilter_desc = LDAP ê²ì íí°ë ì¹ìž ê°ë¥í 몚ë LDAP 귞룹ì ë°ííŽìŒ í©ëë€. ìŽê²ì LDAP 귞룹 ì¹ìžì ìíŽ ì¬ì©ë©ëë€. +view_admin_systemSettings_LDAPGroupFilter_name = 귞룹 ê²ì íí° +view_admin_systemSettings_LDAPGroupMember_desc = LDAP ê²ì íí°ë ì¬ì©ì ì¹ìžì ê²°ì íë 귞룹 ê²ì íí°ì íšê» ì¬ì©ë©ëë€. ìŽê²ì LDAP 귞룹 ì¹ìžì ìíŽ ì¬ì©ë©ëë€. +view_admin_systemSettings_LDAPGroupMember_name = 귞룹 ë©€ë² íí° +view_admin_systemSettings_LDAPGroupUsePosixGroup_desc = 귞룹 íì íìžì ìíŽ PosixGroup symantics륌 ì¬ì©í ì§ ì¬ë¶ë¥Œ ì ìí©ëë€. PosixGroupsìŒë¡ 귞룹 íì íí°ë¥Œë ìŒë°ì ìŒë¡ 'memberUid'ì 'objectclass=posixGroup'ì íí° ê·žë£¹ìŒë¡ ì€ì ëìŽ ììµëë€. +view_admin_systemSettings_LDAPGroupUsePosixGroup_name = Is PosixGroup +view_admin_systemSettings_LDAPLoginProperty_desc = ì¬ì©ì ìŽëŠì í¬íšíë LDAP ìì±. Ʞ볞ê°ì "cn". ë§ìœ ì¬ë¬ íëª©ìŽ ìŒì¹íë©Ž, ì²ì ë°ê²¬ë ê²ìŽ ì¬ì©ë©ëë€. +view_admin_systemSettings_LDAPLoginProperty_name = ë¡ê·žìž ìì± +view_admin_systemSettings_LDAPProtocol_desc = LDAP ìë²ê°ì SSLì íµíŽ íµì ëìŽìŒ í©ëê¹? +view_admin_systemSettings_LDAPProtocol_name = SSL +view_admin_systemSettings_LDAPUrl_desc = LDAP ìë²ì URL +view_admin_systemSettings_LDAPUrl_name = LDAP URL +view_admin_systemSettings_RtDataPurge_desc = ë°ìŽí°ë² ìŽì€ìì ì ê±°ëêž° ì ì ìëµìê°ì ì ì§ ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_RtDataPurge_name = ì€ëë ìëµìê° ìì +view_admin_systemSettings_TraitPurge_desc = ë°ìŽí°ë² ìŽì€ìì ì ê±°ëêž° ì ì ìž¡ì ížë ìŽíž ë°ìŽí°ì ì ì§ ìê°. ìŽê²ì ìŒ ëšìë¡ ì§ì ë©ëë€. +view_admin_systemSettings_TraitPurge_name = ì€ëë ìž¡ì ížë ìŽíž ìì +view_admin_systemSettings_cannotLoadServerDetails = ìë² ììžì 볎륌 ë¡ëí ì ììµëë€. +view_admin_systemSettings_cannotLoadSettings = íì¬ ìì€í ì€ì ì ê°ì žì¬ ì ììµëë€. +view_admin_systemSettings_dumpToLogFailed = ìë² ë¡ê·ž íìŒì ìì€í ì 볎륌 ì°êž°ê° ì€íšíìµëë€. +view_admin_systemSettings_dumpedToLog = ì±ê³µì ìŒë¡ ìì€í ë¡ê·ž íìŒì êž°ë¡ë ìì€í ì 볎 +view_admin_systemSettings_fixBeforeSaving = ì ì¥ì ì ì못ë ê°ì ìì íììì€ +view_admin_systemSettings_group_baseline = ìë Ʞ볞 êµ¬ì± ìì± +view_admin_systemSettings_group_dataMgr = ë°ìŽí° êŽëŠ¬ì êµ¬ì± ìì± +view_admin_systemSettings_group_drift = ë늬ííž ìë² êµ¬ì± ìì± +view_admin_systemSettings_group_general = ìŒë° êµ¬ì± ìì± +view_admin_systemSettings_group_ldap = LDAP êµ¬ì± ìì± +view_admin_systemSettings_saveFailure = ìì€í ì€ì ì ì ì¥íëë° ì€íšíìµëë€ +view_admin_systemSettings_savedSettings = ìì€í ìì±ì ì ì¥ì ì±ê³µíììµëë€ +view_admin_systemSettings_serverDetails = ìë² ììžì 볎 +view_admin_systemSettings_serverDetails_buildNumber = ë¹ë ë²íž +view_admin_systemSettings_serverDetails_currentTable = íì¬ ìž¡ì ë¡ì° í ìŽëž +view_admin_systemSettings_serverDetails_dbDriverName = ë°ìŽí°ë² ìŽì€ ëëŒìŽë² ìŽëŠ +view_admin_systemSettings_serverDetails_dbDriverVersion = ë°ìŽí°ë² ìŽì€ ëëŒìŽë² ë²ì +view_admin_systemSettings_serverDetails_dbName = ë°ìŽí°ë² ìŽì€ ì í ìŽëŠ +view_admin_systemSettings_serverDetails_dbUrl = ë°ìŽí°ë² ìŽì€ ì ì URL +view_admin_systemSettings_serverDetails_dbVersion = ë°ìŽí°ë² ìŽì€ ì í ë²ì +view_admin_systemSettings_serverDetails_installDir = ìë² ì€ì¹ ëë í 늬 +view_admin_systemSettings_serverDetails_nextRotation = ë€ì ìž¡ì í ìŽëž êµì²Ž +view_admin_systemSettings_serverDetails_productName = ì í ìŽëŠ +view_admin_systemSettings_serverDetails_serverName = ìë² ìŽëŠ +view_admin_systemSettings_serverDetails_time = ìë² ë¡ì»¬ ìê° +view_admin_systemSettings_serverDetails_tz = ìë² ìê°ë +view_admin_topology = í íŽë¡ì§ +view_alert_common_tab_conditions = 조걎 +view_alert_common_tab_conditions_expression = ê²œê³ ë°ìì +view_alert_common_tab_conditions_expression_tooltip = ì 첎 ì¡°ê±ŽìŽ trueë¡ ìžì ë°êž° ìíŽ ì¡°ê±Žì ìŒë¶ ëë ì ë¶ê° trueë¡ íê°ëìŽìŒ íëì§ ê²°ì í©ëë€. +view_alert_common_tab_conditions_modal_title = 조걎 ì¶ê° +view_alert_common_tab_conditions_recovery_disabled = ìŽ ê²œê³ ë ê²œê³ ì ìê° ë¹íì±íëë ììžìŽ ëììµëë€. +view_alert_common_tab_conditions_recovery_enabled = ížëŠ¬ê±° ''{0}''ìŽ ë€ì íì±í ëë +view_alert_common_tab_conditions_text = 조걎 +view_alert_common_tab_conditions_type_availability = ê°ì©ì±ì ë³í +view_alert_common_tab_conditions_type_availability_down = íê° +view_alert_common_tab_conditions_type_availability_up = ìì¹ +view_alert_common_tab_conditions_type_drift = ë늬ííž ê²ì¶ +view_alert_common_tab_conditions_type_drift_configpaths = "{0}"ì ìŒì¹íë íìŒ ë° ë늬ííž ì ì [{1}]륌 ìí ë늬ííž ê²ì +view_alert_common_tab_conditions_type_drift_onlyconfig = ë늬ííž ì ì [{0}]ì ëí ë늬ííž ê²ì¶ +view_alert_common_tab_conditions_type_drift_onlypaths = "{0}"ì ìŒì¹íë íìŒì ìí ë늬ííž ê²ì¶ +view_alert_common_tab_conditions_type_event = ìŽë²€íž ê²ì¶ +view_alert_common_tab_conditions_type_event_matching = ìŽë²€íž ìì€ê° ìŒì¹ +view_alert_common_tab_conditions_type_metric_baseline = íµê³ê° êž°ì€ +view_alert_common_tab_conditions_type_metric_baseline_verb = of +view_alert_common_tab_conditions_type_metric_calltime_change = ížì¶ ìê°ì ë³í +view_alert_common_tab_conditions_type_metric_calltime_change_verb = ì ìŽë +view_alert_common_tab_conditions_type_metric_calltime_delta_grows = ìì¹ +view_alert_common_tab_conditions_type_metric_calltime_delta_other = ë³í +view_alert_common_tab_conditions_type_metric_calltime_delta_shrinks = ì¶ì +view_alert_common_tab_conditions_type_metric_calltime_destination = ížì¶ ëììŽ ìŒì¹ +view_alert_common_tab_conditions_type_metric_calltime_threshold = ížì¶ ìê° íê³ +view_alert_common_tab_conditions_type_metric_change = íµê³ê°ì ë³í +view_alert_common_tab_conditions_type_metric_range_inside_exclusive = íµê³ê°ì ë²ì: [{0}] : [{1}] ë° [{2}] ì¬ìŽ (겜ê³ê°ì í¬íšíì§ ìëë€) +view_alert_common_tab_conditions_type_metric_range_inside_inclusive = íµê³ê°ì ë²ì: [{0}] : [{1}] ë° [{2}] ì¬ìŽ (겜ê³ê° í¬íš) +view_alert_common_tab_conditions_type_metric_range_outside_exclusive = íµê³ê°ì ë²ì: [{0}] : [{1}] ë° [{2}] ìžë¶ (겜ê³ê°ì í¬íšíì§ ìëë€) +view_alert_common_tab_conditions_type_metric_range_outside_inclusive = íµê³ê°ì ë²ì: [{0}] : [{1}] ë° [{2}] ìžë¶ (겜ê³ê° í¬íš) +view_alert_common_tab_conditions_type_metric_threshold = íµê³ ìê³ ê° +view_alert_common_tab_conditions_type_metric_trait_change = ížë ìŽížì ë³í +view_alert_common_tab_conditions_type_operation = ì€íŒë ìŽì ì ì€í +view_alert_common_tab_conditions_type_operation_status = 결곌 ìíìžê° +view_alert_common_tab_conditions_type_resource_configuration = ìì 구ì±ì ë³í +view_alert_common_tab_dampening = ê°ì +view_alert_common_tab_dampening_category_consecutive_count = ì°ì +view_alert_common_tab_dampening_category_consecutive_count_tooltip = 조걎 ì€ì ìŽ Xë² ì°ì trueìŽë©Ž ê²œë³Žê° ë°ìí©ëë€. +view_alert_common_tab_dampening_category_duration_count = ìê° ê°ê²© +view_alert_common_tab_dampening_category_duration_count_tooltip = ê²œê³ ë 죌ìŽì§ ìê°ëŽìì 조걎ì€ì ìŽ trueìì Xë² ë°ìí ëë§ë€ ë°ìí©ëë€. +view_alert_common_tab_dampening_category_none = ìì +view_alert_common_tab_dampening_category_none_tooltip = ê°ì ë ë¹íì±íëìŽ ììµëë€. ì¡°ê±ŽìŽ trueê° ë ëë§ë€ ê²œê³ ê° ë°ìí©ëë€. +view_alert_common_tab_dampening_category_partial_count = ìµê·Œì Nê°ì íê° +view_alert_common_tab_dampening_category_partial_count_tooltip = ê²œê³ ë ìµê·Œì Në² ì¡°ê±Ž íê°ì¬ìŽìì 조걎ì€ì ìŽ true륌 충족íë Xë² ë°ìí ëë§ë€ ë°ìí©ëë€. +view_alert_common_tab_dampening_consecutive_occurrences_label = ë°ì +view_alert_common_tab_dampening_consecutive_occurrences_label_tooltip = 조걎ì§í©ì íìë ìëŠŒìŽ ì€íëêž° ì ì ì°ìì ìŒë¡ 충족íŽìŒ í©ëë€. +view_alert_common_tab_dampening_duration_occurrences_label = ë°ì +view_alert_common_tab_dampening_duration_occurrences_label_tooltip = íì ìëŠŒìŽ ì€íëêž° ì ì 조걎ì§í©ì ì§ì ë êž°ê°ëì 충족íŽìŒ í©ëë€. +view_alert_common_tab_dampening_duration_period_label = ìê° ê°ê²© +view_alert_common_tab_dampening_duration_period_label_tooltip = 죌ìŽì§ ë°ì íìê° trueìžì§ ì¬ë¶ë¥Œ íìžíêž° ìíŽ ì¡°ì ì í ì€ížíë ìê°ë²ì. +view_alert_common_tab_dampening_partial_evalatuions_label = íê° +view_alert_common_tab_dampening_partial_evalatuions_label_tooltip = 죌ìŽì§ ë°ì íìê° trueìžì§ ì¬ë¶ë¥Œ íìžíêž° ìíŽ ì¡°ê±Ž ì€ì ìŽ í ì€ížëë ìŽ íì. +view_alert_common_tab_dampening_partial_occurrences_label = ë°ì +view_alert_common_tab_dampening_partial_occurrences_label_tooltip = ê²œê³ ê° ë°ìíêž° ì ì ìµê·Œ Nê°ì íê°ì¬ìŽìì 조걎 ì€ì ìŽ trueìŽìŽìŒ íë€ë íì. +view_alert_common_tab_general = ìŒë° ìì± +view_alert_common_tab_invalid_condition_category = ì못ë 조걎 칎í ê³ ëŠ¬ - ì¬ííŒ ìŽê²ì ë²ê·žë¡ ë³Žê³ íììì€: {0} +view_alert_common_tab_invalid_dampening_category = ì못ë ë€í 칎í ê³ ëŠ¬ - ì¬ííŒ ìŽê²ì ë²ê·žë¡ ë³Žê³ íììì€: {0} +view_alert_common_tab_invalid_time_units = ì못ë ìê° ëšì - ì¬ííŒ ìŽê²ì ë²ê·žë¡ ë³Žê³ íììì€: {0} +view_alert_common_tab_notifications = ì늌 +view_alert_common_tab_notifications_message = ë©ìì§ +view_alert_common_tab_notifications_sender = ì¡ì ì +view_alert_common_tab_notifications_status = ìí +view_alert_common_tab_recovery = 복구 +view_alert_definition_condition_editor_availabilityDuration = ê°ì©ì± ê°ê²© +view_alert_definition_condition_editor_availabilityDuration_tooltip = ê°ì©ì± 조걎ì ížëŠ¬ê±°íêž° ìíŽ ì ì¥ëìŽ ììŽìŒíë€. ê°ì©ì± ìíì ë³íì ê°ê²©ì ì§ì í©ëë€. ê·ž ê°ê²©ì ë¶ëšìë¡ ì§ì ë©ëë€. ììŽì íž ê°ì©ì± ìíì ë³í륌 ê°ì§íê³ ë¬žì 륌 íŽê²°í ì ìëë¡ íêž° ìíŽìë ììŽì ížì ì§ì íë ìê°ì ëª ë¶ êžžìŽë¡ 충ë¶í©ëë€. +view_alert_definition_condition_editor_availabilityDuration_tooltip_duration = ì¡°ê±ŽìŽ ì¶©ì¡±ëêž° ì ì ë¶ì ìë 늬ìì€ê° 죌ìŽì§ ê°ì©ì±ì ììŽìŒí©ëë€. +view_alert_definition_condition_editor_availability_tooltip = 조걎 ížëŠ¬ê±°íë ê°ì©ì± ìíì ë³í륌 ì§ì í©ëë€. +view_alert_definition_condition_editor_availability_value = ê°ì©ì± +view_alert_definition_condition_editor_common_avg = íê· +view_alert_definition_condition_editor_common_max = ìµë +view_alert_definition_condition_editor_common_min = ìµì +view_alert_definition_condition_editor_delete_confirm = ì íë ê²œê³ ì ì륌 ìì íìê² ìµëê¹? +view_alert_definition_condition_editor_drift_configname_regex = ë늬ííž ì ì ìŽëŠ +view_alert_definition_condition_editor_drift_configname_regex_tooltip = ë§ìœ ì§ì ë 겜ì°, ìŽë ë°ê²¬ë ë늬íížë¥Œ ìí ì± ìì ê°ì§ ë늬ííž ì ì ìŽëŠì ëë€. ìŽê²ì ì¬ë¬ ë늬ííž ì ì ìŽëŠê³Œ ìŒì¹íê³ ì¶ë€ë©Ž ìµì ìŒë¡ ì ê·íí í ì ììµëë€. +view_alert_definition_condition_editor_drift_pathname_regex = ê²œë¡ ì ê· ííì +view_alert_definition_condition_editor_drift_pathname_regex_tooltip = ë§ìœ ì§ì ë 겜ì°, ìŽë ë늬íížë íìŒì ê²œë¡ ìŽëŠê³Œ ìŒì¹íŽìŒ íë€ë ì ê·ííìŽ ë©ëë€. +view_alert_definition_condition_editor_drift_tooltip = ìŽ ì¡°ê±Žì ë늬íížê° ê°ì§ë ë ížëŠ¬ê±°ë©ëë€. +view_alert_definition_condition_editor_event_regex = ì ê· ííì +view_alert_definition_condition_editor_event_regex_tooltip = ë§ìœ ì§ì ë 겜ì°, ìŽê²ì ì ê·ííììŽë©°, ìŽ ì¡°ê±Žì ì ëíêž° ìíì¬ ìì§ë ìŽë²€íž ë©ìì§ì ìŒì¹íŽìŒ í©ëë€. +view_alert_definition_condition_editor_event_severity = ìŽë²€íž ì¬ê°ë +view_alert_definition_condition_editor_event_tooltip = ìŽ ì¡°ê±Žì ì ëíêž° ìíì¬ ìŽë²€íž ë©ìì§ê° ë³Žê³ ë íìê° ìë ìŽë²€íž ì¬ê°ë륌 ì§ì í©ëë€. ë§ìœ ìµì ìŽ ëë ì ê·ííìì ì§ì íë€ë©Ž, ìŽë²€íž ë©ìì§ë íŽë¹ ì¡°ê±ŽìŽ ë°ìíêž° ë묞ì ìŽë²€íž ë©ìì§ë ì ê·ííì곌 ìŒì¹íŽìŒ í©ëë€. +view_alert_definition_condition_editor_metric_baseline_percentage = êž°ì€ ë°±ë¶ìš +view_alert_definition_condition_editor_metric_baseline_percentage_tooltip = ì íë ë¹êµ ì°ì°ì륌 ì¬ì©íì¬ ì íë êž°ì€ ê°ì ë¹ìšì ë¹êµí ë ìì§ë íµê³ê°ìŽ ì¡°ê±ŽìŽ ë°ìí©ëë€. +view_alert_definition_condition_editor_metric_baseline_tooltip = 조걎ì ì ëíêž° ìíì¬ ìë°ë íìê° ìë Ʞ볞ê°ì ì§ì í©ëë€. ì§ì íë ê°ì 죌ìŽì§ Ʞ볞ê°ì ë°±ë¶ìšì ëë€. +view_alert_definition_condition_editor_metric_baseline_value = êž°ì€ +view_alert_definition_condition_editor_metric_calltime_change_percentage = ë°±ë¶ìš ë³í +view_alert_definition_condition_editor_metric_calltime_change_percentage_tooltip = ì ìŽë ì íë ížì¶ìê° ì íê°ì ë°±ë¶ìšê³Œ ë€ë¥ž 겜ì°, ìì§ë ížì¶ìê°ìŽ 조걎ì ìŒìŒíµëë€. +view_alert_definition_condition_editor_metric_calltime_change_tooltip = 조걎ì ìŒìŒí€ë ìµìí ì§ì ë ìì ë³íê° ë°ìíì ëì ížì¶ê°ì ì§ì í©ëë€. (ìµì, ìµë, íê· íµí ìê°ê°)륌 íìžíêž° ìíŽ ížì¶ìê° ì íì ì¢ ë¥ì ë°ìì íìí ë³íì ë¹ìšì ì§ì íŽìŒ í©ëë€. +view_alert_definition_condition_editor_metric_calltime_common_comparator = ë¹êµêž° +view_alert_definition_condition_editor_metric_calltime_common_comparator_changes = ë³í +view_alert_definition_condition_editor_metric_calltime_common_comparator_grows = ìŠë +view_alert_definition_condition_editor_metric_calltime_common_comparator_shrinks = ì¶ì +view_alert_definition_condition_editor_metric_calltime_common_comparator_tooltip = ìì§ë ížì¶ìê° ê°ì 죌ìŽì§ ížì¶ìê°ì íê³ì ìŽë»ê² í ê²ìžê° +view_alert_definition_condition_editor_metric_calltime_common_limit = ížì¶ ìê° ì í +view_alert_definition_condition_editor_metric_calltime_common_limit_tooltip = 죌ìŽì§ ê°ê³Œ ë¹êµëìŽìŒ íë ížì¶ìê° ì íê° +view_alert_definition_condition_editor_metric_calltime_common_name = ížì¶ ìê° íµê³ +view_alert_definition_condition_editor_metric_calltime_common_regex = ì ê· ííì +view_alert_definition_condition_editor_metric_calltime_common_regex_tooltip = ë§ìœ ì§ì ëë€ë©Ž, ìŽê²ì ì ê·ííììŽë©°, 조걎ì ì ëíêž° ìíì¬ ížì¶ ëì곌 ìŒì¹íŽìŒ í©ëë€. +view_alert_definition_condition_editor_metric_calltime_threshold_tooltip = ìë°íìë, 조걎ì ìŒìŒí€ë ížì¶ ìê° íê³ë¥Œ ì§ì í©ëë€. ì§ì íë ê°ì ìµì ì ëšì륌 ë°ë¥ž ì ëê°ìŽ ë©ëë€. (ìµì, ìµë, íê· íµí ìê°ê°) ê°ì ë¹êµíêž° ìíŽ ížì¶ìê° ì íì ì¢ ë¥ë¥Œ ì§ì íŽìŒí©ëë€. +view_alert_definition_condition_editor_metric_calltime_threshold_value = ížì¶ ìê° ê° +view_alert_definition_condition_editor_metric_calltime_threshold_value_tooltip = ì íë ë¹êµì(comparator)륌 ì¬ì©íì¬ ë¹êµí ë ì¡°ê±ŽìŽ ìŒìŽë íµê³ ìê³ê° +view_alert_definition_condition_editor_metric_change_tooltip = 조걎ì ì ëíêž° ìíŽ ë³ê²œíŽìŒ íë ê° íµê³ë¥Œ ì§ì í©ëë€. +view_alert_definition_condition_editor_metric_common_definition_not_found = ëê° ì못ë íµê³ ì ì륌 ì°ŸììŒ í©ëë€ +view_alert_definition_condition_editor_metric_nometrics = 몚ë ì°ê²°íì¬ ì¬ì©í ë, ì¬ë¬ 조걎ìì ëìŒí íµê³ë¥Œ ì¬ì©í ì ììµëë€. ìŽ ê²œê³ ë íì¬ ì¡°ê±Žììì 몚ë ì¬ì© ê°ë¥í ì§í륌 ì¬ì©í©ëë€. +view_alert_definition_condition_editor_metric_range_comparator = ë¹êµ ì°ì°ì +view_alert_definition_condition_editor_metric_range_comparator_inside_exclusive = ëŽë¶ìì 겜ê³ê°ì í¬íšíì§ ìë +view_alert_definition_condition_editor_metric_range_comparator_inside_inclusive = ëŽë¶ìì 겜ê³ê°ì í¬íš +view_alert_definition_condition_editor_metric_range_comparator_outside_exclusive = ìžë¶ìì 겜ê³ê°ì í¬íšíì§ ìë +view_alert_definition_condition_editor_metric_range_comparator_outside_inclusive = ìžë¶ìì 겜ê³ê°ì í¬íš +view_alert_definition_condition_editor_metric_range_comparator_tooltip = íµê³ê°ìŽ ë²ì ëŽì ìëì§ ë²ì륌 ë²ìŽë 겜ì°, ìŽ ì¡°ê±Žì ížëŠ¬ê±°ê° ë ì§ ì¬ë¶ë¥Œ ê²°ì í©ëë€. +view_alert_definition_condition_editor_metric_range_hivalue = ëì ê° +view_alert_definition_condition_editor_metric_range_hivalue_tooltip = ë²ìì ëì ìê³ê°ì ëë€. +view_alert_definition_condition_editor_metric_range_lovalue = ë®ì ê° +view_alert_definition_condition_editor_metric_range_lovalue_tooltip = ë²ìì ë®ì ìê³ê°ì ëë€. +view_alert_definition_condition_editor_metric_range_tooltip = íµê³ê°ê³Œ 죌ìŽì§ ë²ì (ë®ì ê°ê³Œ ëì ê°)륌 ë¹êµí©ëë€. +view_alert_definition_condition_editor_metric_threshold_comparator = ë¹êµ ì°ì°ì +view_alert_definition_condition_editor_metric_threshold_comparator_equal = ëìŒí +view_alert_definition_condition_editor_metric_threshold_comparator_greater = ë í° +view_alert_definition_condition_editor_metric_threshold_comparator_less = ë ìì +view_alert_definition_condition_editor_metric_threshold_comparator_tooltip = ìì§ë íµê³ê°ìŽ 죌ìŽì§ ìê³ê°ê³Œ ë¹êµíë ë°©ë² +view_alert_definition_condition_editor_metric_threshold_name = íµê³ +view_alert_definition_condition_editor_metric_threshold_tooltip = ìë°íìëì 조걎 ížëŠ¬ê±°íë ìê³ê°ì ì§ì í©ëë€. ì§ì íë ê°ì ìµì ìŽ ëë ëšìì ì ëê° +view_alert_definition_condition_editor_metric_threshold_value = íµê³ê° +view_alert_definition_condition_editor_metric_threshold_value_tooltip = íµê³ ìê³ê°ì ì íë ë¹êµë¥Œ ì¬ì©íì¬ ë¹êµë ë 조걎 ížëŠ¬ê±°ë©ëë€. +view_alert_definition_condition_editor_metric_trait_change_tooltip = 조걎ì ì ëíêž° ìíŽ ë³ê²œíŽìŒ íë ê° í¹ì±ì ì§ì í©ëë€. +view_alert_definition_condition_editor_metric_trait_change_value = í¹ì± +view_alert_definition_condition_editor_metricswarning = 몚ë ì°ê²°ì ì¬ì©í ëë ê°ì íµê³ë¥Œ ì¬ì©, ì¬ë¬ 조걎ì ì§ì í ì ììµëë€. ìŽ ê²œê³ ì ìë íµê³ [{0}]륌 ì¬ì© ì¬ë¬ 조걎ì ê°ì§ê³ ììµëë€. +view_alert_definition_condition_editor_operation_status = ìŽì ìí +view_alert_definition_condition_editor_operation_tooltip = ì íí ìì ìŽ ì€íëë©Ž 조걎ì ì€ííêž° ìíŽì ë°ìíŽìŒ íë 결곌륌 ì§ì . +view_alert_definition_condition_editor_operator_availability_durationDown = ì ì§ ìí +view_alert_definition_condition_editor_operator_availability_durationNotUp = ììíì§ ìì ìí +view_alert_definition_condition_editor_operator_availability_goesDisabled = ë¹íì±íëë€ +view_alert_definition_condition_editor_operator_availability_goesDown = ì€ì§ +view_alert_definition_condition_editor_operator_availability_goesNotUp = ììíì§ ìì ìí +view_alert_definition_condition_editor_operator_availability_goesUnknown = ì ì ìë ìíê° ë +view_alert_definition_condition_editor_operator_availability_goesUp = ìì +view_alert_definition_condition_editor_option_availability = ê°ì©ì±ì ë³í +view_alert_definition_condition_editor_option_drift = ë늬ííž ê²ì +view_alert_definition_condition_editor_option_event = ìŽë²€íž ê²ì +view_alert_definition_condition_editor_option_label = 조걎 ì í +view_alert_definition_condition_editor_option_metric_baseline = ìž¡ì êž°ì€ ìê³ì¹ +view_alert_definition_condition_editor_option_metric_calltime_change = ížì¶ ìê°ì ë³í +view_alert_definition_condition_editor_option_metric_calltime_threshold = ížì¶ ìê° íê³ +view_alert_definition_condition_editor_option_metric_change = ìž¡ì ê°ì ë³í +view_alert_definition_condition_editor_option_metric_range = ìž¡ì ê°ì ë²ì +view_alert_definition_condition_editor_option_metric_threshold = ìž¡ì ì ëì¹ íê³ +view_alert_definition_condition_editor_option_metric_trait_change = í¹ì±ê°ì ë³í +view_alert_definition_condition_editor_option_operation = ì€íŒë ìŽì ì ì€í +view_alert_definition_condition_editor_option_resource_configuration = ìì 구ì±ì ë³í +view_alert_definition_condition_editor_resource_configuration_tooltip = ìŽ ì¡°ê±Žì ìì 구ì±ìŽ ë³ê²œëë©Ž ë°ìí©ëë€. +view_alert_definition_for_group = ë·° 귞룹 ì ì +view_alert_definition_for_type = ë·° í í늿 +view_alert_definition_notification_cliScript_editor_anotherUser = ë€ë¥ž ì¬ì©ì +view_alert_definition_notification_cliScript_editor_existingScript = êž°ì¡Žì ì€í¬ëŠœíž +view_alert_definition_notification_cliScript_editor_loadFailed = CLI ì늌 ížì§êž°ì ë¡ëì ì€íšíìµëë€. +view_alert_definition_notification_cliScript_editor_newScriptVersion = ë²ì +view_alert_definition_notification_cliScript_editor_repository = ì ì¥ì +view_alert_definition_notification_cliScript_editor_script = ì€í¬ëŠœíž +view_alert_definition_notification_cliScript_editor_selectRepo = ì€í¬ëŠœížê° ë€ìŽìë ì ì¥ì륌 ì ííììì€ +view_alert_definition_notification_cliScript_editor_selectRepoFirst = ì ì¥ì륌 뚌ì ì ííììì€. +view_alert_definition_notification_cliScript_editor_thisUser = ìì +view_alert_definition_notification_cliScript_editor_uploadNewScript = ì ì€í¬ëŠœíž ì ë¡ë +view_alert_definition_notification_cliScript_editor_verifyAuthentication = íìž +view_alert_definition_notification_cliScript_editor_whichUser = ì€í¬ëŠœížë¥Œ ì€ííë ì¬ì©ì +view_alert_definition_notification_editor_delete_confirm = ì íí ê²œê³ ìëì ìì íìê² ìµëê¹? +view_alert_definition_notification_editor_field_configuration = êµ¬ì± +view_alert_definition_notification_editor_field_configuration_loadFailed = ì늌 구ì±ì 믞늬 ê°ì žì€ëë° ì€íšíìµëë€ +view_alert_definition_notification_editor_field_configuration_not_loaded = ë¶ëª +view_alert_definition_notification_editor_field_sender = ë³Žëž ì¬ë +view_alert_definition_notification_editor_loadFailed = ê²œê³ ë³Žëž ì¬ëì ê²ìí ì ììµëë€ +view_alert_definition_notification_editor_loadFailed_single = ê²œê³ ë³Žëž ì¬ë êµ¬ì± ì ì륌 ê°ì žì¬ ì ììµëë€ +view_alert_definition_notification_editor_none_available = ê²œê³ ë³Žëž ì¬ëìŽ ì¬ì©í ì ììµëë€ +view_alert_definition_notification_editor_saveFailed = ì늌 구ì±ì ì ì¥í ì ììµëë€ +view_alert_definition_notification_editor_sender = ì늌 ë³Žëž ì¬ë +view_alert_definition_notification_editor_title_add = ì늌 ì¶ê° +view_alert_definition_notification_editor_title_edit = ì늌 ížì§ +view_alert_definition_notification_operation_editor_common_operation = ìŽì +view_alert_definition_notification_operation_editor_mode_relative = êŽë š 늬ìì€ +view_alert_definition_notification_operation_editor_mode_specific = í¹ì 늬ìì€ +view_alert_definition_notification_operation_editor_mode_this = ìŽ ëŠ¬ìì€ +view_alert_definition_notification_operation_editor_mode_title = 늬ìì€ ì í 몚ë +view_alert_definition_notification_operation_editor_mode_unknown = ì ì ìë ìµì - ìŽê²ì ë²ê·žì ëë€ +view_alert_definition_notification_operation_editor_operations_loadFailed = ì¬ì© ê°ë¥í ìì 목ë¡ì ë¡ëíëë° ì€íšíìµëë€ +view_alert_definition_notification_operation_editor_operations_no_parameters = ìŽ ìì ì íëë ë§€ê° ë³ì륌 ì¬ì©íì§ ììµëë€ +view_alert_definition_notification_operation_editor_relative_ancestor = ê²ì ìì +view_alert_definition_notification_operation_editor_relative_ancestor_loadFailed = íì ì ì¡°ìì ê°ì žì¬ ì ììµëë€. +view_alert_definition_notification_operation_editor_relative_ancestor_root = ë£šíž ì¡°ì íì +view_alert_definition_notification_operation_editor_relative_ancestor_tooltip = íì ê³ìžµì í±ì ì íí©ëë€. ê·žê²ì ì íì íí°ë¥Œ ìíŽ ìì ížëŠ¬ë¥Œ ê²ìíë êž°ë°ìŽ ë©ëë€. +view_alert_definition_notification_operation_editor_relative_descendant = ë€ìì íí° +view_alert_definition_notification_operation_editor_relative_descendant_filter_tooltip = ì íí ì íì íŽë¹íë ì¬ë¬ ìììŽ ììŒë©Ž ììì ê³ ì íê² ìë³íë 구첎ì ìž ìŽëŠ. ìŽê²ì ì íí íì ê³ìžµ 구조ìì íŽë¹ ìì íì ì ì ìŒí ìì ë°ì ìë 겜ì°ë ìµì ì ëë€. +view_alert_definition_notification_operation_editor_relative_descendant_loadFailed = ì íì ììì ì»ì ì ììµëë€ +view_alert_definition_notification_operation_editor_relative_descendant_tooltip = ê²ììì ì íì ì ìë ê²œë¡ ì íìì ì°Ÿêž° 늬ìì€ ì í +view_alert_definition_notification_operation_editor_specific_pick_button = ì í +view_alert_definition_notification_operation_editor_specific_pick_error_invalid = 늬ìì€ë¥Œ ì ííììì€ +view_alert_definition_notification_operation_editor_specific_pick_error_no_operation = íë ìŽìì ìì ì ì¬ì©íì¬ ëŠ¬ìì€ë¥Œ ì ííììì€ +view_alert_definition_notification_operation_editor_specific_pick_text = 늬ìì€ë¥Œ ì í... +view_alert_definition_notification_operation_editor_specific_resource = 늬ìì€ +view_alert_definition_notification_role_editor_loadFailed = íì¬ì ìí ì ê²°ì í ì ììµëë€ - ë¹ ìíë¡ ììí©ëë€ +view_alert_definition_notification_role_editor_restoreFailed = íì¬ì ìí ì ì¬ì©í ì ììµëë€ - ë¹ ìíë¡ ììí©ëë€ +view_alert_definition_notification_role_editor_saveFailed = ì íí ìí ì ì ì¥í ì ììµëë€ +view_alert_definition_notification_user_editor_loadFailed = íì¬ ì¬ì©ì륌 ê²°ì í ì ììµëë€ - ë¹ ìíë¡ ììí©ëë€ +view_alert_definition_notification_user_editor_restoreFailed = íì¬ ì¬ì©ì륌 ì¬ì©í ì ììµëë€ - ë¹ ìíë¡ ììí©ëë€ +view_alert_definition_notification_user_editor_saveFailed = ì íí ì¬ì©ì륌 ì ì¥í ì ììµëë€ +view_alert_definition_recovery_editor_disable_when_fired = ë°ìì ë¹íì±í +view_alert_definition_recovery_editor_disable_when_fired_tooltip = ê²œê³ ê° ë°ìë í íŽì ëìŽìŒ íëì§ ì§ì í©ëë€. ìŒëš íŽì ëë©Ž, ê·ž ê²œê³ ë ìëìŒë¡ ë€ì íì±ííê±°ë ìëìŒë¡ ë€ì íì±ííêž° ìí 복구 ê²œê³ ë¥Œ ì€ì í ì ììµëë€. +view_alert_definition_recovery_editor_loadFailed = 복구 ë©ëŽë¥Œ ë§ë€ ì ììµëë€. +view_alert_definition_recovery_editor_none_available = ìì +view_alert_definition_recovery_editor_recovery_alert = ê²œê³ ë³µêµ¬ +view_alert_definition_recovery_editor_recovery_alert_tooltip = ê²œê³ ê° ë°ìë í 복구ëë (ìŠ, ë€ì íì±í) ëì ê²œê³ . 복구 ê²œê³ ë¥Œ ì ìíë ê²ìŽ ìëëŒë©Ž ì¬êž°ìì ê²œê³ ë¥Œ ì ííì§ ë§ììì€. +view_alert_definitions_create_failure = ê²œê³ ì ì ë§ë€êž°ì ì€íšíìµëë€ +view_alert_definitions_create_success = ê²œê³ ì ì ë§ë€êž°ì ì±ê³µíìµëë€ +view_alert_definitions_delete_confirm = ì íë ê²œê³ ì ì륌 ìì íìê² ìµëê¹? +view_alert_definitions_delete_failure = ì íë ê²œê³ ì ì륌 ìì íëë° ì€íšíìµëë€ +view_alert_definitions_delete_success = {0} ê²œê³ ì ì륌 ìì íëë° ì±ê³µíìµëë€ +view_alert_definitions_disable_confirm = ì íë ê²œê³ ì ì륌 íŽì íìê² ìµëê¹? +view_alert_definitions_disable_failure = ì íë ê²œê³ ì ì륌 íŽì íëë° ì€íšíìµëë€ +view_alert_definitions_disable_success = {0} ê²œê³ ì ì륌 ë¹íì±ííëë° ì±ê³µíìµëë€. +view_alert_definitions_enable_confirm = ì íë ê²œê³ ì ì륌 íì±ííìê² ìµëê¹? +view_alert_definitions_enable_failure = ì íë ê²œê³ ì ì륌 íì±ííëë° ì€íšíìµëë€. +view_alert_definitions_enable_success = {0} ê²œê³ ì ì륌 íì±ííëë° ì±ê³µíìµëë€. +view_alert_definitions_loadFailed = ê²œê³ ì ì ë°ìŽí°ë¥Œ ê²ìíëë° ì€íšíìµëë€ +view_alert_definitions_loadFailed_single = ID {0}ìŽ ë¶ì ê²œê³ ì ì ë°ìŽí°ë¥Œ ê²ìíëë° ì€íšíìµëë€ +view_alert_definitions_table_title_group = 귞룹 ê²œê³ ì ì +view_alert_definitions_table_title_resource = 늬ìì€ ê²œê³ ì ì +view_alert_definitions_update_failure = ê²œê³ ì ì ì ë°ìŽížì ì€íšíìµëë€ +view_alert_definitions_update_success = ê²œê³ ì ì ì ë°ìŽížì ì±ê³µíìµëë€ +view_alert_details_field_ack_at = ë€ì ìì¹ìì íìžíìµëë€ +view_alert_details_field_ack_by = ë€ì ì¬ëì ìíŽ íìžëììµëë€ +view_alert_details_field_recovery_info = 복구 ì 볎 +view_alert_details_field_resource_ancestry = 늬ìì€ ì¡°ì +view_alert_details_field_watched_resource = êŽì¬ 늬ìì€ +view_alert_details_loadFailed = ê²œê³ ì 볎륌 ê²ìíëë° ì€íšíìµëë€ +view_alerts_ack_confirm = ì íë ê²œê³ ë¥Œ íìžíìê² ìµëê¹? +view_alerts_ack_confirm_all = ìŽ ìì€ìì 몚ë ê²œê³ ë¥Œ íìžíìê² ìµëê¹? +view_alerts_ack_failure = ID {0}ìŽ ìë ê²œê³ ë¥Œ íìžíëë° ì€íšíìµëë€ +view_alerts_ack_failure_all = ìŽ ìì€ìì 몚ë ê²œê³ ë¥Œ íìžíëë° ì€íšíìµëë€ +view_alerts_ack_success = {0} ê²œê³ íìžì ì±ê³µíìµëë€ +view_alerts_delete_confirm = ì íë ê²œê³ ë¥Œ ìì íìê² ìµëê¹? +view_alerts_delete_confirm_all = ìŽ ìì€ìì 몚ë ê²œê³ ë¥Œ ìì íìê² ìµëê¹? +view_alerts_delete_failure = ID {0}ìŽ ìë ê²œê³ ë¥Œ ìì íëë° ì€íšíìµëë€ +view_alerts_delete_failure_all = ìŽ ìì€ìì 몚ë ê²œê³ ë¥Œ ìì íëë° ì€íšíìµëë€ +view_alerts_delete_success = {0} ê²œê³ ìì ì ì±ê³µíìµëë€ +view_alerts_field_ack_status = ìí +view_alerts_field_ack_status_ack = íìž ({0}) +view_alerts_field_ack_status_ackHover = {1}ìì {0}ì ìíŽ íìžëììµëë€ +view_alerts_field_ack_status_noAck = 믞íìž +view_alerts_field_ack_status_noAckHover = ìì§ íìžëì§ ìììµëë€ +view_alerts_field_ack_subject = íìž ì£Œì +view_alerts_field_ack_time = íìž ìê° +view_alerts_field_condition_text = ì¡°ê±Žë¶ í ì€íž +view_alerts_field_condition_text_many = ë€ì€ 조걎 +view_alerts_field_condition_text_none = 조걎ììŽ +view_alerts_field_condition_value = ì¡°ê±Žê° +view_alerts_field_enabled = ì íš +view_alerts_field_modified_time = ìì ìê° +view_alerts_field_parent = ë¶ëªš +view_alerts_field_priority = ì°ì ìì +view_alerts_field_protected = 볎ížë +view_alerts_field_protected_tooltip = ë§ìœ trueìŽë©Ž,ìŽ ì ìë ë¶ëªš ì ìì ìíŽ ë³ê²œëì§ ìëë¡ ë³Žížë©ëë€. ìŠ, ë¶ëªš ì ì ì€ì ìŽ ì ì륌 ì¬ì ìíì§ ììµëë€. +view_alerts_loadFailed = ê²œê³ ë°ìŽí°ë¥Œ ê°ì žì€ì§ 못íìµëë€ +view_alerts_table_filter_priority = ì°ì ìì íí° +view_alerts_table_title_group = 귞룹 ê²œê³ êž°ë¡ +view_alerts_table_title_resource = 늬ìì€ ê²œê³ êž°ë¡ +view_autoDiscoveryQ_committed = 컀ë°ë +view_autoDiscoveryQ_confirmSelect = íë«íŒì íì목ë¡ë ì ííìê² ìµëê¹? +view_autoDiscoveryQ_confirmSelectAll = ê° íë«íŒì íì목ë¡ë ì ííìê² ìµëê¹? +view_autoDiscoveryQ_deleted = ìì ë +view_autoDiscoveryQ_deselectAll = 몚ë ì íì íŽì +view_autoDiscoveryQ_field_discoveryTime = ë°ê²¬ ìê° +view_autoDiscoveryQ_field_inventoryStatus = ìžë²€í 늬 ìí +view_autoDiscoveryQ_field_parentId = ë¶ëªš ID +view_autoDiscoveryQ_ignore = 묎ì +view_autoDiscoveryQ_ignoreFailure = 늬ìì€ë¥Œ 묎ìíëë° ì€íšíìµëë€ +view_autoDiscoveryQ_ignoreInProgress = ì íí 늬ìì€ë¥Œ 묎ìíë€ê°ë... +view_autoDiscoveryQ_ignoreSuccessful = ì íí 늬ìì€ë¥Œ 묎ìíëë° ì±ê³µíìµëë€ +view_autoDiscoveryQ_ignored = 묎ìë +view_autoDiscoveryQ_importFailure = 늬ìì€ ê°ì žì€êž°ì ì€íšíìµëë€ +view_autoDiscoveryQ_importInProgress = ì íí 늬ìì€ë¥Œ ê°ì žì€êž°ì€... +view_autoDiscoveryQ_importSuccessful = ì íí 늬ìì€ ê°ì žì€êž°ì ì±ê³µíìµëë€. +view_autoDiscoveryQ_loadFailure = ìžë²€í 늬 복구 í륌 ë¡ëíëë° ì€íšíìµëë€ +view_autoDiscoveryQ_newAndIgnored = ì ê·íê³ ë¬Žìë +view_autoDiscoveryQ_noperm = (ìë 복구 í륌 볌 ì ìë ê¶íìŽ ììµëë€) +view_autoDiscoveryQ_selectAll = 몚ë ì í +view_autoDiscoveryQ_showStatus = íì +view_autoDiscoveryQ_title = ìë 복구 í +view_autoDiscoveryQ_unignore = 묎ì ìíš +view_autoDiscoveryQ_unignoreFailure = 늬ìì€ë¥Œ 묎ì ìíëë° ì€íšíìµëë€ +view_autoDiscoveryQ_unignoreInProgress = ì íë 늬ìì€ë¥Œ 묎ì ìíëì€... +view_autoDiscoveryQ_unignoreSuccessful = ì íë 늬ìì€ë¥Œ 묎ì ìíëë° ì±ê³µíìµëë€. +view_autoDiscoveryQ_uninventoried = ìžë²€í 늬 íŽì +view_bundleVersion_loadFailure = ë²ë€ ë²ì ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€. +view_bundle_bundle = ë²ë€ +view_bundle_bundleDeployment = ë²ë€ ë°°í¬ +view_bundle_bundleDeployments = ë²ë€ ë°°í¬ +view_bundle_bundleDestinations = ë²ë€ ëì +view_bundle_bundleFiles = ë²ë€ íìŒ +view_bundle_bundleType = ë²ë€ íì +view_bundle_bundleVersion = ë²ë€ ë²ì +view_bundle_bundleVersions = ë²ë€ ë²ì +view_bundle_bundles = ë²ë€ +view_bundle_createWizard_bundleDistro = ë²ë€ ë°°í¬ +view_bundle_createWizard_cancelFailure = ë²ë€ [{0}], ë²ì = [{1}] ìì±ì ì 첎 ì·šìì ì€íšíìµëë€. - ë²ë€ì ë°ìŽí°ë² ìŽì€ì ìì§ ëšì ììì§ë ëªšëŠ ëë€. +view_bundle_createWizard_cancelSuccessful = ë²ë€ [{0}], ë²ì = [{1}]ì ìì±ì ì·šìíìµëë€. +view_bundle_createWizard_clickToUploadRecipe = ë ìíŒ íìŒì ë¡ëíêž° ìíŽ íŽëŠíììì€ +view_bundle_createWizard_createFailure = ë²ë€ ìì±ì ì€íšíìµëë€ +view_bundle_createWizard_createSuccessful = ë²ì [{1}]ì [{0}]ëŒë ë²ë€ ìì±ì ì±ê³µíìµëë€. +view_bundle_createWizard_enterRecipe = ì¬ë°ë¥ž ë ìíŒë¥Œ ì ê³µíììì€ +view_bundle_createWizard_enterUrl = ë²ë€ ë°°í¬ íìŒì ë€ìŽë¡ë í URLì ì ë ¥íììì€ +view_bundle_createWizard_failedToUploadDistroFile = ë²ë€ ë°°í¬ íìŒ ì ë¡ëì ì€íšíìµëë€ +view_bundle_createWizard_failedToUploadFile = ë²ë€ íìŒ ì ë¡ëì ì€íšíìµëë€ +view_bundle_createWizard_loadBundleFileFailure = ìë²ìì ë²ë€ íìŒ ì 볎륌 íë í ì ììµëë€ +view_bundle_createWizard_noAdditionalFilesNeeded = ìŽ ë²ë€ì ìíŽ ì ë¡ë íŽìŒíë ì¶ê° íìŒìŽ ììµëë€ +view_bundle_createWizard_noBundleTypesAvail = ë²ë€ íì ì ì¬ì©í ì ììµëë€ +view_bundle_createWizard_noBundleTypesSupported = ë²ë€ íì ì íëë ì§ìíì§ ììµëë€ - ë²ë€ ë°°í¬ë¥Œ ì§ìíë ì¬ë°ë¥ž íë¬ê·žìžì ë°°í¬íŽìŒ í©ëë€ +view_bundle_createWizard_provideBundleDistro = ë²ë€ ë°°í¬ ì ê³µ +view_bundle_createWizard_recipeOption = ë ìíŒ +view_bundle_createWizard_title = ë²ë€ ìì± +view_bundle_createWizard_uploadInProgress = ì ë¡ë ì€ì ëë€... ìŽ ìì ì í° íìŒì 겜ì°ìë ëª ë¶ ì ë 걞늎 ì ììµëë€ +view_bundle_createWizard_uploadOption = ì ë¡ë +view_bundle_createWizard_uploadStepName = ë²ë€ íìŒ ì ë¡ë +view_bundle_createWizard_urlOption = URL +view_bundle_createWizard_windowTitle = ë²ë€ ìì± ë§ë²ì¬ +view_bundle_createWizard_youMustChooseOne = ë²ë€ì ìì±íë ìµì ì ì ííŽìŒ í©ëë€! +view_bundle_deleteConfirm = ìŽ ë²ë€ì ìì íìê² ìµëê¹? ìŽ ë²ë€ì 몚ë ë²ì , ëì, ë°°í¬ë ìì ë©ëë€. ê·žë¬ë, ì격 컎íší°ìì 컚í ìž ë¥Œ ì ê±°íì§ë ììµëë€ +view_bundle_deploy = ë°°í¬ +view_bundle_deployDir = ë°°í¬ ëë í 늬 +view_bundle_deployWizard_deployStep = ëì íë«íŒì ë²ë€ ë°°í¬ +view_bundle_deployWizard_deploying = ë°°í¬ ì€... +view_bundle_deployWizard_deploymentCreated = ë°°í¬ ìì±ì€... +view_bundle_deployWizard_deploymentCreatedDetail = ì€ëª [{1}] ë°°í¬ [{0}]ì ë§ë€ììµëë€ +view_bundle_deployWizard_deploymentCreatedDetail_concise = ë°°í¬ [{0}]ì ë§ë€ììµëë€ +view_bundle_deployWizard_deploymentScheduled = ë²ë€ ë°°í¬ê° ììœëììµëë€! +view_bundle_deployWizard_deploymentScheduledDetail = ë²ë€ ë°°í¬ [{0}]ì ëì 귞룹 [{1}] ììœëììµëë€ +view_bundle_deployWizard_deploymentScheduledDetail_concise = ë²ë€ ë°°í¬ê° ììœëììµëë€ +view_bundle_deployWizard_destinationCreatedDetail = ì€ëª [{1}] ë°°í¬ [{0}]ì ë§ë€ììµëë€ +view_bundle_deployWizard_destinationCreatedDetail_concise = ëì [{0}]ì ë§ë€ììµëë€ +view_bundle_deployWizard_error_1 = ì·šìì ëí ìë¡ìŽ ë°°í¬ ì ê±°ì ì€íšíìµëë€ +view_bundle_deployWizard_error_10 = ìŽë¯ž ì¡Žì¬íëì§ë 몚륎ë ëì ìì±ì ì€íšíìµëë€. (죌ì, ëì ë·°ìì êž°ì¡Ž ëì ë°°í¬ë¥Œ ìí) +view_bundle_deployWizard_error_11 = ì ìë ë°°í¬ ê²ìì ì€íšíìµëë€. +view_bundle_deployWizard_error_12 = ì ìë ë²ë€ ê²ìì ì€íšíìµëë€. +view_bundle_deployWizard_error_2 = ì·šìì ëí ìë¡ìŽ ëì ìì ì ì€íšíìµëë€ +view_bundle_deployWizard_error_3 = ë°°í¬ ê³íì ì€íšíìµëë€! +view_bundle_deployWizard_error_4 = ë°°í¬ ê³íì ì€íšíìµëë€: {0} +view_bundle_deployWizard_error_5 = ë°°í¬ ìì±ì ì€íšíìµëë€! +view_bundle_deployWizard_error_6 = ë°°í¬ ìì±ì ì€íšíìµëë€: {0} +view_bundle_deployWizard_error_7 = ë°°í¬ ìŽëŠì ê°ì žì€ëë° ì€íšíìµëë€ +view_bundle_deployWizard_error_8 = ëë¡ ë€ìŽìì ì¬ë°ë¥ž 늬ìì€ ê·žë£¹ì ì ííŽìŒ í©ëë€ +view_bundle_deployWizard_error_9 = ë€ì íìŽì§ìì ì ëì ìì ì ì€íšíìµëë€ +view_bundle_deployWizard_error_noBundleConfig = ë²ë€ ëì ì 볎ì ì·šëì ì€íšíìµëë€. ì íí 귞룹ì ë²ë€ ë°°í¬ ëììŽ ë ì ìë ì¬ë°ë¥ž íží 귞룹ì ëê¹? +view_bundle_deployWizard_getConfigSkip = ìŽ ë²ë€ ë²ì ìë ì€ì ìŽ íìíì§ ììµëë€. +view_bundle_deployWizard_getConfigStep = ë°°í¬ êµ¬ì± ì€ì +view_bundle_deployWizard_getDestStep = ìë¡ìŽ ëì +view_bundle_deployWizard_getDest_deployDir = ë°°í¬ ëë í 늬 +view_bundle_deployWizard_getDest_deployDir_help = ë²ë€ìŽ ë°°í¬ë ëë í 늬. ìŽ ëë í 늬ë 몚ë 늬ìì€ì ëíŽ ë°°í¬íêž° ìíŽ ëìŒí ê²ìŽ ì¬ì©ëì§ë§ ëì Ʞ볞 ëë í 늬ì ëí ìë 겜ë¡ì ëë€. ìŽë ë€ë¥ž ëì 늬ìì€ì ëí Ʞ볞 ëë í 늬 ë°°ì¹ê° ìŽëì ìëê° íëê²ì ë°ëŒ, ì ë ëë í 늬ë ë€ë¥ž ëì 늬ìì€ì ë°ëŒ 겜ë¡ê° ë ì ììì ì믞í©ëë€. +view_bundle_deployWizard_getDest_desc = ëì ì€ëª +view_bundle_deployWizard_getDest_destBaseDirName = Ʞ볞 ìì¹ +view_bundle_deployWizard_getDest_group_help = 귞룹ì íììŽ ëªšë ë²ë€ ë°°í¬ë¥Œ ìí ëì. ë²ë€ ë°°í¬ë¥Œ ì§ìíë ììì í¬íšíë íží ê·žë£¹ë§ ì í ê°ë¥í©ëë€. +view_bundle_deployWizard_getDest_name = ëì ìŽëŠ +view_bundle_deployWizard_getDest_name_help = ëì ìŽëŠ, ê·žê²ì 늬ìì€ì í¹ì 귞룹곌 í¹ì ë²ë€ 늬ìì€ì ëí ëì ëë í 늬륌 ìë³í©ëë€. +view_bundle_deployWizard_getInfoStep = ë°°í¬ ì 볎 ì ê³µ +view_bundle_deployWizard_getInfo_clean = íŽëŠ° ë°°í¬ì ëê¹? (ëì íë«íŒìì ë°°í¬ ëë í 늬륌 ì²ìíë) +view_bundle_deployWizard_getInfo_deploymentDesc = ë°°í¬ ì€ëª +view_bundle_deployWizard_getInfo_deploymentName = ë°°í¬ ìŽëŠ +view_bundle_deployWizard_getOptionsStep = ë°°í¬ ìµì +view_bundle_deployWizard_getOptions_deployLater = ëì€ì ë°°í¬ +view_bundle_deployWizard_getOptions_deployNow = ì§êž ë°°í¬ +view_bundle_deployWizard_getOptions_deployTime = ë°°í¬ ìê° +view_bundle_deployWizard_selectBundleStep = ë°°í¬ ë²ë€ ì í +view_bundle_deployWizard_selectBundle_single = ë°°í¬ë¥Œ ìíŽ ëšìŒ ë²ë€ë§ ì ííììì€ +view_bundle_deployWizard_selectVersionStep = ë²ë€ ë²ì ì ì ííììì€ +view_bundle_deployWizard_selectVersion_latest = ìµì ë²ì [{0}] +view_bundle_deployWizard_selectVersion_live = ìë ë²ì [{0}] +view_bundle_deployWizard_selectVersion_select = 목ë¡ìì ë²ì ì ì ííììì€ : +view_bundle_deployWizard_title = ë²ë€ ë°°í¬ ë§ë²ì¬ +view_bundle_deploy_action = ì¡ì +view_bundle_deploy_backButton = ëììŒë¡ ëìê°êž° +view_bundle_deploy_clickForError = ìë¬ ë©ìì§ ììŽìœì íŽëŠíììì€ +view_bundle_deploy_deleteConfirm = ìŽ ë²ë€ ë°°í¬ë¥Œ ìì íìê² ìµëê¹? ìŽê²ì ë°ìŽí°ë² ìŽì€ììë§ ìì í©ëë€; ì격 컎íší°ì ë°°í¬ë 몚ë ë²ë€ ëŽì©ìŽ ì ì§ë©ëë€. +view_bundle_deploy_deleteFailure = ë²ë€ ë°°í¬ [{0}]ì ìì ì ì€íšíìµëë€. +view_bundle_deploy_deleteSuccessful = ë²ë€ ë°°í¬ [{0}]ì ìì ì ì±ê³µíìµëë€. +view_bundle_deploy_deployedBy = ë€ìì ìíŽ ë°°í¬ë +view_bundle_deploy_deploymentPlatforms = ë°°í¬ ëŠ¬ìì€ +view_bundle_deploy_installDetails = ììží ì€ì¹ +view_bundle_deploy_loadBundleFailure = ë²ë€ì ê²ìì ì€íšíìµëë€ +view_bundle_deploy_loadDeployFailure = ë²ë€ ë°°í¬ ë¡ëì ì€íšíìµëë€ +view_bundle_deploy_loadFailure = ë²ë€ ë°°í¬ ë¡ëì ì€íšíìµëë€ +view_bundle_deploy_name = ë°°í¬ ìŽëŠ +view_bundle_deploy_selectARow = ì€ì¹ ì 볎륌 íìíë íì ì ííììì€ +view_bundle_deploy_tagUpdateFailure = ë²ë€ ë°°í¬ íê·žì ì ë°ìŽížì ì€íšíìµëë€ +view_bundle_deploy_tagUpdateSuccessful = ë²ë€ ë°°í¬ íì€ì ì ë°ìŽížì ì±ê³µíìµëë€ +view_bundle_deploy_time = ë°°í¬ ìê° +view_bundle_deployed = ë°°í¬ +view_bundle_deployments = ë°°í¬ +view_bundle_dest_backToBundle = ë²ë€ë¡ ê°êž° +view_bundle_dest_baseDirName = Ʞ볞 ìì¹ +view_bundle_dest_created = ë§ë€ìŽì§ +view_bundle_dest_deleteConfirm = ìŽ ë²ë€ ëìì ìì íìê² ìµëê¹? ìŽê²ì ë°ìŽí°ë² ìŽì€ììë§ ìì í©ëë€; ì격 컎íší°ì ë°°í¬ë 몚ë ë²ë€ ëŽì©ìŽ ì ì§ë©ëë€. +view_bundle_dest_deleteFailure = ë²ë€ ëì [{0}]ì ìì ì ì€íšíìµëë€. +view_bundle_dest_deleteSuccessful = ë²ë€ ëì [{0}]ì ìì ì ì±ê³µíìµëë€ +view_bundle_dest_deployDir = ë°°í¬ ëë í 늬 +view_bundle_dest_group = 귞룹 +view_bundle_dest_lastDeployedVersion = ë§ì§ë§ ë°°í¬ ë²ì +view_bundle_dest_lastDeploymentDate = ë§ì§ë§ ë°°í¬ ë ì§ +view_bundle_dest_lastDeploymentStatus = ë§ì§ë§ ë°°í¬ ìí +view_bundle_dest_loadFailure = ë²ë€ ëìì ë¡ëíëë° ì€íšíìµëë€ +view_bundle_dest_loadFailureVersionInfo = ë°°í¬ë ë²ë€ ëìì ë²ì ì 볎 ë¡ëì ì€íšíìµëë€ +view_bundle_dest_purgeConfirm = ìŽ ìì ì 몚ë ì격 컎íší°ìì ë²ë€ 컚í ìž ë¥Œ ì ê±°í©ëë€. ìŽê²ì ìííìê² ìµëê¹? +view_bundle_dest_purgeFailure = ì격 컎íší°ì ìŒë¶ ëë ì ë¶ìì ë²ë€ ëì [{0}]ì ì ê±°ì ì€íšíìµëë€. +view_bundle_dest_purgeSuccessful = ì격 컎íší°ì ìŒë¶ ëë ì ë¶ìì ë²ë€ ëì [{0}]ì ì ê±°ì ì±ê³µíìµëë€. +view_bundle_dest_revertConfirm = ìŽê²ì 몚ë ì격 컎íší°ë¥Œ ìŽë² ë²ë€ ë°°í¬ë¡ ëë늜ëë€. ìŽê²ì ìííìê² ìµëê¹? +view_bundle_dest_tagUpdateFailure = ë²ë€ ëì íê·ž ì ë°ìŽížì ì€íšíìµëë€ +view_bundle_dest_tagUpdateSuccessful = ë²ë€ ëì íê·ž ì ë°ìŽížì ì±ê³µíìµëë€ +view_bundle_destinations = ëì +view_bundle_fileListView_fileSize = íìŒ í¬êž° +view_bundle_fileListView_loadFailure = ë²ë€ íìŒ ë°ìŽí° ë¡ëì ì€íšíìµëë€ +view_bundle_fileListView_md5 = MD5 +view_bundle_fileListView_sha256 = SHA256 +view_bundle_files = íìŒ +view_bundle_latestVersion = ìµì ë²ì +view_bundle_list_backToAll = 몚ë ë²ë€ ëë늬Ʞ +view_bundle_list_deleteConfirm = ì íë ë²ë€ì ìì íìê² ìµëê¹? ë°ìŽí°ë² ìŽì€ìì ìì ì ë²ì , ëì, ë°°í¬ë¥Œ 몚ë ìì í©ëë€. ê·žë¬ë ì격 컎íší°ììë 컚í ìž ë¥Œ ì ê±°íì§ ììµëë€. +view_bundle_list_deleteFailure = ë²ë€ [{0}]ì ìì ì ì€íšíìµëë€ +view_bundle_list_deleteSuccessful = ë²ë€ [{0}]ì ìì ì ì±ê³µíìµëë€ +view_bundle_list_deletesFailure = ë²ë€ì ìì ì ì€íšíìµëë€ +view_bundle_list_deletesSuccessful = ë²ë€ì ìì ì ì±ê³µíìµëë€ +view_bundle_list_destinationsCount = ëì 칎ìŽíž +view_bundle_list_error1 = [{0}]ì ë°°í¬íë ë²ë€ì ë¡ëì ì€íšíìµëë€ +view_bundle_list_error2 = [{0}]ì ë°°í¬íêž° ìí ëšìŒ ë²ë€ì ê°ì žì€ëë° ì€íšíìµëë€ +view_bundle_list_error3 = ë²ë€ì ë¡ëíëë° ì€íšíìµëë€ +view_bundle_list_error4 = ìŽ ì ì¥ììì ë²ë€ì ì°Ÿì ì ììµëë€ +view_bundle_list_loadFailure = ë°°í¬ëë ë²ë€ [{0}]ì ë¡ëì ì€íšíìµëë€ +view_bundle_list_loadWithLatestFailure = ìµì ë²ì ë°ìŽí°ì ë²ë€ ë¡ê·žì ì€íšíìµëë€ +view_bundle_list_singleLoadFailure = ë°°í¬ë ëšìŒ ë²ë€ [{0}]ì ê°ì žì€ëë° ì€íšíìµëë€ +view_bundle_list_tagUpdateFailure = ë²ë€ íê·ž ì ë°ìŽížì ì€íšíìµëë€ +view_bundle_list_tagUpdateSuccessful = ë²ë€ íê·ž ì ë°ìŽížì ì±ê³µíìµëë€ +view_bundle_list_versionsCount = ë²ì 칎ìŽíž +view_bundle_purge = ì ê±° +view_bundle_recipe = ë ìíŒ +view_bundle_resDeployDS_loadFailure = ë²ë€ 늬ìì€ ë°°í¬ì ë¡ëì ì€íšíìµëë€ +view_bundle_revert = ì·šì +view_bundle_revertWizard_confirmStep_confirmation = ìŽì ë°°í¬ìì ì€í ì€ìž ë°°í¬ë¥Œ ëë늬ë ì€ì ëë€. ê³ìíë €ë©Ž "ë€ì"ì íŽëŠíììì€... +view_bundle_revertWizard_confirmStep_failedToFindLiveDeployment = ì€í ì€ìž ë°°í¬ë¥Œ ì°Ÿì ì ììµëë€. ëë늎 ì ììµëë€. +view_bundle_revertWizard_confirmStep_liveDeployment = ì€í ì€ìž ë°°í¬ +view_bundle_revertWizard_confirmStep_name = ì·šì ë°°í¬ íìž +view_bundle_revertWizard_confirmStep_noLiveDeployment = 목ì ì§ [{0}]ì ì€íì€ìž ë°°í¬ë ì°Ÿì ì ììµëë€ +view_bundle_revertWizard_confirmStep_noLiveDeployment_concise = 목ì ì§ì ì€íì€ìž ë°°í¬ë ì°Ÿì ì ììµëë€ +view_bundle_revertWizard_confirmStep_noPriorDeployment = ìŽì ë°°í¬ [{1}]ê° ì¡Žì¬íì§ ìêž° ë묞ì ëì ì€ì ë°°í¬ [{0}]ì ì·šìí ì ììµëë€ +view_bundle_revertWizard_confirmStep_noPriorDeployment_concise = ìŽì ë°°í¬ê° ì¡Žì¬íì§ ìêž° ë묞ì ëì ì€ì ë°°í¬ë ì·šìí ì ììµëë€ +view_bundle_revertWizard_confirmStep_prevDeployment = ìŽì ë°°í¬ +view_bundle_revertWizard_getInfoStep_cleanDeploy = ë°°í¬ë¥Œ ìì íìê² ìµëê¹? (ìŽê²ì ì€ëë êž°ì¡Žì ë°°í¬ ëë í 늬륌 ì·šì ë°°í¬ë¥Œ ììíêž° ì ì ìì í©ëë€) +view_bundle_revertWizard_getInfoStep_getNameFailure = ì·šì ë°°í¬ ìŽëŠì ê°ì žì€ëë° ì€íšíìµëë€ +view_bundle_revertWizard_getInfoStep_name = ì·šì ì 볎 ì ê³µ +view_bundle_revertWizard_getInfoStep_revertDeployDesc = ë°°í¬ ì€ëª ì·šì +view_bundle_revertWizard_getInfoStep_revertDeployDescFull = [ì·šì ì ]\n{0}\n\n[ì·šì í]\n{1} +view_bundle_revertWizard_getInfoStep_revertDeployName = ë°°í¬ ìŽëŠ ì·šì +view_bundle_revertWizard_revertStep_name = ëì íë«íŒì ë²ë€ì ë°°í¬ +view_bundle_revertWizard_revertStep_reverting = ì·šì ì€... +view_bundle_revertWizard_revertStep_scheduled = ë°°í¬ ì·šì ìŒì ìŽ ì±ê³µíìµëë€! +view_bundle_revertWizard_revertStep_scheduledDetails = 늬ìì€ ê·žë£¹ [{1}]ìì ë²ë€ ë°°í¬ [{0}]ì ì·šì ìŒì ì ì±ê³µíìµëë€ +view_bundle_revertWizard_revertStep_scheduledFailure = ë°°í¬ ì·šì ìŒì ì ì€íšíìµëë€! +view_bundle_revertWizard_title = ë²ë€ ì·šì +view_bundle_revertWizard_windowTitle = ë²ë€ ì·šì ë§ë²ì¬ +view_bundle_tree_loadFailure = ë²ë€ ë°ìŽí° ë¡ëì ì€íšíìµëë€ +view_bundle_version_backToBundle = ë€ë¡ ê°êž° +view_bundle_version_bundleVersionTagUpdateFailure = ë²ë€ ë²ì íê·ž ì ë°ìŽížì ì€íšíìµëë€ +view_bundle_version_bundleVersionTagUpdateSuccessful = ë²ë€ ë²ì íê·ž ì ë°ìŽížì ì±ê³µíìµëë€ +view_bundle_version_deleteConfirm = ë²ë€ ë²ì ì ìì íìê² ìµëê¹? ìŽê²ì ì격 컎íší°ì ìŽë€ 컚í ìž ë ìì íì§ ììµëë€. +view_bundle_version_deleteFailure = ë²ë€ ë²ì [{0}]ì ìì íëë° ì€íšíìµëë€ +view_bundle_version_deleteSuccessful = ë²ë€ ë²ì [{0}]ì ìì íëë° ì±ê³µíìµëë€ +view_bundle_version_loadFailure = ë²ë€ ë²ì ì ë¡ëíëë° ì€íšíìµëë€ +view_bundle_versions = ë²ì +view_configCompare_comparingConfigs = ì€ì ë¹êµ +view_configCompare_configCompare = ì€ì ë¹êµ +view_configEdit_addItem = 목ë¡ì í목ì ì¶ê° +view_configEdit_confirm_1 = ë¹ì ìŽ ìžížìì ì íí ìì±ì ìì íìê² ìµëê¹? +view_configEdit_confirm_2 = íŽë¹ íì ìì íìê² ìµëê¹? +view_configEdit_confirm_3 = [{1}]ìŽ ì íë [{0}]ì ìì íìê² ìµëê¹? +view_configEdit_editRow = í ížì§ +view_configEdit_enterPropName = ì¶ê°í ìì±ì ìŽëŠì ì ë ¥íììì€. +view_configEdit_error_1 = ì€ì ìŽ ìŽ ëŠ¬ìì€ìì ì§ìíì§ ììµëë€. +view_configEdit_error_2 = ì°ê²° ì€ì ìŽ ìŽ ëŠ¬ìì€ìì ì§ìíì§ ììµëë€. +view_configEdit_error_3 = [{0}]ëŒë ìì±ì ì¶ê°í ì ììµëë€. ìì± ìŽëŠì ìŽë¯ž ìžížìì ì¬ì©ëê³ ììµëë€. +view_configEdit_files = íìŒ +view_configEdit_hideAll = 몚ë ìšêž°êž° +view_configEdit_jumpToSection = ì¹ì ìŒë¡ ìŽë +view_configEdit_maxBoundsExceeded = ìµë í¬êž° ë²ìê° ì¶©ì¡±ëìêž° ë묞ì ë ë€ë¥ž í목ì ì¶ê°í ì ììµëë€: {0} +view_configEdit_minBoundsExceeded = ìµìë¡ ì€ì ëììŒë¯ë¡ ìŽ í목ì ìì í ì ììµëë€: {0} +view_configEdit_msg_1 = ìì± [{0}]ì ìžížì ì¶ê°íìµëë€. +view_configEdit_msg_2 = ìžížìì ìì±ì ì ê±°íìµëë€. +view_configEdit_msg_3 = [{0} {1}] ìŽ ëª©ë¡ìì ì ê±° ëììµëë€. +view_configEdit_msg_4 = 목ë¡ì ì¶ê°ë í목 +view_configEdit_properties = ìì± +view_configEdit_property = Property +view_configEdit_tooltip_1 = 목ë¡ìì ì íë í목ì ìì í©ëë€. +view_configEdit_tooltip_2 = 목ë¡ì í목ì ì¶ê°í©ëë€. +view_configEdit_unset = Unset? +view_configEdit_viewRow = í 볎Ʞ +view_configurationDetails_allPropertiesValid = 몚ë ì€ì ìì±ì ì¬ë°ë¥ž ê°ìŽë¯ë¡, ìŽ ì€ì ì ì§êž ì ì¥ ê°ë¥í©ëë€. +view_configurationDetails_configNotUpdatedDueToNoChange = ì€ì ì ì ë°ìŽížëì§ ìììµëë€, ìëíë©Ž ìë¡ìŽ ì€ì ì íì¬ì ì€ì 곌 ëìŒíêž° ë묞ì ëë€. +view_configurationDetails_error_updateFailure = ì€ì ì ì ë°ìŽížíì§ ëª»íìµëë€. +view_configurationDetails_messageConcise = ì€ì ìŽ ì ë°ìŽížëììµëë€ - íì¬ ë²ì ì {0} ì ëë€. +view_configurationDetails_messageDetailed = 늬ìì€ [{1}]ì ì€ì ì {0} ë²ì ìŒë¡ ì ë°ìŽíž ëììµëë€. +view_configurationDetails_noConfigurationFetched = ì€ì ì ê²ìëì§ ììµëë€. ìŽê²ì íë¬ê·žìž ì€ì ëë ì€ì 몚ìì ëšìí ì°ê²° ì€ì ìŽ êºŒì žì ë¡ëíì§ ëª»íìì ì믞í©ëë€. +view_configurationDetails_noPermission = ìŽ ëŠ¬ìì€ì ì€ì ì ížì§í ì ìë ê¶íìŽ ììµëë€. +view_configurationDetails_somePropertiesInvalid = ë€ì ì€ì ìì±ì ì못ë ê° : {0}. ìŽ ê°ì ì€ì ìŽ ì ì¥ëêž° ì ì ê³ ì³ì žìŒ í©ëë€. +view_configurationHistoryDetails_error_loadFailure = ì€ì ëŽìì ë¡ëí ì ììµëë€. +view_configurationHistoryList_cannotDeleteCurrent = ì íë êž°ë¡ì íì¬ ì€ì ìŽ í¬íšëìŽ ììµëë€ - ê·žê²ì ìì í ì ììµëë€. +view_configurationHistoryList_cannotDeleteGroupItems = ì íë ì€ì ëŽìì 귞룹 ì€ì ì ì ë°ìŽížë¥Œ í¬íší©ëë€. ê°ë³ 늬ìì€ êž°ë¡ì ìì í ì ìëë¡ íêž° ì ì ë¶ëªšì 귞룹 êž°ë¡ì ì ê±°íŽìŒ í©ëë€. +view_configurationHistoryList_delete_failure = ì€ì êž°ë¡ ìì ì ì€íšíìµëë€. +view_configurationHistoryList_delete_success = ì íë ì€ì êž°ë¡ ìì ì ì±ê³µíìµëë€. +view_configurationHistoryList_rollback = 례백 +view_configurationHistoryList_rollback_failure = ì€ì 례백ì ì€íšíìµëë€. ìë ì€ì ì ì¬ì í ì íší©ëë€. +view_configurationHistoryList_rollback_success = ì íë ìŽì ì€ì ìì ì€ì ì 례백íëë° ì±ê³µíìµëë€. +view_configurationHistoryList_table_clickStatusIcon = ììží ëŽì©ì ìí ììŽìœì íŽëŠíììì€ +view_configurationHistoryList_table_statusFailure = ì€ì ì ë°ìŽíž ì€íš +view_configurationHistoryList_table_statusInprogress = ì€ì ì ë°ìŽížë ìì§ ì§íì€ì ëë€ +view_configurationHistoryList_table_statusNochange = ì€ì ì ë³ê²œëì§ ììµëë€ +view_configurationHistoryList_table_statusSuccess = ì€ì ì ë°ìŽížê° ì±ê³µíìµëë€ +view_configurationHistoryList_title = ì€ì ìŽë ¥ +view_connectionSettingsDetails_allPropertiesValid = 몚ë ì°ê²° ì€ì ìŽ ì¬ë°ë¥ž ê°ìŽë¯ë¡, ì€ì ì ì ì¥ê°ë¥í©ëë€. +view_connectionSettingsDetails_error_updateFailure = ì°ê²° ì€ì ì ë°ìŽížì ì€íšíìµëë€. +view_connectionSettingsDetails_messageConcise_updateSuccess = ì°ê²° ì€ì ìŽ ì ë°ìŽíž ëììµëë€. +view_connectionSettingsDetails_messageDetailed_updateSuccess = 늬ìì€ [{0}]ì ëí ì°ê²° ì€ì ìŽ ì ë°ìŽíž ëììµëë€. +view_connectionSettingsDetails_noPermission = ìŽ ëŠ¬ìì€ì ì°ê²° ì€ì ì ížì§í ê¶íìŽ ììµëë€. +view_connectionSettingsDetails_somePropertiesInvalid = ë€ì ì°ê²° ì€ì ì ì못ë ê° : {0}. ìŽ ê°ì ì€ì ìŽ ì ì¥ëêž° ì ì ê³ ì³ì žìŒ í©ëë€. +view_core_loggedOut = ë¡ê·ž ìì +view_core_noRecentAlerts = 늬í¬ížìì ìµê·Œ ìëŠŒìŽ ììµëë€ +view_core_recentAlerts = [{0}] ìµê·Œ ê²œê³ ê° ììµëë€ - ìµê·Œ ê²œê³ ëŠ¬í¬ížë¥Œ íŽëŠíììì€ +view_core_serverUnreachable = ìë²ì ì ê·Œí ì ìê±°ë ë€ìŽëìì ì ììµëë€ +view_core_uncaught = êžë¡ë² ìºì¹ëì§ ìì ììž +view_dashboardManager_deleteFail = ëì 볎ëì ì ê±°ì ì€íšíìµëë€. +view_dashboardManager_deleted = ëì 볎ë {0} ì ê±°ì ì±ê³µíìµëë€ +view_dashboardManager_error = ìë²ì ëì 볎ë륌 ì ì¥íëë° ì€íšíìµëë€ +view_dashboardManager_saved = ìë²ì ëì 볎ë {0}ì ì ì¥íìµëë€ +view_dashboardManager_success = ëì 볎ë륌 ì ì¥íìµëë€ +view_dashboard_favorites_error1 = ìŠê²šì°Ÿêž° 늬ìì€ë¥Œ ë¡ëíëë° ì€íšíìµëë€. +view_dashboardsManager_error1 = ìë¡ìŽ ëì 볎ë ì¶ê°ì ì€íšíìµëë€ +view_dashboardsManager_message_title_details = <h1>{0}ì ì€ì ê²ì íìí©ëë€</h1>\n<p>RHQ íë¡ì ížë ìŒë šì íµì¬ êž°ë¥ì ì¶ìííë íë¬ê·žìž êž°ë° ìì€í êŽëŠ¬ ì íêµ°ìì ì¬ë¬ ì í곌 íë«íŒì ìí íµí©ë ìì€í êŽëŠ¬ êž°ë¥ì ì ê³µí©ëë€. ìŽ íë¡ì ížë ê³ìžµíë 몚ëì ìíŽ ì€ê³ë ë°°í¬ë¥Œ ìí ì ì°í ìí€í ì²ë¥Œ ì ê³µí©ëë€.ê·žê²ì êž°ì ì 첎ì ëí ê°ì¬ ë° êž°ë¡ êŽëŠ¬ë¥Œ ì ê³µíë íµì¬ ì¬ì©ì ìží°íìŽì€ë¥Œ ëì í©ëë€. ìë²/ììŽì íž ìí€í ì²ë ì격êŽëŠ¬ ë° í¹ì ì íì ëí ì§ìì ì ê³µíë íë¬ê·žìžì ì ê³µí©ëë€.</p>\n <p>ìŽ êž°ë³ž ëì 볎ëì (ížì§ 몚ë) ë²íŒì íŽëŠíšìŒë¡ìš ížì§ í ì ììµëë€.</p> +view_dashboards_confirm1 = ìì íìê² ìµëê¹ +view_dashboards_portlets_refresh_fail1 = ìë ìë¡ê³ 칚 í¬í늿ì ëí 늬íë ì ì ë°ìŽížì ì€íšíìµëë€ +view_dashboards_portlets_refresh_fail2 = ìë ìë¡ê³ 칚 í¬í늿ì ëí 늬ë¡ë ë¹íì±íì ì€íšíìµëë€ +view_dashboards_portlets_refresh_multiple_min = {0} ë¶ +view_dashboards_portlets_refresh_none = ìë¡ê³ 칚 íì§ ìì +view_dashboards_portlets_refresh_one_min = 1 ë¶ +view_dashboards_portlets_refresh_success1 = í¬í늿 ìë 늬íë ì ê°±ì íìµëë€ +view_dashboards_portlets_refresh_success2 = ìë ìë¡ê³ 칚 í¬í늿 ìë¡ ê³ ì¹šì ì€ì§í©ëë€ +view_dashboards_title = ëì 볎ë +view_drift_button_detectNow = ì§êž ê²ì +view_drift_button_pinToDef = ì ìë¡ í ê³ ì +view_drift_button_pinToDef_confirm = í ê³ ì ìŽ ì€ë ì·ì ì ì ì€ë ì· 0ìŒë¡ ì€ì í©ëë€. êž°í 몚ë ì€ë ì·ì ê·ž ì ììì ìì ë©ëë€. ê·ž ì ìë í ê³ ì ë ê²ìŒë¡ íìëìŽ ìŽíì ë늬íížë íì í ê³ ì ë ì€ë ì·ì ë³Žê³ ë©ëë€. ìŽ ì€ë ì·ì ê·ž ì ìì í ê³ ì íìê² ìµëê¹? +view_drift_button_pinToTemplate = í í늿ìŒë¡ í ê³ ì +view_drift_button_pinToTemplate_confirm = í ê³ ì í, ìŽ ì€ë ì·ì ê·ž í í늿ì ì¬ì©íì¬ ë§ë 몚ë ì ì륌 ìíŽ ìŽêž° ì€ë ì·ìŒë¡ ì€ì ë©ëë€. ë§ìœ êž°ì¡Ž í í늿ì í ê³ ì ëë€ë©Ž í í늿ì êž°ì¡Ž ì ìë ìë¡ìŽ ìŽêž° ì€ë ì·ì í ê³ ì ëê³ ê·ž êž°ì¡Žì ì€ë ì·ì ìì ë©ëë€. ì íí ê²ì í í늿íêž° ìíŽ ê³ìíìê² ìµëê¹? +view_drift_carousel_sizeFilterLabel = ì€ë ì·ì ìµë íì ì +view_drift_carousel_startFilterLabel = ì€ë ì· ìì +view_drift_category_fileAdded = ì¶ê° íìŒ +view_drift_category_fileChanged = ë³ê²œ íìŒ +view_drift_category_fileNew = ìë¡ ë°ê²¬ë íìŒ +view_drift_category_fileRemoved = ìì íìŒ +view_drift_confirm_deleteAllDefs = 몚ë ë늬ííž ê²ì ì ì륌 ìì íìê² ìµëê¹? +view_drift_confirm_deleteDefs = ì íë ë늬ííž ê²ì ì ì륌 ìì íìê² ìµëê¹? +view_drift_confirm_deleteTemplate = ê²œê³ ! ìŽ í í늿ì ìì íë©Ž ì°ê²°ë 몚ë ë늬ííž ì ì ëí ìì íê² ë©ëë€. ìì ì 몚ë ì€ë ì·ê³Œ íšê» ìŽë¬í 첚ë¶ë ì ìê° ì구ì ìŒë¡ ìì€í ìì ì ê±°ë©ëë€. ê³ìíìê² ìµëê¹? +view_drift_failure_deleteDefs = ìŒë¶ ëë 몚ë ë늬ííž ê²ì ì ì ìì ì ì€íšíìµëë€. +view_drift_failure_deleteTemplates = ìŒë¶ ëë 몚ë ë늬ííž í í늿 ìì ì ì€íšíìµëë€ +view_drift_failure_detectNow = ë늬ííž ê²ì ì€í ìì²ì 볎ëŽëë° ì€íšíìµëë€ +view_drift_failure_load = ë늬ííž ìžì€íŽì€ì ì ê±°ì ì€íšíìµëë€ +view_drift_failure_pinToDef = ì ìì ì€ë ì·ì í ê³ ì ì ì€íšíìµëë€ +view_drift_success_defUpdated = ë늬ííž ê²ì ì ìê° ì ë°ìŽíž ëììµëë€. ìŽê²ì ê·ì ëë¡ ë€ì ê²ì ì€íì ìí¥ì ë¯žì¹ ê²ì ëë€. +view_drift_success_delete = ë늬ííž ìžì€íŽì€ {0} ìì ì ì±ê³µíìµëë€ +view_drift_success_deleteDefs = ë늬ííž ê²ì ì ì {0} ìì ì ì±ê³µíìµëë€ +view_drift_success_deleteTemplate = ë늬ííž í í늿 {0} ìì ì ì±ê³µíìµëë€ +view_drift_success_detectNow = ë늬ííž ê²ì ì€í ìì²ì 볎ëŽëë° ì±ê³µíìµëë€ +view_drift_success_pinToDef = ë늬ííž ì ìì ì€ë ì· {0} í ê³ ì ì ì±ê³µíìµëë€. +view_drift_success_templateUpdated = ë늬ííž í íëŠ¿ìŽ ì ë°ìŽíž ëììµëë€. ë늬ííž í í늿 ì ë°ìŽíž ë° ë³ê²œ ì¬íì 첚ë¶ë ì ìì ì ì©. +view_drift_table_attached = 첚ë¶ë? +view_drift_table_baseDir = Ʞ볞 ëë í 늬 +view_drift_table_driftHandlingMode = ë늬ííž ížë€ë§ +view_drift_table_driftHandlingMode_normal = ë³Žíµ +view_drift_table_driftHandlingMode_plannedChanges = ê³í ë³ê²œ +view_drift_table_hover_defNotPinned = ê·ž ë늬ííž ì ìë í ê³ ì ëì§ ììµëë€. íŽëŠíì¬ ìŽêž° ì€ë ì·ì 볎ììì€. +view_drift_table_hover_defPinned = ê·ž ë늬ííž ì ìë ìŽêž° ì€ë ì·ì í ê³ ì ëìŽ ììµëë€. íŽëŠíì¬ ìŽêž° ì€ë ì·ì 볎ììì€. +view_drift_table_hover_edit = íŽëŠíì¬ ë늬ííž ì ì ëë í í늿 ìì±ì 볎거ë ížì§íììì€. +view_drift_table_hover_outOfCompliance_drift = ë늬ííž +view_drift_table_hover_outOfCompliance_noBaseDir = Ʞ볞 ëë í 늬ë ì¡Žì¬íì§ ììµëë€. +view_drift_table_hover_templateNotPinned = ê·ž ë늬ííž í í늿ì ìŽë€ ì€ë ì·ë í ê³ ì ëì§ ììµëë€. +view_drift_table_hover_templatePinned = ê·ž ë늬ííž í í늿ì ì€ë ì·ì í ê³ ì ëìŽ ììµëë€. íŽëŠíì¬ í ê³ ì ë ì€ë ì·ì 볎ììì€. +view_drift_table_newFile = ìë¡ìŽ íìŒ +view_drift_table_oldFile = ìŽì íìŒ +view_drift_table_pinned = í ê³ ì +view_drift_table_resourceDef = 늬ìì€ ë늬ííž ê²ì ì ì +view_drift_table_resourceHistory = 늬ìì€ ë늬ííž êž°ë¡ +view_drift_table_snapshot = ì€ë ì· +view_drift_table_snapshotTime = ì€ë ì· ìê° +view_drift_table_template = í í늿 +view_drift_table_title_initialSnapshot = ì ì [{0}]ì ëí ìŽêž° ì€ë ì· : í ê³ ì = [{1}] +view_drift_table_title_snapshot = ì ì [{1}]ì ëí ì€ë ì· [{0}] +view_drift_table_title_templateSnapshot = í í늿 [{0}]ì ëí í ê³ ì ë ì€ë ì· +view_drift_wizard_addDef_failure = ë늬ííž ê²ì ì ì [{0}]ì ì ê· ì¶ê°ì ì€íšíìµëë€ +view_drift_wizard_addDef_infoStepHelp = ê° ë늬ííž ê²ì ì ìë ë늬ííž ëªšëí°ë§ì ìíí ì ìë íìŒì ì§í©ì ì€ëª í©ëë€. ì ìê° íì±ííê³ ë¹íì±í í ì ììµëë€. ê²ì ì€í ê°ê²©ì ì ìíê³ êž°ë³ž ëë í 늬 ë° ìµì íìŒ íí°ë¥Œ ì§ì í©ëë€. ê° ëŠ¬ìì€ ì íì ì ê³µ ë늬ííž ê²ì ë€ìì ížì§ í ì ììµëë€. ìì ì ìë¡ ì¬ì©í ì ìë íë ìŽìì 믞늬 ì ì ë í í늿 ìì ê²ì ëë€. +view_drift_wizard_addDef_infoStepName = ìë¡ìŽ ë늬ííž ê°ì§ ì ìì ëí í í늿ì ì íí©ëë€ +view_drift_wizard_addDef_success = ì ê· ë늬ííž ê²ì ì ì [{0}] ì¶ê°ì ì±ê³µíìµëë€. ììŽì ížë ì ë°ìŽíž ë©ëë€. +view_drift_wizard_addDef_templatePrompt = ë늬ííž ì ì í í늿 +view_drift_wizard_addDef_title = 늬ìì€ íì [{0}]륌 ìí ë늬ííž ê²ì ì ì륌 ì¶ê°íììì€. +view_drift_wizard_addDef_windowTitle = ë늬ííž ê°ì§ ì ì ë§ë²ì¬ ì¶ê° +view_drift_wizard_addTemplate_failure = ì ê· ë늬ííž í í늿 [{0}]ì ì¶ê°ì ì€íšíìµëë€ +view_drift_wizard_addTemplate_infoStepHelp = ê° ë늬ííž í í늿ì êž°ì¡Ž í í늿ìì íìë©ëë€. ìŽ êž°ì¡Žì í í늿곌 ì ì¬, ëë íë¬ê·žìž ì ì í í늿ìê²ì ì í í늿ì 구ì¶íë ë¹ ë¥ž ë°©ë²ì ì ê³µí©ëë€. ë늬ííž ì ìì²ëŒ, í í늿 ë늬íížê° 몚ëí°ë§ì ìí í ììë íìŒì ì§í©ì ì€ëª í©ëë€. ìí©ì ë°ëŒ í í늿ìì íìë ì ì íìŒ ì€ì ì ë³ê²œíê±°ë, êž°í ì€ì ì ë³ê²œí ì ìë 겜ì°ë ììµëë€. í í늿 ìŽëŠì ìì ì í ëŽìì ê³ ì íŽìŒí©ëë€. +view_drift_wizard_addTemplate_infoStepName = ìì í í늿 ì í +view_drift_wizard_addTemplate_success = ì ê· ë늬ííž í í늿 [{0}] ì¶ê°ì ì±ê³µíìµëë€. +view_drift_wizard_addTemplate_title = íì [{0}]ì ë늬ííž ì ì í í늿ì ì¶ê°íììì€ +view_drift_wizard_addTemplate_windowTitle = ë늬ííž ì ì í í늿 ì¶ê° ë§ë²ì¬ +view_drift_wizard_pinTemplate_confirmNotPinned = í í늿ì ëí íì¬ì 믞ëì ê° ë늬ííž ì ìê° ìŒëš í ê³ ì ëë©Ž ê·ž í í늿ì ìŽêž° ì€ë ì·ìŽ í í늿ì í ê³ ì ë ì€ë ì·ìŒë¡ ì€ì ëëë¡ í©ëë€. ìŽ í í늿ì êž°ì¡Ž ì ìë ìë¡ìŽ ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ë©ëë€. ìŽ í í늿ì êž°ì¡Ž ì ìë ì ê· ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ëê³ ëªšë êž°ì¡Ž ì€ë ì·ì ìì ë©ëë€. ì€ë ì·ì í í늿 í ê³ ì ì ê³ìíìê² ìµëê¹? +view_drift_wizard_pinTemplate_confirmPinned = ê²œê³ !ìŽ í í늿ì ìŽë¯ž í ê³ ì ëìŽ ììµëë€. í íëŠ¿ìŽ ì ì€ë ì·ì ë€ì í ê³ ì í ì ììµëë€. í í늿ì ëí íì¬ì 믞ëì ê° ë늬ííž ì ìê° ìŒëš í ê³ ì ëë©Ž ê·ž í í늿ì ìŽêž° ì€ë ì·ìŽ í í늿ìŽìë í ê³ ì ë ì€ë ì·ìŒë¡ ì€ì ëëë¡í©ëë€. ìŽ í í늿ì êž°ì¡Ž ì ìë ì ê· ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ëê³ ëªšë êž°ì¡Ž ì€ë ì·ì ìì ë©ëë€. ìŽ ìë¡ìŽ ì€ë ì·ì í í늿ì í ê³ ì ì ê³ìíìê² ìµëê¹? +view_drift_wizard_pinTemplate_duplicate_name_error = í í늿 ìŽëŠì ê³ ì íŽìŒ í©ëë€ +view_drift_wizard_pinTemplate_failure = ë늬ííž í í늿 [{0}]ì ì€ë ì·ì í ê³ ì íëë° ì€íšíìµëë€ +view_drift_wizard_pinTemplate_infoStepExistingTemplate = íì¬ í í늿ì í ê³ ì +view_drift_wizard_pinTemplate_infoStepHelp = í ê³ ì ì íë í í늿ì ì ííììì€. í í늿ì ëí íì¬ì 믞ëì ê° ë늬ííž ì ìê° ìŒëš í ê³ ì ëë©Ž ê·ž í í늿ì ìŽêž° ì€ë ì·ìŽ í íëŠ¿ìŽ ìë í ê³ ì ë ì€ë ì·ìŒë¡ 구ì±ë ê²ì ê°ê² ëëë¡ í©ëë€. ê·žëŠ¬ê³ ê·ž ì ì ì첎ë í ê³ ì ë ê²ìŒë¡ íìë©ëë€. ìŽê²ì êž°ëëë íìŒ ìžížìì ë늬íížë¥Œ ê°ì§íë ë° ì¬ì©ë©ëë€. ìŽ í í늿ì ëí êž°ì¡Ž ì ìë ìë¡ìŽ ìŽêž° ì€ë ì·ìŒë¡ ì¬ì€ì ëê³ ëªšë êž°ì¡Ž ì€ë ì·ì ìì ëë ì ì ì ìíììì€. +view_drift_wizard_pinTemplate_infoStepName = í ê³ ì ëë í í늿 ì í +view_drift_wizard_pinTemplate_infoStepNewTemplate = ì í í늿ì í ê³ ì (ì€ë ì· ë늬ííž ì ììì ëì¶ ë ê²) +view_drift_wizard_pinTemplate_infoStepRadioHelp = ì€ë ì·ì ì ê· ëë êž°ì¡Žì ë늬ííž í í늿ì í ê³ ì í ì ììµëë€. ìŽ 'ì í í늿' ìµì ì ì¬ì©ìì ìì ìíŽ ì 뢰 ì ìì ì€ë ì·, 늬ìì€ ìì€ê³Œ íì ìì€ìì í í늿í í ì ìëë¡ í©ëë€. ê·ž ì í í늿ì ë€ì íŽë¹ íì ì 구ì±ìì ì ì©í ì ììµëë€. ê·ž ì í í늿ì ìŽêž°ìë ì€ë ì· ë늬ííž ì ì륌 ë³µì¬íì§ë§ ë€ì ëšê³ìì ížì§ í ì ììµëë€. ê·ž ìŽëŠì ë³ê²œíŽìŒ íê³ , ê·ž íì ì ë í¹í ë늬ííž í í늿 ìŽëŠìŽìŽìŒ í©ëë€. 'êž°ì¡Ž í í늿' ìµì ì ì¬ì©ìê° ì íí ì€ë ì·ì êž°ì¡Ž í í늿ì ëí í ê³ ì ëë ë€ì í ê³ ì ì í ì ìê² í©ëë€. ì¬ë°ë¥Žê² ì€ì íë €ë©Ž, êž°ì¡Ž í í늿ì ê°ì ëë í 늬륌 ì€ë ì· ì ìë¡ ëªšëí°ë§ í ì ììŽìŒ í©ëë€. ì í ììë ì ë¹í êž°ì¡Ž í íëŠ¿ë§ íìí©ë ë€. ë§ìœ ì ë¹íì§ ìì êž°ì¡Ž í íëŠ¿ìŽ ì¡Žì¬íëëŒë ìŽ ìµì ì ì íëì§ ììµëë€. +view_drift_wizard_pinTemplate_infoStepRadioTitle = í í늿 ì í +view_drift_wizard_pinTemplate_infoStepSelectBlocked = êž°ì¡Ž í í늿ìì ì€ë ì·ì ì ìì ê°ì ëë í 늬륌 ê°ìíë ê²ì ì¡Žì¬íì§ ììµëë€. ê³ìíë €ë©Ž 'ì í í늿' ìµì ì ì ííììì€. +view_drift_wizard_pinTemplate_infoStepSelectTitle = êž°ì¡Ž í í늿 +view_drift_wizard_pinTemplate_success = ë늬ííž í í늿 [{0}]ì í ê³ ì ì ì±ê³µíìµëë€. +view_drift_wizard_pinTemplate_title = íì [{2}] ë늬ííž í í늿ì ì ì [{1}]ì ì€ë ì· [{0}]ì í ê³ ì +view_drift_wizard_pinTemplate_windowTitle = í ê³ ì ë늬ííž ì ì í í늿 ë§ë²ì¬ +view_dynagroup_children = ëì 귞룹ì ìì +view_dynagroup_compatible = íží +view_dynagroup_definitionAlreadyExists = ìŽë¯ž ìŽ ìŽëŠì 귞룹 ì ìê° ì¡Žì¬í©ëë€ +view_dynagroup_definitionCreated = 귞룹 ì ì ìŽëŠ [{0}]ì ë§ë€ììµëë€ +view_dynagroup_definitionLoadFailure = 귞룹 ì ì ë¡ëì ì€íšíìµëë€ +view_dynagroup_definitions = ëì 귞룹 ì ì +view_dynagroup_deleteFailureSelection = ì íí 귞룹 ì ì ìì ì ì€íšíìµëë€ +view_dynagroup_deleteSuccessfulSelection = 귞룹 ì ì [{0}] ìì ì ì±ê³µíìµëë€ +view_dynagroup_editing = [{0}]ì ížì§ì€ +view_dynagroup_exprBuilder_addExpression = ì ì¶ê° +view_dynagroup_exprBuilder_comparisonType = ë¹êµ íì +view_dynagroup_exprBuilder_comparisonType_contains = í¬íš +view_dynagroup_exprBuilder_comparisonType_endsWith = ë¡ ëëë +view_dynagroup_exprBuilder_comparisonType_equals = ëìŒ +view_dynagroup_exprBuilder_comparisonType_startsWith = ë¡ ììíë +view_dynagroup_exprBuilder_comparisonType_tooltip = ë¹êµ íì +view_dynagroup_exprBuilder_definingPlugin = ì ì íë¬ê·žìž +view_dynagroup_exprBuilder_definingPlugin_tooltip = ê²ìì ìí íë¬ê·žìž +view_dynagroup_exprBuilder_expression = ì +view_dynagroup_exprBuilder_expressionType = ì íì +view_dynagroup_exprBuilder_expressionType_pluginConfig = íë¬ê·žìž ì€ì +view_dynagroup_exprBuilder_expressionType_resource = 늬ìì€ +view_dynagroup_exprBuilder_expressionType_resourceCategory = 늬ìì€ ì¹Ží ê³ ëŠ¬ +view_dynagroup_exprBuilder_expressionType_resourceConfig = 늬ìì€ ì€ì +view_dynagroup_exprBuilder_expressionType_resourceType = 늬ìì€ íì +view_dynagroup_exprBuilder_expressionType_tooltip = ìŽ ì ìì±ì ë€ììŒë¡ ì íë©ëë€ :<br/> <b>늬ìì€</b>: ìŽëŠê³Œ ë²ì ë± ëŠ¬ìì€ ìì±<br/> <b>늬ìì€ íì </b>: í¹ì íì ì 늬ìì€ ê²ì<br/> <b>늬ìì€ ì¹Ží ê³ ëŠ¬</b>: íë«íŒ, ìë², ìë¹ì€ ë± ì¹Ží ê³ ëŠ¬ë³ ëŠ¬ìì€ ê²ì<br/> <b>í¹ì±</b>: 몚ëí°ë í¹ì± ìíŽì ì íí ê° ëŠ¬ìì€<br/> <b>íë¬ê·žìž ì€ì </b>: ì€ì ììì íë¬ê·žìž 컎í¬ëíž êµ¬ì± ì€ì ì ìí ê²ì<br/> <b>늬ìì€ ì€ì </b>: êŽëŠ¬ ììì êµ¬ì± ì€ì ì ìí ê²ì +view_dynagroup_exprBuilder_expressionType_trait = í¹ì± +view_dynagroup_exprBuilder_expression_tooltip = ìŽê²ì ë€ì ììì ì íì ìíŽ ííëë ì 첎 ìì ëë€. ìŽ í ì€ížë "ìì ì¶ê°" ë²íŒì íŽëŠíë©Ž 귞룹 ì ì ìì í ì€ížì ì¶ê°ë©ëë€. +view_dynagroup_exprBuilder_groupBy = Group by +view_dynagroup_exprBuilder_groupBy_tooltip = GroupByë ìì€í ìŽ ì ë ¥ ìì ê°ì íŒë² ë¶ì í ì ìê² í©ëë€. ì륌 ë€ìŽ, íŽë¬ì€í° ìŽëŠì GroupByíì¬ ëªšë íŽë¬ì€í° 구ì±ìì ê·ž ìì í¬íšë ê°ì íŽë¬ì€í° 귞룹ì ë§ëëë€. +view_dynagroup_exprBuilder_noPlugins = --íë¬ê·žìž ììŽ-- +view_dynagroup_exprBuilder_noProperties = --ìì± ììŽ-- +view_dynagroup_exprBuilder_noResourceTypes = --늬ìì€ íì ìì-- +view_dynagroup_exprBuilder_pluginLoadFailure = íë¬ê·žìž 목ë¡ì ê°ì žì¬ ì ììµëë€ +view_dynagroup_exprBuilder_propLoadFailure = ìì±ì 늬ì€ížë¥Œ ê°ì žì¬ ì ììµëë€ +view_dynagroup_exprBuilder_propertyName = ìì± ìŽëŠ +view_dynagroup_exprBuilder_propertyName_tooltip = 쿌늬ì ëí ìì± ìŽëŠ. ìŽê²ì 늬ìì€ íì 곌 ë§ì°¬ê°ì§ë¡ ì íì ì ë°ëŒ ì ìë©ëë€. +view_dynagroup_exprBuilder_resTypeLoadFailure = íë¬ê·žìž [{0}] 늬ìì€ íì 목ë¡ì ê°ì žì¬ ì ììµëë€ +view_dynagroup_exprBuilder_resource = 늬ìì€ +view_dynagroup_exprBuilder_resourceType = 늬ìì€ íì +view_dynagroup_exprBuilder_resourceType_tooltip = 늬ìì€ì íì +view_dynagroup_exprBuilder_resource_child = ìì +view_dynagroup_exprBuilder_resource_grandparent = ì¡°ë¶ëªš +view_dynagroup_exprBuilder_resource_greatGrandparent = ìŠì¡°ë¶ìŽëšžë +view_dynagroup_exprBuilder_resource_greatGreatGrandparent = ìŠì¡°ë¶ ìŽëšžëì ë¶ëªš +view_dynagroup_exprBuilder_resource_parent = ë¶ëªš +view_dynagroup_exprBuilder_resource_resource = 늬ìì€ +view_dynagroup_exprBuilder_resource_tooltip = 늬ìì€ì ë 벚ì ìíë ê²ìŒë¡ ì ííììì€. ì륌 ë€ìŽ, "ë¶ëªš"륌 ì ííë©Ž ë¶ëªš 늬ìì€ ìì ëëšžì§ ë¶ë¶ê³Œ ìŒì¹íëë¡ ëŠ¬ìì€ë¥Œ ë°ê²¬ í ì ììµëë€. +view_dynagroup_exprBuilder_savedExpression = ì ì¥ë ì +view_dynagroup_exprBuilder_title = ì ìì±êž° +view_dynagroup_exprBuilder_unset = ì€ì íŽì +view_dynagroup_exprBuilder_unset_tooltip = ì€ì íŽì ë ë°ìŽí°ë² ìŽì€ì nullê°ì 몚ë ë°ê²¬í©ëë€. ìŽê²ì ë°ìŽí°ë² ìŽì€ ì ì¥ìì ì°ëœì² ë°ìŽí°ì ìŽì ë¡ "="ì°ì°ì륌 ì¬ì©íë ê²ì ê°ë¥íì§ ììµëë€. +view_dynagroup_exprBuilder_value_tooltip = 쿌늬ì ìì ìí 묞ììŽ ê° +view_dynagroup_expression = ì +view_dynagroup_expressionBuilderIconTooltip = ì ìì±êž°... +view_dynagroup_expressionSet = ì ìžíž +view_dynagroup_lastCalculationTime = ìµì¢ ê³ì° ìê° +view_dynagroup_loadDefinitionFailure = 귞룹 ì ì [{0}]ì ë¡ëíëë° ì€íšíìµëë€ +view_dynagroup_loadDefinitionMissing = [{0}]ëŒë IDì 귞룹 ì ìë ì¡Žì¬íì§ ììµëë€ +view_dynagroup_mixed = íŒí© +view_dynagroup_newGroupDefinition = ì 귞룹 ì ì +view_dynagroup_nextCalculationTime = ë€ì ê³ì° ìê° +view_dynagroup_permDenied = 귞룹 ì ì륌 볌 ì ìë ê¶íìŽ ììµëë€ +view_dynagroup_recalcFailure = ìŽ ê·žë£¹ ì ì륌 ë€ì ê³ì°íëë° ì€íšíìµëë€ +view_dynagroup_recalcFailureSelection = ì íí 귞룹 ì ì륌 ë€ì ê³ì°íëë° ì€íšíìµëë€ +view_dynagroup_recalcSuccessful = ìŽ ê·žë£¹ ì ì륌 ë€ì ê³ì°íëë° ì±ê³µíìµëë€ +view_dynagroup_recalcSuccessfulSelection = [{0}] 귞룹 ì ì륌 ë€ì ê³ì°íëë° ì±ê³µíìµëë€ +view_dynagroup_recalculate = ë€ì ê³ì° +view_dynagroup_recalculationInterval = ì¬ ê³ì° ê°ê²© (ë¶) +view_dynagroup_recursive = ì¬ê· +view_dynagroup_saveAndRecalculate = ì ì¥ ë° ì¬ ê³ì° +view_dynagroup_saveFailure = 귞룹 ì ì ìŽëŠ [{0}]ì ì ì¥ì ì€íšíìµëë€ +view_dynagroup_saveSuccessful = 귞룹 ì ì ìŽëŠ [{0}]ì ì ì¥ì ì±ê³µíìµëë€ +view_dynagroup_singleSaveFailure = ì€ë¥ê° ë°ìíìµëë€ - íë ìì±ëìŽìŒ íì§ë§, ëì [{0}]ê° ë§ë€ìŽ ì¡ìµëë€ +view_dynagroup_template_customExpression = ì¬ì©ì ì ì ì... +view_dynagroup_template_downedResources = 몚ë 늬ìì€ë¥Œ íì¬ ë€ìŽí©ëë€ +view_dynagroup_template_jbossas4_clusters = JBossAS 4 - íŽë¬ì€í° +view_dynagroup_template_jbossas4_earClusters = JBossAS 4 - íŽë¬ì€í° EARs +view_dynagroup_template_jbossas4_hostingApp = JBossAS 4 - 몚ë ížì€í íë "ìì ì" ìì©íë¡ê·žëš +view_dynagroup_template_jbossas4_nonsecured = JBossAS 4 - ìì íì§ ìì 몚ë ê² +view_dynagroup_template_jbossas4_uniqueVersions = JBossAS 4 - ê³ ì ë²ì +view_dynagroup_template_jbossas5_clusters = JBossAS 5/6 - íŽë¬ì€í° +view_dynagroup_template_platforms = ìžë²€í 늬 íë«íŒ 늬ìì€ +view_dynagroup_template_uniqueResourceTypes = ìžë²€í 늬 ê³ ì 늬ìì€ íì +view_groupConfigEdit_member = ë©€ë² +view_groupConfigEdit_noListProps = 귞룹 ì€ì ì íì¬ ì§ìëì§ ìë ìì± ëª©ë¡ +view_groupConfigEdit_saveReminder = ì€ì ìŽ ë³ê²œëììµëë€ - ìŽë¬í ë³ê²œ ì¬íì ì ì¥íë ê²ì ìì§ ë§ììì€. - ê·žë ì§ ììŒë©Ž ìì€ë©ëë€\n +view_groupConfigEdit_setAll = 몚ë ê°ì ì€ì : +view_groupConfigEdit_tooltip_1 = ë©€ë² ê°ì ì°šìŽ - ížì§íë ììŽìœì íŽëŠíììì€. +view_groupConfigEdit_unset = ì€ì íŽì +view_groupConfigEdit_valsDiff = ë©€ë² ê°ì ì°šìŽ +view_groupConfigEdit_valsDiffForProp = ìì± [{0}]ì ëí ë©€ë² ê° +view_groupCreateWizard_createFailure = 늬ìì€ ê·žë£¹ [{0}]ì ìì±ì ì€íšíìµëë€ : {1} +view_groupCreateWizard_createStepName = 귞룹 ì€ì +view_groupCreateWizard_createStep_group_exists = ìŽëŠì 귞룹 [{0}]ìŽ ìŽë¯ž ì¡Žì¬í©ëë€ +view_groupCreateWizard_createStep_recursive = ì¬ê· +view_groupCreateWizard_createSuccessful_concise = [{0}]ëŒë ì 늬ìì€ ê·žë£¹ì ë§ë€ììµëë€. +view_groupCreateWizard_createSuccessful_full = [{2}] íì 늬ìì€ë¥Œ í¬íšíë ìŽëŠ [{1}] ì [{0}] 늬ìì€ ê·žë£¹ì ë§ë€ììµëë€ +view_groupCreateWizard_membersStepName = ì íë ë©€ë² +view_groupCreateWizard_title = 귞룹 ë§ë€êž° +view_groupCreateWizard_windowTitle = 귞룹 ë§ë€êž° +view_groupInventoryMembers_button_updateMembership = 구ì±ì ì ë°ìŽíž... +view_groupInventoryMembers_title_updateMembership = 구ì±ì ì ë°ìŽíž +view_group_common_emptyGroup = ë¹ ê·žë£¹ì íì íŒí©ìŒë¡ ê°ì£Œë©ëë€ +view_group_detail_failLoad = ID [{0}]ìŽ ìë 귞룹ì ë¡ëì ì€íšíìµëë€ +view_group_detail_failLoadComp = ID [{0}] ê·žë£¹ìŽ ì¡Žì¬íì§ ìê±°ë ììžì€í ì ììµëë€ +view_group_detail_failRecursiveChange = 귞룹 [{0}]ì ì¬ê· ì€ì ì ë°ìŽížì ì€íšíìµëë€ +view_group_detail_recursiveChange = 귞룹 [{0}]ì ì¬ê· ì€ì ë³ê²œì ì±ê³µíìµëë€ +view_group_inventory_activity_no_recent_metrics = ìŽ ê·žë£¹ì ìµê·Œ íµê³ë ììµëë€ +view_group_meas_schedules_title = 귞룹 íµê³ ìì§ ìŒì +view_group_membership_failFetch = 늬ìì€ ê·žë£¹ì ë°ì ì ì€íšíìµëë€ +view_group_membership_saveFailure = 귞룹 [{0}]ì 구ì±ì ì ë°ìŽíž ì€íš +view_group_membership_saveSuccessful = 귞룹 [{0}]ì íì ì격ì ê°±ì íìµëë€ +view_group_operationScheduleDetails_failedToLoadMembers = 귞룹 ë©€ë² ëŠ¬ìì€ì ë¡ëì ì€íšíìµëë€. +view_group_operationScheduleDetails_field_execute = ì€í +view_group_operationScheduleDetails_field_haltOnFailure = ì¥ì ë¡ ìží ì€ëš? +view_group_operationScheduleDetails_memberResource = íì 늬ìì€ +view_group_operationScheduleDetails_value_parallel = ëì ì€í +view_group_operationScheduleDetails_value_sequential = ìëì ëìŽë ììëë¡ (íì 늬ìì€ë¥Œ ëëê·ž ì€ ë룹íì¬ ìì륌 ë³ê²œ) +view_group_pluginConfig_edit_currentGroupProperties = íì¬ ê·žë£¹ ìì± +view_group_pluginConfig_edit_invalid = ë€ì ì°ê²° ì€ì ìì±ì ì못ë ê°ìŽ ì€ì ëìŽ ìêž° ë묞ì, ì°ê²° ì€ì ìŽ ì ì¥ëêž° ì ì ìì íŽìŒ í©ëë€ : [{0}] +view_group_pluginConfig_edit_noperm = ìŽ ê·žë£¹ ì°ê²° ì€ì ì ížì§í ê¶íìŽ ììµëë€ +view_group_pluginConfig_edit_saveFailure = 귞룹 ìŽëŠ [{1}]곌 íží [{0}]ì ëí 귞룹 ì€ì ì ë°ìŽíž ììì ì€íšíìµëë€ +view_group_pluginConfig_edit_saveInitiated_concise = 귞룹 ì°ê²° ì€ì ì ë°ìŽížê° ììëììµëë€ +view_group_pluginConfig_edit_saveInitiated_full = 귞룹 ì°ê²° ì€ì ì ë°ìŽížë 귞룹 ìŽëŠ [{1}]곌 íží [{0}]ì ìíŽ ììëììµëë€ +view_group_pluginConfig_edit_saveTooltip = 몚ë 귞룹 구ì±ìì ì°ê²° ì€ì ì ì ë°ìŽíží©ëë€ +view_group_pluginConfig_edit_valid = 몚ë ì°ê²° ì€ì ìì±ì ì¬ë°ë¥ž ê°ìŽ ì€ì ëìŽ ìêž° ë묞ì, ì°ê²° ì€ì ì ì ì¥í ì ììµëë€ +view_group_pluginConfig_members_fetchFailure = 귞룹 [{0}]ì íìì ìí íë¬ê·žìž êµ¬ì± ë³ê²œì ê°ì žì€ëë° ì€íšíìµëë€ +view_group_pluginConfig_members_fetchFailureConn = [{0}]ì ëí ë©€ë² ì°ê²° ì€ì ì ê±°ì ì€íšíìµëë€ +view_group_pluginConfig_members_fetchFailureConnInProgress = 귞룹 íë¬ê·žìž êµ¬ì± ì ë°ìŽížë íì¬ ì§í ì€ì ëë€. 귞룹 ì€ì ì ê²ìíêž° ì ì ì ë°ìŽížê° ìë£ ë ëê¹ì§ êž°ë€ëŠ¬ììì€. +view_group_pluginConfig_members_statusDetails = ìí ì 볎 +view_group_pluginConfig_members_statusFailure = ìŽ êµ¬ì± ì ë°ìŽížë ìì ìë ìŽì ë¡ ì€íš +view_group_pluginConfig_members_statusInprogress = ìŽ êµ¬ì± ì ë°ìŽížë ìì§ ì§í ì€ì ëë€ +view_group_pluginConfig_members_statusNochange = ìŽ êµ¬ì±ìë ë³íê° ììµëë€ +view_group_pluginConfig_members_statusSuccess = ìŽ êµ¬ì± ì ë°ìŽížê° ì±ê³µíìµëë€ +view_group_pluginConfig_members_title = 귞룹 ì°ê²° ì€ì ë©€ë² êž°ë¡ +view_group_pluginConfig_table_clickStatusIcon = ììží ëŽì©ì ìí ììŽìœì íŽëŠíììì€ +view_group_pluginConfig_table_deleteFailure = 귞룹 íë¬ê·žìž ì€ì êž°ë¡ì ìì íì§ ëª»íìµëë€ +view_group_pluginConfig_table_deleteSuccessful = [{0}] êž°ë¡ í목ì ìì íìµëë€ +view_group_pluginConfig_table_failFetch = 귞룹 êµ¬ì± ëŽìì ì·šëì ì€íšíìµëë€ +view_group_pluginConfig_table_msg1 = ê°ë³ 늬ìì€ì ìíë íì êž°ë¡ì ì°Ÿì 볌 ì ììµëë€ +view_group_pluginConfig_table_statusDetails = ìí ìžë¶ ì 볎 +view_group_pluginConfig_table_statusFailure = ìŽ ê·žë£¹ êµ¬ì± ì ë°ìŽížê° ì€íšíìµëë€ +view_group_pluginConfig_table_statusInprogress = ìŽ ê·žë£¹ 구ì±ì ì ë°ìŽížë ìì§ ì§í ì€ì ëë€ +view_group_pluginConfig_table_statusNochange = ìŽ ê·žë£¹ 구ì±ì ëí ë³ê²œì ììµëë€ +view_group_pluginConfig_table_statusSuccess = ìŽ ê·žë£¹ êµ¬ì± ì ë°ìŽížê° ì±ê³µíìµëë€ +view_group_pluginConfig_table_title = 귞룹 ì°ê²° ì€ì ëŽì +view_group_pluginConfig_table_viewMemberHistory = íì êž°ë¡ë³Žêž° +view_group_pluginConfig_table_viewSettings = ì€ì 볎Ʞ +view_group_pluginConfig_view_groupProperties = 귞룹 ìì± +view_group_pluginConfig_view_noperm = ë¹ì ì ì°ê²° ì€ì ì 볌 ì ìë ê¶íìŽ ììµëë€ +view_group_resConfig_edit_invalid = ë€ì êµ¬ì± ìì±ì ì못ë ê°ì í¬íšíë¯ë¡ ê·ž 구ì±ì ì ì¥íìêž° ì ì ìì ëìŽìŒ í©ëë€: [{0}] +view_group_resConfig_edit_loadFail = [{0}]ì ëí íì 늬ìì€ êµ¬ì±ì 꺌ëŽëë° ì€íšíìµëë€ +view_group_resConfig_edit_noperm = ìŽ ê·žë£¹ 구ì±ì ížì§í ì ìë ê¶íìŽ ììµëë€ +view_group_resConfig_edit_saveFailure = [{1}]ëŒë 귞룹 ìŽëŠê³Œ íží [{0}]ì ìí 귞룹 êµ¬ì± ì ë°ìŽíž ììì ì€íšíìµëë€ +view_group_resConfig_edit_saveInitiated_concise = 귞룹 êµ¬ì± ì ë°ìŽížë ìŽêž°í ëììµëë€ +view_group_resConfig_edit_saveInitiated_full = [{1}]ëŒë 귞룹 ìŽëŠê³Œ íží [{0}]ì ìí êµ¬ì± ì ë°ìŽížê° ììëììµëë€ +view_group_resConfig_edit_saveTooltip = 몚ë 귞룹 ë©€ë² êµ¬ì±ì ì ë°ìŽíží©ëë€ +view_group_resConfig_edit_valid = 몚ë êµ¬ì± ìì±ì ì¬ë°ë¥ž ê°ìŽë¯ë¡, ê·ž ì€ì ì ì ì¥ê°ë¥í©ëë€ +view_group_resConfig_members_fetchFailure = 귞룹 [{0}]ì íìì ìí 늬ìì€ êµ¬ì± ë³ê²œì ê°ì žì€ëë° ì€íšíìµëë€ +view_group_resConfig_members_fetchFailureConfig = [{0}]ì ëí íì 늬ìì€ êµ¬ì± ì€ì ì ì ê±°ì ì€íšíìµëë€ +view_group_resConfig_members_fetchFailureConfigInProgress = 귞룹 늬ìì€ êµ¬ì±ì ì ë°ìŽížê° ì§íì€ì ëë€. 귞룹 ì€ì ì ê²ìíêž° ì ì ì ë°ìŽížê° ìë£ë ëê¹ì§ êž°ë€ë €ì£Œììì€. +view_group_resConfig_members_statusDetails = ìí ìžë¶ ì 볎 +view_group_resConfig_members_statusFailure = ìŽ ì€ì ì ë°ìŽížë ì ì ìë ìŽì ë¡ ì€íšíìµëë€ +view_group_resConfig_members_statusInprogress = ìŽ ì€ì ì ë°ìŽížë ìì§ ì§íì€ì ëë€ +view_group_resConfig_members_statusNochange = ìŽ ì€ì ì ë³ê²œëì§ ìììµëë€ +view_group_resConfig_members_statusSuccess = ìŽ ì€ì ì ë°ìŽížê° ì±ê³µíìµëë€ +view_group_resConfig_members_title = 귞룹 늬ìì€ ì€ì ì ë©€ë² êž°ë¡ +view_group_resConfig_table_clickStatusIcon = ììží ëŽì©ì ìí ììŽìœì íŽëŠíììì€ +view_group_resConfig_table_deleteFailure = 귞룹 늬ìì€ êµ¬ì± êž°ë¡ ìì ì ì€íšíìµëë€ +view_group_resConfig_table_deleteSuccessful = [{0}] êž°ë¡ì ìì íìµëë€ +view_group_resConfig_table_failFetch = 귞룹 늬ìì€ êµ¬ì± ëŽìì ê°ì žì€ëë° ì€íšíìµëë€ +view_group_resConfig_table_msg1 = ê°ë³ 늬ìì€ì ìíë íì êž°ë¡ì ì°Ÿì 볌 ì ììµëë€ +view_group_resConfig_table_statusDetails = ìí ìžë¶ ì 볎 +view_group_resConfig_table_statusFailure = ìŽ ê·žë£¹ ì€ì ì ë°ìŽížê° ì€íšíìµëë€ +view_group_resConfig_table_statusInprogress = ìŽ ê·žë£¹ ì€ì ì ë°ìŽížë ìì§ ì§íì€ì ëë€ +view_group_resConfig_table_statusNochange = ìŽ ê·žë£¹ ì€ì ì ëí ë³ê²œì ììµëë€ +view_group_resConfig_table_statusSuccess = ìŽ ê·žë£¹ ì€ì ì ë°ìŽížê° ì±ê³µíìµëë€ +view_group_resConfig_table_title = 귞룹 늬ìì€ ì€ì ëŽì +view_group_resConfig_table_viewMemberHistory = íì êž°ë¡ ë³Žêž° +view_group_resConfig_table_viewSettings = ê²ì ì€ì +view_group_resConfig_view_groupProperties = 귞룹 ìì± +view_group_resConfig_view_noperm = 늬ìì€ êµ¬ì± ì€ì ì 볌 ì ìë ê¶íìŽ ììµëë€ +view_group_summary_compatible = ížíì± +view_group_summary_descUpdateFailure = ID [{0}]ì ê°ì§ 늬ìì€ ê·žë£¹ì ì€ëª ì ë³ê²œí ì ììµëë€ +view_group_summary_descUpdateSuccessful = ìŽ ëŠ¬ìì€ ê·žë£¹ì ì€ëª ì ë³ê²œíìµëë€ +view_group_summary_dynamic = ëì +view_group_summary_dynamicNote = ëì 귞룹 ìŽëŠê³Œ ì€ëª ì êŽëŠ¬ë¥Œ ìíŽì ížì§í ì ììµëë€ +view_group_summary_groupDefinition = 귞룹 ì ì +view_group_summary_memberCount = ë©€ë² ì +view_group_summary_memberType = ë©€ë² íì +view_group_summary_mixed = íŒí© +view_group_summary_nameUpdateFailure = ID [{0}]ì ê°ì§ 늬ìì€ ê·žë£¹ì ìŽëŠ ë³ê²œì ì€íšíìµëë€ - [{1}]ìì [{2}]륌 ë³ê²œí ì ììµëë€ +view_group_summary_nameUpdateSuccessful = ID [{0}]ì ê°ì§ 늬ìì€ ê·žë£¹ì [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€ +view_group_summary_recursive = ì¬ê· +view_helpTop_description = ìŽ ë¶ë¶ì 묞ì, íí 늬ìŒ, ë²ì , êž°í ëìë§ ì 볎륌 ì ê³µí©ëë€. +view_help_section_product = ì í +view_help_section_product_about = RHQì êŽíì¬ +view_inventory_adq = ëì€ì»€ë²ëŠ¬ í +view_inventory_allGroups = 몚ë 귞룹 +view_inventory_allResources = 몚ë 늬ìì€ +view_inventory_collectionInterval = ìì§ ê°ê²© +view_inventory_dynagroupDefs = ëì 귞룹 ì ì +view_inventory_eventDetails_loadFailed = ìŽë²€íž ìžë¶ ì 볎륌 ë¡ëíë ëì ì€ë¥ê° ë°ìíìµëë€ +view_inventory_eventHistory_deleteFailed = [{0}]ì ìíŽ ì íë ìŽë²€ížì ìì ì ì€íšíìµëë€ +view_inventory_eventHistory_deleteSuccessful = [{1}]ì ëí [{0}] ìŽë²€íž ìì ì ì±ê³µíìµëë€ +view_inventory_eventHistory_details = ììží +view_inventory_eventHistory_detailsFilter = ììží íí° +view_inventory_eventHistory_groupEventHistory = 귞룹 ìŽë²€íž ëŽì +view_inventory_eventHistory_purgeFailed = [{0}]ì ëí ìŽë²€ížì ì ê±°ì ì€íšíìµëë€ +view_inventory_eventHistory_purgeSuccessful = [{1}]ì ëí [{0}] ìŽë²€ížì ì ê±°ì ì±ê³µíìµëë€ +view_inventory_eventHistory_resourceEventHistory = 늬ìì€ ìŽë²€íž ëŽì +view_inventory_eventHistory_severity = ì¬ê°ë +view_inventory_eventHistory_severityFilter = ì¬ê°ë íí° +view_inventory_eventHistory_sourceFilter = ìì€ íí° +view_inventory_eventHistory_sourceLocation = ìì€ ìì¹ +view_inventory_eventHistory_timestamp = íì ì€í¬í +view_inventory_groups = 귞룹 +view_inventory_groups_children = ìì +view_inventory_groups_deleteFailed = ì íë 늬ìì€ ê·žë£¹ ìì ì ì€íšíìµëë€ +view_inventory_groups_deleteSuccessful = ì íë 늬ìì€ ê·žë£¹ ìì ì ì±ê³µíìµëë€ +view_inventory_groups_descendants = ìì +view_inventory_groups_loadFailed = 귞룹 í©ì± ë°ìŽí° ë¡ëì ì€íšíìµëë€ +view_inventory_mixed = íŒì± +view_inventory_platforms = íë«íŒ +view_inventory_problemGroups = 묞ì 귞룹 +view_inventory_resource_loadFailed = ID [{0}]ì ê°ì§ 늬ìì€ë ì¡Žì¬íì§ ìê±°ë ì¡ìžì€ í ì ììµëë€ +view_inventory_resources_deleteConfirm = ì íí 늬ìì€ë¥Œ ìì íìê² ìµëê¹? +view_inventory_resources_deleteFailed = ì íí 늬ìì€ì ìì ì ì€íšíìµëë€ +view_inventory_resources_deleteFailed2 = ì íí 늬ìì€ë¥Œ ìì íì§ ëª»íìµëë€. ììŽì ížì ì°ê²°í ì ììµëë€. ìŽ ììŽì ížê° ë€ìŽë ê²ì ì믞í ì ììµëë€. +view_inventory_resources_deleteSuccessful = 늬ë¡ì€ ìì ìì²ì (ì¬ë¬) ììŽì ížì ì±ê³µì ìŒë¡ ì ì¡ëììµëë€. +view_inventory_resources_disableConfirm = ì ë§ ì íí 늬ìì€ë¥Œ íŽì í ê¹ì? ì못ë ì¬ìŽì ììŽì ížìì ë³Žê³ ë ê°ì©ì±ì 묎ìë©ëë€. ë¹íì±íë ì ì ìë ë° ì ì§ êŽëŠ¬ì ìŒë¶ë¡ ì€ì§í ê²ìŒë¡ êž°ëëë 늬ìì€ì ì ì©í©ëë€. +view_inventory_resources_disableFailed = ì íë 늬ìì€ë¥Œ íŽì íëë° ì€íšíìµëë€. +view_inventory_resources_disableSuccessful = ì íë 늬ìì€ì ê·žì ìììŽ ëë [{0}] 늬ìì€ë¥Œ ë¹íì±ííëë° ì±ê³µíìµëë€. +view_inventory_resources_enableConfirm = ì ë§ ì íë 늬ìì€ë¥Œ ì¬ì©í ê¹ì? íì±í ëì ììŽì ížê° 늬ìì€ì ê°ì©ì±ì ë³Žê³ í ëê¹ì§ ê°ì©ì±ì UNKNOWNìŒë¡ ì€ì ë©ëë€. ììŽì ížë ìµê·Œì ížëŠ¬í ìê°ì íì¬ì ê°ì©ì±ì ë³Žê³ íëë¡ ì구ë©ëë€. +view_inventory_resources_enableFailed = ì íí 늬ìì€ë¥Œ íì±ííëë° ì€íšíìµëë€ +view_inventory_resources_enableSuccessful = ì íë 늬ìì€ì ê·žì ìììŽ ëë [{0}] 늬ìì€ë¥Œ íì±ííëë° ì±ê³µíìµëë€. +view_inventory_resources_loadFailed = 늬ìì€ í©ì± ë°ìŽí° ë¡ëì ì€íšíìµëë€ +view_inventory_resources_members = ë©€ë² ëŠ¬ìì€ +view_inventory_resources_uninventoryConfirm = ì íí 늬ìì€ë¥Œ ìžë²€í 늬ìì ì ê±°íìê² ìµëê¹? ë§ìœ ì íí 늬ìì€ê° ì¡Žì¬íê³ ìë€ë©Ž, ê·ž ììŽì ížì ë€ì ëì€ì»€ë²ëŠ¬ ì€ìº ì¬ìŽì ê·žê²ì ì¬ë°ê²¬ë©ëë€. +view_inventory_resources_uninventoryFailed = ì íë 늬ìì€ ìžë²€í 늬 ì ê±°ì ì€íšíìµëë€ +view_inventory_resources_uninventorySuccessful = ì íë 늬ìì€ì ìžë²€í 늬 ì ê±°ì ì±ê³µíìµëë€ +view_inventory_sectionHelp = ìŽ ì¹ì ìì ìë¡ ë°ê²¬ë 늬ìì€ ìžë²€í 늬ì ë±ë¡ë 늬ìì€ ê·žë£¹ì ëììŒë¡ í íì ë° êŽëŠ¬ê° ìŽë£šìŽì§ëë€. +view_inventory_servers = ìë² +view_inventory_serversTop = ìë² - ìµìì ê°ì žì€êž° +view_inventory_services = ìë¹ì€ +view_inventory_summary_agent_error1 = ììŽì íž êŽëŠ¬ 늬ìì€ IDì ë°ê²¬ì ì€íšíìµëë€ +view_inventory_summary_agent_error2 = ììŽì íž ëŠ¬ìì€ IDì pingì ì€íšíìµëë€ +view_inventory_summary_agent_error3 = ìŽ ììŽì ížì ëí ììží ì 볎륌 볌 ì ìë ê¶íìŽ ììµëë€. +view_inventory_summary_agent_fullEnpoint = ì 첎 ìë í¬ìžíž +view_inventory_summary_agent_fullEnpoint_err1 = !ìŽ ëŠ¬ìì€ì ëŠ¬ëªšíž ìë í¬ìžížë ììµëë€! +view_inventory_summary_agent_last_title = ë§ì§ë§ìŒë¡ ë°ì ê°ì©ì± 늬í¬íž +view_inventory_summary_agent_status_title = ììŽì íž íµì ìí +view_inventory_summary_agent_title = ìŽ ëŠ¬ìì€ë¥Œ êŽëŠ¬íë ììŽì íž +view_inventory_unavailableServers = ì¬ì©í ì ìë ìë² +view_leftNav_unknownPage = ì¹ì [{1}] ìì ìë íìŽì§ ìŽëŠ [{0}] - URLìŽ ì못ëììµëë€ +view_login_invalidEmail = ì못ë ìŽë©ìŒ 죌ì +view_login_login = ë¡ê·žìž +view_login_logout = ë¡ê·žìì +view_login_noBackend = ë°±ìë ë°ìŽí°ìì€ë¥Œ ì¬ì©í ì ììµëë€. +view_login_noLdap = 죌ì: LDAP ì 볎ì 몚ë ì ê±°ë ì±ê³µíì§ ëª»íìµëë€. ìëìŒë¡ ì ë ¥ìŽ ì구ë©ëë€. +view_login_noUser = ì ë ¥ë ì¬ì©ì ìŽëŠìŽë ìížê° êž°ë¡ë ê²ê³Œ ìŒì¹íì§ ììµëë€. +view_login_prompt = ë¡ê·žìžíììì€ +view_login_registerLater = (ì·šì - ë±ë¡ì ëì€ì ìë£íŽ 죌ììì€.) +view_login_registerLdapSuccess = ìë¡ìŽ LDAP ì¬ì©ì ë±ë¡ì ì±ê³µíìµëë€. +view_login_registerUser = ì¬ì©ì ë±ë¡ +view_login_welcomeMsg = {0}ì ì€ì ê²ì íìí©ëë€! <br/><br/> ë±ë¡ì ìì±ìí€êž° ìíŽ ë€ì íë륌 ì ë ¥/ìì íììì€.<br/> "OK"륌 íŽëŠí í ë¡ê·žìží©ëë€.<br/><br/> +view_measureRange_last = ìê° ë²ì - ìŽì +view_measureRange_simple = ëšì... +view_measureRange_start = ìê° ë²ì - ìì +view_measureTable_chartMetricValues = ì íë íµê³ ì°šíž +view_measureTable_getLive = ëŒìŽëž ê° ê°ì žì€êž° +view_measureTable_getLive_failure = ìŽë¬í íµê³ì ëŒìŽëž ê°ì ê°ì žì¬ ì ììµëë€. ììŽì ížë ì€íì€ìž êŽëŠ¬ 늬ìì€ê° ìë ì€ìì íìžíììì€. +view_measureTable_live_title = ëŒìŽëž ë°ìŽí° +view_measure_nan = --ë°ìŽí°ê° ì¡Žì¬íì§ ììµëë€-- +view_measurementOob_title = ìì¬ íµê³ +view_menuBar_logout = ë¡ê·žìì +view_messageCenter_clearAllMessages = 몚ë ë©ìì§ ì§ì°êž° +view_messageCenter_lastNMessages = ìµì {0} ë©ìì§ +view_messageCenter_maxMessages = ìµë ë©ìì§ +view_messageCenter_messageBarShowDetails = ììží 볎Ʞ +view_messageCenter_messageDetail = ììží +view_messageCenter_messageRootCause = ë£šíž ììž +view_messageCenter_messageSeverity = ì¬ê°ë +view_messageCenter_messageTime = ìê° +view_messageCenter_messageTitle = ë©ìì§ ìŒí° +view_messageCenter_noRecentMessages = ìµê·Œ ë©ìì§ë ììµëë€ +view_messageCenter_stackTraceFollows = --- ì€í ì¶ì --- +view_metric_traits = í¹ì± +view_metric_viewTraitHistory = í¹ì± [{0}]ì ëí ê° êž°ë¡ +view_operationHistoryDetails_dateCompleted = ìë£ìŒ +view_operationHistoryDetails_dateSubmitted = ë°íìŒ +view_operationHistoryDetails_error_fetchFailure = ì€íŒë ìŽì êž°ë¡ ë¡ë ì€íš +view_operationHistoryDetails_noResults = ìŽ ìì ì ê°ì ë°ííì§ ììµëë€. +view_operationHistoryDetails_operation = ìŽì +view_operationHistoryDetails_parameters = 맀ê°ë³ì +view_operationHistoryDetails_requestor = ìì²ì +view_operationHistoryDetails_results = 결곌 +view_operationHistoryDetails_status = ìí +view_operationHistoryList_button_forceDelete = ê°ì ìì +view_operationHistoryList_button_runOperation = ì€íŒë ìŽì ì ì€í +view_operationHistoryList_cancelConfirm = ë¹ì ìŽ ì íí ìì ì ì·šìíìê² ìµëê¹? ì°žê³ : íì¬ "ì§íì€"ìŽ ì íë ìì ì ì·šì륌 ìëí©ëë€. +view_operationHistoryList_cancelFailure = [{0}]ì ëŽì IDì ìì ì ì·šì ìì²ìŽ ì€íšíìµëë€. +view_operationHistoryList_cancelSubmitted = ì·šìì ëí ìì² [{0}]ì "ì§íì€" ìì ì ì ì¶ëììµëë€. +view_operationHistoryList_cancelSuccess = [{0}]ì ëŽì IDì ìì ì ì·šì ìì²ìŽ ìŽìì ì ì¶ëììµëë€. +view_operationHistoryList_deleteFailure = ìì ëŽì [{0}]ì ìì ì ì€íšíìµëë€. +view_operationHistoryList_deletePartialSuccess = ìì ëŽì í목 [{0}]ìŽ ìì ëš, ê·žë¬ë ë€ìì ID: {1}ì í목ì ìì ì ì€íšíìµëë€. +view_operationHistoryList_deleteSuccess = ìì ëŽì ììŽí [{0}]ìŽ ìì ëš. +view_operationHistoryList_notYetStarted = ìì§ ììíì§ ìììµëë€ +view_operationHistoryList_title = ìì ëŽì +view_operationScheduleDetails_enterParametersBelow = ë€ì ë§€ê° ë³ì륌 ì ë ¥íììì€... +view_operationScheduleDetails_fieldDefault_description = ì€ëª ì ë³Žë €ë©Ž ìì ì ì ííììì€. +view_operationScheduleDetails_fieldDefault_parameters = ë§€ê° ë³ì륌 볎Ʞ ìíŽ ìì ì ì ííììì€. +view_operationScheduleDetails_fieldHelp_description = ìŽ ììœë ìì ì ëí 몚ë ì€ëª (ì. ìŒê° 볎ì륌 ìí ìŽí늬ìŒìŽì ìë² ì¬ìì) +view_operationScheduleDetails_fieldHelp_timeout = ìê° ê°ê²© - ë§ìœ ì§ì ëìŽ ê·ž ê°ê²©ìŽ ììœë ìì ì€íìŽ ìë£ëêž° ì ì 겜곌íë€ë©Ž {0} ìë²ë ìŽìì ì ííê³ ê·žê²ì ì€íšíë ê²ì ê²í í©ëë€. 죌ì : ìŽë¯ž ììë 겜ì°ë ì€ì§ Ʞ볞 êŽëŠ¬ ìì ìŽìì ìŒë°ì ìŒë¡ ë¶ê°ë¥í©ëë€. +view_operationScheduleDetails_field_description = ì€ëª +view_operationScheduleDetails_field_parameters = 맀ê°ë³ì +view_operationScheduleDetails_field_timeout = íì ìì +view_operationScheduleDetails_noParameters = ìŽ ìì ì ë§€ê° ë³ì륌 ì¬ì©íì§ ììµëë€. +view_operationScheduleDetails_operationSchedule = ìŽì ê³í +view_portlet_autodiscovery_setting_platforms = ë°ê²¬ë íë«íŒ +view_portlet_configure_definitionDesc = í¬í늿ì ëí êµ¬ì± ì€ì . +view_portlet_configure_definitionTitle = í¬í늿 ì€ì +view_portlet_configure_needed = ì€ì ë²íŒì ëë¬ì í¬í늿ì 구ì±íììì€. +view_portlet_configure_notNeeded = 구ì±ìŽ í¬í늿ì ëíŽ íìíì§ ììµëë€. +view_portlet_defaultName_autodiscovery = ëì€ì»€ë²ëŠ¬ í +view_portlet_defaultName_favoriteResources = 늬ìì€ ìŠê²šì°Ÿêž° +view_portlet_defaultName_groupMetric = 늬ìì€ ê·žë£¹ íµê³ ê·žëí +view_portlet_defaultName_group_alerts = 귞룹: ê²œê³ +view_portlet_defaultName_group_bundles = 귞룹: ë²ë€ ë°°í¬ +view_portlet_defaultName_group_config_updates = 귞룹: êµ¬ì± ê°±ì +view_portlet_defaultName_group_events = 귞룹: ìŽë²€íž 칎ìŽíž +view_portlet_defaultName_group_metrics = 귞룹: íµê³ +view_portlet_defaultName_group_oobs = 귞룹: OOB 조걎 +view_portlet_defaultName_group_operations = 귞룹: ì€íŒë ìŽì +view_portlet_defaultName_group_pkg_hisory = 귞룹: íší€ì§ êž°ë¡ +view_portlet_defaultName_inventorySummary = ìžë²€í 늬 ììœ +view_portlet_defaultName_mashup = 맀ìì +view_portlet_defaultName_message = ë©ìì§ +view_portlet_defaultName_operations = ìµê·Œ ìì +view_portlet_defaultName_platformSummary = íë«íŒ íì© +view_portlet_defaultName_problemResources = ê²œê³ ëë ì¬ì©í ì ìë 늬ìì€ +view_portlet_defaultName_recentAlerts = ìµê·Œ ê²œê³ +view_portlet_defaultName_recentlyAddedResources = ìµê·Œ ì¶ê°ë 늬ìì€ +view_portlet_defaultName_resourceMetric = 늬ìì€ íµê³ ê·žëí +view_portlet_defaultName_resource_alerts = 늬ìì€: ê²œê³ +view_portlet_defaultName_resource_bundles = 늬ìì€: ë²ë€ ë°°í¬ +view_portlet_defaultName_resource_config_updates = 늬ìì€: ì€ì ê°±ì +view_portlet_defaultName_resource_events = 늬ìì€: ìŽë²€íž 칎ìŽíž +view_portlet_defaultName_resource_metrics = 늬ìì€: ìž¡ì +view_portlet_defaultName_resource_oobs = 늬ìì€: OOB íµê³ +view_portlet_defaultName_resource_operations = 늬ìì€: ì€íŒë ìŽì +view_portlet_defaultName_resource_pkg_hisory = 늬ìì€: íší€ì§ êž°ë¡ +view_portlet_factory_invalidPortlet = ìŽê²ì ì íšíì§ ìì ì€ëë í¬í늿ì ëë€. ìì íììì€. +view_portlet_graph_configure_metricDefinition_graph = ê·žëí륌 귞늬Ʞ ìí íµê³ ì ì ID +view_portlet_graph_configure_resource_graph = ê·žëí 늬ìì€ +view_portlet_help_autodiscovery = ìŽ í¬í늿ì ìë¡ ë°ê²¬ë 늬ìì€ë¥Œ ê°ì ž ì€ê±°ë í¹ì 묎ì í ì ììµëë€. ê°ì žìš 늬ìì€ ëªšëí°ë§ ë° êŽëŠ¬ë¥Œ ìí ìžë²€í 늬ì ì¶ê° í ì ììµëë€. 묎ìë ììì ê°ì žì€ì§ ìê³ , ëª ìì ìŒë¡ 묎ì륌 íŽì íì§ ìì í ë·°ìì ìšê²šì§ëë€. +view_portlet_help_bundle_deps = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì êž°ë°ìŒë¡ í êŽë š ë²ë€ ë°°í¬ë¥Œ íìí©ëë€. +view_portlet_help_config_updates = ìŽ í¬í늿ì êµ¬ì± ì€ì 곌 ìŒì¹íë ìµê·Œì êµ¬ì± ë³ê²œì íìí©ëë€. +view_portlet_help_eventcounts = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì ìŒì¹íë ìŽë²€íž ì륌 íìí©ëë€. +view_portlet_help_favoriteResources = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìŠê²š ì°Ÿêž° 늬ìì€ë¥Œ íìí©ëë€. +view_portlet_help_graph = ìŽ í¬í늿ì 늬ìì€ íµê³ ê·žëí륌 íìí©ëë€. +view_portlet_help_inventorySummary = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ê²ì ê°ë¥í 목ë¡ê³Œ íµê³ ìì§ ë¹ìš 짧ì ììœì íìí©ëë€. +view_portlet_help_mashup = ìŽ í¬í늿ì (iframeì íµíŽ) ì격 HTTP ìì²ìŽ ë°íí ëŽì©ì íìí©ëë€. +view_portlet_help_message = ìŽ í¬í늿ì ì ì HTML ë©ìì§ë¥Œ íìí©ëë€. <i>message</i> ìì± êµ¬ì±ìŽ íìí©ëë€. +view_portlet_help_metrics = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì êž°ë°ìŒë¡ êŽë š íµê³ ë°ìŽí°ë¥Œ ê·žëí륌 귞늜ëë€. +view_portlet_help_none = ìŽ í¬í늿ì ëí ëìë§ì ì¬ì©í ì ììµëë€. +view_portlet_help_oobs = ìŽ í¬íëŠ¿ìŽ ë²ì륌 ë²ìŽëì íµê³ 조걎ì íìí©ëë€. +view_portlet_help_operations = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìžë²€í 늬륌 ìíŽ ê°ì¥ ìµê·Œì ì€íë ìì ì íìí©ëë€. +view_portlet_help_operations_criteria = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì ìŒì¹íë ìì ì íìí©ëë€. +view_portlet_help_pkg_history = ìŽ í¬í늿ì 구ì±ë ëì€íë ìŽ íëš ì¡°ê±Žì êž°ë°ìŒë¡ êŽë š íší€ì§ ëŽì©ì íìí©ëë€. +view_portlet_help_platformSummary = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ì¡ìžì€ ìë íë«íŒ 늬ìì€ì ëí (íì¬ CPUì ë©ëªšëŠ¬ ì¬ì© ë±) ì¬ì© ë°ìŽí°ë¥Œ íìí©ëë€. +view_portlet_help_problemResources = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ë³ê²œ ëë ì¬ì©í ì ìë 늬ìì€ë¥Œ íìí©ëë€. +view_portlet_help_recentAlerts = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ë³Œ ì ìë ìžë²€í 늬ìì ë°ìí ê²œê³ ë¥Œ íìí©ëë€. +view_portlet_help_recentDrifts = ìŽ í¬í늿ì íì¬ ì¬ì©ìê° ë³Œ ì ìë ìžë²€í 늬ìì ìµê·Œ íìŒ ë늬íížë¥Œ íìí©ëë€. +view_portlet_help_recentlyAdded = ìŽ í¬í늿ì ìžë²€í 늬ì ìµê·Œ ë°ì ë 늬ìì€ë¥Œ íìí©ëë€. +view_portlet_help_scheduledOperations = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìžë²€í 늬륌 ìíŽ ë€ì ììœë ìì ì íìí©ëë€. +view_portlet_help_tagCloud = ìŽ í¬í늿ì íì¬ ì¬ì©ìì ìžë²€í 늬ì ëí êŽë š íê·ž ì륌 íìí©ëë€. +view_portlet_inventory_error1 = ìžë²€í 늬 ììœ ì ê±°ì ì€íšíìµëë€ +view_portlet_inventory_tooltip_collapse = íŽëŠíë©Ž ìŽ ëŠ¬ìì€ ì 볎륌 ìšê¹ëë€. +view_portlet_inventory_tooltip_expand = íŽëŠíë©Ž ìŽ ëŠ¬ìì€ ì 볎륌 íìí©ëë€. +view_portlet_message_title = íì ë©ìì§ +view_portlet_operations_config_completed = ìë£í ìì +view_portlet_operations_config_completed_enable = ëì 볎ë륌 ìíŽ ê·žë£¹íë ìë£ë ìì 결곌륌 ì¬ì©í ì§ ì¬ë¶. +view_portlet_operations_config_completed_maximum = ìë£ë ìì ì ìµë íì ì. +view_portlet_operations_config_scheduled_enable = ëì 볎ë륌 ìíŽ ê·žë£¹íë ììœë ìì ì ì¬ì©í ì§ ì¬ë¶. +view_portlet_operations_config_scheduled_maximum = ììœë ìì ì ìµë íì ì. +view_portlet_operations_config_show_last = ë§ì§ë§ 볎Ʞ +view_portlet_operations_config_show_next = ë€ì 볎Ʞ +view_portlet_operations_disabled = (결곌ë íì¬ ë¹íì±íëìŽ ììµëë€. 결곌륌 ì¬ì©íë €ë©Ž ì€ì ì ë³ê²œíììì€. +view_portlet_platform_platform_error_1 = íë«íŒ íµê³ì ë¡ëì ì€íšíìµëë€ +view_portlet_platform_type_error_1 = íì ë°ìŽí°ë¥Œ ë¡ëí ì ììµëë€ +view_portlet_problemResources_config_display_maximum = 묞ì 늬ìì€ì ìµë íì ì. +view_portlet_problemResources_config_display_range = ì¬êž°ìì ëªìê° ê±°ì¬ë¬ 묞ì 늬ìì€ë¥Œ íì. +view_portlet_problemResources_config_display_range2 = {0}ìì {1}ê¹ì§ +view_portlet_problemResources_maxDisplaySetting = ìµë ìì. +view_portlet_recentAlerts_config_members = 구ì±ì ì í +view_portlet_recentAlerts_config_priority_label = ì°ì ê²œê³ , +view_portlet_recentAlerts_config_when = ë€ì ìê° ìŽëŽì +view_portlet_recentAlerts_fail_msg = ê²œê³ íí°ë§ì ìíŽ í ë¹ë 늬ìì€ë¥Œ ë¡ëíëë° ì€íšíìµëë€. +view_portlet_recentlyAdded_error1 = ìµê·Œ ì¶ê°ë 늬ìì€ë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_portlet_recentlyAdded_setting_addedPlatforms = ìµê·Œ ì¶ê°ë íë«íŒ +view_portlet_results_empty = ì§ì ë íëš ì¡°ê±Žì 결곌륌 ì°Ÿì ì ììµëë€. +view_remoteAgentInstall_agentStatus = ììŽì íž ìí +view_remoteAgentInstall_agentStatusDefault = -ìí ì ë°ìŽíž ë²íŒì íŽëŠœíììì€- +view_remoteAgentInstall_buttonFindAgent = ììŽì íž ì°Ÿêž° +view_remoteAgentInstall_connInfo = ì°ê²° ì 볎 +view_remoteAgentInstall_error_1 = ììŽì ížì ì€ì¹ 겜ë¡ë¥Œ ì°Ÿë ëì ì€ë¥ê° ë°ìíìµëë€ +view_remoteAgentInstall_error_2 = ìŒë°ì ìž ìì¹ìì ì°Ÿì ë ììŽì ížë¥Œ ì°Ÿì ì ììµëë€ +view_remoteAgentInstall_error_3 = [{0}] ìë ì€ì¹ë ììŽì ížë¥Œ ì°Ÿì ì ììµëë€ +view_remoteAgentInstall_error_4 = ììŽì íž ì€ì¹ì ì€íšíìµëë€ +view_remoteAgentInstall_error_5 = ììŽì íž ììì ì€íšíìµëë€ +view_remoteAgentInstall_error_6 = ììŽì íž ì€ì§ì ì€íšíìµëë€ +view_remoteAgentInstall_installAgent = ììŽì íž ì€ì¹ +view_remoteAgentInstall_installInfo = ììŽì íž ì€ì¹ ì 볎 +view_remoteAgentInstall_installPath = ììŽì íž ì€ì¹ ê²œë¡ +view_remoteAgentInstall_owner = ìì ì +view_remoteAgentInstall_promptHost = ììŽì ížê° ì€ì¹ëìŽ ìê±°ë ììŒë¡ ì€ì¹ëë ížì€íž +view_remoteAgentInstall_promptInstallPath = ììŽì ížê° ì€ì¹ëìŽ ìê±°ë ììŒë¡ ì€ì¹ëë ì¥ì. ìŽëì ì€ì¹ëëì§ íì ìŽ ìë€ë©Ž, ë¶ëªš ëë í 늬륌 ì ë ¥íì¬ 'ììŽì íž ì°Ÿêž°'ë²íŒì íŽëŠíì¬ ê·ž ëë í 늬 ìŽí륌 ê²ìíììì€. ë¹ ê²œë¡ë¥Œ ì ë ¥í 겜ì°, ììŽì ížë¥Œ ì€ì¹íë ížì€ížì ê³µíµ ìì¹ê° ê²ìë©ëë€. +view_remoteAgentInstall_promptPassword = SSH륌 íµíŽ ížì€ížì ì¬ì©ì륌 ìžìŠíëë° ì¬ì©ëë ìžìŠ +view_remoteAgentInstall_promptPort = SSH ìë²ê° ìì íë í¬íž. ì§ì ëì§ ììŒë©Ž, Ʞ볞ê°ì 22ì ëë€ +view_remoteAgentInstall_promptUser = SSH륌 íµíŽ ížì€ížë¡ ì ë¬ëë ìžìŠì ê°ì§ ì¬ì©ìì ìŽëŠ +view_remoteAgentInstall_result = 결곌 +view_remoteAgentInstall_resultCode = 결곌 ìœë +view_remoteAgentInstall_startAgent = ììŽì íž ìì +view_remoteAgentInstall_startAgentResults = ììŽì íž ìì 결곌: [{0}] +view_remoteAgentInstall_step = ëšê³ +view_remoteAgentInstall_stopAgent = ììŽì íž ì€ì§ +view_remoteAgentInstall_stopAgentResults = ììŽì íž ì€ì§ 결곌: [{0}] +view_remoteAgentInstall_success = ììŽì íž ì€ì¹ ìë£ +view_remoteAgentInstall_updateStatus = ìí ì ë°ìŽíž +view_reportsTop_description = ìŽ ì¹ì ì êžë¡ë² 늬í¬ížì ëí ììžì€ë¥Œ ì ê³µí©ëë€. +view_reportsTop_title = ë³Žê³ ì +view_reports_alertDefinitions = ê²œê³ ì ì +view_reports_alertDefinitions_parentHover = íŽëŠíë©Ž ë¶ëªšì ê²œê³ ì ìì ê°ëë€ +view_reports_alertDefinitions_resTypeLoadError = í í늿 늬ìì€ íì ì ê°ì žì¬ ì ììµëë€ - ì늌 í í늿ì ìŽë í ì ììµëë€. +view_reports_driftCompliance = ë늬ííž ì€ì +view_reports_inventorySummary_failFetch = ìžë²€í 늬 ììœì ê°ì žì€ëë° ì€íšíìµëë€ +view_reports_platforms = íë«íŒ íì© +view_reports_subsystems = ìëž ìì€í +view_resourceResourceGroupList_error_fetchFailure = 늬ìì€ ê·žë£¹ì ì·šëì ì€íšíìµëë€. +view_resourceResourceGroupList_error_updateFailure = í ë¹ë 늬ìì€ ê·žë£¹ì ì ë°ìŽížì ì€íšíìµëë€. +view_resourceResourceGroupList_message_updateSuccess = [{0}]ì ìíŽ ì ë°ìŽížë 귞룹 구ì±ì. +view_resource_inventory_activity_changed_by = ìì í ì¬ë +view_resource_inventory_activity_criteria_no_recent_events = íì íëš ì¡°ê±Žì ë°ëŒ ìŽë²€ížê° ììµëë€. +view_resource_inventory_activity_no_recent_alerts = ìµê·Œ ê²œê³ ë ììµëë€ +view_resource_inventory_activity_no_recent_bundle_deploy = ìµê·Œ ë²ë€ ë°°í¬ë ììµëë€ +view_resource_inventory_activity_no_recent_config_history = êµ¬ì± ë³ê²œ êž°ë¡ì ììµëë€ +view_resource_inventory_activity_no_recent_events = ìµê·Œ 24ìê° ìŽëŽ ìŽë²€ížê° ììµëë€ +view_resource_inventory_activity_no_recent_metrics = ìŽ ëŠ¬ìì€ë ìµê·Œ íµê³ê° ììµëë€ +view_resource_inventory_activity_no_recent_oob = ë²ì ìžì 조걎ì ì°Ÿì ì ììµëë€ +view_resource_inventory_activity_no_recent_operations = ìµê·Œ ìì êž°ë¡ì ììµëë€ +view_resource_inventory_activity_no_recent_pkg_history = ìµê·Œ íší€ì§ êž°ë¡ì ììµëë€ +view_resource_inventory_childhistory_createdChild = ìì±ìíš ì +view_resource_inventory_childhistory_deletedChild = ìì ë ì +view_resource_inventory_childhistory_filterTitle = 곌거 N ìŒ +view_resource_inventory_childhistory_status_invalidArtifact = ì못ë ìì±ë¬Œ +view_resource_inventory_childhistory_status_invalidConfig = ì못ë êµ¬ì± +view_resource_monitor_availability_availability = ê°ì©ì± +view_resource_monitor_availability_availability_tooltip = ìê°ì ë¹ìšì 늬ìì€ UPê° ëŽë € ìê°ì ë¹íŽ ì¬ì© ì€ì§ëììµëë€ +view_resource_monitor_availability_currentAsOf = ìŽ ë°ìŽí°ë {0} íì¬ì ê²ì ëë€ +view_resource_monitor_availability_currentStatus = íì¬ ìí +view_resource_monitor_availability_currentStatus_value = ìŽ ììì {1} {0}ì ìíì ëë€ +view_resource_monitor_availability_disabled = ë¹íì±í +view_resource_monitor_availability_disabledTime = ë¹íì±í ë ìê° +view_resource_monitor_availability_disabledTime_tooltip = 늬ìì€ê° DISABLED ìíë¡ ììë ëì ìê° +view_resource_monitor_availability_disabled_tooltip = 늬ìì€ê° DISABLEDë¡ íë ìê°ì ìì곌 ì¢ ë£ ìê°ì ë¹êµí ë°±ë¶ìš +view_resource_monitor_availability_down = ì ì§ +view_resource_monitor_availability_down_tooltip = 늬ìì€ê° DOWNíê³ ìê°ì ììíê±°ë ì€ì§ìí¬ ìê°ê³Œ ë¹êµí ë°±ë¶ìš +view_resource_monitor_availability_downtime = ì ì§ìê° +view_resource_monitor_availability_downtime_tooltip = 늬ìì€ê° DOWN ìíë¡ ìë ëì ìê° +view_resource_monitor_availability_loadFailed = ê°ì©ì± êž°ë¡ ë¡ëì ì€íšíìµëë€ +view_resource_monitor_availability_mtbf = MTBF +view_resource_monitor_availability_mtbf_tooltip = íê· ê³ ì¥ ê°ê²© (Mean Time Before Failure) - ìŠ, ìŽê²ì DOWNíêž° ì ì UPìíìì ìë¹ë íê· ìê°ì ì믞í©ëë€ +view_resource_monitor_availability_mttr = MTTR +view_resource_monitor_availability_mttr_tooltip = íê· ë³µêµ¬ ìê° (Mean Time To Recovery) - ìŠ, ìŽê²ì ë€ì UPíêž° ì ì DOWNìíìì ìë¹ë íê· ìê°ì ì믞í©ëë€ +view_resource_monitor_availability_numDisabled = ë¹íì±í íì +view_resource_monitor_availability_numDisabled_tooltip = 늬ìì€ê° DISABLED ìíì ë€ìŽê° íì +view_resource_monitor_availability_numFailures = ì¥ì ì +view_resource_monitor_availability_numFailures_tooltip = 늬ìì€ê° DOWN ìíì ë€ìŽê° íì +view_resource_monitor_availability_summaryError = 늬ìì€ ê°ì©ì± ììœì ë¡ëíëë° ì€íšíìµëë€ +view_resource_monitor_availability_unknown = ìŽ ëŠ¬ìì€ë {0} ì¬ìŽë ì ì ìë ìíì ììµëë€ +view_resource_monitor_availability_uptime = ìììê° +view_resource_monitor_availability_uptime_tooltip = 늬ìì€ê° UP ìíë¡ ìë ëì ìê° +view_resource_monitor_calltime_average = íê· +view_resource_monitor_calltime_count = ì +view_resource_monitor_calltime_destination = ížì¶ ëì +view_resource_monitor_calltime_destinationFilter = ëì íí° +view_resource_monitor_calltime_loadFailed = ížì¶ ìê° ë°ìŽí°ë¥Œ ë¡ë í ì ììµëë€ +view_resource_monitor_calltime_maximum = ìµë +view_resource_monitor_calltime_minimum = ìµì +view_resource_monitor_calltime_title = ížì¶ ìê° ë°ìŽí° +view_resource_monitor_calltime_total = ìŽ ìììê° +view_resource_monitor_detailed_graph_label = ììží ê·žëí +view_resource_monitor_graph_instructions = ì°šížìì ë°ìŽí° í¬ìžížì ë§ì°ì€ë¥Œ ê°ì žê°ìžì +view_resource_monitor_graph_live_tooltip = íì¬ ê°ì ëŒìŽëž ê·žëí륌 ë³Žë €ë©Ž íŽëŠíììì€ +view_resource_monitor_graphs_loadFailed = ê·žëí ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_resource_monitor_graphs_lookupFailed = ê·žëí륌 ìí 늬ìì€ë¥Œ ì°Ÿëë° ì€íšíìµëë€ +view_resource_monitor_graphs_noneAvailable = ì íší ê·žëíê° ììµëë€ +view_resource_monitor_schedules_title = 늬ìì€ íµê³ ìì§ ìŒì +view_resource_monitor_table_avg = íê· +view_resource_monitor_table_last = ìµì +view_resource_monitor_table_max = ìµë +view_resource_monitor_table_min = ìµì +view_resource_title_component_errors_cleanup = ìŽ ë¬žì 륌 íŽê²° í íìë ìŽì íë©Žìì 'êŽëŠ¬ êµ¬ì± ìì ì€ë¥'ììŽìœì ìì íë €ë©Ž ìëì ë©ìì§ë¥Œ ìì íŽìŒí©ëë€. +view_resource_title_component_errors_tooltip = êŽëŠ¬ êµ¬ì± ìì ì€ë¥ íì. ììží ëŽì©ì íŽëŠíììì€ +view_resource_title_tagUpdateFailed = 늬ìì€ íê·ž ê°±ì ì ì€íšíìµëë€ +view_searchBar_defaultPattern = íšíŽ ìŽëŠì ë¶ì¬ì£Œìžì +view_searchBar_instructional_failSuggest = ì ìì ìì±íì§ ëª»íìµëë€. ë°ìí ì ìë ì€ë¥ì ëí ìë² ë¡ê·žë¥Œ ì°žì¡°íììì€ +view_searchBar_instructional_noSuggest = í 걎ë ìŒì¹íì§ ìììµëë€. ë€ë¥ž íšíŽì ì ë ¥íììì€. +view_searchBar_instructional_refresh = ì ì¥ë ê²ì ì ê±°ì ì€íšíìµëë€. íìŽì§ë¥Œ ìë¡ê³ 칚 íììì€ +view_searchBar_savedSearch_delete = ì ì¥ë ê²ì [{0}]ì ì ê±°íëë° ì±ê³µíìµëë€ +view_searchBar_savedSearch_failDelete = [{0}]ëŒë ì ì¥ë ê²ìì ìì íëë° ì€íšíìµëë€ +view_searchBar_savedSearch_failFind = [{0}]ëŒë ì ì¥ë ê²ìì ê²ìíëë° ì€íšíìµëë€ +view_searchBar_savedSearch_failRename = [{0}]ëŒë ì ì¥ë ê²ìì ìŽëŠì ë³ê²œíëë° ì€íšíìµëë€ +view_searchBar_savedSearch_failSave = [{0}]ëŒë ì ì¥ë ê²ìì ìì±ì ì€íšíìµëë€ +view_searchBar_savedSearch_rename = ì ì¥ë ê²ì [{0}]ì ìŽëŠì ë³ê²œíëë° ì±ê³µíìµëë€ +view_searchBar_savedSearch_save = [{0}]ëŒë ì ì¥ë ê²ìì ë§ëëë° ì±ê³µíìµëë€ +view_searchGUI_loginStatus = ë¡ê·žìž ìí륌 íëší ì ììµëë€, ìë²ì ìí륌 íìžíììì€ +view_selector_assigned = í ë¹ë {0} +view_selector_available = ì¬ì©ê°ë¥í {0} +view_subTab_error_disabled = ë¹íì±í ë íì í [{0}]ì ì íí ì ììµëë€. +view_summaryDashboard_resetConfirm = Ʞ볞 ììœ ëì볎ë륌 ì¬ì€ì íìê² ìµëê¹ (íì¬ ë³ê²œì ììŽë²ëŠŽì§ë ëªšëŠ ëë€)? +view_summaryOverviewForm_error_descriptionChangeFailure = ID {0}ìž ëŠ¬ìì€ì ì€ëª ì [{1}]ìì [{2}]ë¡ ë³ê²œíëë° ì€íšíìµëë€. +view_summaryOverviewForm_error_locationChangeFailure = ID {0}ìž ëŠ¬ìì€ì ìì¹ë¥Œ [{1}]ìì [{2}]ë¡ ë³ê²œíëë° ì€íšíìµëë€. +view_summaryOverviewForm_error_nameChangeFailure = ID {0}ìž ëŠ¬ìì€ì ìŽëŠì [{1}]ìì [{2}]ë¡ ë³ê²œíëë° ì€íšíìµëë€. +view_summaryOverviewForm_error_traitsLoadFailure = {0}ì ëí í¹ì± ë¡ëì ì€íšíìµëë€ +view_summaryOverviewForm_field_description = ì€ëª +view_summaryOverviewForm_field_location = ìì¹ +view_summaryOverviewForm_field_name = ìŽëŠ +view_summaryOverviewForm_field_type = íì +view_summaryOverviewForm_field_version = ë²ì +view_summaryOverviewForm_header_summary = ììœ +view_summaryOverviewForm_label_plugin = íë¬ê·žìž: +view_summaryOverviewForm_message_descriptionChangeSuccess = ID {0}ìž ëŠ¬ìì€ì ì€ëª ì [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€. +view_summaryOverviewForm_message_locationChangeSuccess = ID {0}ìž ëŠ¬ìì€ì ìì¹ë¥Œ [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€. +view_summaryOverviewForm_message_nameChangeSuccess = ID {0}ìž ëŠ¬ìì€ì ìŽëŠì [{1}]ìì [{2}]ë¡ ë³ê²œíìµëë€. +view_summaryOverview_header_detectedErrors = ë°ê²¬ë ì€ë¥ +view_summaryOverview_title_errorDetailsWindow = ì€ë¥ ììží 볎Ʞ +view_summaryOverview_tooltip_detectedErrors = íì íŽëŠíì¬ ì€ë¥ë¥Œ ììží ëŽ ëë€. +view_tableSection_backButton = ëª©ë¡ ê°êž° +view_tableSection_error_badId = [{0}]ì ì 볎륌 볌 ì ììµëë€. ì못ë 'id': [{1}]. ìŽ ë²ê·žë¡ ë³Žê³ íììì€ +view_tableSection_error_noId = í ìŽëž [{0}]ì ë ìœëìì 'id' ìì±ìŽ ìë ê²ìŽ ì¡Žì¬íì§ ììµëë€ - ìŽ ë²ê·žë¡ ë³Žê³ íììì€. +view_table_drawFail = í ìŽëž [{0}]륌 귞늬ëë° ì€íšíìµëë€. +view_table_matchingRows = ìŒì¹íë í: {0} (ì íëš: {1}) +view_table_totalRows = ì 첎 í: {0} (ì íëš: {1}) +view_table_totalRowsUnknown = ì 첎 í: ? +view_tabs_common_activity = íë +view_tabs_common_agent = ììŽì íž +view_tabs_common_availability = ê°ì©ì± +view_tabs_common_calltime = ížì¶ ìê° +view_tabs_common_child_history = ìì ëŽì +view_tabs_common_child_resources = ìì 늬ìì€ +view_tabs_common_connectionSettings = ì°ê²° ì€ì +view_tabs_common_connectionSettingsHistory = ì°ê²° ì€ì ëŽì +view_tabs_common_content = ìœí ìž +view_tabs_common_current = íì¬ +view_tabs_common_dashboard = ëì볎ë +view_tabs_common_deployed = ë°°í¬ë +view_tabs_common_drift = ë늬ííž +view_tabs_common_events = ìŽë²€íž +view_tabs_common_graphs = ê·žëí +view_tabs_common_group_members = ê·žëí ë©€ë² +view_tabs_common_group_membership = ê·žëí 구ì±ì +view_tabs_common_groups = 귞룹 +view_tabs_common_history = êž°ë¡ +view_tabs_common_inventory = ìžë²€í 늬 +view_tabs_common_members = ë©€ë² +view_tabs_common_monitoring = 몚ëí°ë§ +view_tabs_common_overview = ê°ì +view_tabs_common_schedule = ì€ìŒì¥Ž +view_tabs_common_schedules = ì€ìŒì¥Ž +view_tabs_common_subscriptions = 구ë +view_tabs_common_tables = í ìŽëž +view_tabs_common_timeline = íìëŒìž +view_tabs_common_traits = í¹ì± +view_tabs_invalidSubTab = ì못ë íì í: {0} +view_tabs_invalidTab = ì못ë í: {0} +view_tagCloud_deleteTag = ìì ë íê·ž +view_tagCloud_deleteTagFailure = íê·ž [{0}]륌 ìì íëë° ì€íšíìµëë€ +view_tagCloud_deleteTagSuccess = íê·ž [{0}]륌 ìì íëë° ì±ê³µíìµëë€ +view_tagCloud_error_fetchFailure = í귞륌 ë¡ëíëë° ì€íšíìµëë€. +view_tagCloud_error_tagUsedCount = {0}ë² ì¬ì©ë íê·ž. +view_taggedResources_title = íê·žê° ì§ì ë 늬ìì€ +view_tags_error_1 = í귞륌 ë¡ëíëë° ì€íšíìµëë€ +view_tags_tags = íê·ž +view_tags_tooltip_1 = íŽëŠíë©Ž ìŽ í귞륌 ì ê±°í©ëë€ +view_tags_tooltip_2 = íŽëŠíë©Ž í귞륌 ížì§í©ëë€ +view_tags_tooltip_3 = ë€ì íìì í귞륌 ì ë ¥íììì€: (namespace:)(semantic=)tagname (ì. it:env=QA, ëë owner=John) +view_testTop_description = ìŽ ì¹ì ì ë€ìí GUI êµ¬ì± ìì륌 í ì€íž í ì ìë íìŽì§ê° í¬íšëìŽ ììµëë€. +view_testTop_title = í ì€íž +view_titleBar_common_addedFav = [{0}] ìŠê²šì°Ÿêž°ì ì¶ê°íìµëë€ +view_titleBar_common_addedFavFailure = [{0}] ìŠê²šì°Ÿêž°ì ì¶ê°íëë° ì€íšíìµëë€ +view_titleBar_common_clickToAddFav = íŽëŠíë©Ž ìŽ ìŠê²šì°Ÿêž°ì ì¶ê°í©ëë€ +view_titleBar_common_clickToRemoveFav = íŽëŠíë©Ž ìŽ ìŠê²šì°Ÿêž°ë¥Œ ìì í©ëë€ +view_titleBar_common_loadTagsFailure = [{0}]ì ëí í귞륌 ë¡ëíëë° ì€íšíìµëë€ +view_titleBar_common_removedFav = ìŠê²šì°Ÿêž°ìì [{0}]륌 ìì íìµëë€ +view_titleBar_common_removedFavFailure = ìŠê²šì°Ÿêž°ìì [{0}]륌 ìì íëë° ì€íšíìµëë€ +view_titleBar_common_updateTagsFailure = [{0}]ì íê·ž ì ë°ìŽížì ì€íšíìµëë€ +view_titleBar_common_updateTagsSuccessful = [{0}] íê·žê° ì ë°ìŽíž ëììµëë€ +view_titleBar_group_failInfo = ID [{1}]륌 ê°ì§ 귞룹 [{0}]ì ëí ìŒë° ì 볎륌 ê°ì žì€ëë° ì€íšíìµëë€ +view_titleBar_group_summary_collapsedTooltip = íŽëŠíë©Ž ìŽ ê·žë£¹ì ëí ììží ì 볎륌 íìí©ëë€ +view_titleBar_group_summary_expandedTooltip = íŽëŠ¬ê°ë©Ž ìŽ ê·žë£¹ì ëí ììží ì 볎륌 ìšê¹ëë€. +view_tree_common_contextMenu_addChartToDashboard = ëì 볎ë [{0}]ì ì°šížë¥Œ ì¶ê°í©ëë€ +view_tree_common_contextMenu_editPluginConfiguration = [{0}] íë¬ê·žìž 구ì±ì ížì§í©ëë€ +view_tree_common_contextMenu_editResourceConfiguration = [{0}] 늬ìì€ êµ¬ì±ì ížì§í©ëë€ +view_tree_common_contextMenu_groupGraph = 귞룹 íµê³ ê·žëí +view_tree_common_contextMenu_loadFail_children = ììì ìëìŒë¡ ì¶ê°íêž° ìí íë«íŒ ë¡ëì ì€íšíìµëë€ +view_tree_common_contextMenu_loadFail_dashboards = ì¬ì©ì ëì 볎ë륌 ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_contextMenu_loadFail_group = 컚í ì€íž ë©ëŽì ëí 귞룹ì ë¡ëì ì€íšíìµëë€ +view_tree_common_contextMenu_loadFailed_dashboard = ì¬ì©ì ëì 볎ë륌 ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_contextMenu_loadFailed_manualAddChildren = ììì ìëìŒë¡ ì¶ê°íêž° ìí íë«íŒ ë¡ëì ì€íšíìµëë€ +view_tree_common_contextMenu_loadFailed_operations = ìì ì ì€íì ìíŽ ë§ë²ì¬ë¥Œ ììíëë° ì€íšíìµëë€ +view_tree_common_contextMenu_measurements = ìž¡ì +view_tree_common_contextMenu_resourceConfiguration = 늬ìì€ ì€ì +view_tree_common_contextMenu_resourceGraph = 늬ìì€ íµê³ ê·žëí +view_tree_common_contextMenu_saveChartToDashboardFailure = ëì볎ë ì ì¥ì ì€íšíìµëë€ +view_tree_common_contextMenu_saveChartToDashboardSuccessful = ëì볎ë [{0}]륌 ì ì¥íìµëë€ +view_tree_common_contextMenu_type_name_label = íì : {0} +view_tree_common_createFailed_autoCluster = ìë íŽë¬ì€í° ë°±ì 귞룹ì ë§ë€ê±°ë ì ë°ìŽížíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_children = ë žëì ììì ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_create = ìŽ ë žëì 볎Ʞ륌 ë§ëëë° ì€íšíìµëë€ +view_tree_common_loadFailed_descendants = ížëŠ¬ì ììì ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_generic = ížëŠ¬ì ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_group = ID [{0}]륌 ê°ì§ 귞룹ì ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_groupTree = 귞룹 ížëŠ¬ë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_node = ìŽ ë žëì ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_root = ížëŠ¬ì 룚ížë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_tree_common_loadFailed_selection = ìŽ ë žë륌 ì ííëë° ì€íšíìµëë€ +view_tree_common_loadFailed_update = ìŽ ë žëì ëí 뷰륌 ì ë°ìŽížíëë° ì€íšíìµëë€ +view_tree_group_error_updateAutoCluster = ìë íŽë¬ì€í° ë°±ì 귞룹ì ë§ë€ê±°ë ì ë°ìŽížíëë° ì€íšíìµëë€. í€: [{0}] +view_type_parentId = ë¶ëªš ID +view_type_resourceTypes = 늬ìì€ íì +view_type_typeTreeLoadFailure = 늬ìì€ íì ížëŠ¬ ë°ìŽí°ë¥Œ ë¡ëíëë° ì€íšíìµëë€ +view_upload_alreadyUploaded = íìŒì ìŽë¯ž ì ë°ìŽíž ëììµëë€ +view_upload_bundleDistFile = ë¶ì° íìŒ +view_upload_error_bundleDistFile = ë²ë€ ë°°í¬ íìŒ ì ë¡ë ì€ë¥ +view_upload_error_file = íìŒ ì ë¡ë ì€ë¥ +view_upload_error_fileName = íìŒ ì ë¡ë ì€ë¥ [{0}] +view_upload_error_fileName_2 = [{0}] íìŒ ì ë¡ë ì€ë¥, ì못ë íìŒ ê²œë¡ë¥Œ íìžíììì€. +view_upload_error_packageVersionFile = íší€ì§ ë²ì íìŒ ì ë¡ë ì€ë¥ +view_upload_error_results = íìŒ ì ë¡ë ì€ë¥, ìêž°ì¹ ìì 결곌: [{0}] +view_upload_inProgress = ë³ŽëŒ ì ììµëë€, ì ë¡ëë íì¬ ì§íì€ì ëë€ +view_upload_prompt_1 = ì ë¡ë íìŒ [{0}]륌 ì ííììì€ +view_upload_prompt_2 = ì ë¡ë íìŒ +view_upload_success = íìŒ ì ë¡ëì ì±ê³µíìµëë€ +view_upload_tooltip_1a = ì ë¡ëí íìŒì ì ííê³ , ì ë¡ëë ë€ìì íŽëŠíììì€ +view_upload_tooltip_1b = ì ë¡ëí íìŒì ì ííê³ , ë€ìì íŽëŠíììì€ +view_upload_tooltip_2 = íìŒìŽ ì ë¡ë ìŽì ì ì€íšíìµëë€ +view_upload_upload = ì ë¡ë +view_upload_uploadFile = ì ë¡ëíìŒ +widget_colorPicker_tooltip = ì ììì ì ííêž° ìíŽ íŽëŠíììì€ +widget_durationItem_inputUnitLessThanTargetUnit = ì ë ¥ ëšìë ëì ëšì 믞ë§ìŽ ììë©ëë€. +widget_durationItem_unitTypeNotSupported = ëšìì íì [{0}]ìŽ DurationItemìì ì§ìëì§ ììµëë€. +widget_jobTriggerEditor_fieldHelp_repeatDuration = ìŽ ìì ì ì¬ë¬ë² ì€ííê±°ë ì§ì ë ìê°ìŽ ëë ëê¹ì§ ê³ì ì€íë©ëë€ +widget_jobTriggerEditor_fieldHelp_repeatInterval = ìì ìŽ ì€íëë ë¹ë +widget_jobTriggerEditor_fieldHelp_startDelay = ì§ì ë ìê°ìŽ ì¢ ë£í íì ìì ì ì€íì ììí©ëë€ +widget_jobTriggerEditor_field_cronExpression = Cron ííì +widget_jobTriggerEditor_field_mode = ì€ìŒì¥Žë§ +widget_jobTriggerEditor_field_repeatInterval_later = 맀í +widget_jobTriggerEditor_field_repeatInterval_now = íì¬ì ë§€ë² ì€í +widget_jobTriggerEditor_field_startType = ì€í +widget_jobTriggerEditor_message_endTimeMustBeAfterStartTime = ì¢ ë£ ìê°ì ìì ìê° ìŽíì¬ìŒ í©ëë€. +widget_jobTriggerEditor_message_endTimeMustBeInFuture = ì¢ ë£ ìê°ì 믞ëìŽìŽìŒ í©ëë€. +widget_jobTriggerEditor_message_startTimeMustBeInFuture = ìì ìê°ì 믞ëìŽìŽìŒ í©ëë€. +widget_jobTriggerEditor_tab_examples = ìì +widget_jobTriggerEditor_tab_format = í¬ë§· +widget_jobTriggerEditor_value_calendar = ë¬ë ¥ +widget_jobTriggerEditor_value_cronExpression = Cron ííì +widget_jobTriggerEditor_value_for = For +widget_jobTriggerEditor_value_in = in +widget_jobTriggerEditor_value_indefinitely = 묎Ʞí +widget_jobTriggerEditor_value_later = ëì€ì +widget_jobTriggerEditor_value_laterAndRepeat = ëì€ì & ë°ë³µ +widget_jobTriggerEditor_value_now = íì¬ +widget_jobTriggerEditor_value_nowAndRepeat = íì¬ & ë°ë³µ +widget_jobTriggerEditor_value_on = on +widget_jobTriggerEditor_value_until = Until +widget_recordEditor_error_invalidViewPath = ì못ë ë·° 겜ë¡: [{0}] +widget_recordEditor_error_multipleRecords = ì¬ë¬ ë ìœëê° ë°ê²¬ - íëë§ êž°ëíê³ ììµëë€. +widget_recordEditor_error_noRecords = ë ìœë륌 íëë ì°Ÿì ì ììµëë€ - íëë§ êž°ëíê³ ììµëë€. +widget_recordEditor_error_operation = ìì ìŽ ì€íšíìµëë€. ì€ë¥ê° ë°ìíìµëë€ +widget_recordEditor_error_operationInvalidValues = ìì ìŽ ì€íšíìµëë€ - íë ìŽìì íëê° ì못ë ê°ì ê°ì§ê³ ììµëë€ +widget_recordEditor_error_permissionCreate = [{0}]륌 ìë¡ ë§ëëë° íìí ê¶íì ê°ì§ê³ ìì§ ììµëë€ +widget_recordEditor_error_unsupportedOperationType = ì§ìëì§ ìë ìŽì íì : [{0}] +widget_recordEditor_info_recordCreatedConcise = {0} ìŽ ìì±ëììµëë€. +widget_recordEditor_info_recordCreatedDetailed = {0} [{1}] ìŽ ìì±ëììµëë€. +widget_recordEditor_info_recordUpdatedConcise = {0} ìŽ ì ë°ìŽíž ëììµëë€. +widget_recordEditor_info_recordUpdatedDetailed = {0} [{1}] ìŽ ì ë°ìŽíž ëììµëë€. +widget_recordEditor_title_edit = ížì§ {0} [{1}] +widget_recordEditor_title_new = ìë¡ ë§ë€êž° {0} +widget_recordEditor_title_view = 볎Ʞ {0} [{1}] +widget_recordEditor_warn_validation = íë ìŽìì íëê° ì못ë ê°ì ê°ì§ê³ ììµëë€. ìŽ [{0}]ë ê°ìŽ ìì ë ëê¹ì§ ì ì¥í ì ììµëë€ +widget_resourceFactoryWizard_archPrompt = íší€ì§ ìí€í ì³ +widget_resourceFactoryWizard_configTemplatePrompt = 늬ìì€ êµ¬ì± í í늿 +widget_resourceFactoryWizard_contentTemplatePrompt = ë°°í¬ êµ¬ì± í í늿 +widget_resourceFactoryWizard_createSubmit = ìŽëŠ [{0}] 늬ìì€ë¥Œ ê°ì§ ì 늬ìì€ ë§ë€êž° ìì² ì ì¡ìŽ ì±ê³µíìµëë€. +widget_resourceFactoryWizard_createSubmitType = íì [{0}]ì ì 늬ìì€ ë§ë€êž° ìì²ì 볎ëŽëë° ì±ê³µíìµëë€. +widget_resourceFactoryWizard_createWizardTitle = íì [{0}]ì ì 늬ìì€ ë§ë€êž° +widget_resourceFactoryWizard_createWizardWindowTitle = 늬ìì€ ìì± ë§ë²ì¬ +widget_resourceFactoryWizard_editConfigStepName = ë°°í¬ ìµì +widget_resourceFactoryWizard_execute1 = ì 늬ìì€ ë§ë€êž°ì ì€íšíìµëë€ - íší€ì§ ë²ì ìŽ ì¡Žì¬íì§ ììµëë€ +widget_resourceFactoryWizard_execute2 = ì 늬ìì€ ë§ë€êž°ì ì€íšíìµëë€. ìŽ ììŽì ížì ì°ê²°í ì ììµëë€. ìŽ ììŽì ížê° ë€ìŽë ê²ì ì믞í ì ììµëë€. +widget_resourceFactoryWizard_execute3 = ìë¡ìŽ 늬ìì€ ìì±ì ì€íšíìµëë€ +widget_resourceFactoryWizard_failedToDeleteVersion = 늬ìì€ ìì± ì·šìì íší€ì§ ë²ì ìì ì ì€íšíìµëë€ +widget_resourceFactoryWizard_failedToGetType = ì 늬ìì€ íší€ì§ íì ì ê°ì žì€ëë° ì€íšíìµëë€ +widget_resourceFactoryWizard_importFailure = ìëìŒë¡ 늬ìì€ë¥Œ ê°ì žì€ëë° ì€íšíìµëë€ +widget_resourceFactoryWizard_importFailure2 = ìëìŒë¡ 늬ìì€ë¥Œ ê°ì žì€ì§ 못íìµëë€. ìŽ ììŽì ížì ì°ê²°í ì ììµëë€. ìŽ ììŽì ížê° ë€ìŽë ê²ì ì믞í ì ììµëë€. +widget_resourceFactoryWizard_importSubmitted = ì 늬ìì€ íì [{0}] ê°ì žì€êž° ìì²ìŽ ì ì¡ëììµëë€ +widget_resourceFactoryWizard_importWizardTitle = ì 늬ìì€ íì [{0}] ê°ì žì€êž° +widget_resourceFactoryWizard_importWizardWindowTitle = 늬ìì€ ê°ì žì€êž° ë§ë²ì¬ +widget_resourceFactoryWizard_infoStepName = 늬ìì€ ì 볎 +widget_resourceFactoryWizard_infoStep_loadFail = ìí€í ì³ë¥Œ ìŽì© ê°ë¥íê² íëë° ì€íšíìµëë€ +widget_resourceFactoryWizard_namePrompt = ì 늬ìì€ ìŽëŠ +widget_resourceFactoryWizard_templatePrompt = ì°ê²° ì€ì í í늿 +widget_resourceFactoryWizard_timeoutFailure = íì ìì +widget_resourceFactoryWizard_timeoutHelp = ìê° ê°ê²©. ë§ìœ ì§ì ëë€ë©Ž ({0} ììŽì ížìì) ìì 늬ìì€ë¥Œ ë§ë€êž° ìí Ʞ볞 íìììì 묎ìí©ëë€. í° ìì©íë¡ê·žëšì ë°°í¬ì ê°ì ìê°ìŽ ì€ë 걞늬ë ìì± ìì ì ì ì©í©ëë€. ìŒë°ì ìŒë¡ ìŽì ì ìëê° íìììì ì€íšìž 겜ì°ì ì¬ì©ë©ëë€. +widget_resourceFactoryWizard_uploadFailure = íìŒ ì ë¡ë ì€íš +widget_resourceFactoryWizard_uploadFileStepName = 늬ìì€ ì»ší ìž íìŒì ì ë¡ë +widget_resourceFactoryWizard_uploadInProgress = ì ë¡ëê° ì§íì€ì ëë€... í° íìŒì ë°°í¬íëë° ëª ë¶ìŽ 걞늎 ì ììµëë€. +widget_resourceFactoryWizard_versionPrompt = íší€ì§ ë²ì +widget_resourceSelector_groupCategory = 귞룹 칎í ê³ ëŠ¬ +widget_resourceSelector_pleaseSelectMultipleResource = íë ìŽìì 늬ìì€ë¥Œ ì ííììì€ +widget_resourceSelector_pleaseSelectResource = 늬ìì€ë¥Œ ì ííììì€ +widget_resourceSelector_selectMultipleResources = 늬ìì€ë¥Œ ì í +widget_resourceSelector_selectResource = 늬ìì€ë¥Œ ì í +widget_typeCache_loadFail = 늬ìì€ íì ë©íë°ìŽí°ì ë¡ëì ì€íšíìµëë€ +widget_typeTree_badTemplateType = ì못ë URL. ì ì ìë í í늿 íì [{0}] +widget_typeTree_badTypeId = ì못ë URL. ì못ë 늬ìì€ íì ID [{0}] +widget_typeTree_loadFail = 늬ìì€ íì ë¡ëì ì€íšíìµëë€
commit 377a2c814d96055bf60871cb49c978489bde7b22 Author: Heiko W. Rupp hwr@redhat.com Date: Fri Jan 11 22:29:38 2013 +0100
Support CRUD on Conditions and Notifications
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java index a98bf69..7105d7f 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerBean.java @@ -201,7 +201,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal, @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public int createDependentAlertDefinition(Subject subject, AlertDefinition alertDefinition, int resourceId) throws InvalidAlertDefinitionException { - + return createAlertDefinitionInternal(subject, alertDefinition, resourceId, false, false); }
@@ -209,7 +209,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal, @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public int createAlertDefinition(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean validateNotificationConfiguration) throws InvalidAlertDefinitionException { - + return createAlertDefinitionInternal(subject, alertDefinition, resourceId, true, validateNotificationConfiguration); }
@@ -280,7 +280,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
return alertDefinition.getId(); } - + private void fixRecoveryId(AlertDefinition definition) { try { if (definition.getParentId() != 0 && definition.getRecoveryId() != 0) { @@ -471,20 +471,22 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal, AlertDefinitionUpdateException { return updateAlertDefinitionInternal(subject, alertDefinitionId, alertDefinition, resetMatching, true, true); } - + @Override @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public AlertDefinition updateDependentAlertDefinition(Subject subject, int alertDefinitionId, AlertDefinition alertDefinition, boolean resetMatching) throws InvalidAlertDefinitionException, AlertDefinitionUpdateException { return updateAlertDefinitionInternal(subject, alertDefinitionId, alertDefinition, resetMatching, false, false); } - - private AlertDefinition updateAlertDefinitionInternal(Subject subject, int alertDefinitionId, - AlertDefinition alertDefinition, boolean resetMatching, boolean checkPerms, boolean finalizeNotifications) throws InvalidAlertDefinitionException, + + @Override + public AlertDefinition updateAlertDefinitionInternal(Subject subject, int alertDefinitionId, + AlertDefinition alertDefinition, boolean resetMatching, + boolean checkPerms, boolean finalizeNotifications) throws InvalidAlertDefinitionException, AlertDefinitionUpdateException { if (resetMatching) { alertDefinitionManager.purgeInternals(alertDefinitionId); } - + /* * Method for catching ENABLE / DISABLE changes will use switch logic off of the delta instead of calling out to * the enable/disable functions @@ -512,7 +514,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal, * is not currently deleted */ boolean isResourceLevel = (oldAlertDefinition.getResource() != null); - + checkAlertDefinition(subject, oldAlertDefinition, alertDefinition, isResourceLevel ? oldAlertDefinition.getResource().getId() : null, finalizeNotifications);
@@ -609,7 +611,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal, //return an object with the same... let's force lazy load before we leave the persistence context new ArrayList<AlertCondition>(newAlertDefinition.getConditions()); new ArrayList<AlertNotification>(newAlertDefinition.getAlertNotifications()); - + return newAlertDefinition; }
@@ -662,21 +664,21 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal,
if (finalizeNotifications) { List<AlertNotification> notifications = new ArrayList<AlertNotification>(alertDefinition.getAlertNotifications()); - + //now remove the notifications that have not changed if (persistedAlertDefinition != null) { List<AlertNotification> persistedNotifications = persistedAlertDefinition.getAlertNotifications() == null ? Collections.<AlertNotification>emptyList() : persistedAlertDefinition.getAlertNotifications(); - + if (persistedNotifications.size() > 0) { Iterator<AlertNotification> it = notifications.iterator(); while (it.hasNext()) { AlertNotification newNotification = it.next(); - + if (newNotification.getId() == 0) { //this is a fresh, not persisted notif. These guys have to be always finalized. continue; } - + for(AlertNotification persistedNotification : persistedNotifications) { //ignore the ids on the notifications as they may vary if we are comparing parent alert def with its children //it's enough for us they they are semantically the same. @@ -688,7 +690,7 @@ public class AlertDefinitionManagerBean implements AlertDefinitionManagerLocal, } } } - + if (!alertNotificationManager.finalizeNotifications(subject, notifications)) { throw new InvalidAlertDefinitionException("Some of the notifications failed to validate."); } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java index 95dd3a7..94b877c 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/alert/AlertDefinitionManagerLocal.java @@ -49,7 +49,7 @@ public interface AlertDefinitionManagerLocal { * Creates a new alert definition. Note that the suject is checked to have necessary authz, which might not * be what you want in all use cases. See {@link #createDependentAlertDefinition(Subject, AlertDefinition, int)} * for further discussion of this. - * + * * @param subject the user creating the alert definition * @param alertDefinition the new alert definition to persist * @param resourceId the resource id for which the def is being created @@ -65,26 +65,26 @@ public interface AlertDefinitionManagerLocal { */ int createAlertDefinition(Subject subject, AlertDefinition alertDefinition, Integer resourceId, boolean finalizeNotificationConfiguration) throws InvalidAlertDefinitionException; - + /** * This is exactly the same as {@link #createAlertDefinition(Subject, AlertDefinition, Integer, boolean)} but - * assumes the resource is part of a group (or has given resource type for templates) for which + * assumes the resource is part of a group (or has given resource type for templates) for which * a group or template alert definition is being created. * <p> * This method assumes the caller already checked the subject has permissions to create a group or template alert * definition on a group / resource type the resource is member of. * <p> - * In another words this method is a helper to + * In another words this method is a helper to * {@link GroupAlertDefinitionManagerLocal#createGroupAlertDefinitions(Subject, AlertDefinition, Integer)} and * {@link AlertTemplateManagerLocal#createAlertTemplate(Subject, AlertDefinition, Integer)}. - * + * * @param subject the user that is creating the group or template alert definition * @param alertDefinition the alert definition on the resource * @param resourceId the resource * @return the id of the newly created alert definition */ int createDependentAlertDefinition(Subject subject, AlertDefinition alertDefinition, int resourceId); - + boolean isEnabled(Integer definitionId);
boolean isTemplate(Integer definitionId); @@ -118,7 +118,7 @@ public interface AlertDefinitionManagerLocal { * <p> * This method is therefore identical to {@link #updateAlertDefinition(Subject, int, AlertDefinition, boolean)} but * does not perform any authorization checks. - * + * * @param subject the user that is updating the alert definition * @param alertDefinitionId * @param alertDefinition @@ -128,7 +128,7 @@ public interface AlertDefinitionManagerLocal { * @throws AlertDefinitionUpdateException */ AlertDefinition updateDependentAlertDefinition(Subject subject, int alertDefinitionId, AlertDefinition alertDefinition, boolean resetMatching) throws InvalidAlertDefinitionException, AlertDefinitionUpdateException; - + int purgeUnusedAlertDefinitions();
void purgeInternals(int alertDefinitionId); @@ -150,4 +150,9 @@ public interface AlertDefinitionManagerLocal { int removeAlertDefinitions(Subject subject, int[] alertDefinitionIds);
String[] getAlertNotificationConfigurationPreview(Subject sessionSubject, AlertNotification[] notifications); + + AlertDefinition updateAlertDefinitionInternal(Subject subject, int alertDefinitionId, + AlertDefinition alertDefinition, boolean resetMatching, + boolean checkPerms, boolean finalizeNotifications) throws InvalidAlertDefinitionException, + AlertDefinitionUpdateException; } \ No newline at end of file diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java index 8dce958..27165b4 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java @@ -21,17 +21,17 @@ package org.rhq.enterprise.server.rest; import java.net.URI; import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set;
import javax.ejb.EJB; import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; import javax.interceptor.Interceptors; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import javax.persistence.Query; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; @@ -74,11 +74,13 @@ import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.criteria.AlertCriteria; import org.rhq.core.domain.criteria.AlertDefinitionCriteria; import org.rhq.core.domain.criteria.Criteria; +import org.rhq.core.domain.measurement.MeasurementDefinition; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; import org.rhq.enterprise.server.RHQConstants; +import org.rhq.enterprise.server.alert.AlertConditionManagerLocal; import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; import org.rhq.enterprise.server.alert.AlertManagerLocal; import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal; @@ -109,6 +111,9 @@ public class AlertHandlerBean extends AbstractRestBean { @EJB AlertNotificationManagerLocal notificationMgr;
+ @EJB + AlertConditionManagerLocal conditionMgr; + @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) private EntityManager entityManager;
@@ -217,7 +222,7 @@ public class AlertHandlerBean extends AbstractRestBean { @GET @Path("/{id}/conditions") @Cache(maxAge = 300) - @ApiOperation(value = "Return the notification logs for the given alert") + @ApiOperation(value = "Return the condition logs for the given alert") public Response getConditionLogs(@ApiParam("Id of the alert to retrieve") @PathParam("id") int id, @Context Request request, @Context UriInfo uriInfo, @Context HttpHeaders headers) {
@@ -400,15 +405,7 @@ public class AlertHandlerBean extends AbstractRestBean {
List<AlertNotification> notifications = new ArrayList<AlertNotification>(adr.getNotifications().size()); for (AlertNotificationRest anr : adr.getNotifications()) { - AlertNotification notification = new AlertNotification(anr.getSenderName()); - // TODO validate sender - notification.setAlertDefinition(alertDefinition); - Configuration configuration = new Configuration(); - for (Map.Entry<String,Object> entry: anr.getConfig().entrySet()) { - configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); - } - notification.setConfiguration(configuration); - // TODO extra configuration (?) + AlertNotification notification = notificationRestToNotification(alertDefinition, anr);
notifications.add(notification); } @@ -439,6 +436,20 @@ public class AlertHandlerBean extends AbstractRestBean { return builder.build(); }
+ private AlertNotification notificationRestToNotification(AlertDefinition alertDefinition, + AlertNotificationRest anr) { + AlertNotification notification = new AlertNotification(anr.getSenderName()); + // TODO validate sender + notification.setAlertDefinition(alertDefinition); + Configuration configuration = new Configuration(); + for (Map.Entry<String,Object> entry: anr.getConfig().entrySet()) { + configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); + } + notification.setConfiguration(configuration); + // TODO extra configuration (?) + return notification; + } + @PUT @Path("/definition/{id}") @ApiOperation(value = "Update the alert definition (priority, enablement)", notes = "Priority must be HIGH,LOW,MEDIUM") @@ -489,28 +500,192 @@ public class AlertHandlerBean extends AbstractRestBean {
alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition,false);
+ Response.ResponseBuilder builder = getResponseBuilderForCondition(definitionId, uriInfo, condition, true); + + return builder.build(); + } + + private Response.ResponseBuilder getResponseBuilderForCondition(int definitionId, UriInfo uriInfo, + AlertCondition originalCondition, boolean isCreate) { AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); Set<AlertCondition> conditions = updatedDefinition.getConditions(); int conditionId=-1; + AlertCondition createdCondition = null; for (AlertCondition cond :conditions) { - if (cond.getName().equals(condition.getName())) + if (cond.getName().equals(originalCondition.getName())) { conditionId = cond.getId(); + createdCondition = cond; + } }
UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); - uriBuilder.path("/alert/definition/{id}/condition/{cid}"); - URI uri = uriBuilder.build(definitionId,conditionId); + uriBuilder.path("/alert/condition/{cid}"); + URI uri = uriBuilder.build(conditionId);
- Response.ResponseBuilder builder = Response.created(uri); + AlertConditionRest result = conditionToConditionRest(createdCondition); + + Response.ResponseBuilder builder; + if (isCreate) + builder = Response.created(uri); + else { + builder = Response.ok(); + builder.location(uri); + } + builder.entity(result); + return builder; + } + + @GET + @Path("notification/{nid}") + public Response getNotification(@PathParam("nid") int notificationId) { + + AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); + AlertNotificationRest anr = notificationToNotificationRest(notification); + + return Response.ok(anr).build(); + } + + @DELETE + @Path("notification/{nid}") + public Response deleteNotification(@PathParam("nid") int notificationId) { + + AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,notification.getAlertDefinition().getId()); + + definition.getAlertNotifications().remove(notification); + + alertDefinitionManager.updateAlertDefinitionInternal(caller,definition.getId(),definition,true,true,true); +// alertDefinitionManager.updateAlertDefinition(caller, definition.getId(), copiedDef, true); + + entityManager.flush(); + + return Response.noContent().build(); + } + + @PUT + @Path("notification/{nid}") + public Response updateNotification(@PathParam("nid") int notificationId, AlertNotificationRest notificationRest) { + + AlertNotification notification = notificationMgr.getAlertNotification(caller,notificationId); + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,notification.getAlertDefinition().getId()); + + AlertNotification newNotif = notificationRestToNotification(definition,notificationRest); + notification.setConfiguration(newNotif.getConfiguration()); + notification.setExtraConfiguration(newNotif.getExtraConfiguration()); + // id and sender need to stay the same + + alertDefinitionManager.updateAlertDefinitionInternal(caller,definition.getId(),definition,true,true,true); + entityManager.flush();
+ List<AlertNotification> notifications = definition.getAlertNotifications(); + int newNotifId = 0; + for (AlertNotification n : notifications) { + if (n.getSenderName().equals(notification.getSenderName())) + newNotifId = n.getId(); + } + + AlertNotification result = notificationMgr.getAlertNotification(caller,newNotifId); + AlertNotificationRest resultRest = notificationToNotificationRest(result); + + return Response.ok(resultRest).build(); // TODO + } + + + @DELETE + @Path("condition/{cid}") + public Response deleteCondition(@PathParam("cid") int conditionId) { + Integer definitionId = findDefinitionIdForConditionId(conditionId); + + AlertDefinition definition2 = entityManager.find(AlertDefinition.class,definitionId); + AlertCondition condition=null; + for (AlertCondition c: definition2.getConditions()) { + if (c.getId() == conditionId) + condition=c; + } + + definition2.getConditions().remove(condition); + + alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition2,true); + + return Response.noContent().build(); + } + + private Integer findDefinitionIdForConditionId(int conditionId) { + /* + // this returns a proxy object, which is not fully initialized + // and all the further work will fail + AlertCondition condition = conditionMgr.getAlertConditionById(conditionId); + AlertDefinition def = condition.getAlertDefinition() + + // So we need to "manually" pull that information in + */ + + Query q = entityManager.createQuery("SELECT condition.alertDefinition.id FROM AlertCondition condition WHERE condition.id = :id "); + q.setParameter("id",conditionId); + Object o = q.getSingleResult(); + return (Integer)o; + } + + @PUT + @Path("condition/{cid}") + public Response updateCondition(@PathParam("cid") int conditionId, AlertConditionRest conditionRest, @Context UriInfo uriInfo) { + + Integer definitionId = findDefinitionIdForConditionId(conditionId); + + AlertDefinition definition = entityManager.find(AlertDefinition.class,definitionId); + AlertCondition condition=null; + + for (Iterator<AlertCondition> iterator = definition.getConditions().iterator(); iterator.hasNext(); ) { + AlertCondition oldCondition = iterator.next(); + if (oldCondition.getId() == conditionId) { + condition = new AlertCondition(oldCondition); + oldCondition.setAlertDefinition(null); + iterator.remove(); + entityManager.remove(oldCondition); + } + } + + + AlertCondition restCondition = conditionRestToCondition(conditionRest); + + condition.setOption(conditionRest.getOption()); + condition.setComparator(conditionRest.getComparator()); + condition.setMeasurementDefinition(restCondition.getMeasurementDefinition()); + condition.setThreshold(conditionRest.getThreshold()); + condition.setTriggerId(conditionRest.getTriggerId()); + definition.getConditions().add(condition); + + alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, true, true, true); + + entityManager.flush(); + + Response.ResponseBuilder builder = getResponseBuilderForCondition(definitionId,uriInfo,condition,false); return builder.build();
}
+ @GET + @Path("condition/{cid}") + public Response getCondition(@PathParam("cid") int conditionId) { + + AlertCondition condition = conditionMgr.getAlertConditionById(conditionId); + AlertConditionRest acr = conditionToConditionRest(condition); + + return Response.ok(acr).build(); + + } + private AlertCondition conditionRestToCondition(AlertConditionRest conditionRest) { AlertCondition condition = new AlertCondition(); condition.setName(conditionRest.getName().name()); condition.setCategory(AlertConditionCategory.valueOf(conditionRest.getCategory().getName())); + condition.setOption(conditionRest.getOption()); + condition.setComparator(conditionRest.getComparator()); + MeasurementDefinition md = entityManager.find(MeasurementDefinition.class,conditionRest.getMeasurementDefinition()); + condition.setMeasurementDefinition(md); + condition.setThreshold(conditionRest.getThreshold()); + condition.setTriggerId(conditionRest.getTriggerId()); + return condition; }
@@ -545,10 +720,14 @@ public class AlertHandlerBean extends AbstractRestBean { // TODO extra configuration (?)
- alertDefinitionManager.updateAlertDefinition(caller, definitionId, definition, false); + alertDefinitionManager.updateAlertDefinitionInternal(caller, definitionId, definition, false, true, true);
- AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + alertDefinitionManager.getAlertDefinition(caller,definitionId); + + entityManager.flush(); + + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinitionById(caller,definitionId);
List<AlertNotification> notifs = updatedDefinition.getAlertNotifications();
@@ -560,8 +739,8 @@ public class AlertHandlerBean extends AbstractRestBean { int notificationId = updatedNotification.getId();
UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); - uriBuilder.path("/alert/definition/{id}/notification/{nid}"); - URI uri = uriBuilder.build(definitionId, notificationId ); + uriBuilder.path("/alert/notification/{nid}"); + URI uri = uriBuilder.build(notificationId );
Response.ResponseBuilder builder = Response.created(uri); builder.entity(updatedNotificationRest); @@ -659,7 +838,8 @@ public class AlertHandlerBean extends AbstractRestBean { acr.setName(AlertConditionOperator.valueOf(condition.getName())); acr.setCategory(condition.getCategory()); acr.setOption(condition.getOption()); - // TODO measurement definition + acr.setComparator(condition.getComparator()); + acr.setMeasurementDefinition(condition.getMeasurementDefinition()==null?0:condition.getMeasurementDefinition().getId()); acr.setThreshold(condition.getThreshold()); acr.setTriggerId(condition.getTriggerId()); // TODO what's that?
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java index 5db2b9d..2c47704 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java @@ -38,6 +38,8 @@ public class AlertConditionRest { private Double threshold; private String option; private Integer triggerId; + private String comparator; + private int measurementDefinition;
public AlertConditionRest() { } @@ -90,4 +92,19 @@ public class AlertConditionRest { this.triggerId = triggerId; }
+ public String getComparator() { + return comparator; + } + + public void setComparator(String comparator) { + this.comparator = comparator; + } + + public int getMeasurementDefinition() { + return measurementDefinition; + } + + public void setMeasurementDefinition(int measurementDefinition) { + this.measurementDefinition = measurementDefinition; + } } diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java index 1f3a966..3e3fb98 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java @@ -29,6 +29,8 @@ import org.rhq.modules.integrationTests.restApi.d.AlertNotification;
import static com.jayway.restassured.RestAssured.expect; import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.iterableWithSize;
/** * Testing of the Alerting part of the rest-api @@ -248,7 +250,7 @@ public class AlertTest extends AbstractBase { .header(acceptJson) .contentType(ContentType.JSON) .body(notification) - .pathParam("defId",definitionId) + .pathParam("defId", definitionId) .log().everything() .expect() .statusCode(201) @@ -279,6 +281,156 @@ public class AlertTest extends AbstractBase { }
@Test + public void testCRUDNotification() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + // Now add a condition + try { + + AlertNotification notification = new AlertNotification("Direct Emails"); // short-name from server plugin descriptor + notification.getConfig().put("emailAddress", "root@eruditorium.org"); + + Integer nid = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(notification) + .pathParam("defId",definitionId) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definition/{defId}/notifications") + .getBody() + .jsonPath().get("id"); + + // Update the notification + notification.getConfig().put("emailAddress", "root@eruditorium.org,enoch@root.com"); + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(notification) + .pathParam("nid",nid) + .expect() + .statusCode(200) + .log().ifError() + .when() + .put("/alert/notification/{nid}"); + + + // Retrieve the definition with the added condition + AlertDefinition updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().ifError() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + int size = updatedDefinition.getNotifications().size(); + assert size ==1 : "Did not find 1 notification, but " + size; + + // Need to use the updated id + nid = updatedDefinition.getNotifications().get(0).getId(); + given() + .pathParam("nid",nid) + .expect() + .statusCode(204) + .when() + .delete("/alert/notification/{nid}"); + + // delete the notification + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + @Test + public void testCRUDCondition() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + // Now add a condition + try { + + AlertCondition condition = new AlertCondition("LESS_THAN","THRESHOLD"); + condition.setOption("12345"); + condition.setComparator(">"); + condition.setMeasurementDefinition(10173); + + Integer cid = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(condition) + .pathParam("defId", definitionId) + .expect() + .statusCode(201) + .log().ifError() + .body("option",is("12345")) + .body("comparator",is(">")) + .when() + .post("/alert/definition/{defId}/conditions") + .getBody() + .jsonPath().get("id"); + + // Update the condition + condition.setOption("23456"); + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(condition) + .pathParam("cid",cid) + .expect() + .statusCode(200) + .log().ifError() + .body("option",is("23456")) + .body("comparator",is(">")) + .when() + .put("/alert/condition/{cid}"); + + + // Retrieve the definition with the added condition + AlertDefinition updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + int size = updatedDefinition.getConditions().size(); + assert size ==1 : "Did not find 1 condition, but " + size; + + // Need to use the updated id + cid = updatedDefinition.getConditions().get(0).getId(); + given() + .pathParam("cid",cid) + .expect() + .statusCode(204) + .when() + .delete("/alert/condition/{cid}"); + + // delete the notification + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + @Test public void testCreateDeleteAlertDefinitionWithUnknwonSender() throws Exception {
int definitionId = createEmptyAlertDefinition(); @@ -405,7 +557,7 @@ public class AlertTest extends AbstractBase { .queryParam("resourceId", 10001) .expect() .statusCode(201) - .log().everything() + .log().ifError() .when() .post("/alert/definitions") .as(AlertDefinition.class); @@ -415,10 +567,142 @@ public class AlertTest extends AbstractBase {
assert result.getConditions().size()==1; assert result.getNotifications().size()==1; + + // Now retrieve the condition and notification individually + + given() + .header(acceptJson) + .pathParam("id",result.getNotifications().get(0).getId()) + .expect() + .statusCode(200) + .body("id",is(result.getNotifications().get(0).getId())) + .body("senderName",is(result.getNotifications().get(0).getSenderName())) + .log().ifError() + .when() + .get("/alert/notification/{id}"); + + given() + .header(acceptJson) + .pathParam("id",result.getConditions().get(0).getId()) + .expect() + .statusCode(200) + .body("id",is(result.getConditions().get(0).getId())) + .body("name",is(result.getConditions().get(0).getName())) + .log().ifError() + .when() + .get("/alert/condition/{id}"); + + } finally { -// cleanupDefinition(definitionId); + cleanupDefinition(definitionId); } + } + + @Test + public void testNewFullDefinitionPlusRemovals() throws Exception { + + int definitionId = 0; + try { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-full-definition2"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("HIGH"); + + AlertNotification notification = new AlertNotification("Direct Emails"); + notification.getConfig().put("emailAddress","enoch@root.org"); + alertDefinition.getNotifications().add(notification); + + AlertCondition condition = new AlertCondition("AVAIL_GOES_DOWN","AVAILABILITY"); + alertDefinition.getConditions().add(condition); + + AlertDefinition result = + given() + .contentType(ContentType.JSON) + .header(acceptJson) + .body(alertDefinition) + .queryParam("resourceId", 10001) + .expect() + .statusCode(201) + .body("priority", is("HIGH")) + .body("conditions", iterableWithSize(1)) + .body("notifications", iterableWithSize(1)) + .body("name",is("-x-test-full-definition2")) + .log().everything() + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + assert result != null; + definitionId = result.getId(); + System.out.println("Definition id: " + definitionId); + + + // Now retrieve the condition and notification individually + + given() + .header(acceptJson) + .pathParam("id",result.getNotifications().get(0).getId()) + .expect() + .statusCode(204) + .log().ifError() + .when() + .delete("/alert/notification/{id}"); + + + //retrieve definition again to see if notification is really gone + AlertDefinition result2 = + given() + .contentType(ContentType.JSON) + .header(acceptJson) + .pathParam("did", definitionId) + .queryParam("full", true) + .expect() + .statusCode(200) + .body("conditions", iterableWithSize(1)) + .body("notifications", iterableWithSize(0)) + .body("name",is("-x-test-full-definition2")) + .body("priority",is("HIGH")) + .log().everything() + .when() + .get("/alert/definition/{did}") + .as(AlertDefinition.class); + + assert result2.getId() == result.getId(); + + // Now also remove the condition + int conditionId = result2.getConditions().get(0).getId(); // + + + System.out.println("Condition id " + conditionId + " result-> " + result.getConditions().get(0).getId()); + given() + .header(acceptJson) + .pathParam("id", conditionId) + .expect() + .statusCode(204) + .log().ifError() + .when() + .delete("/alert/condition/{id}");
+ //retrieve definition again to see if notification is really gone + given() + .contentType(ContentType.JSON) + .header(acceptJson) + .pathParam("did", definitionId) + .queryParam("full", true) + .expect() + .statusCode(200) + .body("conditions", iterableWithSize(0)) + .body("notifications", iterableWithSize(0)) + .body("name",is("-x-test-full-definition2")) + .body("priority",is("HIGH")) + .log().everything() + .when() + .get("/alert/definition/{did}"); + + + } finally { + cleanupDefinition(definitionId); + } }
private void cleanupDefinition(int definitionId) { diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java index 55aaff2..7ece940 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java @@ -7,11 +7,13 @@ package org.rhq.modules.integrationTests.restApi.d; public class AlertCondition {
int id; - String name; + String name; // = AlertConditionOperator.class String category; private Double threshold; private String option; private Integer triggerId; + private String comparator; + private int measurementDefinition;
public AlertCondition(String name, String category) { this.name = name; @@ -73,4 +75,19 @@ public class AlertCondition { this.triggerId = triggerId; }
+ public String getComparator() { + return comparator; + } + + public void setComparator(String comparator) { + this.comparator = comparator; + } + + public void setMeasurementDefinition(int measurementDefinition) { + this.measurementDefinition = measurementDefinition; + } + + public int getMeasurementDefinition() { + return measurementDefinition; + } }
commit 0d71274f21ea87473a44d78cee9bdf8d0acff30c Author: Jirka Kremser jkremser@redhat.com Date: Fri Jan 11 14:11:15 2013 +0100
quick fix (typo): changing "unitialized" to "uninitialized".
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationLastCompletedComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationLastCompletedComposite.java index 4722f6a..1beecd9 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationLastCompletedComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationLastCompletedComposite.java @@ -39,7 +39,7 @@ public abstract class OperationLastCompletedComposite implements Serializable { //default no args constructor for java bean/serialization. Not to be used. protected OperationLastCompletedComposite() { this.operationHistoryId = 0; - this.operationName = "(unitialized)"; + this.operationName = "(uninitialized)"; this.operationStartTime = -1; this.operationStatus = OperationRequestStatus.FAILURE; } diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java index 1b80abf..f80811a 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java @@ -40,7 +40,7 @@ public abstract class OperationScheduleComposite implements Serializable { protected OperationScheduleComposite() { this.operationNextFireTime = -1; this.id = 0; - this.operationName = "(unitialized)"; + this.operationName = "(uninitialized)"; }
public OperationScheduleComposite(int id, String jobName, String jobGroup, String operationName, long operationNextFireTime) { diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationLastCompletedComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationLastCompletedComposite.java index dac6178..93acd35 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationLastCompletedComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationLastCompletedComposite.java @@ -40,8 +40,8 @@ public class ResourceOperationLastCompletedComposite extends OperationLastComple
this.resourceId = 0; this.resourceTypeId = 0; - this.resourceName = "(unitialized)"; - this.ancestry = "(unitialized)"; + this.resourceName = "(uninitialized)"; + this.ancestry = "(uninitialized)"; }
public ResourceOperationLastCompletedComposite(int operationId, String operationName, long operationStartTime, diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationScheduleComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationScheduleComposite.java index 692dd73..48d2153 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationScheduleComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/ResourceOperationScheduleComposite.java @@ -37,8 +37,8 @@ public class ResourceOperationScheduleComposite extends OperationScheduleComposi
this.resourceId = 0; this.resourceTypeId = 0; - this.resourceName = "(unitialized)"; - this.ancestry = "(unitialized)"; + this.resourceName = "(uninitialized)"; + this.ancestry = "(uninitialized)"; }
public ResourceOperationScheduleComposite(int id, String jobName, String jobGroup, String operationName, diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java index 85db7f8..e0ac71f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java @@ -97,7 +97,7 @@ public class OperationSchedulePortlet extends LocatableVLayout implements Custom
//default no-args constructor for serialization. private OperationSchedulePortlet() { - super("(unitialized)"); + super("(uninitialized)"); }
public OperationSchedulePortlet(String locatorId) {
commit 577a1597f587dfa3c267540aaca7bb391be7dcf9 Author: Jirka Kremser jkremser@redhat.com Date: Fri Jan 11 11:27:12 2013 +0100
[BZÂ 889108 - Scheduled Operations Portlet does not show operations scheduled on the group] The support for operation scheduled on the groups has been added for the portlet. Now, it shows both types of operations sorted by the next exec. time.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/GroupOperationScheduleComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/GroupOperationScheduleComposite.java index 1107b06..1fe76b9 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/GroupOperationScheduleComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/GroupOperationScheduleComposite.java @@ -30,11 +30,15 @@ package org.rhq.core.domain.operation.composite; public class GroupOperationScheduleComposite extends OperationScheduleComposite {
private static final long serialVersionUID = 2L; + + private int groupId; + private String groupName; + private String groupResourceTypeName;
- private final int groupId; - private final String groupName; - private final String groupResourceTypeName; - + //private no args constructor for serialization. Not to be used. + private GroupOperationScheduleComposite() { + } + public GroupOperationScheduleComposite(int id, String jobName, String jobGroup, String operationName, long operationNextFireTime, int groupId, String groupName, String groupResourceTypeName) { super(id, jobName, jobGroup, operationName, operationNextFireTime); diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java index f80811a..1b80abf 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/composite/OperationScheduleComposite.java @@ -40,7 +40,7 @@ public abstract class OperationScheduleComposite implements Serializable { protected OperationScheduleComposite() { this.operationNextFireTime = -1; this.id = 0; - this.operationName = "(uninitialized)"; + this.operationName = "(unitialized)"; }
public OperationScheduleComposite(int id, String jobName, String jobGroup, String operationName, long operationNextFireTime) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java index 6f99d10..08632732 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/LinkManager.java @@ -245,6 +245,11 @@ public class LinkManager { } return link; } + + + public static String getSubsystemGroupOperationScheduleLink(int groupId, int opScheduleId) { + return "#ResourceGroup/" + groupId + "/Operations/Schedules/" + opScheduleId; + }
public static String getAlertDetailLink(EntityContext entityContext, int alertId) { String link; diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java index 45f4d77..85db7f8 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/dashboard/portlets/recent/operations/OperationSchedulePortlet.java @@ -20,6 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.dashboard.portlets.recent.operatio */
import com.google.gwt.user.client.Timer; +import com.smartgwt.client.types.Alignment; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.HTMLFlow; import com.smartgwt.client.widgets.form.DynamicForm; @@ -41,6 +42,7 @@ import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; import org.rhq.core.domain.configuration.definition.PropertySimpleType; import org.rhq.core.domain.dashboard.DashboardPortlet; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.LinkManager; import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter; import org.rhq.enterprise.gui.coregui.client.dashboard.AutoRefreshPortlet; @@ -126,9 +128,15 @@ public class OperationSchedulePortlet extends LocatableVLayout implements Custom public String format(Object value, ListGridRecord record, int rowNum, int colNum) { if (value != null) { String timestamp = super.format(value, record, rowNum, colNum); - Integer resourceId = record.getAttributeAsInt(AncestryUtil.RESOURCE_ID); + Integer id = record.getAttributeAsInt(AncestryUtil.RESOURCE_ID); + String url = null; Integer opScheduleId = record.getAttributeAsInt("id"); - String url = LinkManager.getSubsystemResourceOperationScheduleLink(resourceId, opScheduleId); + if (id == null) { + id = record.getAttributeAsInt(ScheduledOperationsDataSource.Field.GROUP_ID.propertyName()); + url = LinkManager.getSubsystemGroupOperationScheduleLink(id, opScheduleId); + } else { + url = LinkManager.getSubsystemResourceOperationScheduleLink(id, opScheduleId); + } return SeleniumUtility.getLocatableHref(url, timestamp, null); } else { return "<i>" + MSG.common_label_none() + "</i>"; @@ -142,23 +150,54 @@ public class OperationSchedulePortlet extends LocatableVLayout implements Custom ListGridField operationNext = new ListGridField(ScheduledOperationsDataSource.Field.OPERATION.propertyName(), ScheduledOperationsDataSource.Field.OPERATION.title());
- ListGridField resourceNext = new ListGridField(ScheduledOperationsDataSource.Field.RESOURCE.propertyName(), - ScheduledOperationsDataSource.Field.RESOURCE.title()); + ListGridField resourceNext = new ListGridField(ScheduledOperationsDataSource.Field.RESOURCE_OR_GROUP.propertyName(), + ScheduledOperationsDataSource.Field.RESOURCE_OR_GROUP.title()); resourceNext.setCellFormatter(new CellFormatter() { public String format(Object o, ListGridRecord listGridRecord, int i, int i1) { - String url = LinkManager.getResourceLink(listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID)); + Integer id = listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID); + String url = null; + if (id == null) { + id = listGridRecord.getAttributeAsInt(ScheduledOperationsDataSource.Field.GROUP_ID.propertyName()); + url = LinkManager.getResourceGroupLink(id); + } else { + url = LinkManager.getResourceLink(id); + } return SeleniumUtility.getLocatableHref(url, o.toString(), null); } }); resourceNext.setShowHover(true); resourceNext.setHoverCustomizer(new HoverCustomizer() { public String hoverHTML(Object value, ListGridRecord listGridRecord, int rowNum, int colNum) { - return AncestryUtil.getResourceHoverHTML(listGridRecord, 0); + Integer id = listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID); + if (id != null) { + return MSG.common_title_resource() + ": " + AncestryUtil.getResourceHoverHTML(listGridRecord, 0); + } else { + String type = listGridRecord.getAttributeAsString(ScheduledOperationsDataSource.Field.GROUP_TYPE + .propertyName()); + String name = listGridRecord + .getAttributeAsString(ScheduledOperationsDataSource.Field.RESOURCE_OR_GROUP.propertyName()); + return "<p>" + MSG.common_title_group() + " (" + type + "):<br/><br/>" + name + "</p>"; + } } });
- ListGridField ancestryNext = AncestryUtil.setupAncestryListGridField(); - + + ListGridField ancestryNext = new ListGridField(AncestryUtil.RESOURCE_ANCESTRY, CoreGUI.getMessages().common_title_ancestry()); + ancestryNext.setAlign(Alignment.LEFT); + ancestryNext.setCellAlign(Alignment.LEFT); + AncestryUtil.setupAncestryListGridFieldCellFormatter(ancestryNext); + ancestryNext.setShowHover(true); + ancestryNext.setHoverCustomizer(new HoverCustomizer() { + public String hoverHTML(Object value, ListGridRecord listGridRecord, int rowNum, int colNum) { + Integer id = listGridRecord.getAttributeAsInt(AncestryUtil.RESOURCE_ID); + if (id != null) { + return AncestryUtil.getAncestryHoverHTML(listGridRecord, 0); + } else { + return MSG.common_title_group(); + } + } + }); + scheduledOperationsGrid.setFields(timeNext, operationNext, resourceNext, ancestryNext); }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java index f47e8f5..9c42fa1 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/OperationGWTService.java @@ -29,6 +29,7 @@ import org.rhq.core.domain.operation.GroupOperationHistory; import org.rhq.core.domain.operation.ResourceOperationHistory; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; import org.rhq.core.domain.operation.bean.ResourceOperationSchedule; +import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite; import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite; import org.rhq.core.domain.operation.composite.ResourceOperationScheduleComposite; import org.rhq.core.domain.util.PageControl; @@ -50,8 +51,25 @@ public interface OperationGWTService extends RemoteService { PageList<ResourceOperationLastCompletedComposite> findRecentCompletedOperations(int resourceId, PageControl pageControl) throws RuntimeException;
- PageList<ResourceOperationScheduleComposite> findScheduledOperations(int pageSize) throws RuntimeException; - + /** + * Find currently scheduled resource operations + * @param pageSize page size + * + * @return list of ResourceOperationScheduleComposites + */ + public PageList<ResourceOperationScheduleComposite> findCurrentlyScheduledResourceOperations(int pageSize) + throws RuntimeException; + + /** + * Find currently scheduled group operations + * + * @param pageSize page size + * @return list of GroupOperationScheduleComposite + */ + public PageList<GroupOperationScheduleComposite> findCurrentlyScheduledGroupOperations(int pageSize) + throws RuntimeException; + + void invokeResourceOperation(int resourceId, String operationName, Configuration parameters, String description, int timeout) throws RuntimeException;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java index fca0e8f..92f481f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/operation/ScheduledOperationsDataSource.java @@ -18,6 +18,9 @@ */ package org.rhq.enterprise.gui.coregui.client.operation;
+import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; @@ -33,8 +36,11 @@ import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.criteria.Criteria; +import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite; +import org.rhq.core.domain.operation.composite.OperationScheduleComposite; import org.rhq.core.domain.operation.composite.ResourceOperationScheduleComposite; import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.dashboard.Portlet; @@ -56,15 +62,20 @@ import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource; * @author Simeon Pinder * @author Jay Shaughnessy */ -public class ScheduledOperationsDataSource extends RPCDataSource<ResourceOperationScheduleComposite, Criteria> { +public class ScheduledOperationsDataSource extends RPCDataSource<OperationScheduleComposite, Criteria> {
public enum Field {
OPERATION("operationName", MSG.dataSource_operationSchedule_field_operationName()),
- RESOURCE("resource", MSG.common_title_resource()), + // the key has to remain 'resource' for AncestryUtil.getResourceHoverHTML() + RESOURCE_OR_GROUP("resource", MSG.common_title_resource() + " / " + MSG.common_title_group()),
- TIME("operationNextFireTime", MSG.dataSource_operationSchedule_field_nextFireTime()); + TIME("operationNextFireTime", MSG.dataSource_operationSchedule_field_nextFireTime()), + + GROUP_ID("groupId", "groupId"), + + GROUP_TYPE("groupType", MSG.common_title_resource_name());
/** * Corresponds to a property name of Resource (e.g. resourceType.name). @@ -117,11 +128,11 @@ public class ScheduledOperationsDataSource extends RPCDataSource<ResourceOperati protected List<DataSourceField> addDataSourceFields() { List<DataSourceField> fields = super.addDataSourceFields();
- DataSourceTextField resourceField = new DataSourceTextField(Field.RESOURCE.propertyName, Field.RESOURCE.title); + DataSourceTextField resourceField = new DataSourceTextField(Field.RESOURCE_OR_GROUP.propertyName, Field.RESOURCE_OR_GROUP.title); fields.add(resourceField);
- DataSourceTextField operationField = new DataSourceTextField(Field.OPERATION.propertyName(), Field.OPERATION - .title()); + DataSourceTextField operationField = new DataSourceTextField(Field.OPERATION.propertyName(), + Field.OPERATION.title()); fields.add(operationField);
DataSourceTextField timeField = new DataSourceTextField(Field.TIME.propertyName(), Field.TIME.title()); @@ -160,8 +171,9 @@ public class ScheduledOperationsDataSource extends RPCDataSource<ResourceOperati } } } + final int pageSizeConst = pageSize;
- GWTServiceLookup.getOperationService().findScheduledOperations(pageSize, + GWTServiceLookup.getOperationService().findCurrentlyScheduledResourceOperations(pageSizeConst, new AsyncCallback<PageList<ResourceOperationScheduleComposite>>() {
public void onFailure(Throwable throwable) { @@ -169,8 +181,34 @@ public class ScheduledOperationsDataSource extends RPCDataSource<ResourceOperati throwable); }
- public void onSuccess(PageList<ResourceOperationScheduleComposite> result) { - dataRetrieved(result, response, request); + public void onSuccess(final PageList<ResourceOperationScheduleComposite> resources) { + GWTServiceLookup.getOperationService().findCurrentlyScheduledGroupOperations(pageSizeConst, + new AsyncCallback<PageList<GroupOperationScheduleComposite>>() { + + public void onFailure(Throwable throwable) { + CoreGUI.getErrorHandler().handleError( + MSG.dataSource_scheduledOperations_error_fetchFailure(), throwable); + } + + public void onSuccess(PageList<GroupOperationScheduleComposite> groups) { + List<OperationScheduleComposite> result = new ArrayList<OperationScheduleComposite>(); + if (resources != null) { + result.addAll(resources); + result.addAll(groups); + } + Collections.sort(result, new Comparator<OperationScheduleComposite>() { + public int compare(OperationScheduleComposite thisOp, + OperationScheduleComposite thatOp) { + return thisOp.getOperationNextFireTime() - thatOp.getOperationNextFireTime() < 0 ? -1 + : 1; + } + }); + PageControl pc = new PageControl(0, pageSizeConst); + PageList<OperationScheduleComposite> pageList = new PageList<OperationScheduleComposite>( + result, pc); + dataRetrieved(pageList, response, request); + } + }); } }); } @@ -181,13 +219,16 @@ public class ScheduledOperationsDataSource extends RPCDataSource<ResourceOperati return null; }
- protected void dataRetrieved(final PageList<ResourceOperationScheduleComposite> result, final DSResponse response, + protected void dataRetrieved(final PageList<OperationScheduleComposite> result, final DSResponse response, final DSRequest request) { HashSet<Integer> typesSet = new HashSet<Integer>(); HashSet<String> ancestries = new HashSet<String>(); - for (ResourceOperationScheduleComposite composite : result) { - typesSet.add(composite.getResourceTypeId()); - ancestries.add(composite.getAncestry()); + for (OperationScheduleComposite composite : result) { + if (composite instanceof ResourceOperationScheduleComposite) { + ResourceOperationScheduleComposite resourceComposite = (ResourceOperationScheduleComposite) composite; + typesSet.add(resourceComposite.getResourceTypeId()); + ancestries.add(resourceComposite.getAncestry()); + } }
// In addition to the types of the result resources, get the types of their ancestry @@ -230,19 +271,27 @@ public class ScheduledOperationsDataSource extends RPCDataSource<ResourceOperati }
@Override - public ListGridRecord copyValues(ResourceOperationScheduleComposite from) { + public ListGridRecord copyValues(OperationScheduleComposite from) { ListGridRecord record = new ListGridRecord(); + if (from instanceof ResourceOperationScheduleComposite) { + ResourceOperationScheduleComposite resource = (ResourceOperationScheduleComposite) from; + record.setAttribute(Field.RESOURCE_OR_GROUP.propertyName, resource.getResourceName()); + + // for ancestry handling + record.setAttribute(AncestryUtil.RESOURCE_ID, resource.getResourceId()); + record.setAttribute(AncestryUtil.RESOURCE_NAME, resource.getResourceName()); + record.setAttribute(AncestryUtil.RESOURCE_ANCESTRY, resource.getAncestry()); + record.setAttribute(AncestryUtil.RESOURCE_TYPE_ID, resource.getResourceTypeId()); + } else { // group + GroupOperationScheduleComposite resource = (GroupOperationScheduleComposite) from; + record.setAttribute(Field.RESOURCE_OR_GROUP.propertyName, resource.getGroupName()); + record.setAttribute(Field.GROUP_ID.propertyName, resource.getGroupId()); + record.setAttribute(Field.GROUP_TYPE.propertyName, resource.getGroupResourceTypeName()); + } record.setAttribute("id", from.getId()); record.setAttribute(Field.OPERATION.propertyName, from.getOperationName()); - record.setAttribute(Field.RESOURCE.propertyName, from.getResourceName()); record.setAttribute(Field.TIME.propertyName, new Date(from.getOperationNextFireTime()));
- // for ancestry handling - record.setAttribute(AncestryUtil.RESOURCE_ID, from.getResourceId()); - record.setAttribute(AncestryUtil.RESOURCE_NAME, from.getResourceName()); - record.setAttribute(AncestryUtil.RESOURCE_ANCESTRY, from.getAncestry()); - record.setAttribute(AncestryUtil.RESOURCE_TYPE_ID, from.getResourceTypeId()); - record.setAttribute("entity", from); return record; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java index 4e556d0..3ce6064 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/OperationGWTServiceImpl.java @@ -33,6 +33,7 @@ import org.rhq.core.domain.operation.GroupOperationHistory; import org.rhq.core.domain.operation.ResourceOperationHistory; import org.rhq.core.domain.operation.bean.GroupOperationSchedule; import org.rhq.core.domain.operation.bean.ResourceOperationSchedule; +import org.rhq.core.domain.operation.composite.GroupOperationScheduleComposite; import org.rhq.core.domain.operation.composite.ResourceOperationLastCompletedComposite; import org.rhq.core.domain.operation.composite.ResourceOperationScheduleComposite; import org.rhq.core.domain.resource.Resource; @@ -197,17 +198,28 @@ public class OperationGWTServiceImpl extends AbstractGWTServiceImpl implements O } }
- /** Find scheduled operations, disambiguate them and return that list. - * - */ - public PageList<ResourceOperationScheduleComposite> findScheduledOperations(int pageSize) throws RuntimeException { + public PageList<ResourceOperationScheduleComposite> findCurrentlyScheduledResourceOperations(int pageSize) + throws RuntimeException { try { PageControl pageControl = new PageControl(0, pageSize); pageControl.initDefaultOrderingField("ro.nextFireTime", PageOrdering.ASC); PageList<ResourceOperationScheduleComposite> scheduledResourceOps = operationManager .findCurrentlyScheduledResourceOperations(getSessionSubject(), pageControl); + return SerialUtility.prepare(scheduledResourceOps, + "OperationService.findCurrentlyScheduledResourceOperations"); + } catch (Throwable t) { + throw getExceptionToThrowToClient(t); + } + }
- return SerialUtility.prepare(scheduledResourceOps, "OperationService.findScheduledOperations"); + public PageList<GroupOperationScheduleComposite> findCurrentlyScheduledGroupOperations(int pageSize) + throws RuntimeException { + try { + PageControl pageControl = new PageControl(0, pageSize); + pageControl.initDefaultOrderingField("go.nextFireTime", PageOrdering.ASC); + PageList<GroupOperationScheduleComposite> scheduledGroupOps = operationManager + .findCurrentlyScheduledGroupOperations(getSessionSubject(), pageControl); + return SerialUtility.prepare(scheduledGroupOps, "OperationService.findCurrentlyScheduledGroupOperations"); } catch (Throwable t) { throw getExceptionToThrowToClient(t); }
commit 07ab94832e27343b1d68dc6723625e415ee3fa71 Author: Thomas Segismont tsegismo@redhat.com Date: Thu Jan 10 17:18:09 2013 +0100
Fix concurrent access to static counter in AgentUpdateServlet
If many requests were processed at the same time, it was possible to go over the limit of allowed parallel downloads
diff --git a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/agentupdate/AgentUpdateServlet.java b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/agentupdate/AgentUpdateServlet.java index 8069096..994a924 100644 --- a/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/agentupdate/AgentUpdateServlet.java +++ b/modules/enterprise/gui/portal-war/src/main/java/org/rhq/enterprise/gui/agentupdate/AgentUpdateServlet.java @@ -21,6 +21,7 @@ package org.rhq.enterprise.gui.agentupdate; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -58,7 +59,7 @@ public class AgentUpdateServlet extends HttpServlet { // the error code that will be returned if the server has too many agents downloading the agent update binary private static final int ERROR_CODE_TOO_MANY_DOWNLOADS = HttpServletResponse.SC_SERVICE_UNAVAILABLE;
- private static int numActiveDownloads = 0; + private AtomicInteger numActiveDownloads = null;
private Log log = LogFactory.getLog(this.getClass());
@@ -69,6 +70,7 @@ public class AgentUpdateServlet extends HttpServlet { @Override public void init() throws ServletException { log.info("Starting the RHQ agent update servlet"); + numActiveDownloads = new AtomicInteger(0); }
private synchronized void loadAgentUpdateBinaryInfo() throws ServletException { @@ -115,10 +117,10 @@ public class AgentUpdateServlet extends HttpServlet { getVersion(req, resp); } else if (servletPath.endsWith("download")) { try { - numActiveDownloads++; + numActiveDownloads.incrementAndGet(); getDownload(req, resp); } finally { - numActiveDownloads--; + numActiveDownloads.decrementAndGet(); } } else { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid servlet path [" + servletPath @@ -139,7 +141,7 @@ public class AgentUpdateServlet extends HttpServlet { if (limit <= 0) { sendErrorAgentUpdateDisabled(resp); return; - } else if (limit < numActiveDownloads) { + } else if (limit < numActiveDownloads.get()) { sendErrorTooManyDownloads(resp); return; }
commit 89797170a00de118ac60be23586ae52cf5089bc0 Author: Heiko W. Rupp hwr@redhat.com Date: Thu Jan 10 10:15:08 2013 +0100
First cut at testing the Alert-part of the REST-api and of supporting the creation of definitions.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java index 9835b58..8dce958 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/AlertHandlerBean.java @@ -20,15 +20,22 @@ package org.rhq.enterprise.server.rest;
import java.net.URI; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set;
import javax.ejb.EJB; import javax.ejb.Stateless; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; import javax.interceptor.Interceptors; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; @@ -53,10 +60,17 @@ import org.jboss.resteasy.annotations.cache.Cache;
import org.rhq.core.domain.alert.Alert; import org.rhq.core.domain.alert.AlertCondition; +import org.rhq.core.domain.alert.AlertConditionCategory; import org.rhq.core.domain.alert.AlertConditionLog; +import org.rhq.core.domain.alert.AlertConditionOperator; +import org.rhq.core.domain.alert.AlertDampening; import org.rhq.core.domain.alert.AlertDefinition; import org.rhq.core.domain.alert.AlertPriority; +import org.rhq.core.domain.alert.BooleanExpression; +import org.rhq.core.domain.alert.notification.AlertNotification; import org.rhq.core.domain.alert.notification.AlertNotificationLog; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.criteria.AlertCriteria; import org.rhq.core.domain.criteria.AlertDefinitionCriteria; import org.rhq.core.domain.criteria.Criteria; @@ -64,8 +78,12 @@ import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.util.PageControl; import org.rhq.core.domain.util.PageList; import org.rhq.core.domain.util.PageOrdering; +import org.rhq.enterprise.server.RHQConstants; import org.rhq.enterprise.server.alert.AlertDefinitionManagerLocal; import org.rhq.enterprise.server.alert.AlertManagerLocal; +import org.rhq.enterprise.server.alert.AlertNotificationManagerLocal; +import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderInfo; +import org.rhq.enterprise.server.plugin.pc.alert.AlertSenderPluginManager; import org.rhq.enterprise.server.rest.domain.*;
/** @@ -74,7 +92,8 @@ import org.rhq.enterprise.server.rest.domain.*; */ @Produces({"application/json","application/xml","text/plain"}) @Path("/alert") -@Api(value = "Deal with Alerts",description = "This api deals with alerts that have fired. It does not offer to create/update AlertDefinitions (yet)") +@Api(value = "Deal with Alerts",description = "This api deals with alerts that have fired. It does not offer to create/update AlertDefinitions (yet). Everything " + + "related to creating / updating Alert Definitions is purely experimental at the moment and can change without notice at any time.") @Stateless @Interceptors(SetCallerInterceptor.class) public class AlertHandlerBean extends AbstractRestBean { @@ -87,6 +106,13 @@ public class AlertHandlerBean extends AbstractRestBean { @EJB AlertDefinitionManagerLocal alertDefinitionManager;
+ @EJB + AlertNotificationManagerLocal notificationMgr; + + @PersistenceContext(unitName = RHQConstants.PERSISTENCE_UNIT_NAME) + private EntityManager entityManager; + +
@GZIP @GET @@ -274,7 +300,7 @@ public class AlertHandlerBean extends AbstractRestBean { @ApiOperation(value = "Mark the alert as acknowledged (by the caller)", notes = "Returns a slim version of the alert") public AlertRest ackAlert(@ApiParam(value = "Id of the alert to acknowledge") @PathParam("id") int id, @Context UriInfo uriInfo) { findAlertWithId(id); // Ensure the alert exists - int count = alertManager.acknowledgeAlerts(caller,new int[]{id}); + int count = alertManager.acknowledgeAlerts(caller, new int[]{id});
// TODO this is not reliable due to Tx constraints ( the above may only run after this ackAlert() method has finished )
@@ -298,13 +324,22 @@ public class AlertHandlerBean extends AbstractRestBean { public AlertDefinitionRest getDefinitionForAlert(@ApiParam("Id of the alert to show the definition") @PathParam("id") int alertId) { Alert al = findAlertWithId(alertId); AlertDefinition def = al.getAlertDefinition(); - AlertDefinitionRest ret = definitionToDomain(def); + AlertDefinitionRest ret = definitionToDomain(def, false); // TODO allow 'full' parameter? return ret; }
- @GZIP @GET @Path("/definition") + public Response redirectDefinitionToDefinitions(@Context UriInfo uriInfo) { + UriBuilder uriBuilder = uriInfo.getRequestUriBuilder(); + uriBuilder.replacePath("/rest/alert/definitions"); // TODO there needs to be a better way + Response.ResponseBuilder builder = Response.seeOther(uriBuilder.build()); + return builder.build(); + } + + @GZIP + @GET + @Path("/definitions") @ApiOperation("List all Alert Definition") public List<AlertDefinitionRest> listAlertDefinitions( @ApiParam(value = "Page number", defaultValue = "0") @QueryParam("page") int page, @@ -315,7 +350,7 @@ public class AlertHandlerBean extends AbstractRestBean { List<AlertDefinition> defs = alertDefinitionManager.findAlertDefinitionsByCriteria(caller, criteria); List<AlertDefinitionRest> ret = new ArrayList<AlertDefinitionRest>(defs.size()); for (AlertDefinition def : defs) { - AlertDefinitionRest adr = definitionToDomain(def); + AlertDefinitionRest adr = definitionToDomain(def, false); ret.add(adr); } return ret; @@ -325,16 +360,17 @@ public class AlertHandlerBean extends AbstractRestBean { @Path("/definition/{id}") @ApiOperation(value = "Get one AlertDefinition by id", responseClass = "AlertDefinitionRest") public Response getAlertDefinition(@ApiParam("Id of the alert definition to retrieve") @PathParam("id") int definitionId, + @ApiParam("Should conditions be returned too?") @QueryParam("full") @DefaultValue("false") boolean full, @Context Request request) {
- AlertDefinition def = alertDefinitionManager.getAlertDefinition(caller,definitionId); + AlertDefinition def = alertDefinitionManager.getAlertDefinition(caller, definitionId); if (def==null) throw new StuffNotFoundException("AlertDefinition with id " + definitionId );
EntityTag eTag = new EntityTag(Integer.toHexString(def.hashCode())); Response.ResponseBuilder builder = request.evaluatePreconditions(eTag); if (builder==null) { - AlertDefinitionRest adr = definitionToDomain(def); + AlertDefinitionRest adr = definitionToDomain(def, full); builder = Response.ok(adr); } builder.tag(eTag); @@ -342,6 +378,67 @@ public class AlertHandlerBean extends AbstractRestBean { return builder.build(); }
+ @POST + @Path("/definitions") + @ApiOperation("Create an AlertDefinition for the resource passed as query param") + public Response createAlertDefinitionForResource(@QueryParam("resourceId") int resourceId, AlertDefinitionRest adr, + @Context UriInfo uriInfo) { + + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName(adr.getName()); + alertDefinition.setEnabled(adr.isEnabled()); + alertDefinition.setPriority(AlertPriority.valueOf(adr.getPriority().toUpperCase())); + alertDefinition.setConditionExpression(BooleanExpression.valueOf(adr.getConditionMode().toUpperCase())); + alertDefinition.setRecoveryId(adr.getRecoveryId()); + + Set<AlertCondition> conditions = new HashSet<AlertCondition>(adr.getConditions().size()); + for (AlertConditionRest acr : adr.getConditions()) { + AlertCondition condition = conditionRestToCondition(acr); + conditions.add(condition); + } + alertDefinition.setConditions(conditions); + + List<AlertNotification> notifications = new ArrayList<AlertNotification>(adr.getNotifications().size()); + for (AlertNotificationRest anr : adr.getNotifications()) { + AlertNotification notification = new AlertNotification(anr.getSenderName()); + // TODO validate sender + notification.setAlertDefinition(alertDefinition); + Configuration configuration = new Configuration(); + for (Map.Entry<String,Object> entry: anr.getConfig().entrySet()) { + configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); + } + notification.setConfiguration(configuration); + // TODO extra configuration (?) + + notifications.add(notification); + } + + alertDefinition.setAlertNotifications(notifications); + + + // TODO for all things below + alertDefinition.setAlertDampening(new AlertDampening(AlertDampening.Category.NONE)); + + + + + int definitionId = alertDefinitionManager.createAlertDefinition(caller,alertDefinition,resourceId,false); + + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + AlertDefinitionRest uadr = definitionToDomain(updatedDefinition,true) ; // TODO param 'full' + + uadr.setId(definitionId); + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/definition/{id}"); + URI uri = uriBuilder.build(definitionId); + + + Response.ResponseBuilder builder = Response.created(uri); + builder.entity(uadr); + return builder.build(); + } + @PUT @Path("/definition/{id}") @ApiOperation(value = "Update the alert definition (priority, enablement)", notes = "Priority must be HIGH,LOW,MEDIUM") @@ -355,10 +452,10 @@ public class AlertHandlerBean extends AbstractRestBean { def.setEnabled(definitionRest.isEnabled()); def.setPriority(AlertPriority.valueOf(definitionRest.getPriority()));
- def = alertDefinitionManager.updateAlertDefinition(caller,def.getId(),def,false); + def = alertDefinitionManager.updateAlertDefinition(caller,def.getId(),def,false); // TODO set to true once we allow to change any/all
EntityTag eTag = new EntityTag(Integer.toHexString(def.hashCode())); - AlertDefinitionRest adr = definitionToDomain(def); + AlertDefinitionRest adr = definitionToDomain(def, false);
Response.ResponseBuilder builder = Response.ok(adr); builder.tag(eTag); @@ -367,15 +464,208 @@ public class AlertHandlerBean extends AbstractRestBean {
}
- private AlertDefinitionRest definitionToDomain(AlertDefinition def) { + @DELETE + @Path("definition/{id}") + @ApiOperation("Delete an alert definition") + public Response deleteDefinition(@PathParam("id") int definitionId) { + + int count = alertDefinitionManager.removeAlertDefinitions(caller, new int[]{definitionId}); + + return Response.noContent().build(); + } + + + @POST + @Path("definition/{id}/conditions") + public Response addConditionToDefinition(@PathParam("id") int definitionId, AlertConditionRest conditionRest, @Context UriInfo uriInfo) { + + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + if (definition==null) + throw new StuffNotFoundException("AlertDefinition with id " + definitionId); + + AlertCondition condition = conditionRestToCondition(conditionRest); + + definition.addCondition(condition); + + alertDefinitionManager.updateAlertDefinition(caller,definitionId,definition,false); + + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + Set<AlertCondition> conditions = updatedDefinition.getConditions(); + int conditionId=-1; + for (AlertCondition cond :conditions) { + if (cond.getName().equals(condition.getName())) + conditionId = cond.getId(); + } + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/definition/{id}/condition/{cid}"); + URI uri = uriBuilder.build(definitionId,conditionId); + + Response.ResponseBuilder builder = Response.created(uri); + + return builder.build(); + + } + + private AlertCondition conditionRestToCondition(AlertConditionRest conditionRest) { + AlertCondition condition = new AlertCondition(); + condition.setName(conditionRest.getName().name()); + condition.setCategory(AlertConditionCategory.valueOf(conditionRest.getCategory().getName())); + return condition; + } + + @POST + @Path("definition/{id}/notifications") + public Response addNotificationToDefinition(@PathParam("id") int definitionId, AlertNotificationRest notificationRest, @Context UriInfo uriInfo) { + + AlertNotification notification = new AlertNotification(notificationRest.getSenderName()); + + // first check if the sender by name exists + AlertSenderPluginManager pluginManager = alertManager.getAlertPluginManager(); + if (pluginManager.getAlertSenderForNotification(notification)==null) { + throw new StuffNotFoundException("AlertSender with name [" + notificationRest.getSenderName() +"]"); + } + + // Now check if the definition exists as well + AlertDefinition definition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + if (definition==null) + throw new StuffNotFoundException("AlertDefinition with id " + definitionId); + + // definition and sender are valid, continue + int existingNotificationCount = definition.getAlertNotifications().size(); + +// notification.setAlertDefinition(definition); setting this will result in duplicated notifications + definition.addAlertNotification(notification); + + Configuration configuration = new Configuration(); + for (Map.Entry<String,Object> entry: notificationRest.getConfig().entrySet()) { + configuration.put(new PropertySimple(entry.getKey(),entry.getValue())); + } + notification.setConfiguration(configuration); + // TODO extra configuration (?) + + + alertDefinitionManager.updateAlertDefinition(caller, definitionId, definition, false); + + + AlertDefinition updatedDefinition = alertDefinitionManager.getAlertDefinition(caller,definitionId); + + List<AlertNotification> notifs = updatedDefinition.getAlertNotifications(); + + assert notifs.size() == existingNotificationCount +1; + + AlertNotification updatedNotification = notifs.get(existingNotificationCount); + AlertNotificationRest updatedNotificationRest = notificationToNotificationRest(updatedNotification); + + int notificationId = updatedNotification.getId(); + + UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); + uriBuilder.path("/alert/definition/{id}/notification/{nid}"); + URI uri = uriBuilder.build(definitionId, notificationId ); + + Response.ResponseBuilder builder = Response.created(uri); + builder.entity(updatedNotificationRest); + + return builder.build(); + + } + + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) + @ApiOperation("Return a list of alert notification senders") + @GET @GZIP + @Path("senders") + public Response getAlertSenders(@Context UriInfo uriInfo) { + + List<String> senderNames = notificationMgr.listAllAlertSenders(); + List<AlertSender> senderList = new ArrayList<AlertSender>(senderNames.size()); + for (String senderName : senderNames) { + AlertSenderInfo info = notificationMgr.getAlertInfoForSender(senderName); + AlertSender sender = new AlertSender(senderName); + sender.setDescription(info.getDescription()); + senderList.add(sender); + } + + Response.ResponseBuilder builder = Response.ok(senderList); // TODO XML + + return builder.build(); + + } + + @Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML}) + @ApiOperation("Return an alert notification senders by name") + @GET @GZIP + @Path("sender/{name}") + public Response getAlertSenderByName(@PathParam("name")String senderName, @Context UriInfo uriInfo) { + + AlertSenderInfo info = notificationMgr.getAlertInfoForSender(senderName); + if (info==null) { + throw new StuffNotFoundException("Alert sender with name [" + senderName + "]"); + } + AlertSender sender = new AlertSender(senderName); + sender.setDescription(info.getDescription()); + + Response.ResponseBuilder builder = Response.ok(sender); // TODO XML + + return builder.build(); + + } + + + private AlertDefinitionRest definitionToDomain(AlertDefinition def, boolean full) { AlertDefinitionRest adr = new AlertDefinitionRest(def.getId()); adr.setName(def.getName()); adr.setEnabled(def.getEnabled()); adr.setPriority(def.getPriority().getName()); + adr.setConditionMode(def.getConditionExpression().toString()); + + Set<AlertCondition> conditions = def.getConditions(); + if (full && conditions.size()>0) { + List<AlertConditionRest> conditionRestList = new ArrayList<AlertConditionRest>(conditions.size()); + for (AlertCondition condition : conditions) { + AlertConditionRest acr = conditionToConditionRest(condition); + conditionRestList.add(acr); + } + adr.setConditions(conditionRestList); + } + List<AlertNotification> notifications = def.getAlertNotifications(); + if (full && notifications.size()>0) { + List<AlertNotificationRest> notificationRestList = new ArrayList<AlertNotificationRest>(notifications.size()); + for (AlertNotification notification : notifications) { + AlertNotificationRest anr = notificationToNotificationRest(notification); + notificationRestList.add(anr); + } + adr.setNotifications(notificationRestList); + }
return adr; }
+ private AlertNotificationRest notificationToNotificationRest(AlertNotification notification) { + AlertNotificationRest anr = new AlertNotificationRest(); + anr.setId(notification.getId()); + anr.setSenderName(notification.getSenderName()); + + for (Map.Entry<String, PropertySimple> entry : notification.getConfiguration().getSimpleProperties().entrySet()) { + anr.getConfig().put(entry.getKey(),entry.getValue().getStringValue()); // TODO correct type conversion of 2nd argument + } + // TODO Extra Configuration + + return anr; + } + + private AlertConditionRest conditionToConditionRest(AlertCondition condition) { + AlertConditionRest acr = new AlertConditionRest(); + acr.setId(condition.getId()); + acr.setName(AlertConditionOperator.valueOf(condition.getName())); + acr.setCategory(condition.getCategory()); + acr.setOption(condition.getOption()); + // TODO measurement definition + acr.setThreshold(condition.getThreshold()); + acr.setTriggerId(condition.getTriggerId()); // TODO what's that? + + return acr; + } + /** * Retrieve the alert with id id. * @param id Primary key of the alert @@ -401,7 +691,7 @@ public class AlertHandlerBean extends AbstractRestBean { if (slim) { alertDefinitionRest = new AlertDefinitionRest(alertDefinition.getId()); } else { - alertDefinitionRest = definitionToDomain(alertDefinition); + alertDefinitionRest = definitionToDomain(alertDefinition, false); } ret.setAlertDefinition(alertDefinitionRest); ret.setDefinitionEnabled(alertDefinition.getEnabled()); diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java new file mode 100644 index 0000000..5db2b9d --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertConditionRest.java @@ -0,0 +1,93 @@ +/* + * RHQ Management Platform + * Copyright (C) 2012-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.enterprise.server.rest.domain; + +import javax.xml.bind.annotation.XmlRootElement; + +import org.rhq.core.domain.alert.AlertConditionCategory; +import org.rhq.core.domain.alert.AlertConditionOperator; + +/** + * One condition for an alert definition. + * An alert definition can have any number of definitions + * @author Heiko W. Rupp + */ +@XmlRootElement +public class AlertConditionRest { + + private AlertConditionOperator name; + private AlertConditionCategory category; + private int id; + private Double threshold; + private String option; + private Integer triggerId; + + public AlertConditionRest() { + } + + public AlertConditionOperator getName() { + return name; + } + + public void setName(AlertConditionOperator name) { + this.name = name; + } + + public AlertConditionCategory getCategory() { + return category; + } + + public void setCategory(AlertConditionCategory category) { + this.category = category; + } + + public void setId(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public Double getThreshold() { + return threshold; + } + + public void setThreshold(Double threshold) { + this.threshold = threshold; + } + + public String getOption() { + return option; + } + + public void setOption(String option) { + this.option = option; + } + + public Integer getTriggerId() { + return triggerId; + } + + public void setTriggerId(Integer triggerId) { + this.triggerId = triggerId; + } + +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java index c7cf98b..f333516 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertDefinitionRest.java @@ -1,6 +1,6 @@ /* * RHQ Management Platform - * Copyright (C) 2005-2011 Red Hat, Inc. + * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify @@ -13,11 +13,14 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.enterprise.server.rest.domain;
+import java.util.ArrayList; +import java.util.List; + import javax.xml.bind.annotation.XmlRootElement;
import com.wordnik.swagger.annotations.ApiClass; @@ -34,7 +37,11 @@ public class AlertDefinitionRest { int id; String name; boolean enabled; - String priority; + String priority = "LOW"; + int recoveryId; + String conditionMode = "ANY"; // ANY, ALL + List<AlertConditionRest> conditions = new ArrayList<AlertConditionRest>(); + List<AlertNotificationRest> notifications = new ArrayList<AlertNotificationRest>();
public AlertDefinitionRest() { @@ -80,4 +87,40 @@ public class AlertDefinitionRest { public void setPriority(String priority) { this.priority = priority; } + + public int getRecoveryId() { + return recoveryId; + } + + public void setRecoveryId(int recoveryId) { + this.recoveryId = recoveryId; + } + + @ApiProperty(value = "Expression to use for condition logic", + allowableValues = "ALL, ANY") + public String getConditionMode() { + return conditionMode; + } + + public void setConditionMode(String conditionMode) { + this.conditionMode = conditionMode; + } + + @ApiProperty(value = "List of Conditions. Only sent if explicitly requested.") + public List<AlertConditionRest> getConditions() { + return conditions; + } + + public void setConditions(List<AlertConditionRest> conditions) { + this.conditions = conditions; + } + + @ApiProperty(value = "List of notifications. Only sent if explicitly requested.") + public List<AlertNotificationRest> getNotifications() { + return notifications; + } + + public void setNotifications(List<AlertNotificationRest> notifications) { + this.notifications = notifications; + } } diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java new file mode 100644 index 0000000..0fd5599 --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertNotificationRest.java @@ -0,0 +1,69 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.enterprise.server.rest.domain; + +import java.util.HashMap; +import java.util.Map; + +import javax.xml.bind.annotation.XmlRootElement; + +import com.wordnik.swagger.annotations.ApiClass; +import com.wordnik.swagger.annotations.ApiProperty; + +/** + * Representation of notifications + * @author Heiko W. Rupp + */ +@ApiClass("Represents an alert notification") +@XmlRootElement +public class AlertNotificationRest { + + private int id; + private String senderName; + private Map<String,Object> config = new HashMap<String, Object>(); + + public AlertNotificationRest() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @ApiProperty("A name taken from the <short-name> field of the plugin descriptor") + public String getSenderName() { + return senderName; + } + + public void setSenderName(String senderName) { + this.senderName = senderName; + } + + public Map<String, Object> getConfig() { + return config; + } + + public void setConfig(Map<String, Object> config) { + this.config = config; + } +} diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java new file mode 100644 index 0000000..3d4e39c --- /dev/null +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/domain/AlertSender.java @@ -0,0 +1,53 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.enterprise.server.rest.domain; + +/** + * An Alert notification sender + * @author Heiko W. Rupp + */ +public class AlertSender { + + String senderName; + String description; + + public AlertSender() { + } + + public AlertSender(String senderName) { + this.senderName = senderName; + } + + public String getSenderName() { + return senderName; + } + + public void setSenderName(String senderName) { + this.senderName = senderName; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java new file mode 100644 index 0000000..1f3a966 --- /dev/null +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/AlertTest.java @@ -0,0 +1,460 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2012 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.modules.integrationTests.restApi; + +import com.jayway.restassured.http.ContentType; + +import org.junit.Test; + +import org.rhq.modules.integrationTests.restApi.d.AlertCondition; +import org.rhq.modules.integrationTests.restApi.d.AlertDefinition; +import org.rhq.modules.integrationTests.restApi.d.AlertNotification; + +import static com.jayway.restassured.RestAssured.expect; +import static com.jayway.restassured.RestAssured.given; + +/** + * Testing of the Alerting part of the rest-api + * @author Heiko W. Rupp + */ +public class AlertTest extends AbstractBase { + + @Test + public void testListAllAlerts() throws Exception { + + expect() + .statusCode(200) + .when() + .get("/alert"); + + } + + @Test + public void testGetAlertCount() throws Exception { + + expect() + .statusCode(200) + .when() + .get("/alert/count"); + + } + + @Test + public void testListAllAlertDefinitions() throws Exception { + + expect() + .statusCode(200) + .when() + .get("/alert/definitions"); + } + + @Test + public void testRedirectForDefinition() throws Exception { + given() + .header(acceptJson) + .expect() + .statusCode(200) + .when() + .get("/alert/definition"); + + // TODO check that some definitions exist after we know how to create them + } + + @Test + public void testGetAlertSenders() throws Exception { + given() + .header(acceptJson) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/senders"); + } + + @Test + public void testGetSenderByName() throws Exception { + given() + .header(acceptJson) + .pathParam("name", "Direct Emails") + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/sender/{name}"); + } + + @Test + public void testGetUnknownSenderByName() throws Exception { + given() + .header(acceptJson) + .pathParam("name","Frobnitz") + .expect() + .statusCode(404) + .log().everything() + .when() + .get("/alert/sender/{name}"); + } + + @Test + public void testCreateDeleteBasicAlertDefinition() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + cleanupDefinition(definitionId); + } + + @Test + public void testCreateDeleteAlertDefinitionWith1Condition() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + // Now add a condition + try { + + AlertCondition alertCondition = new AlertCondition("AVAIL_GOES_UP","AVAILABILITY"); + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertCondition) + .pathParam("defId",definitionId) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definition/{defId}/conditions"); + + // Retrieve the definition with the added condition + AlertDefinition updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + int size = updatedDefinition.getConditions().size(); + assert size ==1 : "Did not find 1 condition, but " + size; + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + + @Test + public void testCreateDeleteAlertDefinitionWith2Conditions() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + + try { + // Now add a 1st condition + AlertCondition alertCondition = new AlertCondition("AVAIL_GOES_UP","AVAILABILITY"); + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertCondition) + .pathParam("defId",definitionId) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definition/{defId}/conditions"); + + // Retrieve the definition with the added condition + AlertDefinition updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + int size = updatedDefinition.getConditions().size(); + assert size ==1 : "Did not find 1 condition, but " + size; + + // Now add a 2nd condition + AlertCondition secondCondition = new AlertCondition("AVAIL_GOES_DOWN","AVAILABILITY"); + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(secondCondition) + .pathParam("defId",definitionId) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definition/{defId}/conditions"); + + // Retrieve the definition with the added condition + updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + size = updatedDefinition.getConditions().size(); + assert size ==2 : "Did not find 2 condition, but " + size; + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + @Test + public void testCreateDeleteAlertDefinitionWith1Notification() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + // Now add a condition + try { + + AlertNotification notification = new AlertNotification("Direct Emails"); // short-name from server plugin descriptor + notification.getConfig().put("emailAddress", "root@eruditorium.org"); + + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(notification) + .pathParam("defId",definitionId) + .log().everything() + .expect() + .statusCode(201) + .log().everything() + .when() + .post("/alert/definition/{defId}/notifications"); + + // Retrieve the definition with the added condition + AlertDefinition updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + int size = updatedDefinition.getNotifications().size(); + assert size ==1 : "Did not find 1 notification, but " + size; + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + @Test + public void testCreateDeleteAlertDefinitionWithUnknwonSender() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + // Now add a condition + try { + + AlertNotification notification = new AlertNotification("Frobnitz"); // short-name from server plugin descriptor + + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(notification) + .pathParam("defId",definitionId) + .expect() + .statusCode(404) + .log().everything() + .when() + .post("/alert/definition/{defId}/notifications"); + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + @Test + public void testCreateDeleteAlertDefinitionWith2Notifications() throws Exception { + + int definitionId = createEmptyAlertDefinition(); + + // Now add a condition + try { + + AlertNotification notification = new AlertNotification("Direct Emails"); // short-name from server plugin descriptor + notification.getConfig().put("emailAddress","root@eruditorium.org"); + + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(notification) + .pathParam("defId",definitionId) + .expect() + .statusCode(201) + .log().everything() + .when() + .post("/alert/definition/{defId}/notifications"); + + // Retrieve the definition with the added condition + AlertDefinition updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + int size = updatedDefinition.getNotifications().size(); + assert size ==1 : "Did not find 1 notifications, but " + size; + + AlertNotification secondNotification = new AlertNotification("System Roles"); + secondNotification.getConfig().put("roleId","|1]"); + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(secondNotification) + .pathParam("defId",definitionId) + .expect() + .statusCode(201) + .log().everything() + .when() + .post("/alert/definition/{defId}/notifications"); + + // Retrieve the definition with the added condition + updatedDefinition = + given() + .pathParam("id",definitionId) + .queryParam("full",true) + .expect() + .statusCode(200) + .log().everything() + .when() + .get("/alert/definition/{id}") + .as(AlertDefinition.class); + + size = updatedDefinition.getNotifications().size(); + assert size ==2 : "Did not find 2 notifications, but " + size; + + } + + finally { + // delete the definition again + cleanupDefinition(definitionId); + } + } + + @Test + public void testNewFullDefinition() throws Exception { + + int definitionId = 0; + try { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-full-definition"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("HIGH"); + + AlertNotification notification = new AlertNotification("Direct Emails"); + notification.getConfig().put("emailAddress","enoch@root.org"); + alertDefinition.getNotifications().add(notification); + + AlertCondition condition = new AlertCondition("AVAIL_GOES_DOWN","AVAILABILITY"); + alertDefinition.getConditions().add(condition); + + AlertDefinition result = + given() + .contentType(ContentType.JSON) + .header(acceptJson) + .body(alertDefinition) + .log().everything() + .queryParam("resourceId", 10001) + .expect() + .statusCode(201) + .log().everything() + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + assert result != null; + definitionId = result.getId(); + + assert result.getConditions().size()==1; + assert result.getNotifications().size()==1; + } finally { +// cleanupDefinition(definitionId); + } + + } + + private void cleanupDefinition(int definitionId) { + + if (definitionId==0) + return; + + given() + .pathParam("id", definitionId) + .expect() + .statusCode(204) + .when() + .delete("/alert/definition/{id}"); + } + + private int createEmptyAlertDefinition() { + AlertDefinition alertDefinition = new AlertDefinition(); + alertDefinition.setName("-x-test-definition"); + alertDefinition.setEnabled(false); + alertDefinition.setPriority("LOW"); + + AlertDefinition result = + given() + .header(acceptJson) + .contentType(ContentType.JSON) + .body(alertDefinition) + .queryParam("resourceId",10001) + .expect() + .statusCode(201) + .log().ifError() + .when() + .post("/alert/definitions") + .as(AlertDefinition.class); + + assert result.getConditions()==null || result.getConditions().size()==0; + + return result.getId(); + } +} diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java new file mode 100644 index 0000000..55aaff2 --- /dev/null +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertCondition.java @@ -0,0 +1,76 @@ +package org.rhq.modules.integrationTests.restApi.d; + +/** + * Alert condition for testing the rest interface + * @author Heiko W. Rupp + */ +public class AlertCondition { + + int id; + String name; + String category; + private Double threshold; + private String option; + private Integer triggerId; + + public AlertCondition(String name, String category) { + this.name = name; + this.category = category; + } + + public AlertCondition() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + /** + * The name of the condition. This is one of AlertConditionOperator + * @return the name of the condition + */ + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public Double getThreshold() { + return threshold; + } + + public void setThreshold(Double threshold) { + this.threshold = threshold; + } + + public String getOption() { + return option; + } + + public void setOption(String option) { + this.option = option; + } + + public Integer getTriggerId() { + return triggerId; + } + + public void setTriggerId(Integer triggerId) { + this.triggerId = triggerId; + } + +} diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java new file mode 100644 index 0000000..609299c --- /dev/null +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertDefinition.java @@ -0,0 +1,106 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2012 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.modules.integrationTests.restApi.d; + +import java.util.ArrayList; +import java.util.List; + +/** + * An AlertDefinition for testing purposes + * @author Heiko W. Rupp + */ +public class AlertDefinition { + + int id; + String name; + boolean enabled; + String priority; + int recoveryId; + String conditionMode = "ANY"; + List<AlertCondition> conditions = new ArrayList<AlertCondition>(); + List<AlertNotification> notifications = new ArrayList<AlertNotification>(); + + public AlertDefinition() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public String getPriority() { + return priority; + } + + public void setPriority(String priority) { + this.priority = priority; + } + + public int getRecoveryId() { + return recoveryId; + } + + public void setRecoveryId(int recoveryId) { + this.recoveryId = recoveryId; + } + + public String getConditionMode() { + return conditionMode; + } + + public void setConditionMode(String conditionMode) { + this.conditionMode = conditionMode; + } + + public List<AlertCondition> getConditions() { + return conditions; + } + + public void setConditions(List<AlertCondition> conditions) { + this.conditions = conditions; + } + + public List<AlertNotification> getNotifications() { + return notifications; + } + + public void setNotifications(List<AlertNotification> notifications) { + this.notifications = notifications; + } +} diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertNotification.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertNotification.java new file mode 100644 index 0000000..514b649 --- /dev/null +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/AlertNotification.java @@ -0,0 +1,65 @@ +/* + * RHQ Management Platform + * Copyright (C) 2005-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +package org.rhq.modules.integrationTests.restApi.d; + +import java.util.HashMap; +import java.util.Map; + +/** + * An alert notification for testing purposes + * @author Heiko W. Rupp + */ +public class AlertNotification { + + private int id; + private String senderName; + private Map<String,Object> config = new HashMap<String, Object>(); + + public AlertNotification() { + } + + public AlertNotification(String senderName) { + this.senderName = senderName; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getSenderName() { + return senderName; + } + + public void setSenderName(String senderName) { + this.senderName = senderName; + } + + public Map<String, Object> getConfig() { + return config; + } + + public void setConfig(Map<String, Object> config) { + this.config = config; + } +}
commit 9b9a4c7ffd8f80a02edd99729d2f2256201bd795 Author: Heiko W. Rupp hwr@redhat.com Date: Mon Jan 7 17:43:39 2013 +0100
Platforms must not be set to disabled according to jshaugn, so catch and test this case.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java index 22d8111..2f1565b 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/ResourceHandlerBean.java @@ -366,6 +366,12 @@ public class ResourceHandlerBean extends AbstractRestBean { AvailabilityType at; at = AvailabilityType.valueOf(avail.getType());
+ // According to jshaughn, plaforms must not be set to DISABLED, so catch this case here. + if (resource.getResourceType().getCategory()==ResourceCategory.PLATFORM && at==AvailabilityType.DISABLED) { + throw new BadArgumentException("Availabilty","Platforms must not be set to DISABLED"); + } + + AvailabilityReport report = new AvailabilityReport(true, resource.getAgent().getName()); Availability availability = new Availability(resource, avail.getSince(), at); report.addAvailability(availability); diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java index f6164ba..db49514 100644 --- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java +++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ResourcesTest.java @@ -252,23 +252,62 @@ public class ResourcesTest extends AbstractBase {
@Test public void testUpdateAvailablity() throws Exception { - long now = System.currentTimeMillis()-100; - given().body("{"since":" + now + ","type":"DISABLED","resourceId":10001}") - .header("Content-Type","application/json") - .header("Accept","application/json") - .pathParam("id",10001) - .expect() - .statusCode(HttpStatus.SC_NO_CONTENT) - .log().ifError() - .when().put("/resource/{id}/availability");
Response response = given() .header("Accept", "application/json") .expect().statusCode(200) .when().get("/resource/10001/availability");
- String currentType = response.jsonPath().get("type"); - assert currentType.equals("DISABLED"); // TODO small window where an agent may have sent an update + String oldType = response.jsonPath().get("type"); + + try { + long now = System.currentTimeMillis()-100; + given().body("{"since":" + now + ","type":"DOWN","resourceId":10001}") + .header("Content-Type","application/json") + .header("Accept","application/json") + .pathParam("id",10001) + .expect() + .statusCode(HttpStatus.SC_NO_CONTENT) + .log().ifError() + .when().put("/resource/{id}/availability"); + + response = given() + .header("Accept", "application/json") + .expect().statusCode(200) + .when().get("/resource/10001/availability"); + + String currentType = response.jsonPath().get("type"); + assert currentType.equals("DOWN"); // TODO small window where an agent may have sent an update + } finally { + + // Set back to original value + long now = System.currentTimeMillis()-100; + given().body("{"since":" + now + ","type":""+oldType+"","resourceId":10001}") + .header("Content-Type","application/json") + .header("Accept","application/json") + .pathParam("id",10001) + .expect() + .statusCode(HttpStatus.SC_NO_CONTENT) + .log().ifError() + .when().put("/resource/{id}/availability"); + + } + } + + @Test + public void testNoDisabledForPlatforms() throws Exception { + + // Platforms should not be set to DISABLED according ot JSHAUGHN + + long now = System.currentTimeMillis()-100; + given().body("{"since":" + now + ","type":"DISABLED","resourceId":10001}") + .header("Content-Type","application/json") + .header("Accept","application/json") + .pathParam("id",10001) + .expect() + .statusCode(HttpStatus.SC_NOT_ACCEPTABLE) + .log().ifError() + .when().put("/resource/{id}/availability");
} }
commit 17b34a1142f1b823ba834cb1859dee4ec03f1105 Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Jan 9 17:23:24 2013 -0500
Arquillian 1.0.3 bom and its packaged update to the shrinkwrap resolver did not seem to solve the "settings.xml repositories" problem as hoped. So, restoring the workaround.
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index 1083e24..c8dadf8 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -342,6 +342,12 @@ public abstract class AbstractEJB3Test extends Arquillian { // If we're running oracle we need to include the OJDBC driver because dbunit needs it. Note that we need // add it explicitly even though it is a provided module used by the datasource. if (!Boolean.valueOf(System.getProperty("rhq.skip.oracle"))) { + // in proxy situations (like Jenkins) shrinkwrap won't be able to find repositories defined in + // settings.xml profiles. We know at this point the driver is in the local repo, try going offline + // at this point to force local repo resolution since the oracle driver is not in public repos. + // see http://stackoverflow.com/questions/6291146/arquillian-shrinkwrap-mavendepend... + // Last verified this problem using: Arquillian 1.0.3 bom + resolver.goOffline(); dependencies.addAll(resolver.artifact("com.oracle:ojdbc6:jar:" + System.getProperty("rhq.ojdbc.version")) .resolveAs(JavaArchive.class)); }
commit d40b3281fa4b1755584b48cf1bcc071822b279bb Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Jan 9 14:55:30 2013 -0500
Upgrade Arquillian BOM from 1.0.2.Final ro 1.0.3.Final. This seems to work in my local tests and supposedly fixes an issue requiring a workaround for jenkins [1]. So, take out the workaround in AbstractEJB3Test on the hopes that Jenkins will run.
[1] http://stackoverflow.com/questions/6291146/arquillian-shrinkwrap-mavendepend...
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index ce99677..1083e24 100644 --- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -342,11 +342,6 @@ public abstract class AbstractEJB3Test extends Arquillian { // If we're running oracle we need to include the OJDBC driver because dbunit needs it. Note that we need // add it explicitly even though it is a provided module used by the datasource. if (!Boolean.valueOf(System.getProperty("rhq.skip.oracle"))) { - // in proxy situations (like Jenkins) shrinkwrap won't be able to find repositories defined in - // settings.xml profiles. We know at this point the driver is in the local repo, try going offline - // at this point to force local repo resolution since the oracle driver is not in public repos. - // see http://stackoverflow.com/questions/6291146/arquillian-shrinkwrap-mavendepend... - resolver.goOffline(); dependencies.addAll(resolver.artifact("com.oracle:ojdbc6:jar:" + System.getProperty("rhq.ojdbc.version")) .resolveAs(JavaArchive.class)); } diff --git a/pom.xml b/pom.xml index 0149223..20455a5 100644 --- a/pom.xml +++ b/pom.xml @@ -144,7 +144,7 @@ <ant.contrib.version>1.0b3</ant.contrib.version> <freemarker.version>2.3.18</freemarker.version> <powermock.version>1.4.12</powermock.version> - <arquillian.version>1.0.2.Final</arquillian.version> + <arquillian.version>1.0.3.Final</arquillian.version> <xercesImpl.version>2.9.1-jbossas-2</xercesImpl.version> <!-- see BZ-820629 and CVE-2009-2625 --> <opencsv.version>1.8</opencsv.version>
commit 66bcefdcb00beebab2fe2df8a13ba222e8a31a6a Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Jan 9 14:34:26 2013 -0500
Upping the JSW version for the agent to 3.3.1 to be the same as the recently updated server.
diff --git a/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.dll b/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.dll index 37c4f33..c5af6a0 100644 Binary files a/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.dll and b/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.dll differ diff --git a/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.exe b/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.exe index a46a2ac..23d3fab 100644 Binary files a/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.exe and b/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.exe differ diff --git a/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.jar b/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.jar index c766405..e739b5a 100644 Binary files a/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.jar and b/modules/enterprise/agent/src/etc/java-service-wrapper/windows-x86_32/wrapper.jar differ
commit d471deebf1a579abe19f9a8755918e3344586cda Author: Jay Shaughnessy jshaughn@redhat.com Date: Wed Jan 9 13:30:19 2013 -0500
Update version of windows java wrapper from 3.2.0 to 3.3.1 to solve issues with exit code handling, which prevented proper restart of the rhq server after an rhq-installer --reconfig command, or any other non-success exit code situation.
Also, - re-enable the built-in --reconfig for windows in rhq-server.bat
diff --git a/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.dll b/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.dll index 37c4f33..c5af6a0 100644 Binary files a/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.dll and b/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.dll differ diff --git a/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.exe b/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.exe index a46a2ac..23d3fab 100644 Binary files a/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.exe and b/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.exe differ diff --git a/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.jar b/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.jar index c766405..e739b5a 100644 Binary files a/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.jar and b/modules/enterprise/server/appserver/src/main/bin-resources/bin/wrapper/windows-x86_32/wrapper.jar differ diff --git a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml index ad6d6ca..b306c3c 100644 --- a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml +++ b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml @@ -629,13 +629,13 @@ rhq.sync.endpoint-address=false <replacevalue><![CDATA[export RHQ_SERVER_HOME; ${RHQ_SERVER_HOME}/bin/rhq-installer.sh --reconfig &]]></replacevalue> </replacefilter> </replace> - <!-- we can't do this to the windows script because for some reason JavaServiceWrapper won't restart - when an exit code 10 is seen, even though we have it configured to do so --> + <replace file="${project.build.outputDirectory}/bin/rhq-server.bat"> + <replacefilter> + <replacetoken>rem START SERVER</replacetoken> + <replacevalue><![CDATA[start /B %RHQ_SERVER_HOME%\bin\rhq-installer.bat --reconfig < nul > nul]]></replacevalue> + </replacefilter> + </replace> </target> - - <!-- The prepare-release target must be run AFTER the resources:resources goal has executed. --> - <!-- (i.e. after rhq-server.sh, etc. have been copied over by the resources plugin) --> - <target name="prepare-release" description="If this is a release build, make sure it is properly prepared." depends="initialize,
commit 383b6a3ced52d53fe196718f2a9b5fdabbfc9a9b Author: John Mazzitelli mazz@redhat.com Date: Wed Jan 9 11:23:11 2013 -0500
clean up some eclipse tools
diff --git a/etc/eclipse-tools/maven/RHQ Maven Build - Container.launch b/etc/eclipse-tools/maven/RHQ Maven Build - Container.launch index 4904e45..e67ab6b 100644 --- a/etc/eclipse-tools/maven/RHQ Maven Build - Container.launch +++ b/etc/eclipse-tools/maven/RHQ Maven Build - Container.launch @@ -1,11 +1,11 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType"> -<stringAttribute key="bad_container_name" value="\rhq\etc\eclipse-tools\maven"/> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> -<listEntry value="org.eclipse.ui.externaltools.launchGroup"/> -</listAttribute> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true clean install"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq/modules/enterprise/server/container}"/> -</launchConfiguration> +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType"> +<stringAttribute key="bad_container_name" value="\rhq\etc\eclipse-tools\maven"/> +<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> +<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> +<listEntry value="org.eclipse.ui.externaltools.launchGroup"/> +</listAttribute> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true clean install"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq/modules/enterprise/server/appserver}"/> +</launchConfiguration> diff --git a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Container Lib.launch b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Container Lib.launch deleted file mode 100644 index 8e3a657..0000000 --- a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Container Lib.launch +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType"> -<stringAttribute key="bad_container_name" value="\rhq\etc\eclipse-tools\maven"/> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> -<listEntry value="org.eclipse.ui.externaltools.launchGroup"/> -</listAttribute> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true -Pdev install"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq/modules/enterprise/server/container-lib}"/> -</launchConfiguration> diff --git a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Installer Only.launch b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Installer Only.launch index 1ee69a2..4d3a5b8 100644 --- a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Installer Only.launch +++ b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile Installer Only.launch @@ -7,5 +7,5 @@ </listAttribute> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true -Pdev install"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq/modules/enterprise/gui/installer}"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq/modules/enterprise/server/installer}"/> </launchConfiguration> diff --git a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile WebDAV Only.launch b/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile WebDAV Only.launch deleted file mode 100644 index 8900752..0000000 --- a/etc/eclipse-tools/maven/RHQ Maven Build - Dev Profile WebDAV Only.launch +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType"> -<stringAttribute key="bad_container_name" value="\rhq\etc\eclipse-tools\maven"/> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> -<listEntry value="org.eclipse.ui.externaltools.launchGroup"/> -</listAttribute> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${env_var:M2_HOME}/bin/${MAVEN_EXE}"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-o -Dmaven.test.skip=true -Pdev install"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/rhq/modules/enterprise/gui/webdav-war}"/> -</launchConfiguration>
commit 70447c927600b2421488a2be4b73f9585a550432 Author: Jirka Kremser jkremser@redhat.com Date: Wed Jan 9 14:38:27 2013 +0100
[BZ 893112 - UI widgets incorrectly hide when creating operation schedule] Instead of using Canvas.setVisibility, methods Canvas.show() and Canvas.hide() are now used
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java index c9c1c35..a7be208 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/trigger/JobTriggerEditor.java @@ -24,7 +24,6 @@ import java.util.EnumSet; import java.util.LinkedHashMap; import java.util.TreeSet;
-import com.smartgwt.client.types.Visibility; import com.smartgwt.client.widgets.HTMLFlow; import com.smartgwt.client.widgets.Img; import com.smartgwt.client.widgets.events.ClickEvent; @@ -515,8 +514,16 @@ public class JobTriggerEditor extends LocatableVLayout { repeatIntervalItem.setTitle(MSG.widget_jobTriggerEditor_field_repeatInterval_later()); repeatIntervalItem.redraw(); } - laterForm.setVisibility(this.isStartLater ? Visibility.VISIBLE : Visibility.HIDDEN); - repeatForm.setVisibility(this.isRecurring ? Visibility.VISIBLE : Visibility.HIDDEN); + if (isStartLater) { + laterForm.show(); + } else { + laterForm.hide(); + } + if (isRecurring) { + repeatForm.show(); + } else { + repeatForm.hide(); + } }
private void changeMode(String mode) {
commit 08a80f2aa2f460c92586d8ed677a63b04d061c34 Author: Jirka Kremser jkremser@redhat.com Date: Wed Jan 9 00:29:09 2013 +0100
set initial criteria for member servers in affinity group
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/ServerTableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/ServerTableView.java index 1c6e6d5..4d68c76 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/ServerTableView.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/topology/ServerTableView.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List;
import com.google.gwt.user.client.rpc.AsyncCallback; +import com.smartgwt.client.data.Criteria; import com.smartgwt.client.types.SortDirection; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; @@ -78,6 +79,14 @@ public class ServerTableView extends setWidth100(); if (isAffinityGroupId) { setDataSource(new ServerDatasource(id)); + Criteria criteria = new Criteria(); + String[] modes = new String[OperationMode.values().length]; + int i = 0; + for (OperationMode value : OperationMode.values()) { + modes[i++] = value.name(); + } + criteria.addCriteria(ServerDatasource.FILTER_OPERATION_MODE, modes); + setInitialCriteria(criteria); } else { setDataSource(showActions ? new ServerWithAgentCountDatasource() : new FailoverListItemDatasource(id)); }
commit f8ef7e81fc3f288049681f02241f5c64db795025 Author: John Mazzitelli mazz@redhat.com Date: Tue Jan 8 17:53:53 2013 -0500
we can't run installer --reconfig automatically for the user on windows because for some reason JavaServiceWrapper won't restart AS7 when an exit code 10 is seen, even though we have it configured to do so.
diff --git a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml index ff81894..ad6d6ca 100644 --- a/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml +++ b/modules/enterprise/server/appserver/src/main/scripts/rhq-container.build.xml @@ -629,12 +629,8 @@ rhq.sync.endpoint-address=false <replacevalue><![CDATA[export RHQ_SERVER_HOME; ${RHQ_SERVER_HOME}/bin/rhq-installer.sh --reconfig &]]></replacevalue> </replacefilter> </replace> - <replace file="${project.build.outputDirectory}/bin/rhq-server.bat"> - <replacefilter> - <replacetoken>rem START SERVER</replacetoken> - <replacevalue><![CDATA[start /B %RHQ_SERVER_HOME%\bin\rhq-installer.bat --reconfig < nul > nul]]></replacevalue> - </replacefilter> - </replace> + <!-- we can't do this to the windows script because for some reason JavaServiceWrapper won't restart + when an exit code 10 is seen, even though we have it configured to do so --> </target>
<!-- The prepare-release target must be run AFTER the resources:resources goal has executed. -->
rhq-commits@lists.fedorahosted.org