Skip to content

Commit

Permalink
more WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
etspaceman committed Jul 10, 2023
1 parent 7d00eca commit b1b020c
Show file tree
Hide file tree
Showing 14 changed files with 365 additions and 45 deletions.
9 changes: 5 additions & 4 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import LibraryDependencies._

lazy val `kinesis-mock` = projectMatrix
.enablePlugins(DockerImagePlugin, DockerComposePlugin, NoPublishPlugin)
.enablePlugins(DockerImagePlugin, NoPublishPlugin)
.settings(
description := "A Mock API for AWS Kinesis",
libraryDependencies ++= Seq(
Expand Down Expand Up @@ -39,6 +39,8 @@ lazy val `kinesis-mock-js` =
`kinesis-mock`
.js(Scala213)
.settings(
Compile / fastLinkJS / scalaJSLinkerOutputDirectory := file("docker/image/lib"),
Compile / fullLinkJS / scalaJSLinkerOutputDirectory := file("docker/image/lib"),
scalaJSUseMainModuleInitializer := true,
scalaJSLinkerConfig ~= { _.withModuleKind(ModuleKind.CommonJSModule) }
)
Expand All @@ -57,8 +59,7 @@ lazy val `unit-tests` = projectMatrix
.dependsOn(testkit % Test)

lazy val `integration-tests` = projectMatrix
.enablePlugins(NoPublishPlugin, DockerImagePlugin)
.settings(DockerImagePlugin.settings)
.enablePlugins(NoPublishPlugin)
.settings(
libraryDependencies ++= Seq(
Aws.kinesis % Test,
Expand All @@ -78,7 +79,7 @@ lazy val allProjects = Seq(
`integration-tests`
)

lazy val functionalTestProjects = List(`integration-tests`).map(_.jvm(Scala213))
lazy val functionalTestProjects = List(`kinesis-mock`).map(_.js(Scala213))

def commonRootSettings: Seq[Setting[_]] =
DockerComposePlugin.settings(true, functionalTestProjects) ++ Seq(
Expand Down
19 changes: 6 additions & 13 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,15 +1,8 @@
FROM ghcr.io/etspaceman/graalvm-ce-base:latest as build
FROM node:20 as build

ARG DOCKER_SERVICE_JAR
ARG STATIC_TYPE
COPY ${DOCKER_SERVICE_JAR} ./kinesis-mock.jar
COPY graal ./graal

RUN ./graal/buildNativeImageLinux.sh ${STATIC_TYPE}
RUN ./upx-3.96-amd64_linux/upx --best -o kinesis-mock kinesis-mock-native

FROM alpine:3
RUN apk --no-cache add curl
COPY --from=build /app/kinesis-mock /opt/kinesis-mock
ARG DOCKER_SERVICE_FILE
ENV KINESIS_MOCK_CERT_PATH="server.json"
COPY ${DOCKER_SERVICE_FILE} ./kinesis-mock.js
COPY kinesis-mock/src/main/resources/server.json ./server.json
EXPOSE 4567 4568
CMD ["/opt/kinesis-mock", "--gc=G1"]
CMD ["node", "./kinesis-mock.js"]
6 changes: 3 additions & 3 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ services:
kinesis-mock:
image: "ghcr.io/etspaceman/kinesis-mock:${DOCKER_TAG_VERSION}"
environment:
- "LOG_LEVEL=TRACE"
- "LOG_LEVEL=DEBUG"
# This must match 'initializedStreams' variable in AwsFunctionalTests
- "INITIALIZE_STREAMS=stream1:3,stream2:2,stream3:1,stream4:2,stream5:3,stream6:5,stream7:5,stream8:3,stream9:1,stream10:3,stream11:2"
- "SHOULD_PERSIST_DATA=true"
Expand Down Expand Up @@ -57,5 +57,5 @@ services:
condition: service_completed_successfully
networks:
default:
external:
name: ${DOCKER_NET_NAME}
name: ${DOCKER_NET_NAME}
external: true
1 change: 0 additions & 1 deletion docker/image/lib/.gitkeep

This file was deleted.

60 changes: 60 additions & 0 deletions kinesis-mock/src/main/resources/keystore.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
Bag Attributes
friendlyName: 127.0.0.1
localKeyID: 54 69 6D 65 20 31 36 38 39 30 32 30 34 39 31 31 37 35
Key Attributes: <No Attributes>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI+3ytr9teonACAggA
MBQGCCqGSIb3DQMHBAjD8M6SQghjBwSCBMgH3/xoxG3gdQKMG9OJjttCQzWcaWIo
ep8ZBZwb1nBvsZiX3DPidDpl5TSAfYJ5Ipbq6jy7nv7NXs48ZCmM2qqyg7T9FMJO
qMKcOKn+jQSC5jzceCwokeEhYldrPgRM0aOJsB/aKsXRpyjtjGb7LmjCmM3+9DFN
nFAaD3TcTIQtcsLTjO0Ny9Je86H2e2HD+ji9eX81MWXZRuC5CoviApmkaJcwl/ar
6vRFM/l6psaw1XNxrDL6wfXp6p2AIneSKB53aYOF/C5FzoRaJC2fp56mbS6bT0Cx
iFcnYQugAALVlfsW+JZqh2JzOgow6jpN/BVQ0FmNL9g4tdlaGJezvvKQ7rN54eM7
VGUUwQu6EULh1fJd6BEU8aMHgVQK/jjw2Cj36mNaMuKfNsMLrI6rjbO0F4G8YwUX
oBCyI+eyq5rj4qLRqedLHI0ekG/JdGncKEGCt/CIHN/b0Wzd/FKmqlIMz7zKGTyO
7Pu89/cu15gaaWZWPk4VYxUnCd75heocoMkNPrirj15+ruQgkvc8tdzrNAaBIFgO
/qfppZQHlMxK4LY3zKSEjy6delIcYIfQr2Ub/7Ehr1J5CURKWtUDsBltzEktd5yo
HpQ98oPbVDVr70sCuiwu8fOR5k/53zQgGhK9i7mHTbr4JOO/RxdmJFT61djpcG/w
4AVlhZsyQ5BMBHyu1AtvWzcjrNH1m1aeIQi89OB28XdmIh0DIpryWZt+KwnnXg/0
eMGwrTdamuERzEQFWzX7F8zemJp9hCsGh6DJvG/wbdl1ldMB9q0lAhf7LIBeE6LB
fDuZnYMbBZvAri1HVD6o9P4E6ZymLtyNmY9BNaaon00FC4EVRhoRrTorYbUr8tCz
w1t+F0KmH/ENER+DiFQ0/HBicpmwxesbhHbZmdaaQf5lSsOZrfIEC/XZuM9Wiym2
/hx3KHVAk909EzMcTNcLQmChPYUdMZG+hhjFPdqmgohM6B9F07gGwrAycIp7iHfj
/N2cqPVjaM0zRK2m3HeCr1rZI9alPbQZBimwHT97xuTtqoPSPZbxKCHPSC6ptX0U
U1+/ig3qbN9byjlp3egluEfgrSwV8ay1zJGsMSdt+gptGKpm6kDK2WC0bQkPssqK
JuwPpMv5xNmzr5t4hxnFJdh14rjpFM9m+pE3CaRKWcQhKs54XjQyuiV+51571ZRh
ITZSTSMXP/t/xHEOPRrY4fGHW4krUHSpZPd9r2H/CWGjUsInsM+3xpEoqLfRZZiC
+1i30IIjXnot5L8RwZ6LLlWyKrag9T2pktrk4xsRQIkamWFrercLG4TCCfLRc1ek
dlTvy0vsI49C5eDxT4iw6uVecKvSCeRT5LnJvHlOLLH2NWLLOVqCOMNqLQ7Pt9Pk
UzT8wq2qMjuh3z2e7KDzlCG+tZmxzO2pny8nX9V669yg/LnThtgvPruIVK1liYQu
l9jFPzTS+QkfloT9ATP0GpCmPtEKiDKxss/R8EgEXi2fGEm7kohYBhIVY6CpaBV9
a7JdgSUnFW4FVh3uWuGuqEb3JJkYbxnFgw3sMU0Rk9EMdjzVl/Cd6oMztOHOCdEm
7VptXTuRE+6oogMSIFA7mEB6QZEKJYSepbwSVD/oPDVEEmz702BUOFVI8Y+dA4vU
2II=
-----END ENCRYPTED PRIVATE KEY-----
Bag Attributes
friendlyName: 127.0.0.1
localKeyID: 54 69 6D 65 20 31 36 38 39 30 32 30 34 39 31 31 37 35
subject=/C=US/ST=Wisconsin/L=Madison/O=aws/OU=kinesis/CN=Eric Meisel
issuer=/C=US/ST=Wisconsin/L=Madison/O=aws/OU=kinesis/CN=Eric Meisel
-----BEGIN CERTIFICATE-----
MIIDcTCCAlmgAwIBAgIEQaUARzANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQGEwJV
UzESMBAGA1UECBMJV2lzY29uc2luMRAwDgYDVQQHEwdNYWRpc29uMQwwCgYDVQQK
EwNhd3MxEDAOBgNVBAsTB2tpbmVzaXMxFDASBgNVBAMTC0VyaWMgTWVpc2VsMB4X
DTIxMDQwMTAzNTUxN1oXDTIxMDYzMDAzNTUxN1owaTELMAkGA1UEBhMCVVMxEjAQ
BgNVBAgTCVdpc2NvbnNpbjEQMA4GA1UEBxMHTWFkaXNvbjEMMAoGA1UEChMDYXdz
MRAwDgYDVQQLEwdraW5lc2lzMRQwEgYDVQQDEwtFcmljIE1laXNlbDCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAILeRivZEG6mZmv8DZznMJOzzWy/96pt
HYNWAtwhWTh7mA/N/rQG91HDEltbTn8U0p6VwagkFHJcFXV+qEI6x1ZoJdvYkbyr
114MgyKUsdAXdwRj+cpxeh5t0zqHjpJje750rKVLl7Ok+jLH1nB1sMq0kOht3kJ7
nV8yYUc1SE8dvZB9Ee8XqlLPTDOBw9R51vzrXS3Seb4gJltgZk0UWQ7/UWCb/TL4
4CtPHCjXMjqgh4Ifn+0eMJUe8oG8RkMBUYOJFP13bhAJOovo/l1aIuexbPalp7Ih
zkOadWQCCcSN0rhD1iqRBin1mJX8Np6kWlnHRJhr55SgYhz+c85jxMECAwEAAaMh
MB8wHQYDVR0OBBYEFDQeXMGdatkPatRl7Sd+WvlkxHUpMA0GCSqGSIb3DQEBCwUA
A4IBAQAvDwYSyEMTzmonGHDBdzz2FNY6XS1poKFN5/mRGs/Y+pCEEtML6zFcltyp
AhxreEEtISN50daG8OElObelZjrKn3IG1R9IrsY1Ji7pf+JfvAHuOnxFAYwnqOlM
Qul5WHKF8Ick9LB+yoaEgBv4OogmviYFxGjiQiFOR+veQpNiEmdUckD1DpUryBwt
0BRLWqkBXAVo3vQHmtjqaoWZZSlw8cUjAurPYiba5OBOA+gjOGLY6fj10o+/d7qR
kcBMvyi2Qdh4KfCR7YoYslkQuIMN+OWQXHT66GnZisO8LqIA1xx6X9XEY8FpAqGv
IZA3e5CThulFSWPARpOKXcGCkQB0
-----END CERTIFICATE-----
6 changes: 6 additions & 0 deletions kinesis-mock/src/main/resources/server.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"server": {
"key": "-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI+3ytr9teonACAggA\nMBQGCCqGSIb3DQMHBAjD8M6SQghjBwSCBMgH3/xoxG3gdQKMG9OJjttCQzWcaWIo\nep8ZBZwb1nBvsZiX3DPidDpl5TSAfYJ5Ipbq6jy7nv7NXs48ZCmM2qqyg7T9FMJO\nqMKcOKn+jQSC5jzceCwokeEhYldrPgRM0aOJsB/aKsXRpyjtjGb7LmjCmM3+9DFN\nnFAaD3TcTIQtcsLTjO0Ny9Je86H2e2HD+ji9eX81MWXZRuC5CoviApmkaJcwl/ar\n6vRFM/l6psaw1XNxrDL6wfXp6p2AIneSKB53aYOF/C5FzoRaJC2fp56mbS6bT0Cx\niFcnYQugAALVlfsW+JZqh2JzOgow6jpN/BVQ0FmNL9g4tdlaGJezvvKQ7rN54eM7\nVGUUwQu6EULh1fJd6BEU8aMHgVQK/jjw2Cj36mNaMuKfNsMLrI6rjbO0F4G8YwUX\noBCyI+eyq5rj4qLRqedLHI0ekG/JdGncKEGCt/CIHN/b0Wzd/FKmqlIMz7zKGTyO\n7Pu89/cu15gaaWZWPk4VYxUnCd75heocoMkNPrirj15+ruQgkvc8tdzrNAaBIFgO\n/qfppZQHlMxK4LY3zKSEjy6delIcYIfQr2Ub/7Ehr1J5CURKWtUDsBltzEktd5yo\nHpQ98oPbVDVr70sCuiwu8fOR5k/53zQgGhK9i7mHTbr4JOO/RxdmJFT61djpcG/w\n4AVlhZsyQ5BMBHyu1AtvWzcjrNH1m1aeIQi89OB28XdmIh0DIpryWZt+KwnnXg/0\neMGwrTdamuERzEQFWzX7F8zemJp9hCsGh6DJvG/wbdl1ldMB9q0lAhf7LIBeE6LB\nfDuZnYMbBZvAri1HVD6o9P4E6ZymLtyNmY9BNaaon00FC4EVRhoRrTorYbUr8tCz\nw1t+F0KmH/ENER+DiFQ0/HBicpmwxesbhHbZmdaaQf5lSsOZrfIEC/XZuM9Wiym2\n/hx3KHVAk909EzMcTNcLQmChPYUdMZG+hhjFPdqmgohM6B9F07gGwrAycIp7iHfj\n/N2cqPVjaM0zRK2m3HeCr1rZI9alPbQZBimwHT97xuTtqoPSPZbxKCHPSC6ptX0U\nU1+/ig3qbN9byjlp3egluEfgrSwV8ay1zJGsMSdt+gptGKpm6kDK2WC0bQkPssqK\nJuwPpMv5xNmzr5t4hxnFJdh14rjpFM9m+pE3CaRKWcQhKs54XjQyuiV+51571ZRh\nITZSTSMXP/t/xHEOPRrY4fGHW4krUHSpZPd9r2H/CWGjUsInsM+3xpEoqLfRZZiC\n+1i30IIjXnot5L8RwZ6LLlWyKrag9T2pktrk4xsRQIkamWFrercLG4TCCfLRc1ek\ndlTvy0vsI49C5eDxT4iw6uVecKvSCeRT5LnJvHlOLLH2NWLLOVqCOMNqLQ7Pt9Pk\nUzT8wq2qMjuh3z2e7KDzlCG+tZmxzO2pny8nX9V669yg/LnThtgvPruIVK1liYQu\nl9jFPzTS+QkfloT9ATP0GpCmPtEKiDKxss/R8EgEXi2fGEm7kohYBhIVY6CpaBV9\na7JdgSUnFW4FVh3uWuGuqEb3JJkYbxnFgw3sMU0Rk9EMdjzVl/Cd6oMztOHOCdEm\n7VptXTuRE+6oogMSIFA7mEB6QZEKJYSepbwSVD/oPDVEEmz702BUOFVI8Y+dA4vU\n2II=\n-----END ENCRYPTED PRIVATE KEY-----\n",
"cert": "-----BEGIN CERTIFICATE-----\nMIIDcTCCAlmgAwIBAgIEQaUARzANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQGEwJV\nUzESMBAGA1UECBMJV2lzY29uc2luMRAwDgYDVQQHEwdNYWRpc29uMQwwCgYDVQQK\nEwNhd3MxEDAOBgNVBAsTB2tpbmVzaXMxFDASBgNVBAMTC0VyaWMgTWVpc2VsMB4X\nDTIxMDQwMTAzNTUxN1oXDTIxMDYzMDAzNTUxN1owaTELMAkGA1UEBhMCVVMxEjAQ\nBgNVBAgTCVdpc2NvbnNpbjEQMA4GA1UEBxMHTWFkaXNvbjEMMAoGA1UEChMDYXdz\nMRAwDgYDVQQLEwdraW5lc2lzMRQwEgYDVQQDEwtFcmljIE1laXNlbDCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBAILeRivZEG6mZmv8DZznMJOzzWy/96pt\nHYNWAtwhWTh7mA/N/rQG91HDEltbTn8U0p6VwagkFHJcFXV+qEI6x1ZoJdvYkbyr\n114MgyKUsdAXdwRj+cpxeh5t0zqHjpJje750rKVLl7Ok+jLH1nB1sMq0kOht3kJ7\nnV8yYUc1SE8dvZB9Ee8XqlLPTDOBw9R51vzrXS3Seb4gJltgZk0UWQ7/UWCb/TL4\n4CtPHCjXMjqgh4Ifn+0eMJUe8oG8RkMBUYOJFP13bhAJOovo/l1aIuexbPalp7Ih\nzkOadWQCCcSN0rhD1iqRBin1mJX8Np6kWlnHRJhr55SgYhz+c85jxMECAwEAAaMh\nMB8wHQYDVR0OBBYEFDQeXMGdatkPatRl7Sd+WvlkxHUpMA0GCSqGSIb3DQEBCwUA\nA4IBAQAvDwYSyEMTzmonGHDBdzz2FNY6XS1poKFN5/mRGs/Y+pCEEtML6zFcltyp\nAhxreEEtISN50daG8OElObelZjrKn3IG1R9IrsY1Ji7pf+JfvAHuOnxFAYwnqOlM\nQul5WHKF8Ick9LB+yoaEgBv4OogmviYFxGjiQiFOR+veQpNiEmdUckD1DpUryBwt\n0BRLWqkBXAVo3vQHmtjqaoWZZSlw8cUjAurPYiba5OBOA+gjOGLY6fj10o+/d7qR\nkcBMvyi2Qdh4KfCR7YoYslkQuIMN+OWQXHT66GnZisO8LqIA1xx6X9XEY8FpAqGv\nIZA3e5CThulFSWPARpOKXcGCkQB0\n-----END CERTIFICATE-----\n"
}
}
Binary file added kinesis-mock/src/main/resources/server.p12
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import cats.effect.std.Semaphore
import cats.effect.{ExitCode, IO, IOApp}
import cats.implicits._
import com.comcast.ip4s.Host
import fs2.io.net.Network
import io.circe.syntax._
import org.http4s.ember.server.EmberServerBuilder
import org.http4s.server.middleware.Logger
Expand All @@ -35,9 +34,7 @@ import kinesis.mock.cache.{Cache, CacheConfig}
import kinesis.mock.models.{AwsRegion, StreamName, StreamStatus}

object KinesisMockService extends IOApp {
override def run(args: List[String]): IO[ExitCode] = Network[
IO
].tlsContext.insecureResource.use(tlsContext =>
override def run(args: List[String]): IO[ExitCode] =
for {
logLevel <- ConsoleLogger.LogLevel.read.load[IO]
logger = new ConsoleLogger[IO](logLevel, this.getClass().getName())
Expand All @@ -62,6 +59,7 @@ object KinesisMockService extends IOApp {
cacheConfig.initializeStreams.getOrElse(Map.empty)
)
serviceConfig <- KinesisMockServiceConfig.read.load[IO]
tlsContext <- TLS.context(serviceConfig)
app = Logger.httpApp(true, true, _ => false)(
new KinesisMockRoutes(cache, logLevel).routes.orNotFound
)
Expand Down Expand Up @@ -104,7 +102,6 @@ object KinesisMockService extends IOApp {
.use(_ => IO.never)
.as(ExitCode.Success)
} yield res
)

def initializeStreams(
cache: Cache,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ final case class KinesisMockServiceConfig(
tlsPort: Port,
plainPort: Port,
keyStorePassword: String,
keyManagerPassword: String
keyManagerPassword: String,
certPassword: String,
certPath: String
)

object KinesisMockServiceConfig {
Expand All @@ -38,10 +40,18 @@ object KinesisMockServiceConfig {
keyManagerPassword <- env("KINESIS_MOCK_KEYMANAGER_PASSWORD").default(
"kinesisMock"
)
certPassword <- env("KINESIS_MOCK_PEM_PASSWORD").default(
"kinesisMock"
)
certPath <- env("KINESIS_MOCK_CERT_PATH").default(
"kinesis-mock/src/main/resources/server.json"
)
} yield KinesisMockServiceConfig(
tlsPort,
plainPort,
keyStorePassword,
keyManagerPassword
keyManagerPassword,
certPassword,
certPath
)
}
41 changes: 41 additions & 0 deletions kinesis-mock/src/main/scalajs/kinesis/mock/TLS.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package kinesis.mock

import scala.scalajs.js

import cats.effect.IO
import cats.syntax.all._
import fs2.io.file._
import fs2.io.net.Network
import fs2.io.net.tls.SecureContext
import fs2.io.net.tls.TLSContext
import fs2.text

object TLS {
def context(serviceConfig: KinesisMockServiceConfig): IO[TLSContext[IO]] =
Files[IO]
.readAll(Path(serviceConfig.certPath))
.through(text.utf8.decode)
.compile
.string
.flatMap(s =>
IO(js.JSON.parse(s).asInstanceOf[js.Dictionary[CertKey]]("server"))
)
.map { certKey =>
Network[IO].tlsContext.fromSecureContext(
SecureContext(
ca = List(certKey.cert.asRight).some,
cert = List(certKey.cert.asRight).some,
key = List(
SecureContext
.Key(certKey.key.asRight, serviceConfig.certPassword.some)
).some
)
)
}
}

@js.native
trait CertKey extends js.Object {
def cert: String = js.native
def key: String = js.native
}
14 changes: 14 additions & 0 deletions kinesis-mock/src/main/scalajvm/kinesis/mock/TLS.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package kinesis.mock

import cats.effect.IO
import fs2.io.net.tls.TLSContext
import fs2.io.net.Network

object TLS {
def context(serviceConfig: KinesisMockServiceConfig): IO[TLSContext[IO]] =
Network[IO].tlsContext.fromKeyStoreResource(
"server.jks",
serviceConfig.keyStorePassword.toCharArray(),
serviceConfig.keyManagerPassword.toCharArray()
)
}

0 comments on commit b1b020c

Please sign in to comment.