Skip to content

Commit f143dfa

Browse files
Migrate code to ce3
1 parent 7340e54 commit f143dfa

File tree

19 files changed

+126
-140
lines changed

19 files changed

+126
-140
lines changed

core/src/main/scala/com.itv/servicebox/algebra/InMemoryServiceRegistry.scala

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,20 @@ package com.itv.servicebox.algebra
22

33
import java.net.Socket
44
import java.util.concurrent.atomic.AtomicReference
5-
65
import cats.{Applicative, MonadError}
76
import cats.data.{NonEmptyList, StateT}
8-
import cats.effect.Effect
7+
import cats.effect.kernel.Sync
98
import cats.instances.list._
109
import cats.instances.map._
1110
import cats.instances.set._
12-
import cats.instances.stream._
1311
import cats.syntax.all._
1412

15-
import scala.util.Try
16-
1713
object InMemoryServiceRegistry {
1814
val DefaultPortRange = 49162 to 49262
1915
}
2016

2117
class InMemoryServiceRegistry[F[_]](range: Range, logger: Logger[F])(implicit tag: AppTag,
22-
E: Effect[F],
18+
S: Sync[F],
2319
M: MonadError[F, Throwable])
2420
extends ServiceRegistry[F](logger) {
2521

@@ -31,7 +27,7 @@ class InMemoryServiceRegistry[F[_]](range: Range, logger: Logger[F])(implicit ta
3127

3228
private def updateRange(n: Int)(implicit A: Applicative[F]): PortAllocation[F, Unit] =
3329
StateT.modifyF[F, AtomicReference[Range]] { ref =>
34-
E.delay(ref.getAndUpdate(_.drop(n))) *> A.pure(ref)
30+
S.delay(ref.getAndUpdate(_.drop(n))) *> A.pure(ref)
3531
}
3632

3733
private def lift[F[_]: Applicative, A](fa: F[A]): PortAllocation[F, A] =
@@ -65,7 +61,7 @@ class InMemoryServiceRegistry[F[_]](range: Range, logger: Logger[F])(implicit ta
6561
} yield registered
6662

6763
private def checkPortNotBound(port: Int): F[Boolean] =
68-
E.delay {
64+
S.delay {
6965
new Socket("localhost", port).close()
7066
}
7167
.attempt
@@ -74,7 +70,7 @@ class InMemoryServiceRegistry[F[_]](range: Range, logger: Logger[F])(implicit ta
7470
override def register(service: Service.Spec[F]) =
7571
for {
7672
registeredContainers <- service.containers.toList
77-
.traverse[PortAllocation[F, ?], Container.Registered](c => allocate(c, service.ref))
73+
.traverse[PortAllocation[F, *], Container.Registered](c => allocate(c, service.ref))
7874
.runA(portRange)
7975

8076
err = ServiceRegistry.EmptyPortList(registeredContainers.map(_.ref))
@@ -99,15 +95,15 @@ class InMemoryServiceRegistry[F[_]](range: Range, logger: Logger[F])(implicit ta
9995
portMappings = rs.containers.foldMap(c => Map(c.ref -> c.portMappings))
10096

10197
_ <- logger.debug(s"registering containers with port ranges:\n\t$summary")
102-
_ <- E.delay(registry.getAndUpdate(_.updated(rs.ref, portMappings)))
98+
_ <- S.delay(registry.getAndUpdate(_.updated(rs.ref, portMappings)))
10399

104100
} yield rs
105101

106102
override def deregister(id: Service.Ref) =
107-
E.delay(registry.getAndUpdate(_ - id)).void
103+
S.delay(registry.getAndUpdate(_ - id)).void
108104

109105
override def deregister(id: Service.Ref, cRef: Container.Ref) =
110-
E.delay(registry.getAndUpdate { m =>
106+
S.delay(registry.getAndUpdate { m =>
111107
m.get(id)
112108
.map { mappings =>
113109
m.updated(id, mappings - cRef)
@@ -117,10 +113,10 @@ class InMemoryServiceRegistry[F[_]](range: Range, logger: Logger[F])(implicit ta
117113
.void
118114

119115
override def lookup(id: Service.Ref) =
120-
E.delay(registry.get).map(_.get(id).filter(_.nonEmpty))
116+
S.delay(registry.get).map(_.get(id).filter(_.nonEmpty))
121117

122118
override def updatePortMappings(id: Service.Ref, cId: Container.Ref, mappings: Set[PortMapping]) =
123-
E.delay(registry.getAndUpdate { data =>
119+
S.delay(registry.getAndUpdate { data =>
124120
val updated = data
125121
.get(id)
126122
.map { m =>

core/src/main/scala/com.itv/servicebox/algebra/Logger.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.itv.servicebox.algebra
22

3-
import cats.MonadError
4-
53
abstract class Logger[F[_]] {
64
def debug(msg: String): F[Unit]
75
def info(msg: String): F[Unit]

core/src/main/scala/com.itv/servicebox/algebra/Runner.scala

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ package com.itv.servicebox.algebra
22

33
import java.util.concurrent.TimeUnit
44
import java.util.concurrent.atomic.AtomicReference
5-
65
import cats.MonadError
76
import cats.syntax.all._
87
import cats.instances.all._
98
import Service._
10-
import cats.effect.Effect
9+
import cats.effect.Sync
1110

1211
import scala.concurrent.ExecutionContext
1312
import scala.concurrent.duration.FiniteDuration
1413

1514
class Runner[F[_]](srvCtrl: ServiceController[F], networkCtrl: NetworkController[F], registry: ServiceRegistry[F])(
16-
serviceSeq: Spec[F]*)(implicit M: MonadError[F, Throwable], E: Effect[F], tag: AppTag) {
15+
serviceSeq: Spec[F]*)(implicit S: Sync[F], M: MonadError[F, Throwable], tag: AppTag) {
1716

1817
private val services = serviceSeq.toList
1918
private val tearedDownServices = new AtomicReference[Set[Service.Ref]](Set.empty[Service.Ref])
@@ -50,7 +49,7 @@ class Runner[F[_]](srvCtrl: ServiceController[F], networkCtrl: NetworkController
5049

5150
for {
5251
sortedRefs <- Dag(incomingEdges).topologicalSort.map(_.reverse)
53-
sortedSpecs <- sortedRefs.traverse[Either[Throwable, ?], Service.Spec[F]](ref =>
52+
sortedSpecs <- sortedRefs.traverse[Either[Throwable, *], Service.Spec[F]](ref =>
5453
servicesByRef.get(ref).toRight(refNotFound(ref)))
5554

5655
} yield sortedSpecs
@@ -68,11 +67,11 @@ class Runner[F[_]](srvCtrl: ServiceController[F], networkCtrl: NetworkController
6867

6968
private def setupWithRuntimeInfo(spec: Spec[F])(implicit ec: ExecutionContext): F[(Registered[F], RuntimeInfo)] =
7069
for {
71-
t1 <- E.delay(System.currentTimeMillis())
70+
t1 <- S.delay(System.currentTimeMillis())
7271
registered <- srvCtrl.start(spec)
73-
t2 <- E.delay(System.currentTimeMillis())
72+
t2 <- S.delay(System.currentTimeMillis())
7473
_ <- srvCtrl.waitUntilReady(registered)
75-
t3 <- E.delay(System.currentTimeMillis())
74+
t3 <- S.delay(System.currentTimeMillis())
7675
} yield {
7776
val setupTime = FiniteDuration(t2 - t1, TimeUnit.MILLISECONDS)
7877
val readyCheckTime = FiniteDuration(t3 - t2, TimeUnit.MILLISECONDS)
@@ -81,15 +80,15 @@ class Runner[F[_]](srvCtrl: ServiceController[F], networkCtrl: NetworkController
8180

8281
private def tearDownOnce(spec: Spec[F]): F[Unit] =
8382
for {
84-
alreadyDone <- E.delay(tearedDownServices.get())
83+
alreadyDone <- S.delay(tearedDownServices.get())
8584
maybeRegistered <- registry.lookup(spec)
8685
_ <- maybeRegistered.filterNot(srv => alreadyDone(srv.ref)).fold(M.unit) { srv =>
87-
srvCtrl.tearDown(srv) *> E.delay(tearedDownServices.getAndUpdate(_ + srv.ref))
86+
srvCtrl.tearDown(srv) *> S.delay(tearedDownServices.getAndUpdate(_ + srv.ref))
8887
}
89-
_ <- E
88+
_ <- S
9089
.delay(tearedDownServices.get)
9190
.map(_ == services.map(_.ref).toSet)
92-
.ifM(E.delay(Thread.sleep(2000)) *> networkCtrl.removeNetwork, E.unit)
91+
.ifM(S.delay(Thread.sleep(2000)) *> networkCtrl.removeNetwork, S.unit)
9392

9493
} yield ()
9594
}

core/src/main/scala/com.itv/servicebox/algebra/package.scala

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ package com.itv.servicebox
33
import java.nio.file.{Files, Path}
44
import java.util.UUID
55
import java.util.concurrent.atomic.AtomicReference
6-
76
import cats.data.{NonEmptyList, StateT}
8-
import cats.effect.{Effect, IO}
7+
import cats.derived.semiauto
8+
import cats.effect.{IO, Sync}
99
import cats.instances.all._
1010
import cats.syntax.all._
1111
import cats.{ApplicativeError, Eq, Monad, Show}
@@ -39,21 +39,21 @@ package object algebra {
3939
}
4040

4141
def fromTmpFileContent[F[_]](baseDir: Path)(to: Path, ro: Boolean = false)(
42-
files: (String, Array[Byte])*)(implicit E: Effect[F], M: Monad[F]): F[BindMount] = {
42+
files: (String, Array[Byte])*)(implicit S: Sync[F], M: Monad[F]): F[BindMount] = {
4343

4444
val mountDir = baseDir.resolve(UUID.randomUUID().toString)
4545

4646
for {
4747

48-
_ <- E
48+
_ <- S
4949
.delay(baseDir.toFile.exists())
50-
.ifM(E.unit, E.delay(baseDir.toFile.mkdirs()).void)
50+
.ifM(S.unit, S.delay(baseDir.toFile.mkdirs()).void)
5151

52-
_ <- E.delay(Files.createDirectory(mountDir))
52+
_ <- S.delay(Files.createDirectory(mountDir))
5353

5454
_ <- files.toList.traverse_ {
5555
case (fileName, content) =>
56-
E.delay(Files.write(mountDir.resolve(fileName), content))
56+
S.delay(Files.write(mountDir.resolve(fileName), content))
5757
}
5858
} yield BindMount(mountDir, to, ro)
5959
}
@@ -135,7 +135,8 @@ package object algebra {
135135
}
136136

137137
object Spec {
138-
implicit val eq: Eq[Spec] = cats.derived.semi.eq[Spec]
138+
139+
implicit val eqSpec: Eq[Spec] = semiauto.eq[Spec]
139140
}
140141

141142
case class Registered(ref: Container.Ref,
@@ -435,6 +436,7 @@ package object algebra {
435436
}
436437

437438
object UnsafeBlocking {
439+
import cats.effect.unsafe.implicits._
438440
implicit val ioRunSync: UnsafeBlocking[IO] = new UnsafeBlocking[IO] {
439441
override def runSync[A](io: IO[A]): A = io.unsafeRunSync()
440442
}
Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package com.itv.servicebox
22

33
import java.util.concurrent.{TimeUnit, TimeoutException}
4-
5-
import cats.effect.{ContextShift, IO, Timer}
4+
import cats.effect.IO
5+
import cats.effect.kernel.Clock
66
import cats.syntax.apply._
7+
78
import scala.concurrent.duration._
89
import com.itv.servicebox.algebra._
910

@@ -13,15 +14,11 @@ import scala.concurrent.duration.FiniteDuration
1314
package object interpreter {
1415
implicit val ioLogger: Logger[IO] = IOLogger
1516

16-
implicit def ioScheduler(implicit logger: Logger[IO]): Scheduler[IO] = new Scheduler[IO](logger) {
17+
implicit def ioScheduler(implicit logger: Logger[IO], clock: Clock[IO]): Scheduler[IO] = new Scheduler[IO](logger) {
1718
override def retry[A](f: () => IO[A], checkTimeout: FiniteDuration, totalTimeout: FiniteDuration, label: String)(implicit ec: ExecutionContext): IO[A] = {
1819

19-
implicit val timer: Timer[IO] = IO.timer(ec)
20-
implicit val cs: ContextShift[IO] = IO.contextShift(ec)
21-
22-
def currentTimeMs = timer.clock.monotonic(TimeUnit.MILLISECONDS).map(FiniteDuration(_, TimeUnit.MILLISECONDS))
23-
24-
def lapseTime(startTime: FiniteDuration) = currentTimeMs.map(_ - startTime)
20+
val currentTime = clock.monotonic
21+
def lapseTime(startTime: FiniteDuration) = currentTime.map(_ - startTime)
2522

2623
def attemptAction(startTime: FiniteDuration): IO[A] =
2724
for {
@@ -30,18 +27,18 @@ package object interpreter {
3027
IO(logger.warn(s"exiting loop. Elapsed time: $elapsed")) *>
3128
IO.raiseError(new TimeoutException(s"Ready check timed out for $label after $totalTimeout"))
3229
} else IO.unit
33-
attemptBegin <- currentTimeMs
30+
attemptBegin <- currentTime
3431
_ <- logger.debug(
3532
s"running ready-check for $label [time taken so far: $elapsed, check timeout: $checkTimeout, total timeout: $totalTimeout]")
3633
result <- f().timeout(checkTimeout).attempt
3734
sleepRemainder <- lapseTime(attemptBegin).map(elapsedTime => List(checkTimeout - elapsedTime, 0.millis).max)
3835
outcome <- result.fold(
39-
err => logger.warn(s"Ready check failed for $label: $err...") *> IO.sleep(sleepRemainder) *> attemptAction(startTime),
36+
err => logger.debug(s"Ready check failed for $label: $err...") *> IO.sleep(sleepRemainder) *> attemptAction(startTime),
4037
out => IO(logger.debug(s"done! total elapsed time: $elapsed")) *> IO.pure(out)
4138
)
4239
} yield outcome
4340

44-
currentTimeMs flatMap attemptAction
41+
currentTime flatMap attemptAction
4542
}
4643
}
4744
}

core/src/test/scala/com/itv/servicebox/algebra/packageTest.scala

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@ package com.itv.servicebox.algebra
22

33
import java.nio.file.{Files, Paths}
44
import java.util.UUID
5-
65
import cats.effect.IO
7-
import cats.instances.future._
6+
import cats.effect.unsafe.implicits.global
87
import org.scalatest.freespec.AnyFreeSpec
98
import org.scalatest.matchers.should.Matchers
10-
import scala.concurrent.ExecutionContext.Implicits.global
11-
import scala.concurrent.duration._
12-
import scala.concurrent.{Await, Future}
9+
1310

1411
class packageTest extends AnyFreeSpec with Matchers {
1512
"BindMount" - {

core/src/test/scala/com/itv/servicebox/fake/ContainerController.scala

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.itv.servicebox.fake
22

33
import java.util.concurrent.atomic.AtomicReference
4-
54
import cats.MonadError
65
import cats.data.NonEmptyList
7-
import cats.effect.Effect
6+
import cats.effect.Sync
87
import cats.instances.list._
98
import cats.syntax.flatMap._
109
import cats.syntax.functor._
@@ -21,7 +20,7 @@ class ContainerController[F[_]](
2120
imageRegistry: ImageRegistry[F],
2221
logger: Logger[F],
2322
network: Option[NetworkName],
24-
initialState: ContainerStates = Map.empty)(implicit tag: AppTag, E: Effect[F], M: MonadError[F, Throwable])
23+
initialState: ContainerStates = Map.empty)(implicit tag: AppTag, S: Sync[F])
2524
extends algebra.ContainerController[F](imageRegistry, logger, network) {
2625

2726
private val containersByRef = new AtomicReference[ContainerStates](initialState)
@@ -34,7 +33,7 @@ class ContainerController[F[_]](
3433
containers <- spec.containers.toList
3534
.traverse[F, Option[ContainerWithState]] { c =>
3635
val ref = c.ref(spec.ref)
37-
E.delay(containersByRef.get)
36+
S.delay(containersByRef.get)
3837
.map(_.get(ref).filter(containerWithState => containerWithState.container.toSpec === c.toSpec))
3938
}
4039
.map(_.flatten)
@@ -52,7 +51,7 @@ class ContainerController[F[_]](
5251
s"starting container ${container.ref.show} service ref: ${serviceRef.show} with port mappings: ${container.portMappings
5352
.map { case (host, guest) => s"$host -> $guest" }
5453
.mkString(", ")}")
55-
_ <- E.delay(
54+
_ <- S.delay(
5655
containersByRef.getAndUpdate(_.updated(container.ref, ContainerWithState(container, isRunning = true))))
5756
} yield ()
5857

@@ -64,7 +63,7 @@ class ContainerController[F[_]](
6463

6564
private def shutdownContainer(ref: Container.Ref): F[Unit] =
6665
for {
67-
_ <- E.delay(containersByRef.getAndUpdate { containers =>
66+
_ <- S.delay(containersByRef.getAndUpdate { containers =>
6867
containers
6968
.get(ref)
7069
.map { c =>
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
package com.itv.servicebox.fake
22

33
import java.util.concurrent.atomic.AtomicReference
4-
54
import cats.MonadError
6-
import cats.effect.Effect
5+
import cats.effect.Sync
76
import cats.syntax.functor._
87
import cats.syntax.monadError._
98
import com.itv.servicebox.algebra
109

1110
class InMemoryImageRegistry[F[_]](
1211
logger: algebra.Logger[F],
1312
imagesDownloaded: Set[String] = Set.empty,
14-
imagesAvaliable: Option[Set[String]] = None)(implicit E: Effect[F], M: MonadError[F, Throwable])
13+
imagesAvaliable: Option[Set[String]] = None)(implicit S: Sync[F])
1514
extends algebra.ImageRegistry[F](logger) {
1615
private val images = new AtomicReference[Set[String]](imagesDownloaded)
1716

18-
def addImage(imageName: String) = E.delay(images.getAndUpdate(_ + imageName)).void
17+
def addImage(imageName: String) = S.delay(images.getAndUpdate(_ + imageName)).void
1918

2019
override def fetchImage(name: String) =
2120
imagesAvaliable.fold(addImage(name))(available =>
2221
addImage(name).ensure(new IllegalArgumentException(s"image $name is not available"))(_ => available(name)))
2322

24-
override def imageExists(imageName: String): F[Boolean] = E.delay(images.get()).map(_(imageName))
23+
override def imageExists(imageName: String): F[Boolean] = S.delay(images.get()).map(_(imageName))
2524
}

0 commit comments

Comments
 (0)