Skip to content

Commit 7598ff4

Browse files
committed
Add AuditClientListener
1 parent b794d84 commit 7598ff4

File tree

13 files changed

+293
-51
lines changed

13 files changed

+293
-51
lines changed

service-self-backfill/src/test/kotlin/app/cash/backfila/service/selfbackfill/SelfBackfillTestingModule.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import app.cash.backfila.client.misk.MiskBackfillModule
1010
import app.cash.backfila.client.misk.hibernate.HibernateBackfillModule
1111
import app.cash.backfila.embedded.EmbeddedBackfilaModule
1212
import app.cash.backfila.service.BackfilaConfig
13-
import app.cash.backfila.service.BackfillRunListener
14-
import app.cash.backfila.service.SlackHelper
13+
import app.cash.backfila.service.listener.BackfilaListenerModule
1514
import app.cash.backfila.service.persistence.BackfilaDb
1615
import app.cash.backfila.service.persistence.BackfilaPersistenceModule
1716
import app.cash.backfila.service.runner.BackfillRunnerLoggingSetupProvider
@@ -49,8 +48,8 @@ class SelfBackfillTestingModule : KAbstractModule() {
4948
web_url_root = "",
5049
slack = null,
5150
)
52-
newMultibinder<BackfillRunListener>()
53-
multibind<BackfillRunListener>().to<SlackHelper>()
51+
52+
install(BackfilaListenerModule())
5453

5554
bind<BackfilaConfig>().toInstance(config)
5655
install(DeploymentModule(TESTING))

service/src/main/kotlin/app/cash/backfila/dashboard/BackfillStateToggler.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package app.cash.backfila.dashboard
22

3-
import app.cash.backfila.service.BackfillRunListener
3+
import app.cash.backfila.service.listener.BackfillRunListener
44
import app.cash.backfila.service.persistence.BackfilaDb
55
import app.cash.backfila.service.persistence.BackfillState
66
import app.cash.backfila.service.persistence.BackfillState.PAUSED

service/src/main/kotlin/app/cash/backfila/dashboard/CreateBackfillAction.kt

-10
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ package app.cash.backfila.dashboard
33
import app.cash.backfila.BackfillCreator
44
import app.cash.backfila.protos.service.CreateBackfillRequest
55
import app.cash.backfila.protos.service.CreateBackfillResponse
6-
import app.cash.backfila.ui.pages.BackfillShowAction
76
import javax.inject.Inject
87
import misk.MiskCaller
9-
import misk.audit.AuditClient
108
import misk.scope.ActionScoped
119
import misk.security.authz.Authenticated
1210
import misk.web.PathParam
@@ -20,7 +18,6 @@ import misk.web.mediatype.MediaTypes
2018
class CreateBackfillAction @Inject constructor(
2119
private val callerProvider: @JvmSuppressWildcards ActionScoped<MiskCaller?>,
2220
private val backfillCreator: BackfillCreator,
23-
private val auditClient: AuditClient,
2421
) : WebAction {
2522
@Post("/services/{service}/variants/{variant}/create")
2623
@RequestContentType(MediaTypes.APPLICATION_JSON)
@@ -42,13 +39,6 @@ class CreateBackfillAction @Inject constructor(
4239
// TODO check user has permissions for this service with access api
4340
val id = backfillCreator.create(callerProvider.get()!!.user!!, service, variant, request)
4441

45-
auditClient.logEvent(
46-
target = request.backfill_name,
47-
description = "Backfill Created",
48-
applicationName = if (variant != "default") "$service/$variant" else service,
49-
detailURL = BackfillShowAction.path(id.id),
50-
)
51-
5242
return CreateBackfillResponse(id.id)
5343
}
5444
}

service/src/main/kotlin/app/cash/backfila/service/BackfilaServiceModule.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import app.cash.backfila.client.GrpcCallbackConnectorProvider
99
import app.cash.backfila.client.HttpCallbackConnectorProvider
1010
import app.cash.backfila.dashboard.BackfilaDashboardModule
1111
import app.cash.backfila.dashboard.BackfilaWebActionsModule
12+
import app.cash.backfila.service.listener.BackfilaListenerModule
1213
import app.cash.backfila.service.persistence.BackfilaPersistenceModule
1314
import app.cash.backfila.service.runner.BackfillRunnerLoggingSetupProvider
1415
import app.cash.backfila.service.runner.BackfillRunnerNoLoggingSetupProvider
@@ -43,8 +44,7 @@ class BackfilaServiceModule(
4344
AccessAnnotationEntry<AdminDashboardAccess>(capabilities = listOf("backfila--owners")),
4445
)
4546

46-
newMultibinder<BackfillRunListener>()
47-
multibind<BackfillRunListener>().to<SlackHelper>()
47+
install(BackfilaListenerModule())
4848

