Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New resourcesdocs generator #179

Merged
merged 5 commits into from
Dec 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions gen-resourcesdocs/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
VERSION ?= v1.20

all: kwebsite

clean:
rm -rf kwebsite/content/en/docs/* kwebsite/public

kwebsite: clean
mkdir -p kwebsite/content/en/docs
go run cmd/main.go kwebsite --config-dir config/$(VERSION)/ --file api/$(VERSION)/swagger.json --output-dir kwebsite/content/en/docs --templates ./templates
105,020 changes: 105,020 additions & 0 deletions gen-resourcesdocs/api/v1.19/swagger.json

Large diffs are not rendered by default.

108,928 changes: 108,928 additions & 0 deletions gen-resourcesdocs/api/v1.20/swagger.json

Large diffs are not rendered by default.

62 changes: 62 additions & 0 deletions gen-resourcesdocs/cmd/cli/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package cli

import (
"fmt"
"os"
"strings"

"github.com/spf13/cobra"
"github.com/spf13/viper"
)

const (
fileOption = "file"
configDirOption = "config-dir"
outputDirOption = "output-dir"
templatesDirOption = "templates"
showDefinitionsOption = "show-definitions"
)

// RootCmd defines the root cli command
func RootCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "kubernetes-api-reference",
Short: "K8s API documentation tools",
Long: `Tool to build documentation from OpenAPI specification of the Kubernetes API`,
SilenceErrors: true,
SilenceUsage: true,
PreRun: func(cmd *cobra.Command, args []string) {
viper.BindPFlags(cmd.Flags())
},
RunE: func(cmd *cobra.Command, args []string) error {
return nil
},
}

cmd.PersistentFlags().StringP(fileOption, "f", "", "OpenAPI spec file")
cmd.MarkFlagRequired(fileOption)

subcommands := []func() *cobra.Command{
ResourceslistCmd, ShowTOCCmd, GVKeysMap, KWebsite,
}
for _, subcommand := range subcommands {
cmd.AddCommand(subcommand())
}

cobra.OnInitialize(initConfig)

viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
return cmd
}

// Run the cli
func Run() {
if err := RootCmd().Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}

func initConfig() {
viper.AutomaticEnv()
}
43 changes: 43 additions & 0 deletions gen-resourcesdocs/cmd/cli/gvkeysmap.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package cli

import (
"fmt"
"sort"

"github.com/feloy/kubernetes-api-reference/pkg/kubernetes"
"github.com/spf13/cobra"
)

// GVKeysMap defines the `gvkeysmap` subcommand
func GVKeysMap() *cobra.Command {
cmd := &cobra.Command{
Use: "gvkeysmap",
Short: "show the map between group/version and definition keys",
Long: "show the map between group/version and definition keys",
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
file := cmd.Flag(fileOption).Value.String()
spec, err := kubernetes.NewSpec(file)
if err != nil {
return err
}
gvs := make([]string, len(spec.GVToKey))
i := 0
for gv := range spec.GVToKey {
gvs[i] = gv
i++
}
sort.Strings(gvs)
for _, gv := range gvs {
keys := spec.GVToKey[gv]
fmt.Printf("%s\n", gv)
for _, key := range keys {
fmt.Printf("\t%s\n", key)
}
}
return nil
},
}
return cmd
}
40 changes: 40 additions & 0 deletions gen-resourcesdocs/cmd/cli/helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package cli

import (
"path"

"github.com/feloy/kubernetes-api-reference/pkg/config"
"github.com/feloy/kubernetes-api-reference/pkg/kubernetes"
"github.com/spf13/cobra"
)

// prepareTOC loads Spec and Toc config, and completes TOC
// by adding associates resources and not specifed resources in TOC
func prepareTOC(cmd *cobra.Command) (*config.TOC, error) {
file := cmd.Flag(fileOption).Value.String()
spec, err := kubernetes.NewSpec(file)
if err != nil {
return nil, err
}

configDir := cmd.Flag(configDirOption).Value.String()
toc, err := config.LoadTOC(path.Join(configDir, "toc.yaml"))
err = toc.PopulateAssociates(spec)
if err != nil {
return nil, err
}

toc.AddOtherResources(spec)
toc.Definitions = &spec.Swagger.Definitions
toc.Actions = spec.Actions
toc.Actions.Sort()

// TODO browse directory
categories, err := config.LoadCategories([]string{path.Join(configDir, "fields.yaml")})
if err != nil {
return nil, err
}
toc.Categories = categories

return toc, nil
}
48 changes: 48 additions & 0 deletions gen-resourcesdocs/cmd/cli/kwebsite.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package cli

import (
"fmt"

"github.com/spf13/cobra"
)

// Hugo defines the `kwebsite` subcommand
func KWebsite() *cobra.Command {
cmd := &cobra.Command{
Use: "kwebsite",
Short: "output specification for k/website",
Long: "output the specification in a format usable for the Kubernetes website",
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
toc, err := prepareTOC(cmd)
if err != nil {
return fmt.Errorf("Unable to load specs and/or toc config: %v", err)
}

outputDir := cmd.Flag(outputDirOption).Value.String()
templatesDir := cmd.Flag(templatesDirOption).Value.String()
err = toc.ToKWebsite(outputDir, templatesDir)
if err != nil {
return err
}

show, err := cmd.Flags().GetBool(showDefinitionsOption)
if err != nil {
return err
}
if show {
toc.OutputDocumentedDefinitions()
}
return nil
},
}
cmd.Flags().StringP(configDirOption, "c", "", "Directory containing documentation configuration")
cmd.MarkFlagRequired(configDirOption)
cmd.Flags().StringP(outputDirOption, "o", "", "Directory to write markdown files")
cmd.MarkFlagRequired(outputDirOption)
cmd.Flags().StringP(templatesDirOption, "t", "", "Directory containing go templates for output")
cmd.MarkFlagRequired(templatesDirOption)
cmd.Flags().Bool(showDefinitionsOption, false, "Show where definitions are defined on output")
return cmd
}
45 changes: 45 additions & 0 deletions gen-resourcesdocs/cmd/cli/resourceslist.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package cli

import (
"fmt"
"sort"

"github.com/feloy/kubernetes-api-reference/pkg/kubernetes"
"github.com/spf13/cobra"
)

// ResourceslistCmd defines the `resourceslist` subcommand
func ResourceslistCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "resourceslist",
Short: "list k8s resources",
Long: "list Kubernetes resources in the specification",
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
file := cmd.Flag(fileOption).Value.String()
spec, err := kubernetes.NewSpec(file)
if err != nil {
return err
}

resources := spec.Resources
i := 0
keys := make([]string, len(*resources))
for k := range *resources {
keys[i] = k.String()
i++
}
sort.Strings(keys)
for _, k := range keys {
rs := (*resources)[kubernetes.APIKind(k)]
fmt.Println(k)
for _, r := range rs {
fmt.Println("\t" + r.GetGV())
}
}
return nil
},
}
return cmd
}
31 changes: 31 additions & 0 deletions gen-resourcesdocs/cmd/cli/showtoc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package cli

import (
"fmt"
"os"

"github.com/spf13/cobra"
)

// ShowTOCCmd defines the `showtoc` subcommand
func ShowTOCCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "showtoc",
Short: "show the table of contents",
Long: "list the parts and chapter of the documentation",
SilenceErrors: true,
SilenceUsage: true,
RunE: func(cmd *cobra.Command, args []string) error {
toc, err := prepareTOC(cmd)
if err != nil {
return fmt.Errorf("Unable to load specs and/or toc config: %v", err)
}
toc.ToMarkdown(os.Stdout)
return nil
},
}
cmd.Flags().StringP(configDirOption, "c", "", "Directory containing documentation configuration")
cmd.MarkFlagRequired(configDirOption)

return cmd
}
9 changes: 9 additions & 0 deletions gen-resourcesdocs/cmd/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package main

import (
"github.com/feloy/kubernetes-api-reference/cmd/cli"
)

func main() {
cli.Run()
}
Loading