func()

in pkg/controller/direct/mappings/validation.go [51:176]


func (m *structTypeMapping) validate(checkMissing bool) []ValidationError {
	var errors []ValidationError

	for _, mapping := range m.fields {
		inField := m.inType.lookupField(mapping.InPath)
		outField := m.outType.lookupField(mapping.OutPath)

		if inField == nil {
			err := ValidationError{Message: fmt.Sprintf("field %s not found in input type %v", mapping.InPath, m.inType)}
			if outField != nil {
				err.Proposal = buildGoField(outField)
			}

			errors = append(errors, err)
			continue
		}
		if outField == nil {
			proposal := buildGoField(inField)

			klog.Infof("outType.Fields = %v", m.outType.Fields())

			errors = append(errors, ValidationError{
				Message:  fmt.Sprintf("field %s not found in output type %v", mapping.OutPath, m.outType),
				Proposal: proposal,
			})
			continue
		}

	}

	if checkMissing {

		if m.hasSpecStatus {
			specField := m.inType.lookupField(parseFieldPath("spec"))
			statusField := m.inType.lookupField(parseFieldPath("status"))
			if specField != nil && statusField != nil {
				specType := specField.Type()
				statusType := statusField.Type()

				for _, cloudField := range m.outType.Fields() {
					id := cloudField.ID()

					ignore := false
					for _, ignoreField := range m.ignore {
						if ignoreField.ID == id {
							ignore = true
						}
					}
					if ignore {
						continue
					}
					specField := specType.lookupField(newFieldPath(id))
					statusField := statusType.lookupField(newFieldPath(id))

					if specField == nil && statusField == nil {
						proposal := buildGoField(cloudField)

						errors = append(errors, ValidationError{
							Message:  fmt.Sprintf("field %s not found in KRM spec nor status %v", id, m.inType),
							Proposal: proposal,
						})
						continue
					}
				}
			}
		} else {
			for _, outField := range m.outType.Fields() {
				id := outField.ID()

				found := false
				for _, mapping := range m.fields {
					if len(mapping.OutPath.fields) == 1 && mapping.OutPath.fields[0] == id {
						found = true
					}
				}
				if found {
					continue
				}

				ignore := false
				for _, ignoreField := range m.ignore {
					if ignoreField.ID == id {
						ignore = true
					}
				}
				if ignore {
					continue
				}
				errors = append(errors, ValidationError{
					Message: fmt.Sprintf("field %s is not mapped in %v", id, m.outType),
					// Proposal: proposal,
				})
			}

			for _, inField := range m.inType.Fields() {
				id := inField.ID()

				found := false
				for _, mapping := range m.fields {
					if len(mapping.InPath.fields) == 1 && mapping.InPath.fields[0] == id {
						found = true
					}
				}
				if found {
					continue
				}

				ignore := false
				for _, ignoreField := range m.ignore {
					if ignoreField.ID == id {
						ignore = true
					}
				}
				if ignore {
					continue
				}
				errors = append(errors, ValidationError{
					Message: fmt.Sprintf("field %s is not mapped in %v", id, m.inType),
				})
			}
		}

	}

	return errors
}