type nameReferenceTransformer … const doDebug … var _ … type filterMap … // newNameReferenceTransformer constructs a nameReferenceTransformer // with a given slice of NameBackReferences. func newNameReferenceTransformer( br []builtinconfig.NameBackReferences) resmap.Transformer { … } // Transform updates name references in resource A that // refer to resource B, given that B's name may have // changed. // // For example, a HorizontalPodAutoscaler (HPA) // necessarily refers to a Deployment, the thing that // an HPA scales. In this case: // // - the HPA instance is the Referrer, // - the Deployment instance is the ReferralTarget. // // If the Deployment's name changes, e.g. a prefix is added, // then the HPA's reference to the Deployment must be fixed. // func (t *nameReferenceTransformer) Transform(m resmap.ResMap) error { … } func debug(fMap filterMap) { … } // Produce a map from referrer resources that might need to be fixed // to filters that might fix them. The keys to this map are potential // referrers, so won't include resources like ConfigMap or Secret. // // In the inner loop over the resources below, say we // encounter an HPA instance. Then, in scanning the set // of all known backrefs, we encounter an entry like // // - kind: Deployment // fieldSpecs: // - kind: HorizontalPodAutoscaler // path: spec/scaleTargetRef/name // // This entry says that an HPA, via its // 'spec/scaleTargetRef/name' field, may refer to a // Deployment. // // This means that a filter will need to hunt for the right Deployment, // obtain it's new name, and write that name into the HPA's // 'spec/scaleTargetRef/name' field. Return a filter that can do that. func (t *nameReferenceTransformer) determineFilters( resources []*resource.Resource) (fMap filterMap) { … } // TODO: check res for field existence here to avoid extra work. // res.GetFieldValue, which uses yaml.Lookup under the hood, doesn't know // how to parse fieldspec-style paths that make no distinction // between maps and sequences. This means it cannot lookup commonly // used "indeterminate" paths like // spec/containers/env/valueFrom/configMapKeyRef/name // ('containers' is a list, not a map). // However, the fieldspec filter does know how to handle this; // extract that code and call it here? func resHasField(res *resource.Resource, path string) bool { … }