pkg/model/k8s/default_merge_config.go (233 lines of code) (raw):
// Copyright 2024 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package k8s
import (
"reflect"
"strings"
"github.com/GoogleCloudPlatform/khi/pkg/log/structure/merger"
"github.com/GoogleCloudPlatform/khi/pkg/model/k8s/configsource"
admissionv1 "k8s.io/api/admission/v1"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
appsv1 "k8s.io/api/apps/v1"
autoscalingv1 "k8s.io/api/autoscaling/v1"
autoscalingv2 "k8s.io/api/autoscaling/v2"
certificatesv1 "k8s.io/api/certificates/v1"
coordinationv1 "k8s.io/api/coordination/v1"
corev1 "k8s.io/api/core/v1"
discoveryv1 "k8s.io/api/discovery/v1"
networkingv1 "k8s.io/api/networking/v1"
nodev1 "k8s.io/api/node/v1"
policyv1 "k8s.io/api/policy/v1"
rbacv1 "k8s.io/api/rbac/v1"
schedulingv1 "k8s.io/api/scheduling/v1"
storagev1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
)
type defaultMergeConfigSourceItem struct {
group schema.GroupVersion
Resources []interface{}
}
var defaultMergeConfigSources []defaultMergeConfigSourceItem = []defaultMergeConfigSourceItem{
{
group: admissionv1.SchemeGroupVersion,
Resources: []interface{}{
admissionv1.AdmissionReview{},
},
},
{
group: admissionregistrationv1.SchemeGroupVersion,
Resources: []interface{}{
admissionregistrationv1.ValidatingWebhookConfiguration{},
admissionregistrationv1.ValidatingWebhookConfigurationList{},
admissionregistrationv1.MutatingWebhookConfiguration{},
admissionregistrationv1.MutatingWebhookConfigurationList{}},
},
{
group: autoscalingv1.SchemeGroupVersion,
Resources: []interface{}{
autoscalingv1.HorizontalPodAutoscaler{},
autoscalingv1.HorizontalPodAutoscalerList{},
autoscalingv1.Scale{}},
},
{
group: autoscalingv2.SchemeGroupVersion,
Resources: []interface{}{
autoscalingv2.HorizontalPodAutoscaler{},
autoscalingv2.HorizontalPodAutoscalerList{},
},
},
{
group: certificatesv1.SchemeGroupVersion,
Resources: []interface{}{
certificatesv1.CertificateSigningRequest{},
certificatesv1.CertificateSigningRequestList{},
},
},
{
group: coordinationv1.SchemeGroupVersion,
Resources: []interface{}{
coordinationv1.Lease{},
coordinationv1.LeaseList{},
},
},
{
group: corev1.SchemeGroupVersion,
Resources: []interface{}{
corev1.Pod{},
corev1.PodList{},
corev1.PodStatusResult{},
corev1.PodTemplate{},
corev1.PodTemplateList{},
corev1.ReplicationController{},
corev1.ReplicationControllerList{},
corev1.Service{},
corev1.ServiceProxyOptions{},
corev1.ServiceList{},
corev1.Endpoints{},
corev1.EndpointsList{},
corev1.Node{},
corev1.NodeList{},
corev1.NodeProxyOptions{},
corev1.Binding{},
corev1.Event{},
corev1.EventList{},
corev1.List{},
corev1.LimitRange{},
corev1.LimitRangeList{},
corev1.ResourceQuota{},
corev1.ResourceQuotaList{},
corev1.Namespace{},
corev1.NamespaceList{},
corev1.Secret{},
corev1.SecretList{},
corev1.ServiceAccount{},
corev1.ServiceAccountList{},
corev1.PersistentVolume{},
corev1.PersistentVolumeList{},
corev1.PersistentVolumeClaim{},
corev1.PersistentVolumeClaimList{},
corev1.PodAttachOptions{},
corev1.PodLogOptions{},
corev1.PodExecOptions{},
corev1.PodPortForwardOptions{},
corev1.PodProxyOptions{},
corev1.ComponentStatus{},
corev1.ComponentStatusList{},
corev1.SerializedReference{},
corev1.RangeAllocation{},
corev1.ConfigMap{},
corev1.ConfigMapList{},
},
},
{
group: discoveryv1.SchemeGroupVersion,
Resources: []interface{}{
discoveryv1.EndpointSlice{},
discoveryv1.EndpointSliceList{},
},
},
{
group: policyv1.SchemeGroupVersion,
Resources: []interface{}{
policyv1.PodDisruptionBudget{},
policyv1.PodDisruptionBudgetList{},
policyv1.Eviction{},
},
},
{
group: rbacv1.SchemeGroupVersion,
Resources: []interface{}{
rbacv1.Role{},
rbacv1.RoleBinding{},
rbacv1.RoleBindingList{},
rbacv1.RoleList{},
rbacv1.ClusterRole{},
rbacv1.ClusterRoleBinding{},
rbacv1.ClusterRoleBindingList{},
rbacv1.ClusterRoleList{},
},
},
{
group: schedulingv1.SchemeGroupVersion,
Resources: []interface{}{
schedulingv1.PriorityClass{},
schedulingv1.PriorityClassList{},
},
},
{
group: appsv1.SchemeGroupVersion,
Resources: []interface{}{
appsv1.Deployment{},
appsv1.DeploymentList{},
appsv1.StatefulSet{},
appsv1.StatefulSetList{},
appsv1.DaemonSet{},
appsv1.DaemonSetList{},
appsv1.ReplicaSet{},
appsv1.ReplicaSetList{},
appsv1.ControllerRevision{},
appsv1.ControllerRevisionList{},
},
},
{
group: networkingv1.SchemeGroupVersion,
Resources: []interface{}{
networkingv1.Ingress{},
networkingv1.IngressList{},
networkingv1.IngressClass{},
networkingv1.IngressClassList{},
networkingv1.NetworkPolicy{},
networkingv1.NetworkPolicyList{},
},
},
{
group: nodev1.SchemeGroupVersion,
Resources: []interface{}{
nodev1.RuntimeClass{},
nodev1.RuntimeClassList{},
},
},
{
group: storagev1.SchemeGroupVersion,
Resources: []interface{}{
storagev1.StorageClass{},
storagev1.StorageClassList{},
storagev1.VolumeAttachment{},
storagev1.VolumeAttachmentList{},
storagev1.CSINode{},
storagev1.CSINodeList{},
storagev1.CSIDriver{},
storagev1.CSIDriverList{},
storagev1.CSIStorageCapacity{},
storagev1.CSIStorageCapacityList{},
},
},
}
func GenerateDefaultMergeConfig() (*MergeConfigRegistry, error) {
type defaultResource struct {
metav1.ObjectMeta `json:"metadata,omitempty"`
}
defaultResovler, err := configsource.FromResourceTypeReflection(defaultResource{})
if err != nil {
return nil, err
}
registry := &MergeConfigRegistry{
defaultResolver: defaultResovler,
mergeConfigResolvers: make(map[string]*merger.MergeConfigResolver),
}
for _, config := range defaultMergeConfigSources {
apiVersion := config.group.Identifier()
if apiVersion == "v1" {
apiVersion = "core/v1"
}
for _, resource := range config.Resources {
refType := reflect.TypeOf(resource)
kind := strings.ToLower(refType.Name())
resolver, err := configsource.FromResourceTypeReflection(resource)
if err != nil {
return nil, err
}
registry.Register(apiVersion, kind, resolver)
}
}
return registry, nil
}