1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-09 01:16:55 +00:00
kyverno/cmd/cli/kubectl-kyverno/commands/create/values/command.go
Charles-Edouard Brétéché c51bc5beb8
docs: improve cli commands docs (#8259)
* chore: improve cli commands docs

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* docs

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* fix

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* fix

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* fix test

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* experimental

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* version

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* unit tests

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* oci

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* oci

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* jp

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* apply

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

* create

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>

---------

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
2023-09-05 05:14:28 +03:00

140 lines
3.5 KiB
Go

package values
import (
"os"
"strings"
"text/template"
"github.com/kyverno/kyverno/cmd/cli/kubectl-kyverno/commands/create/templates"
"github.com/kyverno/kyverno/cmd/cli/kubectl-kyverno/commands/test/api"
cobrautils "github.com/kyverno/kyverno/cmd/cli/kubectl-kyverno/utils/cobra"
"github.com/spf13/cobra"
)
func Command() *cobra.Command {
var path string
var globalValues, namespaceSelector, rules, resources []string
cmd := &cobra.Command{
Use: "values",
Short: cobrautils.FormatDescription(true, websiteUrl, false, description...),
Long: cobrautils.FormatDescription(false, websiteUrl, false, description...),
Example: cobrautils.FormatExamples(examples...),
RunE: func(cmd *cobra.Command, args []string) error {
tmpl, err := template.New("values").Parse(templates.ValuesTemplate)
if err != nil {
return err
}
output := os.Stdout
if path != "" {
file, err := os.Create(path)
if err != nil {
return err
}
defer file.Close()
output = file
}
values := api.Values{
GlobalValues: map[string]string{},
}
for _, result := range namespaceSelector {
result := parseNamespaceSelector(result)
if result != nil {
values.NamespaceSelectors = append(values.NamespaceSelectors, *result)
}
}
for _, result := range globalValues {
k, v := parseKeyValue(result)
if k != "" && v != "" {
values.GlobalValues[k] = v
}
}
for _, result := range rules {
result := parseRule(result)
if result != nil {
values.Policies = append(values.Policies, *result)
}
}
for _, result := range resources {
result := parseResource(result)
if result != nil {
values.Policies = append(values.Policies, *result)
}
}
return tmpl.Execute(output, values)
},
}
cmd.Flags().StringVarP(&path, "output", "o", "", "Output path (uses standard console output if not set)")
cmd.Flags().StringArrayVarP(&namespaceSelector, "ns-selector", "n", nil, "Namespace selector")
cmd.Flags().StringSliceVarP(&globalValues, "global", "g", nil, "Global value")
cmd.Flags().StringArrayVar(&rules, "rule", nil, "Policy rule values")
cmd.Flags().StringArrayVar(&resources, "resource", nil, "Policy resource values")
return cmd
}
func parseNamespaceSelector(in string) *api.NamespaceSelector {
parts := strings.Split(in, ",")
if len(parts) < 2 {
return nil
}
nsSelector := api.NamespaceSelector{
Name: parts[0],
Labels: map[string]string{},
}
for _, label := range parts[1:] {
k, v := parseKeyValue(label)
if k != "" && v != "" {
nsSelector.Labels[k] = v
}
}
return &nsSelector
}
func parseKeyValue(in string) (string, string) {
parts := strings.Split(in, "=")
if len(parts) == 2 {
return parts[0], parts[1]
}
return "", ""
}
func parseRule(in string) *api.Policy {
parts := strings.Split(in, ",")
if len(parts) < 2 {
return nil
}
rule := api.Rule{
Name: parts[1],
Values: map[string]interface{}{},
}
for _, value := range parts[2:] {
k, v := parseKeyValue(value)
if k != "" && v != "" {
rule.Values[k] = v
}
}
return &api.Policy{
Name: parts[0],
Rules: []api.Rule{rule},
}
}
func parseResource(in string) *api.Policy {
parts := strings.Split(in, ",")
if len(parts) < 2 {
return nil
}
resource := api.Resource{
Name: parts[1],
Values: map[string]interface{}{},
}
for _, value := range parts[2:] {
k, v := parseKeyValue(value)
if k != "" && v != "" {
resource.Values[k] = v
}
}
return &api.Policy{
Name: parts[0],
Resources: []api.Resource{resource},
}
}