Skip to content
This repository has been archived by the owner on Jan 14, 2024. It is now read-only.

Commit

Permalink
test: Increase tests coverage for parseRenderedManifests()
Browse files Browse the repository at this point in the history
  • Loading branch information
B&R committed Jan 2, 2023
1 parent 00aa487 commit 1c27f31
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 11 deletions.
24 changes: 13 additions & 11 deletions pkg/bmg/templating.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,16 @@ func RenderKubernetesResourcesForOperation(logger *logrus.Entry, backup domain.R
if genErr != nil {
return []unstructured.Unstructured{}, errors.Wrap(genErr, "error while generating manifests")
}
return readRenderedManifests(logger, dir+"/output/"+string(operation)+".yaml", acceptedResourceTypes)

// read what was generated
manifestsPath := dir + "/output/" + string(operation) + ".yaml"
content, readErr := os.ReadFile(manifestsPath)
if readErr != nil {
return []unstructured.Unstructured{}, errors.Wrap(readErr, fmt.Sprintf(
"cannot read rendered manifest file at path '%s'", manifestsPath))
}

return parseRenderedManifests(logger, string(content), acceptedResourceTypes)
}

// writeTemplate is writing the backup/restore procedure template
Expand Down Expand Up @@ -150,20 +159,13 @@ func writeTemplate(logger *logrus.Entry, template domain.Template, operation dom
return os.WriteFile(path, []byte(content), 0700)
}

// readRenderedManifests is reading manifests from YAML into []UnstructuredObject
func readRenderedManifests(logger *logrus.Entry, manifestPath string, kindsToRender domain.ResourceTypes) ([]unstructured.Unstructured, error) {
// reading
content, readErr := os.ReadFile(manifestPath)
if readErr != nil {
return []unstructured.Unstructured{}, errors.Wrap(readErr, fmt.Sprintf(
"cannot read rendered manifest file at path '%s'", manifestPath))
}

// parseRenderedManifests is reading manifests from YAML into []UnstructuredObject
func parseRenderedManifests(logger *logrus.Entry, content string, kindsToRender domain.ResourceTypes) ([]unstructured.Unstructured, error) {
decoder := apiyaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme)

// parsing
var objects []unstructured.Unstructured
docsContent := strings.Split(string(content), "---\n")
docsContent := strings.Split(content, "---\n")

for _, doc := range docsContent {
doc = strings.Trim(strings.Replace(doc, "---\n", "", 1), " \n")
Expand Down
128 changes: 128 additions & 0 deletions pkg/bmg/templating_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,131 @@ func TestWriteTemplate_InternalTemplate(t *testing.T) {
assert.NotNil(t, existsErr)
assert.Contains(t, existsErr.Error(), "no such file or directory")
}

func TestParseRenderedManifests_FiltersOutKinds_RBACase(t *testing.T) {
content := `---
apiVersion: v1
kind: ConfigMap
metadata:
name: app1-backup
data:
hello: world
goodbye: capitalism
---
apiVersion: batch/v1
kind: Job
metadata:
name: app1-backup
`

objects, err := parseRenderedManifests(logrus.WithContext(context.TODO()), content,
domain.NewResourceTypesFilterForRequestedBackupAction())

assert.Len(t, objects, 1)
assert.Equal(t, "Job", objects[0].GroupVersionKind().Kind)
assert.Nil(t, err)
}

func TestParseRenderedManifests_FiltersOutKinds_SBCase(t *testing.T) {
content := `---
apiVersion: v1
kind: ConfigMap
metadata:
name: app1-backup
data:
hello: world
goodbye: capitalism
---
apiVersion: v1
kind: Secret
metadata:
name: app1-backup
---
apiVersion: batch/v1
kind: Job
metadata:
name: app1-backup
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: app1-backup
`

objects, err := parseRenderedManifests(logrus.WithContext(context.TODO()), content,
domain.NewResourceTypesFilterForScheduledBackup(
&domain.ScheduledBackupAggregate{
ScheduledBackup: &v1alpha1.ScheduledBackup{
Spec: v1alpha1.ScheduledBackupSpec{
Operation: "backup",
CronJob: v1alpha1.CronJobSpec{
Enabled: false,
ScheduleEvery: "",
},
},
},
},
domain.Backup,
))

assert.Len(t, objects, 2)
assert.Equal(t, "ConfigMap", objects[0].GroupVersionKind().Kind)
assert.Equal(t, "Secret", objects[1].GroupVersionKind().Kind)
assert.Nil(t, err)
}

func TestParseRenderedManifests_FiltersOutKinds_SBCase_WithCronJob(t *testing.T) {
content := `---
apiVersion: v1
kind: ConfigMap
metadata:
name: app1-backup
data:
hello: world
goodbye: capitalism
---
apiVersion: v1
kind: Secret
metadata:
name: app1-backup
---
apiVersion: batch/v1
kind: Job
metadata:
name: app1-backup
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: app1-backup
`

objects, err := parseRenderedManifests(logrus.WithContext(context.TODO()), content,
domain.NewResourceTypesFilterForScheduledBackup(
&domain.ScheduledBackupAggregate{
ScheduledBackup: &v1alpha1.ScheduledBackup{
Spec: v1alpha1.ScheduledBackupSpec{
Operation: "backup",
CronJob: v1alpha1.CronJobSpec{
Enabled: true, // NOTICE HERE: CronJob is enabled
ScheduleEvery: "*/3 * * * *",
},
},
},
},
domain.Backup,
))

assert.Len(t, objects, 3)
assert.Equal(t, "ConfigMap", objects[0].GroupVersionKind().Kind)
assert.Equal(t, "Secret", objects[1].GroupVersionKind().Kind)
assert.Equal(t, "CronJob", objects[2].GroupVersionKind().Kind)
assert.Nil(t, err)
}

0 comments on commit 1c27f31

Please sign in to comment.