From ad00f1bc1d94d13751298651a42e8a8b5cd48d8a Mon Sep 17 00:00:00 2001 From: "Francois @fanf42 Armand" Date: Thu, 3 Dec 2020 01:39:51 +0100 Subject: [PATCH] Correct tests after rebase --- .../com/normation/rudder/db/Doobie.scala | 9 +- .../jdbc/ReportsJdbcRepository.scala | 1 - .../root-sys-var-false/rudder-directives.csv | 2 +- .../technique-and-revisions/rudder.json | 1 + .../rudder/repository/jdbc/ReportsTest.scala | 35 ++++-- .../normation/rudder/rest/JsonSchema.scala | 4 +- .../rudder/rest/internal/EventLogAPI.scala | 2 + .../normation/rudder/rest/lift/RuleApi.scala | 2 +- .../com/normation/rudder/MockServices.scala | 118 +++++++++++------- .../normation/rudder/rest/RestTestSetUp.scala | 3 +- .../rudder/web/services/ComplianceData.scala | 4 +- 11 files changed, 114 insertions(+), 67 deletions(-) diff --git a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/db/Doobie.scala b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/db/Doobie.scala index c700806c627..45a0d7be9d1 100644 --- a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/db/Doobie.scala +++ b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/db/Doobie.scala @@ -172,9 +172,14 @@ object Doobie { ) implicit val ReportRead: Read[Reports] = { - type R = (DateTime, RuleId, DirectiveRId, NodeId, Int, String, String, DateTime, String, String) + type R = (DateTime, RuleId, String, NodeId, Int, String, String, DateTime, String, String) Read[R].map( - (t: R ) => Reports.factory(t._1,t._2,t._3,t._4,t._5,t._6,t._7,t._8,t._9,t._10)) + (t: R ) => { + DirectiveRId.parse(t._3) match { + case Right(drid) => Reports.factory(t._1,t._2,drid,t._4,t._5,t._6,t._7,t._8,t._9,t._10) + case Left(err) => throw new IllegalArgumentException(s"Error when unserializing a report from ruddersysevents base: can not parse directive ID: ${t._3}: ${err}") + } + }) } implicit val ReportWrite: Write[Reports] = { type R = (DateTime, RuleId, DirectiveRId, NodeId, Int, String, String, DateTime, String, String) diff --git a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/repository/jdbc/ReportsJdbcRepository.scala b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/repository/jdbc/ReportsJdbcRepository.scala index 3f827d6bea3..3aba991ccbb 100644 --- a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/repository/jdbc/ReportsJdbcRepository.scala +++ b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/repository/jdbc/ReportsJdbcRepository.scala @@ -38,7 +38,6 @@ package com.normation.rudder.repository.jdbc import java.sql.Timestamp - import com.normation.inventory.domain.NodeId import com.normation.rudder.domain.policies.RuleId import com.normation.rudder.domain.reports._ diff --git a/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/root-sys-var-false/rudder-directives.csv b/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/root-sys-var-false/rudder-directives.csv index 1a627878ebf..0a68e2167b3 100644 --- a/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/root-sys-var-false/rudder-directives.csv +++ b/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/root-sys-var-false/rudder-directives.csv @@ -1,4 +1,4 @@ -"common-root","audit","merged","false","common","1.0","true","Common" "root-distributePolicy","audit","merged","false","distributePolicy","1.0","true","Distribute Policy" +"common-root","audit","merged","false","common","1.0","true","Common" "inventory-all","audit","merged","false","inventory","1.0","true","Inventory" "server-roles-directive","audit","merged","false","server-roles","1.0","true","Server Roles" diff --git a/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/technique-and-revisions/rudder.json b/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/technique-and-revisions/rudder.json index 752d802b833..6119d3ab0a3 100644 --- a/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/technique-and-revisions/rudder.json +++ b/webapp/sources/rudder/rudder-core/src/test/resources/configuration-repository/expected-share/technique-and-revisions/rudder.json @@ -12,6 +12,7 @@ "DENYBADCLOCKS":"true", "MODIFIED_FILES_TTL":"30", "NODEROLE":" classes: \n \"rudder-ldap\" expression => \"any\";\n \"policy_server\" expression => \"any\";\n \"rudder-inventory-ldap\" expression => \"any\";\n \"rudder-db\" expression => \"any\";\n \"rudder-jetty\" expression => \"any\";\n \"rudder-webapp\" expression => \"any\";\n \"rudder-inventory-endpoint\" expression => \"any\";\n \"root_server\" expression => \"any\";\n \"rudder-reports\" expression => \"any\";\n \"rudder-server-root\" expression => \"any\";", + "POLICY_SERVER_KEY":"MD5=081cf3aac62624ebbc83be7e23cb104d", "RELAY_SYNC_METHOD":"classic", "RELAY_SYNC_PROMISES":"false", "RELAY_SYNC_SHAREDFILES":"false", diff --git a/webapp/sources/rudder/rudder-core/src/test/scala/com/normation/rudder/repository/jdbc/ReportsTest.scala b/webapp/sources/rudder/rudder-core/src/test/scala/com/normation/rudder/repository/jdbc/ReportsTest.scala index ab27dc8b8d5..9a3caab413c 100644 --- a/webapp/sources/rudder/rudder-core/src/test/scala/com/normation/rudder/repository/jdbc/ReportsTest.scala +++ b/webapp/sources/rudder/rudder-core/src/test/scala/com/normation/rudder/repository/jdbc/ReportsTest.scala @@ -52,6 +52,7 @@ import doobie.implicits._ import cats.implicits._ import com.normation.rudder.db.DB import com.normation.rudder.domain.policies.DirectiveRId +import net.liftweb.common._ import zio.interop.catz._ @@ -63,6 +64,14 @@ import zio.interop.catz._ @RunWith(classOf[JUnitRunner]) class ReportsTest extends DBCommon { + implicit class ForceOpen[A](box: Box[A]) { + def open = box match { + case Full(x) => x + case eb: EmptyBox => throw new IllegalArgumentException(s"Test failed, open an empty box: ${eb}") + } + } + + //clean data base def cleanTables() = { transacRun(xa => sql"DELETE FROM ReportsExecution; DELETE FROM RudderSysEvents;".update.run.transact(xa)) @@ -120,24 +129,25 @@ class ReportsTest extends DBCommon { } "find the last reports for node0" in { - val result = repostsRepo.getExecutionReports(Set(AgentRunId(NodeId("n0"), run1)), Set()).openOrThrowException("Test failed with exception") + val result = repostsRepo.getExecutionReports(Set(AgentRunId(NodeId("n0"), run1)), Set()).open result.values.flatten.toSeq must contain(exactly(reports("n0")(0))) } "find reports for node 0,1,2" in { val runs = Set(("n0", run1), ("n1", run1), ("n2", run1) ) - val result = repostsRepo.getExecutionReports(runs, Set() ).openOrThrowException("Test failed with exception") + val result = repostsRepo.getExecutionReports(runs, Set() ).open result.values.flatten.toSeq must contain(exactly(reports("n0")++reports("n1").reverse.tail++reports("n2"):_*)) } "not find report for none existing agent run id" in { val runs = Set( ("n2", run2), ("n3", run1)) - val result = repostsRepo.getExecutionReports(runs, Set() ).openOrThrowException("Test failed with exception") + val result = repostsRepo.getExecutionReports(runs, Set() ).open result must beEmpty } } - "Finding execution" should { + // since #18093, we assume that all run are complete, so we ignore runs without an "end" control element + "Finding execution, ignoring non-ending runs" should { val reports = ( Map[String, Seq[Reports]]() + node("n0")( @@ -155,10 +165,12 @@ class ReportsTest extends DBCommon { //run2 , ("rudder", "run", 0, "start", "n1_run2", run2, "control", "Start execution") , ("r1", "d1", 0, "c2", "cv2", run2, "result_success", "msg1") - //run3 + , ("rudder", "run", 0, "end", "n1_run2", run2, "control", "End execution") + //run3 will be ignore: no end element , ("rudder", "run", 0, "start", "n1_run3", run3, "control", "Start execution") ) + node("n2")( + // run will be taken even without a start: only 'end' counts. ("rudder", "run", 0, "end", "n2_run1", run1, "control", "End execution") , ("r1", "d1", 0, "c1", "cv1", run1, "result_success", "msg1") , ("r1", "d1", 0, "c2", "cv2", run1, "result_success", "msg1") @@ -176,18 +188,17 @@ class ReportsTest extends DBCommon { * - test case where there is no StartRun/EndRun */ "get reports" in { - val res = repostsRepo.getReportsfromId(0, DateTime.now().plusDays(1)).openOrThrowException("Test failed") + val res = repostsRepo.getReportsfromId(0, DateTime.now().plusDays(1)).open val expected = Seq( - AgentRun(AgentRunId(NodeId("n1"),run2),None,false, 116) - , AgentRun(AgentRunId(NodeId("n2"),run1),Some(NodeConfigId("n2_run1")),true, 119) - , AgentRun(AgentRunId(NodeId("n1"),run1),Some(NodeConfigId("n1_run1")),true, 110) - , AgentRun(AgentRunId(NodeId("n1"),run3),None,false, 118) - , AgentRun(AgentRunId(NodeId("n0"),run1),None,true, 109) + AgentRun(AgentRunId(NodeId("n0"),run1),None,true, 109) + , AgentRun(AgentRunId(NodeId("n1"),run1),Some(NodeConfigId("n1_run1")),true, 115) + , AgentRun(AgentRunId(NodeId("n1"),run2),Some(NodeConfigId("n1_run2")),true, 118) + , AgentRun(AgentRunId(NodeId("n2"),run1),Some(NodeConfigId("n2_run1")),true, 120) ) val checkInsert = transacRun(xa => sql"""select id from ruddersysevents""".query[Long].to[Vector].transact(xa)).size - (checkInsert must beEqualTo(13)) and + (checkInsert must beEqualTo(14)) and (res._1 must contain(exactly(expected:_*))) } diff --git a/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/JsonSchema.scala b/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/JsonSchema.scala index 7398d0b565f..699191a6c9e 100644 --- a/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/JsonSchema.scala +++ b/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/JsonSchema.scala @@ -243,7 +243,7 @@ object JsonResponseObjects { , rule.categoryId.value , rule.shortDescription , rule.longDescription - , rule.directiveIds.map(_.value).toList.sorted + , rule.directiveIds.map(_.id.value).toList.sorted , rule.targets.toList.sortBy(_.target).map(t => JRRuleTarget(t)) , rule.isEnabledStatus , rule.isSystem @@ -432,7 +432,7 @@ object JsonQueryObjects { val updateCategory = category.map(RuleCategoryId).getOrElse(rule.categoryId) val updateShort = shortDescription.getOrElse(rule.shortDescription) val updateLong = longDescription.getOrElse(rule.longDescription) - val updateDirectives = directives.getOrElse(rule.directiveIds) + val updateDirectives = directives.map(_.map(DirectiveRId(_))).getOrElse(rule.directiveIds) val updateTargets = targets.map(t => Set[RuleTarget](RuleTarget.merge(t.map(_.toRuleTarget)))).getOrElse(rule.targets) val updateEnabled = enabled.getOrElse(rule.isEnabledStatus) val updateTags = tags.getOrElse(rule.tags) diff --git a/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/internal/EventLogAPI.scala b/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/internal/EventLogAPI.scala index 9f5be40c8cc..0037db08ccb 100644 --- a/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/internal/EventLogAPI.scala +++ b/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/internal/EventLogAPI.scala @@ -45,6 +45,7 @@ import com.normation.rudder.rest.RestUtils._ import com.normation.rudder.services.user.PersonIdentService import com.normation.rudder.web.services._ import com.normation.utils.DateFormaterService +import com.normation.utils.Utils.DateToIsoString import net.liftweb.common._ import net.liftweb.http.rest.RestHelper import net.liftweb.http.{JsonResponse, LiftResponse, Req, S} @@ -54,6 +55,7 @@ import net.liftweb.util.Helpers.tryo import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat + class EventLogAPI ( repos: EventLogRepository , restExtractor : RestExtractorService diff --git a/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/lift/RuleApi.scala b/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/lift/RuleApi.scala index c68604c473b..513c1cdce5c 100644 --- a/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/lift/RuleApi.scala +++ b/webapp/sources/rudder/rudder-rest/src/main/scala/com/normation/rudder/rest/lift/RuleApi.scala @@ -742,7 +742,7 @@ class RuleApiService14 ( case None => // create from scratch - base rule is the same with default values val category = restRule.category.getOrElse("rootRuleCategory") - val baseRule = Rule(ruleId, name, RuleCategoryId(category)) + val baseRule = Rule(ruleId, None, name, RuleCategoryId(category)) // If enable is missing in parameter consider it to true val defaultEnabled = restRule.enabled.getOrElse(true) diff --git a/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/MockServices.scala b/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/MockServices.scala index 3eeb14bc912..1f69b5b61ce 100644 --- a/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/MockServices.scala +++ b/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/MockServices.scala @@ -37,7 +37,7 @@ package com.normation.rudder -import com.normation.cfclerk.domain.{Version => _, _} +import com.normation.cfclerk.domain._ import com.normation.cfclerk.services.GitRepositoryProvider import com.normation.cfclerk.services.impl._ import com.normation.cfclerk.xmlparsers.SectionSpecParser @@ -197,11 +197,15 @@ class MockTechniques(configurationRepositoryRoot: File, gitRepo: GitRepositoryPr val globalSystemVariables = systemVariableService.getGlobalSystemVariables(globalAgentRun).openOrThrowException("I should get global system variable in test!") } +object TV { + def apply(s: String) = TechniqueVersion.parse(s).getOrElse(throw new IllegalArgumentException(s"Cannot parse '${s}' as a technique version'")) +} + class MockDirectives(mockTechniques: MockTechniques) { object directives { - val commonTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("common"), TechniqueVersion("1.0"))) + val commonTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("common"), TV("1.0"))) def commonVariables(nodeId: NodeId, allNodeInfos: Map[NodeId, NodeInfo]) = { val spec = commonTechnique.getAllVariableSpecs.map(s => (s.name, s)).toMap Seq( @@ -215,7 +219,8 @@ class MockDirectives(mockTechniques: MockTechniques) { } val commonDirective = Directive( DirectiveId("common-root") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("ALLOWEDNETWORK", Seq("192.168.0.0/16")) , ("OWNER", Seq("${rudder.node.admin}")) @@ -228,10 +233,11 @@ class MockDirectives(mockTechniques: MockTechniques) { , "", None, "", 5, true, true // short desc / policyMode / long desc / prio / enabled / system ) - val rolesTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("server-roles"), TechniqueVersion("1.0"))) + val rolesTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("server-roles"), TV("1.0"))) val rolesDirective = Directive( DirectiveId("Server Roles") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("ALLOWEDNETWORK", Seq("192.168.0.0/16")) ) @@ -239,10 +245,11 @@ class MockDirectives(mockTechniques: MockTechniques) { , "", None, "", 5, true, true // short desc / policyMode / long desc / prio / enabled / system ) - val distributeTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("distributePolicy"), TechniqueVersion("1.0"))) + val distributeTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("distributePolicy"), TV("1.0"))) val distributeDirective = Directive( DirectiveId("Distribute Policy") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("ALLOWEDNETWORK", Seq("192.168.0.0/16")) ) @@ -250,10 +257,11 @@ class MockDirectives(mockTechniques: MockTechniques) { , "", None, "", 5, true, true // short desc / policyMode / long desc / prio / enabled / system ) - val inventoryTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("inventory"), TechniqueVersion("1.0"))) + val inventoryTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("inventory"), TV("1.0"))) val inventoryDirective = Directive( DirectiveId("inventory-all") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("ALLOWEDNETWORK", Seq("192.168.0.0/16")) ) @@ -264,10 +272,11 @@ class MockDirectives(mockTechniques: MockTechniques) { // // 4 user directives: clock management, rpm, package, a multi-policiy: fileTemplate, and a ncf one: Create_file // - val clockTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("clockConfiguration"), TechniqueVersion("3.0"))) + val clockTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("clockConfiguration"), TV("3.0"))) val clockDirective = Directive( DirectiveId("directive1") - , TechniqueVersion("3.0") + , None + , TV("3.0") , Map( ("CLOCK_FQDNNTP" , Seq("true")) , ("CLOCK_HWSYNC_ENABLE", Seq("true")) @@ -285,10 +294,11 @@ class MockDirectives(mockTechniques: MockTechniques) { * It had a different value for the CHECK_INTERVAL, but * that variable is unique, so it get the first draft value all along. */ - val rpmTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("rpmPackageInstallation"), TechniqueVersion("7.0"))) + val rpmTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("rpmPackageInstallation"), TV("7.0"))) val rpmDirective = Directive( DirectiveId("directive2") - , TechniqueVersion("7.0") + , None + , TV("7.0") , Map( ("RPM_PACKAGE_CHECK_INTERVAL", Seq("5")) , ("RPM_PACKAGE_POST_HOOK_COMMAND", Seq("")) @@ -302,10 +312,11 @@ class MockDirectives(mockTechniques: MockTechniques) { , "directive2", "", None, "" ) - val pkgTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("packageManagement"), TechniqueVersion("1.0"))) + val pkgTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("packageManagement"), TV("1.0"))) val pkgDirective = Directive( DirectiveId("16617aa8-1f02-4e4a-87b6-d0bcdfb4019f") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("PACKAGE_LIST", Seq("htop")) , ("PACKAGE_STATE", Seq("present")) @@ -320,10 +331,11 @@ class MockDirectives(mockTechniques: MockTechniques) { ) - val fileTemplateTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("fileTemplate"), TechniqueVersion("1.0"))) + val fileTemplateTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("fileTemplate"), TV("1.0"))) val fileTemplateDirecive1 = Directive( DirectiveId("e9a1a909-2490-4fc9-95c3-9d0aa01717c9") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("FILE_TEMPLATE_RAW_OR_NOT", Seq("Raw")) , ("FILE_TEMPLATE_TEMPLATE", Seq("")) @@ -340,7 +352,8 @@ class MockDirectives(mockTechniques: MockTechniques) { ) val fileTemplateVariables2 = Directive( DirectiveId("ff44fb97-b65e-43c4-b8c2-0df8d5e8549f") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("FILE_TEMPLATE_RAW_OR_NOT", Seq("Raw")) , ("FILE_TEMPLATE_TEMPLATE", Seq("")) @@ -356,10 +369,11 @@ class MockDirectives(mockTechniques: MockTechniques) { , "directive ff44fb97-b65e-43c4-b8c2-0df8d5e8549f", "", None, "" ) - val ncf1Technique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("Create_file"), TechniqueVersion("1.0"))) + val ncf1Technique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("Create_file"), TV("1.0"))) val ncf1Directive = Directive( DirectiveId("16d86a56-93ef-49aa-86b7-0d10102e4ea9") - , TechniqueVersion("1.0") + , None + , TV("1.0") , Map( ("expectedReportKey Directory create", Seq("directory_create_/tmp/foo")) , ("expectedReportKey File create", Seq("file_create_/tmp/foo/bar")) @@ -372,10 +386,11 @@ class MockDirectives(mockTechniques: MockTechniques) { * test for multiple generation */ val DIRECTIVE_NAME_COPY_GIT_FILE="directive-copyGitFile" - val copyGitFileTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("copyGitFile"), TechniqueVersion("2.3"))) + val copyGitFileTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("copyGitFile"), TV("2.3"))) val copyGitFileDirective = Directive( DirectiveId("directive-copyGitFile") - , TechniqueVersion("2.3") + , None + , TV("2.3") , Map( ("COPYFILE_NAME", Seq("file_name_0.json")) , ("COPYFILE_EXCLUDE_INCLUDE_OPTION", Seq("none")) @@ -412,10 +427,11 @@ class MockDirectives(mockTechniques: MockTechniques) { * * In summary: sorting directives that are merged into one is a different problem than sorting directives for the bundle sequence. */ - val gvdTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("genericVariableDefinition"), TechniqueVersion("2.0"))) + val gvdTechnique = techniqueRepos.unsafeGet(TechniqueId(TechniqueName("genericVariableDefinition"), TV("2.0"))) val gvdDirective1 = Directive( DirectiveId("gvd-directive1") - , TechniqueVersion("2.0") + , None + , TV("2.0") , Map( ("GENERIC_VARIABLE_NAME", Seq("var1")) , ("GENERIC_VARIABLE_CONTENT", Seq("value from gvd #1 should be first")) // the one to override @@ -424,7 +440,8 @@ class MockDirectives(mockTechniques: MockTechniques) { ) val gvdDirective2 = Directive( DirectiveId("gvd-directive2") - , TechniqueVersion("2.0") + , None + , TV("2.0") , Map( ("GENERIC_VARIABLE_NAME", Seq("var2")) , ("GENERIC_VARIABLE_CONTENT", Seq("value from gvd #2 should be second")) // the one to override @@ -477,17 +494,17 @@ class MockDirectives(mockTechniques: MockTechniques) { override def getFullDirectiveLibrary(): IOResult[FullActiveTechniqueCategory] = rootActiveTechniqueCategory.get override def getDirective(directiveId: DirectiveId): IOResult[Option[Directive]] = { - rootActiveTechniqueCategory.get.map(_.allDirectives.get(directiveId).map(_._2)) + rootActiveTechniqueCategory.get.map(_.allDirectives.get(DirectiveRId(directiveId)).map(_._2)) } override def getDirectiveWithContext(directiveId: DirectiveId): IOResult[Option[(Technique, ActiveTechnique, Directive)]] = { - rootActiveTechniqueCategory.get.map(_.allDirectives.get(directiveId).map { case (fat, d) => + rootActiveTechniqueCategory.get.map(_.allDirectives.get(DirectiveRId(directiveId)).map { case (fat, d) => (fat.techniques(d.techniqueVersion), fat.toActiveTechnique(), d) }) } - override def getActiveTechniqueAndDirective(id: DirectiveId): IOResult[Option[(ActiveTechnique, Directive)]] = { - getDirectiveWithContext(id).map(_.map { case (t, at, d) => (at, d) }) + override def getActiveTechniqueAndDirective(id: DirectiveRId): IOResult[Option[(ActiveTechnique, Directive)]] = { + getDirectiveWithContext(id.id).map(_.map { case (t, at, d) => (at, d) }) } override def getDirectives(activeTechniqueId: ActiveTechniqueId, includeSystem: Boolean): IOResult[Seq[Directive]] = { @@ -734,20 +751,22 @@ class MockRules() { val commmonRule = Rule( RuleId("hasPolicyServer-root") + , None , "Rudder system policy: basic setup (common)" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("common-root")) + , Set(DirectiveRId(DirectiveId("common-root"))) , "common-root rule" , "", true, true, NoTags() //long desc / enabled / system / tags ) val serverRoleRule = Rule( RuleId("server-roles") + , None , "Rudder system policy: Server roles" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("Server Roles")) + , Set(DirectiveRId(DirectiveId("Server Roles"))) , "Server Roles rule" , "", true, true, NoTags() //long desc / enabled / system / tags ) @@ -755,30 +774,33 @@ class MockRules() { val distributeRule = Rule( RuleId("root-DP") + , None , "distributePolicy" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("Distribute Policy")) + , Set(DirectiveRId(DirectiveId("Distribute Policy"))) , "Distribute Policy rule" , "", true, true, NoTags() //long desc / enabled / system / tags ) val inventoryAllRule = Rule( RuleId("inventory-all") + , None , "Rudder system policy: daily inventory" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("inventory-all")) + , Set(DirectiveRId(DirectiveId("inventory-all"))) , "Inventory all rule" , "", true, true, NoTags() //long desc / enabled / system / tags ) val clockRule = Rule( RuleId("rule1") + , None , "10. Global configuration for all nodes" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("directive1")) + , Set(DirectiveRId(DirectiveId("directive1"))) , "global config for all nodes" , "", true, false, NoTags() //long desc / enabled / system / tags ) @@ -786,35 +808,38 @@ class MockRules() { val rpmRule = Rule( RuleId("rule2") + , None , "50. Deploy PLOP STACK" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("directive2")) + , Set(DirectiveRId(DirectiveId("directive2"))) , "global config for all nodes" , "", true, false, NoTags() //long desc / enabled / system / tags ) val defaultRule = Rule( - RuleId("ff44fb97-b65e-43c4-b8c2-0df8d5e8549f") + RuleId("ff44fb97-b65e-43c4-b8c2-0df8d5e8549f") + , None , "60-rule-technique-std-lib" , rootRuleCategory.id , Set(AllTarget) , Set( - DirectiveId("16617aa8-1f02-4e4a-87b6-d0bcdfb4019f") // pkg - , DirectiveId("e9a1a909-2490-4fc9-95c3-9d0aa01717c9") // fileTemplate1 - , DirectiveId("99f4ef91-537b-4e03-97bc-e65b447514cc") // fileTemplate2 + DirectiveRId(DirectiveId("16617aa8-1f02-4e4a-87b6-d0bcdfb4019f")) // pkg + , DirectiveRId(DirectiveId("e9a1a909-2490-4fc9-95c3-9d0aa01717c9")) // fileTemplate1 + , DirectiveRId(DirectiveId("99f4ef91-537b-4e03-97bc-e65b447514cc")) // fileTemplate2 ) , "default rule" , "", true, false, NoTags() //long desc / enabled / system / tags ) val copyDefaultRule = Rule( - RuleId("ff44fb97-b65e-43c4-b8c2-000000000000") + RuleId("ff44fb97-b65e-43c4-b8c2-000000000000") + , None , "99-rule-technique-std-lib" , rootRuleCategory.id , Set(AllTarget) , Set( - DirectiveId("99f4ef91-537b-4e03-97bc-e65b447514cc") // fileTemplate2 + DirectiveRId(DirectiveId("99f4ef91-537b-4e03-97bc-e65b447514cc")) // fileTemplate2 ) , "updated copy of default rule" , "", true, false, NoTags() //long desc / enabled / system / tags @@ -822,10 +847,11 @@ class MockRules() { val ncfTechniqueRule = Rule( RuleId("208716db-2675-43b9-ab57-bfbab84346aa") + , None , "50-rule-technique-ncf" , rootRuleCategory.id , Set(TargetExclusion(TargetUnion(Set(AllTarget)), TargetUnion(Set(PolicyServerTarget(NodeId("root")))))) - , Set(DirectiveId("16d86a56-93ef-49aa-86b7-0d10102e4ea9")) + , Set(DirectiveRId(DirectiveId("16d86a56-93ef-49aa-86b7-0d10102e4ea9"))) , "ncf technique rule" , "", true, false //long desc / enabled / system , MkTags(("datacenter","Paris"),("serverType","webserver")) @@ -833,20 +859,22 @@ class MockRules() { val copyGitFileRule = Rule( RuleId("rulecopyGitFile") + , None , "90-copy-git-file" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("directive-copyGitFile")) + , Set(DirectiveRId(DirectiveId("directive-copyGitFile"))) , "ncf technique rule" , "", true, false, NoTags() //long desc / enabled / system / tags ) val gvd1Rule = Rule( RuleId("gvd-rule1") - , "10. Test gvd ordering" + , None + , "10. Test gvd ordering" , rootRuleCategory.id , Set(AllTarget) - , Set(DirectiveId("gvd-directive1"),DirectiveId("gvd-directive2")) + , Set(DirectiveRId(DirectiveId("gvd-directive1")), DirectiveRId(DirectiveId("gvd-directive2"))) , "test gvd ordering rule" , "", true, false, NoTags() //long desc / enabled / system / tags ) diff --git a/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/rest/RestTestSetUp.scala b/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/rest/RestTestSetUp.scala index 4c5f4576642..a17ea39b03c 100644 --- a/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/rest/RestTestSetUp.scala +++ b/webapp/sources/rudder/rudder-rest/src/test/scala/com/normation/rudder/rest/RestTestSetUp.scala @@ -62,6 +62,7 @@ import com.normation.rudder.domain.nodes.NodeGroup import com.normation.rudder.domain.nodes.NodeGroupId import com.normation.rudder.domain.nodes.NodeInfo import com.normation.rudder.domain.parameters.GlobalParameter +import com.normation.rudder.domain.policies.DirectiveRId import com.normation.rudder.domain.policies.GlobalPolicyMode import com.normation.rudder.domain.policies.Rule import com.normation.rudder.domain.policies.RuleId @@ -298,7 +299,7 @@ object RestTestSetUp { val policyGeneration = new PromiseGenerationService { override def deploy(): Box[Set[NodeId]] = Full(Set()) override def getAllNodeInfos(): Box[Map[NodeId, NodeInfo]] = ??? - override def getDirectiveLibrary(): Box[FullActiveTechniqueCategory] = ??? + override def getDirectiveLibrary(ids: Set[DirectiveRId]): Box[FullActiveTechniqueCategory] = ??? override def getGroupLibrary(): Box[FullNodeGroupCategory] = ??? override def getAllGlobalParameters: Box[Seq[GlobalParameter]] = ??? override def getAllInventories(): Box[Map[NodeId, NodeInventory]] = ??? diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/services/ComplianceData.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/services/ComplianceData.scala index 2e721b5d12a..65163f7d063 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/services/ComplianceData.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/services/ComplianceData.scala @@ -562,9 +562,9 @@ object ComplianceData extends Loggable { val overridesData = for { // we don't want to write an overriden directive several time for the same overriding rule/directive. over <- overrides.groupBy(_.overridenBy).map(_._2.head) - (overridenTech , overridenDir) <- directiveLib.allDirectives.get(DirectiveRId(over.policy.directiveRId)) + (overridenTech , overridenDir) <- directiveLib.allDirectives.get(DirectiveRId(over.policy.directiveRId.id)) overridingRule <- rules.find( _.id == over.overridenBy.ruleId) - (overridingTech, overridingDir) <- directiveLib.allDirectives.get(DirectiveRId(over.overridenBy.directiveRId)) + (overridingTech, overridingDir) <- directiveLib.allDirectives.get(DirectiveRId(over.overridenBy.directiveRId.id)) } yield { val overridenTechName = overridenTech.techniques.get(overridenDir.techniqueVersion).map(_.name).getOrElse("Unknown technique") val overridenTechVersion = overridenDir.techniqueVersion