Skip to content

Commit f52f757

Browse files
committed
feat(manifest): Introduce manifest.Environments type and use it in the manifest
This type includes the selected `EnvironmentDefinitions` as well as the names of all environments and groups.
1 parent b87e860 commit f52f757

25 files changed

+829
-577
lines changed

cmd/monaco/completion/completion.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func loadEnvironmentsFromManifest(manifestPath string) ([]string, cobra.ShellCom
9797
ManifestPath: manifestPath,
9898
})
9999

100-
return maps.Keys(man.SelectedEnvironments), cobra.ShellCompDirectiveDefault
100+
return maps.Keys(man.Environments.SelectedEnvironments), cobra.ShellCompDirectiveDefault
101101
}
102102

103103
func AccountsByManifestFlag(cmd *cobra.Command, _ []string, _ string) ([]string, cobra.ShellCompDirective) {

cmd/monaco/delete/command.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func GetDeleteCommand(fs afero.Fs) (deleteCmd *cobra.Command) {
8181
return fmt.Errorf("encountered errors while parsing %s: %w", deleteFile, err)
8282
}
8383

84-
return Delete(cmd.Context(), manifest.SelectedEnvironments, entriesToDelete)
84+
return Delete(cmd.Context(), manifest.Environments.SelectedEnvironments, entriesToDelete)
8585
},
8686
ValidArgsFunction: completion.DeleteCompletion,
8787
}

cmd/monaco/deploy/deploy.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ func deployConfigs(ctx context.Context, fs afero.Fs, manifestPath string, enviro
5151
return err
5252
}
5353

54-
ok := verifyEnvironmentGen(ctx, loadedManifest.SelectedEnvironments, dryRun)
54+
ok := verifyEnvironmentGen(ctx, loadedManifest.Environments.SelectedEnvironments, dryRun)
5555
if !ok {
5656
return fmt.Errorf("unable to verify Dynatrace environment generation")
5757
}
@@ -61,21 +61,21 @@ func deployConfigs(ctx context.Context, fs afero.Fs, manifestPath string, enviro
6161
return err
6262
}
6363

64-
if err := validateProjectsWithEnvironments(ctx, loadedProjects, loadedManifest.SelectedEnvironments); err != nil {
64+
if err := validateProjectsWithEnvironments(ctx, loadedProjects, loadedManifest.Environments.SelectedEnvironments); err != nil {
6565
return err
6666
}
6767

6868
logging.LogProjectsInfo(loadedProjects)
69-
logging.LogEnvironmentsInfo(loadedManifest.SelectedEnvironments)
69+
logging.LogEnvironmentsInfo(loadedManifest.Environments.SelectedEnvironments)
7070

71-
err = validateAuthenticationWithProjectConfigs(loadedProjects, loadedManifest.SelectedEnvironments)
71+
err = validateAuthenticationWithProjectConfigs(loadedProjects, loadedManifest.Environments.SelectedEnvironments)
7272
if err != nil {
7373
formattedErr := fmt.Errorf("manifest auth field misconfigured: %w", err)
7474
report.GetReporterFromContextOrDiscard(ctx).ReportLoading(report.StateError, formattedErr, "", nil)
7575
return formattedErr
7676
}
7777

78-
clientSets, err := dynatrace.CreateEnvironmentClients(ctx, loadedManifest.SelectedEnvironments, dryRun)
78+
clientSets, err := dynatrace.CreateEnvironmentClients(ctx, loadedManifest.Environments.SelectedEnvironments, dryRun)
7979
if err != nil {
8080
formattedErr := fmt.Errorf("failed to create API clients: %w", err)
8181
report.GetReporterFromContextOrDiscard(ctx).ReportLoading(report.StateError, formattedErr, "", nil)

cmd/monaco/download/download_configs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (d DefaultCommand) DownloadConfigsBasedOnManifest(ctx context.Context, fs a
9090
return err
9191
}
9292

93-
env, found := m.SelectedEnvironments[cmdOptions.specificEnvironmentName]
93+
env, found := m.Environments.SelectedEnvironments[cmdOptions.specificEnvironmentName]
9494
if !found {
9595
return fmt.Errorf("environment %q was not available in manifest %q", cmdOptions.specificEnvironmentName, cmdOptions.manifestFile)
9696
}

cmd/monaco/generate/dependencygraph/dependencygraph.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func writeGraphFiles(ctx context.Context, fs afero.Fs, manifestPath string, envi
104104
})
105105
}
106106

