Skip to content

Commit 7c440c3

Browse files
authored
feat: Add Flux addons provider (#22)
1 parent 41d9cc8 commit 7c440c3

File tree

24 files changed

+480
-38
lines changed

24 files changed

+480
-38
lines changed

.github/dependabot.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ updates:
1818
update-types: ["version-update:semver-major", "version-update:semver-minor"]
1919
- dependency-name: k8s.io/*
2020
update-types: ["version-update:semver-major", "version-update:semver-minor"]
21+
- dependency-name: github.com/fluxcd/*
22+
update-types: ["version-update:semver-major", "version-update:semver-minor"]
2123

2224
- package-ecosystem: "github-actions"
2325
directory: "/"

.tool-versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
clusterctl 1.3.3
2+
flux2 0.39.0
23
gcloud 416.0.0
34
gcloud 416.0.0
45
ginkgo 2.8.0

README.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ make dev.run-on-kind
1616
eval $(make kind.kubeconfig)
1717
```
1818

19+
By default this will use the `ClusterResourceSet` addons provider. To use the `FluxHelmRelease` addons provider run:
20+
21+
```shell
22+
make ADDONS_PROVIDER=FluxHelmRelease dev.run-on-kind
23+
eval $(make kind.kubeconfig)
24+
```
25+
26+
Pro-tip: to redeploy without rebuilding the binaries, images, etc (useful if you have only changed the Helm chart for
27+
example), run:
28+
29+
```shell
30+
make SKIP_BUILD=true dev.run-on-kind
31+
```
32+
1933
To create a cluster with [clusterctl](https://cluster-api.sigs.k8s.io/user/quick-start.html), run:
2034

2135
```shell
@@ -25,7 +39,7 @@ clusterctl generate cluster capi-quickstart \
2539
--control-plane-machine-count=1 \
2640
--worker-machine-count=1 | \
2741
gojq --yaml-input --yaml-output --slurp \
28-
'.[] | (select( .kind=="Cluster").metadata.labels += {"capi-runtime-extensions.d2iq-labs.com/cni": "calico"})' \
42+
'.[] | (select( .kind=="Cluster").metadata.labels += {"capi-runtime-extensions.d2iq-labs.com/cni": "calico"})' | \
2943
kubectl apply -f -
3044
```
3145

charts/capi-runtime-extensions/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,14 @@ A Helm chart for capi-runtime-extensions
2525

2626
| Key | Type | Default | Description |
2727
|-----|------|---------|-------------|
28+
| addons.provider | string | `"ClusterResourceSet"` | |
2829
| certificate.issuer.kind | string | `"Issuer"` | |
29-
| certificate.issuer.name | string | `nil` | |
30+
| certificate.issuer.name | string | `""` | |
3031
| certificate.issuer.selfSigned | bool | `true` | |
3132
| env | object | `{}` | |
3233
| image.pullPolicy | string | `"IfNotPresent"` | |
3334
| image.repository | string | `"ghcr.io/d2iq-labs/capi-runtime-extensions"` | |
34-
| image.tag | string | `nil` | |
35+
| image.tag | string | `""` | |
3536
| imagePullSecrets | list | `[]` | Optional secrets used for pulling the container image |
3637
| nodeSelector | object | `{}` | |
3738
| priorityClassName | string | `""` | Optional priority class to be used for the pod. |

charts/capi-runtime-extensions/templates/clusterrole.yaml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ metadata:
99
name: {{ include "chart.name" . }}
1010
rules:
1111
- apiGroups: [""]
12-
resources: ["configmaps"]
12+
resources: ["namespaces", "configmaps", "secrets"]
1313
verbs: ["watch", "list", "get", "create", "patch", "update", "delete"]
1414
- apiGroups:
1515
- addons.cluster.x-k8s.io
@@ -21,3 +21,11 @@ rules:
2121
- runtime.cluster.x-k8s.io
2222
resources: ["*"]
2323
verbs: ["watch", "list", "get", "create", "patch", "update", "delete"]
24+
- apiGroups:
25+
- source.toolkit.fluxcd.io
26+
resources: ["helmrepositories"]
27+
verbs: ["watch", "list", "get", "create", "patch", "update", "delete"]
28+
- apiGroups:
29+
- helm.toolkit.fluxcd.io
30+
resources: ["helmreleases"]
31+
verbs: ["watch", "list", "get", "create", "patch", "update", "delete"]

charts/capi-runtime-extensions/templates/deployment.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ spec:
3636
{{- end }}
3737
args:
3838
- --webhook-cert-dir=/certs/
39+
- --addon-provider={{ .Values.addons.provider }}
3940
{{- range $key, $value := .Values.extraArgs }}
4041
- --{{ $key }}={{ $value }}
4142
{{- end }}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
{
2+
"$schema": "http://json-schema.org/schema#",
3+
"type": "object",
4+
"properties": {
5+
"addons": {
6+
"type": "object",
7+
"properties": {
8+
"provider": {
9+
"type": "string",
10+
"enum": ["ClusterResourceSet", "FluxHelmRelease"]
11+
}
12+
}
13+
},
14+
"certificate": {
15+
"type": "object",
16+
"properties": {
17+
"issuer": {
18+
"type": "object",
19+
"properties": {
20+
"kind": {
21+
"type": "string",
22+
"enum": ["Issuer", "ClusterIssuer"],
23+
"default": "Issuer"
24+
},
25+
"name": {
26+
"type": "string"
27+
},
28+
"selfSigned": {
29+
"type": "boolean"
30+
}
31+
}
32+
}
33+
}
34+
},
35+
"env": {
36+
"type": "object"
37+
},
38+
"image": {
39+
"type": "object",
40+
"properties": {
41+
"pullPolicy": {
42+
"type": "string",
43+
"default": "IfNotPresent"
44+
},
45+
"repository": {
46+
"type": "string"
47+
},
48+
"tag": {
49+
"type": "string"
50+
}
51+
}
52+
},
53+
"imagePullSecrets": {
54+
"type": "array"
55+
},
56+
"nodeSelector": {
57+
"type": "object"
58+
},
59+
"priorityClassName": {
60+
"type": "string"
61+
},
62+
"resources": {
63+
"type": "object",
64+
"properties": {
65+
"limits": {
66+
"type": "object",
67+
"properties": {
68+
"cpu": {
69+
"type": "string"
70+
},
71+
"memory": {
72+
"type": "string"
73+
}
74+
}
75+
},
76+
"requests": {
77+
"type": "object",
78+
"properties": {
79+
"cpu": {
80+
"type": "string"
81+
},
82+
"memory": {
83+
"type": "string"
84+
}
85+
}
86+
}
87+
}
88+
},
89+
"securityContext": {
90+
"type": "object",
91+
"properties": {
92+
"runAsUser": {
93+
"type": "integer"
94+
}
95+
}
96+
},
97+
"service": {
98+
"type": "object",
99+
"properties": {
100+
"annotations": {
101+
"type": "object"
102+
},
103+
"port": {
104+
"type": "integer"
105+
},
106+
"type": {
107+
"type": "string"
108+
}
109+
}
110+
},
111+
"tolerations": {
112+
"type": "array"
113+
}
114+
}
115+
}

charts/capi-runtime-extensions/values.yaml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
# Copyright 2023 D2iQ, Inc. All rights reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

4+
addons:
5+
provider: ClusterResourceSet
6+
47
image:
58
repository: ghcr.io/d2iq-labs/capi-runtime-extensions
6-
tag:
9+
tag: ""
710
pullPolicy: IfNotPresent
811

912
# -- Optional secrets used for pulling the container image
@@ -13,7 +16,7 @@ imagePullSecrets: []
1316
certificate:
1417
issuer:
1518
selfSigned: true
16-
name:
19+
name: ""
1720
kind: Issuer
1821

1922
env: {}

cmd/capi-runtime-extensions/flags.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright 2023 D2iQ, Inc. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package main
5+
6+
import (
7+
"fmt"
8+
9+
"github.com/spf13/pflag"
10+
11+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/lifecycle"
12+
)
13+
14+
type addonProviderValue lifecycle.AddonProvider
15+
16+
func (v addonProviderValue) String() string {
17+
return string(v)
18+
}
19+
20+
func (v *addonProviderValue) Set(value string) error {
21+
switch lifecycle.AddonProvider(value) {
22+
case lifecycle.ClusterResourceSetAddonProvider, lifecycle.FluxHelmReleaseAddonProvider:
23+
break
24+
default:
25+
return fmt.Errorf(
26+
"invalid addon provider: %q (must be one of %v)",
27+
value,
28+
[]string{
29+
string(lifecycle.ClusterResourceSetAddonProvider),
30+
string(lifecycle.FluxHelmReleaseAddonProvider),
31+
},
32+
)
33+
}
34+
35+
*v = addonProviderValue(value)
36+
37+
return nil
38+
}
39+
40+
func (*addonProviderValue) Type() string {
41+
return "addonProvider"
42+
}
43+
44+
func newAddonProviderValue(val lifecycle.AddonProvider, p *lifecycle.AddonProvider) pflag.Value {
45+
*p = val
46+
return (*addonProviderValue)(p)
47+
}

cmd/capi-runtime-extensions/main.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package main
55

66
import (
77
"flag"
8+
"fmt"
89
"net/http"
910
"os"
1011
"time"
@@ -31,6 +32,7 @@ var (
3132
profilerAddress string
3233
webhookPort int
3334
webhookCertDir string
35+
addonProvider lifecycle.AddonProvider
3436
logOptions = logs.NewOptions()
3537
)
3638

@@ -49,6 +51,18 @@ func InitFlags(fs *pflag.FlagSet) {
4951

5052
fs.StringVar(&webhookCertDir, "webhook-cert-dir", "/tmp/k8s-webhook-server/serving-certs/",
5153
"Webhook cert dir, only used when webhook-port is specified.")
54+
55+
fs.Var(newAddonProviderValue(
56+
lifecycle.ClusterResourceSetAddonProvider, &addonProvider),
57+
"addon-provider",
58+
fmt.Sprintf(
59+
"addon provider (one of %v)",
60+
[]string{
61+
string(lifecycle.ClusterResourceSetAddonProvider),
62+
string(lifecycle.FluxHelmReleaseAddonProvider),
63+
},
64+
),
65+
)
5266
}
5367

5468
func main() {
@@ -114,7 +128,7 @@ func main() {
114128
}
115129

116130
// Create the ExtensionHandlers for the lifecycle hooks
117-
lifecycleExtensionHandlers := lifecycle.NewExtensionHandlers(client)
131+
lifecycleExtensionHandlers := lifecycle.NewExtensionHandlers(addonProvider, client)
118132

119133
// Register extension handlers.
120134
if err := webhookServer.AddExtensionHandler(server.ExtensionHandler{

go.mod

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ module github.com/d2iq-labs/capi-runtime-extensions
66
go 1.20
77

88
require (
9+
github.com/fluxcd/helm-controller/api v0.28.1
10+
github.com/fluxcd/pkg/apis/meta v0.18.0
11+
github.com/fluxcd/source-controller/api v0.33.0
912
github.com/spf13/pflag v1.0.5
1013
k8s.io/apimachinery v0.25.6
1114
k8s.io/component-base v0.25.6
@@ -14,6 +17,13 @@ require (
1417
sigs.k8s.io/controller-runtime v0.13.1
1518
)
1619

20+
require (
21+
github.com/fluxcd/pkg/apis/acl v0.1.0 // indirect
22+
github.com/fluxcd/pkg/apis/kustomize v0.7.0 // indirect
23+
github.com/onsi/gomega v1.24.1 // indirect
24+
k8s.io/cluster-bootstrap v0.25.6 // indirect
25+
)
26+
1727
require (
1828
github.com/MakeNowJust/heredoc v1.0.0 // indirect
1929
github.com/beorn7/perks v1.0.1 // indirect
@@ -79,12 +89,12 @@ require (
7989
gopkg.in/ini.v1 v1.67.0 // indirect
8090
gopkg.in/yaml.v2 v2.4.0 // indirect
8191
gopkg.in/yaml.v3 v3.0.1 // indirect
82-
k8s.io/api v0.25.6 // indirect
83-
k8s.io/apiextensions-apiserver v0.25.0 // indirect
92+
k8s.io/api v0.25.6
93+
k8s.io/apiextensions-apiserver v0.25.6
8494
k8s.io/client-go v0.25.6 // indirect
8595
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
8696
k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 // indirect
87-
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
97+
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
8898
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
89-
sigs.k8s.io/yaml v1.3.0 // indirect
99+
sigs.k8s.io/yaml v1.3.0
90100
)

0 commit comments

Comments
 (0)