Skip to content

Commit 87b8e93

Browse files
authored
Merge pull request #2172 from laozc/verify-flavor
🌱 flavorgen generates all flavors by default
2 parents 49d51cb + 1070d27 commit 87b8e93

File tree

4 files changed

+101
-37
lines changed

4 files changed

+101
-37
lines changed

Makefile

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ help: # Display this help
223223

224224
.PHONY: generate
225225
generate: ## Run all generate targets
226-
$(MAKE) generate-modules generate-manifests generate-go-deepcopy generate-go-conversions
226+
$(MAKE) generate-modules generate-manifests generate-go-deepcopy generate-go-conversions generate-flavors
227227

228228
.PHONY: generate-manifests
229229
generate-manifests: $(CONTROLLER_GEN) ## Generate manifests e.g. CRD, RBAC etc.
@@ -339,7 +339,7 @@ APIDIFF_OLD_COMMIT ?= $(shell git rev-parse origin/main)
339339
apidiff: $(GO_APIDIFF) ## Check for API differences
340340
$(GO_APIDIFF) $(APIDIFF_OLD_COMMIT) --print-compatible
341341

342-
ALL_VERIFY_CHECKS = boilerplate modules gen conversions doctoc
342+
ALL_VERIFY_CHECKS = boilerplate modules gen conversions doctoc flavors
343343

344344
.PHONY: verify
345345
verify: $(addprefix verify-,$(ALL_VERIFY_CHECKS)) lint-markdown lint-shell ## Run all verify-* targets
@@ -381,6 +381,13 @@ verify-boilerplate: ## Verify boilerplate text exists in each file
381381
verify-container-images: ## Verify container images
382382
TRACE=$(TRACE) ./hack/verify-container-images.sh
383383

384+
.PHONY: verify-flavors
385+
verify-flavors: $(FLAVOR_DIR) generate-flavors ## Verify generated flavors
386+
@if !(git diff --quiet HEAD -- $(FLAVOR_DIR)); then \
387+
git diff $(FLAVOR_DIR); \
388+
echo "flavor files in templates directory are out of date"; exit 1; \
389+
fi
390+
384391
## --------------------------------------
385392
## Build
386393
## --------------------------------------
@@ -572,12 +579,7 @@ dev-flavors: $(OVERRIDES_DIR)
572579

573580
.PHONY: generate-flavors
574581
generate-flavors: $(FLAVOR_DIR)
575-
go run ./packaging/flavorgen -f vip > $(FLAVOR_DIR)/cluster-template.yaml
576-
go run ./packaging/flavorgen -f external-loadbalancer > $(FLAVOR_DIR)/cluster-template-external-loadbalancer.yaml
577-
go run ./packaging/flavorgen -f cluster-class > $(FLAVOR_DIR)/clusterclass-template.yaml
578-
go run ./packaging/flavorgen -f cluster-topology > $(FLAVOR_DIR)/cluster-template-topology.yaml
579-
go run ./packaging/flavorgen -f ignition > $(FLAVOR_DIR)/cluster-template-ignition.yaml
580-
go run ./packaging/flavorgen -f node-ipam > $(FLAVOR_DIR)/cluster-template-node-ipam.yaml
582+
go run ./packaging/flavorgen --output-dir $(FLAVOR_DIR)
581583

582584
.PHONY: release-staging
583585
release-staging: ## Build and push container images to the staging registry

packaging/flavorgen/cmd/root.go

Lines changed: 87 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,41 @@ limitations under the License.
1717
package cmd
1818

1919
import (
20+
"fmt"
2021
"os"
22+
"path/filepath"
2123

2224
"github.com/pkg/errors"
2325
"github.com/spf13/cobra"
26+
"k8s.io/apimachinery/pkg/runtime"
2427

2528
"sigs.k8s.io/cluster-api-provider-vsphere/packaging/flavorgen/flavors"
2629
"sigs.k8s.io/cluster-api-provider-vsphere/packaging/flavorgen/flavors/env"
2730
"sigs.k8s.io/cluster-api-provider-vsphere/packaging/flavorgen/flavors/util"
2831
)
2932

