11package rancher2
22
33import (
4+ "fmt"
5+ "reflect"
6+
47 "github.com/hashicorp/terraform-plugin-sdk/helper/schema"
8+ auditv1 "k8s.io/apiserver/pkg/apis/audit/v1"
59)
610
711const (
8- servicesKubeAPIAuditLogPolicyOmitStages = "omitStages"
9- servicesKubeAPIAuditLogPolicyRules = "rules"
12+ clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyApiversionTag = "apiVersion"
13+ clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyKindDefault = "Policy"
14+ clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyKindTag = "kind"
1015)
1116
1217var (
13- servicesKubeAPIAuditLogPolicy = []string {servicesKubeAPIAuditLogPolicyOmitStages , servicesKubeAPIAuditLogPolicyRules }
18+ clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyRequired = []string {
19+ clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyApiversionTag ,
20+ clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyKindTag }
1421)
1522
1623//Schemas
@@ -45,6 +52,45 @@ func clusterRKEConfigServicesKubeAPIAuditLogConfigFields() map[string]*schema.Sc
4552 "policy" : {
4653 Type : schema .TypeString ,
4754 Optional : true ,
55+ Computed : true ,
56+ ValidateFunc : func (val interface {}, key string ) (warns []string , errs []error ) {
57+ v , ok := val .(string )
58+ if ! ok || len (v ) == 0 {
59+ return
60+ }
61+ m , err := ghodssyamlToMapInterface (v )
62+ if err != nil {
63+ errs = append (errs , fmt .Errorf ("%q must be in yaml format, error: %v" , key , err ))
64+ return
65+ }
66+ for _ , k := range clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyRequired {
67+ check , ok := m [k ].(string )
68+ if ! ok || len (check ) == 0 {
69+ errs = append (errs , fmt .Errorf ("%s is required on yaml" , k ))
70+ }
71+ if k == clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyKindTag {
72+ if check != clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyKindDefault {
73+ errs = append (errs , fmt .Errorf ("%s value %s should be: %s" , k , check , clusterRKEConfigServicesKubeAPIAuditLogConfigPolicyKindDefault ))
74+ }
75+ }
76+
77+ }
78+ return
79+ },
80+ DiffSuppressFunc : func (k , old , new string , d * schema.ResourceData ) bool {
81+ if old == "" || new == "" {
82+ return false
83+ }
84+ oldPolicy := & auditv1.Policy {}
85+ newPolicy := & auditv1.Policy {}
86+ oldMap , _ := ghodssyamlToMapInterface (old )
87+ newMap , _ := ghodssyamlToMapInterface (new )
88+ oldStr , _ := mapInterfaceToJSON (oldMap )
89+ newStr , _ := mapInterfaceToJSON (newMap )
90+ jsonToInterface (oldStr , oldPolicy )
91+ jsonToInterface (newStr , newPolicy )
92+ return reflect .DeepEqual (oldPolicy , newPolicy )
93+ },
4894 },
4995 }
5096 return s
@@ -56,6 +102,7 @@ func clusterRKEConfigServicesKubeAPIAuditLogFields() map[string]*schema.Schema {
56102 Type : schema .TypeList ,
57103 MaxItems : 1 ,
58104 Optional : true ,
105+ Computed : true ,
59106 Elem : & schema.Resource {
60107 Schema : clusterRKEConfigServicesKubeAPIAuditLogConfigFields (),
61108 },
0 commit comments