Skip to content

Commit 5242463

Browse files
committed
feat(Gitea): add support for actions [WIP]
1 parent 0a977ae commit 5242463

17 files changed

Lines changed: 429 additions & 3 deletions
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Generated by Fabric8 CRDGenerator, manual edits might get overwritten!
2+
apiVersion: apiextensions.k8s.io/v1
3+
kind: CustomResourceDefinition
4+
metadata:
5+
name: giteaactionrunners.glasskube.eu
6+
spec:
7+
group: glasskube.eu
8+
names:
9+
kind: GiteaActionRunner
10+
plural: giteaactionrunners
11+
singular: giteaactionrunner
12+
scope: Namespaced
13+
versions:
14+
- name: v1alpha1
15+
schema:
16+
openAPIV3Schema:
17+
properties:
18+
spec:
19+
properties:
20+
token:
21+
type: string
22+
gitea:
23+
properties:
24+
name:
25+
type: string
26+
type: object
27+
required:
28+
- token
29+
- gitea
30+
type: object
31+
status:
32+
properties:
33+
ready:
34+
type: boolean
35+
type: object
36+
type: object
37+
served: true
38+
storage: true
39+
subresources:
40+
status: {}

deploy/crd/giteas.glasskube.eu-v1.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,20 @@ spec:
144144
type: string
145145
type: object
146146
type: object
147+
actions:
148+
properties:
149+
enabled:
150+
type: boolean
151+
runners:
152+
items:
153+
properties:
154+
token:
155+
type: string
156+
required:
157+
- token
158+
type: object
159+
type: array
160+
type: object
147161
required:
148162
- host
149163
type: object

operator/src/main/kotlin/eu/glasskube/kubernetes/api/model/apps/RollingUpdateStatefulSetStrategyDsl.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package eu.glasskube.kubernetes.api.model.apps
22

3+
import eu.glasskube.kubernetes.api.annotation.KubernetesDslMarker
34
import eu.glasskube.kubernetes.api.model.intOrString
45
import io.fabric8.kubernetes.api.model.apps.RollingUpdateStatefulSetStrategy
56
import io.fabric8.kubernetes.api.model.apps.RollingUpdateStatefulSetStrategyBuilder
67

8+
@KubernetesDslMarker
79
class RollingUpdateStatefulSetStrategyDsl private constructor() {
810
private val builder = RollingUpdateStatefulSetStrategyBuilder(true)
911

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package eu.glasskube.operator.apps.gitea
2+
3+
import io.fabric8.generator.annotation.Required
4+
5+
data class GiteaActionRunnerSpecTemplate(
6+
@field:Required
7+
val token: String
8+
)
9+
10+
val GiteaActionRunnerSpecTemplate.tokenHash: String
11+
get() = (token.hashCode().toLong() + Int.MAX_VALUE).toString(16)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package eu.glasskube.operator.apps.gitea
2+
3+
data class GiteaActionsSpec(
4+
val enabled: Boolean = false,
5+
val runners: List<GiteaActionRunnerSpecTemplate> = emptyList()
6+
)

operator/src/main/kotlin/eu/glasskube/operator/apps/gitea/GiteaReconciler.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import eu.glasskube.kubernetes.client.patchOrUpdateStatus
44
import eu.glasskube.operator.Labels
55
import eu.glasskube.operator.api.reconciler.informerEventSource
66
import eu.glasskube.operator.api.reconciler.secondaryResource
7+
import eu.glasskube.operator.apps.gitea.dependent.GiteaActionRunners
78
import eu.glasskube.operator.apps.gitea.dependent.GiteaConfigMap
89
import eu.glasskube.operator.apps.gitea.dependent.GiteaDeployment
910
import eu.glasskube.operator.apps.gitea.dependent.GiteaHttpService
@@ -75,7 +76,8 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent
7576
type = GiteaDeployment::class,
7677
name = "GiteaDeployment",
7778
dependsOn = ["GiteaPostgresCluster", "GiteaVolume", "GiteaSecret", "GiteaConfigMap", "GiteaIniConfigMap", "GiteaRedisService"],
78-
useEventSourceWithName = GiteaReconciler.DEPLOYMENT_EVENT_SOURCE
79+
useEventSourceWithName = GiteaReconciler.DEPLOYMENT_EVENT_SOURCE,
80+
readyPostcondition = GiteaDeployment.ReadyCondition::class
7981
),
8082
Dependent(
8183
type = GiteaHttpService::class,
@@ -96,6 +98,11 @@ import io.javaoperatorsdk.operator.api.reconciler.dependent.Dependent
9698
type = GiteaServiceMonitor::class,
9799
name = "GiteaServiceMonitor",
98100
dependsOn = ["GiteaHttpService"]
101+
),
102+
Dependent(
103+
type = GiteaActionRunners::class,
104+
name = "GiteaActionRunners",
105+
dependsOn = ["GiteaDeployment"]
99106
)
100107
]
101108
)

