Skip to content

Commit 7c8c64d

Browse files
authored
Profiles support for gitops create template (#2244)
1 parent c57efbe commit 7c8c64d

27 files changed

+1124
-362
lines changed

cmd/clusters-service/pkg/server/automations.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func getAutomations(ctx context.Context, client client.Client, ca []*capiv1_prot
177177
})
178178
}
179179

180-
kustomization, err := generateKustomizationFile(ctx, c.IsControlPlane, cluster, client, c.Kustomization, c.FilePath)
180+
kustomization, err := generateKustomizationFile(ctx, c.IsControlPlane, cluster, c.Kustomization, c.FilePath)
181181

182182
if err != nil {
183183
return nil, err

cmd/clusters-service/pkg/server/clusters.go

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,15 @@ func (s *server) CreatePullRequest(ctx context.Context, msg *capiv1_proto.Create
173173
types.NamespacedName{Name: s.cluster},
174174
s.profileHelmRepository,
175175
tmpl,
176-
GetFilesRequest{clusterNamespace, msg.TemplateName, "CAPITemplate", msg.PreviousValues.ParameterValues, msg.PreviousValues.Credentials, msg.PreviousValues.Values, msg.PreviousValues.Kustomizations, msg.PreviousValues.ExternalSecrets},
176+
GetFilesRequest{
177+
ClusterNamespace: clusterNamespace,
178+
TemplateName: msg.TemplateName,
179+
ParameterValues: msg.PreviousValues.ParameterValues,
180+
Credentials: msg.PreviousValues.Credentials,
181+
Profiles: msg.PreviousValues.Values,
182+
Kustomizations: msg.PreviousValues.Kustomizations,
183+
ExternalSecrets: msg.PreviousValues.ExternalSecrets,
184+
},
177185
msg,
178186
)
179187
if err != nil {
@@ -191,7 +199,15 @@ func (s *server) CreatePullRequest(ctx context.Context, msg *capiv1_proto.Create
191199
types.NamespacedName{Name: s.cluster},
192200
s.profileHelmRepository,
193201
tmpl,
194-
GetFilesRequest{clusterNamespace, msg.TemplateName, "CAPITemplate", msg.ParameterValues, msg.Credentials, msg.Values, msg.Kustomizations, msg.ExternalSecrets},
202+
GetFilesRequest{
203+
ClusterNamespace: clusterNamespace,
204+
TemplateName: msg.TemplateName,
205+
ParameterValues: msg.ParameterValues,
206+
Credentials: msg.Credentials,
207+
Profiles: msg.Values,
208+
Kustomizations: msg.Kustomizations,
209+
ExternalSecrets: msg.ExternalSecrets,
210+
},
195211
msg,
196212
)
197213
if err != nil {
@@ -304,7 +320,6 @@ func (s *server) DeleteClustersPullRequest(ctx context.Context, msg *capiv1_prot
304320
Content: nil,
305321
})
306322
}
307-
308323
}
309324
} else {
310325
for _, clusterName := range msg.ClusterNames {
@@ -605,32 +620,15 @@ func createProfileYAML(helmRepo *sourcev1.HelmRepository, helmReleases []*helmv2
605620
// profileValues is what the client will provide to the API.
606621
// It may have > 1 and its values parameter may be empty.
607622
// Assumption: each profile should have a values.yaml that we can treat as the default.
608-
func generateProfileFiles(ctx context.Context, tmpl templatesv1.Template, cluster types.NamespacedName, kubeClient client.Client, args generateProfileFilesParams) ([]gitprovider.CommitFile, error) {
609-
helmRepo := &sourcev1.HelmRepository{}
610-
err := kubeClient.Get(ctx, args.helmRepository, helmRepo)
611-
if err != nil {
612-
return nil, fmt.Errorf("cannot find Helm repository %s/%s: %w", args.helmRepository.Namespace, args.helmRepository.Name, err)
613-
}
614-
helmRepoTemplate := &sourcev1.HelmRepository{
615-
TypeMeta: metav1.TypeMeta{
616-
Kind: sourcev1.HelmRepositoryKind,
617-
APIVersion: sourcev1.GroupVersion.Identifier(),
618-
},
619-
ObjectMeta: metav1.ObjectMeta{
620-
Name: args.helmRepository.Name,
621-
Namespace: args.helmRepository.Namespace,
622-
},
623-
Spec: helmRepo.Spec,
624-
}
625-
623+
func generateProfileFiles(ctx context.Context, tmpl templatesv1.Template, cluster types.NamespacedName, helmRepo *sourcev1.HelmRepository, args generateProfileFilesParams) ([]gitprovider.CommitFile, error) {
626624
tmplProcessor, err := templates.NewProcessorForTemplate(tmpl)
627625
if err != nil {
628626
return nil, err
629627
}
630628

631629
var installs []charts.ChartInstall
632630

633-
requiredProfiles, err := getProfilesFromTemplate(tmpl)
631+
requiredProfiles, err := templates.GetProfilesFromTemplate(tmpl)
634632
if err != nil {
635633
return nil, fmt.Errorf("cannot retrieve default profiles: %w", err)
636634
}
@@ -727,7 +725,7 @@ func generateProfileFiles(ctx context.Context, tmpl templatesv1.Template, cluste
727725
}
728726

729727
// profilesBytes is a map of {path: []byte} where []byte is the content of the profile.
730-
profilesByPath, err := createProfileYAML(helmRepoTemplate, helmReleases, tmpl, getClusterProfilesPath(cluster))
728+
profilesByPath, err := createProfileYAML(helmRepo, helmReleases, tmpl, getClusterProfilesPath(cluster))
731729
if err != nil {
732730
return nil, err
733731
}
@@ -972,7 +970,6 @@ func generateKustomizationFile(
972970
ctx context.Context,
973971
isControlPlane bool,
974972
cluster types.NamespacedName,
975-
kubeClient client.Client,
976973
kustomization *capiv1_proto.Kustomization,
977974
filePath string) (gitprovider.CommitFile, error) {
978975
kustomizationYAML := createKustomizationObject(kustomization)

cmd/clusters-service/pkg/server/clusters_test.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1869,12 +1869,11 @@ func TestGenerateProfileFiles(t *testing.T) {
18691869
Namespace: "test-ns",
18701870
},
18711871
[]helm.Chart{})
1872-
c := createClient(t, makeTestHelmRepository("base"))
18731872
files, err := generateProfileFiles(
18741873
context.TODO(),
18751874
makeTestTemplate(templatesv1.RenderTypeEnvsubst),
18761875
nsn("cluster-foo", "ns-foo"),
1877-
c,
1876+
makeTestHelmRepositoryTemplate("base"),
18781877
generateProfileFilesParams{
18791878
helmRepositoryCluster: types.NamespacedName{Name: "cluster-foo", Namespace: "ns-foo"},
18801879
helmRepository: nsn("testing", "test-ns"),
@@ -1942,7 +1941,6 @@ func TestGenerateProfileFiles_without_editable_flag(t *testing.T) {
19421941
Namespace: "test-ns",
19431942
},
19441943
[]helm.Chart{})
1945-
c := createClient(t, makeTestHelmRepository("base"))
19461944
files, err := generateProfileFiles(
19471945
context.TODO(),
19481946
makeTestTemplateWithProfileAnnotation(
@@ -1951,7 +1949,7 @@ func TestGenerateProfileFiles_without_editable_flag(t *testing.T) {
19511949
"{\"name\": \"foo\", \"version\": \"0.0.1\", \"values\": \"foo: defaultFoo\" }",
19521950
),
19531951
nsn("cluster-foo", "ns-foo"),
1954-
c,
1952+
makeTestHelmRepositoryTemplate("base"),
19551953
generateProfileFilesParams{
19561954
helmRepository: nsn("testing", "test-ns"),
19571955
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2018,7 +2016,6 @@ func TestGenerateProfileFiles_with_editable_flag(t *testing.T) {
20182016
Namespace: "test-ns",
20192017
},
20202018
[]helm.Chart{})
2021-
c := createClient(t, makeTestHelmRepository("base"))
20222019
files, err := generateProfileFiles(
20232020
context.TODO(),
20242021
makeTestTemplateWithProfileAnnotation(
@@ -2027,7 +2024,7 @@ func TestGenerateProfileFiles_with_editable_flag(t *testing.T) {
20272024
"{\"name\": \"foo\", \"version\": \"0.0.1\", \"values\": \"foo: defaultFoo\", \"editable\": true }",
20282025
),
20292026
nsn("management", ""),
2030-
c,
2027+
makeTestHelmRepositoryTemplate("base"),
20312028
generateProfileFilesParams{
20322029
helmRepository: nsn("testing", "test-ns"),
20332030
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2094,7 +2091,6 @@ func TestGenerateProfileFiles_with_templates(t *testing.T) {
20942091
Namespace: "test-ns",
20952092
},
20962093
[]helm.Chart{})
2097-
c := createClient(t, makeTestHelmRepository("base"))
20982094
params := map[string]string{
20992095
"CLUSTER_NAME": "test-cluster-name",
21002096
"NAMESPACE": "default",
@@ -2104,7 +2100,7 @@ func TestGenerateProfileFiles_with_templates(t *testing.T) {
21042100
context.TODO(),
21052101
makeTestTemplate(templatesv1.RenderTypeEnvsubst),
21062102
nsn("cluster-foo", "ns-foo"),
2107-
c,
2103+
makeTestHelmRepositoryTemplate("base"),
21082104
generateProfileFilesParams{
21092105
helmRepository: nsn("testing", "test-ns"),
21102106
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2171,12 +2167,11 @@ func TestGenerateProfileFilesWithLayers(t *testing.T) {
21712167
Namespace: "test-ns",
21722168
},
21732169
[]helm.Chart{})
2174-
c := createClient(t, makeTestHelmRepository("base"))
21752170
files, err := generateProfileFiles(
21762171
context.TODO(),
21772172
makeTestTemplate(templatesv1.RenderTypeEnvsubst),
21782173
nsn("cluster-foo", "ns-foo"),
2179-
c,
2174+
makeTestHelmRepositoryTemplate("base"),
21802175
generateProfileFilesParams{
21812176
helmRepository: nsn("testing", "test-ns"),
21822177
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2278,7 +2273,6 @@ func TestGenerateProfileFiles_with_text_templates(t *testing.T) {
22782273
Namespace: "test-ns",
22792274
},
22802275
[]helm.Chart{})
2281-
c := createClient(t, makeTestHelmRepository("base"))
22822276
params := map[string]string{
22832277
"CLUSTER_NAME": "test-cluster-name",
22842278
"NAMESPACE": "default",
@@ -2289,7 +2283,7 @@ func TestGenerateProfileFiles_with_text_templates(t *testing.T) {
22892283
context.TODO(),
22902284
makeTestTemplate(templatesv1.RenderTypeTemplating),
22912285
nsn("cluster-foo", "ns-foo"),
2292-
c,
2286+
makeTestHelmRepositoryTemplate("base"),
22932287
generateProfileFilesParams{
22942288
helmRepository: nsn("testing", "test-ns"),
22952289
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2356,7 +2350,6 @@ func TestGenerateProfileFiles_with_required_profiles_only(t *testing.T) {
23562350
Namespace: "test-ns",
23572351
},
23582352
[]helm.Chart{})
2359-
c := createClient(t, makeTestHelmRepository("base"))
23602353
values := []byte("foo: defaultFoo")
23612354
profile := fmt.Sprintf("{\"name\": \"foo\", \"version\": \"0.0.1\", \"values\": \"%s\" }", values)
23622355
files, err := generateProfileFiles(
@@ -2367,7 +2360,7 @@ func TestGenerateProfileFiles_with_required_profiles_only(t *testing.T) {
23672360
profile,
23682361
),
23692362
nsn("cluster-foo", "ns-foo"),
2370-
c,
2363+
makeTestHelmRepositoryTemplate("base"),
23712364
generateProfileFilesParams{
23722365
helmRepository: nsn("testing", "test-ns"),
23732366
helmRepositoryCluster: types.NamespacedName{
@@ -2436,12 +2429,11 @@ func TestGenerateProfileFiles_reading_layer_from_cache(t *testing.T) {
24362429
Layer: "layer-1",
24372430
},
24382431
})
2439-
c := createClient(t, makeTestHelmRepository("base"))
24402432
files, err := generateProfileFiles(
24412433
context.TODO(),
24422434
makeTestTemplate(templatesv1.RenderTypeEnvsubst),
24432435
nsn("cluster-foo", "ns-foo"),
2444-
c,
2436+
makeTestHelmRepositoryTemplate("base"),
24452437
generateProfileFilesParams{
24462438
helmRepository: nsn("testing", "test-ns"),
24472439
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2552,8 +2544,6 @@ func TestGenerateProfilePaths(t *testing.T) {
25522544
},
25532545
})
25542546

2555-
c := createClient(t, makeTestHelmRepository("base"))
2556-
25572547
expectedHelmRelease := `apiVersion: source.toolkit.fluxcd.io/v1beta2
25582548
kind: HelmRepository
25592549
metadata:
@@ -2708,7 +2698,7 @@ status: {}
27082698
context.TODO(),
27092699
tt.template,
27102700
nsn("cluster-foo", "ns-foo"),
2711-
c,
2701+
makeTestHelmRepositoryTemplate("base"),
27122702
generateProfileFilesParams{
27132703
helmRepository: nsn("testing", "test-ns"),
27142704
helmRepositoryCluster: types.NamespacedName{Name: "management"},
@@ -2739,6 +2729,14 @@ func concatYaml(yamls ...string) string {
27392729
return strings.Join(yamls, "---\n")
27402730
}
27412731

2732+
// generateProfiles takes in a HelmRepo that we are going to write to git,
2733+
// it shouldn't have Status etc set
2734+
func makeTestHelmRepositoryTemplate(base string) *sourcev1.HelmRepository {
2735+
return makeTestHelmRepository(base, func(hr *sourcev1.HelmRepository) {
2736+
hr.Status = sourcev1.HelmRepositoryStatus{}
2737+
})
2738+
}
2739+
27422740
func makeCommitFile(path, content string) gitprovider.CommitFile {
27432741
p := path
27442742
c := content

cmd/clusters-service/pkg/server/template_response.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func ToTemplateResponse(t apitemplates.Template) *capiv1_proto.Template {
6060
})
6161
}
6262

63-
res.Profiles, err = getProfilesFromTemplate(t)
63+
res.Profiles, err = templates.GetProfilesFromTemplate(t)
6464
if err != nil {
6565
res.Error = fmt.Sprintf("Couldn't load profiles from template: %s", err.Error())
6666
return res

cmd/clusters-service/pkg/server/template_response_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,10 @@ func TestToTemplate(t *testing.T) {
154154
},
155155
Profiles: []*capiv1_protos.TemplateProfile{
156156
{
157-
Name: "cert-manager",
158-
Version: "0.0.7",
159-
Values: "installCRDs: ${INSTALL_CRDS}",
157+
Name: "cert-manager",
158+
Version: "0.0.7",
159+
Values: "installCRDs: ${INSTALL_CRDS}",
160+
Required: true,
160161
},
161162
},
162163
Parameters: []*capiv1_protos.Parameter{
@@ -192,9 +193,10 @@ func TestToTemplate(t *testing.T) {
192193
},
193194
Profiles: []*capiv1_protos.TemplateProfile{
194195
{
195-
Name: "cert-manager",
196-
Version: "0.0.7",
197-
Values: "installCRDs: {{ .params.INSTALL_CRDS }}",
196+
Name: "cert-manager",
197+
Version: "0.0.7",
198+
Values: "installCRDs: {{ .params.INSTALL_CRDS }}",
199+
Required: true,
198200
},
199201
},
200202
Parameters: []*capiv1_protos.Parameter{

0 commit comments

Comments
 (0)