diff --git a/tags/Makefile b/tags/Makefile new file mode 100644 index 000000000..098d3477b --- /dev/null +++ b/tags/Makefile @@ -0,0 +1,19 @@ +IMAGE_NAME=golang:1.18 +export GOPROXY?=https://proxy.golang.org + +default: \ + generate \ + +generate: + go run ./generator/app.go + +generate-dockerized: + docker run --rm -e WHAT -e GOPROXY -v $(shell pwd):/go/src/app:Z $(IMAGE_NAME) make -C /go/src/app generate + +test: + go test -v ./generator/... + +test-dockerized: + docker run --rm -v $(shell pwd):/go/src/app:Z $(IMAGE_NAME) make -C /go/src/app test + +.PHONY: default generate generate-dockerized test test-dockerized diff --git a/tags/generator/.gitignore b/tags/generator/.gitignore new file mode 100644 index 000000000..9ab870da8 --- /dev/null +++ b/tags/generator/.gitignore @@ -0,0 +1 @@ +generated/ diff --git a/tags/generator/app.go b/tags/generator/app.go new file mode 100644 index 000000000..50f71149c --- /dev/null +++ b/tags/generator/app.go @@ -0,0 +1,521 @@ +package main + +import ( + "fmt" + "io/ioutil" + "log" + "net/url" + "os" + "path/filepath" + "sort" + "strings" + "text/template" + "time" + + yaml "gopkg.in/yaml.v3" +) + +const ( + readmeTemplate = "readme.tmpl" + listTemplate = "list.tmpl" + liaisonsTemplate = "liaisons.tmpl" + headerTemplate = "header.tmpl" + + tagsYamlFile = "tags.yaml" + tagListOutput = "tag-list.md" + indexFilename = "README.md" + liaisonsFilename = "liaisons.md" + + beginCustomMarkdown = "" + endCustomMarkdown = "" + beginCustomYaml = "## BEGIN CUSTOM CONTENT" + endCustomYaml = "## END CUSTOM CONTENT" +) + +var ( + baseGeneratorDir = "" + templateDir = "generator" +) + +// FoldedString is a string that will be serialized in FoldedStyle by go-yaml +type FoldedString string + +// MarshalYAML customizes how FoldedStrings will be serialized by go-yaml +func (x FoldedString) MarshalYAML() (interface{}, error) { + return &yaml.Node{ + Kind: yaml.ScalarNode, + Style: yaml.FoldedStyle, + Value: string(x), + }, nil +} + +// Person represents an individual person holding a role in a group. +type Person struct { + GitHub string + Name string + Company string `yaml:"company,omitempty"` +} + +// Meeting represents a regular meeting for a group. +type Meeting struct { + Description string + Day string + Time string + TZ string + Frequency string + URL string `yaml:",omitempty"` + ArchiveURL string `yaml:"archive_url,omitempty"` + RecordingsURL string `yaml:"recordings_url,omitempty"` +} + +// Contact represents the various contact points for a group. +type Contact struct { + Slack string `yaml:",omitempty"` + MailingList string `yaml:"mailing_list,omitempty"` + PrivateMailingList string `yaml:"private_mailing_list,omitempty"` + GithubTeams []GithubTeam `yaml:"teams,omitempty"` + Liaisons []Person `yaml:"liaisons,omitempty"` +} + +// GithubTeam represents a specific Github Team. +type GithubTeam struct { + Name string + Description string `yaml:",omitempty"` +} + +// WorkingGroup represents a specific WorkingGroup owned by the group +type WorkingGroup struct { + Name string + Description string `yaml:",omitempty"` + CharterLink string `yaml:"charter_link,omitempty"` + Contact *Contact `yaml:",omitempty"` + Leads []Person `yaml:"leads,omitempty"` + Meetings []Meeting `yaml:",omitempty"` +} + +// LeadershipGroup represents the different groups of leaders within a group +type LeadershipGroup struct { + Chairs []Person + TechnicalLeads []Person `yaml:"tech_leads,omitempty"` + EmeritusLeads []Person `yaml:"emeritus_leads,omitempty"` +} + +// PrefixToPersonMap returns a map of prefix to persons, useful for iteration over all persons +func (g *LeadershipGroup) PrefixToPersonMap() map[string][]Person { + return map[string][]Person{ + "chair": g.Chairs, + "tech_lead": g.TechnicalLeads, + "emeritus_lead": g.EmeritusLeads, + } +} + +// Leads returns a sorted and de-duped list of Leads for a LeadershipGroup +func (g *LeadershipGroup) Leads() []Person { + o := append(g.Chairs, g.TechnicalLeads...) + + // Sort + sort.Slice(o, func(i, j int) bool { + return o[i].GitHub < o[j].GitHub + }) + + // De-dupe + seen := make(map[string]struct{}, len(o)) + i := 0 + for _, p := range o { + if _, ok := seen[p.GitHub]; ok { + continue + } + seen[p.GitHub] = struct{}{} + o[i] = p + i++ + } + return o[:i] +} + +// Group represents either a TAG +type Group struct { + Dir string + Prefix string `yaml:",omitempty"` + Name string + Objective string `yaml:"objective,omitempty"` + CharterLink string `yaml:"charter_link,omitempty"` + Leadership LeadershipGroup `yaml:"leadership"` + Meetings []Meeting + Contact Contact + WorkingGroups []WorkingGroup `yaml:"working_groups,omitempty"` +} + +type TAGName string + +func (n TAGName) DirName() string { + return DirName("tag", string(n)) +} + +// DirName returns the directory that a group's documentation will be +// generated into. It is composed of a prefix (tag for TAGs), +// and a formatted version of the group's name (in kebab case). +func (g *Group) DirName(prefix string) string { + return DirName(prefix, g.Name) +} + +func DirName(prefix, name string) string { + return fmt.Sprintf("%s-%s", prefix, strings.ToLower(strings.Replace(name, " ", "-", -1))) +} + +// Context is the context for the tags.yaml file. +type Context struct { + Tags []Group +} + +func index(groups []Group, predicate func(Group) bool) int { + for i, group := range groups { + if predicate(group) { + return i + } + } + return -1 +} + +// PrefixToGroupMap returns a map of prefix to groups, useful for iteration over all groups +func (c *Context) PrefixToGroupMap() map[string][]Group { + return map[string][]Group{ + "tag": c.Tags, + } +} + +// Complete populates derived portions of the Context struct +func (c *Context) Complete() { +} + +// Sort sorts all lists within the Context struct +func (c *Context) Sort() { + for _, groups := range c.PrefixToGroupMap() { + sort.Slice(groups, func(i, j int) bool { + return groups[i].Dir < groups[j].Dir + }) + for _, group := range groups { + + for _, people := range [][]Person{ + group.Leadership.Chairs, + group.Leadership.TechnicalLeads, + group.Leadership.EmeritusLeads} { + sort.Slice(people, func(i, j int) bool { + // This ensures that leads are ordered by github + return people[i].GitHub < people[j].GitHub + }) + } + sort.Slice(group.Meetings, func(i, j int) bool { + return group.Meetings[i].Description < group.Meetings[j].Description + }) + sort.Slice(group.Contact.GithubTeams, func(i, j int) bool { + return group.Contact.GithubTeams[i].Name < group.Contact.GithubTeams[j].Name + }) + sort.Slice(group.WorkingGroups, func(i, j int) bool { + return group.WorkingGroups[i].Name < group.WorkingGroups[j].Name + }) + for _, WorkingGroup := range group.WorkingGroups { + for _, people := range [][]Person{WorkingGroup.Leads} { + sort.Slice(people, func(i, j int) bool { + return people[i].GitHub < people[j].GitHub + }) + } + + if WorkingGroup.Contact != nil { + sort.Slice(WorkingGroup.Contact.GithubTeams, func(i, j int) bool { + return WorkingGroup.Contact.GithubTeams[i].Name < WorkingGroup.Contact.GithubTeams[j].Name + }) + } + sort.Slice(WorkingGroup.Meetings, func(i, j int) bool { + return WorkingGroup.Meetings[i].Description < WorkingGroup.Meetings[j].Description + }) + } + } + } +} + +// Validate returns a list of errors encountered while validating a Context +func (c *Context) Validate() []error { + errors := []error{} + people := make(map[string]Person) + + for prefix, groups := range c.PrefixToGroupMap() { + for _, group := range groups { + expectedDir := group.DirName(prefix) + if expectedDir != group.Dir { + errors = append(errors, fmt.Errorf("expected dir: %s, got: %s", expectedDir, group.Dir)) + } + + for prefix, persons := range group.Leadership.PrefixToPersonMap() { + for _, person := range persons { + if val, ok := people[person.GitHub]; ok { + if val.Name != person.Name || (prefix != "emeritus_lead" && val.Company != person.Company) { + errors = append(errors, fmt.Errorf("%s: %ss: expected person: %v, got: %v", group.Dir, prefix, val, person)) + } + } else if prefix != "emeritus_lead" { + people[person.GitHub] = person + } + + if prefix == "emeritus_lead" && person.Company != "" { + errors = append(errors, fmt.Errorf("%s: emeritus leads should not have company specified; company specified for: %s", group.Dir, person.Name)) + } + } + } + + if prefix == "tag" { + if group.CharterLink == "" { + errors = append(errors, fmt.Errorf("%s: has no charter", group.Dir)) + } + if group.Objective == "" { + errors = append(errors, fmt.Errorf("%s: has no objective", group.Dir)) + } + } + } + } + return errors +} + +func pathExists(path string) bool { + _, err := os.Stat(path) + return err == nil +} + +func createDirIfNotExists(path string) error { + if !pathExists(path) { + return os.MkdirAll(path, 0755) + } + return nil +} + +func getExistingContent(path string, fileFormat string) (string, error) { + capture := false + var captured []string + + beginMarker := "" + endMarker := "" + switch fileFormat { + case "markdown": + beginMarker = beginCustomMarkdown + endMarker = endCustomMarkdown + case "yaml": + beginMarker = beginCustomYaml + endMarker = endCustomYaml + case "": + return "", nil + } + + // NOTE: For some reason using bufio.Scanner with existing file pointer prepends + // a bunch of null ^@ characters, so using to ioutil.ReadFile instead. + content, err := ioutil.ReadFile(path) + if err != nil { + return "", err + } + + for _, line := range strings.Split(string(content), "\n") { + if strings.Contains(line, endMarker) { + capture = false + } + if capture { + captured = append(captured, line) + } + if strings.Contains(line, beginMarker) { + capture = true + } + } + + return strings.Join(captured, "\n"), nil +} + +var funcMap = template.FuncMap{ + "tzUrlEncode": tzURLEncode, + "trimSpace": strings.TrimSpace, + "trimSuffix": strings.TrimSuffix, + "now": time.Now, + "lastYear": lastYear, + "toUpper": strings.ToUpper, +} + +// lastYear returns the last year as a string +func lastYear() string { + return time.Now().AddDate(-1, 0, 0).Format("2006") +} + +// tzUrlEncode returns a url encoded string without the + shortcut. This is +// required as the timezone conversion site we are using doesn't recognize + as +// a valid url escape character. +func tzURLEncode(tz string) string { + return strings.Replace(url.QueryEscape(tz), "+", "%20", -1) +} + +func writeTemplate(templatePath, outputPath string, fileFormat string, data interface{}) error { + // set up template + t, err := template.New(filepath.Base(templatePath)). + Funcs(funcMap). + ParseFiles(templatePath, filepath.Join(baseGeneratorDir, templateDir, headerTemplate)) + if err != nil { + return err + } + + // create if not exists + if !pathExists(outputPath) { + _, err = os.Create(outputPath) + if err != nil { + return err + } + } + + // open file and truncate + f, err := os.OpenFile(outputPath, os.O_RDWR, 0644) + if err != nil { + return err + } + defer f.Close() + + // get any existing content + content, err := getExistingContent(outputPath, fileFormat) + if err != nil { + return err + } + + // ensure file is empty + f.Truncate(0) + + // generated content + err = t.Execute(f, data) + if err != nil { + return err + } + + writeCustomContentBlock(f, content, fileFormat) + + return nil +} + +func writeCustomContentBlock(f *os.File, content string, fileFormat string) { + beginMarker := "" + endMarker := "" + switch fileFormat { + case "markdown": + beginMarker = beginCustomMarkdown + endMarker = endCustomMarkdown + case "yaml": + beginMarker = beginCustomYaml + endMarker = endCustomYaml + case "": + return + } + + lines := []string{beginMarker, "\n", content, "\n", endMarker, "\n"} + for _, line := range lines { + f.Write([]byte(line)) + } +} + +func createGroupReadme(groups []Group, prefix string) error { + // figure out if the user wants to generate one group + var selectedGroupName *string + if envVal, ok := os.LookupEnv("WHAT"); ok { + selectedGroupName = &envVal + } + + for _, group := range groups { + // skip generation if the user specified only one group + if selectedGroupName != nil && strings.HasSuffix(group.Dir, *selectedGroupName) == false { + fmt.Printf("Skipping %s/README.md\n", group.Dir) + continue + } + + fmt.Printf("Generating %s/README.md\n", group.Dir) + + outputDir := filepath.Join(baseGeneratorDir, group.Dir) + if err := createDirIfNotExists(outputDir); err != nil { + return err + } + + outputPath := filepath.Join(outputDir, indexFilename) + readmePath := filepath.Join(baseGeneratorDir, templateDir, fmt.Sprintf("%s_%s", prefix, readmeTemplate)) + if err := writeTemplate(readmePath, outputPath, "markdown", group); err != nil { + return err + } + } + + return nil +} + +// readYaml decodes yaml stored in a file at path into the +// specified yaml.Node +func readYaml(path string, data interface{}) error { + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + decoder := yaml.NewDecoder(file) + decoder.KnownFields(true) + return decoder.Decode(data) +} + +// writeYaml writes the specified data to a file at path +// indent is set to 2 spaces +func writeYaml(data interface{}, path string) error { + file, err := os.Create(path) + if err != nil { + return err + } + defer file.Close() + enc := yaml.NewEncoder(file) + enc.SetIndent(2) + return enc.Encode(data) +} + +func main() { + yamlPath := filepath.Join(baseGeneratorDir, tagsYamlFile) + var ctx Context + + err := readYaml(yamlPath, &ctx) + if err != nil { + log.Fatal(err) + } + + ctx.Complete() + + ctx.Sort() + + fmt.Printf("Validating %s\n", yamlPath) + errs := ctx.Validate() + if len(errs) != 0 { + for _, err := range errs { + fmt.Fprintf(os.Stderr, "ERROR: %s\n", err.Error()) + } + os.Exit(1) + } + + // Write the Context struct back to yaml to enforce formatting + err = writeYaml(&ctx, yamlPath) + if err != nil { + log.Fatal(err) + } + + fmt.Println("Generating group READMEs") + for prefix, groups := range ctx.PrefixToGroupMap() { + err = createGroupReadme(groups, prefix) + if err != nil { + log.Fatal(err) + } + } + + fmt.Println("Generating tag-list.md") + outputPath := filepath.Join(baseGeneratorDir, tagListOutput) + err = writeTemplate(filepath.Join(baseGeneratorDir, templateDir, listTemplate), outputPath, "markdown", ctx) + if err != nil { + log.Fatal(err) + } + + fmt.Println("Generating liaisons.md") + outputPath = filepath.Join(baseGeneratorDir, liaisonsFilename) + err = writeTemplate(filepath.Join(baseGeneratorDir, templateDir, liaisonsTemplate), outputPath, "markdown", ctx) + if err != nil { + log.Fatal(err) + } + + fmt.Println("Finished generation!") +} diff --git a/tags/generator/app_test.go b/tags/generator/app_test.go new file mode 100644 index 000000000..c670732dd --- /dev/null +++ b/tags/generator/app_test.go @@ -0,0 +1,201 @@ +/* +Copyright 2017 The Kubernetes Authors. + +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 main + +import ( + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" +) + +func TestNonExistentDirIsCreated(t *testing.T) { + dir := "/tmp/nonexistent" + err := createDirIfNotExists(dir) + if err != nil { + t.Fatalf("Received error creating dir: %v", err) + } + if !pathExists(dir) { + t.Fatalf("%s should exist", dir) + } +} + +func TestExistentDirNotCreated(t *testing.T) { + dir := "./testdata" + err := createDirIfNotExists(dir) + if err != nil { + t.Fatalf("Received error creating dir: %v", err) + } +} + +func TestWriteTemplate(t *testing.T) { + baseGeneratorDir = "generated" + templateDir = "../../generator" + + customContent := ` + +Example +custom +content! + + +` + + cases := []struct { + templatePath string + outputPath string + data map[string]string + expectErr bool + fileFormat string + expected string + }{ + { + templatePath: "./testdata/non_existent_template.tmpl", + expectErr: true, + fileFormat: "markdown", + }, + { + templatePath: "./testdata/example.tmpl", + outputPath: "/tmp/non_existing_path.md", + expectErr: false, + fileFormat: "markdown", + data: map[string]string{"Message": "Hello!"}, + expected: "Hello!", + }, + { + templatePath: "./testdata/example.tmpl", + outputPath: "./testdata/example.md", + expectErr: false, + fileFormat: "markdown", + data: map[string]string{"Message": "Hello!"}, + expected: customContent, + }, + } + + for _, c := range cases { + err := writeTemplate(c.templatePath, c.outputPath, c.fileFormat, c.data) + if err != nil && c.expectErr == false { + t.Fatalf("Received unexpected error for %s: %v", c.templatePath, err) + } + if c.expectErr { + if err == nil { + t.Fatalf("Expected error for %s but received none", c.templatePath) + } + continue + } + content, err := ioutil.ReadFile(c.outputPath) + if err != nil { + t.Fatalf("%s should exist", c.outputPath) + } + if strings.Contains(string(content), c.expected) == false { + t.Fatalf("%s was not found in %s", c.expected, c.outputPath) + } + } +} + +func TestGroupDirName(t *testing.T) { + group := Group{Name: "Foo Bar"} + if group.DirName("tag") != "tag-foo-bar" { + t.Fatal("DirName incorrect") + } +} + +func TestCreateGroupReadmes(t *testing.T) { + baseGeneratorDir = "generated" + templateDir = "../../generator" + const groupType = "tag" + + groups := []Group{} + for _, n := range []string{"Foo", "Bar"} { + g := Group{Name: n} + g.Dir = g.DirName(groupType) + groups = append(groups, g) + } + + err := createGroupReadme(groups, groupType) + if err != nil { + t.Fatal(err) + } + + for _, group := range groups { + path := filepath.Join(baseGeneratorDir, group.DirName(groupType), "README.md") + if !pathExists(path) { + t.Fatalf("%s should exist", path) + } + } +} + +func TestReadmesAreSkipped(t *testing.T) { + baseGeneratorDir = "generated" + templateDir = "../../generator" + + os.Setenv("TAG", "tag-foo") + + groups := []Group{ + {Name: "Foo"}, + {Name: "Bar"}, + } + + err := createGroupReadme(groups, "tag") + if err != nil { + t.Fatal(err) + } + + for _, group := range groups[1:] { + path := filepath.Join(baseGeneratorDir, group.DirName("tag"), "README.md") + if !pathExists(path) { + t.Fatalf("%s should exist", path) + } + } + + os.Setenv("TAG", "") +} + +func copyFile(src, dst string) error { + // Read all content of src to data + data, err := ioutil.ReadFile(src) + if err != nil { + return err + } + // Write data to dst + err = ioutil.WriteFile(dst, data, 0644) + if err != nil { + return err + } + return nil +} + +func TestFullGeneration(t *testing.T) { + baseGeneratorDir = "generated" + templateDir = "../../generator" + + err := copyFile("testdata/tags.yaml", "generated/tags.yaml") + if err != nil { + t.Fatalf("Error received: %v", err) + } + + main() + + expectedDirs := []string{"tag-foo", "tag-bar"} + for _, ed := range expectedDirs { + path := filepath.Join(baseGeneratorDir, ed, "README.md") + if !pathExists(path) { + t.Fatalf("%s should exist", path) + } + } +} diff --git a/tags/generator/go.sum b/tags/generator/go.sum new file mode 100644 index 000000000..a62c313c5 --- /dev/null +++ b/tags/generator/go.sum @@ -0,0 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tags/generator/header.tmpl b/tags/generator/header.tmpl new file mode 100644 index 000000000..84af60dfb --- /dev/null +++ b/tags/generator/header.tmpl @@ -0,0 +1,9 @@ +{{- define "header" -}} + +{{- end -}} diff --git a/tags/generator/liaisons.tmpl b/tags/generator/liaisons.tmpl new file mode 100644 index 000000000..4ab16b662 --- /dev/null +++ b/tags/generator/liaisons.tmpl @@ -0,0 +1,11 @@ +{{ template "header" }} + +# TOC Liaisons + +| TAG | TOC Liaison(s) | +| ----| ---------------| +{{- range .Tags}} +{{- if .Contact.Liaisons }} +| [TAG {{.Name}}]({{.Dir}}/README.md) |{{- range .Contact.Liaisons }}* {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**)
{{- end }}| +{{- end }} +{{- end -}} diff --git a/tags/generator/list.tmpl b/tags/generator/list.tmpl new file mode 100644 index 000000000..9d34da296 --- /dev/null +++ b/tags/generator/list.tmpl @@ -0,0 +1,23 @@ +{{ template "header" }} + +Most community activity is organized into Technical Advisory Groups (TAGs). +Each TAG may have several Working Groups (WGs). + +### Technical Advisory Groups (TAGs) + +| Name | Contact | Meetings | Working Group(s) | +|------|---------|----------|------------------| +{{- range .Tags}} +|[{{.Name}}]({{.Dir}}/README.md)|* [Slack](https://kubernetes.slack.com/messages/{{.Contact.Slack}})
* [Mailing List]({{.Contact.MailingList}})|{{- range .Meetings -}} + * {{.Description}}: [{{.Day}}s at {{.Time}} {{.TZ}} ({{.Frequency}})]({{.URL}})
+{{- end -}} +{{- range .WorkingGroups -}} + {{ $name := .Name }} + {{- range .Meetings -}} + * {{ $name }}: [{{.Day}}s at {{.Time}} {{.TZ}} ({{.Frequency}})]({{.URL}})
+ {{- end -}} +{{- end -}}| +{{- range .WorkingGroups -}} + * {{.Name}} +{{- end -}}| +{{- end }} diff --git a/tags/generator/tag_readme.tmpl b/tags/generator/tag_readme.tmpl new file mode 100644 index 000000000..4767c8419 --- /dev/null +++ b/tags/generator/tag_readme.tmpl @@ -0,0 +1,115 @@ +{{- template "header" }} +# TAG {{.Name}} + +{{ .Objective }} +{{- if .CharterLink }} +The [charter]({{.CharterLink}}) defines the scope and governance of the TAG {{.Name}}. +{{ end }} +{{ if .Meetings -}} +## Meetings + +{{- if .Contact.MailingList }} +*Joining the [mailing list]({{.Contact.MailingList}}) for the group will typically add invites for the following meetings to your calendar.* +{{- end }} + +{{- range .Meetings }} +* {{.Description}}: [{{.Day}}s at {{.Time}} {{.TZ}}]({{.URL}}) ({{.Frequency}}). [Convert to your timezone](http://www.thetimezoneconverter.com/?t={{.Time}}&tz={{.TZ | tzUrlEncode}}). +{{- if .ArchiveURL }} + * [Meeting notes and Agenda]({{.ArchiveURL}}). +{{- end }} +{{- if .RecordingsURL }} + * [Meeting recordings]({{.RecordingsURL}}). +{{- end }} +{{- end }} + +{{- end }} +{{- if .Leadership }} + +## Leadership +{{- if .Leadership.Chairs }} + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. +{{ range .Leadership.Chairs }} +* {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**){{if .Company}}, {{.Company}}{{end}} +{{- end }} +{{- end }} +{{- if .Leadership.TechnicalLeads }} + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. +{{ range .Leadership.TechnicalLeads }} +* {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**){{if .Company}}, {{.Company}}{{end}} +{{- end }} +{{- end }} +{{- if .Leadership.EmeritusLeads }} + +## Emeritus Leads +{{ range .Leadership.EmeritusLeads }} +* {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**) +{{- end }} +{{- end }} +{{- end }} + +## Contact +- Slack: [#{{.Contact.Slack}}](https://cloud-native.slack.com/messages/{{.Contact.Slack}}) +- [Mailing list]({{.Contact.MailingList}}) +{{- if .Contact.GithubTeams }} +- GitHub Teams: +{{- range .Contact.GithubTeams }} + - [@cncf/{{.Name}}](https://github.com/orgs/cncf/teams/{{.Name}}) {{- if .Description }} - {{.Description}} {{- end}} +{{- end }} +{{- end }} +{{- if .Contact.Liaisons }} +- TOC Liaisons: +{{- range .Contact.Liaisons }} + - {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**) +{{- end }} +{{- end }} + +{{- if .WorkingGroups }} + +## Working Groups + +The following Working Groups are owned by TAG {{.Name}}: + +{{- range .WorkingGroups }} +### {{.Name}} +{{- if .Description }} +{{ trimSpace .Description }} +{{- end }} +{{- if .Leads }} +- **Leads:** +{{ range .Leads }} + - {{.Name}} (**[@{{.GitHub}}](https://github.com/{{.GitHub}})**){{if .Company}}, {{.Company}}{{end}} +{{- end }} +{{- end }} +{{- if .Contact }} +- **Contact:** +{{- if .Contact.Slack }} + - Slack: [#{{.Contact.Slack}}](https://kubernetes.slack.com/messages/{{.Contact.Slack}}) +{{- end }} +{{- if .Contact.MailingList }} + - [Mailing List]({{.Contact.MailingList}}) +{{- end }} +{{- if .Contact.GithubTeams }} + - GitHub Teams: +{{- range .Contact.GithubTeams }} + - [@cncf/{{.Name}}](https://github.com/orgs/cncf/teams/{{.Name}}) {{- if .Description }} - {{.Description}}{{- end}} +{{- end }} +{{- end }} +{{- end }} +{{- if .Meetings }} +- **Meetings:** +{{- range .Meetings }} + - {{.Description}}: [{{.Day}}s at {{.Time}} {{.TZ}}]({{.URL}}) ({{.Frequency}}). [Convert to your timezone](http://www.thetimezoneconverter.com/?t={{.Time}}&tz={{.TZ | tzUrlEncode}}). +{{- if .ArchiveURL }} + - [Meeting notes and Agenda]({{.ArchiveURL}}). +{{- end }} +{{- if .RecordingsURL }} + - [Meeting recordings]({{.RecordingsURL}}). +{{- end }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/tags/generator/testdata/example.md b/tags/generator/testdata/example.md new file mode 100644 index 000000000..9016ae833 --- /dev/null +++ b/tags/generator/testdata/example.md @@ -0,0 +1,7 @@ +Hello! + +Example +custom +content! + + diff --git a/tags/generator/testdata/example.tmpl b/tags/generator/testdata/example.tmpl new file mode 100644 index 000000000..287ff1919 --- /dev/null +++ b/tags/generator/testdata/example.tmpl @@ -0,0 +1 @@ +{{.Message}} diff --git a/tags/generator/testdata/tags.yaml b/tags/generator/testdata/tags.yaml new file mode 100644 index 000000000..6b7410092 --- /dev/null +++ b/tags/generator/testdata/tags.yaml @@ -0,0 +1,60 @@ +tags: + - dir: tag-foo + name: Foo + charter_link: foo-charter + objective: covers foo + leadership: + chairs: + - github: tag-foo-chair + name: TAG Foo Chair + company: TAG Foo Chair's Company + tech_leads: + - github: tag-foo-tech-lead + name: TAG Foo Tech Lead + company: TAG Foo Tech Lead's Company + contact: + slack: tag-foo + mailing_list: lists.cncf.io/g/cncf-tag-foo + liaisons: + - github: tag-foo-liaison-1 + name: TAG Foo TOC Liaison 1 + - github: tag-foo-liaison-2 + name: TAG Foo TOC Liaison 2 + meetings: + - description: TAG Foo's Main Meeting + day: Thursday + time: "09:00" + tz: PT (Pacific Time) + frequency: biweekly + archive_url: google-docs-link + working_groups: + - name: Working Group Foo + description: covers wg-foo's work + charter_link: wg-foo-charter + leads: + - github: jane-doe + name: Jane Doe + contact: + slack: wg-foo + mailing_list: lists.cncf.io/g/cncf-wg-foo + meetings: + - description: WG Foo's Main Meeting + day: Thursday + time: "09:00" + tz: PT (Pacific Time) + frequency: biweekly + archive_url: google-docs-link + - dir: tag-bar + name: Bar + charter_link: charter-bar + objective: owns areas related to bar + leadership: + chairs: + - github: tag-bar-chair + name: TAG Bar Chair + company: TAG Bar Chair's Company + tech_leads: + - github: tag-bar-tech-lead + name: TAG Bar Tech Lead + company: TAG Bar Tech Lead's Company + diff --git a/tags/go.mod b/tags/go.mod new file mode 100644 index 000000000..3d5fa979e --- /dev/null +++ b/tags/go.mod @@ -0,0 +1,5 @@ +module github.com/cncf/toc/tags + +go 1.19 + +require gopkg.in/yaml.v3 v3.0.1 diff --git a/tags/go.sum b/tags/go.sum new file mode 100644 index 000000000..a62c313c5 --- /dev/null +++ b/tags/go.sum @@ -0,0 +1,4 @@ +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tags/liaisons.md b/tags/liaisons.md new file mode 100644 index 000000000..f2b7254e4 --- /dev/null +++ b/tags/liaisons.md @@ -0,0 +1,22 @@ + + +# TOC Liaisons + +| TAG | TOC Liaison(s) | +| ----| ---------------| +| [TAG App Delivery](tag-app-delivery/README.md) |* Davanum Srinivas (**[@dims](https://github.com/dims)**)
* Lei Zhang (**[@resouer](https://github.com/resouer)**)
* Cathy Zhang (**[@cathyhongzhang](https://github.com/cathyhongzhang)**)
| +| [TAG Contributor Strategy](tag-contributor-strategy/README.md) |* Matt Farina (**[@mattfarina](https://github.com/mattfarina)**)
* Katie Gamanji (**[@kgamanji](https://github.com/kgamanji)**)
* Cathy Zhang (**[@cathyhongzhang](https://github.com/cathyhongzhang)**)
| +| [TAG Environmental Sustainability](tag-environmental-sustainability/README.md) |* Erin Boyd (**[@erinboyd](https://github.com/erinboyd)**)
| +| [TAG Network](tag-network/README.md) |* Davanum Srinivas (**[@dims](https://github.com/dims)**)
* Dave Zolotusky (**[@dzolotusky](https://github.com/dzolotusky)**)
| +| [TAG Observability](tag-observability/README.md) |* Lei Zhang (**[@resouer](https://github.com/resouer)**)
* Cathy Zhang (**[@cathyhongzhang](https://github.com/cathyhongzhang)**)
| +| [TAG Runtime](tag-runtime/README.md) |* Ricardo Rocha (**[@rochaporto](https://github.com/rochaporto)**)
* Richard Hartmann (**[@RichiH](https://github.com/RichiH)**)
* Davanum Srinivas (**[@dims](https://github.com/dims)**)
| +| [TAG Security](tag-security/README.md) |* Emily Fox (**[@TheFoxAtWork](https://github.com/TheFoxAtWork)**)
* Justin Cormack (**[@justincormack](https://github.com/justincormack)**)
| +| [TAG Storage](tag-storage/README.md) |* Richard Hartmann (**[@RichiH](https://github.com/RichiH)**)
* Erin Boyd (**[@erinboyd](https://github.com/erinboyd)**)
| + + diff --git a/tags/tag-app-delivery/README.md b/tags/tag-app-delivery/README.md new file mode 100644 index 000000000..13000afd8 --- /dev/null +++ b/tags/tag-app-delivery/README.md @@ -0,0 +1,44 @@ + +# TAG App Delivery + +The Application Delivery TAG focuses on delivering cloud native applications which involves multiple phases including building, deploying, managing, and operating. Additionally, the TAG produces supporting material and best practices for end-users, and provide guidance and coordination for CNCF projects working within the TAG’s scope. + +The [charter](charter.md) defines the scope and governance of the TAG App Delivery. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-app-delivery) for the group will typically add invites for the following meetings to your calendar.* +* TAG App Delivery Meeting: [Wednesdays at 08:00 PT (Pacific Time)]() (1st and 3rd Wednesday). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=08:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://docs.google.com/document/d/1OykvqvhSG4AxEdmDMXilrupsX2n1qCSJUWwTc3I7AOs/edit). + * [Meeting recordings](https://youtube.com/playlist?list=PLjNzvzqUSpxJ0JfD6vrdF5bsuBaJQ2BRT). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Alois Reitbauer (**[@AloisReitbauer](https://github.com/AloisReitbauer)**) +* Jennifer Strejevitch (**[@Jenniferstrej](https://github.com/Jenniferstrej)**) +* Hongchao Deng (**[@hongchaodeng](https://github.com/hongchaodeng)**) + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. + +* Alex Jones (**[@AlexsJones](https://github.com/AlexsJones)**), Canonical +* Thomas Schuetz (**[@thschue](https://github.com/thschue)**), Dynatrace + +## Contact +- Slack: [#tag-app-delivery](https://cloud-native.slack.com/messages/tag-app-delivery) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-app-delivery) +- TOC Liaisons: + - Davanum Srinivas (**[@dims](https://github.com/dims)**) + - Lei Zhang (**[@resouer](https://github.com/resouer)**) + - Cathy Zhang (**[@cathyhongzhang](https://github.com/cathyhongzhang)**) + + + diff --git a/tags/app-delivery.md b/tags/tag-app-delivery/charter.md similarity index 100% rename from tags/app-delivery.md rename to tags/tag-app-delivery/charter.md diff --git a/tags/tag-contributor-strategy/README.md b/tags/tag-contributor-strategy/README.md new file mode 100644 index 000000000..f670714c8 --- /dev/null +++ b/tags/tag-contributor-strategy/README.md @@ -0,0 +1,50 @@ + +# TAG Contributor Strategy + +The Contributor Strategy TAG is responsible for contributor experience, sustainability, governance, and openness guidance to help CNCF community groups and projects with their own contributor strategies for a healthy project. + +The [charter](charter.md) defines the scope and governance of the TAG Contributor Strategy. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-contributor-strategy) for the group will typically add invites for the following meetings to your calendar.* +* TAG Contributor Strategy Meeting: [Thursdays at 10:00 PT (Pacific Time)]() (1st Thursdays). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=10:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://docs.google.com/document/d/1Xjw-yAqidQW67zv7OfMRErsfCotc-mfQ_248Te_YL0g/edit). + * [Meeting recordings](https://youtube.com/playlist?list=PLgKVE_JHGShqKzw_Z93cWPSc4MJV7OOo1). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Dawn Foster (**[@geekygirldawn](https://github.com/geekygirldawn)**), VMware +* Josh Berkus (**[@jberkus](https://github.com/jberkus)**), Red Hat + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. + +* Carolyn Van Slyck (**[@carolynvs](https://github.com/carolynvs)**), Microsoft + +## Contact +- Slack: [#tag-contributor-strategy](https://cloud-native.slack.com/messages/tag-contributor-strategy) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-contributor-strategy) +- TOC Liaisons: + - Matt Farina (**[@mattfarina](https://github.com/mattfarina)**) + - Katie Gamanji (**[@kgamanji](https://github.com/kgamanji)**) + - Cathy Zhang (**[@cathyhongzhang](https://github.com/cathyhongzhang)**) + +## Working Groups + +The following Working Groups are owned by TAG Contributor Strategy: +### Working Group Contributor Growth +- **Meetings:** + - WG Contributor Growth Meeting: [Thursdays at 10:00 PT (Pacific Time)]() (4th Thursdays). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=10:00&tz=PT%20%28Pacific%20Time%29). + - [Meeting notes and Agenda](https://docs.google.com/document/d/1Kx7tZv5wTXQ7uRKxn5d9d2wLsI3Q3Q51A0i06nLvtdI/edit). + + + diff --git a/tags/contributor-strategy.md b/tags/tag-contributor-strategy/charter.md similarity index 100% rename from tags/contributor-strategy.md rename to tags/tag-contributor-strategy/charter.md diff --git a/tags/tag-environmental-sustainability/README.md b/tags/tag-environmental-sustainability/README.md new file mode 100644 index 000000000..1b0dd6932 --- /dev/null +++ b/tags/tag-environmental-sustainability/README.md @@ -0,0 +1,28 @@ + +# TAG Environmental Sustainability + +This Environmental Sustainability TAG's goal is to advocate for, develop, support, and help evaluate environmental sustainability initiatives in cloud native technologies + +The [charter](charter.md) defines the scope and governance of the TAG Environmental Sustainability. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-env-sustainability) for the group will typically add invites for the following meetings to your calendar.* +* TAG Environmental Sustainability Meeting: [Wednesdays at 08:00 PT (Pacific Time)]() (1st and 3rd Wednesday). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=08:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://docs.google.com/document/d/1TkmMyXJABC66NfYmivnh7z8Y_vpq9f9foaOuDVQS_Lo/edit). + +## Leadership + +## Contact +- Slack: [#tag-environmental-sustainability](https://cloud-native.slack.com/messages/tag-environmental-sustainability) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-env-sustainability) +- TOC Liaisons: + - Erin Boyd (**[@erinboyd](https://github.com/erinboyd)**) + + + diff --git a/tags/environmentalsustainability.md b/tags/tag-environmental-sustainability/charter.md similarity index 100% rename from tags/environmentalsustainability.md rename to tags/tag-environmental-sustainability/charter.md diff --git a/tags/tag-list.md b/tags/tag-list.md new file mode 100644 index 000000000..fc631c696 --- /dev/null +++ b/tags/tag-list.md @@ -0,0 +1,26 @@ + + +Most community activity is organized into Technical Advisory Groups (TAGs). +Each TAG may have several Working Groups (WGs). + +### Technical Advisory Groups (TAGs) + +| Name | Contact | Meetings | Working Group(s) | +|------|---------|----------|------------------| +|[App Delivery](tag-app-delivery/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-app-delivery)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-app-delivery)|* TAG App Delivery Meeting: [Wednesdays at 08:00 PT (Pacific Time) (1st and 3rd Wednesday)]()
|| +|[Contributor Strategy](tag-contributor-strategy/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-contributor-strategy)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-contributor-strategy)|* TAG Contributor Strategy Meeting: [Thursdays at 10:00 PT (Pacific Time) (1st Thursdays)]()
* Working Group Contributor Growth: [Thursdays at 10:00 PT (Pacific Time) (4th Thursdays)]()
|* Working Group Contributor Growth| +|[Environmental Sustainability](tag-environmental-sustainability/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-environmental-sustainability)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-env-sustainability)|* TAG Environmental Sustainability Meeting: [Wednesdays at 08:00 PT (Pacific Time) (1st and 3rd Wednesday)]()
|| +|[Network](tag-network/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-network)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-network)|* TAG Network Meeting: [Thursdays at 11:00 PT (Pacific Time) (1st and 3rd Thursdays)]()
|| +|[Observability](tag-observability/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-observability)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-observability)|* TAG Observability Meeting: [Tuesdays at 04:00 UTC (2nd Tuesdays)]()
|| +|[Runtime](tag-runtime/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-runtime)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-runtime)|* TAG Runtime Meeting: [Thursdays at 08:00 PT (Pacific Time) (1st and 3rd Thursdays)]()
|| +|[Security](tag-security/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-security)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-security)|* TAG Security Meeting: [Wednesdays at 10:00 PT (Pacific Time) (weekly)]()
|| +|[Storage](tag-storage/README.md)|* [Slack](https://kubernetes.slack.com/messages/tag-runtime)
* [Mailing List](https://lists.cncf.io/g/cncf-tag-runtime)|* TAG Storage Meeting: [Wednesdays at 08:00 PT (Pacific Time) (2nd and 4th Wednesdays)]()
|| + + + diff --git a/tags/tag-network/README.md b/tags/tag-network/README.md new file mode 100644 index 000000000..10422fea3 --- /dev/null +++ b/tags/tag-network/README.md @@ -0,0 +1,36 @@ + +# TAG Network + +TAG Network's mission is to enable widespread and successful development, deployment and operation of resilient and intelligent network systems in cloud native environments. + +The [charter](charter.md) defines the scope and governance of the TAG Network. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-network) for the group will typically add invites for the following meetings to your calendar.* +* TAG Network Meeting: [Thursdays at 11:00 PT (Pacific Time)]() (1st and 3rd Thursdays). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=11:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://docs.google.com/document/d/18hYemFKK_PC_KbT_TDBUgb0rknOuIhikkRxer4_bv4Q/edit#). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Ed Warnicke (**[@edwarnicke](https://github.com/edwarnicke)**), Cisco +* Ken Owens (**[@kenowens12](https://github.com/kenowens12)**), Mastercard +* Lee Calcote (**[@leecalcote](https://github.com/leecalcote)**), Layer5 + +## Contact +- Slack: [#tag-network](https://cloud-native.slack.com/messages/tag-network) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-network) +- TOC Liaisons: + - Davanum Srinivas (**[@dims](https://github.com/dims)**) + - Dave Zolotusky (**[@dzolotusky](https://github.com/dzolotusky)**) + + + diff --git a/tags/network.md b/tags/tag-network/charter.md similarity index 100% rename from tags/network.md rename to tags/tag-network/charter.md diff --git a/tags/tag-observability/README.md b/tags/tag-observability/README.md new file mode 100644 index 000000000..7ce405f52 --- /dev/null +++ b/tags/tag-observability/README.md @@ -0,0 +1,40 @@ + +# TAG Observability + +This TAG focuses on topics pertaining to the observation of cloud native workloads. + +The [charter](charter.md) defines the scope and governance of the TAG Observability. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-observability) for the group will typically add invites for the following meetings to your calendar.* +* TAG Observability Meeting: [Tuesdays at 04:00 UTC]() (2nd Tuesdays). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=04:00&tz=UTC). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Richard Hartmann (**[@RichiH](https://github.com/RichiH)**), Grafana Labs +* Alolita Sharma (**[@alolita](https://github.com/alolita)**) +* Matt Young (**[@halcyondude](https://github.com/halcyondude)**) + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. + +* Bartłomiej Płotka (**[@bwplotka](https://github.com/bwplotka)**), Red Hat + +## Contact +- Slack: [#tag-observability](https://cloud-native.slack.com/messages/tag-observability) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-observability) +- TOC Liaisons: + - Lei Zhang (**[@resouer](https://github.com/resouer)**) + - Cathy Zhang (**[@cathyhongzhang](https://github.com/cathyhongzhang)**) + + + diff --git a/tags/observability.md b/tags/tag-observability/charter.md similarity index 100% rename from tags/observability.md rename to tags/tag-observability/charter.md diff --git a/tags/tag-runtime/README.md b/tags/tag-runtime/README.md new file mode 100644 index 000000000..82b9f2c1b --- /dev/null +++ b/tags/tag-runtime/README.md @@ -0,0 +1,42 @@ + +# TAG Runtime + +The Runtime TAG focuses on Workload execution and management systems, components and interfaces used in modern cloud-native environments. + +The [charter](charter.md) defines the scope and governance of the TAG Runtime. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-runtime) for the group will typically add invites for the following meetings to your calendar.* +* TAG Runtime Meeting: [Thursdays at 08:00 PT (Pacific Time)]() (1st and 3rd Thursdays). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=08:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://docs.google.com/document/d/1k7VNetgbuDNyIs_87GLQRH2W5SLgjgOhB6pDyv89MYk/edit). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Diane Feddema (**[@dfeddema](https://github.com/dfeddema)**), Red Hat +* Quinton Hoole (**[@quinton-hoole](https://github.com/quinton-hoole)**) +* Ricardo Aravena (**[@raravena80](https://github.com/raravena80)**) + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. + +* Klaus Ma (**[@k82cn](https://github.com/k82cn)**), openBCE + +## Contact +- Slack: [#tag-runtime](https://cloud-native.slack.com/messages/tag-runtime) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-runtime) +- TOC Liaisons: + - Ricardo Rocha (**[@rochaporto](https://github.com/rochaporto)**) + - Richard Hartmann (**[@RichiH](https://github.com/RichiH)**) + - Davanum Srinivas (**[@dims](https://github.com/dims)**) + + + diff --git a/tags/runtime-charter.md b/tags/tag-runtime/charter.md similarity index 100% rename from tags/runtime-charter.md rename to tags/tag-runtime/charter.md diff --git a/tags/tag-security/README.md b/tags/tag-security/README.md new file mode 100644 index 000000000..f4cc2dc3a --- /dev/null +++ b/tags/tag-security/README.md @@ -0,0 +1,47 @@ + +# TAG Security + +The TAG's mission is to reduce risk that cloud native applications expose end user data or allow other unauthorized access. + +The [charter](charter.md) defines the scope and governance of the TAG Security. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-security) for the group will typically add invites for the following meetings to your calendar.* +* TAG Security Meeting: [Wednesdays at 10:00 PT (Pacific Time)]() (weekly). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=10:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://docs.google.com/document/d/170y5biX9k95hYRwprITprG6Mc9xD5glVn-4mB2Jmi2g/edit). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Aradhna Chetal (**[@achetal01](https://github.com/achetal01)**) +* Brandon Lum (**[@lumjjb](https://github.com/lumjjb)**), Google +* Andrew Martin (**[@sublimino](https://github.com/sublimino)**) + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. + +* Justin Cappos (**[@JustinCappos](https://github.com/JustinCappos)**), New York University +* Andres Vega (**[@anvega](https://github.com/anvega)**), VMware +* Ash Narkar (**[@ashutosh-narkar](https://github.com/ashutosh-narkar)**), Styra +* Michael Lieberman (**[@mlieberman85](https://github.com/mlieberman85)**) +* Marina Moore (**[@mnm678](https://github.com/mnm678)**), New York University +* Pushkar Joglekar (**[@pushkarj](https://github.com/pushkarj)**) +* Ragashree Shekar (**[@ragashreeshekar](https://github.com/ragashreeshekar)**) + +## Contact +- Slack: [#tag-security](https://cloud-native.slack.com/messages/tag-security) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-security) +- TOC Liaisons: + - Emily Fox (**[@TheFoxAtWork](https://github.com/TheFoxAtWork)**) + - Justin Cormack (**[@justincormack](https://github.com/justincormack)**) + + + diff --git a/tags/security-charter.md b/tags/tag-security/charter.md similarity index 100% rename from tags/security-charter.md rename to tags/tag-security/charter.md diff --git a/tags/security.md b/tags/tag-security/security.md similarity index 100% rename from tags/security.md rename to tags/tag-security/security.md diff --git a/tags/tag-storage/README.md b/tags/tag-storage/README.md new file mode 100644 index 000000000..394494c55 --- /dev/null +++ b/tags/tag-storage/README.md @@ -0,0 +1,43 @@ + +# TAG Storage + +The Runtime TAG focuses on Storage systems and approaches suitable for and commonly used in modern cloud-native environments. + +The [charter](charter.md) defines the scope and governance of the TAG Storage. + +## Meetings +*Joining the [mailing list](https://lists.cncf.io/g/cncf-tag-runtime) for the group will typically add invites for the following meetings to your calendar.* +* TAG Storage Meeting: [Wednesdays at 08:00 PT (Pacific Time)]() (2nd and 4th Wednesdays). [Convert to your timezone](http://www.thetimezoneconverter.com/?t=08:00&tz=PT%20%28Pacific%20Time%29). + * [Meeting notes and Agenda](https://bit.ly/cncf-storage-sig-minutes). + +## Leadership + +### Chairs +The Chairs of the TAG run operations and processes governing the TAG. + +* Alex Chircop (**[@chira001](https://github.com/chira001)**), StorageOS +* Quinton Hoole (**[@quinton-hoole](https://github.com/quinton-hoole)**) +* Xing Yang (**[@xing-yang](https://github.com/xing-yang)**), VMware + +### Technical Leads +The Technical Leads of the TAG perform deep technical dives on projects. + +* Luis Pabon (**[@lpabon](https://github.com/lpabon)**), Pure Storage +* Nick Connolly (**[@nconnolly1](https://github.com/nconnolly1)**), DataCore Software +* Sugu Sougoumarane (**[@sougou](https://github.com/sougou)**), Planet Scale + +## Contact +- Slack: [#tag-runtime](https://cloud-native.slack.com/messages/tag-runtime) +- [Mailing list](https://lists.cncf.io/g/cncf-tag-runtime) +- TOC Liaisons: + - Richard Hartmann (**[@RichiH](https://github.com/RichiH)**) + - Erin Boyd (**[@erinboyd](https://github.com/erinboyd)**) + + + diff --git a/tags/storage-charter.md b/tags/tag-storage/charter.md similarity index 100% rename from tags/storage-charter.md rename to tags/tag-storage/charter.md diff --git a/tags/tags.yaml b/tags/tags.yaml new file mode 100644 index 000000000..1a5ccdc26 --- /dev/null +++ b/tags/tags.yaml @@ -0,0 +1,289 @@ +tags: + - dir: tag-app-delivery + name: App Delivery + objective: | + The Application Delivery TAG focuses on delivering cloud native applications which involves multiple phases including building, deploying, managing, and operating. Additionally, the TAG produces supporting material and best practices for end-users, and provide guidance and coordination for CNCF projects working within the TAG’s scope. + charter_link: charter.md + leadership: + chairs: + - github: AloisReitbauer + name: Alois Reitbauer + - github: Jenniferstrej + name: Jennifer Strejevitch + - github: hongchaodeng + name: Hongchao Deng + tech_leads: + - github: AlexsJones + name: Alex Jones + company: Canonical + - github: thschue + name: Thomas Schuetz + company: Dynatrace + meetings: + - description: TAG App Delivery Meeting + day: Wednesday + time: "08:00" + tz: PT (Pacific Time) + frequency: 1st and 3rd Wednesday + archive_url: https://docs.google.com/document/d/1OykvqvhSG4AxEdmDMXilrupsX2n1qCSJUWwTc3I7AOs/edit + recordings_url: https://youtube.com/playlist?list=PLjNzvzqUSpxJ0JfD6vrdF5bsuBaJQ2BRT + contact: + slack: tag-app-delivery + mailing_list: https://lists.cncf.io/g/cncf-tag-app-delivery + liaisons: + - github: dims + name: Davanum Srinivas + - github: resouer + name: Lei Zhang + - github: cathyhongzhang + name: Cathy Zhang + - dir: tag-contributor-strategy + name: Contributor Strategy + objective: | + The Contributor Strategy TAG is responsible for contributor experience, sustainability, governance, and openness guidance to help CNCF community groups and projects with their own contributor strategies for a healthy project. + charter_link: charter.md + leadership: + chairs: + - github: geekygirldawn + name: Dawn Foster + company: VMware + - github: jberkus + name: Josh Berkus + company: Red Hat + tech_leads: + - github: carolynvs + name: Carolyn Van Slyck + company: Microsoft + meetings: + - description: TAG Contributor Strategy Meeting + day: Thursday + time: "10:00" + tz: PT (Pacific Time) + frequency: 1st Thursdays + archive_url: https://docs.google.com/document/d/1Xjw-yAqidQW67zv7OfMRErsfCotc-mfQ_248Te_YL0g/edit + recordings_url: https://youtube.com/playlist?list=PLgKVE_JHGShqKzw_Z93cWPSc4MJV7OOo1 + contact: + slack: tag-contributor-strategy + mailing_list: https://lists.cncf.io/g/cncf-tag-contributor-strategy + liaisons: + - github: mattfarina + name: Matt Farina + - github: kgamanji + name: Katie Gamanji + - github: cathyhongzhang + name: Cathy Zhang + working_groups: + - name: Working Group Contributor Growth + meetings: + - description: WG Contributor Growth Meeting + day: Thursday + time: "10:00" + tz: PT (Pacific Time) + frequency: 4th Thursdays + archive_url: https://docs.google.com/document/d/1Kx7tZv5wTXQ7uRKxn5d9d2wLsI3Q3Q51A0i06nLvtdI/edit + - dir: tag-environmental-sustainability + name: Environmental Sustainability + objective: | + This Environmental Sustainability TAG's goal is to advocate for, develop, support, and help evaluate environmental sustainability initiatives in cloud native technologies + charter_link: charter.md + leadership: + chairs: [] + meetings: + - description: TAG Environmental Sustainability Meeting + day: Wednesday + time: "08:00" + tz: PT (Pacific Time) + frequency: 1st and 3rd Wednesday + archive_url: https://docs.google.com/document/d/1TkmMyXJABC66NfYmivnh7z8Y_vpq9f9foaOuDVQS_Lo/edit + contact: + slack: tag-environmental-sustainability + mailing_list: https://lists.cncf.io/g/cncf-tag-env-sustainability + liaisons: + - github: erinboyd + name: Erin Boyd + - dir: tag-network + name: Network + objective: | + TAG Network's mission is to enable widespread and successful development, deployment and operation of resilient and intelligent network systems in cloud native environments. + charter_link: charter.md + leadership: + chairs: + - github: edwarnicke + name: Ed Warnicke + company: Cisco + - github: kenowens12 + name: Ken Owens + company: Mastercard + - github: leecalcote + name: Lee Calcote + company: Layer5 + meetings: + - description: TAG Network Meeting + day: Thursday + time: "11:00" + tz: PT (Pacific Time) + frequency: 1st and 3rd Thursdays + archive_url: https://docs.google.com/document/d/18hYemFKK_PC_KbT_TDBUgb0rknOuIhikkRxer4_bv4Q/edit# + contact: + slack: tag-network + mailing_list: https://lists.cncf.io/g/cncf-tag-network + liaisons: + - github: dims + name: Davanum Srinivas + - github: dzolotusky + name: Dave Zolotusky + - dir: tag-observability + name: Observability + objective: | + This TAG focuses on topics pertaining to the observation of cloud native workloads. + charter_link: charter.md + leadership: + chairs: + - github: RichiH + name: Richard Hartmann + company: Grafana Labs + - github: alolita + name: Alolita Sharma + - github: halcyondude + name: Matt Young + tech_leads: + - github: bwplotka + name: Bartłomiej Płotka + company: Red Hat + meetings: + - description: TAG Observability Meeting + day: Tuesday + time: "04:00" + tz: UTC + frequency: 2nd Tuesdays + contact: + slack: tag-observability + mailing_list: https://lists.cncf.io/g/cncf-tag-observability + liaisons: + - github: resouer + name: Lei Zhang + - github: cathyhongzhang + name: Cathy Zhang + - dir: tag-runtime + name: Runtime + objective: | + The Runtime TAG focuses on Workload execution and management systems, components and interfaces used in modern cloud-native environments. + charter_link: charter.md + leadership: + chairs: + - github: dfeddema + name: Diane Feddema + company: Red Hat + - github: quinton-hoole + name: Quinton Hoole + - github: raravena80 + name: Ricardo Aravena + tech_leads: + - github: k82cn + name: Klaus Ma + company: openBCE + meetings: + - description: TAG Runtime Meeting + day: Thursday + time: "08:00" + tz: PT (Pacific Time) + frequency: 1st and 3rd Thursdays + archive_url: https://docs.google.com/document/d/1k7VNetgbuDNyIs_87GLQRH2W5SLgjgOhB6pDyv89MYk/edit + contact: + slack: tag-runtime + mailing_list: https://lists.cncf.io/g/cncf-tag-runtime + liaisons: + - github: rochaporto + name: Ricardo Rocha + - github: RichiH + name: Richard Hartmann + - github: dims + name: Davanum Srinivas + - dir: tag-security + name: Security + objective: | + The TAG's mission is to reduce risk that cloud native applications expose end user data or allow other unauthorized access. + charter_link: charter.md + leadership: + chairs: + - github: achetal01 + name: Aradhna Chetal + - github: lumjjb + name: Brandon Lum + company: Google + - github: sublimino + name: Andrew Martin + tech_leads: + - github: JustinCappos + name: Justin Cappos + company: New York University + - github: anvega + name: Andres Vega + company: VMware + - github: ashutosh-narkar + name: Ash Narkar + company: Styra + - github: mlieberman85 + name: Michael Lieberman + - github: mnm678 + name: Marina Moore + company: New York University + - github: pushkarj + name: Pushkar Joglekar + - github: ragashreeshekar + name: Ragashree Shekar + meetings: + - description: TAG Security Meeting + day: Wednesday + time: "10:00" + tz: PT (Pacific Time) + frequency: weekly + archive_url: https://docs.google.com/document/d/170y5biX9k95hYRwprITprG6Mc9xD5glVn-4mB2Jmi2g/edit + contact: + slack: tag-security + mailing_list: https://lists.cncf.io/g/cncf-tag-security + liaisons: + - github: TheFoxAtWork + name: Emily Fox + - github: justincormack + name: Justin Cormack + - dir: tag-storage + name: Storage + objective: | + The Runtime TAG focuses on Storage systems and approaches suitable for and commonly used in modern cloud-native environments. + charter_link: charter.md + leadership: + chairs: + - github: chira001 + name: Alex Chircop + company: StorageOS + - github: quinton-hoole + name: Quinton Hoole + - github: xing-yang + name: Xing Yang + company: VMware + tech_leads: + - github: lpabon + name: Luis Pabon + company: Pure Storage + - github: nconnolly1 + name: Nick Connolly + company: DataCore Software + - github: sougou + name: Sugu Sougoumarane + company: Planet Scale + meetings: + - description: TAG Storage Meeting + day: Wednesday + time: "08:00" + tz: PT (Pacific Time) + frequency: 2nd and 4th Wednesdays + archive_url: https://bit.ly/cncf-storage-sig-minutes + contact: + slack: tag-runtime + mailing_list: https://lists.cncf.io/g/cncf-tag-runtime + liaisons: + - github: RichiH + name: Richard Hartmann + - github: erinboyd + name: Erin Boyd