operator/src/main/kotlin/eu/glasskube/operator/apps/gitea/GiteaSpec.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,6 @@ data class GiteaSpec(
3030
@field:Pattern(SEMVER)
3131
val version: String = "1.20.4",
3232
@field:Nullable
33-
override val database: PostgresDatabaseSpec = PostgresDatabaseSpec()
33+
override val database: PostgresDatabaseSpec = PostgresDatabaseSpec(),
34+
val actions: GiteaActionsSpec = GiteaActionsSpec()
3435
) : HasDatabaseSpec<PostgresDatabaseSpec>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package eu.glasskube.operator.apps.gitea.dependent
2+
3+
import eu.glasskube.kubernetes.api.model.metadata
4+
import eu.glasskube.kubernetes.api.model.namespace
5+
import eu.glasskube.operator.apps.gitea.Gitea
6+
import eu.glasskube.operator.apps.gitea.GiteaActionRunnerSpecTemplate
7+
import eu.glasskube.operator.apps.gitea.GiteaReconciler
8+
import eu.glasskube.operator.apps.gitea.resourceLabels
9+
import eu.glasskube.operator.apps.gitea.runner.GiteaActionRunner
10+
import eu.glasskube.operator.apps.gitea.runner.GiteaActionRunnerSpec
11+
import eu.glasskube.operator.apps.gitea.runner.giteaActionRunner
12+
import eu.glasskube.operator.apps.gitea.tokenHash
13+
import io.fabric8.kubernetes.api.model.LocalObjectReference
14+
import io.javaoperatorsdk.operator.api.reconciler.Context
15+
import io.javaoperatorsdk.operator.processing.dependent.BulkDependentResource
16+
import io.javaoperatorsdk.operator.processing.dependent.Matcher
17+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.CRUDKubernetesDependentResource
18+
import io.javaoperatorsdk.operator.processing.dependent.kubernetes.KubernetesDependent
19+
20+
@KubernetesDependent(labelSelector = GiteaReconciler.SELECTOR)
21+
class GiteaActionRunners :
22+
CRUDKubernetesDependentResource<GiteaActionRunner, Gitea>(GiteaActionRunner::class.java),
23+
BulkDependentResource<GiteaActionRunner, Gitea> {
24+
25+
fun desired(primary: Gitea, template: GiteaActionRunnerSpecTemplate) = giteaActionRunner {
26+
metadata {
27+
name = "${primary.metadata.name}-${template.tokenHash}"
28+
namespace = primary.namespace
29+
labels = primary.resourceLabels
30+
}
31+
spec = GiteaActionRunnerSpec(
32+
template.token,
33+
LocalObjectReference(primary.metadata.name)
34+
)
35+
}
36+
37+
override fun desiredResources(primary: Gitea, context: Context<Gitea>) = primary.spec.actions.run {
38+
if (enabled) {
39+
runners.map { desired(primary, it) }.associateBy { it.metadata.name }
40+
} else {
41+
emptyMap()
42+
}
43+
}
44+
45+
override fun getSecondaryResources(primary: Gitea, context: Context<Gitea>) =
46+
context.getSecondaryResources(GiteaActionRunner::class.java)
47+
.filter { it.spec.gitea.name == primary.metadata.name }
48+
.associateBy { it.metadata.name }
49+
50+
override fun match(
51+
actualResource: GiteaActionRunner,
52+
desired: GiteaActionRunner,
53+
primary: Gitea,
54+
context: Context<Gitea>
55+
): Matcher.Result<GiteaActionRunner> =
56+
super<CRUDKubernetesDependentResource>.match(actualResource, desired, primary, context)
57+
}

operator/src/main/kotlin/eu/glasskube/operator/apps/gitea/dependent/GiteaDeployment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import eu.glasskube.operator.apps.gitea.resourceLabelSelector
3232
import eu.glasskube.operator.apps.gitea.resourceLabels
3333
import eu.glasskube.operator.apps.gitea.secretName
3434
import eu.glasskube.operator.config.ConfigService
35+
import eu.glasskube.operator.generic.condition.DeploymentReadyCondition
3536
import eu.glasskube.utils.addTo
3637
import io.fabric8.kubernetes.api.model.HTTPGetAction
3738
import io.fabric8.kubernetes.api.model.Probe
@@ -50,6 +51,7 @@ import io.javaoperatorsdk.operator.processing.event.ResourceID
5051
class GiteaDeployment(private val configService: ConfigService) :
5152
CRUDKubernetesDependentResource<Deployment, Gitea>(Deployment::class.java) {
5253
internal class Discriminator : ResourceIDMatcherDiscriminator<Deployment, Gitea>({ ResourceID(it.deploymentName) })
54+
internal class ReadyCondition : DeploymentReadyCondition<Gitea>()
5355

5456
override fun desired(primary: Gitea, context: Context<Gitea>) = deployment {
5557
metadata {

operator/src/main/kotlin/eu/glasskube/operator/apps/gitea/dependent/GiteaIniConfigMap.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class GiteaIniConfigMap : CRUDKubernetesDependentResource<ConfigMap, Gitea>(Conf
3131
namespace = primary.metadata.namespace
3232
labels = primary.resourceLabels
3333
}
34-
data = primary.baseConfig + primary.smtpConfig
34+
data = primary.baseConfig + primary.smtpConfig + primary.actionsConfig
3535
}
3636

3737
private val Gitea.baseConfig: Map<String, String>
@@ -78,6 +78,11 @@ class GiteaIniConfigMap : CRUDKubernetesDependentResource<ConfigMap, Gitea>(Conf
7878
}
7979
}
8080

81+
private val Gitea.actionsConfig: Map<String, String>
82+
get() = mapOf(
83+
"GITEA__actions__ENABLED" to spec.actions.enabled.toString()
84+
)
85+
8186
override fun onUpdated(primary: Gitea, updated: ConfigMap, actual: ConfigMap, context: Context<Gitea>) {
8287
super.onUpdated(primary, updated, actual, context)
8388
context.getSecondaryResource(GiteaDeployment.Discriminator()).ifPresent {

0 commit comments

Comments
 (0)