Skip to content

Commit 7975039

Browse files
authored
A few updates to draft (#277)
1 parent c5eaffc commit 7975039

File tree

38 files changed

+165
-70
lines changed

38 files changed

+165
-70
lines changed

cmd/generate-workflow.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
package cmd
22

33
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/manifoldco/promptui"
48
log "github.com/sirupsen/logrus"
59
"github.com/spf13/cobra"
10+
"golang.org/x/exp/maps"
611

12+
"github.com/Azure/draft/pkg/prompts"
713
"github.com/Azure/draft/pkg/templatewriter"
814
"github.com/Azure/draft/pkg/templatewriter/writers"
915
"github.com/Azure/draft/pkg/workflows"
16+
"github.com/Azure/draft/template"
1017
)
1118

1219
type generateWorkflowCmd struct {
@@ -34,7 +41,7 @@ with draft on AKS. This command assumes the 'setup-gh' command has been run prop
3441
flagValuesMap = gwCmd.workflowConfig.SetFlagValuesToMap()
3542
}
3643
log.Info("--> Generating Github workflow")
37-
if err := workflows.CreateWorkflows(gwCmd.dest, gwCmd.deployType, gwCmd.flagVariables, gwCmd.templateWriter, flagValuesMap); err != nil {
44+
if err := gwCmd.generateWorkflows(gwCmd.dest, gwCmd.deployType, gwCmd.flagVariables, gwCmd.templateWriter, flagValuesMap); err != nil {
3845
return err
3946
}
4047

@@ -61,3 +68,45 @@ with draft on AKS. This command assumes the 'setup-gh' command has been run prop
6168
func init() {
6269
rootCmd.AddCommand(newGenerateWorkflowCmd())
6370
}
71+
72+
func (gwc *generateWorkflowCmd) generateWorkflows(dest string, deployType string, flagVariables []string, templateWriter templatewriter.TemplateWriter, flagValuesMap map[string]string) error {
73+
if flagValuesMap == nil {
74+
return fmt.Errorf("flagValuesMap is nil")
75+
}
76+
var err error
77+
for _, flagVar := range flagVariables {
78+
flagVarName, flagVarValue, ok := strings.Cut(flagVar, "=")
79+
if !ok {
80+
return fmt.Errorf("invalid variable format: %s", flagVar)
81+
}
82+
flagValuesMap[flagVarName] = flagVarValue
83+
log.Debugf("flag variable %s=%s", flagVarName, flagVarValue)
84+
}
85+
86+
if deployType == "" {
87+
selection := &promptui.Select{
88+
Label: "Select k8s Deployment Type",
89+
Items: []string{"helm", "kustomize", "manifests"},
90+
}
91+
92+
_, deployType, err = selection.Run()
93+
if err != nil {
94+
return err
95+
}
96+
}
97+
98+
workflow := workflows.CreateWorkflowsFromEmbedFS(template.Workflows, dest)
99+
workflowConfig, err := workflow.GetConfig(deployType)
100+
if err != nil {
101+
return fmt.Errorf("get config: %w", err)
102+
}
103+
104+
customInputs, err := prompts.RunPromptsFromConfigWithSkips(workflowConfig, maps.Keys(flagValuesMap))
105+
if err != nil {
106+
return err
107+
}
108+
109+
maps.Copy(customInputs, flagValuesMap)
110+
111+
return workflow.CreateWorkflowFiles(deployType, customInputs, templateWriter)
112+
}

example/dockerfile_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ func TestWriteDockerfile(t *testing.T) {
2828
expectError: false,
2929
},
3030
{
31-
name: "Test Invalid Go Dockerfile Generation",
31+
name: "Test Valid Go Dockerfile Generation with deafult",
3232
inputVariables: map[string]string{
3333
"PORT": "8080",
3434
},
3535
generationLanguage: "go",
36-
expectError: true,
36+
expectError: false,
3737
},
3838
{
3939
name: "Test Invalid GenerationLanguage",

pkg/addons/addons.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ func GenerateAddon(addons embed.FS, provider, addon, dest string, userInputs map
3939
return err
4040
}
4141

42+
addOnConfig.ApplyDefaultVariables(userInputs)
43+
4244
if err = osutil.CopyDir(addons, selectedAddonPath, addonDestPath, &addOnConfig.DraftConfig, userInputs, templateWriter); err != nil {
4345
return err
4446
}

pkg/config/draftconfig.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ type BuilderVar struct {
2424
Description string `yaml:"description"`
2525
VarType string `yaml:"type"`
2626
ExampleValues []string `yaml:"exampleValues"`
27-
IsPromptDisabled bool `yaml:"disablePrompt"`
2827
}
2928

3029
type BuilderVarDefault struct {
31-
Name string `yaml:"name"`
32-
Value string `yaml:"value"`
33-
ReferenceVar string `yaml:"referenceVar"`
30+
Name string `yaml:"name"`
31+
Value string `yaml:"value"`
32+
ReferenceVar string `yaml:"referenceVar"`
33+
IsPromptDisabled bool `yaml:"disablePrompt"`
3434
}
3535

3636
func (d *DraftConfig) GetVariableExampleValues() map[string][]string {
@@ -64,6 +64,17 @@ func (d *DraftConfig) GetNameOverride(path string) string {
6464
return prefix
6565
}
6666

67+
// ApplyDefaultVariables will apply the defaults to variables that are not already set
68+
func (d *DraftConfig) ApplyDefaultVariables(customConfig map[string]string) {
69+
for _, variable := range d.VariableDefaults {
70+
// handle where variable is not set or is set to an empty string from cli handling
71+
if defaultVal, ok := customConfig[variable.Name]; !ok || defaultVal == "" {
72+
log.Infof("Variable %s defaulting to value %s", variable.Name, variable.Value)
73+
customConfig[variable.Name] = variable.Value
74+
}
75+
}
76+
}
77+
6778
// TemplateVariableRecorder is an interface for recording variables that are used read using draft configs
6879
type TemplateVariableRecorder interface {
6980
Record(key, value string)

pkg/deployments/deployments.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ func (d *Deployments) CopyDeploymentFiles(deployType string, customInputs map[st
4646
deployConfig, ok := d.configs[deployType]
4747
if !ok {
4848
deployConfig = nil
49+
} else {
50+
deployConfig.ApplyDefaultVariables(customInputs)
4951
}
5052

5153
if err := osutil.CopyDir(d.deploymentTemplates, srcDir, d.dest, deployConfig, customInputs, templateWriter); err != nil {

pkg/languages/languages.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ func (l *Languages) CreateDockerfileForLanguage(lang string, customInputs map[st
5252
draftConfig, ok := l.configs[lang]
5353
if !ok {
5454
draftConfig = nil
55+
} else {
56+
draftConfig.ApplyDefaultVariables(customInputs)
5557
}
5658

5759
if err := osutil.CopyDir(l.dockerfileTemplates, srcDir, l.dest, draftConfig, customInputs, templateWriter); err != nil {

pkg/prompts/prompts.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func RunPromptsFromConfigWithSkipsIO(config *config.DraftConfig, varsToSkip []st
3535
log.Debugf("Skipping prompt for %s", promptVariableName)
3636
continue
3737
}
38-
if customPrompt.IsPromptDisabled {
38+
if GetIsPromptDisabled(customPrompt.Name, config.VariableDefaults) {
3939
log.Debugf("Skipping prompt for %s as it has IsPromptDisabled=true", promptVariableName)
4040
noPromptDefaultValue := GetVariableDefaultValue(promptVariableName, config.VariableDefaults, inputs)
4141
if noPromptDefaultValue == "" {
@@ -90,6 +90,15 @@ func GetVariableDefaultValue(variableName string, variableDefaults []config.Buil
9090
return defaultValue
9191
}
9292

93+
func GetIsPromptDisabled(variableName string, variableDefaults []config.BuilderVarDefault) bool {
94+
for _, variableDefault := range variableDefaults {
95+
if variableDefault.Name == variableName {
96+
return variableDefault.IsPromptDisabled
97+
}
98+
}
99+
return false
100+
}
101+
93102
func RunBoolPrompt(customPrompt config.BuilderVar, Stdin io.ReadCloser, Stdout io.WriteCloser) (string, error) {
94103
newSelect := &promptui.Select{
95104
Label: "Please select " + customPrompt.Description,

pkg/prompts/prompts_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ func TestRunPromptsFromConfigWithSkipsIO(t *testing.T) {
154154
{
155155
Name: "var1",
156156
Description: "var1 description",
157-
IsPromptDisabled: true,
158157
},
159158
},
160159
VariableDefaults: []config.BuilderVarDefault{
161160
{
162161
Name: "var1",
163162
Value: "defaultValue",
163+
IsPromptDisabled: true,
164164
},
165165
},
166166
},
@@ -176,14 +176,12 @@ func TestRunPromptsFromConfigWithSkipsIO(t *testing.T) {
176176
{
177177
Name: "var1-no-prompt",
178178
Description: "var1 has IsPromptDisabled and should skip prompt and use default value",
179-
IsPromptDisabled: true,
180179
}, {
181180
Name: "var2-default",
182181
Description: "var2 has a default value and will receive an empty value, so it should use the default value",
183182
}, {
184183
Name: "var3-no-prompt",
185184
Description: "var3 has IsPromptDisabled and should skip prompt and use default value",
186-
IsPromptDisabled: true,
187185
}, {
188186
Name: "var4",
189187
Description: "var4 has a default value, but has a value entered, so it should use the entered value",
@@ -193,12 +191,14 @@ func TestRunPromptsFromConfigWithSkipsIO(t *testing.T) {
193191
{
194192
Name: "var1-no-prompt",
195193
Value: "defaultValueNoPrompt1",
194+
IsPromptDisabled: true,
196195
}, {
197196
Name: "var2-default",
198197
Value: "defaultValue2",
199198
}, {
200199
Name: "var3-no-prompt",
201200
Value: "defaultValueNoPrompt3",
201+
IsPromptDisabled: true,
202202
}, {
203203
Name: "var4",
204204
Value: "defaultValue4",

pkg/workflows/workflows.go

Lines changed: 16 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,18 @@ import (
88
"io/ioutil"
99
"os"
1010
"path"
11-
"strings"
1211

13-
"golang.org/x/exp/maps"
1412
"gopkg.in/yaml.v3"
1513
appsv1 "k8s.io/api/apps/v1"
1614
"k8s.io/cli-runtime/pkg/printers"
1715
"k8s.io/client-go/kubernetes/scheme"
1816

19-
"github.com/manifoldco/promptui"
2017
log "github.com/sirupsen/logrus"
2118

2219
"github.com/Azure/draft/pkg/config"
2320
"github.com/Azure/draft/pkg/embedutils"
2421
"github.com/Azure/draft/pkg/osutil"
25-
"github.com/Azure/draft/pkg/prompts"
2622
"github.com/Azure/draft/pkg/templatewriter"
27-
"github.com/Azure/draft/template"
2823
)
2924

3025
const (
@@ -39,50 +34,6 @@ type Workflows struct {
3934
workflowTemplates fs.FS
4035
}
4136

42-
func CreateWorkflows(dest string, deployType string, flagVariables []string, templateWriter templatewriter.TemplateWriter, flagValuesMap map[string]string) error {
43-
if flagValuesMap == nil {
44-
return fmt.Errorf("flagValuesMap is nil")
45-
}
46-
var err error
47-
for _, flagVar := range flagVariables {
48-
flagVarName, flagVarValue, ok := strings.Cut(flagVar, "=")
49-
if !ok {
50-
return fmt.Errorf("invalid variable format: %s", flagVar)
51-
}
52-
flagValuesMap[flagVarName] = flagVarValue
53-
log.Debugf("flag variable %s=%s", flagVarName, flagVarValue)
54-
}
55-
56-
if deployType == "" {
57-
selection := &promptui.Select{
58-
Label: "Select k8s Deployment Type",
59-
Items: []string{"helm", "kustomize", "manifests"},
60-
}
61-
62-
_, deployType, err = selection.Run()
63-
if err != nil {
64-
return err
65-
}
66-
}
67-
68-
workflow := createWorkflowsFromEmbedFS(template.Workflows, dest)
69-
workflowConfig, ok := workflow.configs[deployType]
70-
if !ok {
71-
return errors.New("invalid deployment type")
72-
}
73-
customInputs, err := prompts.RunPromptsFromConfigWithSkips(workflowConfig, maps.Keys(flagValuesMap))
74-
if err != nil {
75-
return err
76-
}
77-
78-
maps.Copy(customInputs, flagValuesMap)
79-
80-
if err = updateProductionDeployments(deployType, dest, customInputs, templateWriter); err != nil {
81-
return err
82-
}
83-
return workflow.createWorkflowFiles(deployType, customInputs, templateWriter)
84-
}
85-
8637
func updateProductionDeployments(deployType, dest string, flagValuesMap map[string]string, templateWriter templatewriter.TemplateWriter) error {
8738
productionImage := fmt.Sprintf("%s.azurecr.io/%s", flagValuesMap["AZURECONTAINERREGISTRY"], flagValuesMap["CONTAINERNAME"])
8839
switch deployType {
@@ -176,7 +127,15 @@ func (w *Workflows) loadConfig(deployType string) (*config.DraftConfig, error) {
176127
return &draftConfig, nil
177128
}
178129

179-
func createWorkflowsFromEmbedFS(workflowTemplates embed.FS, dest string) *Workflows {
130+
func (w *Workflows) GetConfig(deployType string) (*config.DraftConfig, error) {
131+
val, ok := w.configs[deployType]
132+
if !ok {
133+
return nil, fmt.Errorf("deploy type %s unsupported", deployType)
134+
}
135+
return val, nil
136+
}
137+
138+
func CreateWorkflowsFromEmbedFS(workflowTemplates embed.FS, dest string) *Workflows {
180139
deployMap, err := embedutils.EmbedFStoMap(workflowTemplates, parentDirName)
181140
if err != nil {
182141
log.Fatal(err)
@@ -204,7 +163,7 @@ func (w *Workflows) populateConfigs() {
204163
}
205164
}
206165

207-
func (w *Workflows) createWorkflowFiles(deployType string, customInputs map[string]string, templateWriter templatewriter.TemplateWriter) error {
166+
func (w *Workflows) CreateWorkflowFiles(deployType string, customInputs map[string]string, templateWriter templatewriter.TemplateWriter) error {
208167
val, ok := w.workflows[deployType]
209168
if !ok {
210169
return fmt.Errorf("deployment type: %s is not currently supported", deployType)
@@ -214,6 +173,12 @@ func (w *Workflows) createWorkflowFiles(deployType string, customInputs map[stri
214173
workflowConfig, ok := w.configs[deployType]
215174
if !ok {
216175
workflowConfig = nil
176+
} else {
177+
workflowConfig.ApplyDefaultVariables(customInputs)
178+
}
179+
180+
if err := updateProductionDeployments(deployType, w.dest, customInputs, templateWriter); err != nil {
181+
return fmt.Errorf("update production deployments: %w", err)
217182
}
218183

219184
if err := osutil.CopyDir(w.workflowTemplates, srcDir, w.dest, workflowConfig, customInputs, templateWriter); err != nil {

pkg/workflows/workflows_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
func TestCreateWorkflows(t *testing.T) {
2525
dest := "."
2626
deployType := "helm"
27-
flagVariables := []string{}
2827
templatewriter := &writers.LocalFSWriter{}
2928
flagValuesMap := map[string]string{"AZURECONTAINERREGISTRY": "testAcr", "CONTAINERNAME": "testContainer", "RESOURCEGROUP": "testRG", "CLUSTERNAME": "testCluster", "BRANCHNAME": "testBranch", "BUILDCONTEXTPATH": "."}
3029
flagValuesMapNoRoot := map[string]string{"AZURECONTAINERREGISTRY": "testAcr", "CONTAINERNAME": "testContainer", "RESOURCEGROUP": "testRG", "CLUSTERNAME": "testCluster", "BRANCHNAME": "testBranch", "BUILDCONTEXTPATH": "test"}
@@ -108,11 +107,12 @@ func TestCreateWorkflows(t *testing.T) {
108107
err := createTempDeploymentFile("charts", "charts/production.yaml", "../../test/templates/helm/charts/production.yaml")
109108
assert.Nil(t, err)
110109

111-
err = CreateWorkflows(dest, deployType, flagVariables, templatewriter, flagValuesMap)
110+
workflows := CreateWorkflowsFromEmbedFS(template.Workflows, dest)
111+
err = workflows.CreateWorkflowFiles(deployType, flagValuesMap, templatewriter)
112112
if err != nil {
113113
t.Errorf("Default Build Context CreateWorkflows() error = %v, wantErr %v", err, tt.shouldError)
114114
}
115-
err = CreateWorkflows(dest, deployType, flagVariables, templatewriter, flagValuesMapNoRoot)
115+
err = workflows.CreateWorkflowFiles(deployType, flagValuesMapNoRoot, templatewriter)
116116
if err != nil {
117117
t.Errorf("Custom Build Context CreateWorkflows() error = %v, wantErr %v", err, tt.shouldError)
118118
}
@@ -248,18 +248,18 @@ func TestCreateWorkflowFiles(t *testing.T) {
248248

249249
mockWF.populateConfigs()
250250

251-
err = mockWF.createWorkflowFiles("fakeDeployType", customInputs, templatewriter)
251+
err = mockWF.CreateWorkflowFiles("fakeDeployType", customInputs, templatewriter)
252252
assert.NotNil(t, err)
253253

254-
err = mockWF.createWorkflowFiles("helm", customInputs, templatewriter)
254+
err = mockWF.CreateWorkflowFiles("helm", customInputs, templatewriter)
255255
assert.Nil(t, err)
256256
os.RemoveAll(".github")
257257

258-
err = mockWF.createWorkflowFiles("helm", customInputsNoRoot, templatewriter)
258+
err = mockWF.CreateWorkflowFiles("helm", customInputsNoRoot, templatewriter)
259259
assert.Nil(t, err)
260260
os.RemoveAll(".github")
261261

262-
err = mockWF.createWorkflowFiles("helm", badInputs, templatewriter)
262+
err = mockWF.CreateWorkflowFiles("helm", badInputs, templatewriter)
263263
assert.NotNil(t, err)
264264
os.RemoveAll(".github")
265265
}

0 commit comments

Comments
 (0)