Files
2024-05-15 00:28:54 +09:00

84 lines
2.0 KiB
Go

package webhook
import (
"fmt"
"github.com/kkb0318/irsa-manager/internal/manifests"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type WebhookSetup struct {
resources []client.Object
}
func secretNamespacedName() types.NamespacedName {
return types.NamespacedName{
Name: "pod-identity-webhook",
Namespace: WEBHOOK_NAMESPACE,
}
}
func (w *WebhookSetup) Resources() []client.Object {
return w.resources
}
func NewWebHookSetup() (*WebhookSetup, error) {
factory := newBaseManifestFactory()
resources, err := myCertificate(factory)
if err != nil {
return nil, err
}
return &WebhookSetup{resources}, nil
}
func myCertificate(base *baseManifestFactory) ([]client.Object, error) {
tlsCredential, err := CreateTlsCredential(serviceNamespacedName())
if err != nil {
return nil, err
}
resources := []client.Object{}
secretNamespacedName := secretNamespacedName()
secret, err := manifests.NewSecretBuilder().
WithCertificate(tlsCredential).
Build(secretNamespacedName)
if err != nil {
return nil, err
}
deploy := base.deployment()
deploy.Spec.Template.Spec.Containers[0].Command = []string{
"/webhook",
"--in-cluster=false",
fmt.Sprintf("--namespace=%s", WEBHOOK_NAMESPACE),
fmt.Sprintf("--service-name=%s", base.serviceMeta.Name),
fmt.Sprintf("--tls-secret=%s", secretNamespacedName.Name),
"--annotation-prefix=eks.amazonaws.com",
"--token-audience=sts.amazonaws.com",
"--logtostderr",
}
deploy.Spec.Template.Spec.Volumes = []corev1.Volume{
{
Name: "cert",
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
SecretName: secretNamespacedName.Name,
},
},
},
}
mutate := base.mutatingWebhookConfiguration()
mutate.Webhooks[0].ClientConfig.CABundle = tlsCredential.Certificate()
resources = append(resources,
secret,
deploy,
mutate,
base.clusterRole(),
base.clusterRoleBinding(),
base.serviceAccount(),
base.service(),
)
return resources, nil
}