coredns/owners_generate.go

92 lines
1.6 KiB
Go
Raw Normal View History

plugin/chaos: add default list of authors (#2737) * plugin/chaos: add default list of authors Add a owners_generate.go that generates a Owners variables for use in the chaos plugin. Add a default list of authors in the authors.bind CH zone. When doing a query this now returns: ~~~ sh % dig authors.bind TXT CH ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5456 ;; flags: qr rd; QUERY: 1, ANSWER: 22, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;authors.bind. CH TXT ;; ANSWER SECTION: authors.bind. 0 CH TXT "bradbeam" authors.bind. 0 CH TXT "chrisohaver" authors.bind. 0 CH TXT "dilyevsky" authors.bind. 0 CH TXT "ekleiner" authors.bind. 0 CH TXT "fastest963" authors.bind. 0 CH TXT "fturib" authors.bind. 0 CH TXT "greenpau" authors.bind. 0 CH TXT "grobie" authors.bind. 0 CH TXT "inigohu" authors.bind. 0 CH TXT "isolus" authors.bind. 0 CH TXT "johnbelamaric" authors.bind. 0 CH TXT "miekg" authors.bind. 0 CH TXT "nchrisdk" authors.bind. 0 CH TXT "nitisht" authors.bind. 0 CH TXT "pmoroney" authors.bind. 0 CH TXT "rajansandeep" authors.bind. 0 CH TXT "rdrozhdzh" authors.bind. 0 CH TXT "rtreffer" authors.bind. 0 CH TXT "stp-ip" authors.bind. 0 CH TXT "superq" authors.bind. 0 CH TXT "varyoo" authors.bind. 0 CH TXT "yongtang" ~~~ This was hard to do previously as we didn't hardcode this in the source, but now with OWNERS files we can just generate this list. Privacy wise this isn't worse than being listed in OWNERS file in the first place. And it's a nice hat tip to the people making CoreDNS better. Signed-off-by: Miek Gieben <miek@miek.nl> * Sticklet bot comments Signed-off-by: Miek Gieben <miek@miek.nl>
2019-03-31 19:01:11 +01:00
//+build ignore
// generates plugin/chaos/zowners.go.
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"sort"
"gopkg.in/yaml.v2"
)
func main() {
o := map[string]struct{}{}
// top-level OWNERS file
o, err := owners("OWNERS", o)
if err != nil {
log.Fatal(err)
}
// each of the plugins, in case someone is not in the top-level one
err = filepath.Walk("plugin",
func(p string, i os.FileInfo, err error) error {
if err != nil {
return err
}
if i.IsDir() {
return nil
}
if path.Base(p) != "OWNERS" {
return nil
}
o, err = owners(p, o)
return err
})
// sort it and format it
list := []string{}
for k := range o {
list = append(list, k)
}
sort.Strings(list)
golist := `package chaos
// Owners are all GitHub handlers of all maintainers.
var Owners = []string{`
c := ", "
for i, a := range list {
if i == len(list)-1 {
c = "}"
}
golist += fmt.Sprintf("%q%s", a, c)
}
if err := ioutil.WriteFile("plugin/chaos/zowners.go", []byte(golist), 0644); err != nil {
log.Fatal(err)
}
return
}
// owners parses a owner file without knowning a whole lot about its structure.
func owners(path string, owners map[string]struct{}) (map[string]struct{}, error) {
file, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
c := yaml.MapSlice{}
err = yaml.Unmarshal(file, &c)
if err != nil {
return nil, err
}
for _, mi := range c {
key, ok := mi.Key.(string)
if !ok {
continue
}
if key == "approvers" {
for _, k := range mi.Value.([]interface{}) {
owners[k.(string)] = struct{}{}
}
}
}
return owners, nil
}