Skip to content

Commit

Permalink
add central event reasons to the log package (#7215)
Browse files Browse the repository at this point in the history
  • Loading branch information
pdabelf5 authored Jan 28, 2025
1 parent f1bb8cb commit 3dfb273
Show file tree
Hide file tree
Showing 18 changed files with 220 additions and 202 deletions.
2 changes: 1 addition & 1 deletion cmd/nginx-ingress/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -1068,7 +1068,7 @@ func updateSelfWithVersionInfo(ctx context.Context, eventLog record.EventRecorde
for key, value := range labels {
fmt.Fprintf(labelsString, "%s=\"%s\", ", key, value)
}
eventLog.Eventf(newPod, api_v1.EventTypeNormal, "UpdatePodLabel", "Successfully added version labels, %s", strings.TrimRight(labelsString.String(), ", "))
eventLog.Eventf(newPod, api_v1.EventTypeNormal, nl.EventReasonUpdatePodLabel, "Successfully added version labels, %s", strings.TrimRight(labelsString.String(), ", "))
nl.Infof(l, "Pod label updated: %s", pod.ObjectMeta.Name)
podUpdated = true
}
Expand Down
21 changes: 7 additions & 14 deletions internal/certmanager/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,6 @@ import (
vsapi "github.com/nginx/kubernetes-ingress/pkg/apis/configuration/v1"
)

const (
reasonBadConfig = "BadConfig"
reasonCreateCertificate = "CreateCertificate"
reasonUpdateCertificate = "UpdateCertificate"
reasonDeleteCertificate = "DeleteCertificate"
)

var vsGVK = vsapi.SchemeGroupVersion.WithKind("VirtualServer")

// SyncFn is the reconciliation function passed to cert manager VS controller.
Expand All @@ -71,7 +64,7 @@ func SyncFnFor(
issuerName, issuerKind, issuerGroup, err := issuerForVirtualServer(vs)
if err != nil {
nl.Errorf(l, "Failed to determine issuer to be used for VirtualServer resource: %v", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Could not determine issuer for virtual server due to bad config: %s",
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Could not determine issuer for virtual server due to bad config: %s",
err)
return err
}
Expand All @@ -81,7 +74,7 @@ func SyncFnFor(
newCrts, updateCrts, err := buildCertificates(ctx, nsi.cmLister, vs, issuerName, issuerKind, issuerGroup)
if err != nil {
nl.Errorf(l, "Incorrect cert-manager configuration for VirtualServer resource: %v", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Incorrect cert-manager configuration for VirtualServer resource: %s",
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Incorrect cert-manager configuration for VirtualServer resource: %s",
err)
return err
}
Expand All @@ -90,22 +83,22 @@ func SyncFnFor(
_, err := cmClient.CertmanagerV1().Certificates(crt.Namespace).Create(ctx, crt, metav1.CreateOptions{})
if err != nil {
nl.Errorf(l, "Error issuing Certificate for VirtualServer resource: %v", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Error issuing Certificate for VirtualServer resource: %s",
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Error issuing Certificate for VirtualServer resource: %s",
err)
return err
}
rec.Eventf(vs, corev1.EventTypeNormal, reasonCreateCertificate, "Successfully created Certificate %q", crt.Name)
rec.Eventf(vs, corev1.EventTypeNormal, nl.EventReasonCreateCertificate, "Successfully created Certificate %q", crt.Name)
}

for _, crt := range updateCrts {
_, err := cmClient.CertmanagerV1().Certificates(crt.Namespace).Update(ctx, crt, metav1.UpdateOptions{})
if err != nil {
nl.Errorf(l, "Error updating Certificate for VirtualServer resource: %v", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Error updating Certificate for VirtualServer resource: %s",
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Error updating Certificate for VirtualServer resource: %s",
err)
return err
}
rec.Eventf(vs, corev1.EventTypeNormal, reasonUpdateCertificate, "Successfully updated Certificate %q", crt.Name)
rec.Eventf(vs, corev1.EventTypeNormal, nl.EventReasonUpdateCertificate, "Successfully updated Certificate %q", crt.Name)
}
var certs []*cmapi.Certificate

Expand All @@ -121,7 +114,7 @@ func SyncFnFor(
nl.Errorf(l, "Error deleting Certificate for VirtualServer resource: %v", err)
return err
}
rec.Eventf(vs, corev1.EventTypeNormal, reasonDeleteCertificate, "Successfully deleted unrequired Certificate %q", certName)
rec.Eventf(vs, corev1.EventTypeNormal, nl.EventReasonDeleteCertificate, "Successfully deleted unrequired Certificate %q", certName)
}

return nil
Expand Down
89 changes: 44 additions & 45 deletions internal/configs/configmaps.go

Large diffs are not rendered by default.

25 changes: 11 additions & 14 deletions internal/externaldns/sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,9 @@ import (
)

const (
reasonBadConfig = "BadConfig"
reasonCreateDNSEndpoint = "CreateDNSEndpoint"
reasonUpdateDNSEndpoint = "UpdateDNSEndpoint"
recordTypeA = "A"
recordTypeAAAA = "AAAA"
recordTypeCNAME = "CNAME"
recordTypeA = "A"
recordTypeAAAA = "AAAA"
recordTypeCNAME = "CNAME"
)

var vsGVK = vsapi.SchemeGroupVersion.WithKind("VirtualServer")
Expand All @@ -54,7 +51,7 @@ func SyncFnFor(rec record.EventRecorder, client clientset.Interface, ig map[stri
targets, recordType, err := getValidTargets(ctx, vs.Status.ExternalEndpoints)
if err != nil {
nl.Error(l, "Invalid external endpoint")
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Invalid external endpoint")
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Invalid external endpoint")
return err
}

Expand All @@ -63,7 +60,7 @@ func SyncFnFor(rec record.EventRecorder, client clientset.Interface, ig map[stri
newDNSEndpoint, updateDNSEndpoint, err := buildDNSEndpoint(ctx, nsi.extdnslister, vs, targets, recordType)
if err != nil {
nl.Errorf(l, "incorrect DNSEndpoint config for VirtualServer resource: %s", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Incorrect DNSEndpoint config for VirtualServer resource: %s", err)
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Incorrect DNSEndpoint config for VirtualServer resource: %s", err)
return err
}

Expand All @@ -80,11 +77,11 @@ func SyncFnFor(rec record.EventRecorder, client clientset.Interface, ig map[stri
return fmt.Errorf("DNSEndpoint has already been created")
}
nl.Errorf(l, "Error creating DNSEndpoint for VirtualServer resource: %v", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Error creating DNSEndpoint for VirtualServer resource %s", err)
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Error creating DNSEndpoint for VirtualServer resource %s", err)
return err
}
rec.Eventf(vs, corev1.EventTypeNormal, reasonCreateDNSEndpoint, "Successfully created DNSEndpoint %q", newDNSEndpoint.Name)
rec.Eventf(dep, corev1.EventTypeNormal, reasonCreateDNSEndpoint, "Successfully created DNSEndpoint for VirtualServer %q", vs.Name)
rec.Eventf(vs, corev1.EventTypeNormal, nl.EventReasonCreateDNSEndpoint, "Successfully created DNSEndpoint %q", newDNSEndpoint.Name)
rec.Eventf(dep, corev1.EventTypeNormal, nl.EventReasonCreateDNSEndpoint, "Successfully created DNSEndpoint for VirtualServer %q", vs.Name)
}

// Update existing DNSEndpoint object
Expand All @@ -93,11 +90,11 @@ func SyncFnFor(rec record.EventRecorder, client clientset.Interface, ig map[stri
dep, err = client.ExternaldnsV1().DNSEndpoints(updateDNSEndpoint.Namespace).Update(ctx, updateDNSEndpoint, metav1.UpdateOptions{})
if err != nil {
nl.Errorf(l, "Error updating DNSEndpoint endpoint for VirtualServer resource: %v", err)
rec.Eventf(vs, corev1.EventTypeWarning, reasonBadConfig, "Error updating DNSEndpoint for VirtualServer resource: %s", err)
rec.Eventf(vs, corev1.EventTypeWarning, nl.EventReasonBadConfig, "Error updating DNSEndpoint for VirtualServer resource: %s", err)
return err
}
rec.Eventf(vs, corev1.EventTypeNormal, reasonUpdateDNSEndpoint, "Successfully updated DNSEndpoint %q", updateDNSEndpoint.Name)
rec.Eventf(dep, corev1.EventTypeNormal, reasonUpdateDNSEndpoint, "Successfully updated DNSEndpoint for VirtualServer %q", vs.Name)
rec.Eventf(vs, corev1.EventTypeNormal, nl.EventReasonUpdateDNSEndpoint, "Successfully updated DNSEndpoint %q", updateDNSEndpoint.Name)
rec.Eventf(dep, corev1.EventTypeNormal, nl.EventReasonUpdateDNSEndpoint, "Successfully updated DNSEndpoint for VirtualServer %q", vs.Name)
}
return nil
}
Expand Down
16 changes: 8 additions & 8 deletions internal/k8s/appprotect/app_protect_configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import (
"sort"
"time"

"github.com/nginx/kubernetes-ingress/pkg/apis/configuration/validation"

"github.com/nginx/kubernetes-ingress/internal/k8s/appprotectcommon"
nl "github.com/nginx/kubernetes-ingress/internal/logger"
"github.com/nginx/kubernetes-ingress/pkg/apis/configuration/validation"

"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
Expand Down Expand Up @@ -354,7 +354,7 @@ func (ci *ConfigurationImpl) AddOrUpdatePolicy(policyObj *unstructured.Unstructu
if err != nil {
ci.Policies[resNsName] = policy
return append(changes, Change{Op: Delete, Resource: policy}),
append(problems, Problem{Object: policyObj, Reason: "Rejected", Message: err.Error()})
append(problems, Problem{Object: policyObj, Reason: nl.EventReasonRejected, Message: err.Error()})
}
if ci.verifyPolicyAgainstUserSigs(policy) {
ci.Policies[resNsName] = policy
Expand All @@ -364,7 +364,7 @@ func (ci *ConfigurationImpl) AddOrUpdatePolicy(policyObj *unstructured.Unstructu
policy.ErrorMsg = missingUserSigErrorMsg
ci.Policies[resNsName] = policy
return append(changes, Change{Op: Delete, Resource: policy}),
append(problems, Problem{Object: policyObj, Reason: "Rejected", Message: missingUserSigErrorMsg})
append(problems, Problem{Object: policyObj, Reason: nl.EventReasonRejected, Message: missingUserSigErrorMsg})
}

// AddOrUpdateLogConf adds or updates App Protect Log Configuration to App Protect Configuration
Expand All @@ -374,7 +374,7 @@ func (ci *ConfigurationImpl) AddOrUpdateLogConf(logconfObj *unstructured.Unstruc
ci.LogConfs[resNsName] = logConf
if err != nil {
return append(changes, Change{Op: Delete, Resource: logConf}),
append(problems, Problem{Object: logconfObj, Reason: "Rejected", Message: err.Error()})
append(problems, Problem{Object: logconfObj, Reason: nl.EventReasonRejected, Message: err.Error()})
}
return append(changes, Change{Op: AddOrUpdate, Resource: logConf}), problems
}
Expand All @@ -385,7 +385,7 @@ func (ci *ConfigurationImpl) AddOrUpdateUserSig(userSigObj *unstructured.Unstruc
userSig, err := createAppProtectUserSigEx(userSigObj)
ci.UserSigs[resNsName] = userSig
if err != nil {
problems = append(problems, Problem{Object: userSigObj, Reason: "Rejected", Message: err.Error()})
problems = append(problems, Problem{Object: userSigObj, Reason: nl.EventReasonRejected, Message: err.Error()})
}
change.UserSigs = append(change.UserSigs, userSigObj)
ci.buildUserSigChangeAndProblems(&problems, &change)
Expand Down Expand Up @@ -489,7 +489,7 @@ func (ci *ConfigurationImpl) reconcileUserSigs() (changes []Change, problems []P
for _, sig := range sigs[1:] {
if sig.IsValid {
sig.setInvalid(duplicatedTagsErrorMsg)
looserProblem := Problem{Object: sig.Obj, Reason: "Rejected", Message: duplicatedTagsErrorMsg}
looserProblem := Problem{Object: sig.Obj, Reason: nl.EventReasonRejected, Message: duplicatedTagsErrorMsg}
looserChange := Change{Op: Delete, Resource: sig}
changes = append(changes, looserChange)
problems = append(problems, looserProblem)
Expand All @@ -511,7 +511,7 @@ func (ci *ConfigurationImpl) verifyPolicies() (changes []Change, problems []Prob
if pol.IsValid {
if !ci.verifyPolicyAgainstUserSigs(pol) {
pol.setInvalid(missingUserSigErrorMsg)
polProb := Problem{Object: pol.Obj, Reason: "Rejected", Message: missingUserSigErrorMsg}
polProb := Problem{Object: pol.Obj, Reason: nl.EventReasonRejected, Message: missingUserSigErrorMsg}
polCh := Change{Op: Delete, Resource: pol}
changes = append(changes, polCh)
problems = append(problems, polProb)
Expand Down
15 changes: 8 additions & 7 deletions internal/k8s/appprotect/app_protect_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"testing"
"time"

nl "github.com/nginx/kubernetes-ingress/internal/logger"
nic_glog "github.com/nginx/kubernetes-ingress/internal/logger/glog"
"github.com/nginx/kubernetes-ingress/internal/logger/levels"

Expand Down Expand Up @@ -577,7 +578,7 @@ func TestAddOrUpdatePolicy(t *testing.T) {
expectedProblems: []Problem{
{
Object: invalidTestPolicy,
Reason: "Rejected",
Reason: nl.EventReasonRejected,
Message: "Error validating policy : error validating App Protect Policy : required field map[] not found",
},
},
Expand Down Expand Up @@ -606,7 +607,7 @@ func TestAddOrUpdatePolicy(t *testing.T) {
expectedProblems: []Problem{
{
Object: testPolicyUnsatisfied,
Reason: "Rejected",
Reason: nl.EventReasonRejected,
Message: "policy has unsatisfied signature requirements",
},
},
Expand Down Expand Up @@ -686,7 +687,7 @@ func TestAddOrUpdateLogConf(t *testing.T) {
expectedProblems: []Problem{
{
Object: invalidLogConf,
Reason: "Rejected",
Reason: nl.EventReasonRejected,
Message: "error validating App Protect Log Configuration testlogconf: required field map[] not found",
},
},
Expand Down Expand Up @@ -846,7 +847,7 @@ func TestAddOrUpdateUserSig(t *testing.T) {
expectedProblems: []Problem{
{
Object: invalidTestUserSig2,
Reason: "Rejected",
Reason: nl.EventReasonRejected,
Message: "validation failed",
},
},
Expand All @@ -863,7 +864,7 @@ func TestAddOrUpdateUserSig(t *testing.T) {
{
Object: testUserSigDupTag,
Message: "duplicate tag set",
Reason: "Rejected",
Reason: nl.EventReasonRejected,
},
},
msg: "Duplicate tags",
Expand All @@ -879,7 +880,7 @@ func TestAddOrUpdateUserSig(t *testing.T) {
{
Object: testUserSig1Invalid,
Message: "validation failed",
Reason: "Rejected",
Reason: nl.EventReasonRejected,
},
},
msg: "UserSig becomes valid after previous tag holder became invalid",
Expand Down Expand Up @@ -1071,7 +1072,7 @@ func TestDeleteUserSig(t *testing.T) {
},
expectedProblems: []Problem{
{
Reason: "Rejected",
Reason: nl.EventReasonRejected,
Message: "policy has unsatisfied signature requirements",
Object: &unstructured.Unstructured{
Object: map[string]interface{}{},
Expand Down
8 changes: 4 additions & 4 deletions internal/k8s/appprotect_dos.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,17 +216,17 @@ func (lbc *LoadBalancerController) processAppProtectDosChanges(changes []appprot
warnings, err := lbc.configurator.AddOrUpdateResourcesThatUseDosProtected(resourceExes.IngressExes, resourceExes.MergeableIngresses, resourceExes.VirtualServerExes)
lbc.updateResourcesStatusAndEvents(resources, warnings, err)
msg := fmt.Sprintf("Configuration for %s/%s was added or updated", impl.Obj.Namespace, impl.Obj.Name)
lbc.recorder.Event(impl.Obj, api_v1.EventTypeNormal, "AddedOrUpdated", msg)
lbc.recorder.Event(impl.Obj, api_v1.EventTypeNormal, nl.EventReasonAddedOrUpdated, msg)
case *appprotectdos.DosPolicyEx:
msg := "Configuration was added or updated"
lbc.recorder.Event(impl.Obj, api_v1.EventTypeNormal, "AddedOrUpdated", msg)
lbc.recorder.Event(impl.Obj, api_v1.EventTypeNormal, nl.EventReasonAddedOrUpdated, msg)
case *appprotectdos.DosLogConfEx:
eventType := api_v1.EventTypeNormal
eventTitle := "AddedOrUpdated"
eventTitle := nl.EventReasonAddedOrUpdated
msg := "Configuration was added or updated"
if impl.ErrorMsg != "" {
msg += fmt.Sprintf(" ; with warning(s): %s", impl.ErrorMsg)
eventTitle = "AddedOrUpdatedWithWarning"
eventTitle = nl.EventReasonAddedOrUpdatedWithWarning
eventType = api_v1.EventTypeWarning
}
lbc.recorder.Event(impl.Obj, eventType, eventTitle, msg)
Expand Down
4 changes: 2 additions & 2 deletions internal/k8s/appprotect_waf.go
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ func (lbc *LoadBalancerController) processAppProtectChanges(changes []appprotect

warnings, updateErr := lbc.configurator.AddOrUpdateAppProtectResource(impl.Obj, resourceExes.IngressExes, resourceExes.MergeableIngresses, resourceExes.VirtualServerExes)
lbc.updateResourcesStatusAndEvents(resources, warnings, updateErr)
lbc.recorder.Eventf(impl.Obj, api_v1.EventTypeNormal, "AddedOrUpdated", "AppProtectPolicy %v was added or updated", namespace+"/"+name)
lbc.recorder.Eventf(impl.Obj, api_v1.EventTypeNormal, nl.EventReasonAddedOrUpdated, "AppProtectPolicy %v was added or updated", namespace+"/"+name)
case *appprotect.LogConfEx:
namespace := impl.Obj.GetNamespace()
name := impl.Obj.GetName()
Expand All @@ -385,7 +385,7 @@ func (lbc *LoadBalancerController) processAppProtectChanges(changes []appprotect

warnings, updateErr := lbc.configurator.AddOrUpdateAppProtectResource(impl.Obj, resourceExes.IngressExes, resourceExes.MergeableIngresses, resourceExes.VirtualServerExes)
lbc.updateResourcesStatusAndEvents(resources, warnings, updateErr)
lbc.recorder.Eventf(impl.Obj, api_v1.EventTypeNormal, "AddedOrUpdated", "AppProtectLogConfig %v was added or updated", namespace+"/"+name)
lbc.recorder.Eventf(impl.Obj, api_v1.EventTypeNormal, nl.EventReasonAddedOrUpdated, "AppProtectLogConfig %v was added or updated", namespace+"/"+name)
}
} else if c.Op == appprotect.Delete {
switch impl := c.Resource.(type) {
Expand Down
11 changes: 6 additions & 5 deletions internal/k8s/appprotectdos/app_protect_dos_configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/nginx/kubernetes-ingress/internal/configs"
"github.com/nginx/kubernetes-ingress/internal/k8s/appprotectcommon"
nl "github.com/nginx/kubernetes-ingress/internal/logger"
"github.com/nginx/kubernetes-ingress/pkg/apis/dos/v1beta1"
"github.com/nginx/kubernetes-ingress/pkg/apis/dos/validation"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
Expand Down Expand Up @@ -117,7 +118,7 @@ func (ci *Configuration) AddOrUpdatePolicy(policyObj *unstructured.Unstructured)
op := AddOrUpdate
if err != nil {
op = Delete
problems = append(problems, Problem{Object: policyObj, Reason: "Rejected", Message: err.Error()})
problems = append(problems, Problem{Object: policyObj, Reason: nl.EventReasonRejected, Message: err.Error()})
}

changes = append(changes, Change{Op: op, Resource: policy})
Expand All @@ -140,7 +141,7 @@ func (ci *Configuration) AddOrUpdateLogConf(logConfObj *unstructured.Unstructure
op := AddOrUpdate
if err != nil {
op = Delete
problems = append(problems, Problem{Object: logConfObj, Reason: "Rejected", Message: err.Error()})
problems = append(problems, Problem{Object: logConfObj, Reason: nl.EventReasonRejected, Message: err.Error()})
}

changes = append(changes, Change{Op: op, Resource: logConf})
Expand All @@ -162,7 +163,7 @@ func (ci *Configuration) AddOrUpdateDosProtectedResource(protectedConf *v1beta1.
ci.dosProtectedResource[resNsName] = protectedEx
if err != nil {
return []Change{{Op: Delete, Resource: protectedEx}},
[]Problem{{Object: protectedConf, Reason: "Rejected", Message: err.Error()}}
[]Problem{{Object: protectedConf, Reason: nl.EventReasonRejected, Message: err.Error()}}
}
if protectedEx.Obj.Spec.ApDosPolicy != "" {
policyReference := protectedEx.Obj.Spec.ApDosPolicy
Expand All @@ -173,7 +174,7 @@ func (ci *Configuration) AddOrUpdateDosProtectedResource(protectedConf *v1beta1.
_, err := ci.getPolicy(policyReference)
if err != nil {
return []Change{{Op: Delete, Resource: protectedEx}},
[]Problem{{Object: protectedConf, Reason: "Rejected", Message: fmt.Sprintf("dos protected refers (%s) to an invalid DosPolicy: %s", policyReference, err.Error())}}
[]Problem{{Object: protectedConf, Reason: nl.EventReasonRejected, Message: fmt.Sprintf("dos protected refers (%s) to an invalid DosPolicy: %s", policyReference, err.Error())}}
}
}
if protectedEx.Obj.Spec.DosSecurityLog != nil && protectedEx.Obj.Spec.DosSecurityLog.ApDosLogConf != "" {
Expand All @@ -185,7 +186,7 @@ func (ci *Configuration) AddOrUpdateDosProtectedResource(protectedConf *v1beta1.
_, err := ci.getLogConf(logConfReference)
if err != nil {
return []Change{{Op: Delete, Resource: protectedEx}},
[]Problem{{Object: protectedConf, Reason: "Rejected", Message: fmt.Sprintf("dos protected refers (%s) to an invalid DosLogConf: %s", logConfReference, err.Error())}}
[]Problem{{Object: protectedConf, Reason: nl.EventReasonRejected, Message: fmt.Sprintf("dos protected refers (%s) to an invalid DosLogConf: %s", logConfReference, err.Error())}}
}
}
return []Change{{Op: AddOrUpdate, Resource: protectedEx}}, nil
Expand Down
Loading

0 comments on commit 3dfb273

Please sign in to comment.