// appendListNode will append the nodes from src to dst and return dst. // src and dst should be both sequence node. key is used to call ElementSetter. // ElementSetter will use key-value pair to find and set the element in sequence // node. func appendListNode(dst, src *yaml.RNode, keys []string) (*yaml.RNode, error) { … } // validateKeys returns a list of valid key-value pairs // if secondary merge key values are missing, use only the available merge keys func validateKeys(valuesList [][]string, values []string, keys []string) ([]string, []string) { … } // mergeValues merges values together - e.g. if two containerPorts // have the same port and targetPort but one has an empty protocol // and the other doesn't, they are treated as the same containerPort func mergeValues(valuesList [][]string) [][]string { … } // two values match if they have at least one common element and // corresponding elements only differ if one is an empty string func match(values1 []string, values2 []string) (bool, []string) { … } // setAssociativeSequenceElements recursively set the elements in the list func (l *Walker) setAssociativeSequenceElements(valuesList [][]string, keys []string, dest *yaml.RNode) (*yaml.RNode, error) { … } func (l *Walker) walkAssociativeSequence() (*yaml.RNode, error) { … } // elementKey returns the merge key to use for the associative list func (l Walker) elementKey() (string, error) { … } // elementValues returns a slice containing all values for the field across all elements // from all sources. // Return value slice is ordered using the original ordering from the elements, where // elements missing from earlier sources appear later. func (l Walker) elementValues(keys []string) [][]string { … } // elementPrimitiveValues returns the primitive values in an associative list -- eg. finalizers func (l Walker) elementPrimitiveValues() [][]string { … } // fieldValue returns a slice containing each source's value for fieldName func (l Walker) elementValueList(keys []string, values []string) []*yaml.RNode { … }