[rhq] modules/plugins
by Thomas Segismont
modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
New commits:
commit 4ab947d9c450a94601055509cb9c4240b0652210
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Jul 25 18:06:07 2013 +0200
Bug 886126 - Datasource JNDI change takes too long to be propagated to JON server
In EAP5, JNDI name is the key of Datasource and Connection Factory managed components. Consequently, there is no way to change the JNDI name of such components without creating a new managed component, which will in the end be discovered by RHQ.
So in RHQ, jndi-name config property is now marked as read-only (it will still be required when creating a Datasource or a Connection Factory).
diff --git a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
index 2b14f5b..9a53a80 100644
--- a/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-5/src/main/resources/META-INF/rhq-plugin.xml
@@ -133,6 +133,7 @@
<!ENTITY datasourceConnectionResourceConfigProps '
<c:simple-property name="jndi-name"
+ readOnly="true"
displayName="JNDI Name"
description="The global JNDI Name under which to bind the datasource"
type="string"/>
@@ -502,7 +503,7 @@
-->
<!ENTITY connectionFactoryConnectionResourceConfigProps '
- <c:simple-property required="true" name="jndi-name" displayName="JNDI Name"
+ <c:simple-property required="true" name="jndi-name" readOnly="true" displayName="JNDI Name"
description="The global JNDI name to bind the connection factory under."/>
<c:simple-property required="true" name="rar-name" displayName="RAR Name">
10 years, 9 months
[rhq] 3 commits - modules/enterprise modules/integration-tests
by Heiko W. Rupp
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java | 15
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/helper/LinkDeserializer.java | 28
modules/integration-tests/rest-api/pom.xml | 11
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java | 337 +++++-----
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java | 4
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkDeserializer.java | 18
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkSerializer.java | 53 +
7 files changed, 308 insertions(+), 158 deletions(-)
New commits:
commit ddef8592f462ec95309368170b1e6c60966b8d6b
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Jul 25 17:17:27 2013 +0200
Make the parser check its input and bail out if it is not valid.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/helper/LinkDeserializer.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/helper/LinkDeserializer.java
index e9582d4..f320d09 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/helper/LinkDeserializer.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/helper/LinkDeserializer.java
@@ -20,7 +20,11 @@
package org.rhq.enterprise.server.rest.helper;
import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.codehaus.jackson.JsonLocation;
+import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.DeserializationContext;
@@ -44,25 +48,47 @@ import org.rhq.enterprise.server.rest.domain.Link;
*/
public class LinkDeserializer extends JsonDeserializer<Link>{
+ Pattern textPattern = Pattern.compile("\\S+"); // Non whitespace; could possibly be narrowed
+
@Override
public Link deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String tmp = jp.getText(); // {
+ validate(jp, tmp,"{");
jp.nextToken(); // skip over { to the rel
String rel = jp.getText();
+ validateText(jp, rel);
jp.nextToken(); // skip over {
tmp = jp.getText();
+ validate(jp, tmp,"{");
jp.nextToken(); // skip over "href"
tmp = jp.getText();
-// jp.nextToken(); // skip over :
+ validate(jp, tmp,"href");
jp.nextToken(); // skip to "http:// ... "
String href = jp.getText();
+ validateText(jp, href);
jp.nextToken(); // skip }
tmp = jp.getText();
+ validate(jp, tmp, "}");
jp.nextToken(); // skip }
+ tmp = jp.getText();
+ validate(jp, tmp, "}");
Link link = new Link(rel,href);
return link;
}
+
+ private void validateText(JsonParser jsonParser, String input) throws JsonProcessingException {
+ Matcher m = textPattern.matcher(input);
+ if (!m.matches()) {
+ throw new JsonParseException("Unexpected token: " + input, jsonParser.getTokenLocation());
+ }
+ }
+
+ private void validate(JsonParser jsonParser, String input, String expected) throws JsonProcessingException {
+ if (!input.equals(expected)) {
+ throw new JsonParseException("Unexpected token: " + input, jsonParser.getTokenLocation());
+ }
+ }
}
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
index 3d39181..7789f9e 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
@@ -18,7 +18,6 @@
*/
package org.rhq.modules.integrationTests.restApi;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -219,10 +218,61 @@ public class OperationsTest extends AbstractBase {
.when()
.delete("/operation/" + draftId);
}
+ }
+
+ @Test
+ public void testCatchBadLinkSerialization() throws Exception {
+
+ // Test that when we get Links back in bad format, we
+ // correctly bail out.
+
+ Operation draft = getADraftOperation(_platformId, discoveryDefinitionId);
+
+ int draftId = draft.getId();
+ draft.getParams().put("detailedDiscovery",true);
+
+ String jsonWithBadLinkSer = //
+ "{\n" +
+ " \"id\": " + draftId + ",\n" +
+ " \"name\": \"discovery\",\n" +
+ " \"readyToSubmit\": false,\n" +
+ " \"resourceId\": " + _platformId + ",\n" +
+ " \"definitionId\": " + discoveryDefinitionId + ",\n" +
+ " \"params\": {\n" +
+ " \"detailedDiscovery\": true\n" +
+ " },\n" +
+ " \"links\": [\n" +
+ " {\n" +
+ " \"rel\": \"edit\",\n" +
+ " \"href\": \"http://localhost:7080/rest/operation/" + draftId + "\"\n" +
+ " }\n" +
+ " ]\n" +
+ "}";
+
+ try {
+ given()
+ .contentType(ContentType.JSON)
+ .pathParam("id", draftId)
+ .body(jsonWithBadLinkSer)
+ .log().everything()
+ .expect()
+ .statusCode(503)
+ .log().ifError()
+ .when()
+ .put("/operation/{id}");
+ } finally {
+ // delete the draft again
+ expect()
+ .statusCode(204)
+ .when()
+ .delete("/operation/" + draftId);
+ }
}
+
+
@Test
public void testCreateDraftOperationAndScheduleExecution() throws Exception {
commit 32395046687dcfd0cd9e46164a9ce4b6a82d1752
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Jul 25 14:57:07 2013 +0200
Add a LinkSerializer to send links in correct format (one could argue not to send links at all).
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
index 57c1a49..3d39181 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
@@ -318,8 +318,6 @@ public class OperationsTest extends AbstractBase {
assert draft != null;
assert draft.getDefinitionId() == definitionId;
- draft.setLinks(new ArrayList<Link>()); // Clean out links TODO
-
System.out.println("--- Draft created --");
System.out.flush();
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java
index c3f7b2b..c199729 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java
@@ -20,11 +20,13 @@
package org.rhq.modules.integrationTests.restApi.d;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
/**
* A Link inside objects
* @author Heiko W. Rupp
*/
+@JsonSerialize(using = LinkSerializer.class)
@JsonDeserialize(using = LinkDeserializer.class)
public class Link {
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkSerializer.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkSerializer.java
new file mode 100644
index 0000000..759c8dc
--- /dev/null
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkSerializer.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.modules.integrationTests.restApi.d;
+
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+/**
+ * Special serializer for Link objects that does not map the classical {rel:abc, href:xyz} scheme,
+ * but which puts the rel name "at the outside" like { abc : { href : xyz }} to make it easier for
+ * clients to access the link.
+ * See also https://bugzilla.redhat.com/show_bug.cgi?id=845244
+ * @author Heiko W. Rupp
+ * @see LinkDeserializer
+ */
+public class LinkSerializer extends JsonSerializer<Link> {
+
+ @Override
+ public void serialize(Link link, JsonGenerator jsonGenerator,
+ SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
+
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeFieldName(link.getRel());
+
+ jsonGenerator.writeStartObject();
+ jsonGenerator.writeFieldName("href");
+ jsonGenerator.writeString(link.getHref());
+ jsonGenerator.writeEndObject();
+
+ jsonGenerator.writeEndObject();
+ }
+}
commit 83336d77e19949e332d29e936ce6739aded399da
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Thu Jul 25 12:55:54 2013 +0200
BZ 974963 Allow to schedule operations that have no parameters.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
index 5e8e68e..070675e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/OperationsHandlerBean.java
@@ -303,12 +303,15 @@ public class OperationsHandlerBean extends AbstractRestBean {
// Validate parameters
ConfigurationDefinition parameterDefinition = opDef.getParametersConfigurationDefinition();
- List<String> errorMessages = ConfigurationHelper.checkConfigurationWrtDefinition(parameters, parameterDefinition);
-
- if (errorMessages.size()>0) {
- // Configuration is not ok
- operation.setReadyToSubmit(false);
- throw new BadArgumentException("Validation of parameters failed", StringUtils.getListAsString(errorMessages,", "));
+ if (parameterDefinition!=null) {
+ // There are parameters defined, so lets validate them.
+ List<String> errorMessages = ConfigurationHelper.checkConfigurationWrtDefinition(parameters, parameterDefinition);
+
+ if (errorMessages.size()>0) {
+ // Configuration is not ok
+ operation.setReadyToSubmit(false);
+ throw new BadArgumentException("Validation of parameters failed", StringUtils.getListAsString(errorMessages,", "));
+ }
}
}
diff --git a/modules/integration-tests/rest-api/pom.xml b/modules/integration-tests/rest-api/pom.xml
index 47bfe18..5d7bde5 100644
--- a/modules/integration-tests/rest-api/pom.xml
+++ b/modules/integration-tests/rest-api/pom.xml
@@ -18,7 +18,7 @@
<properties>
<surefire-plugin.version>2.10</surefire-plugin.version>
- <jackson.version>1.9.5</jackson.version>
+ <jackson.version>2.0.5</jackson.version>
<rest-assured.version>1.8.1</rest-assured.version>
</properties>
@@ -53,15 +53,14 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-core-asl</artifactId>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
<scope>test</scope>
</dependency>
-
<dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-mapper-asl</artifactId>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
<scope>test</scope>
</dependency>
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
index 7800e5c..57c1a49 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java
@@ -18,6 +18,7 @@
*/
package org.rhq.modules.integrationTests.restApi;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -42,7 +43,8 @@ import static org.hamcrest.core.Is.is;
*/
public class OperationsTest extends AbstractBase {
- private int definitionId;
+ private int discoveryDefinitionId;
+ private int viewPLDefinitionId;
@Before
public void setUp() throws Exception {
@@ -58,15 +60,20 @@ public class OperationsTest extends AbstractBase {
.when()
.get("/operation/definitions");
- definitionId = -1;
+ discoveryDefinitionId = -1;
List<Map<String,Object>> list = r.as(List.class);
for (Map<String,Object> map : list) {
- if (map.get("name").equals("discovery")) {
- definitionId = (Integer) map.get("id");
+ String name = (String) map.get("name");
+ Integer id = (Integer) map.get("id");
+ if (name.equals("discovery")) {
+ discoveryDefinitionId = id;
+ }
+ if (name.equals("viewProcessList")) {
+ viewPLDefinitionId = id;
}
}
- assert definitionId !=-1 : "No discovery operation found";
+ assert discoveryDefinitionId !=-1 : "No discovery operation found";
}
@Test
@@ -76,7 +83,7 @@ public class OperationsTest extends AbstractBase {
given()
.header(acceptJson)
- .pathParam("did",definitionId)
+ .pathParam("did", discoveryDefinitionId)
.expect()
.statusCode(200)
.body("name",is("discovery"))
@@ -92,7 +99,7 @@ public class OperationsTest extends AbstractBase {
given()
.header(acceptJson)
- .pathParam("did",-42)
+ .pathParam("did", -42)
.expect()
.statusCode(404)
.when()
@@ -107,7 +114,7 @@ public class OperationsTest extends AbstractBase {
given()
.header(acceptJson)
- .queryParam("resourceId",42)
+ .queryParam("resourceId", 42)
.expect()
.statusCode(404)
.when()
@@ -134,7 +141,7 @@ public class OperationsTest extends AbstractBase {
given()
.header(acceptJson)
- .pathParam("did",-42)
+ .pathParam("did", -42)
.expect()
.statusCode(406)
.when()
@@ -150,7 +157,7 @@ public class OperationsTest extends AbstractBase {
given()
.header(acceptJson)
.queryParam("resourceId", 42)
- .pathParam("definitionId", definitionId)
+ .pathParam("definitionId", discoveryDefinitionId)
.expect()
.statusCode(404)
.when()
@@ -164,7 +171,7 @@ public class OperationsTest extends AbstractBase {
given()
.header(acceptJson)
- .pathParam("definitionId", definitionId)
+ .pathParam("definitionId", discoveryDefinitionId)
.expect()
.statusCode(406)
.when()
@@ -174,20 +181,7 @@ public class OperationsTest extends AbstractBase {
@Test
public void testCreateDraftOperation() throws Exception {
- Operation draft =
- given()
- .header(acceptJson)
- .pathParam("definitionId",definitionId)
- .queryParam("resourceId",_platformId)
- .expect()
- .statusCode(200)
- .log().ifError()
- .when()
- .post("/operation/definition/{definitionId}")
- .as(Operation.class);
-
- assert draft != null;
- assert draft.getDefinitionId() == definitionId;
+ Operation draft = getADraftOperation(_platformId, discoveryDefinitionId);
int draftId = draft.getId();
@@ -202,29 +196,17 @@ public class OperationsTest extends AbstractBase {
@Test
public void testCreateAndUpdateDraftOperation() throws Exception {
- Operation draft =
- given()
- .header(acceptJson)
- .pathParam("definitionId",definitionId)
- .queryParam("resourceId",_platformId)
- .expect()
- .statusCode(200)
- .log().ifError()
- .when()
- .post("/operation/definition/{definitionId}")
- .as(Operation.class);
-
- assert draft != null;
- assert draft.getDefinitionId() == definitionId;
+ Operation draft = getADraftOperation(_platformId, discoveryDefinitionId);
int draftId = draft.getId();
- draft.getParams().put("detailed",true);
+ draft.getParams().put("detailedDiscovery",true);
try {
given()
.contentType(ContentType.JSON)
.pathParam("id", draftId)
.body(draft)
+ .log().everything()
.expect()
.statusCode(200)
.log().ifError()
@@ -246,25 +228,51 @@ public class OperationsTest extends AbstractBase {
int platformId = findIdOfARealPlatform();
- Operation draft =
+ Operation draft = getADraftOperation(platformId, discoveryDefinitionId);
+
+ int draftId = draft.getId();
+
+ draft.setReadyToSubmit(true);
+ draft.getParams().put("detailedDiscovery", false);
+
+ // update to schedule
+ Operation scheduled =
given()
- .header(acceptJson)
- .pathParam("definitionId",definitionId)
- .queryParam("resourceId",platformId)
+ .contentType(ContentType.JSON)
+ .pathParam("id",draftId)
+ .body(draft)
.expect()
.statusCode(200)
.log().ifError()
.when()
- .post("/operation/definition/{definitionId}")
+ .put("/operation/{id}")
.as(Operation.class);
- assert draft != null;
- assert draft.getDefinitionId() == definitionId;
+ System.out.println(scheduled.getId());
+ String history = findHistoryItem(scheduled);
+
+ String historyId = history.substring(history.lastIndexOf("/")+1);
+ try {
+ waitAndCheckStatus(platformId, historyId);
+
+ } finally {
+
+ // Wait until the operation has finished and then delete
+ waitForTerminationAndDelete(historyId);
+
+ }
+ }
+
+ @Test
+ public void testCreateDraftOperationNoParamsAndScheduleExecution() throws Exception {
+
+ int platformId = findIdOfARealPlatform();
+
+ Operation draft = getADraftOperation(platformId, viewPLDefinitionId);
int draftId = draft.getId();
draft.setReadyToSubmit(true);
- draft.getParams().put("detailedDiscovery", false);
// update to schedule
Operation scheduled =
@@ -280,6 +288,45 @@ public class OperationsTest extends AbstractBase {
.as(Operation.class);
System.out.println(scheduled.getId());
+ String history = findHistoryItem(scheduled);
+
+ String historyId = history.substring(history.lastIndexOf("/")+1);
+ try {
+ waitAndCheckStatus(platformId, historyId);
+
+ } finally {
+
+ // Wait until the operation has finished and then delete
+ waitForTerminationAndDelete(historyId);
+
+ }
+ }
+
+ private Operation getADraftOperation(int platformId, int definitionId) {
+ Operation draft =
+ given()
+ .header(acceptJson)
+ .pathParam("definitionId", definitionId)
+ .queryParam("resourceId",platformId)
+ .expect()
+ .statusCode(200)
+ .log().ifError()
+ .when()
+ .post("/operation/definition/{definitionId}")
+ .as(Operation.class);
+
+ assert draft != null;
+ assert draft.getDefinitionId() == definitionId;
+
+ draft.setLinks(new ArrayList<Link>()); // Clean out links TODO
+
+ System.out.println("--- Draft created --");
+ System.out.flush();
+
+ return draft;
+ }
+
+ private String findHistoryItem(Operation scheduled) {
String history = null;
List<Link> links = scheduled.getLinks();
for (Link link : links) {
@@ -288,76 +335,74 @@ public class OperationsTest extends AbstractBase {
}
}
assert history != null;
+ return history;
+ }
- String historyId = history.substring(history.lastIndexOf("/")+1);
- try {
- Thread.sleep(15000); // we need to wait a little as the execution may take time
+ private void waitAndCheckStatus(int platformId, String historyId) throws InterruptedException {
+ Thread.sleep(15000); // we need to wait a little as the execution may take time
- given()
- .pathParam("hid",historyId)
- .expect()
- .statusCode(200)
- .log().ifError()
- .when()
- .get("/operation/history/{hid}");
+ given()
+ .pathParam("hid", historyId)
+ .expect()
+ .statusCode(200)
+ .log().ifError()
+ .when()
+ .get("/operation/history/{hid}");
+
+ // See if we also find it when we are looking for histories on the resource
+ Response response =
+ given()
+ .queryParam("resourceId", platformId)
+ .header(acceptJson)
+ .expect()
+ .statusCode(200)
+ .log().ifError()
+ .when()
+ .get("/operation/history");
- // See if we also find it when we are looking for histories on the resource
+ // compare
+ List<Map<String,Object>> list = response.as(List.class);
+ boolean found = false;
+ for (Map<String,Object> map : list) {
+ if (map.get("jobId").equals(historyId)) {
+ found = true;
+ }
+ }
+ assert found;
+ }
+
+ private void waitForTerminationAndDelete(String historyId) throws InterruptedException {
+ boolean done = false;
+ int count = 0;
+ while (!done) {
Response response =
given()
- .queryParam("resourceId",platformId)
.header(acceptJson)
- .expect()
- .statusCode(200)
- .log().ifError()
+ .pathParam("hid", historyId)
.when()
- .get("/operation/history");
-
- // compare
- List<Map<String,Object>> list = response.as(List.class);
- boolean found = false;
- for (Map<String,Object> map : list) {
- if (map.get("jobId").equals(historyId)) {
- found = true;
- }
- }
- assert found;
+ .get("/operation/history/{hid}");
- } finally {
+ JsonPath jsonPath = response.jsonPath();
+ String status= jsonPath.getString("status");
+ int code = response.statusCode();
- // Wait until the operation has finished and then delete
- boolean done = false;
- int count = 0;
- while (!done) {
- Response response =
- given()
- .header(acceptJson)
- .pathParam("hid", historyId)
- .when()
- .get("/operation/history/{hid}");
-
- JsonPath jsonPath = response.jsonPath();
- String status= jsonPath.getString("status");
- int code = response.statusCode();
-
- if (code==200 && (status.equals("Success") || status.equals("Failed"))) {
- done = true;
- } else {
- Thread.sleep(2000);
- }
- count ++;
- assert count < 10 :"Waited for 20sec -- something is wrong";
+ if (code==200 && (status.equals("Success") || status.equals("Failed"))) {
+ done = true;
+ } else {
+ Thread.sleep(2000);
}
-
- // Delete the history item
- given()
- .pathParam("hid",historyId)
- .expect()
- .statusCode(204)
- .log().ifError()
- .when()
- .delete("/operation/history/{hid}");
-
+ count ++;
+ assert count < 10 :"Waited for 20sec -- something is wrong";
}
+
+ // Delete the history item
+ given()
+ .pathParam("hid", historyId)
+ .expect()
+ .statusCode(204)
+ .log().ifError()
+ .when()
+ .delete("/operation/history/{hid}");
}
@Test
@@ -365,20 +410,7 @@ public class OperationsTest extends AbstractBase {
int platformId = findIdOfARealPlatform();
- Operation draft =
- given()
- .header(acceptJson)
- .pathParam("definitionId",definitionId)
- .queryParam("resourceId",platformId)
- .expect()
- .statusCode(200)
- .log().ifError()
- .when()
- .post("/operation/definition/{definitionId}")
- .as(Operation.class);
-
- assert draft != null;
- assert draft.getDefinitionId() == definitionId;
+ Operation draft = getADraftOperation(platformId, discoveryDefinitionId);
int draftId = draft.getId();
@@ -423,20 +455,7 @@ public class OperationsTest extends AbstractBase {
int platformId = findIdOfARealPlatform();
- Operation draft =
- given()
- .header(acceptJson)
- .pathParam("definitionId",definitionId)
- .queryParam("resourceId",platformId)
- .expect()
- .statusCode(200)
- .log().ifError()
- .when()
- .post("/operation/definition/{definitionId}")
- .as(Operation.class);
-
- assert draft != null;
- assert draft.getDefinitionId() == definitionId;
+ Operation draft = getADraftOperation(platformId, discoveryDefinitionId);
int draftId = draft.getId();
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java
index e16213c..c3f7b2b 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/Link.java
@@ -19,7 +19,7 @@
package org.rhq.modules.integrationTests.restApi.d;
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
/**
* A Link inside objects
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkDeserializer.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkDeserializer.java
index 5d45724..c138761 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkDeserializer.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/d/LinkDeserializer.java
@@ -21,19 +21,19 @@ package org.rhq.modules.integrationTests.restApi.d;
import java.io.IOException;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.ObjectCodec;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.JsonDeserializer;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
/**
* Custom deserializer for link object that are now in the form { relname : { "href": link}}
*
* @author Heiko W. Rupp
*/
-public class LinkDeserializer extends JsonDeserializer<Link>{
+public class LinkDeserializer extends JsonDeserializer<Link> {
@Override
public Link deserialize(JsonParser jsonParser,
@@ -41,8 +41,8 @@ public class LinkDeserializer extends JsonDeserializer<Link>{
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
- String rel = node.getFieldNames().next();
- String href = node.getElements().next().get("href").getTextValue();
+ String rel = node.fieldNames().next();
+ String href = node.elements().next().get("href").textValue();
return new Link(rel,href);
10 years, 9 months
[rhq] modules/plugins
by Thomas Segismont
modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java | 38 +++++++++-
1 file changed, 36 insertions(+), 2 deletions(-)
New commits:
commit bac87d4800260b79c0398291d3909aa1b383b5e2
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Jul 25 16:50:06 2013 +0200
Make CassandraNodeComponent shutdown operation wait for server to go down (unless running on OSX)
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 37aa425..3e55a93 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
@@ -68,6 +68,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.StringUtil;
import org.rhq.core.util.exception.ThrowableUtil;
@@ -140,7 +141,6 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
if (isStorageServiceReachable()) {
return AvailabilityType.UP;
}
-
return AvailabilityType.DOWN;
} finally {
long totalTimeMillis = NANOSECONDS.toMillis(System.nanoTime() - start);
@@ -190,6 +190,7 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
public OperationResult invokeOperation(String name, Configuration parameters) throws Exception {
if (name.equals("shutdown")) {
OperationResult operationResult = shutdownNode();
+ waitForNodeToGoDown();
return operationResult;
} else if (name.equals("start")) {
return startNode();
@@ -238,7 +239,7 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
protected OperationResult stopNode() {
ProcessInfo process = getResourceContext().getNativeProcess();
- if (processInfo == null) {
+ if (process == null) {
LOG.warn("Failed to obtain process info. It appears Cassandra is already shutdown.");
return new OperationResult("Failed to obtain process info. It appears Cassandra is already shutdown.");
}
@@ -265,6 +266,39 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
}
}
+ private void waitForNodeToGoDown() throws InterruptedException {
+ if (OperatingSystem.getInstance().getName().equals(OperatingSystem.NAME_MACOSX)) {
+ // See this thread on VMWare forum: http://communities.vmware.com/message/2187972#2187972
+ // Unfortunately there is no work around for this failure on Mac OSX so the method will silently return on
+ // this platform.
+ return;
+ }
+ for (ProcessInfoSnapshot processInfoSnapshot = getProcessInfoSnapshot();; processInfoSnapshot = getProcessInfoSnapshot()) {
+ if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
+ // Process not found, so it died, that's fine
+ // OR
+ // Process info says process is no longer running, that's fine as well
+ break;
+ }
+ if (getResourceContext().getComponentInvocationContext().isInterrupted()) {
+ // Operation canceled or timed out
+ throw new InterruptedException();
+ }
+ // Process is still running, wait a second and check again
+ Thread.sleep(SECONDS.toMillis(2));
+ }
+ }
+
+ private ProcessInfoSnapshot getProcessInfoSnapshot() {
+ ProcessInfoSnapshot processInfoSnapshot = (processInfo == null) ? null : processInfo.freshSnapshot();
+ if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
+ processInfo = getResourceContext().getNativeProcess();
+ // Safe to get prior snapshot here, we've just recreated the process info instance
+ processInfoSnapshot = (processInfo == null) ? null : processInfo.priorSnaphot();
+ }
+ return processInfoSnapshot;
+ }
+
protected OperationResult startNode() {
Configuration pluginConfig = getResourceContext().getPluginConfiguration();
String baseDir = pluginConfig.getSimpleValue("baseDir");
10 years, 9 months
[rhq] 2 commits - modules/enterprise modules/plugins
by snegrea
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java | 48 ++++++----
modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java | 28 +++++
modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java | 26 +++--
modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml | 4
4 files changed, 80 insertions(+), 26 deletions(-)
New commits:
commit 76183b30be9694e81ed93239ff505f887c101f32
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Thu Jul 25 08:51:47 2013 -0500
Add support for updating the JMX Port. The process sends a restart to the resource last to avoid putting the Server in maintenance mode.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
index 1441785..7a7eda4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
@@ -103,7 +103,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
private static final String RHQ_STORAGE_ADDRESS_PROPERTY = "host";
private static final int OPERATION_QUERY_TIMEOUT = 20000;
- private static final int MAX_ITERATIONS = 6;
+ private static final int MAX_ITERATIONS = 10;
private static final String UPDATE_CONFIGURATION_OPERATION = "updateConfiguration";
private static final String RESTART_OPERATION = "restart";
@@ -639,16 +639,45 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
StorageNode storageNode = findStorageNodeByAddress(storageNodeConfiguration.getStorageNode().getAddress());
if (storageNode != null && storageNode.getResource() != null) {
- Resource storageNodeResource = storageNode.getResource();
Configuration parameters = new Configuration();
parameters.setSimpleValue("jmxPort", storageNodeConfiguration.getJmxPort() + "");
- parameters.setSimpleValue("heapSize", storageNodeConfiguration.getHeapSize() + "");
- parameters.setSimpleValue("heapNewSize", storageNodeConfiguration.getHeapNewSize() + "");
- parameters.setSimpleValue("threadStackSize", storageNodeConfiguration.getThreadStackSize() + "");
- parameters.setSimpleValue("restartIfRequired", "true");
+ if (storageNodeConfiguration.getHeapSize() != null) {
+ parameters.setSimpleValue("heapSize", storageNodeConfiguration.getHeapSize() + "");
+ }
+ if (storageNodeConfiguration.getHeapNewSize() != null) {
+ parameters.setSimpleValue("heapNewSize", storageNodeConfiguration.getHeapNewSize() + "");
+ }
+ if (storageNodeConfiguration.getThreadStackSize() != null) {
+ parameters.setSimpleValue("threadStackSize", storageNodeConfiguration.getThreadStackSize() + "");
+ }
+ parameters.setSimpleValue("restartIfRequired", "false");
- return runOperationAndWaitForResult(subject, storageNodeResource, UPDATE_CONFIGURATION_OPERATION,
+ Resource storageNodeResource = storageNode.getResource();
+
+ boolean result = runOperationAndWaitForResult(subject, storageNodeResource, UPDATE_CONFIGURATION_OPERATION,
parameters);
+
+ if (result) {
+ Configuration storageNodePluginConfig = configurationManager.getPluginConfiguration(subject,
+ storageNodeResource.getId());
+
+ String existingJMXPort = storageNodePluginConfig.getSimpleValue("jmxPort");
+ storageNodePluginConfig.setSimpleValue("jmxPort", storageNodeConfiguration.getJmxPort() + "");
+
+ String existingConnectionURL = storageNodePluginConfig.getSimpleValue("connectorAddress");
+ String newConnectionURL = existingConnectionURL.replace(":" + existingJMXPort + "/", ":"
+ + storageNodeConfiguration.getJmxPort() + "/");
+ storageNodePluginConfig.setSimpleValue("connectorAddress", newConnectionURL);
+
+ configurationManager.updatePluginConfiguration(subject, storageNodeResource.getId(),
+ storageNodePluginConfig);
+
+ storageNode.setJmxPort(storageNodeConfiguration.getJmxPort());
+ entityManager.merge(storageNode);
+ entityManager.flush();
+
+ return runOperationAndWaitForResult(subject, storageNodeResource, RESTART_OPERATION, null);
+ }
}
return false;
diff --git a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java
index 41a0c42..125f4d2 100644
--- a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java
+++ b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java
@@ -117,6 +117,7 @@ public class StorageNodeComponent extends CassandraNodeComponent implements Oper
//update storage node jvm settings
Configuration config = new Configuration();
+ config.put(new PropertySimple("jmxPort", params.getSimpleValue("jmxPort")));
config.put(new PropertySimple("minHeapSize", params.getSimpleValue("heapSize")));
config.put(new PropertySimple("maxHeapSize", params.getSimpleValue("heapSize")));
config.put(new PropertySimple("heapNewSize", params.getSimpleValue("heapNewSize")));
diff --git a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
index 1667877..dd5b8a2 100644
--- a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
+++ b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeConfigDelegate.java
@@ -148,11 +148,17 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet {
}
}
- private void updateCassandraJvmProps(Configuration config) throws IOException {
+ private void updateCassandraJvmProps(Configuration newConfig) throws IOException {
PropertiesFileUpdate propertiesUpdater = new PropertiesFileUpdate(jvmOptsFile.getAbsolutePath());
Properties properties = propertiesUpdater.loadExistingProperties();
- String maxHeapSize = config.getSimpleValue("maxHeapSize");
+ String jmxPort = newConfig.getSimpleValue("jmxPort");
+ if (!StringUtil.isEmpty(jmxPort)) {
+ validateIntegerArg("jmx_port", jmxPort);
+ properties.setProperty("jmx_port", jmxPort);
+ }
+
+ String maxHeapSize = newConfig.getSimpleValue("maxHeapSize");
if (!StringUtil.isEmpty(maxHeapSize)) {
validateHeapArg("maxHeapSize", maxHeapSize);
// We want min and max heap to be the same
@@ -160,19 +166,19 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet {
properties.setProperty("heap_max", "-Xmx" + maxHeapSize);
}
- String heapNewSize = config.getSimpleValue("heapNewSize");
+ String heapNewSize = newConfig.getSimpleValue("heapNewSize");
if (!StringUtil.isEmpty(heapNewSize)) {
validateHeapArg("heapNewSize", heapNewSize);
properties.setProperty("heap_new", "-Xmn" + heapNewSize);
}
- String threadStackSize = config.getSimpleValue("threadStackSize");
+ String threadStackSize = newConfig.getSimpleValue("threadStackSize");
if (!StringUtil.isEmpty(threadStackSize)) {
- validateStackArg(threadStackSize);
+ validateIntegerArg("threadStackSize", threadStackSize);
properties.setProperty("thread_stack_size", "-Xss" + threadStackSize + "k");
}
- PropertySimple heapDumpOnOMMError = config.getSimple("heapDumpOnOOMError");
+ PropertySimple heapDumpOnOMMError = newConfig.getSimple("heapDumpOnOOMError");
if (heapDumpOnOMMError != null) {
if (heapDumpOnOMMError.getBooleanValue()) {
properties.setProperty("heap_dump_on_OOMError", "-XX:+HeapDumpOnOutOfMemoryError");
@@ -181,7 +187,7 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet {
}
}
- String heapDumpDir = useForwardSlash(config.getSimpleValue("heapDumpDir"));
+ String heapDumpDir = useForwardSlash(newConfig.getSimpleValue("heapDumpDir"));
if (!StringUtil.isEmpty(heapDumpDir)) {
properties.setProperty("heap_dump_dir", heapDumpDir);
}
@@ -209,7 +215,7 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet {
String threadStackSize = config.getSimpleValue("threadStackSize");
if (!StringUtil.isEmpty(threadStackSize)) {
- validateStackArg(threadStackSize);
+ validateIntegerArg("threadStackSize", threadStackSize);
properties.setProperty("set.thread_stack_size", "-Xss" + threadStackSize + "k");
}
@@ -248,11 +254,11 @@ public class StorageNodeConfigDelegate implements ConfigurationFacet {
}
}
- private void validateStackArg(String value) {
+ private void validateIntegerArg(String name, String value) {
try {
Integer.parseInt(value);
} catch (NumberFormatException e) {
- throw new IllegalArgumentException(value + " is not a legal value for the property [threadStackSize]");
+ throw new IllegalArgumentException(value + " is not a legal value for the property [" + name + "]");
}
}
diff --git a/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
index aca3ba2..a42040d 100644
--- a/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
@@ -32,6 +32,7 @@
<c:simple-property name="baseDir" displayName="Base Directory" description="The base directory from which the Cassandra Daemon was launched." required="false"/>
<c:simple-property name="yamlConfiguration" displayName="YAML Configuration File" description="YAML Configuration File"/>
<c:simple-property name="nativeTransportPort" description="The port on which Cassandra listens for CQL client connections." default="9042" type="integer"/>
+ <c:simple-property name="jmxPort" description="The JMX port for Cassandra" default="7299" type="integer" readOnly="true"/>
<c:simple-property name="host" description="The host on which cassandra listens to CQL client connections" default="localhost"/>
<c:simple-property name="clusterName" description="Cluster name" default="localhost"/>
<c:simple-property name="authenticator" required="true" default="org.apache.cassandra.auth.AllowAllAuthenticator" description="Cassandra client authenticator">
@@ -131,11 +132,11 @@
<operation name="updateConfiguration" description="Updates the node configuration. Will require a separate server restart for the settings to take effect.">
<parameters>
+ <c:simple-property name="jmxPort" type="integer" description="JMX port JVM option."/>
<c:simple-property name="heapSize" type="string" description="The heap size to be used for both -Xms and -Xmx JVM options."/>
<c:simple-property name="heapNewSize" type="string" description="The heap new size to be used be used with -Xmn JVM option."/>
<c:simple-property name="threadStackSize" type="integer" description="The thread stack size. This memory is allocated to each thread off heap. The
value should be an integer that will be interpreted in kilobytes."/>
- <c:simple-property name="jmxPort" type="integer" description="JMX port JVM option."/>
<c:simple-property name="restartIfRequired" type="boolean" required="true" default="false" description="If [true] then restart the server at the end of the update if and if only the updates made require a restart. If [false] the server will not be restarted regardless of the updates made."/>
</parameters>
<results>
commit c4c99241f2c2406b4b916865b0932d1df5e2af4f
Author: Stefan Negrea <snegrea(a)redhat.com>
Date: Tue Jul 23 16:43:29 2013 -0500
Move the restart operation to the plugin rather than server bean. This simplifies the interface between the server bean and storage node plugin.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
index 9416c67..1441785 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
@@ -645,21 +645,10 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
parameters.setSimpleValue("heapSize", storageNodeConfiguration.getHeapSize() + "");
parameters.setSimpleValue("heapNewSize", storageNodeConfiguration.getHeapNewSize() + "");
parameters.setSimpleValue("threadStackSize", storageNodeConfiguration.getThreadStackSize() + "");
+ parameters.setSimpleValue("restartIfRequired", "true");
- boolean updateConfigurationResult = runOperationAndWaitForResult(subject, storageNodeResource,
- UPDATE_CONFIGURATION_OPERATION, parameters);
-
- if (updateConfigurationResult) {
- boolean restartResult = runOperationAndWaitForResult(subject, storageNodeResource, RESTART_OPERATION,
- null);
-
- if (restartResult) {
- storageNode.setJmxPort(storageNodeConfiguration.getJmxPort());
- entityManager.persist(storageNode);
-
- return true;
- }
- }
+ return runOperationAndWaitForResult(subject, storageNodeResource, UPDATE_CONFIGURATION_OPERATION,
+ parameters);
}
return false;
diff --git a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java
index d9b35b9..41a0c42 100644
--- a/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java
+++ b/modules/plugins/rhq-storage/src/main/java/org/rhq/plugins/storage/StorageNodeComponent.java
@@ -111,6 +111,8 @@ public class StorageNodeComponent extends CassandraNodeComponent implements Oper
}
private OperationResult updateConfiguration(Configuration params) {
+ boolean restartIsRequired = false;
+
OperationResult result = new OperationResult("Configuration updated.");
//update storage node jvm settings
@@ -125,6 +127,31 @@ public class StorageNodeComponent extends CassandraNodeComponent implements Oper
if (!configurationUpdate.getStatus().equals(ConfigurationUpdateStatus.SUCCESS)) {
result.setErrorMessage(configurationUpdate.getErrorMessage());
+ } else {
+ if (params.getSimpleValue("heapSize") != null
+ || params.getSimpleValue("heapNewSize") != null
+ || params.getSimpleValue("threadStackSize") != null) {
+ restartIsRequired = true;
+ }
+ }
+
+ //restart the server if:
+ //- requested by the user
+ //- the updates done require restart
+ boolean restartIfRequiredConfig = false;
+ if (params.getSimpleValue("restartIfRequired") != null) {
+ restartIfRequiredConfig = Boolean.parseBoolean(params.getSimpleValue("restartIfRequired"));
+ }
+
+ if (restartIfRequiredConfig && restartIsRequired) {
+ try {
+ OperationResult restartResult = this.invokeOperation("restart", null);
+ if (restartResult.getErrorMessage() != null) {
+ result.setErrorMessage(restartResult.getErrorMessage());
+ }
+ } catch (Exception e) {
+ result.setErrorMessage(e.getMessage());
+ }
}
return result;
diff --git a/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
index cd84de6..aca3ba2 100644
--- a/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/rhq-storage/src/main/resources/META-INF/rhq-plugin.xml
@@ -136,6 +136,7 @@
<c:simple-property name="threadStackSize" type="integer" description="The thread stack size. This memory is allocated to each thread off heap. The
value should be an integer that will be interpreted in kilobytes."/>
<c:simple-property name="jmxPort" type="integer" description="JMX port JVM option."/>
+ <c:simple-property name="restartIfRequired" type="boolean" required="true" default="false" description="If [true] then restart the server at the end of the update if and if only the updates made require a restart. If [false] the server will not be restarted regardless of the updates made."/>
</parameters>
<results>
<c:simple-property name="operationResult" description="Outcome of updating the configuration."/>
10 years, 9 months
[rhq] modules/plugins
by Thomas Segismont
modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java | 73 ++++------
modules/plugins/rhq-storage/pom.xml | 30 ++--
modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java | 27 ++-
3 files changed, 74 insertions(+), 56 deletions(-)
New commits:
commit f0ec56f27ca9b3871290d717232dd0fcec1b488c
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Jul 25 12:16:39 2013 +0200
CassandraNodeComponent#startNode now starts C* with a short CLASSPATH to allow later discovery on Linux
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 70ba4b2..37aa425 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
@@ -47,6 +47,7 @@ import com.datastax.driver.core.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hyperic.sigar.OperatingSystem;
import org.hyperic.sigar.SigarException;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
@@ -67,7 +68,6 @@ 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.StringUtil;
import org.rhq.core.util.exception.ThrowableUtil;
@@ -186,16 +186,6 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
}
}
- private ProcessInfoSnapshot getProcessInfoSnapshot() {
- ProcessInfoSnapshot processInfoSnapshot = (processInfo == null) ? null : processInfo.freshSnapshot();
- if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
- processInfo = getResourceContext().getNativeProcess();
- // Safe to get prior snapshot here, we've just recreated the process info instance
- processInfoSnapshot = (processInfo == null) ? null : processInfo.priorSnaphot();
- }
- return processInfoSnapshot;
- }
-
@Override
public OperationResult invokeOperation(String name, Configuration parameters) throws Exception {
if (name.equals("shutdown")) {
@@ -212,23 +202,6 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
return null;
}
- private void waitForNodeToGoDown() throws InterruptedException {
- for (ProcessInfoSnapshot processInfoSnapshot = getProcessInfoSnapshot();; processInfoSnapshot = getProcessInfoSnapshot()) {
- if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
- // Process not found, so it died, that's fine
- // OR
- // Process info says process is no longer running, that's fine as well
- break;
- }
- if (getResourceContext().getComponentInvocationContext().isInterrupted()) {
- // Operation canceled or timed out
- throw new InterruptedException();
- }
- // Process is still running, wait a second and check again
- Thread.sleep(SECONDS.toMillis(1));
- }
- }
-
@SuppressWarnings("rawtypes")
protected OperationResult shutdownNode() {
ResourceContext<?> context = getResourceContext();
@@ -292,21 +265,19 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
}
}
-
protected OperationResult startNode() {
- ResourceContext<?> context = getResourceContext();
- Configuration pluginConfig = context.getPluginConfiguration();
+ Configuration pluginConfig = getResourceContext().getPluginConfiguration();
String baseDir = pluginConfig.getSimpleValue("baseDir");
File binDir = new File(baseDir, "bin");
- File startScript = new File(binDir, getStartScript());
- File pidFile = new File(binDir, "cassandra.pid");
-
- ProcessExecution scriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
- scriptExe.addArguments(asList("-p", pidFile.getAbsolutePath()));
- SystemInfo systemInfo = context.getSystemInformation();
+ if (!startScriptExists(binDir)) {
+ OperationResult failure = new OperationResult("Failed to start Cassandra daemon");
+ failure.setErrorMessage("Start script does not exists");
+ return failure;
+ }
+ ProcessExecution scriptExe = getProcessExecution(binDir);
+ SystemInfo systemInfo = getResourceContext().getSystemInformation();
ProcessExecutionResults results = systemInfo.executeProcess(scriptExe);
-
- if (results.getError() == null) {
+ if (results.getError() == null) {
return new OperationResult("Successfully started Cassandra daemon");
} else {
OperationResult failure = new OperationResult("Failed to start Cassandra daemon");
@@ -315,6 +286,30 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
}
}
+ private boolean startScriptExists(File binDir) {
+ File file = new File(binDir, getStartScript());
+ return file.exists() && !file.isDirectory();
+ }
+
+ private ProcessExecution getProcessExecution(File binDir) {
+ ProcessExecution scriptExe;
+ if (OperatingSystem.getInstance().getName().equals(OperatingSystem.NAME_WIN32)) {
+ File startScript = new File(binDir, getStartScript());
+ scriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
+ } else {
+ // On Linux, when Cassandra is started with an absolute path, the command line is too long and is truncated
+ // in /proc/pid/cmdline (beacuse of a long CLASSPATH made of absolute paths)
+ // This prevents the process from being later discovered because the process query argument criteria
+ // expects org.apache.cassandra.service.CassandraDaemon to be found
+ File startScript = new File("./" + getStartScript());
+ scriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
+ scriptExe.setCheckExecutableExists(false);
+ }
+ scriptExe.setWorkingDirectory(binDir.getAbsolutePath());
+ scriptExe.addArguments(asList("-p", "cassandra.pid"));
+ return scriptExe;
+ }
+
protected OperationResult restartNode() {
OperationResult result = shutdownNode();
diff --git a/modules/plugins/rhq-storage/pom.xml b/modules/plugins/rhq-storage/pom.xml
index b1d50b8..ab97902 100644
--- a/modules/plugins/rhq-storage/pom.xml
+++ b/modules/plugins/rhq-storage/pom.xml
@@ -121,21 +121,27 @@
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.13</version>
+ <configuration>
+ <includes>
+ <include>**/*ITest.java</include>
+ </includes>
+ <argLine>-Djava.library.path=${pc.lib.dir}</argLine>
+ <systemPropertyVariables>
+ <pc.plugins.dir>${pc.plugins.dir}</pc.plugins.dir>
+ </systemPropertyVariables>
+ <properties>
+ <property>
+ <name>listener</name>
+ <value>org.rhq.test.testng.StdoutReporter</value>
+ </property>
+ </properties>
+ </configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
- <configuration>
- <includes>
- <include>**/*ITest.java</include>
- </includes>
- <argLine>-Djava.library.path=${pc.lib.dir}</argLine>
- <systemPropertyVariables>
- <pc.plugins.dir>${pc.plugins.dir}</pc.plugins.dir>
- </systemPropertyVariables>
- </configuration>
</execution>
<execution>
<id>verify</id>
@@ -155,6 +161,12 @@
<excludes>
<exclude>**/*ITest.java</exclude>
</excludes>
+ <properties>
+ <property>
+ <name>listener</name>
+ <value>org.rhq.test.testng.StdoutReporter</value>
+ </property>
+ </properties>
</configuration>
</plugin>
</plugins>
diff --git a/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java b/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
index 5bc8b31..f0744a4 100644
--- a/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
+++ b/modules/plugins/rhq-storage/src/test/java/org/rhq/plugins/storage/StorageNodeComponentITest.java
@@ -31,6 +31,7 @@ import java.util.Set;
import com.google.common.collect.Sets;
+import org.hyperic.sigar.OperatingSystem;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
@@ -113,14 +114,8 @@ public class StorageNodeComponentITest {
File binDir = new File(basedir, "bin");
SystemInfo systemInfo = SystemInfoFactory.createSystemInfo();
- File startScript = new File("./cassandra");
- ProcessExecution startScriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
- startScriptExe.setWorkingDirectory(binDir.getAbsolutePath());
- startScriptExe.setCheckExecutableExists(false);
-
- startScriptExe.addArguments(asList("-p", "cassandra.pid"));
- startScriptExe.setCaptureOutput(true);
- ProcessExecutionResults results = systemInfo.executeProcess(startScriptExe);
+ ProcessExecution processExecution = getProcessExecution(binDir);
+ ProcessExecutionResults results = systemInfo.executeProcess(processExecution);
assertEquals(results.getExitCode(), (Integer) 0, "Cassandra failed to start: " + results.getCapturedOutput());
@@ -135,6 +130,22 @@ public class StorageNodeComponentITest {
schemaManager.updateTopology(true);
}
+ private ProcessExecution getProcessExecution(File binDir) {
+ ProcessExecution startScriptExe;
+ if (OperatingSystem.getInstance().getName().equals(OperatingSystem.NAME_WIN32)) {
+ File startScript = new File(binDir, "cassandra.bat");
+ startScriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
+ } else {
+ File startScript = new File("./cassandra");
+ startScriptExe = ProcessExecutionUtility.createProcessExecution(startScript);
+ startScriptExe.setCheckExecutableExists(false);
+ }
+ startScriptExe.setWorkingDirectory(binDir.getAbsolutePath());
+ startScriptExe.addArguments(asList("-p", "cassandra.pid"));
+ startScriptExe.setCaptureOutput(true);
+ return startScriptExe;
+ }
+
private void initPluginContainer() {
PluginContainerConfiguration pcConfig = new PluginContainerConfiguration();
File pluginsDir = new File(System.getProperty("pc.plugins.dir"));
10 years, 9 months
[rhq] modules/enterprise
by Thomas Segismont
modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml | 14 ++++++++++
1 file changed, 14 insertions(+)
New commits:
commit 17793afa6bd966d69b3198a936a2f0b0503e288b
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Jul 25 11:04:44 2013 +0200
Update intentional changes file (methods added in StorageNodeManagerRemote)
diff --git a/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml b/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml
index 26e9e95..44886b4 100644
--- a/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml
+++ b/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml
@@ -32,6 +32,20 @@
<difference>
<className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
<differenceType>7012</differenceType> <!-- method added to an interface -->
+ <method>org.rhq.core.domain.cloud.StorageNodeConfigurationComposite retrieveConfiguration(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
+ <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
+ </difference>
+
+ <difference>
+ <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
+ <differenceType>7012</differenceType> <!-- method added to an interface -->
+ <method>boolean updateConfiguration(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNodeConfigurationComposite)</method>
+ <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
+ </difference>
+
+ <difference>
+ <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
+ <differenceType>7012</differenceType> <!-- method added to an interface -->
<method>org.rhq.core.domain.util.PageList findNotAcknowledgedStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
<justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
</difference>
10 years, 9 months
[rhq] modules/enterprise
by Thomas Segismont
modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml | 14 ++++++++++
1 file changed, 14 insertions(+)
New commits:
commit 600119036639c9e6bfb56a77f99c71d77d757646
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Thu Jul 25 09:44:45 2013 +0200
Update intentional changes file (methods added in StorageNodeManagerRemote)
diff --git a/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml b/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml
index 58c4eda..26e9e95 100644
--- a/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml
+++ b/modules/enterprise/server/jar/intentional-api-changes-since-4.8.0.xml
@@ -29,4 +29,18 @@
<justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
</difference>
+ <difference>
+ <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
+ <differenceType>7012</differenceType> <!-- method added to an interface -->
+ <method>org.rhq.core.domain.util.PageList findNotAcknowledgedStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
+ <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
+ </difference>
+
+ <difference>
+ <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
+ <differenceType>7012</differenceType> <!-- method added to an interface -->
+ <method>org.rhq.core.domain.util.PageList findAllStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
+ <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
+ </difference>
+
</differences>
10 years, 9 months
[rhq] Branch 'mtho11/consolidated-metrics' - modules/enterprise
by mike thompson
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java | 12
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java | 269 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java | 36 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java | 2
5 files changed, 291 insertions(+), 30 deletions(-)
New commits:
commit b464215123d251133599eedd080e56723eb65b80
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Wed Jul 24 15:18:13 2013 -0700
Consolidated Metrics - Add to Dashboard - change to new AddToDashboardComponent.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
index 2075783..b4f1354 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/common/graph/ButtonBarDateTimeRangeEditor.java
@@ -77,7 +77,7 @@ public class ButtonBarDateTimeRangeEditor extends EnhancedVLayout {
prefs = measurementUserPreferences.getMetricRangePreferences();
Log.debug("ButtonBarDateTimeRangeEditor initialized with start Date: " + new Date(prefs.begin) + " end Date: "
+ new Date(prefs.end));
- createButtons();
+ //createButtons();
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
index 779f877..8ca1ac5 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/DashboardLinkUtility.java
@@ -143,7 +143,7 @@ public class DashboardLinkUtility {
});
- }//end dashboard iteration
+ }
//add new menu item for adding current graphable element to view if on Monitor/Graphs tab
String currentViewPath = History.getToken();
@@ -183,20 +183,20 @@ public class DashboardLinkUtility {
addNewMetric(String.valueOf(resource.getId()),
selectedView, resourceGraphElements);
} else {
- Log.trace("Error obtaining subject with id:" + sid);
+ Log.warn("DashboardLinkUtility: Error obtaining subject with id:" + sid);
}
}
public void onFailure(Throwable caught) {
- Log.trace("Error obtaining subject with id:" + sid, caught);
+ Log.warn("DashboardLinkUtility: Error obtaining subject with id:" + sid, caught);
}
});
}
}
});
- } // end add the "add to view" menu item
- }//end trait exclusion
- }//end measurement def iteration
+ }
+ }
+ }
}
});
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java
new file mode 100644
index 0000000..84e20eb
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/AddToDashboardComponent.java
@@ -0,0 +1,269 @@
+/*
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.table;
+
+import java.util.LinkedHashMap;
+
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.user.client.History;
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.widgets.IButton;
+import com.smartgwt.client.widgets.events.ClickEvent;
+import com.smartgwt.client.widgets.form.fields.SelectItem;
+import com.smartgwt.client.widgets.form.fields.events.ChangeEvent;
+import com.smartgwt.client.widgets.form.fields.events.ChangeHandler;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.menu.events.ClickHandler;
+import com.smartgwt.client.widgets.menu.events.MenuItemClickEvent;
+import com.smartgwt.client.widgets.toolbar.ToolStrip;
+
+import org.rhq.core.domain.configuration.PropertySimple;
+import org.rhq.core.domain.criteria.DashboardCriteria;
+import org.rhq.core.domain.dashboard.Dashboard;
+import org.rhq.core.domain.dashboard.DashboardPortlet;
+import org.rhq.core.domain.measurement.MeasurementDefinition;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
+import org.rhq.core.domain.resource.Resource;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.dashboard.portlets.inventory.resource.graph.ResourceD3GraphPortlet;
+import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
+import org.rhq.enterprise.gui.coregui.client.util.Log;
+import org.rhq.enterprise.gui.coregui.client.util.enhanced.Enhanced;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
+
+/**
+ * @author Mike Thompson
+ */
+public class AddToDashboardComponent extends ToolStrip implements Enhanced {
+ final private Resource resource;
+ private SelectItem dashboardSelectItem;
+ private Dashboard selectedDashboard;
+ private IButton addToDashboardButton;
+ private LinkedHashMap<String, String> dashboardMenuMap;
+ private LinkedHashMap<Integer, Dashboard> dashboardMap;
+ private MetricsTableView.MetricsTableListGrid metricsListGrid;
+
+ public AddToDashboardComponent(Resource resource) {
+ this.resource = resource;
+ setPadding(5);
+ setMembersMargin(15);
+ setWidth(400);
+ dashboardMenuMap = new LinkedHashMap<String, String>();
+ dashboardMap = new LinkedHashMap<Integer, Dashboard>();
+ }
+
+ @Override
+ protected void onDraw() {
+ super.onDraw();
+ removeMembers(getMembers());
+ createToolstrip();
+ }
+
+ private void createToolstrip() {
+ addSpacer(15);
+ dashboardSelectItem = new SelectItem();
+ addToDashboardButton = new IButton(MSG.view_metric_addToDashboard());
+
+ dashboardSelectItem = new SelectItem();
+ dashboardSelectItem.setTitle("Dashboards");
+ dashboardSelectItem.setWidth(350);
+ dashboardSelectItem.setPickListWidth(250);
+ populateDashboardMenu();
+ addFormItem(dashboardSelectItem);
+ addMember(addToDashboardButton);
+
+ dashboardSelectItem.addChangeHandler(new ChangeHandler() {
+ @Override
+ public void onChange(ChangeEvent changeEvent) {
+ Integer selectedDashboardId = Integer.valueOf((String) changeEvent.getValue());
+ selectedDashboard = dashboardMap.get(selectedDashboardId);
+ }
+ });
+ addToDashboardButton.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {
+ @Override
+ public void onClick(ClickEvent clickEvent) {
+ ListGridRecord[] selectedRecords = metricsListGrid.getSelectedRecords();
+ for (ListGridRecord selectedRecord : selectedRecords) {
+ for (MeasurementDefinition measurementDefinition : resource.getResourceType().getMetricDefinitions()) {
+ if(measurementDefinition.getId() == selectedRecord.getAttributeAsInt(MetricsViewDataSource.FIELD_METRIC_DEF_ID)){
+ Log.debug("**Add to Dashboard -- Storing: "+measurementDefinition.getDisplayName() +" in "+ selectedDashboard.getName());
+ storeDashboardMetric(selectedDashboard,resource,measurementDefinition);
+ break;
+ }
+ }
+ }
+ }
+ });
+ }
+
+ public void populateDashboardMenu() {
+ dashboardMenuMap.clear();
+ dashboardMap.clear();
+
+ DashboardCriteria criteria = new DashboardCriteria();
+ GWTServiceLookup.getDashboardService().findDashboardsByCriteria(criteria,
+ new AsyncCallback<PageList<Dashboard>>() {
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_loadFailed_dashboard(),
+ caught);
+ }
+
+ public void onSuccess(PageList<Dashboard> dashboards) {
+ for (final Dashboard dashboard : dashboards) {
+ dashboardMenuMap.put(String.valueOf(dashboard.getId()),
+ MSG.view_tree_common_contextMenu_addChartToDashboard(dashboard.getName()));
+ dashboardMap.put(dashboard.getId(), dashboard);
+ dashboardSelectItem.setValueMap(dashboardMenuMap);
+ }
+ }
+ });
+ }
+
+ /**
+ * The metrics list grid is not available on object creation so we must attach later after it has been initialized.
+ * @param metricsListGrid
+ */
+ public void setMetricsListGrid(MetricsTableView.MetricsTableListGrid metricsListGrid) {
+ this.metricsListGrid = metricsListGrid;
+ }
+
+ /** Locate the specific schedule definition using the definition identifier.
+ */
+ private static int getScheduleDefinitionId(Resource resource, int definitionId) {
+ int id = -1;
+ if (resource.getSchedules() != null) {
+ boolean located = false;
+ MeasurementSchedule[] schedules = new MeasurementSchedule[resource.getSchedules().size()];
+ resource.getSchedules().toArray(schedules);
+ for (int i = 0; (!located && i < resource.getSchedules().size()); i++) {
+ MeasurementSchedule schedule = schedules[i];
+ MeasurementDefinition definition = schedule.getDefinition();
+ if ((definition != null) && definition.getId() == definitionId) {
+ located = true;
+ id = schedule.getId();
+ }
+ }
+ }
+ return id;
+ }
+
+ private void storeDashboardMetric(Dashboard dashboard, Resource resource, MeasurementDefinition definition) {
+ DashboardPortlet dashboardPortlet = new DashboardPortlet(MSG.view_tree_common_contextMenu_resourceGraph(),
+ ResourceD3GraphPortlet.KEY, 250);
+ dashboardPortlet.getConfiguration().put(
+ new PropertySimple(ResourceD3GraphPortlet.CFG_RESOURCE_ID, resource.getId()));
+ dashboardPortlet.getConfiguration().put(
+ new PropertySimple(ResourceD3GraphPortlet.CFG_DEFINITION_ID, definition.getId()));
+
+ dashboard.addPortlet(dashboardPortlet);
+
+ GWTServiceLookup.getDashboardService().storeDashboard(dashboard, new AsyncCallback<Dashboard>() {
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(),
+ caught);
+ }
+
+ public void onSuccess(Dashboard result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_tree_common_contextMenu_saveChartToDashboardSuccessful(result.getName()),
+ Message.Severity.Info));
+ }
+ });
+ }
+
+ private static void addNewMetric(String id, String selectedView, String resourceGraphElements) {
+ //construct portal.war url to access
+ String baseUrl = "/resource/common/monitor/visibility/IndicatorCharts.do";
+ baseUrl += "?id=" + id;
+ baseUrl += "&view=" + selectedView;
+ baseUrl += "&action=addChart&metric=" + resourceGraphElements;
+ final String url = baseUrl;
+ //initiate HTTP request
+ final RequestBuilder b = new RequestBuilder(RequestBuilder.GET, baseUrl);
+
+ try {
+ b.setCallback(new RequestCallback() {
+ public void onResponseReceived(final Request request, final Response response) {
+ Log.trace("Successfully submitted request to add graph to view:" + url);
+
+ //kick off a page reload.
+ String currentViewPath = History.getToken();
+ CoreGUI.goToView(currentViewPath, true);
+ }
+
+ @Override
+ public void onError(Request request, Throwable t) {
+ Log.warn("Error adding Metric:" + url, t);
+ }
+ });
+ b.send();
+ } catch (RequestException e) {
+ Log.warn("Error adding Metric:" + url, e);
+ }
+
+ }
+
+ private static class AddToDashboardClickHandler implements ClickHandler {
+
+ private final Resource resource;
+ private final MeasurementDefinition definition;
+ private final Dashboard dashboard;
+
+ public AddToDashboardClickHandler(Resource resource, MeasurementDefinition definition, Dashboard dashboard) {
+ this.resource = resource;
+ this.definition = definition;
+ this.dashboard = dashboard;
+ }
+
+ public void onClick(MenuItemClickEvent menuItemClickEvent) {
+ DashboardPortlet dashboardPortlet = new DashboardPortlet(MSG.view_tree_common_contextMenu_resourceGraph(),
+ ResourceD3GraphPortlet.KEY, 250);
+ dashboardPortlet.getConfiguration().put(
+ new PropertySimple(ResourceD3GraphPortlet.CFG_RESOURCE_ID, resource.getId()));
+ dashboardPortlet.getConfiguration().put(
+ new PropertySimple(ResourceD3GraphPortlet.CFG_DEFINITION_ID, definition.getId()));
+
+ dashboard.addPortlet(dashboardPortlet);
+
+ GWTServiceLookup.getDashboardService().storeDashboard(dashboard, new AsyncCallback<Dashboard>() {
+
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(
+ MSG.view_tree_common_contextMenu_saveChartToDashboardFailure(), caught);
+ }
+
+ public void onSuccess(Dashboard result) {
+ CoreGUI.getMessageCenter().notify(
+ new Message(MSG.view_tree_common_contextMenu_saveChartToDashboardSuccessful(result.getName()),
+ Message.Severity.Info));
+ }
+ });
+
+ }
+
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
index 010e06f..a4b15d1 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsTableView.java
@@ -49,7 +49,6 @@ import com.smartgwt.client.widgets.grid.events.RecordExpandHandler;
import com.smartgwt.client.widgets.grid.events.SortChangedHandler;
import com.smartgwt.client.widgets.grid.events.SortEvent;
import com.smartgwt.client.widgets.layout.VLayout;
-import com.smartgwt.client.widgets.menu.Menu;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDefinition;
@@ -65,7 +64,6 @@ import org.rhq.enterprise.gui.coregui.client.inventory.common.AbstractD3GraphLis
import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.MetricGraphData;
import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.RedrawGraphs;
import org.rhq.enterprise.gui.coregui.client.inventory.common.graph.graphtype.StackedBarMetricGraphImpl;
-import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.DashboardLinkUtility;
import org.rhq.enterprise.gui.coregui.client.inventory.resource.detail.monitoring.MetricD3Graph;
import org.rhq.enterprise.gui.coregui.client.util.BrowserUtility;
import org.rhq.enterprise.gui.coregui.client.util.Log;
@@ -84,7 +82,8 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
private final AbstractD3GraphListView abstractD3GraphListView;
private final MeasurementUserPreferences measurementUserPrefs;
- private final Menu addToDashboardMenu;
+ private final AddToDashboardComponent addToDashboardComponent;
+ private MetricsTableListGrid metricsTableListGrid;
Set<Integer> expandedRows = new HashSet<Integer>();
@@ -92,12 +91,9 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
super();
this.resource = resource;
this.abstractD3GraphListView = abstractD3GraphListView;
- setDataSource(new MetricsViewDataSource(resource));
- addToDashboardMenu = new Menu();
- addToDashboardMenu.setWidth(200);
- addToDashboardMenu.setItems(DashboardLinkUtility.buildMetricsMenu(resource.getResourceType(), resource,
- MSG.view_metric_addToDashboard()));
measurementUserPrefs = new MeasurementUserPreferences(UserSessionManager.getUserPreferences());
+ setDataSource(new MetricsViewDataSource(resource));
+ addToDashboardComponent = new AddToDashboardComponent(resource);
}
/**
@@ -108,7 +104,9 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
*/
@Override
protected ListGrid createListGrid() {
- return new MetricsTableListGrid(this, resource, addToDashboardMenu);
+ metricsTableListGrid = new MetricsTableListGrid(this, resource);
+ addToDashboardComponent.setMetricsListGrid(metricsTableListGrid);
+ return metricsTableListGrid;
}
protected void configureTable() {
@@ -116,8 +114,7 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
setListGridFields(fields.toArray(new ListGridField[0]));
addTableAction(MSG.view_measureTable_getLive(), new ShowLiveDataTableAction(this));
- //addExtraWidget(addToDashboardMenu, false);
-
+ addExtraWidget(addToDashboardComponent, false);
}
private static class ShowLiveDataTableAction implements TableAction {
@@ -251,20 +248,16 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
}
- private class MetricsTableListGrid extends ListGrid {
+ public class MetricsTableListGrid extends ListGrid {
private static final int TREEVIEW_DETAIL_CHART_HEIGHT = 205;
private static final int NUM_METRIC_POINTS = 60;
private Resource resource;
- final private Menu addToDashboardMenu;
final MetricsTableView metricsTableView;
- public MetricsTableListGrid(final MetricsTableView metricsTableView, final Resource resource,
- final Menu dashboardMenu) {
+ public MetricsTableListGrid(final MetricsTableView metricsTableView, final Resource resource) {
super();
this.resource = resource;
- this.addToDashboardMenu = dashboardMenu;
- this.addToDashboardMenu.disable();
this.metricsTableView = metricsTableView;
setCanExpandRecords(true);
setCanExpandMultipleRecords(true);
@@ -299,8 +292,9 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
int startRow = dataArrivedEvent.getStartRow();
int endRow = dataArrivedEvent.getEndRow();
for (int i = startRow; i < endRow; i++) {
- if (metricsTableView.expandedRows.contains(getRecord(i).getAttributeAsInt(
- MetricsViewDataSource.FIELD_METRIC_DEF_ID))) {
+ if (null != metricsTableView.expandedRows
+ && metricsTableView.expandedRows.contains(getRecord(i).getAttributeAsInt(
+ MetricsViewDataSource.FIELD_METRIC_DEF_ID))) {
expandRecord(getRecord(i));
}
}
@@ -309,7 +303,6 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
}
-
@Override
protected Canvas getExpansionComponent(final ListGridRecord record) {
final Integer definitionId = record.getAttributeAsInt(MetricsViewDataSource.FIELD_METRIC_DEF_ID);
@@ -318,7 +311,6 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
vLayout.setPadding(5);
final String chartId = "rChart-" + resourceId + "-" + definitionId;
- Log.debug("getExpansionComponent for: " + chartId);
HTMLFlow htmlFlow = new HTMLFlow(MetricD3Graph.createGraphMarkerTemplate(chartId,
TREEVIEW_DETAIL_CHART_HEIGHT));
vLayout.addMember(htmlFlow);
@@ -331,7 +323,7 @@ public class MetricsTableView extends Table<MetricsViewDataSource> implements Re
new AsyncCallback<List<List<MeasurementDataNumericHighLowComposite>>>() {
@Override
public void onFailure(Throwable caught) {
- Log.debug("Error retrieving recent metrics charting data for resource [" + resourceId + "]:"
+ Log.warn("Error retrieving recent metrics charting data for resource [" + resourceId + "]:"
+ caught.getMessage());
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
index fbb9bff..5c2fe25 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/monitoring/table/MetricsViewDataSource.java
@@ -296,7 +296,7 @@ public class MetricsViewDataSource extends RPCDataSource<MetricDisplaySummary, C
@Override
public void onSuccess(List<List<MeasurementDataNumericHighLowComposite>> measurementDataList) {
- if (!measurementDataList.isEmpty()) {
+ if (null != measurementDataList && !measurementDataList.isEmpty()) {
metricsDataList = measurementDataList;
countDownLatch.countDown();
}
10 years, 9 months
[rhq] modules/plugins
by John Sanda
modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java | 52 ++++++++--
1 file changed, 46 insertions(+), 6 deletions(-)
New commits:
commit 067cb8cc2d2204e187f104ad7cb5b8de2220cc25
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed Jul 24 23:07:53 2013 -0400
do availability check via jmx
CassandraNodeComponent previously was doing availability checks at the process
level. Results were some times inconsistent in large part due to different
behaviors on different platforms. Doing a JMX check is a more representative
check since we perform most of the managemeent via JMX. It also eliminates any
platform-specific issues.
The check is done via a direct JMX connection instead of EMS to avoid the
caching issues with EMS that could yield inaccurate results.
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 c41e8e7..70ba4b2 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
@@ -35,6 +35,12 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Cluster.Builder;
import com.datastax.driver.core.Session;
@@ -131,10 +137,11 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
public AvailabilityType getAvailability() {
long start = System.nanoTime();
try {
- // Get a fresh snapshot of the process
- ProcessInfoSnapshot processInfoSnapshot = getProcessInfoSnapshot();
- return (processInfoSnapshot != null && processInfoSnapshot.isRunning()) ? AvailabilityType.UP
- : AvailabilityType.DOWN;
+ if (isStorageServiceReachable()) {
+ return AvailabilityType.UP;
+ }
+
+ return AvailabilityType.DOWN;
} finally {
long totalTimeMillis = NANOSECONDS.toMillis(System.nanoTime() - start);
if (LOG.isDebugEnabled()) {
@@ -146,6 +153,39 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
}
}
+ private boolean isStorageServiceReachable() {
+ JMXConnector connector = null;
+ try {
+ Configuration pluginConfig = getResourceContext().getPluginConfiguration();
+ String url = pluginConfig.getSimpleValue("connectorAddress");
+ JMXServiceURL serviceURL = new JMXServiceURL(url);
+ connector = JMXConnectorFactory.connect(serviceURL, null);
+
+ MBeanServerConnection serverConnection = connector.getMBeanServerConnection();
+ ObjectName storageService = new ObjectName("org.apache.cassandra.db:type=StorageService");
+
+ // query an attribute to make sure it is in fact available
+ serverConnection.getAttribute(storageService, "NativeTransportRunning");
+
+ return true;
+ } catch (Exception e) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Failed to make JMX connection to StorageService", e);
+ }
+ return false;
+ } finally {
+ if (connector != null) {
+ try {
+ connector.close();
+ } catch (IOException e) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("An error occurred closing the JMX connector", e);
+ }
+ }
+ }
+ }
+ }
+
private ProcessInfoSnapshot getProcessInfoSnapshot() {
ProcessInfoSnapshot processInfoSnapshot = (processInfo == null) ? null : processInfo.freshSnapshot();
if (processInfoSnapshot == null || !processInfoSnapshot.isRunning()) {
@@ -158,10 +198,8 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
@Override
public OperationResult invokeOperation(String name, Configuration parameters) throws Exception {
-
if (name.equals("shutdown")) {
OperationResult operationResult = shutdownNode();
- waitForNodeToGoDown();
return operationResult;
} else if (name.equals("start")) {
return startNode();
@@ -234,6 +272,8 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
long pid = process.getPid();
try {
+ getEmsConnection().close();
+
process.kill("KILL");
Configuration pluginConfig = getResourceContext().getPluginConfiguration();
10 years, 9 months
[rhq] Branch 'feature/bundle-group' - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/authz/Permission.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java | 99 +++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleBundleGroupSelector.java | 40 +++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java | 31 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java | 17 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupSelector.java | 83 ++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupsDataSource.java | 126 ++++++++++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java | 4
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java | 12
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 43 ++-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties | 43 ++-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 50 ++-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 41 ++-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties | 45 ++-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 43 ++-
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties | 28 ++
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 43 ++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 12
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java | 4
19 files changed, 681 insertions(+), 91 deletions(-)
New commits:
commit 8dfcad9d2bdb3138651e19e65e784c999106a5d6
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Wed Jul 24 17:28:38 2013 -0400
Work in progress - getting new bundle perms integrated into role views
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Permission.java b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Permission.java
index 40e3150..5b009b5 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Permission.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/authz/Permission.java
@@ -145,15 +145,15 @@ public enum Permission {
/**
* Can create Bundle [Versions]s
+ * Can assign to viewable bundle groups
* Can create global Bundle [Versions] if holding Global.VIEW_BUNDLES
- * Can assign to viewable bundle groups
*/
CREATE_BUNDLES(Target.GLOBAL), // 19
/**
- * Can delete bundle [Versions]s from viewable groups
+ * Can delete viewable bundle [Versions]s
+ * Can unassign from viewable bundle groups
* Can delete global bundles if holding Global.VIEW_BUNDLES
- * Can unassign from viewable bundle groups
*/
DELETE_BUNDLES(Target.GLOBAL), // 20
@@ -188,7 +188,7 @@ public enum Permission {
/**
* Can delete bundle [version]s from the bundle group
*/
- DELETE_BUNDLES_IN_GROUP(Target.BUNDLE), // 26
+ DELETE_BUNDLES_FROM_GROUP(Target.BUNDLE), // 26
/**
* Implied - Can view bundles in the bundle group
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java
index d949617..cde2c6d 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java
@@ -48,8 +48,8 @@ import org.rhq.core.domain.authz.Role;
import org.rhq.core.domain.common.ProductInfo;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.Messages;
-import org.rhq.enterprise.gui.coregui.client.util.message.Message;
import org.rhq.enterprise.gui.coregui.client.util.enhanced.EnhancedVStack;
+import org.rhq.enterprise.gui.coregui.client.util.message.Message;
/**
* An editor for editing the set of RHQ {@link Permission permission}s associated with an RHQ {@link Role role}.
@@ -62,6 +62,7 @@ public class PermissionsEditor extends EnhancedVStack {
private ListGrid globalPermissionsGrid;
private ListGrid resourcePermissionsGrid;
+ private ListGrid bundleGroupPermissionsGrid;
private Set<Permission> selectedPermissions;
private RoleEditView roleEditView;
private boolean isReadOnly;
@@ -99,6 +100,10 @@ public class PermissionsEditor extends EnhancedVStack {
this.resourcePermissionsGrid = createResourcePermissionsGrid();
addMember(this.resourcePermissionsGrid);
+
+ this.bundleGroupPermissionsGrid = createBundleGroupPermissionsGrid();
+ addMember(this.bundleGroupPermissionsGrid);
+
}
public void reset() {
@@ -162,31 +167,57 @@ public class PermissionsEditor extends EnhancedVStack {
grid.setFields(iconField, displayNameField, authorizedField, descriptionField);
List<ListGridRecord> records = new ArrayList<ListGridRecord>();
- ListGridRecord record = createGlobalPermissionRecord(MSG.view_adminRoles_permissions_perm_manageSecurity(),
+ ListGridRecord record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_manageSecurity(),
"global/Locked", Permission.MANAGE_SECURITY, MSG.view_adminRoles_permissions_permDesc_manageSecurity());
records.add(record);
- record = createGlobalPermissionRecord(MSG.view_adminRoles_permissions_perm_manageInventory(),
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_manageInventory(),
"subsystems/inventory/Inventory", Permission.MANAGE_INVENTORY,
MSG.view_adminRoles_permissions_permDesc_manageInventory());
records.add(record);
- record = createGlobalPermissionRecord(MSG.view_adminRoles_permissions_perm_manageSettings(),
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_manageSettings(),
"subsystems/configure/Configure", Permission.MANAGE_SETTINGS,
MSG.view_adminRoles_permissions_permDesc_manageSettings(productInfo.getShortName()));
records.add(record);
- record = createGlobalPermissionRecord(MSG.view_adminRoles_permissions_perm_manageBundles(),
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_manageRepositories(),
+ "subsystems/content/Content", Permission.MANAGE_REPOSITORIES,
+ MSG.view_adminRoles_permissions_permDesc_manageRepositories());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_manageBundles(),
"subsystems/bundle/Bundle", Permission.MANAGE_BUNDLE,
MSG.view_adminRoles_permissions_permDesc_manageBundles());
records.add(record);
- record = createGlobalPermissionRecord(MSG.view_adminRoles_permissions_perm_manageRepositories(),
- "subsystems/content/Content", Permission.MANAGE_REPOSITORIES,
- MSG.view_adminRoles_permissions_permDesc_manageRepositories());
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_manageBundleGroups(),
+ "subsystems/content/Content", Permission.MANAGE_BUNDLE_GROUPS,
+ MSG.view_adminRoles_permissions_permDesc_manageBundleGroups());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_createBundles(),
+ "subsystems/content/Content", Permission.CREATE_BUNDLES,
+ MSG.view_adminRoles_permissions_permDesc_createBundles());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_deleteBundles(),
+ "subsystems/content/Content", Permission.DELETE_BUNDLES,
+ MSG.view_adminRoles_permissions_permDesc_deleteBundles());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_viewBundles(),
+ "subsystems/content/Content", Permission.VIEW_BUNDLES,
+ MSG.view_adminRoles_permissions_permDesc_viewBundles());
records.add(record);
- record = createGlobalPermissionRecord(MSG.view_adminRoles_permissions_perm_viewUsers(), "global/User",
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_deployBundles(),
+ "subsystems/content/Content", Permission.DEPLOY_BUNDLES,
+ MSG.view_adminRoles_permissions_permDesc_deployBundles());
+ records.add(record);
+
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_viewUsers(), "global/User",
Permission.VIEW_USERS, MSG.view_adminRoles_permissions_permDesc_viewUsers());
records.add(record);
@@ -280,6 +311,54 @@ public class PermissionsEditor extends EnhancedVStack {
return grid;
}
+ private ListGrid createBundleGroupPermissionsGrid() {
+ ListGrid grid = createPermissionsGrid();
+ // TODO: Add table title.
+
+ ListGridField iconField = createIconField();
+
+ ListGridField displayNameField = new ListGridField("displayName", MSG.common_title_name(), 130);
+
+ ListGridField descriptionField = new ListGridField("description", MSG.common_title_description());
+ descriptionField.setWrap(true);
+
+ final ListGridField authorizedField = createAuthorizedField("authorized",
+ MSG.view_adminRoles_permissions_isAuthorized(), "name", grid, false);
+
+ grid.setFields(iconField, displayNameField, authorizedField, descriptionField);
+
+ List<ListGridRecord> records = new ArrayList<ListGridRecord>();
+
+ ListGridRecord record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_assignBundlesToGroup(),
+ "subsystems/bundle/Bundle", Permission.ASSIGN_BUNDLES_TO_GROUP,
+ MSG.view_adminRoles_permissions_permDesc_assignBundlesToGroup());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_unassignBundlesFromGroup(),
+ "subsystems/bundle/Bundle", Permission.UNASSIGN_BUNDLES_FROM_GROUP,
+ MSG.view_adminRoles_permissions_permDesc_unassignBundlesFromGroup());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_createBundlesInGroup(),
+ "subsystems/bundle/Bundle", Permission.CREATE_BUNDLES_IN_GROUP,
+ MSG.view_adminRoles_permissions_permDesc_createBundlesInGroup());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_deleteBundlesFromGroup(),
+ "subsystems/bundle/Bundle", Permission.DELETE_BUNDLES_FROM_GROUP,
+ MSG.view_adminRoles_permissions_permDesc_deleteBundlesFromGroup());
+ records.add(record);
+
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_viewBundlesInGroup(),
+ "subsystems/bundle/Bundle", Permission.VIEW_BUNDLES_IN_GROUP,
+ MSG.view_adminRoles_permissions_permDesc_viewBundlesInGroup());
+ records.add(record);
+
+ grid.setData(records.toArray(new ListGridRecord[records.size()]));
+
+ return grid;
+ }
+
private ListGridField createIconField() {
ListGridField iconField = new ListGridField("icon", " ", 28);
iconField.setShowDefaultContextMenu(false);
@@ -420,7 +499,7 @@ public class PermissionsEditor extends EnhancedVStack {
}
}
- private ListGridRecord createGlobalPermissionRecord(String displayName, String icon, Permission globalPermission,
+ private ListGridRecord createPermissionRecord(String displayName, String icon, Permission globalPermission,
String description) {
ListGridRecord record = new ListGridRecord();
record.setAttribute("displayName", displayName);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleBundleGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleBundleGroupSelector.java
new file mode 100644
index 0000000..e3876ca
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleBundleGroupSelector.java
@@ -0,0 +1,40 @@
+/*
+ * 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, 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.gui.coregui.client.admin.roles;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.enterprise.gui.coregui.client.bundle.group.BundleGroupSelector;
+
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class RoleBundleGroupSelector extends BundleGroupSelector {
+
+ public RoleBundleGroupSelector(ListGridRecord[] bundleGroupRecords, boolean isReadOnly) {
+ super(isReadOnly);
+
+ setAssigned(bundleGroupRecords);
+ }
+
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
index 941c7ee..63b6e3f 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RoleEditView.java
@@ -46,6 +46,7 @@ import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
import org.rhq.enterprise.gui.coregui.client.UserSessionManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
+import org.rhq.enterprise.gui.coregui.client.bundle.group.BundleGroupSelector;
import org.rhq.enterprise.gui.coregui.client.components.form.AbstractRecordEditor;
import org.rhq.enterprise.gui.coregui.client.components.form.EnhancedDynamicForm;
import org.rhq.enterprise.gui.coregui.client.components.selector.AssignedItemsChangedEvent;
@@ -75,6 +76,9 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
private Tab ldapGroupsTab;
private RoleLdapGroupSelector ldapGroupSelector;
+ private Tab bundleGroupsTab;
+ private BundleGroupSelector bundleGroupSelector;
+
private boolean hasManageSecurityPermission;
private boolean isLdapConfigured;
private boolean isSystemRole;
@@ -161,6 +165,9 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
if (!this.isSystemRole) {
this.resourceGroupsTab = buildResourceGroupsTab(tabSet);
tabSet.addTab(resourceGroupsTab);
+
+ this.bundleGroupsTab = buildBundleGroupsTab(tabSet);
+ tabSet.addTab(bundleGroupsTab);
}
this.subjectsTab = buildSubjectsTab(tabSet);
@@ -189,6 +196,13 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
return tab;
}
+ private Tab buildBundleGroupsTab(TabSet tabSet) {
+ Tab tab = new Tab(MSG.common_title_bundleGroups(), ImageManager.getBundleIcon());
+ // NOTE: We will set the tab content to the bundle group selector later once the Role has been fetched.
+
+ return tab;
+ }
+
private Tab buildSubjectsTab(TabSet tabSet) {
Tab tab = new Tab(MSG.common_title_users(), "global/User_16.png");
// NOTE: We will set the tab content to the subject selector later once the Role has been fetched.
@@ -244,6 +258,18 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
}
});
updateTab(this.resourceGroupsTab, this.resourceGroupSelector);
+
+ Record[] bundleGroupRecords = record.getAttributeAsRecordArray(RolesDataSource.Field.BUNDLE_GROUPS);
+ ListGridRecord[] bundleGroupListGridRecords = toListGridRecordArray(bundleGroupRecords);
+ this.bundleGroupSelector = new RoleBundleGroupSelector(bundleGroupListGridRecords,
+ !this.hasManageSecurityPermission);
+ this.bundleGroupSelector.addAssignedItemsChangedHandler(new AssignedItemsChangedHandler() {
+ public void onSelectionChanged(AssignedItemsChangedEvent event) {
+ onItemChanged();
+ }
+ });
+ updateTab(this.resourceGroupsTab, this.resourceGroupSelector);
+
}
ListGridRecord[] subjectListGridRecords = toListGridRecordArray(subjectRecords);
@@ -341,6 +367,11 @@ public class RoleEditView extends AbstractRecordEditor<RolesDataSource> implemen
getForm().setValue(RolesDataSource.Field.LDAP_GROUPS, ldapGroupRecords);
}
+ if (this.bundleGroupSelector != null) {
+ ListGridRecord[] bundleGroupRecords = this.bundleGroupSelector.getSelectedRecords();
+ getForm().setValue(RolesDataSource.Field.BUNDLE_GROUPS, bundleGroupRecords);
+ }
+
// Submit the form values to the datasource.
super.save(requestProperties);
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
index b454fad..047dacc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/RolesDataSource.java
@@ -37,11 +37,13 @@ import com.smartgwt.client.widgets.grid.ListGridRecord;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
import org.rhq.core.domain.authz.Role;
+import org.rhq.core.domain.bundle.BundleGroup;
import org.rhq.core.domain.criteria.RoleCriteria;
import org.rhq.core.domain.resource.group.LdapGroup;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.admin.users.UsersDataSource;
+import org.rhq.enterprise.gui.coregui.client.bundle.group.BundleGroupsDataSource;
import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup;
import org.rhq.enterprise.gui.coregui.client.gwt.RoleGWTServiceAsync;
import org.rhq.enterprise.gui.coregui.client.inventory.groups.ResourceGroupsDataSource;
@@ -61,6 +63,7 @@ public class RolesDataSource extends RPCDataSource<Role, RoleCriteria> {
public static final String NAME = "name";
public static final String DESCRIPTION = "description";
public static final String RESOURCE_GROUPS = "resourceGroups";
+ public static final String BUNDLE_GROUPS = "bundleGroups";
public static final String PERMISSIONS = "permissions";
public static final String SUBJECTS = "subjects";
public static final String LDAP_GROUPS = "ldapGroups";
@@ -125,6 +128,10 @@ public class RolesDataSource extends RPCDataSource<Role, RoleCriteria> {
MSG.datasource_roles_field_ldapGroups());
fields.add(ldapGroupsField);
+ DataSourceField bundleGroupsField = new DataSourceField(Field.BUNDLE_GROUPS, FieldType.ANY,
+ MSG.common_title_bundleGroups());
+ fields.add(bundleGroupsField);
+
return fields;
}
@@ -223,6 +230,10 @@ public class RolesDataSource extends RPCDataSource<Role, RoleCriteria> {
Set<LdapGroup> ldapGroups = new RoleLdapGroupSelector.LdapGroupsDataSource().buildDataObjects(ldapGroupRecords);
to.setLdapGroups(ldapGroups);
+ Record[] bundleGroupRecords = from.getAttributeAsRecordArray(Field.BUNDLE_GROUPS);
+ Set<BundleGroup> bundleGroups = BundleGroupsDataSource.getInstance().buildDataObjects(bundleGroupRecords);
+ to.setBundleGroups(bundleGroups);
+
return to;
}
@@ -256,6 +267,12 @@ public class RolesDataSource extends RPCDataSource<Role, RoleCriteria> {
ListGridRecord[] ldapGroupRecords = new RoleLdapGroupSelector.LdapGroupsDataSource()
.buildRecords(ldapGroups);
targetRecord.setAttribute(Field.LDAP_GROUPS, ldapGroupRecords);
+
+ Set<BundleGroup> bundleGroups = sourceRole.getBundleGroups();
+ ListGridRecord[] bundleGroupRecords = BundleGroupsDataSource.getInstance()
+ .buildRecords(bundleGroups, false);
+ targetRecord.setAttribute(Field.BUNDLE_GROUPS, bundleGroupRecords);
+
}
return targetRecord;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupSelector.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupSelector.java
new file mode 100644
index 0000000..3a5c047
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupSelector.java
@@ -0,0 +1,83 @@
+/*
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.group;
+
+import com.smartgwt.client.data.Criteria;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.widgets.form.DynamicForm;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+
+import org.rhq.core.domain.bundle.BundleGroup;
+import org.rhq.core.domain.criteria.BundleGroupCriteria;
+import org.rhq.enterprise.gui.coregui.client.components.selector.AbstractSelector;
+import org.rhq.enterprise.gui.coregui.client.util.RPCDataSource;
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class BundleGroupSelector extends AbstractSelector<BundleGroup, BundleGroupCriteria> {
+
+
+ public BundleGroupSelector() {
+ this(false);
+ }
+
+ public BundleGroupSelector(boolean isReadOnly) {
+ super(isReadOnly);
+ }
+
+ protected DynamicForm getAvailableFilterForm() {
+ DynamicForm availableFilterForm = new DynamicForm();
+ availableFilterForm.setNumCols(4);
+ final TextItem search = new TextItem("search", MSG.common_title_search());
+
+ availableFilterForm.setItems(search);
+
+ return availableFilterForm;
+ }
+
+ protected RPCDataSource<BundleGroup, BundleGroupCriteria> getDataSource() {
+ return new SelectedBundleGroupsDataSource();
+ }
+
+ protected Criteria getLatestCriteria(DynamicForm availableFilterForm) {
+ String search = (String) availableFilterForm.getValue("search");
+
+ Criteria latestCriteria = new Criteria();
+ latestCriteria.addCriteria("search", search);
+
+ return latestCriteria;
+ }
+
+ @Override
+ protected String getItemTitle() {
+ return MSG.common_title_bundleGroups();
+ }
+
+ public class SelectedBundleGroupsDataSource extends BundleGroupsDataSource {
+ @Override
+ protected BundleGroupCriteria getFetchCriteria(final DSRequest request) {
+ BundleGroupCriteria result = super.getFetchCriteria(request);
+ if (null != result) {
+ result.setStrict(false);
+ }
+ return result;
+ }
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupsDataSource.java
new file mode 100644
index 0000000..4f76f06
--- /dev/null
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/group/BundleGroupsDataSource.java
@@ -0,0 +1,126 @@
+/*
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.gui.coregui.client.bundle.group;
+
+import java.util.List;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+import com.smartgwt.client.data.DSRequest;
+import com.smartgwt.client.data.DSResponse;
+import com.smartgwt.client.data.DataSourceField;
+import com.smartgwt.client.data.Record;
+import com.smartgwt.client.data.fields.DataSourceIntegerField;
+import com.smartgwt.client.data.fields.DataSourceTextField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+
+import org.rhq.core.domain.bundle.BundleGroup;
+import org.rhq.core.domain.criteria.BundleGroupCriteria;
+import org.rhq.core.domain.util.PageList;
+import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+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.util.RPCDataSource;
+
+/**
+ * @author Jay Shaughnessy
+ */
+public class BundleGroupsDataSource extends RPCDataSource<BundleGroup, BundleGroupCriteria> {
+
+ private BundleGWTServiceAsync bundleService = GWTServiceLookup.getBundleService();
+
+ private static BundleGroupsDataSource INSTANCE;
+
+ public static BundleGroupsDataSource getInstance() {
+ if (INSTANCE == null) {
+ INSTANCE = new BundleGroupsDataSource();
+ }
+ return INSTANCE;
+ }
+
+ public BundleGroupsDataSource() {
+ super();
+ List<DataSourceField> fields = addDataSourceFields();
+ addFields(fields);
+ }
+
+ @Override
+ protected List<DataSourceField> addDataSourceFields() {
+ List<DataSourceField> fields = super.addDataSourceFields();
+
+ DataSourceIntegerField idField = new DataSourceIntegerField("id", MSG.common_title_id());
+ idField.setPrimaryKey(true);
+ fields.add(idField);
+
+ DataSourceTextField nameField = new DataSourceTextField("name", MSG.common_title_name());
+ fields.add(nameField);
+
+ DataSourceTextField descriptionField = new DataSourceTextField("description", MSG.common_title_description());
+ fields.add(descriptionField);
+
+ return fields;
+ }
+
+ @Override
+ protected void executeFetch(final DSRequest request, final DSResponse response, final BundleGroupCriteria criteria) {
+ bundleService.findBundleGroupsByCriteria(criteria, new AsyncCallback<PageList<BundleGroup>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.dataSource_bundle_loadFailed(), caught);
+ response.setStatus(DSResponse.STATUS_FAILURE);
+ processResponse(request.getRequestId(), response);
+ }
+
+ public void onSuccess(PageList<BundleGroup> result) {
+ response.setData(buildRecords(result));
+ response.setTotalRows(result.getTotalSize());
+ processResponse(request.getRequestId(), response);
+ }
+ });
+ }
+
+ @Override
+ protected BundleGroupCriteria getFetchCriteria(final DSRequest request) {
+ BundleGroupCriteria criteria = new BundleGroupCriteria();
+ // may support tags in future, but not in rev1
+ //criteria.addFilterTagNamespace(getFilter(request, "tagNamespace", String.class));
+ //criteria.addFilterTagSemantic(getFilter(request, "tagSemantic", String.class));
+ //criteria.addFilterTagName(getFilter(request, "tagName", String.class));
+ //criteria.addFilterTagSemantic(getFilter(request, "tagSemantic", String.class));
+ criteria.addFilterName(getFilter(request, "search", String.class));
+
+ return criteria;
+ }
+
+ @Override
+ public BundleGroup copyValues(Record from) {
+ return (BundleGroup) from.getAttributeAsObject("object");
+ }
+
+ @Override
+ public ListGridRecord copyValues(BundleGroup from) {
+ ListGridRecord record = new ListGridRecord();
+
+ record.setAttribute("id", from.getId());
+ record.setAttribute("name", from.getName());
+ record.setAttribute("description", from.getDescription());
+
+ record.setAttribute("object", from);
+
+ return record;
+ }
+}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
index 54c3085..cd108b7 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/BundleGWTService.java
@@ -27,6 +27,7 @@ import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroup;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -37,6 +38,7 @@ import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleDestinationCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
+import org.rhq.core.domain.criteria.BundleGroupCriteria;
import org.rhq.core.domain.criteria.BundleResourceDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
@@ -70,6 +72,8 @@ public interface BundleGWTService extends RemoteService {
PageList<Bundle> findBundlesByCriteria(BundleCriteria criteria) throws RuntimeException;
+ PageList<BundleGroup> findBundleGroupsByCriteria(BundleGroupCriteria criteria) throws RuntimeException;
+
PageList<Bundle> findBundlesByCriteriaWithDestinationFilter(BundleCriteria criteria) throws RuntimeException;
PageList<BundleDeployment> findBundleDeploymentsByCriteria(BundleDeploymentCriteria criteria)
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
index e51383d..88458b8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/BundleGWTServiceImpl.java
@@ -25,6 +25,7 @@ import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroup;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -35,6 +36,7 @@ import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleDestinationCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
+import org.rhq.core.domain.criteria.BundleGroupCriteria;
import org.rhq.core.domain.criteria.BundleResourceDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
@@ -234,6 +236,16 @@ public class BundleGWTServiceImpl extends AbstractGWTServiceImpl implements Bund
}
@Override
+ public PageList<BundleGroup> findBundleGroupsByCriteria(BundleGroupCriteria criteria) throws RuntimeException {
+ try {
+ PageList<BundleGroup> results = bundleManager.findBundleGroupsByCriteria(getSessionSubject(), criteria);
+ return SerialUtility.prepare(results, "findBundleGroupsByCriteria");
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
+
+ @Override
public PageList<Bundle> findBundlesByCriteriaWithDestinationFilter(BundleCriteria criteria) throws RuntimeException {
try {
PageList<Bundle> results = bundleManager.findBundlesByCriteriaWithDestinationFilter(getSessionSubject(), criteria);
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 19d3fa5..1f9c73c 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
@@ -43,17 +43,6 @@ common_button_ack_all = Acknowledge All
common_button_add = Add
common_button_advanced = Advanced...
common_button_apply = Apply
-common_buttonbar_custom_window_title= Date Range
-common_buttonbar_custom_window_subtitle= Custom
-common_buttonbar_datetime_format= MM/dd/yyyy h:mm a
-common_buttonbar_datetime_format_moment_js= MM/DD/YYYY h:mm a
-common_buttonbar_end_date= End Date
-common_buttonbar_end_time= End Time
-common_buttonbar_start_date= Start Date
-common_buttonbar_start_time= Start Time
-common_buttonbar_custom = Custom...
-common_buttonbar_custom_cancel = Cancel
-common_buttonbar_custom_save = Save
common_button_cancel = Cancel
common_button_close = Close
common_button_compare = Compare
@@ -86,6 +75,17 @@ common_button_set = Set
common_button_showDetails = Show Details...
common_button_unignore = Unignore
common_button_uninventory = Uninventory
+common_buttonbar_custom = Custom...
+common_buttonbar_custom_cancel = Cancel
+common_buttonbar_custom_save = Save
+common_buttonbar_custom_window_subtitle = Custom
+common_buttonbar_custom_window_title = Date Range
+common_buttonbar_datetime_format = MM/dd/yyyy h:mm a
+common_buttonbar_datetime_format_moment_js = MM/DD/YYYY h:mm a
+common_buttonbar_end_date = End Date
+common_buttonbar_end_time = End Time
+common_buttonbar_start_date = Start Date
+common_buttonbar_start_time = Start Time
common_calendar_april_short = apr
common_calendar_august_short = aug
common_calendar_december_short = dec
@@ -158,6 +158,7 @@ common_title_available_resources = Available Resources
common_title_average_metrics = Average Metrics per Minute
common_title_background = Background
common_title_bundle = Bundle
+common_title_bundleGroups = Bundle Groups
common_title_bundles = Bundles
common_title_category = Category
common_title_change_refresh_time = Refresh Interval
@@ -511,11 +512,21 @@ view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0}
view_adminRoles_permissions_isAuthorized = Authorized?
view_adminRoles_permissions_isRead = Read?
view_adminRoles_permissions_isWrite = Write?
+view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
view_adminRoles_permissions_permDesc_manageInventory = has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; and can import auto-discovered or manually discovered Resources
view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
view_adminRoles_permissions_permDesc_manageSecurity = can create, update, or delete users and roles - implies all other permissions
view_adminRoles_permissions_permDesc_manageSettings = can modify the {0} Server configuration and perform any Server-related functionality
+view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
view_adminRoles_permissions_permDesc_viewUsers = can view other users, with the exception of their assigned roles
view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
view_adminRoles_permissions_permReadDesc_control = (IMPLIED) view available operations and operation execution history
@@ -537,12 +548,19 @@ view_adminRoles_permissions_permWriteDesc_manageContent = subscribe to content s
view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = delete events
view_adminRoles_permissions_permWriteDesc_manageMeasurements = update metric collection schedules
+view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = Configure
view_adminRoles_permissions_perm_control = Control
+view_adminRoles_permissions_perm_createBundles = Create Bundles
+view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = Create Child Resources
+view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
+view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = Inventory
view_adminRoles_permissions_perm_manageAlerts = Manage Alerts
+view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = Manage Bundles
view_adminRoles_permissions_perm_manageContent = Manage Content
view_adminRoles_permissions_perm_manageDrift = Manage Drift
@@ -552,6 +570,9 @@ view_adminRoles_permissions_perm_manageMeasurements = Manage Measurements
view_adminRoles_permissions_perm_manageRepositories = Manage Repositories
view_adminRoles_permissions_perm_manageSecurity = Manage Security
view_adminRoles_permissions_perm_manageSettings = Manage Settings
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+view_adminRoles_permissions_perm_viewBundles = View Bundles
+view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
view_adminRoles_permissions_perm_viewUsers = View Users
view_adminRoles_permissions_read = Read:
view_adminRoles_permissions_readAccessImplied = Read access for the {0} permission is implied and cannot be disabled.
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 f71f907..4e73829 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
@@ -66,17 +66,6 @@ common_button_ack_all = Potvrdit všechny
common_button_add = Přidat
common_button_advanced = Rozšířené...
common_button_apply = Použít
-##common_buttonbar_custom_window_title= Date Range
-##common_buttonbar_custom_window_subtitle= Custom
-common_buttonbar_datetime_format=dd.MM.yy hh:mm
-common_buttonbar_datetime_format_moment_js= DD.MM.YY HH:mm
-##common_buttonbar_end_date= End Date
-##common_buttonbar_end_time= End Time
-##common_buttonbar_start_date= Start Date
-##common_buttonbar_start_time= Start Time
-##common_buttonbar_custom = Custom...
-##common_buttonbar_custom_cancel = Cancel
-##common_buttonbar_custom_save = Save
common_button_cancel = Storno
common_button_close = Zavřít
common_button_compare = Porovnat
@@ -109,6 +98,17 @@ common_button_set = Nastavit
common_button_showDetails = Zobrazi detaily...
##common_button_unignore = Unignore
common_button_uninventory = Odstranit z inventáře
+##common_buttonbar_custom = Custom...
+##common_buttonbar_custom_cancel = Cancel
+##common_buttonbar_custom_save = Save
+##common_buttonbar_custom_window_subtitle = Custom
+##common_buttonbar_custom_window_title = Date Range
+common_buttonbar_datetime_format = dd.MM.yy hh:mm
+common_buttonbar_datetime_format_moment_js = DD.MM.YY HH:mm
+##common_buttonbar_end_date = End Date
+##common_buttonbar_end_time = End Time
+##common_buttonbar_start_date = Start Date
+##common_buttonbar_start_time = Start Time
common_calendar_april_short = dub
common_calendar_august_short = srp
common_calendar_december_short = pro
@@ -180,6 +180,7 @@ common_title_available_resources = Dostupné zdroje
common_title_average_metrics = Průměrné metriky za minutu
common_title_background = Pozadí
common_title_bundle = Balík
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = Balíky
common_title_category = Kategorie
common_title_change_refresh_time = Obnovovací interval
@@ -530,11 +531,21 @@ view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0}
view_adminRoles_permissions_isAuthorized = Autorizován?
view_adminRoles_permissions_isRead = Čtení?
view_adminRoles_permissions_isWrite = Zápis?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
view_adminRoles_permissions_permDesc_manageBundles = může vytvářet, měnit, mazat balíky (zobrazovat může kdokoli)
view_adminRoles_permissions_permDesc_manageInventory = má všechna práva zdroje: může vytvářet, měnit, mazat skupiny, může importovat automaticky nebo manuálně nalezené zdroje
view_adminRoles_permissions_permDesc_manageRepositories = může vytvářet, měnit, mazat repozitáře jakýchkoli uživatelů (každý může vytvářet své repozitáře), může asociovat zdroje obsahů s repozitáři
view_adminRoles_permissions_permDesc_manageSecurity = může vytvářet, měnit, mazat uživatele a role - implikuje všechna ostatní povolení
view_adminRoles_permissions_permDesc_manageSettings = může modifikovat {0} serverovou konfiguraci a provozovat jakékoli operace související se serverem
+##view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
view_adminRoles_permissions_permDesc_viewUsers = může zobrazovat ostatní uživatele s výjimkou jejich přiřazených rolí
view_adminRoles_permissions_permReadDesc_configure = zobrazí konfiguraci zdroje a historii konfigurace zdroje
view_adminRoles_permissions_permReadDesc_control = (VÝCHOZÍ) zobrazí dostupné operace a historii spouštění operací
@@ -556,12 +567,19 @@ view_adminRoles_permissions_permWriteDesc_manageContent = přihlásit se k odbě
view_adminRoles_permissions_permWriteDesc_manageDrift = vytvořit, změnit a smazat definici driftu
view_adminRoles_permissions_permWriteDesc_manageEvents = mazat události
view_adminRoles_permissions_permWriteDesc_manageMeasurements = měnit rozvrhy sběru metrik
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = Konfigurovat
view_adminRoles_permissions_perm_control = Ovládání
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = Vytvářet potomky zdrojů
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = Vytvářet potomky zdrojů
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = Inventarizovat
view_adminRoles_permissions_perm_manageAlerts = Spravovat výstrahy
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = Spravovat balíky
view_adminRoles_permissions_perm_manageContent = Spravovat obsah
view_adminRoles_permissions_perm_manageDrift = Spravovat drift
@@ -571,6 +589,9 @@ view_adminRoles_permissions_perm_manageMeasurements = Spravovat měření
view_adminRoles_permissions_perm_manageRepositories = Spravovat repozitáře
view_adminRoles_permissions_perm_manageSecurity = Spravovat bezpečnost
view_adminRoles_permissions_perm_manageSettings = Spravovat nastavení
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
view_adminRoles_permissions_perm_viewUsers = Zobrazit uživatelé
view_adminRoles_permissions_read = Číst:
view_adminRoles_permissions_readAccessImplied = Přístup pro čtení pro {0} je výchozí a nemůže být zakázán.
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 524dcc0..0db1d05 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
@@ -46,17 +46,6 @@ common_button_ack_all = Alle bestätigen
common_button_add = Hinzufügen
common_button_advanced = Erweitert...
common_button_apply = Anwenden
-common_buttonbar_custom_window_title=Zeitbereich
-common_buttonbar_datetime_format=dd.MM.yy hh:mm
-common_buttonbar_datetime_format_moment_js= DD.MM.YY HH:mm
-common_buttonbar_end_date=Enddatum
-common_buttonbar_end_time=Endzeitpunkt
-common_buttonbar_start_date=Startdatum
-common_buttonbar_start_time=Startzeitpunkt
-common_buttonbar_custom_cancel=Abbrechen
-common_buttonbar_custom_save=Speichern
-common_buttonbar_custom_window_subtitle= Spezifisch
-common_buttonbar_custom = Spezifisch...
common_button_cancel = Abbrechen
common_button_close = Schließen
common_button_compare = Vergleichen
@@ -89,6 +78,17 @@ common_button_set = Setzen
common_button_showDetails = Details anzeigen...
common_button_unignore = Ignorieren aufheben
common_button_uninventory = Aus dem Inventar löschen
+common_buttonbar_custom = Spezifisch...
+common_buttonbar_custom_cancel = Abbrechen
+common_buttonbar_custom_save = Speichern
+common_buttonbar_custom_window_subtitle = Spezifisch
+common_buttonbar_custom_window_title = Zeitbereich
+common_buttonbar_datetime_format = dd.MM.yy hh:mm
+common_buttonbar_datetime_format_moment_js = DD.MM.YY HH:mm
+common_buttonbar_end_date = Enddatum
+common_buttonbar_end_time = Endzeitpunkt
+common_buttonbar_start_date = Startdatum
+common_buttonbar_start_time = Startzeitpunkt
common_calendar_april_short = Apr
common_calendar_august_short = Aug
common_calendar_december_short = Dez
@@ -160,6 +160,7 @@ common_title_available_resources = Verfügbare Ressourcen
common_title_average_metrics = Durchsch. Anzahl Metriken pro Minute
common_title_background = Hintergrund
common_title_bundle = Bundle
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = Bundles
common_title_category = Kategorie
common_title_change_refresh_time = Aktualisierungsintervall
@@ -502,10 +503,22 @@ view_adminRoles_permissions_globalPermissions = Globale Rechte
view_adminRoles_permissions_isAuthorized = Berechtigt?
view_adminRoles_permissions_isRead = Lesen?
view_adminRoles_permissions_isWrite = Schreiben?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
view_adminRoles_permissions_permDesc_manageBundles = Kann Bundles anlegen, aktualisieren und löschen (Ansehen ist für alle implizit erlaubt).
view_adminRoles_permissions_permDesc_manageInventory = Hat alle Rechte auf alle Ressourcen, wie unten beschrieben. Kann Gruppen anlegen, aktualisieren und löschen. Kann Ressourcen in das Inventar aufnehmen.
+##view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
view_adminRoles_permissions_permDesc_manageSecurity = Kann Benutzer und Rollen anlegen, aktualisieren oder löschen (Anschauen ist für alle implizit erlaubt)
view_adminRoles_permissions_permDesc_manageSettings = Kann die Konfiguration des {0}-Servers ändern und jegliche Server-bezogene Funktionalität ausführen.
+##view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
+##view_adminRoles_permissions_permDesc_viewUsers = can view other users, with the exception of their assigned roles
view_adminRoles_permissions_permReadDesc_configure = Ansehen der Ressourcen-Konfiguration und des Verlaufs derselben.
view_adminRoles_permissions_permReadDesc_control = (IMPLIZIT) Ansehen der verfügbaren Operationen und des Verlaufs der ausgeführen Operationen
view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIZIT) Ansehen des Verlaufs des Anlegens von Kind-Ressourcen
@@ -526,20 +539,32 @@ view_adminRoles_permissions_permWriteDesc_manageContent = Abonnieren von Content
view_adminRoles_permissions_permWriteDesc_manageDrift = Anlegen, Bearbeiten und Löschen von Drift-Definitionen und Management von Drift-Instanzen
view_adminRoles_permissions_permWriteDesc_manageEvents = Ereignisse löschen
view_adminRoles_permissions_permWriteDesc_manageMeasurements = Zeitplan für das Monitoring bearbeiten
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = Konfiguration
view_adminRoles_permissions_perm_control = Operationen
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = Kind-Ressourcen erzeugen
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = Löschen von Kind-Ressourcen
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = Inventar
view_adminRoles_permissions_perm_manageAlerts = Alarme verwalten
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = Bundles verwalten
view_adminRoles_permissions_perm_manageContent = Content verwalten
view_adminRoles_permissions_perm_manageDrift = Drift verwalten
view_adminRoles_permissions_perm_manageEvents = Ereignisse verwalten
view_adminRoles_permissions_perm_manageInventory = Inventar verwalten
view_adminRoles_permissions_perm_manageMeasurements = Monitoring verwalten
+##view_adminRoles_permissions_perm_manageRepositories = Manage Repositories
view_adminRoles_permissions_perm_manageSecurity = Sicherheitseinstellungen verwalten
view_adminRoles_permissions_perm_manageSettings = Einstellungen verwalten
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
+##view_adminRoles_permissions_perm_viewUsers = View Users
view_adminRoles_permissions_read = Lesen
view_adminRoles_permissions_readAccessImplied = Lesezugriff für das Recht {0} ist implizit und kann nicht abgeschaltet werden.
view_adminRoles_permissions_resourcePermissions = Rechte für Ressourcen
@@ -746,8 +771,7 @@ view_admin_systemSettings_AlertPurge_name = Bereinigen der Alarme, die älter si
view_admin_systemSettings_AvailabilityPurge_name = Lösche Verfügbarkeitsdaten, die älter sind als
##view_admin_systemSettings_DriftFilePurge_desc = How old unused and orphaned drift files must be before being purged from backend storage. This is specified in days.
view_admin_systemSettings_DriftFilePurge_name = Bereinige ungenutzte Drift-Dateine, die älter sind als
-view_admin_systemSettings_LDAPBaseDN_name = \
-view_admin_systemSettings_LDAPBindPW_name = Passwort
+view_admin_systemSettings_LDAPBaseDN_name = view_admin_systemSettings_LDAPBindPW_name = Passwort
##view_admin_systemSettings_RHQSessionTimeout_desc = If this amount of time passes without any user interaction in the browser, the session is considered as expired and user is aked to log in again. This value is specified in hours.
##view_admin_systemSettings_RHQSessionTimeout_name = GUI Session Timeout
view_admin_systemSettings_TraitPurge_name = Bereinigen der Trait-Daten, die älter sind als
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 cb0c35f..626243e 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
@@ -46,16 +46,6 @@ common_button_ack_all = すべてを確認
common_button_add = 追加
common_button_advanced = 高度な設定...
common_button_apply = 適用
-##common_buttonbar_custom_window_title= Date Range
-##common_buttonbar_custom_window_subtitle= Custom
-##common_buttonbar_datetime_format= MM/dd/yyyy h:mm a
-##common_buttonbar_end_date= End Date
-##common_buttonbar_end_time= End Time
-##common_buttonbar_start_date= Start Date
-##common_buttonbar_start_time= Start Time
-##common_buttonbar_custom = Custom...
-##common_buttonbar_custom_cancel = Cancel
-##common_buttonbar_custom_save = Save
common_button_cancel = キャンセル
common_button_close = 閉じる
common_button_compare = 比較
@@ -88,6 +78,16 @@ common_button_set = 設定
common_button_showDetails = 詳細表示...
##common_button_unignore = Unignore
common_button_uninventory = アンインベントリ
+##common_buttonbar_custom = Custom...
+##common_buttonbar_custom_cancel = Cancel
+##common_buttonbar_custom_save = Save
+##common_buttonbar_custom_window_subtitle = Custom
+##common_buttonbar_custom_window_title = Date Range
+##common_buttonbar_datetime_format = MM/dd/yyyy h:mm a
+##common_buttonbar_end_date = End Date
+##common_buttonbar_end_time = End Time
+##common_buttonbar_start_date = Start Date
+##common_buttonbar_start_time = Start Time
common_calendar_april_short = 4月
common_calendar_august_short = 8月
common_calendar_december_short = 12月
@@ -160,6 +160,7 @@ common_title_available_resources = 利用可能リソース
common_title_average_metrics = 毎分の平均メトリックス
common_title_background = 背景色
common_title_bundle = バンドル
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = バンドル
common_title_category = カテゴリ
common_title_change_refresh_time = リフレッシュ間隔
@@ -508,11 +509,21 @@ view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0}
view_adminRoles_permissions_isAuthorized = 権限があるか?
view_adminRoles_permissions_isRead = 読み出しですか?
view_adminRoles_permissions_isWrite = 書き込みですか?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
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_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
view_adminRoles_permissions_permDesc_viewUsers = 他のユーザーを閲覧できます。しかし、それらに割り当てられたロールは見えません。
view_adminRoles_permissions_permReadDesc_configure = リソース構成とリソース構成リビジョン履歴の閲覧
view_adminRoles_permissions_permReadDesc_control = 利用可能オペレーション; オペレーション実行履歴の(暗黙的な)閲覧
@@ -534,12 +545,19 @@ view_adminRoles_permissions_permWriteDesc_manageContent = コンテントソー
view_adminRoles_permissions_permWriteDesc_manageDrift = ドリフト定義の作成、更新、削除; ドリフトインスタンスの管理
view_adminRoles_permissions_permWriteDesc_manageEvents = イベントの削除
view_adminRoles_permissions_permWriteDesc_manageMeasurements = メトリック収集スケジュールの更新
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = 構成
view_adminRoles_permissions_perm_control = 制御
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = 子リソースの作成
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = 子リソースの削除
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = インベントリ
view_adminRoles_permissions_perm_manageAlerts = アラートの管理
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = バンドルの管理
view_adminRoles_permissions_perm_manageContent = コンテント管理
view_adminRoles_permissions_perm_manageDrift = ドリフト管理
@@ -549,6 +567,9 @@ view_adminRoles_permissions_perm_manageMeasurements = 測定の管理
view_adminRoles_permissions_perm_manageRepositories = リポジトリの管理
view_adminRoles_permissions_perm_manageSecurity = セキュリティの管理
view_adminRoles_permissions_perm_manageSettings = 設定の管理
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
view_adminRoles_permissions_perm_viewUsers = ユーザー閲覧
view_adminRoles_permissions_read = Read:
view_adminRoles_permissions_readAccessImplied = [{0}] 権限のための読み取りアクセスを暗示されていて無効にできません
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 32dc73d..0da2a6e 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
@@ -44,16 +44,6 @@ common_button_ack_all = 전체 확인
common_button_add = 추가
common_button_advanced = 고급 설정...
common_button_apply = 적용
-##common_buttonbar_custom_window_title= Date Range
-##common_buttonbar_custom_window_subtitle= Custom
-##common_buttonbar_datetime_format= MM/dd/yyyy h:mm a
-##common_buttonbar_end_date= End Date
-##common_buttonbar_end_time= End Time
-##common_buttonbar_start_date= Start Date
-##common_buttonbar_start_time= Start Time
-##common_buttonbar_custom = Custom...
-##common_buttonbar_custom_cancel = Cancel
-##common_buttonbar_custom_save = Save
common_button_cancel = 취소
common_button_close = 닫기
common_button_compare = 비교
@@ -85,6 +75,16 @@ common_button_set = 설정
common_button_showDetails = 자세히보기...
##common_button_unignore = Unignore
common_button_uninventory = 인벤토리 제거
+##common_buttonbar_custom = Custom...
+##common_buttonbar_custom_cancel = Cancel
+##common_buttonbar_custom_save = Save
+##common_buttonbar_custom_window_subtitle = Custom
+##common_buttonbar_custom_window_title = Date Range
+##common_buttonbar_datetime_format = MM/dd/yyyy h:mm a
+##common_buttonbar_end_date = End Date
+##common_buttonbar_end_time = End Time
+##common_buttonbar_start_date = Start Date
+##common_buttonbar_start_time = Start Time
common_calendar_april_short = 4월
common_calendar_august_short = 8월
common_calendar_december_short = 12월
@@ -153,6 +153,7 @@ common_title_available_resources = 사용 가능한 자원
common_title_average_metrics = 분당 평균 통계
common_title_background = 배경색
common_title_bundle = 번들
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = 번들
common_title_change_refresh_time = 새로고침 주기
common_title_columns = 컬럼
@@ -452,8 +453,21 @@ view_adminRoles_permissions_illegalDeselectionDueToCorrespondingWritePermSelecti
view_adminRoles_permissions_illegalDeselectionDueToManageInventorySelection = {0} 권한은 선택 해제 할 수 없습니다. 다른 모든 자원을 암시하는 관리 인벤토리가 먼저 선택 해제되어야 그것은 수행할 수 있습니다.
view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0} 권한은 선택 해제 할 수 없습니다. 다른 모든 권한을 암시하는 관리 보안 권한이 먼저 선택 해제되어야 그것은 수행할 수 있습니다.
view_adminRoles_permissions_isAuthorized = 권한이 있습니까?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
+##view_adminRoles_permissions_permDesc_manageBundles = can create, update, or delete provisioning bundles (viewing is implied for everyone)
view_adminRoles_permissions_permDesc_manageInventory = 모든 자원의 모든 자원 권한을 갖습니다. 즉, 그룹의 생성, 삭제, 자동감지 또는 수동으로 검출된 자원을 가져올수 있습니다.
+##view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
+##view_adminRoles_permissions_permDesc_manageSecurity = can create, update, or delete users and roles - implies all other permissions
view_adminRoles_permissions_permDesc_manageSettings = {0} 서버의 수정 및 모든 서버 관련 기능을 수행할 수 있습니다.
+##view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
view_adminRoles_permissions_permDesc_viewUsers = 다른 사용자를 볼 수 있습니다. 그러나 그들에게 할당된 역할은 보이지 않습니다.
view_adminRoles_permissions_permReadDesc_configure = 자원 설정 및 자원 설정 수정 기록 보기
view_adminRoles_permissions_permReadDesc_createChildResources = (암시적) 자식 리소스 만들기 기록 보기
@@ -469,13 +483,21 @@ view_adminRoles_permissions_permWriteDesc_manageAlerts = 경고 정의를 만들
view_adminRoles_permissions_permWriteDesc_manageDrift = 드리프트 정의 만들기, 수정, 삭제; 드리프트 인스턴스 관리
view_adminRoles_permissions_permWriteDesc_manageEvents = 이벤트 삭제
view_adminRoles_permissions_permWriteDesc_manageMeasurements = 통계 수집 스케쥴 수정
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = 구성
view_adminRoles_permissions_perm_control = 제어
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = 자식 리소스 만들기
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = 자식 리소스 삭제
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = 인벤토리
view_adminRoles_permissions_perm_manageAlerts = 경고 관리
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = 번들 관리
+##view_adminRoles_permissions_perm_manageContent = Manage Content
view_adminRoles_permissions_perm_manageDrift = 드리프트 관리
view_adminRoles_permissions_perm_manageEvents = 이벤트 관리
view_adminRoles_permissions_perm_manageInventory = 인벤토리 관리
@@ -483,6 +505,9 @@ view_adminRoles_permissions_perm_manageMeasurements = 측정 관리
view_adminRoles_permissions_perm_manageRepositories = 저장소 관리
view_adminRoles_permissions_perm_manageSecurity = 보안 관리
view_adminRoles_permissions_perm_manageSettings = 설정 관리
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
view_adminRoles_permissions_perm_viewUsers = 사용자 보기
view_adminRoles_permissions_read = 읽기:
view_adminRoles_permissions_readAccessImplied = {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 f4419e1..6d74d41 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
@@ -43,16 +43,6 @@ common_button_ack_all = Confirmar Todos
common_button_add = Adicionar
common_button_advanced = Avan\u00E7ado...
common_button_apply = Aplicar
-##common_buttonbar_custom_window_title= Date Range
-##common_buttonbar_custom_window_subtitle= Custom
-##common_buttonbar_datetime_format= MM/dd/yyyy h:mm a
-##common_buttonbar_end_date= End Date
-##common_buttonbar_end_time= End Time
-##common_buttonbar_start_date= Start Date
-##common_buttonbar_start_time= Start Time
-##common_buttonbar_custom = Custom...
-##common_buttonbar_custom_cancel = Cancel
-##common_buttonbar_custom_save = Save
common_button_cancel = Cancelar
common_button_close = Fechar
common_button_compare = Comparar
@@ -85,6 +75,16 @@ common_button_set = Definir
common_button_showDetails = Mostrar Detalhes...
##common_button_unignore = Unignore
common_button_uninventory = Remover do Invent\u00E1rio
+##common_buttonbar_custom = Custom...
+##common_buttonbar_custom_cancel = Cancel
+##common_buttonbar_custom_save = Save
+##common_buttonbar_custom_window_subtitle = Custom
+##common_buttonbar_custom_window_title = Date Range
+##common_buttonbar_datetime_format = MM/dd/yyyy h:mm a
+##common_buttonbar_end_date = End Date
+##common_buttonbar_end_time = End Time
+##common_buttonbar_start_date = Start Date
+##common_buttonbar_start_time = Start Time
common_calendar_april_short = abr
common_calendar_august_short = ago
common_calendar_december_short = dez
@@ -157,6 +157,7 @@ common_title_available_resources = Recursos Dispon\u00EDveis
common_title_average_metrics = M\u00E9tricas da m\u00E9dia por Minuto
common_title_background = Fundo (background)
common_title_bundle = Bundle
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = Bundles
common_title_category = Categoria
common_title_change_refresh_time = Atualizar Intervalo
@@ -513,11 +514,22 @@ view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0}
view_adminRoles_permissions_isAuthorized = Autorizado?
view_adminRoles_permissions_isRead = Leitura?
view_adminRoles_permissions_isWrite = Escrita?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
view_adminRoles_permissions_permDesc_manageBundles = pode criar, atualizar, ou excluir o provisionamento de bundles (a visualiza\u00E7\u00E3 \u00E9 implicita para todos)
view_adminRoles_permissions_permDesc_manageInventory = possui todas as permiss\u00F5es de Recurso, como descrito abaixo, pode criar, atualizar, excluir grupos e importar Recursos descobertos automaticamente ou manualmente.
view_adminRoles_permissions_permDesc_manageRepositories = pode criar, atualizar, ou excluir reposit\u00F3rios de qualquer usu\u00E1rio (todos podem criar seus pr\u00F3prios reposit\u00F3rios), pode associar fontes de conte\u00FAdos a reposit\u00F3rios.
view_adminRoles_permissions_permDesc_manageSecurity = pode criar, atualizar, ou excluir usu\u00E1rios e perfis (visualiza\u00E7\u00E3o \u00E9 padr\u00E3o para todos)
##view_adminRoles_permissions_permDesc_manageSettings = pode modificar a configura\u00E7\u00E3o do RHQ Server e utilizar qualquer funcionalidade relacionada ao Servidor
+##view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
+##view_adminRoles_permissions_permDesc_viewUsers = can view other users, with the exception of their assigned roles
view_adminRoles_permissions_permReadDesc_configure = view Resource configuration and Resource configuration revision history
view_adminRoles_permissions_permReadDesc_control = (IMPL\u00CDCITO) visualizar opera\u00E7\u00F5es dispon\u00EDveis e o hist\u00F3rico da execu\u00E7\u00E3o de opera\u00E7\u00F5es
view_adminRoles_permissions_permReadDesc_createChildResources = (IMPL\u00CDCITO) visualizar o hist\u00F3rico de cria\u00E7\u00E3o do recurso filho
@@ -538,12 +550,19 @@ view_adminRoles_permissions_permWriteDesc_manageContent = inscrever-se no reposi
##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = excluir eventos
view_adminRoles_permissions_permWriteDesc_manageMeasurements = atualizar agendamento de coleta de m\u00E9tricas
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = Configurar
view_adminRoles_permissions_perm_control = Controlar
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = Criar Recurso filho
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = Excluir Recursos filhos
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = Invent\u00E1rio
view_adminRoles_permissions_perm_manageAlerts = Gerenciar Alertas
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = Gerenciar Bundles
view_adminRoles_permissions_perm_manageContent = Gerenciar Conte\u00FAdo
##view_adminRoles_permissions_perm_manageDrift = Manage Drift
@@ -553,6 +572,10 @@ view_adminRoles_permissions_perm_manageMeasurements = Gerenciar M\u00E9tricas
view_adminRoles_permissions_perm_manageRepositories = Gerenciar Reposit\u00F3rios
view_adminRoles_permissions_perm_manageSecurity = Gerenciar Seguran\u00E7a
view_adminRoles_permissions_perm_manageSettings = Gerenciar Configura\u00E7\u00F5es
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
+##view_adminRoles_permissions_perm_viewUsers = View Users
view_adminRoles_permissions_read = Leitura:
view_adminRoles_permissions_readAccessImplied = Acesso de leitura para a permiss\u00E3o {0} \u00E9 impl\u00EDcita e n\u00E3o pode ser desabilitada.
view_adminRoles_permissions_resourcePermissions = Permiss\u00F5es de Recurso
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 d75b76e..f31b829 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
@@ -2271,6 +2271,7 @@ common_title_available_resources = Доступные ресурсы
common_title_average_metrics = Среднее количество метрик в минуту
common_title_background = Фон
common_title_bundle = Пакет
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = Пакеты
common_title_category = Категория
common_title_change_refresh_time = Интервал обновления
@@ -2591,9 +2592,22 @@ view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0}
view_adminRoles_permissions_isAuthorized = Авторизованы?
view_adminRoles_permissions_isRead = Читать?
view_adminRoles_permissions_isWrite = Запись?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
view_adminRoles_permissions_permDesc_manageBundles = Можно создавать, обновлять и удалять узлы предоставления (просмотр предоставляется всем)
+##view_adminRoles_permissions_permDesc_manageInventory = has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; and can import auto-discovered or manually discovered Resources
view_adminRoles_permissions_permDesc_manageRepositories = можно создавать, обновлять или удалять репозитории любого пользователя (каждый может создавать свои собственные репозитории), можно ассоциировать источники контента с резпозиториями.
view_adminRoles_permissions_permDesc_manageSecurity = можно создавать, обновлять или удалять пользователей и роли - включает все другие полномочия
+##view_adminRoles_permissions_permDesc_manageSettings = can modify the {0} Server configuration and perform any Server-related functionality
+##view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
+##view_adminRoles_permissions_permDesc_viewUsers = can view other users, with the exception of their assigned roles
view_adminRoles_permissions_permReadDesc_configure = просмотр конфигурации ресурса и историю версий конфигурации ресурса
view_adminRoles_permissions_permReadDesc_createChildResources = (ПОДРАЗУМЕВАЕМЫЙ) просмотр истории создания дочернего ресурса
view_adminRoles_permissions_permReadDesc_deleteChildResources = (ПОДРАЗУМЕВАЕМЫЙ) просмотр истории удаления дочернего ресурса
@@ -2608,18 +2622,32 @@ view_adminRoles_permissions_permWriteDesc_manageAlerts = создать, обн
view_adminRoles_permissions_permWriteDesc_manageContent = подписаться на источники контента; устанавливать и удалять пакеты
view_adminRoles_permissions_permWriteDesc_manageEvents = удалять события
view_adminRoles_permissions_permWriteDesc_manageMeasurements = обновление метрик коллекции планировщиков
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = Конфигурация
view_adminRoles_permissions_perm_control = Управление
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
+##view_adminRoles_permissions_perm_createChildResources = Create Child Resources
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
+##view_adminRoles_permissions_perm_deleteChildResources = Delete Child Resources
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = Инвентаризация
view_adminRoles_permissions_perm_manageAlerts = Управление предупреждениями
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = Управление узлами
view_adminRoles_permissions_perm_manageContent = Управление контентом
+##view_adminRoles_permissions_perm_manageDrift = Manage Drift
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_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
+##view_adminRoles_permissions_perm_viewUsers = View Users
view_adminRoles_permissions_read = Чтение\:
view_adminRoles_permissions_readAccessImplied = Доступ чтения для {0} полномочия подразумевается и не может быть закрыт.
view_adminRoles_permissions_resourcePermissions = Полномчия ресурса
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 a9a24df..1aeb1a1 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
@@ -43,16 +43,6 @@ common_button_ack_all = \u786e\u8ba4\u6240\u6709
common_button_add = \u6dfb\u52a0
common_button_advanced = \u9ad8\u7ea7...
common_button_apply = \u63a5\u53d7
-##common_buttonbar_custom_window_title= Date Range
-##common_buttonbar_custom_window_subtitle= Custom
-##common_buttonbar_datetime_format= MM/dd/yyyy h:mm a
-##common_buttonbar_end_date= End Date
-##common_buttonbar_end_time= End Time
-##common_buttonbar_start_date= Start Date
-##common_buttonbar_start_time= Start Time
-##common_buttonbar_custom = Custom...
-##common_buttonbar_custom_cancel = Cancel
-##common_buttonbar_custom_save = Save
common_button_cancel = \u53d6\u6d88
common_button_close = \u5173\u95ed
common_button_compare = \u5bf9\u6bd4
@@ -85,6 +75,16 @@ common_button_set = Set
common_button_showDetails = \u67e5\u770b\u8be6\u60c5...
##common_button_unignore = Unignore
common_button_uninventory = Uninventory
+##common_buttonbar_custom = Custom...
+##common_buttonbar_custom_cancel = Cancel
+##common_buttonbar_custom_save = Save
+##common_buttonbar_custom_window_subtitle = Custom
+##common_buttonbar_custom_window_title = Date Range
+##common_buttonbar_datetime_format = MM/dd/yyyy h:mm a
+##common_buttonbar_end_date = End Date
+##common_buttonbar_end_time = End Time
+##common_buttonbar_start_date = Start Date
+##common_buttonbar_start_time = Start Time
common_calendar_april_short = \u56db\u6708
common_calendar_august_short = \u516b\u6708
common_calendar_december_short = \u5341\u4e8c\u6708
@@ -157,6 +157,7 @@ common_title_available_resources = \u53ef\u7528\u7684\u8d44\u6e90
common_title_average_metrics = \u5e73\u5747\u6bcf\u5206\u949f\u6307\u6807
common_title_background = \u80cc\u666f\u8272
common_title_bundle = Bundle
+##common_title_bundleGroups = Bundle Groups
common_title_bundles = Bundles
common_title_category = \u7c7b\u522b
common_title_change_refresh_time = \u5237\u65b0\u95f4\u9694
@@ -502,11 +503,22 @@ view_adminRoles_permissions_illegalDeselectionDueToManageSecuritySelection = {0}
view_adminRoles_permissions_isAuthorized = \u6388\u6743?
view_adminRoles_permissions_isRead = \u8bfb?
view_adminRoles_permissions_isWrite = \u5199?
+##view_adminRoles_permissions_permDesc_assignBundlesToGroup = can copy a viewable bundle to the bundle group
+##view_adminRoles_permissions_permDesc_createBundles = can create new bundle [version]s. can copy existing bundles between viewable groups
+##view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundle [version]s for the bundle group. can copy a viewable bundle to the bundle group.
+##view_adminRoles_permissions_permDesc_deleteBundles = can delete or unassign viewable bundle [version]s
+##view_adminRoles_permissions_permDesc_deleteBundlesFromGroup = can delete bundle [version]s from the bundle group (implicitly deleting then from other assigned groups)
+##view_adminRoles_permissions_permDesc_deployBundles = can deploy any viewable bundle version to any viewable, deployable, compatible, resource group
+##view_adminRoles_permissions_permDesc_manageBundleGroups = can create, update, or delete bundle groups
view_adminRoles_permissions_permDesc_manageBundles = \u80fd\u521b\u5efa,\u66f4\u65b0\u6216\u8005\u5220\u9664\u63d0\u4f9b\u7684bundles(\u4efb\u4f55\u4eba\u90fd\u80fd\u67e5\u770b)
view_adminRoles_permissions_permDesc_manageInventory = \u62e5\u6709\u6240\u6709\u8d44\u6e90\u6743\u9650, \u5982\u4e0b\u6240\u8ff0, \u5bf9\u6240\u6709\u8d44\u6e90; \u5177\u6709\u521b\u5efa, \u66f4\u65b0, \u5220\u9664\u7ec4; \u80fd\u5bfc\u5165\u81ea\u52a8\u53d1\u73b0\u6216\u624b\u52a8\u53d1\u73b0\u7684\u8d44\u6e90
view_adminRoles_permissions_permDesc_manageRepositories = can create, update, or delete repositories of any user (everyone can create their own repositories), can associate content sources to repositories.
view_adminRoles_permissions_permDesc_manageSecurity = \u80fd\u521b\u5efa,\u66f4\u65b0,\u6216\u5220\u9664\u7528\u6237\u548c\u89d2\u8272 (\u4efb\u4f55\u4eba\u90fd\u6709\u67e5\u770b\u6743\u9650)
##view_adminRoles_permissions_permDesc_manageSettings = \u80fd\u4fee\u6539RHQ\u670d\u52a1\u5668\u914d\u7f6e\u800c\u4e14\u80fd\u64cd\u4f5c\u4efb\u4f55\u76f8\u5173\u7684\u670d\u52a1\u5668\u529f\u80fd
+##view_adminRoles_permissions_permDesc_unassignBundlesFromGroup = can unassign (not delete) a bundle from the bundle group
+##view_adminRoles_permissions_permDesc_viewBundles = can view any bundle including global bundles (those not assigned to any bundle group)
+##view_adminRoles_permissions_permDesc_viewBundlesInGroup = can view any bundle in the group
+##view_adminRoles_permissions_permDesc_viewUsers = can view other users, with the exception of their assigned roles
view_adminRoles_permissions_permReadDesc_configure = \u67e5\u770b\u8d44\u6e90\u914d\u7f6e\u548c\u8d44\u6e90\u914d\u7f6e\u4fee\u8ba2\u5386\u53f2
view_adminRoles_permissions_permReadDesc_control = (IMPLIED) \u67e5\u770b\u53ef\u7528\u64cd\u4f5c\u548c\u64cd\u4f5c\u6267\u884c\u5386\u53f2
view_adminRoles_permissions_permReadDesc_createChildResources = (IMPLIED) \u67e5\u770b\u5b50\u8d44\u6e90\u521b\u5efa\u5386\u53f2
@@ -527,12 +539,19 @@ view_adminRoles_permissions_permWriteDesc_manageContent = \u8ba2\u9605\u5185\u5b
##view_adminRoles_permissions_permWriteDesc_manageDrift = create, update, and delete drift definitions; and manage drift instances
view_adminRoles_permissions_permWriteDesc_manageEvents = \u5220\u9664\u4e8b\u4ef6
view_adminRoles_permissions_permWriteDesc_manageMeasurements = \u66f4\u65b0\u6307\u6807\u96c6\u8ba1\u5212\u4efb\u52a1
+##view_adminRoles_permissions_perm_assignBundlesToGroup = Assign Bundles To Group
view_adminRoles_permissions_perm_configure = \u914d\u7f6e
view_adminRoles_permissions_perm_control = \u63a7\u5236
+##view_adminRoles_permissions_perm_createBundles = Create Bundles
+##view_adminRoles_permissions_perm_createBundlesInGroup = Create Bundles In Group
view_adminRoles_permissions_perm_createChildResources = \u521b\u5efa\u5b50\u8d44\u6e90
+##view_adminRoles_permissions_perm_deleteBundles = Delete Bundles
+##view_adminRoles_permissions_perm_deleteBundlesFromGroup = Delete Bundles From Group
view_adminRoles_permissions_perm_deleteChildResources = \u5220\u9664\u5b50\u8d44\u6e90
+##view_adminRoles_permissions_perm_deployBundles = Deploy Bundles
view_adminRoles_permissions_perm_inventory = \u6e05\u5355
view_adminRoles_permissions_perm_manageAlerts = \u7ba1\u7406\u544a\u8b66
+##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
view_adminRoles_permissions_perm_manageBundles = \u7ba1\u7406Bundles
view_adminRoles_permissions_perm_manageContent = \u7ba1\u7406\u5185\u5bb9
##view_adminRoles_permissions_perm_manageDrift = Manage Drift
@@ -542,6 +561,10 @@ view_adminRoles_permissions_perm_manageMeasurements = \u7ba1\u7406\u6307\u6807
view_adminRoles_permissions_perm_manageRepositories = \u7ba1\u7406\u5e93
view_adminRoles_permissions_perm_manageSecurity = \u7ba1\u7406\u6743\u9650
view_adminRoles_permissions_perm_manageSettings = \u7ba1\u7406\u914d\u7f6e
+view_adminRoles_permissions_perm_unassignBundlesFromGroup = Unassign Bundles From Group
+##view_adminRoles_permissions_perm_viewBundles = View Bundles
+##view_adminRoles_permissions_perm_viewBundlesInGroup = View Bundles In Group
+##view_adminRoles_permissions_perm_viewUsers = View Users
view_adminRoles_permissions_read = \u8bfb:
view_adminRoles_permissions_readAccessImplied = \u9ed8\u8ba4\u6709\u8bbf\u95ee{0}\u7684\u6743\u9650\u800c\u4e14\u65e0\u6cd5\u7981\u7528.
view_adminRoles_permissions_resourcePermissions = \u8d44\u6e90\u6388\u6743
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
index f61782a..dbecb26 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java
@@ -43,7 +43,6 @@ import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
-import org.apache.commons.httpclient.params.DefaultHttpParams;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpResponse;
@@ -55,7 +54,6 @@ import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.DefaultedHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.maven.artifact.versioning.ComparableVersion;
@@ -72,6 +70,7 @@ import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDeploymentStatus;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroup;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleResourceDeploymentHistory;
import org.rhq.core.domain.bundle.BundleType;
@@ -90,6 +89,7 @@ import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleDestinationCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
+import org.rhq.core.domain.criteria.BundleGroupCriteria;
import org.rhq.core.domain.criteria.BundleResourceDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.criteria.ResourceCriteria;
@@ -1622,6 +1622,14 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
return queryRunner.execute();
}
+ @Override
+ public PageList<BundleGroup> findBundleGroupsByCriteria(Subject subject, BundleGroupCriteria criteria) {
+ CriteriaQueryGenerator generator = new CriteriaQueryGenerator(subject, criteria);
+ CriteriaQueryRunner<BundleGroup> queryRunner = new CriteriaQueryRunner<BundleGroup>(criteria, generator,
+ entityManager);
+ return queryRunner.execute();
+ }
+
/**
* Fetch bundles by criteria and then filter destination on the result objects to limit what the user can see
* @param subject Caller
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
index 2387833..b72d6b5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerRemote.java
@@ -30,6 +30,7 @@ import org.rhq.core.domain.bundle.Bundle;
import org.rhq.core.domain.bundle.BundleDeployment;
import org.rhq.core.domain.bundle.BundleDestination;
import org.rhq.core.domain.bundle.BundleFile;
+import org.rhq.core.domain.bundle.BundleGroup;
import org.rhq.core.domain.bundle.BundleResourceDeployment;
import org.rhq.core.domain.bundle.BundleType;
import org.rhq.core.domain.bundle.BundleVersion;
@@ -41,6 +42,7 @@ import org.rhq.core.domain.criteria.BundleCriteria;
import org.rhq.core.domain.criteria.BundleDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleDestinationCriteria;
import org.rhq.core.domain.criteria.BundleFileCriteria;
+import org.rhq.core.domain.criteria.BundleGroupCriteria;
import org.rhq.core.domain.criteria.BundleResourceDeploymentCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.util.PageList;
@@ -259,6 +261,8 @@ public interface BundleManagerRemote {
PageList<Bundle> findBundlesByCriteria(Subject subject, BundleCriteria criteria);
+ PageList<BundleGroup> findBundleGroupsByCriteria(Subject subject, BundleGroupCriteria criteria);
+
PageList<BundleDeployment> findBundleDeploymentsByCriteria(Subject subject, BundleDeploymentCriteria criteria);
PageList<BundleDestination> findBundleDestinationsByCriteria(Subject subject, BundleDestinationCriteria criteria);
10 years, 9 months