[rhq] 3 commits - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java | 31 +++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsEditor.java | 5
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java | 10 -
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java | 16 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java | 21 ++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java | 63 ++++++++--
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java | 39 +++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java | 9 +
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/tag/TaggedView.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java | 18 ++
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_cs.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ja.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ko.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_pt.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_ru.properties | 3
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_zh.properties | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java | 15 ++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java | 10 +
21 files changed, 210 insertions(+), 58 deletions(-)
New commits:
commit 0d02529362878ceaeaefc2e847fb244b35ac8275
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Aug 23 17:56:47 2013 -0400
fix button enablement in the bundle, bundleversion, bundledeplyment and
bundledestination views; apply fine grained perms to delete/deploy/tagging
as opposed to the legacy managebundle.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java
index 4a7488f..6f1d915 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentListView.java
@@ -52,11 +52,11 @@ import org.rhq.enterprise.gui.coregui.client.util.StringUtility;
*/
public class BundleDeploymentListView extends Table<BundleDeploymentDataSource> {
- private final boolean canManageBundles;
+ private final boolean canDeploy;
- public BundleDeploymentListView(Criteria criteria, boolean canManageBundles) {
+ public BundleDeploymentListView(Criteria criteria, boolean canDeploy) {
super(MSG.view_bundle_bundleDeployments(), criteria, IconEnum.BUNDLE_DEPLOYMENT.getIcon24x24Path());
- this.canManageBundles = canManageBundles;
+ this.canDeploy = canDeploy;
setDataSource(new BundleDeploymentDataSource());
}
@@ -85,7 +85,7 @@ public class BundleDeploymentListView extends Table<BundleDeploymentDataSource>
deployTimeField.setType(ListGridFieldType.DATE);
// only users that are authorized can see deployments
- if (canManageBundles) {
+ if (canDeploy) {
nameField.setCellFormatter(new CellFormatter() {
public String format(Object value, ListGridRecord record, int i, int i1) {
return "<a href=\""
@@ -141,7 +141,7 @@ public class BundleDeploymentListView extends Table<BundleDeploymentDataSource>
setListGridFields(idField, nameField, descriptionField, bundleVersionField, deployTimeField, statusField);
- if (canManageBundles) {
+ if (canDeploy) {
setListGridDoubleClickHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(DoubleClickEvent event) {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
index afc94e4..bf14bd4 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/deployment/BundleDeploymentView.java
@@ -92,13 +92,17 @@ public class BundleDeploymentView extends EnhancedVLayout implements Bookmarkabl
private Bundle bundle;
private VLayout detail;
- private boolean canManageBundles;
+ private boolean canDelete;
+ private boolean canDeploy;
+ private boolean canTag;
private final HashMap<String, String> statusIcons;
- public BundleDeploymentView(boolean canManageBundles) {
+ public BundleDeploymentView(boolean canDelete, boolean canDeploy, boolean canTag) {
super();
- this.canManageBundles = canManageBundles;
+ this.canDelete = canDelete;
+ this.canDeploy = canDeploy;
+ this.canTag = canTag;
setWidth100();
setHeight100();
//setMargin(10); // do not set margin, we already have our margin set outside of us
@@ -263,7 +267,7 @@ public class BundleDeploymentView extends EnhancedVLayout implements Bookmarkabl
});
actionLayout.addMember(purgeButton);
- if (!canManageBundles) {
+ if (!canDeploy) {
revertButton.setDisabled(true);
purgeButton.setDisabled(true);
}
@@ -300,7 +304,7 @@ public class BundleDeploymentView extends EnhancedVLayout implements Bookmarkabl
});
actionLayout.addMember(deleteButton);
- if (!canManageBundles) {
+ if (!canDelete) {
deleteButton.setDisabled(true);
}
@@ -308,7 +312,7 @@ public class BundleDeploymentView extends EnhancedVLayout implements Bookmarkabl
}
private TagEditorView createTagEditor() {
- boolean readOnly = !this.canManageBundles;
+ boolean readOnly = !this.canTag;
TagEditorView tagEditor = new TagEditorView(version.getTags(), readOnly, new TagsChangedCallback() {
public void tagsChanged(HashSet<Tag> tags) {
GWTServiceLookup.getTagService().updateBundleDeploymentTags(deployment.getId(), tags,
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
index 8f6b8ac..4d17c40 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/destination/BundleDestinationView.java
@@ -74,11 +74,15 @@ public class BundleDestinationView extends EnhancedVLayout implements Bookmarkab
private Canvas detail;
- private boolean canManageBundles;
+ private boolean canDelete;
+ private boolean canDeploy;
+ private boolean canTag;
- public BundleDestinationView(boolean canManageBundles) {
+ public BundleDestinationView(boolean canDelete, boolean canDeploy, boolean canTag) {
super();
- this.canManageBundles = canManageBundles;
+ this.canDelete = canDelete;
+ this.canDeploy = canDeploy;
+ this.canTag = canTag;
setWidth100();
setHeight100();
//setMargin(10); // do not set margin, we already have our margin set outside of us
@@ -159,7 +163,7 @@ public class BundleDestinationView extends EnhancedVLayout implements Bookmarkab
}
private TagEditorView createTagEditor() {
- boolean readOnly = !this.canManageBundles;
+ boolean readOnly = !this.canTag;
TagEditorView tagEditor = new TagEditorView(destination.getTags(), readOnly, new TagsChangedCallback() {
public void tagsChanged(HashSet<Tag> tags) {
GWTServiceLookup.getTagService().updateBundleDestinationTags(destination.getId(), tags,
@@ -269,11 +273,14 @@ public class BundleDestinationView extends EnhancedVLayout implements Bookmarkab
});
actionLayout.addMember(deleteButton);
- if (!canManageBundles) {
+ if (!canDelete) {
+ deleteButton.setDisabled(true);
+ }
+
+ if (!canDeploy) {
deployButton.setDisabled(true);
revertButton.setDisabled(true);
purgeButton.setDisabled(true);
- deleteButton.setDisabled(true);
}
return actionLayout;
@@ -303,7 +310,7 @@ public class BundleDestinationView extends EnhancedVLayout implements Bookmarkab
private Table createDeploymentsTable() {
Criteria criteria = new Criteria();
criteria.addCriteria("bundleDestinationId", destination.getId());
- BundleDeploymentListView deployments = new BundleDeploymentListView(criteria, canManageBundles);
+ BundleDeploymentListView deployments = new BundleDeploymentListView(criteria, canDeploy);
deployments.setHeight100();
deployments.setShowResizeBar(true);
return deployments;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
index 60ec76d..3273b3b 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/list/BundleView.java
@@ -45,6 +45,8 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
import org.rhq.enterprise.gui.coregui.client.IconEnum;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoadedListener;
+import org.rhq.enterprise.gui.coregui.client.PermissionsLoader;
import org.rhq.enterprise.gui.coregui.client.ViewId;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.bundle.BundleTopView;
@@ -78,20 +80,25 @@ public class BundleView extends EnhancedVLayout implements BookmarkableView {
private Tab destinationsTab;
private Tab bundleGroupsTab;
+ private Set<Permission> globalPermissions;
+ private int permissionCheckBundleId = 0;
+ private boolean canDelete;
+ private boolean canDeploy;
+ private boolean canTag;
+
private BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
private Bundle bundle;
- private final boolean canManageBundles;
public BundleView(Set<Permission> perms) {
super();
- this.canManageBundles = (perms != null) ? perms.contains(Permission.MANAGE_BUNDLE) : false;
+ this.globalPermissions = perms;
setWidth100();
setHeight100();
setMargin(10);
setOverflow(Overflow.AUTO);
}
- public void viewBundle(Bundle bundle, ViewId nextViewId) {
+ private void viewBundle(final Bundle bundle, final ViewId nextViewId) {
// Whenever a new view request comes in, make sure to clean house to avoid ID conflicts for sub-widgets
this.destroyMembers();
@@ -128,7 +135,7 @@ public class BundleView extends EnhancedVLayout implements BookmarkableView {
}
private TagEditorView createTagEditor() {
- boolean readOnly = !this.canManageBundles;
+ boolean readOnly = !canTag;
TagEditorView tagEditor = new TagEditorView(bundle.getTags(), readOnly, new TagsChangedCallback() {
public void tagsChanged(HashSet<Tag> tags) {
GWTServiceLookup.getTagService().updateBundleTags(bundleBeingViewed, tags, new AsyncCallback<Void>() {
@@ -266,16 +273,47 @@ public class BundleView extends EnhancedVLayout implements BookmarkableView {
});
layout.addMember(deleteButton);
- if (!canManageBundles) {
- deployButton.setDisabled(true);
- deleteButton.setDisabled(true);
- }
+ deployButton.setDisabled(!canDeploy);
+ deleteButton.setDisabled(!canDelete);
return layout;
}
public void renderView(final ViewPath viewPath) {
- int bundleId = Integer.parseInt(viewPath.getCurrent().getPath());
+ final int bundleId = Integer.parseInt(viewPath.getCurrent().getPath());
+
+ // if we have already determined permissions for this bundle, just proceed
+ if (permissionCheckBundleId == bundleId) {
+ authorizedRenderView(bundleId, viewPath);
+ return;
+ }
+
+ // check necessary global permissions
+ canDelete = globalPermissions.contains(Permission.DELETE_BUNDLES);
+ canDeploy = globalPermissions.contains(Permission.DEPLOY_BUNDLES);
+ canTag = globalPermissions.contains(Permission.CREATE_BUNDLES);
+
+ // If the user has global perms to enable/render any of the views then proceed, otherwise, we
+ // need to see what group level perms he has.
+ if (canDelete && canDeploy && canTag) {
+ authorizedRenderView(bundleId, viewPath);
+
+ } else {
+ new PermissionsLoader().loadBundlePermissions(bundleId, new PermissionsLoadedListener() {
+ @Override
+ public void onPermissionsLoaded(Set<Permission> bundlePermissions) {
+ canDelete = canDelete || bundlePermissions.contains(Permission.DELETE_BUNDLES_FROM_GROUP);
+ canDeploy = canDeploy || bundlePermissions.contains(Permission.DEPLOY_BUNDLES_TO_GROUP);
+ canTag = canTag || bundlePermissions.contains(Permission.CREATE_BUNDLES_IN_GROUP);
+
+ authorizedRenderView(bundleId, viewPath);
+ }
+ });
+ }
+ }
+
+ private void authorizedRenderView(final int bundleId, final ViewPath viewPath) {
+ permissionCheckBundleId = bundleId;
viewPath.next();
if (viewPath.isEnd() || viewPath.isNextEnd()) {
@@ -323,7 +361,7 @@ public class BundleView extends EnhancedVLayout implements BookmarkableView {
if (viewPath.getCurrent().getPath().equals("versions")) {
if (!viewPath.isEnd()) {
// a specific version
- BundleVersionView view = new BundleVersionView(canManageBundles);
+ BundleVersionView view = new BundleVersionView(canDelete, canDeploy, canTag);
addMember(view);
view.renderView(viewPath.next());
}
@@ -337,18 +375,19 @@ public class BundleView extends EnhancedVLayout implements BookmarkableView {
} else {
// a specific deployment
//removeMembers(getMembers());
- BundleDeploymentView view = new BundleDeploymentView(canManageBundles);
+ BundleDeploymentView view = new BundleDeploymentView(canDelete, canDeploy, canTag);
addMember(view);
view.renderView(viewPath.next());
}
} else if (viewPath.getCurrent().getPath().equals("destinations")) {
if (!viewPath.isEnd()) {
// a specific destination
- BundleDestinationView view = new BundleDestinationView(canManageBundles);
+ BundleDestinationView view = new BundleDestinationView(canDelete, canDeploy, canTag);
addMember(view);
view.renderView(viewPath.next());
}
}
}
}
+
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
index 3ac67dd..5eb5f44 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/version/BundleVersionView.java
@@ -69,11 +69,15 @@ public class BundleVersionView extends EnhancedVLayout implements BookmarkableVi
private BundleGWTServiceAsync bundleManager = GWTServiceLookup.getBundleService();
private BundleVersion version;
- private boolean canManageBundles = false;
+ private boolean canDelete;
+ private boolean canDeploy;
+ private boolean canTag;
- public BundleVersionView(boolean canManageBundles) {
+ public BundleVersionView(boolean canDelete, boolean canDeploy, boolean canTag) {
super();
- this.canManageBundles = canManageBundles;
+ this.canDelete = canDelete;
+ this.canDeploy = canDeploy;
+ this.canTag = canTag;
setWidth100();
setHeight100();
//setMargin(10); // do not set margin, we already have our margin set outside of us
@@ -186,7 +190,7 @@ public class BundleVersionView extends EnhancedVLayout implements BookmarkableVi
});
actionLayout.addMember(deleteButton);
- if (!canManageBundles) {
+ if (!canDelete) {
deleteButton.setDisabled(true);
}
@@ -194,7 +198,7 @@ public class BundleVersionView extends EnhancedVLayout implements BookmarkableVi
}
private TagEditorView createTagEditor() {
- boolean readOnly = !this.canManageBundles;
+ boolean readOnly = !this.canTag;
TagEditorView tagEditor = new TagEditorView(version.getTags(), readOnly, new TagsChangedCallback() {
public void tagsChanged(HashSet<Tag> tags) {
GWTServiceLookup.getTagService().updateBundleVersionTags(version.getId(), tags,
@@ -246,7 +250,7 @@ public class BundleVersionView extends EnhancedVLayout implements BookmarkableVi
Tab tab = new Tab(MSG.view_bundle_deployments());
Criteria criteria = new Criteria();
criteria.setAttribute("bundleVersionId", version.getId());
- tab.setPane(new BundleDeploymentListView(criteria, this.canManageBundles));
+ tab.setPane(new BundleDeploymentListView(criteria, this.canDeploy));
return tab;
}
@@ -268,17 +272,16 @@ public class BundleVersionView extends EnhancedVLayout implements BookmarkableVi
criteria.fetchConfigurationDefinition(true);
criteria.fetchTags(true);
- bundleManager.findBundleVersionsByCriteria(criteria,
- new AsyncCallback<PageList<BundleVersion>>() {
- public void onFailure(Throwable caught) {
- CoreGUI.getErrorHandler().handleError(MSG.view_bundle_version_loadFailure(), caught);
- }
-
- public void onSuccess(PageList<BundleVersion> result) {
- BundleVersion version = result.get(0);
- ViewId nextPath = viewPath.next().getCurrent();
- viewBundleVersion(version, nextPath);
- }
- });
+ bundleManager.findBundleVersionsByCriteria(criteria, new AsyncCallback<PageList<BundleVersion>>() {
+ public void onFailure(Throwable caught) {
+ CoreGUI.getErrorHandler().handleError(MSG.view_bundle_version_loadFailure(), caught);
+ }
+
+ public void onSuccess(PageList<BundleVersion> result) {
+ BundleVersion version = result.get(0);
+ ViewId nextPath = viewPath.next().getCurrent();
+ viewBundleVersion(version, nextPath);
+ }
+ });
}
}
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/tag/TaggedView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/tag/TaggedView.java
index 8a12f5a..628b6d6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/tag/TaggedView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/report/tag/TaggedView.java
@@ -133,7 +133,7 @@ public class TaggedView extends EnhancedVLayout implements BookmarkableView, Has
container.addTab(tab);
BundleDeploymentListView bundleDeploymentListView = new BundleDeploymentListView(criteria,
- this.globalPermissions.contains(Permission.MANAGE_BUNDLE));
+ this.globalPermissions.contains(Permission.DEPLOY_BUNDLES));
viewsWithTags.add(bundleDeploymentListView);
tab = new Tab(MSG.view_bundle_bundleDeployments());
tab.setIcon("subsystems/bundle/BundleDeployment_16.png");
commit 15e9a4014da65728f88b69a9302e20a5f604a3b4
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Aug 23 17:54:30 2013 -0400
Fix issue in the permissions editor, deploy bundles to group was not being shown
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 e62bdbf..183aa1c 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
@@ -362,6 +362,11 @@ public class PermissionsEditor extends EnhancedVStack {
MSG.view_adminRoles_permissions_permDesc_deleteBundlesFromGroup());
records.add(record);
+ record = createPermissionRecord(MSG.view_adminRoles_permissions_perm_deployBundlesToGroup(),
+ "subsystems/bundle/BundleGroup", Permission.DEPLOY_BUNDLES_TO_GROUP,
+ MSG.view_adminRoles_permissions_permDesc_deployBundlesToGroup());
+ records.add(record);
+
grid.setData(records.toArray(new ListGridRecord[records.size()]));
return grid;
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 ba07960..92a3e8c 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
@@ -477,6 +477,7 @@ util_ancestry_parentAncestry = Parent Ancestry for:
util_errorHandler_nullException = exception was null
util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status.
util_rpcManager_activeRequests = {0} Active Requests
+util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = Failed to load your global permissions - none granted.
util_userPerm_loadFailGroup = Failed to load your permissions for Resource Group with id [{0}] - none granted.
util_userPerm_loadFailResource = Failed to load your permissions for Resource with id [{0}] - none granted.
@@ -552,6 +553,7 @@ view_adminRoles_permissions_permDesc_createBundlesInGroup = can create new bundl
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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
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
@@ -592,6 +594,7 @@ 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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = Inventory
view_adminRoles_permissions_perm_manageAlerts = Manage Alerts
view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 bdb265a..1e58484 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
@@ -496,6 +496,7 @@ util_ancestry_parentAncestry = Původ rodiče pro:
util_errorHandler_nullException = výjimka byla null
util_monitoringRequestCallback_error_checkServerStatusFailure = Nepodařilo se určit stav přihlašování - zkontrolujte stav serveru.
util_rpcManager_activeRequests = {0} aktivních žádostí
+##util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = Nepodařilo se načíst Vaše globální povolení - přístup nepovolen.
util_userPerm_loadFailGroup = Nepodařilo se načíst povolení pro zdroj s id [{0}] - přístup nepovolen.
util_userPerm_loadFailResource = Nepodařilo se načíst povolení pro skupinu zdrojů s id [{0}] - přístup nepovolen.
@@ -571,6 +572,7 @@ view_adminRoles_permissions_isWrite = Zápis?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
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
@@ -611,6 +613,7 @@ view_adminRoles_permissions_perm_createChildResources = Vytvářet potomky zdroj
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = Inventarizovat
view_adminRoles_permissions_perm_manageAlerts = Spravovat výstrahy
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 f4743a9..3d41331 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
@@ -474,6 +474,7 @@ util_disambiguationReportDecorator_pluginSuffix = ({0} Plugin)
util_errorHandler_nullException = Exception war null
##util_monitoringRequestCallback_error_checkServerStatusFailure = Unable to determine login status - check Server status.
util_rpcManager_activeRequests = {0} Aktive Anfragen
+##util_userPerm_loadFailBundle = Failed to load your permissions for Resource with id [{0}] - none granted.
##util_userPerm_loadFailGlobal = Failed to load your global permissions - none granted.
##util_userPerm_loadFailGroup = Failed to load your permissions for Resource Group with id [{0}] - none granted.
##util_userPerm_loadFailResource = Failed to load your permissions for Resource with id [{0}] - none granted.
@@ -549,6 +550,7 @@ view_adminRoles_permissions_isWrite = Schreiben?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
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.
@@ -589,6 +591,7 @@ view_adminRoles_permissions_perm_createChildResources = Kind-Ressourcen erzeugen
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = Inventar
view_adminRoles_permissions_perm_manageAlerts = Alarme verwalten
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 7f6465b..aded1a8 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
@@ -473,6 +473,7 @@ util_disambiguationReportDecorator_pluginSuffix = ({0} プラグイン)
util_errorHandler_nullException = 例外は null でした
util_monitoringRequestCallback_error_checkServerStatusFailure = ログインの状態を決定できません - サーバーの状態を調べてください
util_rpcManager_activeRequests = {0} アクティブリクエスト
+##util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = グローバルな権限をロードするのに失敗しました - 何も許可されません
util_userPerm_loadFailGroup = ID [{0}] のリソースグループに対する権限をロードするのに失敗しました - 何も許可されません
util_userPerm_loadFailResource = ID [{0}] のリソースに対する権限をロードするのに失敗しました - 何も許可されません
@@ -548,6 +549,7 @@ view_adminRoles_permissions_isWrite = 書き込みですか?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
view_adminRoles_permissions_permDesc_manageInventory = すべてのリソースについてすべてのリソース権限を持ちます。つまり、グループの作成、更新、削除、そして自動検出された、または手動で検出されたリソースのインポートが可能です
@@ -588,6 +590,7 @@ view_adminRoles_permissions_perm_createChildResources = 子リソースの作成
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = インベントリ
view_adminRoles_permissions_perm_manageAlerts = アラートの管理
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 f70aaa9..02fe8fd 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
@@ -429,6 +429,7 @@ util_ancestry_parentAncestry = 부모의 조상:
util_errorHandler_nullException = 예외는 null이었습니다.
util_monitoringRequestCallback_error_checkServerStatusFailure = 로그인 상태를 확인할 수 없습니다 - 서버의 상태를 확인하십시요
util_rpcManager_activeRequests = {0} 활성화 요청
+##util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = 글로벌 권한을 로드하는데 실패했습니다 - 아무것도 허용되지 않습니다.
util_userPerm_loadFailGroup = ID [{0}] 리소스 그룹에 대한 권한을 로드하는데 실패했습니다 - 아무것도 허용되지 않습니다.
util_userPerm_loadFailResource = ID [{0}] 리소스에 대한 권한을 로드하는데 실패했습니다 - 아무것도 허용되지 않습니다.
@@ -492,6 +493,7 @@ view_adminRoles_permissions_isAuthorized = 권한이 있습니까?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
view_adminRoles_permissions_permDesc_manageInventory = 모든 자원의 모든 자원 권한을 갖습니다. 즉, 그룹의 생성, 삭제, 자동감지 또는 수동으로 검출된 자원을 가져올수 있습니다.
@@ -532,6 +534,7 @@ view_adminRoles_permissions_perm_createChildResources = 자식 리소스 만들
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = 인벤토리
view_adminRoles_permissions_perm_manageAlerts = 경고 관리
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 3a841ad..e4ff417 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
@@ -478,6 +478,7 @@ util_ancestry_parentAncestry = Ancestral para:
util_errorHandler_nullException = Exce\u00E7\u00E3o nula
util_monitoringRequestCallback_error_checkServerStatusFailure = Imposs\u00EDvel verificar o status do login - verifique o status do Servidor.
util_rpcManager_activeRequests = {0} Requisi\u00E7\u00F5es ativas
+##util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = Falha ao carregar permiss\u00F5es globais - nenhuma permiss\u00E3o concedida.
util_userPerm_loadFailGroup = Falha ao carregar suas permiss\u00F5es para o Grupo de Recursos com id [{0}] - nenhuma permiss\u00E3o concedida.
util_userPerm_loadFailResource = Falha ao carregar suas permiss\u00F5es para o Recurso com id [{0}] - nenhuma permiss\u00E3o concedida.
@@ -554,6 +555,7 @@ view_adminRoles_permissions_isWrite = Escrita?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
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.
@@ -594,6 +596,7 @@ view_adminRoles_permissions_perm_createChildResources = Criar Recurso filho
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = Invent\u00E1rio
view_adminRoles_permissions_perm_manageAlerts = Gerenciar Alertas
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 c344361..6202177 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
@@ -2565,6 +2565,7 @@ group_tree_partialClusterTooltip = {0} из {1} членов группы име
##pie_chart_availability_summary_up = Up
util_errorHandler_nullException = Возникло null исключение
util_monitoringRequestCallback_error_checkServerStatusFailure = Не удается определить статус авторизации - проверьте состояние сервера.
+##util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = Не удается загрузить ваши глобальные полномочия - не предоставлены.
util_userPerm_loadFailGroup = Не удается загрузить ваши полномочия для группы ресурсов с id [{0}] - не предоставлены.
util_userPerm_loadFailResource = Не удается загрузить ваши полномочия для ресурса с id [{0}] - не предоставлены.
@@ -2635,6 +2636,7 @@ view_adminRoles_permissions_isWrite = Запись?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
##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
@@ -2675,6 +2677,7 @@ view_adminRoles_permissions_perm_control = Управление
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = Инвентаризация
view_adminRoles_permissions_perm_manageAlerts = Управление предупреждениями
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
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 13616b0..87b706c 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
@@ -467,6 +467,7 @@ util_ancestry_parentAncestry = Parent Ancestry for:
util_errorHandler_nullException = \u5f02\u5e38\u662f null
util_monitoringRequestCallback_error_checkServerStatusFailure = \u65e0\u6cd5\u786e\u5b9a\u767b\u5f55\u72b6\u6001- \u68c0\u67e5\u670d\u52a1\u5668\u72b6\u6001.
util_rpcManager_activeRequests = {0}\u6fc0\u6d3b\u7684\u8bf7\u6c42
+##util_userPerm_loadFailBundle = Failed to load your permissions for Bundle with id [{0}] - none granted.
util_userPerm_loadFailGlobal = \u65e0\u6cd5\u8f7d\u5165\u5168\u5c40\u6743\u9650- \u672a\u6388\u6743.
util_userPerm_loadFailGroup = \u65e0\u6cd5\u8bbf\u95ee\u8d44\u6e90\u7ec4[{0}] - \u672a\u6388\u6743.
util_userPerm_loadFailResource = \u65e0\u6cd5\u8bbf\u95ee\u8d44\u6e90[{0}] - \u672a\u6388\u6743.
@@ -542,6 +543,7 @@ view_adminRoles_permissions_isWrite = \u5199?
##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_deployBundlesToGroup = can deploy any viewable bundle version to the viewable, deployable, compatible, resource group
##view_adminRoles_permissions_permDesc_manageBundleGroups = can create and delete bundle groups. can assign bundles to bundle groups. grants View Bundles permissions
##view_adminRoles_permissions_permDesc_manageBundles = can perform any bundle task. a convenience permission that grants Manage Bundle Groups, Create Bundles, Delete Bundles, Deploy Bundles and View Bundles permissions.
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
@@ -582,6 +584,7 @@ view_adminRoles_permissions_perm_createChildResources = \u521b\u5efa\u5b50\u8d44
##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_deployBundlesToGroup = Deploy Bundles To Group
view_adminRoles_permissions_perm_inventory = \u6e05\u5355
view_adminRoles_permissions_perm_manageAlerts = \u7ba1\u7406\u544a\u8b66
##view_adminRoles_permissions_perm_manageBundleGroups = Manage Bundle Groups
commit 2ad5700ad040fdff9e3ed6091388297a5231eae2
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Aug 23 17:52:54 2013 -0400
Add AuthorizationManager.getBundlePermissions to fetch the bundle level
permissions for a single bundle, based on bundlegroup-role-subject authz.
- make relevant addition to PermissionsLoader in the gui
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
index 12fb916..2b0269b 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/auth/Subject.java
@@ -140,6 +140,10 @@ import org.rhq.core.domain.resource.group.ResourceGroup;
+ " JOIN r.subjects s " //
+ " WHERE s.id = :subjectId and p = :permission ) ) "),
+ @NamedQuery(name = Subject.QUERY_GET_PERMISSIONS_BY_BUNDLE_ID, query = "SELECT distinct p "
+ + "FROM Bundle bundle, IN (bundle.bundleGroups) bg, IN (bg.roles) r, IN (r.subjects) s, IN (r.permissions) p "
+ + "WHERE s = :subject AND bundle.id = :bundleId"),
+
@NamedQuery(name = Subject.QUERY_HAS_BUNDLE_PERMISSION, query = "SELECT COUNT(b) "
+ "FROM Bundle b, IN (b.bundleGroups) bg, IN (bg.roles) r, IN (r.subjects) s, IN (r.permissions) p "
+ "WHERE s = :subject AND b.id = :bundleId AND p = :permission"),
@@ -256,6 +260,7 @@ public class Subject implements Serializable {
public static final String QUERY_GET_PERMISSIONS_BY_GROUP_ID = "Subject.getPermissionsByGroup";
public static final String QUERY_GET_PERMISSIONS_BY_PRIVATE_GROUP_ID = "Subject.getPermissionsByPrivateGroup";
public static final String QUERY_GET_PERMISSIONS_BY_RESOURCE_ID = "Subject.getPermissionsByResource";
+ public static final String QUERY_GET_PERMISSIONS_BY_BUNDLE_ID = "Subject.getPermissionsByBundle";
public static final String QUERY_ROLES_BY_RESOURCE_IDS = "Subject.getRolesByResources";
public static final String QUERY_HAS_GLOBAL_PERMISSION = "Subject.hasGlobalPermission";
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java
index 6d1114c..54d8e23 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/PermissionsLoader.java
@@ -59,17 +59,16 @@ public class PermissionsLoader {
}
public void loadExplicitGlobalPermissions(final PermissionsLoadedListener callback) {
- GWTServiceLookup.getAuthorizationService().getExplicitGlobalPermissions(
- new AsyncCallback<Set<Permission>>() {
+ GWTServiceLookup.getAuthorizationService().getExplicitGlobalPermissions(new AsyncCallback<Set<Permission>>() {
- public void onSuccess(Set<Permission> result) {
- callback.onPermissionsLoaded(result);
- }
+ public void onSuccess(Set<Permission> result) {
+ callback.onPermissionsLoaded(result);
+ }
- public void onFailure(Throwable caught) {
- processFailure(MSG.util_userPerm_loadFailGlobal(), caught);
- callback.onPermissionsLoaded(null); // indicate an error by passing in null
- }
+ public void onFailure(Throwable caught) {
+ processFailure(MSG.util_userPerm_loadFailGlobal(), caught);
+ callback.onPermissionsLoaded(null); // indicate an error by passing in null
+ }
});
}
@@ -103,6 +102,20 @@ public class PermissionsLoader {
});
}
+ public void loadBundlePermissions(final int bundleId, final PermissionsLoadedListener callback) {
+ GWTServiceLookup.getAuthorizationService().getBundlePermissions(bundleId, new AsyncCallback<Set<Permission>>() {
+
+ public void onSuccess(Set<Permission> result) {
+ callback.onPermissionsLoaded(result);
+ }
+
+ public void onFailure(Throwable caught) {
+ processFailure(MSG.util_userPerm_loadFailBundle(String.valueOf(bundleId)), caught);
+ callback.onPermissionsLoaded(null); // indicate an error by passing in null
+ }
+ });
+ }
+
protected void processFailure(String msg, Throwable caught) {
this.lastError = caught;
EnumSet<Option> options = EnumSet.of(Message.Option.BackgroundJobResult);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java
index 2af16c3..7b79d23 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/AuthorizationGWTService.java
@@ -87,6 +87,15 @@ public interface AuthorizationGWTService extends RemoteService {
boolean hasResourcePermission(Permission permission, Collection<Integer> resourceIds) throws RuntimeException;
/**
+ * Gets the set of permissions that the current user explicitly possesses for the specified {@link org.rhq.core.domain.bundle.Bundle}.
+ *
+ * @param bundleId the id of some Bundle to check permissions against
+ *
+ * @return the set of permissions that the current user possesses for the specified {@link org.rhq.core.domain.bundle.Bundle} - never null
+ */
+ Set<Permission> getBundlePermissions(int bundleId) throws RuntimeException;
+
+ /**
* Returns true if the current user possesses either: 1) the specified bundle permission for *all* of the
* specified bundles, or 2) is a system superuser which, by definition, gives full access to all bundles
* NOTE: The size of the collection must be less than or equal to 1000 (due to an Oracle limitation).
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java
index 9dc365f..016ca0c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AuthorizationGWTServiceImpl.java
@@ -37,6 +37,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
private AuthorizationManagerLocal authorizationManager = LookupUtil.getAuthorizationManager();
+ @Override
public Set<Permission> getExplicitResourcePermissions(int resourceId) throws RuntimeException {
try {
return SerialUtility.prepare(
@@ -47,6 +48,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public Set<Permission> getImplicitResourcePermissions(int resourceId) throws RuntimeException {
try {
return SerialUtility.prepare(
@@ -57,6 +59,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public Set<Permission> getExplicitGroupPermissions(int groupId) throws RuntimeException {
try {
return SerialUtility
@@ -68,6 +71,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public Set<Permission> getImplicitGroupPermissions(int groupId) throws RuntimeException {
try {
return SerialUtility
@@ -79,6 +83,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public Set<Permission> getExplicitGlobalPermissions() throws RuntimeException {
try {
return SerialUtility.prepare(
@@ -89,6 +94,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public boolean hasResourcePermission(Permission permission, Collection<Integer> resourceIds)
throws RuntimeException {
try {
@@ -99,6 +105,7 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
}
}
+ @Override
public boolean hasBundlePermission(Permission permission, Collection<Integer> bundleIds) throws RuntimeException {
try {
boolean result = authorizationManager.hasBundlePermission(getSessionSubject(), permission, bundleIds);
@@ -107,4 +114,15 @@ public class AuthorizationGWTServiceImpl extends AbstractGWTServiceImpl implemen
throw getExceptionToThrowToClient(t);
}
}
+
+ @Override
+ public Set<Permission> getBundlePermissions(int bundleId) throws RuntimeException {
+ try {
+ return SerialUtility.prepare(
+ new HashSet<Permission>(authorizationManager.getBundlePermissions(getSessionSubject(), bundleId)),
+ "AuthorizationManager.getBundlePermissions");
+ } catch (Throwable t) {
+ throw getExceptionToThrowToClient(t);
+ }
+ }
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
index 8464133..2c44f43 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerBean.java
@@ -205,6 +205,21 @@ public class AuthorizationManagerBean implements AuthorizationManagerLocal {
@Override
@SuppressWarnings("unchecked")
+ public Set<Permission> getBundlePermissions(Subject subject, int bundleId) {
+ Query query = entityManager.createNamedQuery(Subject.QUERY_GET_PERMISSIONS_BY_BUNDLE_ID);
+ query.setParameter("subject", subject);
+ query.setParameter("bundleId", bundleId);
+ List<Permission> intermediate = query.getResultList();
+ Set<Permission> results = new HashSet<Permission>();
+ for (Permission permission : intermediate) {
+ results.add(permission);
+ }
+
+ return results;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
public boolean hasBundlePermission(Subject subject, Permission permission, Collection<Integer> bundleIds) {
if (isSystemSuperuser(subject)) {
return true;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java
index 18003fb..149e1ee 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/authz/AuthorizationManagerLocal.java
@@ -181,6 +181,16 @@ public interface AuthorizationManagerLocal {
boolean hasBundlePermission(Subject subject, Permission permission, Collection<Integer> bundleIds);
/**
+ * Gets the set of permissions that the current user explicitly possesses for the specified {@link Bundle}.
+ *
+ * @param subject the current subject or caller
+ * @param bundleId the id of some Bundle to check permissions against
+ *
+ * @return the set of permissions that the current user possesses for the specified {@link Bundle} - never null
+ */
+ Set<Permission> getBundlePermissions(Subject subject, int bundleId);
+
+ /**
* Returns true if the current user possesses the specified bundle permission for the specified bundle group.
*
* @param subject the current subject or caller
10 years, 10 months
[rhq] modules/enterprise
by mazz
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java | 43 ++++++++--
1 file changed, 38 insertions(+), 5 deletions(-)
New commits:
commit d96ba01b6f48e0aa433f795ed398a8d3fd8654ba
Author: John Mazzitelli <mazz(a)redhat.com>
Date: Fri Aug 23 17:12:45 2013 -0400
disable all bundle group top nodes in the tree (and show them with a lock icon) if the user doesn't have access to the bundle group itself.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
index 1be273d..6c1dd0a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/tree/BundleTreeDataSource.java
@@ -25,6 +25,8 @@ package org.rhq.enterprise.gui.coregui.client.bundle.tree;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -46,10 +48,12 @@ import org.rhq.core.domain.bundle.BundleVersion;
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.BundleGroupCriteria;
import org.rhq.core.domain.criteria.BundleVersionCriteria;
import org.rhq.core.domain.criteria.Criteria;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
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;
@@ -114,7 +118,7 @@ public class BundleTreeDataSource extends RPCDataSource<Object, Criteria> {
processResponse(request.getRequestId(), response);
}
- public void onSuccess(PageList<Bundle> result) {
+ public void onSuccess(final PageList<Bundle> result) {
BundleGroup unassignedBundleGroup = new BundleGroup();
unassignedBundleGroup.setId(0); // ID=0 is an indicator we use to denote the unassigned group
unassignedBundleGroup.setName(MSG.view_bundle_tree_unassigned_name());
@@ -140,13 +144,42 @@ public class BundleTreeDataSource extends RPCDataSource<Object, Criteria> {
}
}
- ArrayList<BundleGroup> allVisibleBundleGroups = new ArrayList<BundleGroup>(visibleBundleGroups.values());
+ final ArrayList<BundleGroup> allVisibleBundleGroups = new ArrayList<BundleGroup>(visibleBundleGroups.values());
if (!unassignedBundleGroup.getBundles().isEmpty()) {
allVisibleBundleGroups.add(unassignedBundleGroup);
}
- response.setData(buildRecords(allVisibleBundleGroups));
- response.setTotalRows(allVisibleBundleGroups.size());
- processResponse(request.getRequestId(), response);
+
+ BundleGroupCriteria bundleGroupCriteria = new BundleGroupCriteria();
+ bundleGroupCriteria.addFilterIds(visibleBundleGroups.keySet().toArray(new Integer[0]));
+ bundleService.findBundleGroupsByCriteria(bundleGroupCriteria, new AsyncCallback<PageList<BundleGroup>>() {
+ public void onFailure(Throwable caught) {
+ // just log a message, but keep going, this just means we can't show lock icons where applicable
+ CoreGUI.getErrorHandler().handleError(MSG.view_bundle_tree_loadFailure(), caught);
+ }
+
+ public void onSuccess(PageList<BundleGroup> result) {
+ // if any of the bundle group tree nodes represent bundle groups the user isn't allowed
+ // to see, then mark the node with a locked icon
+ HashSet<Integer> permittedBundleGroups = new HashSet<Integer>();
+ for (BundleGroup bg : result) {
+ permittedBundleGroups.add(bg.getId());
+ }
+ ListGridRecord[] dataRecords = buildRecords(allVisibleBundleGroups);
+ for (ListGridRecord dataRecord : dataRecords) {
+ // we only want to examine bundle group records - and they are the only ones
+ // with ID attributes that are a simple number without "_" character
+ TreeNode dataRecordNode = (TreeNode) dataRecord;
+ String idString = dataRecordNode.getAttribute("id");
+ if (!idString.contains("_") && !permittedBundleGroups.contains(Integer.valueOf(idString))) {
+ dataRecordNode.setIcon(ImageManager.getLockedIcon());
+ dataRecordNode.setEnabled(false);
+ }
+ }
+ response.setData(dataRecords);
+ response.setTotalRows(allVisibleBundleGroups.size());
+ processResponse(request.getRequestId(), response);
+ }
+ });
}
});
10 years, 10 months
[rhq] modules/enterprise
by mike thompson
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
New commits:
commit 6262b38c06528930ae1786555ff95391e5d581cf
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Fri Aug 23 13:55:32 2013 -0700
[BZ 1000175] - Metrics UI tab does not refresh properly between different resources.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index bd66f0a..35e8f56 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -111,6 +111,7 @@ public class ResourceDetailView extends
}
private Integer resourceId;
+ private Integer lastSelectedResourceId = 0;
private ResourceComposite resourceComposite;
@@ -394,7 +395,7 @@ public class ResourceDetailView extends
viewFactory = (!visible) ? null : new ViewFactory() {
@Override
public Canvas createView() {
- if(null == metricsResourceView){
+ if(null == metricsResourceView || resource.getId() != lastSelectedResourceId){
metricsResourceView = new MetricsResourceView(resource);
}
return metricsResourceView;
@@ -603,6 +604,7 @@ public class ResourceDetailView extends
resourceComposite.getResource().setResourceType(type);
updateTabContent(resourceComposite, viewPath.isRefresh());
selectTab(getTabName(), getSubTabName(), viewPath);
+ lastSelectedResourceId = resourceComposite.getResource().getId();
} finally {
notifyViewRenderedListeners();
}
10 years, 10 months
[rhq] 3 commits - modules/core modules/enterprise
by Jiri Kremser
modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeConfigurationComposite.java | 44 +++-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeConfigurationEditor.java | 29 +-
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java | 9
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java | 2
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java | 27 ++
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java | 8
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java | 27 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java | 6
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java | 110 ++++++++--
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/StorageClusterReadRepairJob.java | 4
11 files changed, 211 insertions(+), 56 deletions(-)
New commits:
commit b6053de148bac12598dc822f4f4e935316a2b102
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri Aug 23 19:14:21 2013 +0200
Adding check to StorageManagerBean.findStorageNodeLoadDataForLast whether the cluster is running; AuthZ: ensuring the presence MANAGE_SETTINGS on all remotelly exposed methods on StorageManagerBean and adding the jdoc for them.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java
index 5548285..9ce328e 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/StorageGWTServiceImpl.java
@@ -26,7 +26,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.cloud.StorageClusterSettings;
import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNodeConfigurationComposite;
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 0a8b385..663ee1e 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
@@ -30,6 +30,7 @@ import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
@@ -80,7 +81,6 @@ import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.alert.AlertManagerLocal;
import org.rhq.enterprise.server.auth.SubjectManagerLocal;
import org.rhq.enterprise.server.authz.RequiredPermission;
-import org.rhq.enterprise.server.authz.RequiredPermissions;
import org.rhq.enterprise.server.configuration.ConfigurationManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.operation.OperationManagerLocal;
@@ -248,6 +248,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public void deployStorageNode(Subject subject, StorageNode storageNode) {
storageNode = entityManager.find(StorageNode.class, storageNode.getId());
@@ -276,6 +277,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public void undeployStorageNode(Subject subject, StorageNode storageNode) {
storageNode = entityManager.find(StorageNode.class, storageNode.getId());
switch (storageNode.getOperationMode()) {
@@ -524,8 +526,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
}
@Override
- @RequiredPermissions({ @RequiredPermission(Permission.MANAGE_SETTINGS),
- @RequiredPermission(Permission.MANAGE_INVENTORY) })
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public void prepareNodeForUpgrade(Subject subject, StorageNode storageNode) {
int storageNodeResourceId = getResourceIdFromStorageNode(storageNode);
OperationManagerLocal operationManager = LookupUtil.getOperationManager();
@@ -567,7 +568,8 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
}
@Override
- public void runClusterMaintenance() {
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
+ public void runClusterMaintenance(Subject subject) {
List<StorageNode> storageNodes = getStorageNodes();
for (StorageNode storageNode : storageNodes) {
@@ -604,21 +606,25 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public PageList<Alert> findNotAcknowledgedStorageNodeAlerts(Subject subject) {
return findStorageNodeAlerts(subject, false, null);
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public PageList<Alert> findNotAcknowledgedStorageNodeAlerts(Subject subject, StorageNode storageNode) {
return findStorageNodeAlerts(subject, false, storageNode);
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public PageList<Alert> findAllStorageNodeAlerts(Subject subject) {
return findStorageNodeAlerts(subject, true, null);
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public PageList<Alert> findAllStorageNodeAlerts(Subject subject, StorageNode storageNode) {
return findStorageNodeAlerts(subject, true, storageNode);
}
@@ -699,6 +705,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public StorageNodeConfigurationComposite retrieveConfiguration(Subject subject, StorageNode storageNode) {
StorageNodeConfigurationComposite configuration = new StorageNodeConfigurationComposite(storageNode);
@@ -718,11 +725,13 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
@Override
@Asynchronous
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public void updateConfigurationAsync(Subject subject, StorageNodeConfigurationComposite storageNodeConfiguration) {
updateConfiguration(subject, storageNodeConfiguration);
}
@Override
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public boolean updateConfiguration(Subject subject, StorageNodeConfigurationComposite storageNodeConfiguration) {
try {
StorageNode storageNode = findStorageNodeByAddress(InetAddress.getByName(
@@ -784,15 +793,19 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public void scheduleOperationInNewTransaction(Subject subject, ResourceOperationSchedule schedule) {
operationManager.scheduleResourceOperation(subject, schedule);
}
@Override
- @RequiredPermissions({ @RequiredPermission(Permission.MANAGE_SETTINGS),
- @RequiredPermission(Permission.MANAGE_INVENTORY) })
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public Map<String, List<MeasurementDataNumericHighLowComposite>> findStorageNodeLoadDataForLast(Subject subject,
StorageNode node, long beginTime, long endTime, int numPoints) {
+ // this method is called to get the data for sparkline graphs
+ if (!storageClientManager.isClusterAvailable()) {
+ return Collections.<String, List<MeasurementDataNumericHighLowComposite>>emptyMap();
+ }
int storageNodeResourceId = getResourceIdFromStorageNode(node);
Map<String, List<MeasurementDataNumericHighLowComposite>> result = new LinkedHashMap<String, List<MeasurementDataNumericHighLowComposite>>();
@@ -836,7 +849,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageN
return result;
}
-
+
private boolean runOperationAndWaitForResult(Subject subject, Resource storageNodeResource, String operationToRun,
Configuration parameters) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java
index ec871f4..e389637 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java
@@ -160,8 +160,12 @@ public interface StorageNodeManagerLocal {
* <strong>NOTE:</strong> Repair is one of the most resource-intensive operations that a storage node performs. Make
* sure you know what you are doing if you invoke this method outside of the regularly scheduled maintenance window.
* </p>
+ *
+ * <p>the subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ *
+ * @param subject user that must have proper permissions
*/
- void runClusterMaintenance();
+ void runClusterMaintenance(Subject subject);
void scheduleOperationInNewTransaction(Subject subject, ResourceOperationSchedule schedule);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java
index a9a3090..7bef4b3 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java
@@ -25,6 +25,7 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNodeConfigurationComposite;
import org.rhq.core.domain.cloud.StorageNodeLoadComposite;
+import org.rhq.core.domain.cloud.StorageNode.OperationMode;
import org.rhq.core.domain.criteria.StorageNodeCriteria;
import org.rhq.core.domain.util.PageList;
@@ -39,67 +40,136 @@ public interface StorageNodeManagerRemote {
/**
* <p>Returns the summary of load of the storage node.</p>
*
- * <p>the subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
*
* @param subject user that must have proper permissions
* @param node storage node entity (it can be a new object, but the id should be set properly)
* @param beginTime the start time
* @param endTime the end time
- * @return instance of {@link StorageNodeLoadComposite} with the aggregate measurement data of selected metrics
+ * @return instance of {@link StorageNodeLoadComposite} with the aggregate measurement data of selected metrics
*/
StorageNodeLoadComposite getLoad(Subject subject, StorageNode node, long beginTime, long endTime);
+ /**
+ * <p>Returns the current configuration of the storage node.</p>
+ * <p>For updating the configuration see {@link #retrieveConfiguration(Subject,StorageNode)}.</p>
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ *
+ * @param subject user that must have proper permissions
+ * @param storageNode the storage node for which we want to get the configuration
+ * @return instance of {@link StorageNodeConfigurationComposite} with the configuration properties
+ */
StorageNodeConfigurationComposite retrieveConfiguration(Subject subject, StorageNode storageNode);
+ /**
+ * <p>Updates the current configuration of the storage node.</p>
+ * <p>For retrieving the configuration see {@link #updateConfiguration(Subject,StorageNodeConfigurationComposite)}.</p>
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ *
+ * @param subject user that must have proper permissions
+ * @param storageNodeConfiguration instance of {@link StorageNodeConfigurationComposite} with the configuration properties
+ * @return true if the update was successful
+ */
boolean updateConfiguration(Subject subject, StorageNodeConfigurationComposite storageNodeConfiguration);
/**
* <p>Fetches the list of {@link StorageNode} entities based on provided criteria.</p>
*
- * <p>the subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
*
- * @param subject user that must have proper permissions
- * @param criteria the criteria
- * @return list of nodes
+ * @param subject user that must have proper permissions
+ * @param criteria the criteria
+ * @return list of nodes
*/
PageList<StorageNode> findStorageNodesByCriteria(Subject subject, StorageNodeCriteria criteria);
/**
- * Fetches the list of Storage Node related alerts that have not yet been acknowledged.
+ * <p>Fetches the list of Storage Node related alerts that have not yet been acknowledged.</p>
+ *
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
*
- * @param subject subject
- * @return storage nodes alerts not acknowledged
+ * @param subject user that must have proper permissions
+ * @return storage nodes alerts not acknowledged
*/
PageList<Alert> findNotAcknowledgedStorageNodeAlerts(Subject subject);
/**
- * Fetches the list of Storage Node related alerts that have not yet been acknowledged for the
- * specified storage node.
+ * <p>Fetches the list of Storage Node related alerts that have not yet been acknowledged for the
+ * specified storage node.</p>
+ *
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
*
- * @param subject subject
- * @return storage nodes alerts not acknowledged
+ * @param subject user that must have proper permissions
+ * @return storage nodes alerts not acknowledged
*/
PageList<Alert> findNotAcknowledgedStorageNodeAlerts(Subject subject, StorageNode storageNode);
/**
- * Fetches all the Storage Node related alerts.
+ * <p>Fetches all the Storage Node related alerts.</p>
+ *
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
*
- * @param subject subject
- * @return all storage nodes alerts
+ * @param subject user that must have proper permissions
+ * @return all storage nodes alerts
*/
PageList<Alert> findAllStorageNodeAlerts(Subject subject);
/**
- * Fetches all the Storage Node related alerts for the specified storage node.
+ * <p>Fetches all the Storage Node related alerts for the specified storage node.</p>
+ *
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
*
- * @param subject subject
- * @return all storage nodes alerts
+ * @param subject user that must have proper permissions
+ * @return all storage nodes alerts
*/
PageList<Alert> findAllStorageNodeAlerts(Subject subject, StorageNode storageNode);
+ /**
+ * <p>Runs the deploy operations on the given storage node. This operation should ensure the node will be part of the RHQ storage cluster.</p>
+ * <p>This will move the storage node from operation mode <code>INSTALLED</code> to the mode <code>NORMAL</code> going through following phases:</p>
+ * <ol>
+ * <li><code>ANNOUNCE</code></li>
+ * <li><code>BOOTSTRAP</code></li>
+ * <li><code>ADD_MAINTENANCE</code></li>
+ * </ol>
+ * <p>This can be run also on a storage node that is in any intermediate modes mentioned above, because of some failure during the deployment process.</p>
+ *
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ *
+ * @see <a href="https://docs.jboss.org/author/display/RHQ/Deploying+Storage+Nodes">https://docs.jboss.org/author/display/RHQ/Deploying+Storage+Nodes</a>
+ * @param sbubject user that must have proper permissions
+ * @param storageNode storage node to be deployed to the cluster
+ */
void deployStorageNode(Subject sbubject, StorageNode storageNode);
+ /**
+ * <p>Runs the undeploy operations on the given storage node. This operation should ensure the node will removed from the RHQ storage cluster.</p>
+ * <p>This will move the storage node from operation mode <code>NORMAL</code> or any other mode to the mode <code>UNINSTALL</code>. At the end of the day,
+ * the node is removed also from the relational database. Currently there is no way to add it back.</p>
+ * <p>WARNING: Run this operation only if you know what you are doing.</p>
+ *
+ * <p>The subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ *
+ * @see <a href="https://docs.jboss.org/author/display/RHQ/Deploying+Storage+Nodes">https://docs.jboss.org/author/display/RHQ/Deploying+Storage+Nodes</a>
+ * @param sbubject user that must have proper permissions
+ * @param storageNode storage node to be deployed to the cluster
+ */
void undeployStorageNode(Subject subject, StorageNode storageNode);
- void runClusterMaintenance();
+ /**
+ * <p>
+ * Schedules read repair to run on the storage cluster. The repair operation is executed one node at a time. This
+ * method is invoked from {@link org.rhq.enterprise.server.scheduler.jobs.StorageClusterReadRepairJob StorageClusterReadRepairJob}
+ * as part of regularly scheduled maintenance.
+ * </p>
+ * <p>
+ * <strong>NOTE:</strong> Repair is one of the most resource-intensive operations that a storage node performs. Make
+ * sure you know what you are doing if you invoke this method outside of the regularly scheduled maintenance window.
+ * </p>
+ *
+ * <p>the subject needs to have <code>MANAGE_SETTINGS</code> permissions.</p>
+ *
+ * @param subject user that must have proper permissions
+ */
+ void runClusterMaintenance(Subject subject);
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/StorageClusterReadRepairJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/StorageClusterReadRepairJob.java
index 514a8d0..a2029ec 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/StorageClusterReadRepairJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/scheduler/jobs/StorageClusterReadRepairJob.java
@@ -5,6 +5,7 @@ import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
+import org.rhq.core.domain.auth.Subject;
import org.rhq.enterprise.server.cloud.StorageNodeManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
@@ -18,7 +19,8 @@ public class StorageClusterReadRepairJob extends AbstractStatefulJob {
@Override
public void executeJobCode(JobExecutionContext context) throws JobExecutionException {
log.info("Preparing to run read repair on storage cluster");
+ Subject overlord = LookupUtil.getSubjectManager().getOverlord();
StorageNodeManagerLocal storageNodeManager = LookupUtil.getStorageNodeManager();
- storageNodeManager.runClusterMaintenance();
+ storageNodeManager.runClusterMaintenance(overlord);
}
}
commit ca723caa9c89616e70c5bd036c5bbc5da8bc0a0f
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri Aug 23 18:39:36 2013 +0200
Unable to update the storage node configuration if there were no changes made. Changing the configuration needs restart of the node, so I've added this check.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeConfigurationComposite.java b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeConfigurationComposite.java
index fccae9b..32a9b7c 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeConfigurationComposite.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeConfigurationComposite.java
@@ -163,9 +163,47 @@ public class StorageNodeConfigurationComposite implements Serializable {
return validHeap && validJMXPort;
}
- /* (non-Javadoc)
- * @see java.lang.Object#toString()
- */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((heapNewSize == null) ? 0 : heapNewSize.hashCode());
+ result = prime * result + ((heapSize == null) ? 0 : heapSize.hashCode());
+ result = prime * result + jmxPort;
+ result = prime * result + ((threadStackSize == null) ? 0 : threadStackSize.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ StorageNodeConfigurationComposite other = (StorageNodeConfigurationComposite) obj;
+ if (heapNewSize == null) {
+ if (other.heapNewSize != null)
+ return false;
+ } else if (!heapNewSize.equals(other.heapNewSize))
+ return false;
+ if (heapSize == null) {
+ if (other.heapSize != null)
+ return false;
+ } else if (!heapSize.equals(other.heapSize))
+ return false;
+ if (jmxPort != other.jmxPort)
+ return false;
+ if (threadStackSize == null) {
+ if (other.threadStackSize != null)
+ return false;
+ } else if (!threadStackSize.equals(other.threadStackSize))
+ return false;
+ return true;
+ }
+
+ @Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("storageNode.addresss=").append(storageNode == null ? "unknown" : storageNode.getAddress())
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeConfigurationEditor.java
index 7bcf2cd..1f17e7a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeConfigurationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeConfigurationEditor.java
@@ -74,8 +74,7 @@ public class StorageNodeConfigurationEditor extends EnhancedVLayout implements R
this.configuration = configuration;
}
- private void save() {
- updateConfiguration();
+ private void save(final StorageNodeConfigurationComposite configuration) {
GWTServiceLookup.getStorageService().updateConfiguration(configuration, new AsyncCallback<Void>() {
public void onSuccess(Void result) {
Message msg = new Message("Storage node settings were successfully updated.", Message.Severity.Info);
@@ -242,16 +241,21 @@ public class StorageNodeConfigurationEditor extends EnhancedVLayout implements R
form.setErrors(errors, true);
return;
}
- SC.ask(
- "Changing the storage node configuration requires restart of storage node. Do you want to continue?",
- new BooleanCallback() {
- @Override
- public void execute(Boolean value) {
- if (value) {
- save();
+ final StorageNodeConfigurationComposite configuration = getConfiguration();
+ if (StorageNodeConfigurationEditor.this.configuration.equals(configuration)) {
+ SC.say("Info", "There were no changes done.");
+ } else {
+ SC.ask(
+ "Changing the storage node configuration requires restart of storage node. Do you want to continue?",
+ new BooleanCallback() {
+ @Override
+ public void execute(Boolean value) {
+ if (value) {
+ save(configuration);
+ }
}
- }
- });
+ });
+ }
}
}
});
@@ -264,7 +268,8 @@ public class StorageNodeConfigurationEditor extends EnhancedVLayout implements R
return toolStrip;
}
- private StorageNodeConfigurationComposite updateConfiguration() {
+ private StorageNodeConfigurationComposite getConfiguration() {
+ StorageNodeConfigurationComposite configuration = new StorageNodeConfigurationComposite();
configuration.setHeapSize(getJVMMemoryString(form.getField(FIELD_HEAP_MAX).getValue().toString()));
configuration.setHeapNewSize(getJVMMemoryString(form.getField(FIELD_HEAP_NEW).getValue().toString()));
configuration.setThreadStackSize(form.getValueAsString(FIELD_THREAD_STACK_SIZE));
commit efdeb1cd97e654964a876835295b02ef8aedb042
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri Aug 23 18:34:19 2013 +0200
Changes to storage node detail page: adding the availability field and the operation mode field.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java
index f358ca4..9800736 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasource.java
@@ -134,10 +134,11 @@ public class StorageNodeDatasource extends RPCDataSource<StorageNodeLoadComposit
field.setShowHover(true);
field.setHoverCustomizer(new HoverCustomizer() {
public String hoverHTML(Object value, ListGridRecord record, int rowNum, int colNum) {
- return "Average disk Ratio of (Free Disk)/(Data File Size) for last 8 hours. A value below 1 is not "
- + "recommended since a compaction or repair process could double the amount of disk "
- + "space used by data files. If multiple data locations are specified then the "
- + "aggregate accross all the partitions that contain data files is reported.";
+ return "Actual value: " + value.toString() + "<br/>Average disk Ratio of (Free Disk)/(Data File Size)" +
+ " for last 8 hours. A value below 0.7 is not recommended since a compaction or repair" +
+ " process could double the amount of disk space used by data files. Value between 0.7" +
+ " and 1.5 is displayed as a oragne warning. If multiple data locations are specified" +
+ " then the aggregate accross all the partitions that contain data files is reported.";
}
});
fields.add(field);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java
index b270297..bd12ed0 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDatasourceField.java
@@ -38,7 +38,7 @@ public enum StorageNodeDatasourceField {
FIELD_CQL_PORT("cqlPort", "CQL Port"),
- FIELD_OPERATION_MODE("operationMode", CoreGUI.getMessages().view_adminTopology_server_mode()),
+ FIELD_OPERATION_MODE("operationMode", "Operation Mode"),
FIELD_STATUS("status", "Cluster Status"),
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java
index f5de561..9388abd 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeDetailView.java
@@ -21,11 +21,13 @@ package org.rhq.enterprise.gui.coregui.client.admin.storage;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_ADDRESS;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_ALERTS;
+import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_AVAILABILITY;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_CQL_PORT;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_CTIME;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_JMX_PORT;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_MTIME;
import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_OPERATION_MODE;
+import static org.rhq.enterprise.gui.coregui.client.admin.storage.StorageNodeDatasourceField.FIELD_STATUS;
import java.util.ArrayList;
import java.util.Arrays;
@@ -48,6 +50,8 @@ import com.smartgwt.client.widgets.layout.SectionStackSection;
import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNodeConfigurationComposite;
import org.rhq.core.domain.criteria.StorageNodeCriteria;
+import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.ResourceAvailability;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.resource.Resource;
@@ -56,6 +60,7 @@ import org.rhq.core.domain.util.PageList;
import org.rhq.core.domain.util.collection.ArrayUtils;
import org.rhq.enterprise.gui.coregui.client.BookmarkableView;
import org.rhq.enterprise.gui.coregui.client.CoreGUI;
+import org.rhq.enterprise.gui.coregui.client.ImageManager;
import org.rhq.enterprise.gui.coregui.client.LinkManager;
import org.rhq.enterprise.gui.coregui.client.ViewPath;
import org.rhq.enterprise.gui.coregui.client.components.table.TimestampCellFormatter;
@@ -308,21 +313,37 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
// jmxConnectionUrlItem.setValue(storageNode.getJMXConnectionURL());
final StaticTextItem operationModeItem = new StaticTextItem(FIELD_OPERATION_MODE.propertyName(),
- MSG.view_adminTopology_serverDetail_operationMode());
+ FIELD_OPERATION_MODE.title());
operationModeItem.setValue(storageNode.getOperationMode());
+ final StaticTextItem clusterStatusItem = new StaticTextItem(FIELD_STATUS.propertyName(), FIELD_STATUS.title());
+ clusterStatusItem.setValue(storageNode.getStatus());
+
+ final StaticTextItem availabilityItem = new StaticTextItem(FIELD_AVAILABILITY.propertyName(),
+ FIELD_AVAILABILITY.title());
+
// make clickable link to associated resource
StaticTextItem resourceItem = new StaticTextItem("associatedResource", "Associated Resource");
String storageNodeItemText = "";
+ String availabilityItemText = imgHTML(ImageManager.getAvailabilityIconFromAvailType(AvailabilityType.UNKNOWN));
Resource storageNodeResource = storageNode.getResource();
if (storageNodeResource != null && storageNodeResource.getName() != null) {
String detailsUrl = LinkManager.getResourceLink(storageNodeResource.getId());
String formattedValue = StringUtility.escapeHtml(storageNodeResource.getName());
storageNodeItemText = LinkManager.getHref(detailsUrl, formattedValue);
+
+ // set the availability
+ ResourceAvailability availability = storageNodeResource.getCurrentAvailability();
+ if (storageNodeResource.getCurrentAvailability() != null
+ && storageNodeResource.getCurrentAvailability().getAvailabilityType() != null) {
+ availabilityItemText = imgHTML(ImageManager.getAvailabilityIconFromAvailType(availability
+ .getAvailabilityType()));
+ }
} else {
storageNodeItemText = MSG.common_label_none();
}
resourceItem.setValue(storageNodeItemText);
+ availabilityItem.setValue(availabilityItemText);
StaticTextItem installationDateItem = new StaticTextItem(FIELD_CTIME.propertyName(), FIELD_CTIME.title());
installationDateItem.setValue(TimestampCellFormatter.format(Long.valueOf(storageNode.getCtime()),
@@ -368,10 +389,10 @@ public class StorageNodeDetailView extends EnhancedVLayout implements Bookmarkab
}
List<FormItem> formItems = new ArrayList<FormItem>(6);
- formItems.addAll(Arrays.asList(nameItem, resourceItem, cqlPortItem, jmxPortItem/*, jmxConnectionUrlItem*/));
+ formItems.addAll(Arrays.asList(nameItem, resourceItem, availabilityItem, cqlPortItem, jmxPortItem/*, jmxConnectionUrlItem*/));
if (!CoreGUI.isDebugMode())
formItems.add(operationModeItem); // debug mode fails if this item is added
- formItems.addAll(Arrays.asList(installationDateItem, lastUpdateItem, alertsItem, messageItem));
+ formItems.addAll(Arrays.asList(clusterStatusItem, installationDateItem, lastUpdateItem, alertsItem, messageItem));
if (isOperationFailed)
formItems.add(lastOperation);
form.setItems(formItems.toArray(new FormItem[] {}));
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
index 528d7d8..47820a6 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
@@ -320,13 +320,13 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
ParametrizedMessage question = new ParametrizedMessage() {
@Override
public String getMessage(String... param) {
- return "Are you sure, you want to run operation " + param[0] + "?";
+ return "Are you sure, you want to run operation " + param[0] + "? On the selected nodes: " + param[1];
}
};
ParametrizedMessage success = new ParametrizedMessage() {
@Override
public String getMessage(String... param) {
- return "Operation" + param[0] + " was successfully scheduled for storage nodes " + param[1];
+ return "Operation " + param[0] + " was successfully scheduled for storage nodes " + param[1];
}
};
ParametrizedMessage failure = new ParametrizedMessage() {
@@ -352,7 +352,9 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
final ParametrizedMessage success, final ParametrizedMessage failure, final StorageNodeOperation operationType) {
final String operationName = (String) actionValue;
final List<String> selectedAddresses = getSelectedAddresses(selections);
- SC.ask(question.getMessage(selectedAddresses.toString()), new BooleanCallback() {
+ String areYouSureQuestion = operationType == StorageNodeOperation.OTHER ? question.getMessage(operationName,
+ selectedAddresses.toString()) : question.getMessage(selectedAddresses.toString());
+ SC.ask(areYouSureQuestion, new BooleanCallback() {
public void execute(Boolean confirmed) {
if (confirmed) {
final CountDownLatch latch = CountDownLatch.create(selections.length, new Command() {
10 years, 10 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/bundle/BundleManagerBean.java | 1 +
1 file changed, 1 insertion(+)
New commits:
commit 18b9c83386c8ebf3d0cbffa35ca6f778a654df36
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri Aug 23 09:20:48 2013 -0400
fix issue where bundle group description does not get updated
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 ae30f11..d224c56 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
@@ -2431,6 +2431,7 @@ public class BundleManagerBean implements BundleManagerLocal, BundleManagerRemot
// First update the simple fields and the permissions.
attachedBundleGroup.setName(bundleGroup.getName());
+ attachedBundleGroup.setDescription(bundleGroup.getDescription());
Set<Bundle> newBundles = bundleGroup.getBundles();
if (newBundles != null) {
10 years, 10 months
[rhq] modules/enterprise
by Jiri Kremser
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/ClusterConfigurationEditor.java | 10 +++++++---
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java | 2 +-
2 files changed, 8 insertions(+), 4 deletions(-)
New commits:
commit 3903540693aa6c6bf360415807ee4030069de9bd
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri Aug 23 13:25:20 2013 +0200
UI work: Making cluster setting read only, changing description of the Gossip Port property field.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/ClusterConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/ClusterConfigurationEditor.java
index 279a54a..438a1bc 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/ClusterConfigurationEditor.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/ClusterConfigurationEditor.java
@@ -29,7 +29,6 @@ import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
-import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
@@ -60,13 +59,15 @@ public class ClusterConfigurationEditor extends EnhancedVLayout implements Refre
private EnhancedIButton saveButton;
private boolean oddRow;
private StorageClusterSettings settings;
+ private final boolean readOnly;
private static String FIELD_CQL_PORT = "cql_port";
private static String FIELD_GOSSIP_PORT = "gossip_port";
private static String FIELD_AUTOMATIC_DEPLOYMENT = "automatic_deployment";
- public ClusterConfigurationEditor() {
+ public ClusterConfigurationEditor(boolean readOnly) {
super();
+ this.readOnly = readOnly;
}
private void fetchClusterSettings() {
@@ -127,6 +128,7 @@ public class ClusterConfigurationEditor extends EnhancedVLayout implements Refre
valueItem.setShowTitle(false);
valueItem.setRequired(true);
valueItem.setCellStyle(oddRow ? "OddRow" : "EvenRow");
+ valueItem.setDisabled(readOnly);
fields.add(valueItem);
StaticTextItem descriptionItem = new StaticTextItem();
@@ -187,7 +189,7 @@ public class ClusterConfigurationEditor extends EnhancedVLayout implements Refre
validator = new IsIntegerValidator();
items.addAll(buildOneFormRowWithValidator(FIELD_GOSSIP_PORT, "Gossip Port",
String.valueOf(settings.getGossipPort()),
- "The port used for internode communication. This is a shared, cluster-wide setting.", validator));
+ "The port used for internode communication in the storage cluster.", validator));
List<FormItem> automaticDeploymentItems = buildOneFormRow(
FIELD_AUTOMATIC_DEPLOYMENT,
@@ -206,6 +208,7 @@ public class ClusterConfigurationEditor extends EnhancedVLayout implements Refre
autoDeployRadio.setShowTitle(false);
autoDeployRadio.setRequired(true);
autoDeployRadio.setCellStyle(!oddRow ? "OddRow" : "EvenRow");
+ autoDeployRadio.setDisabled(readOnly);
oddRow = !oddRow;
automaticDeploymentItems.set(1, autoDeployRadio);
items.addAll(automaticDeploymentItems);
@@ -246,6 +249,7 @@ public class ClusterConfigurationEditor extends EnhancedVLayout implements Refre
}
}
});
+ saveButton.setDisabled(readOnly);
EnhancedToolStrip toolStrip = new EnhancedToolStrip();
toolStrip.setWidth100();
toolStrip.setMembersMargin(5);
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java
index c49f697..a7c71e9 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeAdminView.java
@@ -143,7 +143,7 @@ public class StorageNodeAdminView extends EnhancedVLayout implements Bookmarkabl
});
}
} else if (tabInfo.equals(settingsTabInfo)) {
- ClusterConfigurationEditor editor = new ClusterConfigurationEditor();
+ ClusterConfigurationEditor editor = new ClusterConfigurationEditor(true);
tabset.getTabByName(tabInfo.name.getName()).setPane(editor);
tabset.selectTab(tabInfo.index);
10 years, 10 months
[rhq] 3 commits - modules/core modules/enterprise modules/integration-tests modules/plugins
by Heiko W. Rupp
modules/core/domain/intentional-api-changes-since-4.8.0.xml | 8 +
modules/core/domain/src/main/java/org/rhq/core/domain/operation/OperationHistory.java | 21 +++-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java | 22 ++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java | 48 +++++++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java | 26 ++++-
modules/integration-tests/rest-api/pom.xml | 6 +
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java | 2
modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/OperationsTest.java | 23 +++-
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JBossProductType.java | 2
9 files changed, 134 insertions(+), 24 deletions(-)
New commits:
commit 1cd277b34e9acd277d5aafebde987b1103c660e0
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Aug 23 13:25:52 2013 +0200
BZ 972756 - Create history items before scheduling in quartz.
This prevents the time window without history after scheduling and before quartz starts working, which was breaking fast clients.
diff --git a/modules/core/domain/intentional-api-changes-since-4.8.0.xml b/modules/core/domain/intentional-api-changes-since-4.8.0.xml
index 6a22ea5..4a23253 100644
--- a/modules/core/domain/intentional-api-changes-since-4.8.0.xml
+++ b/modules/core/domain/intentional-api-changes-since-4.8.0.xml
@@ -17,4 +17,12 @@
The new method will clear only the specified status.
</justification>
</difference>
+ <difference>
+ <className>org/rhq/core/domain/operation/OperationHistory</className>
+ <differenceType>7012</differenceType><!-- method added -->
+ <method>void setStartedTime(long)</method>
+ <justification>
+ We are adding a method to explicitly set the start time.
+ </justification>
+ </difference>
</differences>
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/OperationHistory.java b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/OperationHistory.java
index f81ec9a..f3beb14 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/operation/OperationHistory.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/operation/OperationHistory.java
@@ -342,10 +342,27 @@ public abstract class OperationHistory implements Serializable {
}
/**
+ * This method MUST be called when the corresponding operation is triggered, but before the request is sent down to
+ * the agent. The started time is used in the calculation of {@link #getDuration()}, which is in turn used by the
+ * business layer to reason whether an operation has timed out. If this method is never called, and if there are
+ * any issues executing the corresponding operation, this history element will never time out and will forever stay
+ * in the {@link OperationRequestStatus#INPROGRESS} state.
+ *
+ * @throws IllegalArgumentException if an attempt is made to start this object more than once
+ * @see #getCreatedTime()
+ * @since RHQ 4.9
+ */
+ public void setStartedTime(long startedTime) {
+ if (this.startedTime != 0) {
+ throw new IllegalArgumentException("Can only start an operation once");
+ }
+ this.startedTime = startedTime;
+ }
+
+ /**
* The time when corresponding operation was started. If the corresponding operation has not yet been started,
* this method will return 0.
- *
- * @return started time, in epoch millis
+ * * @return started time, in epoch millis
*/
public long getStartedTime() {
return this.startedTime;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java
index ad8fb59..ceabb56 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationJob.java
@@ -19,6 +19,7 @@
package org.rhq.enterprise.server.operation;
import java.util.Date;
+import java.util.List;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
@@ -26,7 +27,9 @@ import org.quartz.JobDetail;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.criteria.ResourceOperationHistoryCriteria;
import org.rhq.core.domain.operation.GroupOperationHistory;
+import org.rhq.core.domain.operation.JobId;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.operation.ResourceOperationHistory;
import org.rhq.core.domain.operation.ScheduleJobId;
@@ -122,4 +125,23 @@ public abstract class OperationJob implements Job {
return persisted;
}
+
+ protected ResourceOperationHistory findOperationHistory(String name, String group,
+ OperationManagerLocal operationManager,
+ ResourceOperationSchedule schedule) {
+
+ JobId jobId = new JobId(name,group);
+
+ ResourceOperationHistoryCriteria criteria = new ResourceOperationHistoryCriteria();
+ criteria.addFilterJobId(jobId);
+
+ ResourceOperationHistory history ;
+ List<ResourceOperationHistory> list = operationManager.findResourceOperationHistoriesByCriteria(schedule.getSubject(),criteria);
+ if (list==null || list.isEmpty()) {
+ return null;
+ }
+
+ history = list.get(0);
+ return history;
+ }
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
index f5ceae6..8ac6af4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/OperationManagerBean.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2011 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,8 +13,8 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.enterprise.server.operation;
@@ -232,7 +232,7 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
ensureControlPermission(subject, resource);
- validateOperationNameAndParameters(resource.getResourceType(), operationName, parameters);
+ OperationDefinition opDef = validateOperationNameAndParameters(resource.getResourceType(), operationName, parameters);
String uniqueJobId = createUniqueJobName(resource, operationName);
@@ -254,7 +254,8 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
JobDetail jobDetail = new JobDetail();
jobDetail.setName(uniqueJobId);
- jobDetail.setGroup(createJobGroupName(resource));
+ String jobGroupName = createJobGroupName(resource);
+ jobDetail.setGroup(jobGroupName);
jobDetail.setDescription(notes);
jobDetail.setVolatility(false); // we want it persisted
jobDetail.setDurability(false);
@@ -282,6 +283,13 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
LOG.debug("Scheduled Resource operation [" + newSchedule + "] - next fire time is [" + next + "]");
+ // Create an IN_PROGRESS item
+ ResourceOperationHistory history;
+ history = new ResourceOperationHistory(uniqueJobId, jobGroupName, subject.getName(), opDef, parameters,
+ schedule.getResource(), null);
+
+ updateOperationHistory(subject,history);
+
return newSchedule;
}
@@ -896,7 +904,22 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
ensureControlPermission(subject, history);
}
- // we do not cascade add the param config (we probably can add that but), so let's persist it now
+
+ // The history item may have been created already, so find it in the database and
+ // set the new state from our input
+ if (history.getId()!=0) {
+ OperationHistory existingHistoryItem =entityManager.find(OperationHistory.class,history.getId());
+ existingHistoryItem.setStatus(history.getStatus());
+ existingHistoryItem.setErrorMessage(history.getErrorMessage());
+ if (existingHistoryItem.getStartedTime()==0) {
+ existingHistoryItem.setStartedTime(history.getStartedTime());
+ }
+ if (history instanceof ResourceOperationHistory) {
+ ((ResourceOperationHistory)existingHistoryItem).setResults(((ResourceOperationHistory) history).getResults());
+ }
+ history = existingHistoryItem;
+ }
+ // we do not cascade add the param config (we probably can add that but), so let's persist it now if needed
Configuration parameters = history.getParameters();
if ((parameters != null) && (parameters.getId() == 0)) {
entityManager.persist(parameters);
@@ -1358,7 +1381,7 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
boolean neverStarted = ((System.currentTimeMillis() - createdTime) > (1000 * 60 * 60 * 24));
if (timedOut || neverStarted) {
if (timedOut) {
- // the operation started, but the agent never told us how it finished prior to exceeding the timeout
+ // the operation started, but the agent never told us how it finished prior to exceeding the timeout
LOG.info("Operation execution seems to have been orphaned - timing it out: " + history);
history.setErrorMessage("Timed out : did not complete after " + duration + " ms"
+ " (the timeout period was " + timeout + " ms)");
@@ -2051,7 +2074,7 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
return triggers[0];
}
- private static JobTrigger convertToJobTrigger(Trigger trigger) {
+ private JobTrigger convertToJobTrigger(Trigger trigger) {
JobTrigger schedule;
if (trigger instanceof SimpleTrigger) {
SimpleTrigger simpleTrigger = (SimpleTrigger) trigger;
@@ -2106,7 +2129,7 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
return schedule;
}
- private static Trigger convertToTrigger(JobTrigger jobTrigger) {
+ private Trigger convertToTrigger(JobTrigger jobTrigger) {
Trigger trigger;
if (jobTrigger.getRecurrenceType() == JobTrigger.RecurrenceType.CRON_EXPRESSION) {
CronTrigger cronTrigger = new CronTrigger();
@@ -2146,8 +2169,9 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
return trigger;
}
- private static void validateOperationNameAndParameters(ResourceType resourceType, String operationName,
- Configuration parameters) {
+ private OperationDefinition validateOperationNameAndParameters(ResourceType resourceType,
+ String operationName,
+ Configuration parameters) {
Set<OperationDefinition> operationDefinitions = resourceType.getOperationDefinitions();
OperationDefinition matchingOperationDefinition = null;
for (OperationDefinition operationDefinition : operationDefinitions) {
@@ -2167,6 +2191,8 @@ public class OperationManagerBean implements OperationManagerLocal, OperationMan
throw new IllegalArgumentException("Parameters for [" + operationName + "] on Resource of type ["
+ resourceType.getName() + "] are not valid: " + errors);
}
+
+ return matchingOperationDefinition;
}
}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java
index 004929f..c7d0a58 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/operation/ResourceOperationJob.java
@@ -24,6 +24,7 @@ import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
+import org.quartz.SimpleTrigger;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.operation.ResourceOperationHistory;
@@ -74,6 +75,13 @@ public class ResourceOperationJob extends OperationJob {
try {
JobDetail jobDetail = context.getJobDetail();
+ int triggerTimes = 1;
+ if (context.getTrigger() instanceof SimpleTrigger) {
+ SimpleTrigger trigger = (SimpleTrigger) context.getTrigger();
+ triggerTimes = trigger.getTimesTriggered();
+ } else {
+ // Cron Trigger
+ }
OperationManagerLocal operationManager = LookupUtil.getOperationManager();
updateOperationScheduleEntity(jobDetail, context.getNextFireTime(), operationManager);
@@ -86,16 +94,24 @@ public class ResourceOperationJob extends OperationJob {
loggedInSubject = getUserWithSession(schedule.getSubject(), false);
schedule.setSubject(loggedInSubject);
- // for the security check, can the user who scheduled the operation in the first
+ // for the security check, can the user who scheduled the operation in the first
// place still have the authority to execute it against the resource in question
operationManager.getResourceOperationSchedule(schedule.getSubject(), jobDetail);
- ResourceOperationHistory resourceHistory = createOperationHistory(jobDetail.getName(),
- jobDetail.getGroup(), schedule, null, operationManager);
+ ResourceOperationHistory resourceHistory = null;
+ if (triggerTimes==1) { // On 1st fire use the already provided history.
+ resourceHistory = findOperationHistory(jobDetail.getName(),jobDetail.getGroup(),operationManager, schedule);
+ if (resourceHistory.getStartedTime()>0) {
+ resourceHistory=null;
+ }
+ }
+ if (resourceHistory==null) {
+ resourceHistory = createOperationHistory(jobDetail.getName(),
+ jobDetail.getGroup(), schedule, null, operationManager);
+ }
invokeOperationOnResource(schedule, resourceHistory, operationManager);
- } catch (Exception e) {
- if (e instanceof CancelJobException) {
+ } catch (Exception e) { if (e instanceof CancelJobException) {
// if a cancel job exception was thrown we do not need to do anything else.
// we can just rethrow the exception.
throw (CancelJobException) e;
diff --git a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
index b12eea3..690ce19 100644
--- a/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
+++ b/modules/integration-tests/rest-api/src/test/java/org/rhq/modules/integrationTests/restApi/ContentTest.java
@@ -235,6 +235,8 @@ public class ContentTest extends AbstractBase {
given()
.header(acceptJson)
.log().everything()
+ .redirects().follow(false)
+ .redirects().allowCircular(true)
.expect()
.statusCode(isOneOf(200, 201, 302))
.log().everything()
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 7789f9e..e73cab9 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
@@ -387,13 +387,13 @@ public class OperationsTest extends AbstractBase {
}
private void waitAndCheckStatus(int platformId, String historyId) throws InterruptedException {
- Thread.sleep(15000); // we need to wait a little as the execution may take time
+// Thread.sleep(15000); // we need to wait a little as the execution may take time
given()
.pathParam("hid", historyId)
.expect()
.statusCode(200)
- .log().ifError()
+ .log().everything()
.when()
.get("/operation/history/{hid}");
@@ -404,7 +404,7 @@ public class OperationsTest extends AbstractBase {
.header(acceptJson)
.expect()
.statusCode(200)
- .log().ifError()
+ .log().everything()
.when()
.get("/operation/history");
@@ -422,16 +422,22 @@ public class OperationsTest extends AbstractBase {
private void waitForTerminationAndDelete(String historyId) throws InterruptedException {
boolean done = false;
int count = 0;
+ String status = "bla";
+ JsonPath jsonPath = null;
+
while (!done) {
Response response =
given()
.header(acceptJson)
.pathParam("hid", historyId)
+ .expect()
+ .log().everything()
.when()
.get("/operation/history/{hid}");
- JsonPath jsonPath = response.jsonPath();
- String status= jsonPath.getString("status");
+
+ jsonPath = response.jsonPath();
+ status = jsonPath.getString("status");
int code = response.statusCode();
if (code==200 && (status.equals("Success") || status.equals("Failed"))) {
@@ -443,6 +449,13 @@ public class OperationsTest extends AbstractBase {
assert count < 10 :"Waited for 20sec -- something is wrong";
}
+ if (done && status.equals("Success")) {
+ Object result = jsonPath.get("result"); // Can not test on result.operationResult, as not every op has this.
+ assert result != null;
+ String errorMessage = jsonPath.getString("errorMessage");
+ assert errorMessage == null;
+ }
+
// Delete the history item
given()
.pathParam("hid", historyId)
commit cf2584b5e804bab46fe1f80a93a9b161c56ea642
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Aug 23 13:23:46 2013 +0200
Explicitly add commons-codec as this was all of a sudden no longer visible to the runtime class path, so that all tests failed.
diff --git a/modules/integration-tests/rest-api/pom.xml b/modules/integration-tests/rest-api/pom.xml
index 5d7bde5..72bf856 100644
--- a/modules/integration-tests/rest-api/pom.xml
+++ b/modules/integration-tests/rest-api/pom.xml
@@ -64,6 +64,12 @@
<version>${jackson.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.3</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
commit 309916e0463a55221de3762c34c88626bff840f7
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri Aug 23 13:13:27 2013 +0200
Fix a typo wrt name of JPP
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JBossProductType.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JBossProductType.java
index ea2c3ed..9cb9e5a 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JBossProductType.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/JBossProductType.java
@@ -35,7 +35,7 @@ public enum JBossProductType {
ISPN("ISPN", "Infinispan Server", "Infinispan Server", "ISPN"),
JDG("JDG", "JBoss JDG 6", "JBoss Data Grid 6", "Data Grid"),
EPP("EPP", "JBoss EAP 6", "JBoss Enterprise Portal Platform 6", "Portal Platform"),
- JPP("JPP", "JBoss EAP 6", "JBoss Portal Platform 6", "Portal Platform"),
+ JPP("JPP", "JBoss JPP 6", "JBoss Portal Platform 6", "Portal Platform"),
// EWP("EWP", "JBoss EWP 6", "JBoss Enterprise Web Platform 6", "EWP"),
SOA("SOA-P", "JBoss SOA-P 6", "Red Hat JBoss Fuse Service Works", "SOAP"),
WILDFLY8("WildFly","WildFly 8" ,"WildFly Application Server 8" , "WildFly");
10 years, 10 months
[rhq] modules/enterprise
by Jiri Kremser
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
New commits:
commit d358659593babd37dcdd520016ee7cc7b61c3077
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri Aug 23 12:42:21 2013 +0200
Fixing the (un)deploy storage node button enablement rules.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
index 7ee0b5a..528d7d8 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/storage/StorageNodeTableView.java
@@ -483,8 +483,7 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
if ("NORMAL".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
|| "JOINING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
|| "LEAVING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
- || !AvailabilityType.UP.equals(String.valueOf(storageNodeRecord.getAttribute(FIELD_AVAILABILITY
- .propertyName())))) {
+ || !AvailabilityType.UP.equals(storageNodeRecord.getAttributeAsObject(FIELD_AVAILABILITY.propertyName()))) {
return false;
}
}
@@ -508,8 +507,7 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
for (ListGridRecord storageNodeRecord : selection) {
if ("JOINING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
|| "LEAVING".equals(storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
- || !AvailabilityType.UP.equals(String.valueOf(storageNodeRecord.getAttribute(FIELD_AVAILABILITY
- .propertyName())))) {
+ || !AvailabilityType.UP.equals(storageNodeRecord.getAttributeAsObject(FIELD_AVAILABILITY.propertyName()))) {
return false;
}
}
@@ -525,8 +523,7 @@ public class StorageNodeTableView extends TableSection<StorageNodeDatasource> {
}
if (StorageNode.Status.NORMAL.toString().equals(
storageNodeRecord.getAttributeAsString(FIELD_STATUS.propertyName()))
- && AvailabilityType.UP.equals(String.valueOf(storageNodeRecord.getAttribute(FIELD_AVAILABILITY
- .propertyName())))) {
+ && AvailabilityType.UP.equals(storageNodeRecord.getAttributeAsObject(FIELD_AVAILABILITY.propertyName()))) {
nodesInNormalCouner++;
}
}
10 years, 10 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java | 66 ++++++----
1 file changed, 41 insertions(+), 25 deletions(-)
New commits:
commit 4c959e42d37f3a2331c706059b958f8afb6dad17
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu Aug 22 18:05:28 2013 -0400
Restore expand when context menu refreshing the selected node in the resource tree.
This was broken by the fix for https://bugzilla.redhat.com/show_bug.cgi?id=816086.
Note that the behavior is still sort of odd if refreshing a node other than
the selected node. Because we have no logic in place for actually expanding
down to a non-selected, bu right-click refreshed, node. One possibility
would be to select the node if the user performs a right click refresh on
it, but that may be heavy handed. For noe the refresh happens but the node
will likely be collapsed.
p.s. ignore some formatting changes that were auto-applied.
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
index a3990bb..cd50308 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceTreeView.java
@@ -250,14 +250,26 @@ public class ResourceTreeView extends EnhancedVLayout {
treeGrid.addDataArrivedHandler(new DataArrivedHandler() {
public void onDataArrived(DataArrivedEvent dataArrivedEvent) {
- // expand the tree if nothing is selected
- if (selectedNodeId == null) {
- updateSelection();
+ if (null == selectedNodeId) {
+ return;
}
+
// do not update the selection when expanding other tree node (BZ 816086)
TreeNode parent = dataArrivedEvent.getParentNode();
- if (parent instanceof EnhancedTreeNode && ((EnhancedTreeNode) parent).getID().equals(selectedNodeId)) {
- updateSelection();
+ if (parent instanceof EnhancedTreeNode) {
+ String parentId = ((EnhancedTreeNode) parent).getID();
+ if (parentId.equals(selectedNodeId)) {
+ updateSelection();
+ } else {
+ TreeNode selectedNode = treeGrid.getTree().findById(selectedNodeId);
+ TreeNode selectedParentNode = treeGrid.getTree().getParent(selectedNode);
+ while (!(selectedParentNode instanceof ResourceTreeNode)) {
+ selectedParentNode = treeGrid.getTree().getParent(selectedParentNode);
+ }
+ if (parentId.equals(((ResourceTreeNode) selectedParentNode).getID())) {
+ updateSelection();
+ }
+ }
}
}
});
@@ -544,7 +556,8 @@ public class ResourceTreeView extends EnhancedVLayout {
resourceContextMenu.addItem(operations);
// Metric graph addition menu
- resourceContextMenu.addItem(DashboardLinkUtility.buildMetricsMenu(resourceType, resource, MSG.view_tree_common_contextMenu_measurements()));
+ resourceContextMenu.addItem(DashboardLinkUtility.buildMetricsMenu(resourceType, resource,
+ MSG.view_tree_common_contextMenu_measurements()));
// Create Child Menu and Manual Import Menu
final Set<ResourceType> creatableChildTypes = getCreatableChildTypes(resourceType);
@@ -707,7 +720,6 @@ public class ResourceTreeView extends EnhancedVLayout {
tree.reloadChildren(refreshNode);
}
-
private void setRootResource(Resource rootResource) {
this.rootResource = rootResource;
}
@@ -874,36 +886,40 @@ public class ResourceTreeView extends EnhancedVLayout {
public void onSuccess(PageList<ResourceGroup> result) {
final ResourceGroup backingGroup = result.get(0);
- boolean updateSelection = selectedNodeId != null && selectedNodeId != ResourceTreeNode.idOf(selectedAutoGroupId);
-
+ boolean updateSelection = selectedNodeId != null
+ && selectedNodeId != ResourceTreeNode.idOf(selectedAutoGroupId);
+
// load the tree up to the autogroup's parent resource. Don't select the resource node
// to avoid an unnecessary navigation to the resource, we just need the tree in place so
// we can navigate to the autogroup node.
- loadTree(backingGroup.getAutoGroupParentResource().getId(), updateSelection, true, new AsyncCallback<Void>() {
+ loadTree(backingGroup.getAutoGroupParentResource().getId(), updateSelection, true,
+ new AsyncCallback<Void>() {
- public void onFailure(Throwable caught) {
- loadingLabel.hide();
- CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_loadFailed_children(), caught);
- }
+ public void onFailure(Throwable caught) {
+ loadingLabel.hide();
+ CoreGUI.getErrorHandler().handleError(MSG.view_tree_common_loadFailed_children(),
+ caught);
+ }
- public void onSuccess(Void arg) {
- // get the node ID and use it to add a map entry, then call this again to finish up...
- selectedNodeId = AutoGroupTreeNode.idOf(backingGroup.getAutoGroupParentResource(),
- backingGroup.getResourceType());
- AutoGroupTreeNode agNode = (AutoGroupTreeNode) treeGrid.getTree().findById(selectedNodeId);
- autoGroupNodeMap.put(backingGroup.getId(), agNode);
- updateSelection();
+ public void onSuccess(Void arg) {
+ // get the node ID and use it to add a map entry, then call this again to finish up...
+ selectedNodeId = AutoGroupTreeNode.idOf(backingGroup.getAutoGroupParentResource(),
+ backingGroup.getResourceType());
+ AutoGroupTreeNode agNode = (AutoGroupTreeNode) treeGrid.getTree().findById(
+ selectedNodeId);
+ autoGroupNodeMap.put(backingGroup.getId(), agNode);
+ updateSelection();
- loadingLabel.hide();
- }
- });
+ loadingLabel.hide();
+ }
+ });
}
});
}
}
public void renderView(ViewPath viewPath) {
- ViewId currentViewId = viewPath.getCurrent();
+ ViewId currentViewId = viewPath.getCurrent();
String currentViewIdPath = currentViewId.getPath();
if ("AutoGroup".equals(currentViewIdPath)) {
// Move the currentViewId to the ID portion to play better with other code
10 years, 10 months
[rhq] modules/enterprise
by mike thompson
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java | 10 +++-------
modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java | 3 ++-
2 files changed, 5 insertions(+), 8 deletions(-)
New commits:
commit f8226eaf6a6f7e2c11f2a6f334c2ddbec2026320
Author: Mike Thompson <mithomps(a)redhat.com>
Date: Thu Aug 22 14:54:23 2013 -0700
[BZ 1000153] - Availability graph isn't present unless there are other metrics
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
index 8791640..b46990c 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/detail/ResourceGroupDetailView.java
@@ -268,18 +268,14 @@ public class ResourceGroupDetailView extends
ViewFactory viewFactory;
boolean visible = hasMetricsOfType(this.groupComposite, null);
if (updateTab(this.monitoringTab, visible, true)) {
- final EntityContext groupContext = EntityContext.forGroup(groupComposite.getResourceGroup());
- visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT);
+ visible = hasMetricsOfType(this.groupComposite, DataType.MEASUREMENT) ||
+ hasMetricsOfType(this.groupComposite, DataType.AVAILABILITY);
boolean showOnPage;
if(BrowserUtility.isBrowserPreIE9()){
showOnPage = false;
}else{
- if(visible) {
- showOnPage = true;
- }else {
- showOnPage = false;
- }
+ showOnPage = visible;
}
viewFactory = (!showOnPage) ? null : new ViewFactory() {
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
index 9bd1ea6..bd66f0a 100644
--- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
+++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/detail/ResourceDetailView.java
@@ -384,7 +384,8 @@ public class ResourceDetailView extends
}
private void updateMonitoringTabContent(final Resource resource, Set<ResourceTypeFacet> facets) {
- boolean visible = hasMetricsOfType(this.resourceComposite, DataType.MEASUREMENT);
+ boolean visible = hasMetricsOfType(this.resourceComposite, DataType.MEASUREMENT)
+ || hasMetricsOfType(this.resourceComposite, DataType.AVAILABILITY);
ViewFactory viewFactory;
boolean visibleToIE8 = !BrowserUtility.isBrowserPreIE9();
10 years, 10 months