modules/core/dbutils/pom.xml | 2 modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml | 1 modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml | 10 ++ modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java | 37 ++++++++++ modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java | 12 +++ modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDefinitionDataSource.java | 25 ++++++ modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages.properties | 3 modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java | 37 +++++++++- 9 files changed, 126 insertions(+), 3 deletions(-)
New commits: commit fa55e1b11afb478de2273ac0a9ff0f649abb4001 Author: John Sanda jsanda@redhat.com Date: Fri Nov 4 17:41:17 2011 -0400
[BZ 7517474] Adding compliance field to drift definitions view
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java index bc12b24..8cf1d61 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java @@ -25,4 +25,13 @@ public enum DriftComplianceStatus { OUT_OF_COMPLIANCE_NO_BASEDIR,
OUT_OF_COMPLIANCE_DRIFT; + + public static DriftComplianceStatus fromCode(int code) { + switch (code) { + case 0: return IN_COMPLIANCE; + case 1: return OUT_OF_COMPLIANCE_NO_BASEDIR; + case 2: return OUT_OF_COMPLIANCE_DRIFT; + default: throw new IllegalArgumentException(code + " is not a DriftComplianceStatus code"); + } + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDefinitionDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDefinitionDataSource.java index 3bb7161..e740da5 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDefinitionDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/drift/DriftDefinitionDataSource.java @@ -39,6 +39,7 @@ import com.smartgwt.client.widgets.grid.events.RecordClickHandler; import org.rhq.core.domain.common.EntityContext; import org.rhq.core.domain.criteria.DriftDefinitionCriteria; import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftComplianceStatus; import org.rhq.core.domain.drift.DriftDefinition; import org.rhq.core.domain.drift.DriftDefinitionComposite; import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode; @@ -73,6 +74,8 @@ public class DriftDefinitionDataSource extends RPCDataSource<DriftDefinitionComp public static final String ATTR_IS_PINNED = "isPinned"; public static final String ATTR_CHANGE_SET_CTIME = "changesetTime"; public static final String ATTR_CHANGE_SET_VERSION = "changesetVersion"; + public static final String ATTR_COMPLIANCE = "compliance"; + public static final String ATTR_COMPLIANCE_ICON = "complianceIcon";
public static final String DRIFT_HANDLING_MODE_NORMAL = MSG.view_drift_table_driftHandlingMode_normal(); public static final String DRIFT_HANDLING_MODE_PLANNED = MSG.view_drift_table_driftHandlingMode_plannedChanges(); @@ -144,6 +147,24 @@ public class DriftDefinitionDataSource extends RPCDataSource<DriftDefinitionComp enabledField.setAlign(Alignment.CENTER); fields.add(enabledField);
+ ListGridField inComplianceField = new ListGridField(ATTR_COMPLIANCE_ICON, MSG.common_title_in_compliance()); + inComplianceField.setType(ListGridFieldType.IMAGE); + inComplianceField.setAlign(Alignment.CENTER); + inComplianceField.setShowHover(true); + inComplianceField.setHoverCustomizer(new HoverCustomizer() { + @Override + public String hoverHTML(Object o, ListGridRecord record, int row, int column) { + int complianceCode = record.getAttributeAsInt(ATTR_COMPLIANCE); + DriftComplianceStatus complianceStatus = DriftComplianceStatus.fromCode(complianceCode); + switch (complianceStatus) { + case OUT_OF_COMPLIANCE_NO_BASEDIR: return MSG.view_drift_table_out_of_compliance_no_basedir(); + case OUT_OF_COMPLIANCE_DRIFT: return MSG.view_drift_table_out_of_compliance_drift(); + default: return ""; + } + } + }); + fields.add(inComplianceField); + ListGridField driftHandlingModeField = new ListGridField(ATTR_DRIFT_HANDLING_MODE, MSG .view_drift_table_driftHandlingMode()); fields.add(driftHandlingModeField); @@ -218,6 +239,7 @@ public class DriftDefinitionDataSource extends RPCDataSource<DriftDefinitionComp changeSetField.setWidth(70); changeSetTimeField.setWidth(100); enabledField.setWidth(60); + inComplianceField.setWidth(60); driftHandlingModeField.setWidth("15%"); intervalField.setWidth(70); baseDirField.setWidth("*"); @@ -336,6 +358,9 @@ public class DriftDefinitionDataSource extends RPCDataSource<DriftDefinitionComp record.setAttribute(ATTR_BASE_DIR_STRING, getBaseDirString(def.getBasedir())); record.setAttribute(ATTR_IS_ENABLED, String.valueOf(def.isEnabled())); record.setAttribute(ATTR_IS_ENABLED_ICON, ImageManager.getAvailabilityIcon(def.isEnabled())); + record.setAttribute(ATTR_COMPLIANCE, def.getComplianceStatus().ordinal()); + record.setAttribute(ATTR_COMPLIANCE_ICON, ImageManager.getAvailabilityIcon( + def.getComplianceStatus() == DriftComplianceStatus.IN_COMPLIANCE)); // fixed value, just the edit icon record.setAttribute(ATTR_EDIT, ImageManager.getEditIcon()); record.setAttribute(ATTR_IS_PINNED, def.isPinned() ? ImageManager.getPinnedIcon() : ImageManager 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 32db3fc..da21776 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 @@ -138,6 +138,7 @@ common_title_duration = Duration common_title_edit = Edit? common_title_edit_mode = Edit Mode common_title_enabled = Enabled? +common_title_in_compliance = In Compliance? common_title_end = End common_title_generalProp = General Properties common_title_group = Group @@ -1202,6 +1203,8 @@ view_drift_table_baseDir = Base Directory view_drift_table_driftHandlingMode = Drift Handling view_drift_table_driftHandlingMode_normal = normal view_drift_table_driftHandlingMode_plannedChanges = planned changes +view_drift_table_out_of_compliance_drift = There is drift +view_drift_table_out_of_compliance_no_basedir = The base directory does not exist view_drift_table_hover_defNotPinned = The drift definition is not pinned Click to view the initial snapshot. view_drift_table_hover_defPinned = The drift definition is pinned to its initial snapshot. Click to view the initial snapshot. view_drift_table_hover_edit = Click to view or edit the drift definition or template properties.
commit 0d92f378cc33769b6da523b8293332c0890816ee Author: John Sanda jsanda@redhat.com Date: Fri Nov 4 16:36:02 2011 -0400
[BZ 7517474] Initial support for tracking compliance
This commit adds a complianceStatus field to DriftDefinition. There are corresponding dbsetup and dbupgrade changes. DriftManagerBean has been updated to set the complianceStatus field if the definition is pinned when the agent reports a change set.
diff --git a/modules/core/dbutils/pom.xml b/modules/core/dbutils/pom.xml index dd75181..c974572 100644 --- a/modules/core/dbutils/pom.xml +++ b/modules/core/dbutils/pom.xml @@ -16,7 +16,7 @@ </scm> <properties> <scm.module.path>modules/core/dbutils/</scm.module.path> - <db.schema.version>2.114</db.schema.version> + <db.schema.version>2.115</db.schema.version> <rhq.ds.type-mapping>${rhq.test.ds.type-mapping}</rhq.ds.type-mapping> <rhq.ds.db-name>${rhq.test.ds.db-name}</rhq.ds.db-name> <rhq.ds.connection-url>${rhq.test.ds.connection-url}</rhq.ds.connection-url> diff --git a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml index d6975d5..7986a51 100644 --- a/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml +++ b/modules/core/dbutils/src/main/scripts/dbsetup/content-schema.xml @@ -702,6 +702,7 @@ <column name="DRIFT_HANDLING_MODE" type="VARCHAR2" size="20" required="true"/> <column name="IS_PINNED" type="BOOLEAN" required="true"/> <column name="IS_ATTACHED" type="BOOLEAN" required="true"/> + <column name="COMPLIANCE_STATUS" type="INTEGER" required="true"/> </table>
<table name="RHQ_DRIFT_SET"> diff --git a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml index 9221532..c7edf53 100644 --- a/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml +++ b/modules/core/dbutils/src/main/scripts/dbupgrade/db-upgrade.xml @@ -3684,6 +3684,16 @@ </schema-directSQL> </schemaSpec>
+ <schemaSpec version="2.115"> + <schema-addColumn table="RHQ_DRIFT_DEFINITION" column="COMPLIANCE_STATUS" columnType="INTEGER"/> + <schema-directSQL> + <statement desc="RHQ_DRIFT_DEFINITION: set compliance_status column for existing definitions"> + UPDATE RHQ_DRIFT_DEFINITION SET COMPLIANCE_STATUS = 0 + </statement> + </schema-directSQL> + <schema-alterColumn table="RHQ_DRIFT_DEFINITION" column="COMPLIANCE_STATUS" nullable="FALSE"/> + </schemaSpec> + </dbupgrade> </target> </project> diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java new file mode 100644 index 0000000..bc12b24 --- /dev/null +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftComplianceStatus.java @@ -0,0 +1,28 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.core.domain.drift; + +public enum DriftComplianceStatus { + IN_COMPLIANCE, + + OUT_OF_COMPLIANCE_NO_BASEDIR, + + OUT_OF_COMPLIANCE_DRIFT; +} diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java index efb9ac2..08f2f3f 100644 --- a/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java +++ b/modules/core/domain/src/main/java/org/rhq/core/domain/drift/DriftDefinition.java @@ -111,6 +111,10 @@ public class DriftDefinition implements Serializable { @Column(name = "IS_ATTACHED", nullable = false) private boolean attached = true;
+ @Column(name = "COMPLIANCE_STATUS", nullable = false) + @Enumerated(EnumType.ORDINAL) + private DriftComplianceStatus complianceStatus = DriftComplianceStatus.IN_COMPLIANCE; + // required for jaxb/web services stuff protected DriftDefinition() { } @@ -259,6 +263,14 @@ public class DriftDefinition implements Serializable { this.template = template; }
+ public DriftComplianceStatus getComplianceStatus() { + return complianceStatus; + } + + public void setComplianceStatus(DriftComplianceStatus complianceStatus) { + this.complianceStatus = complianceStatus; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); diff --git a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java index 09bedef..95f0090 100644 --- a/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java +++ b/modules/core/plugin-container/src/main/java/org/rhq/core/pc/drift/DriftDetector.java @@ -268,7 +268,7 @@ public class DriftDetector implements Runnable { // the current snapshot to match the pinned snapshot. Note though // that we increment the snapshot version in order to let the server // know about the state change. - if (schedule.getDriftDefinition().isPinned()) { + if (schedule.getDriftDefinition().isPinned() && newVersion > 1) { currentSnapshot.delete(); File newSnapshot = updateCurrentSnapshot(schedule, snapshotEntries, newVersion);
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java index 2fb8d51..bb67fa8 100644 --- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java +++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/drift/DriftManagerBean.java @@ -22,6 +22,8 @@ import static java.util.Arrays.asList; import static javax.ejb.TransactionAttributeType.NOT_SUPPORTED; import static javax.ejb.TransactionAttributeType.REQUIRES_NEW; import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftComplianceStatus.OUT_OF_COMPLIANCE_DRIFT; +import static org.rhq.core.domain.drift.DriftComplianceStatus.IN_COMPLIANCE;
import java.io.File; import java.io.InputStream; @@ -516,16 +518,49 @@ public class DriftManagerBean implements DriftManagerLocal, DriftManagerRemote { }
@Override - @TransactionAttribute(NOT_SUPPORTED) + @TransactionAttribute(REQUIRES_NEW) public DriftChangeSetSummary saveChangeSet(Subject subject, int resourceId, File changeSetZip) throws Exception { DriftServerPluginFacet driftServerPlugin = getServerPlugin(); DriftChangeSetSummary summary = driftServerPlugin.saveChangeSet(subject, resourceId, changeSetZip); + if (DriftHandlingMode.plannedChanges != summary.getDriftHandlingMode()) { notifyAlertConditionCacheManager("saveChangeSet", summary); } + + DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); + criteria.addFilterName(summary.getDriftDefinitionName()); + criteria.addFilterResourceIds(resourceId); + PageList<DriftDefinition> definitions = findDriftDefinitionsByCriteria(subject, criteria); + + if (definitions.isEmpty()) { + log.warn("Could not find drift definition for [resourceId: " + resourceId + ", driftDefinitionName: " + + summary.getDriftDefinitionName() + "]. Will not be able check compliance for thiis drift definition"); + } else { + updateCompliance(definitions.get(0), summary); + } + return summary; }
+ private void updateCompliance(DriftDefinition definition, DriftChangeSetSummary changeSetSummary) { + if (!definition.isPinned()) { + return; + } + + boolean updateNeeded = false; + if (changeSetSummary.getDriftPathnames().isEmpty()) { + updateNeeded = definition.getComplianceStatus() != IN_COMPLIANCE; + definition.setComplianceStatus(IN_COMPLIANCE); + } else { + updateNeeded = definition.getComplianceStatus() == IN_COMPLIANCE; + definition.setComplianceStatus(OUT_OF_COMPLIANCE_DRIFT); + } + + if (updateNeeded) { + updateDriftDefinition(definition); + } + } + @Override @TransactionAttribute(NOT_SUPPORTED) public void saveChangeSetFiles(Subject subject, File changeSetFilesZip) throws Exception {
rhq-commits@lists.fedorahosted.org