in plugins/in_tree_volume.go [134:177]
func addTopology(pv *v1.PersistentVolume, topologyKey string, zones []string) error {
// Make sure there are no duplicate or empty strings
filteredZones := sets.String{}
for i := range zones {
zone := strings.TrimSpace(zones[i])
if len(zone) > 0 {
filteredZones.Insert(zone)
}
}
zones = filteredZones.List()
if len(zones) < 1 {
return errors.New("there are no valid zones to add to pv")
}
// Make sure the necessary fields exist
if pv.Spec.NodeAffinity == nil {
pv.Spec.NodeAffinity = new(v1.VolumeNodeAffinity)
}
if pv.Spec.NodeAffinity.Required == nil {
pv.Spec.NodeAffinity.Required = new(v1.NodeSelector)
}
if len(pv.Spec.NodeAffinity.Required.NodeSelectorTerms) == 0 {
pv.Spec.NodeAffinity.Required.NodeSelectorTerms = make([]v1.NodeSelectorTerm, 1)
}
topology := v1.NodeSelectorRequirement{
Key: topologyKey,
Operator: v1.NodeSelectorOpIn,
Values: zones,
}
// add the CSI topology to each term
for i := range pv.Spec.NodeAffinity.Required.NodeSelectorTerms {
pv.Spec.NodeAffinity.Required.NodeSelectorTerms[i].MatchExpressions = append(
pv.Spec.NodeAffinity.Required.NodeSelectorTerms[i].MatchExpressions,
topology,
)
}
return nil
}