Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@ c980f5875ba856d02ca8da6162f54f44793dcd16

# Scala Steward: Reformat with scalafmt 3.9.7
c9e07485ef29578e1088bb7f79253f45d7a14e4b

# Scala Steward: Reformat with scalafmt 3.10.5
92632dc93496fd92853961f05c5b0621978e481b
2 changes: 1 addition & 1 deletion .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version = 3.10.3
version = 3.10.5
runner.dialect = Scala213Source3
maxColumn = 100
indent.defnSite = 2
Expand Down
13 changes: 11 additions & 2 deletions src/main/scala/com/advancedtelematic/director/Boot.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,23 @@ import com.advancedtelematic.libats.http.VersionDirectives.versionHeaders
import com.advancedtelematic.libats.http.monitoring.ServiceHealthCheck
import com.advancedtelematic.libats.http.tracing.Tracing
import com.advancedtelematic.libats.http.tracing.Tracing.ServerRequestTracing
import com.advancedtelematic.libats.http.{BootApp, BootAppDatabaseConfig, BootAppDefaultConfig, NamespaceDirectives}
import com.advancedtelematic.libats.http.{
BootApp,
BootAppDatabaseConfig,
BootAppDefaultConfig,
NamespaceDirectives
}
import com.advancedtelematic.libats.messaging.{MessageBus, MessageBusPublisher}
import com.advancedtelematic.libats.messaging_datatype.DataType.DeviceId
import com.advancedtelematic.libats.slick.db.{CheckMigrations, DatabaseSupport}
import com.advancedtelematic.libats.slick.monitoring.{DatabaseMetrics, DbHealthResource}
import com.advancedtelematic.libtuf_server.keyserver.KeyserverHttpClient
import com.advancedtelematic.metrics.prometheus.PrometheusMetricsSupport
import com.advancedtelematic.metrics.{PekkoHttpConnectionMetrics, PekkoHttpRequestMetrics, MetricsSupport}
import com.advancedtelematic.metrics.{
MetricsSupport,
PekkoHttpConnectionMetrics,
PekkoHttpRequestMetrics
}
import com.codahale.metrics.MetricRegistry
import com.typesafe.config.Config
import org.bouncycastle.jce.provider.BouncyCastleProvider
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,13 @@ class DeviceManifestReportedListener(globalConfig: Config)(
Attributes
.logLevels(onFinish = Attributes.logLevelWarning)
)
.wireTap(batch => batch.offsets.size )
.wireTap(batch => batch.offsets.size)
.via(committerFlow)
}
.watchTermination() { (_, done) =>
done
.failed
.map { err => failureCount.inc()
done.failed
.map { err =>
failureCount.inc()
log.error("device-manifest-reported-listener failed", err)
}
NotUsed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,18 @@ package com.advancedtelematic.director.daemon

import org.apache.pekko.http.scaladsl.model.Uri
import org.apache.pekko.http.scaladsl.util.FastFuture
import com.advancedtelematic.director.data.DbDataType.{Assignment, AutoUpdateDefinition, EcuTarget, EcuTargetId}
import com.advancedtelematic.director.db.{AssignmentsRepositorySupport, AutoUpdateDefinitionRepositorySupport, EcuTargetsRepositorySupport, ProvisionedDeviceRepositorySupport}
import com.advancedtelematic.director.data.DbDataType.{
Assignment,
AutoUpdateDefinition,
EcuTarget,
EcuTargetId
}
import com.advancedtelematic.director.db.{
AssignmentsRepositorySupport,
AutoUpdateDefinitionRepositorySupport,
EcuTargetsRepositorySupport,
ProvisionedDeviceRepositorySupport
}
import com.advancedtelematic.libats.data.DataType.{AutoUpdateId, Namespace}
import com.advancedtelematic.libats.messaging.MsgOperation.MsgOperation
import com.advancedtelematic.libtuf_server.data.Messages.TufTargetAdded
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package com.advancedtelematic.director.daemon
import cats.implicits.*
import com.advancedtelematic.director.db.UpdateSchedulerDBIO
import com.advancedtelematic.libats.messaging.MessageBusPublisher
import com.advancedtelematic.libats.messaging_datatype.Messages.{DeviceUpdateAssigned, DeviceUpdateEvent}
import com.advancedtelematic.libats.messaging_datatype.Messages.{
DeviceUpdateAssigned,
DeviceUpdateEvent
}
import org.slf4j.LoggerFactory
import slick.jdbc.MySQLProfile.api.*

import java.time.Instant
import scala.concurrent.duration.*
import scala.concurrent.{ExecutionContext, Future, blocking}
import scala.concurrent.{blocking, ExecutionContext, Future}

class UpdateSchedulerDaemon()(
implicit db: Database,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import com.advancedtelematic.director.http.{
RemoteCommandRequest,
RemoteSessionRequest,
UpdateDetailResponse,
UpdateReportedResult,
UpdateEventResponse,
UpdateReportedResult,
UpdateResponse,
UpdateResultResponse
}
Expand Down Expand Up @@ -193,5 +193,7 @@ object Codecs {
implicit val updateDetailResponseCodec: Codec[UpdateDetailResponse] =
deriveCodec[UpdateDetailResponse]

implicit val updateEventResponseCodec: Codec[UpdateEventResponse] = deriveCodec[UpdateEventResponse]
implicit val updateEventResponseCodec: Codec[UpdateEventResponse] =
deriveCodec[UpdateEventResponse]

}
61 changes: 42 additions & 19 deletions src/main/scala/com/advancedtelematic/director/data/DataType.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,41 @@ import com.advancedtelematic.director.data.DbDataType.Ecu
import com.advancedtelematic.director.data.UptaneDataType.{Hashes, TargetImage}
import com.advancedtelematic.director.deviceregistry.data.DataType.UpdateTagValue
import com.advancedtelematic.director.deviceregistry.data.TagId
import com.advancedtelematic.libats.data.DataType.{Checksum, CorrelationId, HashMethod, Namespace, UpdateCorrelationId, ValidChecksum}
import com.advancedtelematic.libats.data.DataType.{
Checksum,
CorrelationId,
HashMethod,
Namespace,
UpdateCorrelationId,
ValidChecksum
}
import com.advancedtelematic.libats.data.UUIDKey.{UUIDKey, UUIDKeyObj, UuidKeyObjTimeBased}
import com.advancedtelematic.libats.data.PaginationResult
import com.advancedtelematic.libats.messaging_datatype.DataType.{DeviceId, EcuIdentifier}
import com.advancedtelematic.libats.messaging_datatype.MessageLike
import com.advancedtelematic.libats.messaging_datatype.Messages.EcuAndHardwareId
import com.advancedtelematic.libtuf.crypt.CanonicalJson.*
import com.advancedtelematic.libtuf.data.ClientDataType.{ClientHashes, MetaPath, TufRole, ValidMetaPath}
import com.advancedtelematic.libtuf.data.ClientDataType.{
ClientHashes,
MetaPath,
TufRole,
ValidMetaPath
}
import com.advancedtelematic.libtuf.data.TufDataType.RoleType.RoleType
import com.advancedtelematic.libtuf.data.TufDataType.{HardwareIdentifier, JsonSignedPayload, KeyType, RepoId, SignedPayload, TargetFilename, TargetName, TufKey}
import com.advancedtelematic.libtuf.data.ValidatedString.{ValidatedString, ValidatedStringValidation}
import com.advancedtelematic.libtuf.data.TufDataType.{
HardwareIdentifier,
JsonSignedPayload,
KeyType,
RepoId,
SignedPayload,
TargetFilename,
TargetName,
TufKey
}
import com.advancedtelematic.libtuf.data.ValidatedString.{
ValidatedString,
ValidatedStringValidation
}
import com.advancedtelematic.libtuf_server.crypto.Sha256Digest
import com.advancedtelematic.libtuf_server.repo.server.DataType.SignedRole
import eu.timepit.refined.api.Refined
Expand All @@ -47,18 +71,17 @@ object DbDataType {
ecuId: EcuIdentifier,
targetName: TargetName)

final case class DeviceKnownState(
deviceId: DeviceId,
primaryEcu: EcuIdentifier,
ecuStatus: Map[EcuIdentifier, Option[EcuTargetId]],
ecuTargets: Map[EcuTargetId, EcuTarget],
currentAssignments: Set[Assignment],
processedAssignments: Set[ProcessedAssignment],
// scheduledUpdates: Set[ScheduledUpdate],
// scheduledUpdatesEcuTargetIds: Map[TargetSpecId, Seq[EcuTargetId]],
updates: Set[Update],
updatesTargetIds: Map[TargetSpecId, Seq[EcuTargetId]],
generatedMetadataOutdated: Boolean)
final case class DeviceKnownState(deviceId: DeviceId,
primaryEcu: EcuIdentifier,
ecuStatus: Map[EcuIdentifier, Option[EcuTargetId]],
ecuTargets: Map[EcuTargetId, EcuTarget],
currentAssignments: Set[Assignment],
processedAssignments: Set[ProcessedAssignment],
// scheduledUpdates: Set[ScheduledUpdate],
// scheduledUpdatesEcuTargetIds: Map[TargetSpecId, Seq[EcuTargetId]],
updates: Set[Update],
updatesTargetIds: Map[TargetSpecId, Seq[EcuTargetId]],
generatedMetadataOutdated: Boolean)

final case class Device(ns: Namespace,
id: DeviceId,
Expand Down Expand Up @@ -299,7 +322,7 @@ object Messages {

object DataType {
import enumeratum.*

final case class TargetItemCustomEcuData(hardwareId: HardwareIdentifier)

final case class TargetItemCustom(uri: Option[Uri],
Expand Down Expand Up @@ -349,8 +372,7 @@ object DataType {
createdAt: Instant,
scheduledFor: Option[Instant],
status: Update.Status,
completedAt: Option[Instant] = None,
)
completedAt: Option[Instant] = None)

object Update {

Expand Down Expand Up @@ -449,4 +471,5 @@ object ClientDataType {
// (1) safe because Refined checks Regex
def tagValue: String = value.value.split("=")(1)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ class DirectorDbDebug()(implicit val db: Database, ec: ExecutionContext) {
"device_manifests",
readTable(
"device_manifests",
id => sql"""select * from device_manifests where device_id = $id order by received_at desc limit 20"""
id =>
sql"""select * from device_manifests where device_id = $id order by received_at desc limit 20"""
)
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ package com.advancedtelematic.director.db

import org.apache.pekko.http.scaladsl.util.FastFuture
import cats.implicits.toShow
import com.advancedtelematic.director.data.AdminDataType.{EcuInfoImage, EcuInfoResponse, RegisterEcu}
import com.advancedtelematic.director.data.AdminDataType.{
EcuInfoImage,
EcuInfoResponse,
RegisterEcu
}
import com.advancedtelematic.director.data.UptaneDataType.Hashes
import com.advancedtelematic.director.db.ProvisionedDeviceRepository.DeviceCreateResult
import com.advancedtelematic.director.db.deviceregistry.{DeviceRepository, EcuReplacementRepository}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,14 @@ import com.advancedtelematic.libats.data.DataType.{Checksum, CorrelationId, Name
import com.advancedtelematic.libats.messaging_datatype.DataType.{DeviceId, EcuIdentifier}
import com.advancedtelematic.libats.slick.db.SlickCirceMapper.jsonMapper
import com.advancedtelematic.libtuf.data.TufDataType.RoleType.RoleType
import com.advancedtelematic.libtuf.data.TufDataType.{HardwareIdentifier, JsonSignedPayload, RepoId, TargetFilename, TargetName, TufKey}
import com.advancedtelematic.libtuf.data.TufDataType.{
HardwareIdentifier,
JsonSignedPayload,
RepoId,
TargetFilename,
TargetName,
TufKey
}
import io.circe.Json
import slick.jdbc.MySQLProfile.api.*
import SlickMapping.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ import com.advancedtelematic.libats.data.DataType.HashMethod
import com.advancedtelematic.libats.data.DataType.HashMethod.HashMethod
import com.advancedtelematic.libats.slick.codecs.SlickEnumeratum.enumeratumMapper
import com.advancedtelematic.libats.slick.db.SlickCirceMapper
import com.advancedtelematic.libtuf.data.ValidatedString.{ValidatedString, ValidatedStringValidation}
import com.advancedtelematic.libtuf.data.ValidatedString.{
ValidatedString,
ValidatedStringValidation
}
import slick.jdbc.MySQLProfile.api.*

import java.time.Instant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.advancedtelematic.director.deviceregistry.data.{DeviceSortBy, GroupSo
import com.advancedtelematic.director.deviceregistry.data.SortDirection.SortDirection
import Schema.DeviceTable
import GroupInfoRepository.GroupInfoTable
import com.advancedtelematic.libats.data.PaginationResult.{Offset, Limit}
import com.advancedtelematic.libats.data.PaginationResult.{Limit, Offset}
import slick.ast.Ordering
import slick.jdbc.MySQLProfile.api.*
import slick.lifted.ColumnOrdered
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,12 @@ import com.advancedtelematic.libats.data.PaginationResult
import com.advancedtelematic.libats.data.PaginationResult.{Limit, Offset}
import com.advancedtelematic.libats.messaging_datatype.DataType.{DeviceId, EcuIdentifier}
import com.advancedtelematic.libats.messaging_datatype.MessageCodecs.ecuReplacementCodec
import com.advancedtelematic.libats.messaging_datatype.Messages.{EcuAndHardwareId, EcuReplaced, EcuReplacement, EcuReplacementFailed}
import com.advancedtelematic.libats.messaging_datatype.Messages.{
EcuAndHardwareId,
EcuReplaced,
EcuReplacement,
EcuReplacementFailed
}
import com.advancedtelematic.libats.slick.codecs.SlickRefined.refinedMappedType
import com.advancedtelematic.libats.slick.db.SlickExtensions.javaInstantMapping
import com.advancedtelematic.libats.slick.db.SlickResultExtensions.*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@

package com.advancedtelematic.director.db.deviceregistry

import com.advancedtelematic.director.deviceregistry.data.{Group, GroupExpression, GroupName, GroupType, TagId}
import com.advancedtelematic.director.deviceregistry.data.{
Group,
GroupExpression,
GroupName,
GroupType,
TagId
}
import com.advancedtelematic.director.deviceregistry.data.Group.GroupId
import com.advancedtelematic.director.deviceregistry.data.GroupSortBy.GroupSortBy

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,14 @@ import com.advancedtelematic.libats.slick.db.SlickUUIDKey.*
import com.advancedtelematic.director.http.deviceregistry.Errors.MemberAlreadyExists
import com.advancedtelematic.director.deviceregistry.data.DataType.HibernationStatus
import com.advancedtelematic.director.deviceregistry.data.Group.GroupId
import com.advancedtelematic.director.deviceregistry.data.{Device, DeviceDB, GroupExpression, GroupExpressionAST, GroupType, TagId}
import com.advancedtelematic.director.deviceregistry.data.{
Device,
DeviceDB,
GroupExpression,
GroupExpressionAST,
GroupType,
TagId
}
import DbOps.*
import com.advancedtelematic.director.http.deviceregistry.Errors
import com.advancedtelematic.libats.data.PaginationResult.{Limit, Offset}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,16 @@ import cats.implicits.toShow
import java.time.Instant
import com.advancedtelematic.libats.data.DataType.{CorrelationId, ResultCode}
import com.advancedtelematic.libats.data.PaginationResult
import com.advancedtelematic.libats.messaging_datatype.DataType.{DeviceId, EcuIdentifier, EcuInstallationReport}
import com.advancedtelematic.director.deviceregistry.data.DataType.{DeviceInstallationResult, EcuInstallationResult, InstallationStat}
import com.advancedtelematic.libats.messaging_datatype.DataType.{
DeviceId,
EcuIdentifier,
EcuInstallationReport
}
import com.advancedtelematic.director.deviceregistry.data.DataType.{
DeviceInstallationResult,
EcuInstallationResult,
InstallationStat
}
import com.advancedtelematic.libats.data.PaginationResult.{Limit, Offset}
import io.circe.Json
import slick.jdbc.MySQLProfile.api.*
Expand Down Expand Up @@ -131,12 +139,15 @@ object InstallationReportRepository {

import cats.syntax.either.*

def fetchManyDevicesInstallationResults(ids: Set[(DeviceId, CorrelationId)]): DBIO[Vector[DeviceInstallationResult]] = {
val idsStr = ids.map { case (d, c) => s"(${d.show}, ${c.toString})"}.mkString(",")
def fetchManyDevicesInstallationResults(
ids: Set[(DeviceId, CorrelationId)]): DBIO[Vector[DeviceInstallationResult]] = {
val idsStr = ids.map { case (d, c) => s"(${d.show}, ${c.toString})" }.mkString(",")

implicit val getDeviceInstallationResult: GetResult[DeviceInstallationResult] = GetResult { r =>
DeviceInstallationResult(
correlationId = CorrelationId.fromString(r.nextString()).valueOr(err => throw new IllegalArgumentException(err)),
correlationId = CorrelationId
.fromString(r.nextString())
.valueOr(err => throw new IllegalArgumentException(err)),
resultCode = ResultCode(r.nextString()),
deviceId = DeviceId(java.util.UUID.fromString(r.nextString())),
success = r.nextBoolean(),
Expand All @@ -150,14 +161,16 @@ object InstallationReportRepository {
""".as[DeviceInstallationResult]
}

def fetchManyByDevice(deviceId: DeviceId, correlationIds: Set[CorrelationId]): DBIO[Seq[DeviceInstallationResult]] =
def fetchManyByDevice(deviceId: DeviceId,
correlationIds: Set[CorrelationId]): DBIO[Seq[DeviceInstallationResult]] =
deviceInstallationResults
.filter(_.deviceUuid === deviceId)
.filter(_.correlationId.inSet(correlationIds))
.result

def fetchDeviceInstallationResultByCorrelationId(deviceId: DeviceId,
correlationId: CorrelationId): DBIO[Option[DeviceInstallationResult]] =
def fetchDeviceInstallationResultByCorrelationId(
deviceId: DeviceId,
correlationId: CorrelationId): DBIO[Option[DeviceInstallationResult]] =
deviceInstallationResults
.filter(_.deviceUuid === deviceId)
.filter(_.correlationId === correlationId)
Expand Down
Loading