Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
VinceMacBuche committed Dec 19, 2016
1 parent 1687c0f commit 1962481
Show file tree
Hide file tree
Showing 11 changed files with 230 additions and 200 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,45 +40,76 @@ package com.normation.rudder.datasources
import org.joda.time.DateTime
import org.joda.time.Seconds
import net.liftweb.common._
import scala.concurrent.duration.Duration

sealed trait DataSourceType {
def name : String
}

object DataSourceType {
def apply(name : String) : Box[DataSourceType] = {
if (name == ByNodeSourceType.name) {
Full(ByNodeSourceType)
} else {
Failure("not a valid source type name")
}
}
final case class HttpDataSourceType (
url : String
, headers : Map[String,String]
, httpMethod : String
, path : String
, requestMode : HttpRequestMode
, requestTimeOut : Duration
) extends DataSourceType {
val name = HttpDataSourceType.name
}

object HttpDataSourceType{
val name = "http"
}
case object ByNodeSourceType extends DataSourceType {

sealed trait HttpRequestMode {
def name : String
}
final case object OneRequestByNode extends HttpRequestMode {
val name = "byNode"
}

case class AllNodesSourceType(
final case class OneRequestAllNodes(
matchingPath : String
, nodeAttribute : String
) extends DataSourceType {
val name = AllNodesSourceType.name
) extends HttpRequestMode {
val name = OneRequestAllNodes.name
}

object AllNodesSourceType {
object OneRequestAllNodes {
val name = "allNodes"
}
case class DataSourceName(value : String) extends AnyVal
final case class DataSourceName(value : String) extends AnyVal
final case class DataSourceId (value : String) extends AnyVal

case class DataSource (
name : DataSourceName
, description: String
, sourceType : DataSourceType
, url : String
, headers : Map[String,String]
, httpMethod : String
, path : String
, frequency : Seconds
, lastUpdate : Option[DateTime]
, enabled : Boolean
sealed trait DataSourceSchedule {
def duration : Duration
}

final case class NoSchedule(
savedDuration : Duration
) extends DataSourceSchedule {
val duration = savedDuration
}

final case class Scheduled(
duration : Duration
) extends DataSourceSchedule

final case class DataSourceRunParameters (
schedule : DataSourceSchedule
, onGeneration : Boolean
, onNewNode : Boolean
)

final case class DataSource (
id : DataSourceId
, name : DataSourceName
, sourceType : DataSourceType
, runParam : DataSourceRunParameters
, description : String
, lastUpdate : Option[DateTime]
, enabled : Boolean
, updateTimeOut : Duration
) {
val scope = "all"
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ import net.liftweb.common.Box

trait DataSourceRepository {

def getAll : Box[Seq[DataSource]]
def getAll : Box[Map[DataSourceId,DataSource]]

def get(name : DataSourceName) : Box[Option[DataSource]]
def get(id : DataSourceId) : Box[Option[DataSource]]

def save(source : DataSource) : Box[DataSource]

def delete(source : DataSourceName) : Box[DataSource]
def delete(id : DataSourceId) : Box[DataSource]
}
8 changes: 2 additions & 6 deletions rudder-web/src/main/scala/bootstrap/liftweb/AppConfig.scala
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,7 @@ import com.normation.rudder.services.quicksearch.FullQuickSearchService
import com.normation.rudder.db.Doobie
import com.normation.rudder.web.rest.settings.SettingsAPI8
import com.normation.rudder.web.rest.sharedFiles.SharedFilesAPI
import com.normation.rudder.web.rest.compliance.DataSourceApi9
import com.normation.rudder.web.rest.compliance.DataSourceApiService
import com.normation.rudder.web.rest.compliance.MemoryDataSourceRepository
import com.normation.rudder.web.rest.datasource._

/**
* Define a resource for configuration.
Expand Down Expand Up @@ -311,12 +309,10 @@ object RudderConfig extends Loggable {
, RudderServerRole("rudder-cfengine-mission-portal", config.getString("rudder.server-roles.cfengine-mission-portal"))
)


// The base directory for hooks. I'm not sure it need to be configurable
// as we only use it in generation.
val HOOKS_D = "/opt/rudder/hooks.d"


val licensesConfiguration = "licenses.xml"
val logentries = "logentries.xml"
val prettyPrinter = new RudderPrettyPrinter(Int.MaxValue, 2)
Expand Down Expand Up @@ -790,7 +786,7 @@ object RudderConfig extends Loggable {

val settingsApi8 = new SettingsAPI8(restExtractorService, configService, asyncDeploymentAgent, stringUuidGenerator)

val dataSourceApiService = new DataSourceApiService(new MemoryDataSourceRepository, restDataSerializer)
val dataSourceApiService = new DataSourceApiService(new MemoryDataSourceRepository, restDataSerializer, restExtractorService)
val dataSourceApi9 = new DataSourceApi9(restExtractorService, dataSourceApiService, stringUuidGenerator)

// First working version with support for rules, directives, nodes and global parameters
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,7 @@ import com.normation.rudder.web.rest.node.MinimalDetailLevel
import com.normation.rudder.repository.FullActiveTechnique
import scala.language.implicitConversions
import com.normation.rudder.web.components.DateFormaterService
import com.normation.rudder.datasources.DataSource
import com.normation.rudder.datasources.ByNodeSourceType
import com.normation.rudder.datasources.AllNodesSourceType
import com.normation.rudder.datasources._

/**
* Centralize all function to serialize datas as valid answer for API Rest
Expand Down Expand Up @@ -594,23 +592,32 @@ case class RestDataSerializerImpl (

def serializeDataSource(source : DataSource): JValue = {
( ( "name" -> source.name.value )
~ ( "id" -> source.id.value )
~ ( "description" -> source.description )
~ ( "type" -> (
( "name" -> source.sourceType.name )
~ { source.sourceType match {
case ByNodeSourceType =>
JObject(Nil)
case allNodes : AllNodesSourceType =>
( ( "path" -> allNodes.matchingPath )
~ ( "attribute" -> allNodes.nodeAttribute )
)
} }
) )
~ ( "url" -> source.url )
~ ( "headers" -> source.headers )
~ ( "path" -> source.path )
~ ( "frequency" -> source.frequency.getSeconds )
case HttpDataSourceType(url,headers,method,path,mode,timeOut) =>
( ( "url" -> url )
~ ( "headers" -> headers )
~ ( "path" -> path )
~ ( "requestTimeout" -> timeOut.toString )
~ ( "requestMode" ->
( ( "name" -> mode.name )
~ { mode match {
case OneRequestByNode =>
JObject(Nil)
case OneRequestAllNodes(subPath,nodeAttribute) =>
( ( "path" -> subPath)
~ ( "attribute" -> nodeAttribute)
)
} } )
) )
}
} )
)
~ ( "lastUpdate" -> source.lastUpdate.map { DateFormaterService.getFormatedDate(_)} . getOrElse("Never") )
~ ( "updateTimeOut" -> source.updateTimeOut.toString )
~ ( "enabled" -> source.enabled )
)
}
Expand Down
Loading

0 comments on commit 1962481

Please sign in to comment.