func()

in ipam/manager.go [96:160]


func (am *addressManager) restore(rehydrateIpamInfoOnReboot bool) error {
	// Skip if a store is not provided.
	if am.store == nil {
		logger.Info("ipam store is nil")
		return nil
	}

	// Read any persisted state.
	err := am.store.Read(storeKey, am)
	if err != nil {
		if err == store.ErrKeyNotFound {
			logger.Info("store key not found")
			return nil
		} else if err == store.ErrStoreEmpty {
			logger.Info("store empty")
			return nil
		} else {
			logger.Error("Failed to restore state", zap.Error(err))
			return err
		}
	}

	// Populate pointers.
	for _, as := range am.AddrSpaces {
		for _, ap := range as.Pools {
			ap.as = as
			ap.addrsByID = make(map[string]*addressRecord)

			for _, ar := range ap.Addresses {
				if ar.ID != "" {
					ap.addrsByID[ar.ID] = ar
				}
			}
		}
	}

	// if rebooted mark the ip as not in use.
	if rehydrateIpamInfoOnReboot {
		// Check if the VM is rebooted.
		modTime, err := am.store.GetModificationTime()
		if err == nil {
			p := platform.NewExecClient(nil)
			rebootTime, err := p.GetLastRebootTime()
			logger.Info("reboot store mod", zap.Any("rebootTime", rebootTime), zap.Any("modTime", modTime))

			if err == nil && rebootTime.After(modTime) {
				logger.Info("Rehydrating ipam state from persistent store")
				for _, as := range am.AddrSpaces {
					for _, ap := range as.Pools {
						ap.as = as
						ap.RefCount = 0

						for _, ar := range ap.Addresses {
							ar.InUse = false
						}
					}
				}
			}
		}
	}

	logger.Info("Restored state", zap.Any("am", am))

	return nil
}