107-
graphs := graph.New(projects, m.SelectedEnvironments.Names(), opts...)
107+
graphs := graph.New(projects, m.Environments.SelectedEnvironments.Names(), opts...)
108108

109109
folderPath, err := filepath.Abs(outputFolder)
110110
if err != nil {
@@ -128,7 +128,7 @@ func writeGraphFiles(ctx context.Context, fs afero.Fs, manifestPath string, envi
128128
}
129129
}
130130

131-
for _, e := range m.SelectedEnvironments.Names() {
131+
for _, e := range m.Environments.SelectedEnvironments.Names() {
132132
b, err := graphs.EncodeToDOT(e)
133133
if err != nil {
134134
return ExportError{

cmd/monaco/integrationtest/assert.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ func AssertAllConfigsAvailability(t *testing.T, fs afero.Fs, manifestPath string
7171

7272
projects := LoadProjects(t, fs, manifestPath, loadedManifest)
7373

74-
envNames := make([]string, 0, len(loadedManifest.SelectedEnvironments))
74+
envNames := make([]string, 0, len(loadedManifest.Environments.SelectedEnvironments))
7575

76-
for _, env := range loadedManifest.SelectedEnvironments {
76+
for _, env := range loadedManifest.Environments.SelectedEnvironments {
7777
envNames = append(envNames, env.Name)
7878
}
7979

@@ -100,7 +100,7 @@ func AssertAllConfigsAvailability(t *testing.T, fs afero.Fs, manifestPath string
100100

101101
for envName, configs := range sortedConfigs {
102102

103-
env := loadedManifest.SelectedEnvironments[envName]
103+
env := loadedManifest.Environments.SelectedEnvironments[envName]
104104

105105
clients := CreateDynatraceClients(t, env)
106106

cmd/monaco/integrationtest/v2/delete_integration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ environmentGroups:
254254
assert.Empty(t, errs)
255255

256256
envName := "environment"
257-
env := man.SelectedEnvironments[envName]
257+
env := man.Environments.SelectedEnvironments[envName]
258258
clientSet := integrationtest.CreateDynatraceClients(t, env)
259259

260260
// check the setting was deleted
@@ -339,7 +339,7 @@ configs:
339339
assert.Empty(t, errs)
340340

341341
envName := "environment"
342-
env := man.SelectedEnvironments[envName]
342+
env := man.Environments.SelectedEnvironments[envName]
343343
clientSet := integrationtest.CreateDynatraceClients(t, env)
344344
apis := api.NewAPIs()
345345

cmd/monaco/integrationtest/v2/diff_project_diff_ext_id_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func TestSettingsInDifferentProjectsGetDifferentExternalIDs(t *testing.T) {
4747

4848
var manifestPath = diffProjectDiffExtIDFolderManifest
4949
loadedManifest := integrationtest.LoadManifest(t, fs, manifestPath, "")
50-
environment := loadedManifest.SelectedEnvironments["platform_env"]
50+
environment := loadedManifest.Environments.SelectedEnvironments["platform_env"]
5151
projects := integrationtest.LoadProjects(t, fs, manifestPath, loadedManifest)
5252
sortedConfigs, _ := graph.SortProjects(projects, []string{"platform_env"})
5353

cmd/monaco/integrationtest/v2/documents_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestDocuments(t *testing.T) {
5757
assert.Empty(t, errs)
5858

5959
// check isPrivate == false
60-
clientSet := integrationtest.CreateDynatraceClients(t, man.SelectedEnvironments[environment])
60+
clientSet := integrationtest.CreateDynatraceClients(t, man.Environments.SelectedEnvironments[environment])
6161
result, err := clientSet.DocumentClient.List(t.Context(), fmt.Sprintf("name='my-notebook_%s'", testContext.suffix))
6262
assert.NoError(t, err)
6363
assert.Len(t, result.Responses, 1)

cmd/monaco/integrationtest/v2/scoped_configs_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func assertOverallDashboardSharedState(t *testing.T, fs afero.Fs, testContext Te
6767
})
6868
assert.Empty(t, errs)
6969

70-
environmentDefinition := man.SelectedEnvironments[environment]
70+
environmentDefinition := man.Environments.SelectedEnvironments[environment]
7171
clientSet := integrationtest.CreateDynatraceClients(t, environmentDefinition)
7272
apis := api.NewAPIs()
7373

cmd/monaco/integrationtest/v2/segments_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func createSegmentsClient(t *testing.T, fs afero.Fs, manifestPath string, enviro
166166
})
167167
assert.Empty(t, errs)
168168

169-
clientSet := integrationtest.CreateDynatraceClients(t, man.SelectedEnvironments[environment])
169+
clientSet := integrationtest.CreateDynatraceClients(t, man.Environments.SelectedEnvironments[environment])
170170
return clientSet.SegmentClient
171171
}
172172

cmd/monaco/integrationtest/v2/settings_acl_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func TestSettingsWithACL(t *testing.T) {
8181
require.NoError(t, err)
8282

8383
loadedManifest := integrationtest.LoadManifest(t, fs, manifestPath, environment)
84-
environmentDefinition := loadedManifest.SelectedEnvironments[environment]
84+
environmentDefinition := loadedManifest.Environments.SelectedEnvironments[environment]
8585
client := createSettingsClientPlatform(t, environmentDefinition)
8686

8787
coord := coordinate.Coordinate{

cmd/monaco/integrationtest/v2/settings_integration_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func TestOldExternalIDGetsUpdated(t *testing.T) {
9090
loadedManifest := integrationtest.LoadManifest(t, fs, manifestPath, env)
9191
projects := integrationtest.LoadProjects(t, fs, manifestPath, loadedManifest)
9292
sortedConfigs, _ := graph.SortProjects(projects, []string{env})
93-
environment := loadedManifest.SelectedEnvironments[env]
93+
environment := loadedManifest.Environments.SelectedEnvironments[env]
9494
configToDeploy := sortedConfigs[env][0]
9595

9696
defer func() {
@@ -210,7 +210,7 @@ func TestOrderedSettings(t *testing.T) {
210210
integrationtest.AssertAllConfigsAvailability(t, fs, manifestPath, []string{"project"}, "platform_env", true)
211211

212212
loadedManifest := integrationtest.LoadManifest(t, fs, manifestPath, "platform_env")
213-
environment := loadedManifest.SelectedEnvironments["platform_env"]
213+
environment := loadedManifest.Environments.SelectedEnvironments["platform_env"]
214214
settingsClient := createSettingsClient(t, environment)
215215

216216
results, err := settingsClient.List(t.Context(), "builtin:processavailability", dtclient.ListSettingsOptions{
@@ -235,7 +235,7 @@ func TestOrderedSettings(t *testing.T) {
235235
integrationtest.AssertAllConfigsAvailability(t, fs, manifestPath, []string{"project"}, "platform_env", true)
236236

237237
loadedManifest := integrationtest.LoadManifest(t, fs, manifestPath, "platform_env")
238-
environment := loadedManifest.SelectedEnvironments["platform_env"]
238+
environment := loadedManifest.Environments.SelectedEnvironments["platform_env"]
239239
settingsClient := createSettingsClient(t, environment)
240240

241241
results, err := settingsClient.List(t.Context(), "builtin:processavailability", dtclient.ListSettingsOptions{
@@ -267,7 +267,7 @@ func TestOrderedSettingsCrossProjects(t *testing.T) {
267267
integrationtest.AssertAllConfigsAvailability(t, fs, manifestPath, []string{"source"}, "platform_env", true)
268268

269269
loadedManifest := integrationtest.LoadManifest(t, fs, manifestPath, "platform_env")
270-
environment := loadedManifest.SelectedEnvironments["platform_env"]
270+
environment := loadedManifest.Environments.SelectedEnvironments["platform_env"]
271271
settingsClient := createSettingsClient(t, environment)
272272
results, err := settingsClient.List(t.Context(), schema, dtclient.ListSettingsOptions{
273273
DiscardValue: true,
@@ -556,7 +556,7 @@ func createSettingsClientFromManifest(t *testing.T, fs afero.Fs, manifestPath st
556556
})
557557
assert.Empty(t, errs)
558558

559-
clientSet := integrationtest.CreateDynatraceClients(t, man.SelectedEnvironments[environment])
559+
clientSet := integrationtest.CreateDynatraceClients(t, man.Environments.SelectedEnvironments[environment])
560560
return clientSet.SettingsClient
561561
}
562562

cmd/monaco/integrationtest/v2/skip_e2e_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func TestSkip(t *testing.T) {
103103
loadedManifest := integrationtest.LoadManifest(t, afero.OsFs{}, manifest, "")
104104
clients := make(map[string]client.SettingsClient)
105105

106-
for name, def := range loadedManifest.SelectedEnvironments {
106+
for name, def := range loadedManifest.Environments.SelectedEnvironments {
107107
set := integrationtest.CreateDynatraceClients(t, def)
108108
clients[name] = set.SettingsClient
109109
}

cmd/monaco/integrationtest/v2/slo-v2_integration_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func createSloV2Client(t *testing.T, fs afero.Fs, manifestPath string, environme
118118
})
119119
assert.Empty(t, errs)
120120

121-
clientSet := integrationtest.CreateDynatraceClients(t, man.SelectedEnvironments[environment])
121+
clientSet := integrationtest.CreateDynatraceClients(t, man.Environments.SelectedEnvironments[environment])
122122
return clientSet.ServiceLevelObjectiveClient
123123
}
124124

cmd/monaco/purge/purge.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func purge(ctx context.Context, fs afero.Fs, deploymentManifestPath string, envi
5757
return errors.New("error while loading manifest")
5858
}
5959

60-
return purgeConfigs(ctx, maps.Values(mani.SelectedEnvironments), apis)
60+
return purgeConfigs(ctx, maps.Values(mani.Environments.SelectedEnvironments), apis)
6161
}
6262

6363
func purgeConfigs(ctx context.Context, environments []manifest.EnvironmentDefinition, apis api.APIs) error {

pkg/download/download_writer.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,20 @@ func writeToDisk(fs afero.Fs, writerContext WriterContext) error {
7070

7171
manifest := manifest.Manifest{
7272
Projects: projectDefinition,
73-
SelectedEnvironments: map[string]manifest.EnvironmentDefinition{
74-
writerContext.ProjectToWrite.Id: {
75-
Name: writerContext.ProjectToWrite.Id,
76-
URL: writerContext.EnvironmentUrl,
77-
Group: "default",
78-
Auth: writerContext.Auth,
73+
Environments: manifest.Environments{
74+
SelectedEnvironments: map[string]manifest.EnvironmentDefinition{
75+
writerContext.ProjectToWrite.Id: {
76+
Name: writerContext.ProjectToWrite.Id,
77+
URL: writerContext.EnvironmentUrl,
78+
Group: "default",
79+
Auth: writerContext.Auth,
80+
},
81+
},
82+
AllEnvironmentNames: map[string]struct{}{
83+
writerContext.ProjectToWrite.Id: {},
84+
},
85+
AllGroupNames: map[string]struct{}{
86+
"default": {},
7987
},
8088
},
8189
}

pkg/manifest/loader/manifest_loader.go

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,12 @@ func Load(context *Context) (manifest.Manifest, []error) {
180180
}
181181

182182
// environments
183-
var environmentDefinitions map[string]manifest.EnvironmentDefinition
183+
var environments manifest.Environments
184184
if len(manifestYAML.EnvironmentGroups) > 0 {
185185
var manifestErrors []error
186-
if environmentDefinitions, manifestErrors = parseEnvironments(context, manifestYAML.EnvironmentGroups); manifestErrors != nil {
186+
if environments, manifestErrors = parseEnvironments(context, manifestYAML.EnvironmentGroups); len(manifestErrors) > 0 {
187187
errs = append(errs, manifestErrors...)
188-
} else if len(environmentDefinitions) == 0 {
188+
} else if len(environments.AllEnvironmentNames) == 0 {
189189
errs = append(errs, newManifestLoaderError(context.ManifestPath, "no environments defined in manifest"))
190190
}
191191
}
@@ -202,9 +202,9 @@ func Load(context *Context) (manifest.Manifest, []error) {
202202
}
203203

204204
return manifest.Manifest{
205-
Projects: projectDefinitions,
206-
SelectedEnvironments: environmentDefinitions,
207-
Accounts: accounts,
205+
Projects: projectDefinitions,
206+
Environments: environments,
207+
Accounts: accounts,
208208
}, nil
209209
}
210210

@@ -346,23 +346,23 @@ func validateVersion(m persistence.Manifest) error {
346346
return nil
347347
}
348348

349-
func parseEnvironments(context *Context, groups []persistence.Group) (map[string]manifest.EnvironmentDefinition, []error) { // nolint:gocognit
349+
func parseEnvironments(context *Context, groups []persistence.Group) (manifest.Environments, []error) { // nolint:gocognit
350350
var errors []error
351-
environments := make(map[string]manifest.EnvironmentDefinition)
351+
selectedEnvironments := make(map[string]manifest.EnvironmentDefinition)
352352

353-
groupNames := make(map[string]bool, len(groups))
354-
envNames := make(map[string]bool, len(groups))
353+
allGroupNames := make(map[string]struct{}, len(groups))
354+
allEnvironmentNames := make(map[string]struct{}, len(groups))
355355

356356
for i, group := range groups {
357357
if group.Name == "" {
358358
errors = append(errors, newManifestLoaderError(context.ManifestPath, fmt.Sprintf("missing group name on index `%d`", i)))
359359
}
360360

361-
if groupNames[group.Name] {
361+
if _, exists := allGroupNames[group.Name]; exists {
362362
errors = append(errors, newManifestLoaderError(context.ManifestPath, fmt.Sprintf("duplicated group name %q", group.Name)))
363363
}
364364

365-
groupNames[group.Name] = true
365+
allGroupNames[group.Name] = struct{}{}
366366

367367
for j, env := range group.Environments {
368368

@@ -371,11 +371,11 @@ func parseEnvironments(context *Context, groups []persistence.Group) (map[string
371371
continue
372372
}
373373

374-
if envNames[env.Name] {
374+
if _, exists := allEnvironmentNames[env.Name]; exists {
375375
errors = append(errors, newManifestLoaderError(context.ManifestPath, fmt.Sprintf("duplicated environment name %q", env.Name)))
376376
continue
377377
}
378-
envNames[env.Name] = true
378+
allEnvironmentNames[env.Name] = struct{}{}
379379

380380
// skip loading if environments is not empty, the environments does not contain the env name, or the group should not be included
381381
if shouldSkipEnv(context, group, env) {
@@ -390,28 +390,32 @@ func parseEnvironments(context *Context, groups []persistence.Group) (map[string
390390
continue
391391
}
392392

393-
environments[parsedEnv.Name] = parsedEnv
393+
selectedEnvironments[parsedEnv.Name] = parsedEnv
394394
}
395395
}
396396

397397
// validate that all required groups & environments are included
398398
for _, g := range context.Groups {
399-
if !groupNames[g] {
399+
if _, exists := allGroupNames[g]; !exists {
400400
errors = append(errors, newManifestLoaderError(context.ManifestPath, fmt.Sprintf("requested group %q not found", g)))
401401
}
402402
}
403403

404404
for _, e := range context.Environments {
405-
if !envNames[e] {
405+
if _, exists := allEnvironmentNames[e]; !exists {
406406
errors = append(errors, newManifestLoaderError(context.ManifestPath, fmt.Sprintf("requested environment %q not found", e)))
407407
}
408408
}
409409

410410
if errors != nil {
411-
return nil, errors
411+
return manifest.Environments{}, errors
412412
}
413413

414-
return environments, nil
414+
return manifest.Environments{
415+
SelectedEnvironments: selectedEnvironments,
416+
AllEnvironmentNames: allEnvironmentNames,
417+
AllGroupNames: allGroupNames,
418+
}, nil
415419
}
416420

417421
func shouldSkipEnv(context *Context, group persistence.Group, env persistence.Environment) bool {

0 commit comments

Comments
 (0)