in controllers/autoneg.go [307:431]
func ReconcileStatus(project string, actual AutonegStatus, intended AutonegStatus) (removes, upserts map[string]map[string]Backends) {
upserts = make(map[string]map[string]Backends, 0)
removes = make(map[string]map[string]Backends, 0)
// transform into maps with backend group as key
actualBE := map[string]map[string]struct{}{}
for port, neg := range actual.NEGs {
actualBE[port] = map[string]struct{}{}
for _, zone := range actual.Zones {
group := getGroup(project, zone, neg)
actualBE[port][group] = struct{}{}
}
}
intendedBE := map[string]map[string]struct{}{}
for port, neg := range intended.NEGs {
intendedBE[port] = map[string]struct{}{}
for _, zone := range intended.Zones {
group := getGroup(project, zone, neg)
intendedBE[port][group] = struct{}{}
}
}
// actualBE and intendedBE is a list of NEGs per port now
var intendedBEKeys []string
for k := range intendedBE {
intendedBEKeys = append(intendedBEKeys, k)
}
sort.Strings(intendedBEKeys)
for _, port := range intendedBEKeys {
upserts[port] = make(map[string]Backends, len(intendedBE))
removes[port] = make(map[string]Backends, len(intendedBE))
groups := intendedBE[port]
for bname, be := range intended.BackendServices[port] {
upsert := Backends{name: be.Name, region: be.Region}
var groupsKeys []string
for k := range groups {
groupsKeys = append(groupsKeys, k)
}
sort.Strings(groupsKeys)
for _, i := range groupsKeys {
be := intended.Backend(bname, port, i)
upsert.backends = append(upsert.backends, be)
}
sortBackends(&upsert.backends)
upserts[port][bname] = upsert
remove := Backends{name: be.Name, region: be.Region}
// test to see if we are changing backend services
if _, ok := actual.BackendServices[port][bname]; ok {
if actual.BackendServices[port][bname].Name == be.Name || actual.BackendServices[port][bname].Name == "" {
// find backends to be deleted
for a := range actualBE[port] {
if _, ok := intendedBE[port][a]; !ok {
rbe := actual.Backend(bname, port, a)
remove.backends = append(remove.backends, rbe)
}
}
sortBackends(&remove.backends)
removes[port][bname] = remove
} else {
// moving to a different backend service means removing all actual backends
remove.name = actual.BackendServices[port][bname].Name
remove.region = actual.BackendServices[port][bname].Region
for a := range actualBE[port] {
rbe := actual.Backend(bname, port, a)
remove.backends = append(remove.backends, rbe)
}
sortBackends(&remove.backends)
removes[port][bname] = remove
}
} else {
// add empty remove if adding to a mint backend service
remove.name = intended.BackendServices[port][bname].Name
remove.region = intended.BackendServices[port][bname].Region
removes[port][bname] = remove
}
}
// see if there are removed backend services
for aname := range actual.BackendServices[port] {
if _, ok := intended.BackendServices[port][aname]; !ok {
be := actual.BackendServices[port][aname]
remove := Backends{name: be.Name, region: be.Region}
remove.name = actual.BackendServices[port][aname].Name
remove.region = actual.BackendServices[port][aname].Region
for a := range actualBE[port] {
rbe := actual.Backend(aname, port, a)
remove.backends = append(remove.backends, rbe)
}
sortBackends(&remove.backends)
removes[port][aname] = remove
upsert := Backends{name: be.Name, region: be.Region}
upserts[port][aname] = upsert
}
}
}
// see if some configs were removed entirely
for port, _ := range actual.BackendServices {
if _, ok := intended.BackendServices[port]; !ok {
if _, ok = removes[port]; !ok {
removes[port] = make(map[string]Backends, len(actualBE))
}
for aname, be := range actual.BackendServices[port] {
remove := Backends{name: be.Name, region: be.Region}
remove.name = actual.BackendServices[port][aname].Name
remove.region = actual.BackendServices[port][aname].Region
for a := range actualBE[port] {
rbe := actual.Backend(aname, port, a)
remove.backends = append(remove.backends, rbe)
}
sortBackends(&remove.backends)
removes[port][aname] = remove
}
}
}
return
}