Check for duplicated sysctl keys
Signed-off-by: mmirecki <mmirecki@redhat.com>
This commit is contained in:
parent
93604ec20a
commit
7c452c77cd
@ -304,6 +304,9 @@ func restoreBackup(ifName, containerID, backupPath string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func cmdAdd(args *skel.CmdArgs) error {
|
func cmdAdd(args *skel.CmdArgs) error {
|
||||||
|
if err := validateSysctlConflictingKeys(args.StdinData); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
tuningConf, err := parseConf(args.StdinData, args.Args)
|
tuningConf, err := parseConf(args.StdinData, args.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -405,6 +408,9 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func cmdCheck(args *skel.CmdArgs) error {
|
func cmdCheck(args *skel.CmdArgs) error {
|
||||||
|
if err := validateSysctlConflictingKeys(args.StdinData); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
tuningConf, err := parseConf(args.StdinData, args.Args)
|
tuningConf, err := parseConf(args.StdinData, args.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -542,3 +548,25 @@ func readAllowlist() (bool, []string, error) {
|
|||||||
}
|
}
|
||||||
return true, allowList, nil
|
return true, allowList, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type sysctlKey string
|
||||||
|
|
||||||
|
type sysctlCheck struct {
|
||||||
|
SysCtl map[sysctlKey]string `json:"sysctl"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var sysctlDuplicatesMap = map[sysctlKey]interface{}{}
|
||||||
|
|
||||||
|
func (d *sysctlKey) UnmarshalText(data []byte) error {
|
||||||
|
key := sysctlKey(string(data))
|
||||||
|
if _, exists := sysctlDuplicatesMap[key]; exists {
|
||||||
|
return errors.New("duplicated sysctl keys are not allowed")
|
||||||
|
}
|
||||||
|
sysctlDuplicatesMap[key] = ""
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateSysctlConflictingKeys(data []byte) error {
|
||||||
|
sysctlCheck := sysctlCheck{}
|
||||||
|
return json.Unmarshal(data, &sysctlCheck)
|
||||||
|
}
|
||||||
|
@ -130,6 +130,7 @@ var _ = Describe("tuning plugin", func() {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
sysctlDuplicatesMap = map[sysctlKey]interface{}{}
|
||||||
})
|
})
|
||||||
|
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
@ -1122,5 +1123,53 @@ var _ = Describe("tuning plugin", func() {
|
|||||||
})
|
})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It(fmt.Sprintf("[%s] does not allow duplicated sysctl values", ver), func() {
|
||||||
|
conf := []byte(fmt.Sprintf(`{
|
||||||
|
"name": "test",
|
||||||
|
"type": "tuning",
|
||||||
|
"cniVersion": "%s",
|
||||||
|
"sysctl": {
|
||||||
|
"net.ipv4.conf.all.log_martians": "1",
|
||||||
|
"net.ipv4.conf.all.log_martians": "0"
|
||||||
|
},
|
||||||
|
"prevResult": {
|
||||||
|
"interfaces": [
|
||||||
|
{"name": "dummy0", "sandbox":"netns"}
|
||||||
|
],
|
||||||
|
"ips": [
|
||||||
|
{
|
||||||
|
"version": "4",
|
||||||
|
"address": "10.0.0.2/24",
|
||||||
|
"gateway": "10.0.0.1",
|
||||||
|
"interface": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}`, ver))
|
||||||
|
|
||||||
|
args := &skel.CmdArgs{
|
||||||
|
ContainerID: "dummy",
|
||||||
|
Netns: targetNS.Path(),
|
||||||
|
IfName: IFNAME,
|
||||||
|
StdinData: conf,
|
||||||
|
}
|
||||||
|
|
||||||
|
beforeConf = configToRestore{}
|
||||||
|
|
||||||
|
err := originalNS.Do(func(ns.NetNS) error {
|
||||||
|
defer GinkgoRecover()
|
||||||
|
|
||||||
|
_, _, err := testutils.CmdAddWithArgs(args, func() error {
|
||||||
|
return cmdAdd(args)
|
||||||
|
})
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
Expect(err.Error()).To(ContainSubstring("duplicated"))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user