3033
const flavorFlag = "flavor"
34+
const outputDirFlag = "output-dir"
35+
36+
var (
37+
flavorMappings = map[string]string{
38+
flavors.VIP: "cluster-template.yaml",
39+
flavors.ExternalLoadBalancer: "cluster-template-external-loadbalancer.yaml",
40+
flavors.ClusterClass: "clusterclass-template.yaml",
41+
flavors.ClusterTopology: "cluster-template-topology.yaml",
42+
flavors.Ignition: "cluster-template-ignition.yaml",
43+
flavors.NodeIPAM: "cluster-template-node-ipam.yaml",
44+
}
45+
46+
allFlavors = []string{
47+
flavors.VIP,
48+
flavors.ExternalLoadBalancer,
49+
flavors.ClusterClass,
50+
flavors.Ignition,
51+
flavors.NodeIPAM,
52+
flavors.ClusterTopology,
53+
}
54+
)
3155

3256
func RootCmd() *cobra.Command {
3357
rootCmd := &cobra.Command{
@@ -36,8 +60,11 @@ func RootCmd() *cobra.Command {
3660
RunE: func(command *cobra.Command, args []string) error {
3761
return RunRoot(command)
3862
},
63+
SilenceUsage: true,
3964
}
4065
rootCmd.Flags().StringP(flavorFlag, "f", "", "Name of flavor to compile")
66+
rootCmd.Flags().StringP(outputDirFlag, "o", "", "Directory to store the generated flavor templates.\nBy default the current directory is used.\nUse '-' to output the result to stdout.")
67+
4168
return rootCmd
4269
}
4370

@@ -52,30 +79,73 @@ func RunRoot(command *cobra.Command) error {
5279
if err != nil {
5380
return errors.Wrapf(err, "error accessing flag %s for command %s", flavorFlag, command.Name())
5481
}
82+
outputDir, err := command.Flags().GetString(outputDirFlag)
83+
if err != nil {
84+
return errors.Wrapf(err, "error accessing flag %s for command %s", outputDirFlag, command.Name())
85+
}
86+
var outputFlavors []string
87+
if flavor != "" {
88+
outputFlavors = append(outputFlavors, flavor)
89+
} else {
90+
outputFlavors = allFlavors
91+
}
92+
generateMultiFlavors := len(outputFlavors) > 1
93+
for _, f := range outputFlavors {
94+
manifest, err := generateSingle(f)
95+
if err != nil {
96+
return err
97+
}
98+
99+
yamlFileName, ok := flavorMappings[f]
100+
if !ok {
101+
return fmt.Errorf("file mapping for flavor %q is missng in flavorMappings", f)
102+
}
103+
104+
if outputDir == "-" {
105+
if generateMultiFlavors {
106+
// use the yaml filename as a section delimiter
107+
fmt.Printf("### %s\n", yamlFileName)
108+
}
109+
fmt.Print(manifest)
110+
continue
111+
}
112+
113+
yamlPath := filepath.Join(outputDir, yamlFileName)
114+
err = os.WriteFile(yamlPath, []byte(manifest), 0600)
115+
if err != nil {
116+
return errors.Wrapf(err, "failed to save manifest content to file for flavor %s", f)
117+
}
118+
}
119+
120+
return nil
121+
}
122+
123+
func generateSingle(flavor string) (string, error) {
124+
replacements := append([]util.Replacement{}, util.DefaultReplacements...)
125+
126+
var objs []runtime.Object
55127
switch flavor {
56128
case flavors.VIP:
57-
util.PrintObjects(flavors.MultiNodeTemplateWithKubeVIP())
129+
objs = flavors.MultiNodeTemplateWithKubeVIP()
58130
case flavors.ExternalLoadBalancer:
59-
util.PrintObjects(flavors.MultiNodeTemplateWithExternalLoadBalancer())
131+
objs = flavors.MultiNodeTemplateWithExternalLoadBalancer()
60132
case flavors.ClusterClass:
61-
util.PrintObjects(flavors.ClusterClassTemplateWithKubeVIP())
133+
objs = flavors.ClusterClassTemplateWithKubeVIP()
62134
case flavors.ClusterTopology:
63-
additionalReplacements := []util.Replacement{
64-
{
65-
Kind: "Cluster",
66-
Name: "${CLUSTER_NAME}",
67-
Value: env.ControlPlaneMachineCountVar,
68-
FieldPath: []string{"spec", "topology", "controlPlane", "replicas"},
69-
},
70-
}
71-
util.Replacements = append(util.Replacements, additionalReplacements...)
72-
util.PrintObjects(flavors.ClusterTopologyTemplateKubeVIP())
135+
objs = flavors.ClusterTopologyTemplateKubeVIP()
136+
replacements = append(replacements, util.Replacement{
137+
Kind: "Cluster",
138+
Name: "${CLUSTER_NAME}",
139+
Value: env.ControlPlaneMachineCountVar,
140+
FieldPath: []string{"spec", "topology", "controlPlane", "replicas"},
141+
})
73142
case flavors.Ignition:
74-
util.PrintObjects(flavors.MultiNodeTemplateWithKubeVIPIgnition())
143+
objs = flavors.MultiNodeTemplateWithKubeVIPIgnition()
75144
case flavors.NodeIPAM:
76-
util.PrintObjects(flavors.MultiNodeTemplateWithKubeVIPNodeIPAM())
145+
objs = flavors.MultiNodeTemplateWithKubeVIPNodeIPAM()
77146
default:
78-
return errors.Errorf("invalid flavor")
147+
return "", errors.Errorf("invalid flavor")
79148
}
80-
return nil
149+
150+
return util.GenerateManifestYaml(objs, replacements), nil
81151
}

packaging/flavorgen/flavors/crs/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func newConfigMapManifests(name string, o []runtime.Object) *v1.ConfigMap {
7878
Namespace: env.NamespaceVar,
7979
},
8080
Data: map[string]string{
81-
"data": util.GenerateManifestYaml(o),
81+
"data": util.GenerateManifestYaml(o, util.DefaultReplacements),
8282
},
8383
}
8484
}

