Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
ElaadF authored and clarktsiory committed Apr 4, 2024
1 parent a0787ba commit f805f0e
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 1 deletion.
Expand Up @@ -38,12 +38,14 @@
package com.normation.rudder.rest.data

import com.normation.inventory.domain.NodeId
import com.normation.rudder.domain.policies.Directive
import com.normation.rudder.domain.policies.DirectiveId
import com.normation.rudder.domain.policies.PolicyMode
import com.normation.rudder.domain.policies.RuleId
import com.normation.rudder.domain.reports._
import com.normation.rudder.domain.reports.ComplianceLevel
import com.normation.rudder.reports.ComplianceModeName
import com.normation.rudder.repository.FullActiveTechnique
import java.lang
import net.liftweb.json._
import net.liftweb.json.JsonAST
Expand Down Expand Up @@ -194,6 +196,44 @@ final case class ByRuleByNodeByDirectiveByValueCompliance(
values: Seq[ComponentValueStatusReport]
) extends ByRuleByNodeByDirectiveByComponentCompliance

final case class DirectiveComplianceOverride(
overridenRuleId: RuleId,
directiveId: DirectiveId,
directiveName: String
) {
def toComplianceByRule: ByRuleDirectiveCompliance = {
ByRuleDirectiveCompliance(
directiveId,
directiveName,
ComplianceLevel(), // TODO: no reports ?
Seq.empty
)
}
}

object ComplianceOverrides {
def getOverridenDirective(
overrides: List[OverridenPolicy],
directives: Map[DirectiveId, (FullActiveTechnique, Directive)]
// rules: Seq[Rule]
): List[DirectiveComplianceOverride] = {
val overridesData = for {
over <- overrides
(overridenTech, overridenDir) <- directives.get(over.policy.directiveId)
// overridingRule <- rules.find(_.id == over.overridenBy.ruleId)
// (overridingTech, overridingDir) <- directiveLib.allDirectives.get(over.overridenBy.directiveId)
} yield {
// TODO: add this as additional information to know what overrides what
// val overridenTechName =
// overridenTech.techniques.get(overridenDir.techniqueVersion).map(_.name).getOrElse("Unknown technique")
// val overridenTechVersion = overridenDir.techniqueVersion

DirectiveComplianceOverride(over.policy.ruleId, over.policy.directiveId, overridenDir.name)
}
overridesData.toList
}
}

object GroupComponentCompliance {
// This function do the recursive treatment of components, we will have each time a pair of Sequence of tuple (NodeId , component compliance structure)
def recurseComponent(
Expand Down
Expand Up @@ -66,6 +66,7 @@ import com.normation.rudder.rest.RestUtils._
import com.normation.rudder.rest.data._
import com.normation.rudder.services.nodes.NodeInfoService
import com.normation.rudder.services.reports.ReportingService
import com.normation.rudder.services.reports.ReportingServiceUtils
import com.normation.zio.currentTimeMillis
import net.liftweb.common._
import net.liftweb.http.LiftResponse
Expand Down Expand Up @@ -565,6 +566,28 @@ class ComplianceAPIService(
val t7 = System.currentTimeMillis()
TimingDebugLoggerPure.logEffect.trace(s"getByRulesCompliance - group reports by rules in ${t7 - t6} ms")

val overridesByRules = ruleObjects.keys.flatMap { ruleId =>
ComplianceOverrides
.getOverridenDirective(
ReportingServiceUtils.buildRuleStatusReport(ruleId, reportsByNode).overrides,
directives
)
.map(d => (d.overridenRuleId, d))
}.toMap

val overridesRules = overridesByRules.toSeq.map {
case (ruleId, overrideDirective) =>
val rule = ruleObjects.get(ruleId)
val nodeIds = rule.map(r => RoNodeGroupRepository.getNodeIds(allGroups, r.targets, nodeInfos)).getOrElse(Set.empty)
ByRuleRuleCompliance(
ruleId,
ruleObjects.get(ruleId).map(_.name).getOrElse("Unknown rule"),
ComplianceLevel(noAnswer = nodeIds.size),
compliance.mode,
Seq(overrideDirective.toComplianceByRule)
)
}

// for each rule for each node, we want to have a
// directiveId -> reporttype map
val nonEmptyRules = reportsByRule.toSeq.map {
Expand Down Expand Up @@ -638,7 +661,7 @@ class ComplianceAPIService(
)

// return the full list
val result = nonEmptyRules ++ initializedCompliances
val result = nonEmptyRules ++ overridesRules ++ initializedCompliances

val t10 = System.currentTimeMillis()
TimingDebugLoggerPure.logEffect.trace(s"getByRulesCompliance - Compute result in ${t10 - t9} ms")
Expand Down

0 comments on commit f805f0e

Please sign in to comment.