4949
install(ConfigModule.create("backfila", config))
5050
install(BackfilaPersistenceModule(config))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package app.cash.backfila.service.listener
2+
3+
import app.cash.backfila.service.BackfilaConfig
4+
import app.cash.backfila.service.persistence.BackfilaDb
5+
import app.cash.backfila.service.persistence.DbBackfillRun
6+
import app.cash.backfila.ui.pages.BackfillShowAction
7+
import javax.inject.Inject
8+
import misk.audit.AuditClient
9+
import misk.hibernate.Id
10+
import misk.hibernate.Transacter
11+
import misk.hibernate.load
12+
13+
class AuditClientListener @Inject constructor(
14+
@BackfilaDb private val transacter: Transacter,
15+
private val auditClient: AuditClient,
16+
private val backfilaConfig: BackfilaConfig,
17+
) : BackfillRunListener {
18+
override fun runStarted(id: Id<DbBackfillRun>, user: String) {
19+
val (backfillName, run, description) = transacter.transaction { session ->
20+
val run = session.load<DbBackfillRun>(id)
21+
Triple(run.registered_backfill.name, run, "Backfill started by $user ${dryRunPrefix(run)}${nameAndId(run)}")
22+
}
23+
auditClient.logEvent(
24+
target = backfillName,
25+
description = description,
26+
requestorLDAP = user,
27+
applicationName = serviceName(run),
28+
detailURL = idUrl(id),
29+
)
30+
}
31+
32+
override fun runPaused(id: Id<DbBackfillRun>, user: String) {
33+
val (backfillName, run, description) = transacter.transaction { session ->
34+
val run = session.load<DbBackfillRun>(id)
35+
Triple(run.registered_backfill.name, run, "Backfill paused by $user ${dryRunPrefix(run)}${nameAndId(run)}")
36+
}
37+
auditClient.logEvent(
38+
target = backfillName,
39+
description = description,
40+
requestorLDAP = user,
41+
applicationName = serviceName(run),
42+
detailURL = idUrl(id),
43+
)
44+
}
45+
46+
override fun runErrored(id: Id<DbBackfillRun>) {
47+
val (backfillName, run, description) = transacter.transaction { session ->
48+
val run = session.load<DbBackfillRun>(id)
49+
Triple(run.registered_backfill.name, run, "Backfill paused due to error ${dryRunPrefix(run)}${nameAndId(run)}")
50+
}
51+
auditClient.logEvent(
52+
target = backfillName,
53+
description = description,
54+
automatedChange = true,
55+
applicationName = serviceName(run),
56+
detailURL = idUrl(id),
57+
)
58+
}
59+
60+
override fun runCompleted(id: Id<DbBackfillRun>) {
61+
val (backfillName, run, description) = transacter.transaction { session ->
62+
val run = session.load<DbBackfillRun>(id)
63+
Triple(run.registered_backfill.name, run, "Backfill completed ${dryRunPrefix(run)}${nameAndId(run)}")
64+
}
65+
auditClient.logEvent(
66+
target = backfillName,
67+
description = description,
68+
automatedChange = true,
69+
applicationName = serviceName(run),
70+
detailURL = idUrl(id),
71+
)
72+
}
73+
74+
private fun serviceName(run: DbBackfillRun) = if (run.service.variant == "default") {
75+
run.service.registry_name
76+
} else {
77+
"${run.service.registry_name}/${run.service.variant}"
78+
}
79+
80+
private fun nameAndId(run: DbBackfillRun) =
81+
"[service=${serviceName(run)}][backfill=${run.registered_backfill.name}]" +
82+
"[id=${run.id}]" + if (run.service.slack_channel != null) {
83+
"[slackChannel=${run.service.slack_channel}]"
84+
} else {
85+
""
86+
}
87+
88+
private fun dryRunPrefix(run: DbBackfillRun) =
89+
if (run.dry_run) {
90+
"[dryRun=true]"
91+
} else {
92+
""
93+
}
94+
95+
private fun idUrl(id: Id<DbBackfillRun>): String = backfilaConfig.web_url_root + BackfillShowAction.path(id.id)
96+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package app.cash.backfila.service.listener
2+
3+
import misk.inject.KAbstractModule
4+
5+
class BackfilaListenerModule : KAbstractModule() {
6+
override fun configure() {
7+
newMultibinder<BackfillRunListener>()
8+
multibind<BackfillRunListener>().to<AuditClientListener>()
9+
multibind<BackfillRunListener>().to<SlackHelper>()
10+
}
11+
}

service/src/main/kotlin/app/cash/backfila/service/BackfillRunListener.kt renamed to service/src/main/kotlin/app/cash/backfila/service/listener/BackfillRunListener.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.cash.backfila.service
1+
package app.cash.backfila.service.listener
22

33
import app.cash.backfila.service.persistence.DbBackfillRun
44
import misk.hibernate.Id

service/src/main/kotlin/app/cash/backfila/service/SlackHelper.kt renamed to service/src/main/kotlin/app/cash/backfila/service/listener/SlackHelper.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
package app.cash.backfila.service
1+
package app.cash.backfila.service.listener
22

3+
import app.cash.backfila.service.BackfilaConfig
34
import app.cash.backfila.service.persistence.BackfilaDb
45
import app.cash.backfila.service.persistence.DbBackfillRun
56
import javax.inject.Inject

service/src/main/kotlin/app/cash/backfila/service/runner/BackfillRunner.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import app.cash.backfila.protos.clientservice.RunBatchRequest
88
import app.cash.backfila.protos.clientservice.RunBatchResponse
99
import app.cash.backfila.service.BackfilaConfig
1010
import app.cash.backfila.service.BackfilaMetrics
11-
import app.cash.backfila.service.BackfillRunListener
11+
import app.cash.backfila.service.listener.BackfillRunListener
1212
import app.cash.backfila.service.persistence.BackfilaDb
1313
import app.cash.backfila.service.persistence.BackfillState
1414
import app.cash.backfila.service.persistence.DbBackfillRun

service/src/test/kotlin/app/cash/backfila/BackfilaTestingModule.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import app.cash.backfila.client.Connectors
66
import app.cash.backfila.client.FakeBackfilaCallbackConnectorProvider
77
import app.cash.backfila.client.ForConnectors
88
import app.cash.backfila.service.BackfilaConfig
9-
import app.cash.backfila.service.BackfillRunListener
10-
import app.cash.backfila.service.SlackHelper
9+
import app.cash.backfila.service.listener.BackfilaListenerModule
1110
import app.cash.backfila.service.persistence.BackfilaDb
1211
import app.cash.backfila.service.persistence.BackfilaPersistenceModule
1312
import app.cash.backfila.service.runner.BackfillRunnerLoggingSetupProvider
@@ -55,8 +54,7 @@ internal class BackfilaTestingModule : KAbstractModule() {
5554
)
5655
bind<BackfilaConfig>().toInstance(config)
5756

58-
newMultibinder<BackfillRunListener>()
59-
multibind<BackfillRunListener>().to<SlackHelper>()
57+
install(BackfilaListenerModule())
6058

6159
install(DeploymentModule(wisp.deployment.TESTING))
6260
install(LogCollectorModule())

service/src/test/kotlin/app/cash/backfila/actions/CreateBackfillActionTest.kt

-26
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ import app.cash.backfila.service.persistence.RunPartitionQuery
2020
import app.cash.backfila.service.persistence.ServiceQuery
2121
import com.google.inject.Module
2222
import javax.inject.Inject
23-
import kotlin.test.assertEquals
2423
import kotlin.test.assertNotNull
25-
import misk.audit.FakeAuditClient
2624
import misk.exceptions.BadRequestException
2725
import misk.hibernate.Query
2826
import misk.hibernate.Transacter
@@ -60,9 +58,6 @@ class CreateBackfillActionTest {
6058
@Inject
6159
lateinit var fakeBackfilaClientServiceClient: FakeBackfilaCallbackConnector
6260

63-
@Inject
64-
lateinit var fakeAuditClient: FakeAuditClient
65-
6661
@Test
6762
fun serviceDoesntExist() {
6863
scope.fakeCaller(user = "molly") {
@@ -103,8 +98,6 @@ class CreateBackfillActionTest {
10398

10499
@Test
105100
fun created() {
106-
assertEquals(0, fakeAuditClient.sentEvents.size)
107-
108101
scope.fakeCaller(service = "deep-fryer") {
109102
configureServiceAction.configureService(
110103
ConfigureServiceRequest.Builder()
@@ -151,25 +144,6 @@ class CreateBackfillActionTest {
151144
assertThat(partitions[1].lease_token).isNull()
152145
assertThat(partitions[1].run_state).isEqualTo(BackfillState.PAUSED)
153146
}
154-
155-
assertEquals(1, fakeAuditClient.sentEvents.size)
156-
assertEquals(
157-
FakeAuditClient.FakeAuditEvent(
158-
eventSource = "backfila",
159-
eventTarget = "ChickenSandwich",
160-
timestampSent = 2147483647,
161-
applicationName = "deep-fryer",
162-
approverLDAP = "molly",
163-
automatedChange = false,
164-
description = "Backfill Created",
165-
richDescription = null,
166-
environment = "testing",
167-
detailURL = "/backfills/${response.backfill_run_id}",
168-
region = "us-west-2",
169-
requestorLDAP = "molly",
170-
),
171-
fakeAuditClient.sentEvents.single(),
172-
)
173147
}
174148
}
175149

service/src/test/kotlin/app/cash/backfila/development/finedining/FineDiningDevelopmentService.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fun main(args: Array<String>) {
5959
DevelopmentAdminDashboardModule(),
6060
MiskRealServiceModule(),
6161
NoOpAuditClientModule(),
62-
).run(args)
62+
).run(args)
6363
}
6464

6565
data class FineDiningConfig(

0 commit comments

Comments
 (0)