packaging/flavorgen/flavors/util/helpers.go

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ limitations under the License.
1717
package util
1818

1919
import (
20-
"fmt"
2120
"reflect"
2221
"regexp"
2322
"strings"
@@ -37,7 +36,7 @@ type Replacement struct {
3736
}
3837

3938
var (
40-
Replacements = []Replacement{
39+
DefaultReplacements = []Replacement{
4140
{
4241
Kind: "KubeadmControlPlane",
4342
Name: "${CLUSTER_NAME}",
@@ -180,24 +179,17 @@ func GenerateObjectYAML(obj runtime.Object, replacements []Replacement) string {
180179
return str
181180
}
182181

183-
func GenerateManifestYaml(objs []runtime.Object) string {
182+
func GenerateManifestYaml(objs []runtime.Object, replacements []Replacement) string {
184183
var sb strings.Builder
185184

186185
for _, o := range objs {
187186
sb.WriteString("---\n")
188-
sb.WriteString(GenerateObjectYAML(o, Replacements))
187+
sb.WriteString(GenerateObjectYAML(o, replacements))
189188
}
190189

191190
return sb.String()
192191
}
193192

194-
func PrintObjects(objs []runtime.Object) {
195-
for _, o := range objs {
196-
o := o
197-
fmt.Printf("---\n%s", GenerateObjectYAML(o, Replacements)) //nolint:forbidigo
198-
}
199-
}
200-
201193
func TypeToKind(i interface{}) string {
202194
return reflect.ValueOf(i).Elem().Type().Name()
203195
}

0 commit comments

Comments
 (0)