blob: c1206c4c8587c3f454cebee3e957ad805aaa4725 [file] [log] [blame]
package cmd
import (
"os"
"path/filepath"
"strings"
"text/template"
)
import (
"github.com/spf13/cobra"
)
import (
"github.com/apache/dubbo-kubernetes/tools/policy-gen/generator/pkg/parse"
"github.com/apache/dubbo-kubernetes/tools/policy-gen/generator/pkg/save"
)
func newPluginFile(rootArgs *args) *cobra.Command {
cmd := &cobra.Command{
Use: "plugin-file",
Short: "Generate a plugin.go file for the policy",
Long: "Generate a plugin.go file for the policy.",
RunE: func(cmd *cobra.Command, _ []string) error {
policyName := filepath.Base(rootArgs.pluginDir)
apiDir := filepath.Join(rootArgs.pluginDir, "api")
policyPath := filepath.Join(apiDir, rootArgs.version, policyName+".go")
if _, err := os.Stat(policyPath); err != nil {
return err
}
pconfig, err := parse.Policy(policyPath)
if err != nil {
return err
}
if pconfig.SkipRegistration {
return nil
}
files, err := os.ReadDir(apiDir)
if err != nil {
return err
}
versions := []string{}
for _, file := range files {
if file.IsDir() {
versions = append(versions, file.Name())
}
}
outPath := filepath.Join(rootArgs.pluginDir, "zz_generated.plugin.go")
return save.GoTemplate(pluginGoTemplate, struct {
Package string
Versions []string
Name string
GoModule string
}{
Package: strings.ToLower(pconfig.Name),
Name: pconfig.Name,
Versions: versions,
GoModule: rootArgs.goModule,
}, outPath)
},
}
return cmd
}
var pluginGoTemplate = template.Must(template.New("plugin-go").Parse(`
package {{ .Package }}
{{ $pkg := .Package }}
{{ $name := .Name }}
{{ $gomodule := .GoModule }}
import (
"github.com/apache/dubbo-kubernetes/pkg/plugins/policies/core"
{{- range $idx, $version := .Versions}}
api_{{ $version }} "{{ $gomodule }}/pkg/plugins/policies/{{ $pkg }}/api/{{ $version }}"
k8s_{{ $version }} "{{ $gomodule }}/pkg/plugins/policies/{{ $pkg }}/k8s/{{ $version }}"
plugin_{{ $version }} "{{ $gomodule }}/pkg/plugins/policies/{{ $pkg }}/plugin/{{ $version }}"
{{- end}}
)
func init() {
{{- range $idx, $version := .Versions}}
core.Register(
api_{{ $version }}.{{ $name }}ResourceTypeDescriptor,
k8s_{{ $version }}.AddToScheme,
plugin_{{ $version }}.NewPlugin(),
)
{{- end}}
}
`))