| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- package network_additional_wire
- import (
- "context"
- "sync"
- "time"
- "yunion.io/x/log"
- "yunion.io/x/pkg/util/wait"
- "yunion.io/x/onecloud/pkg/cloudcommon/db"
- "yunion.io/x/onecloud/pkg/compute/models"
- )
- var (
- manager *networkAdditionalWireManager
- )
- func Start(ctx context.Context, refreshInterval time.Duration) {
- manager = &networkAdditionalWireManager{
- dataMap: newNawMap(),
- refreshInterval: refreshInterval,
- }
- manager.sync()
- }
- type nawList []*models.SNetworkAdditionalWire
- type nawMap struct {
- *sync.Map
- }
- func newNawMap() *nawMap {
- return &nawMap{
- Map: new(sync.Map),
- }
- }
- func (m *nawMap) GetByNetworkId(id string) nawList {
- value, ok := m.Load(id)
- if ok {
- return value.(nawList)
- }
- return nil
- }
- func (m *nawMap) Add(item *models.SNetworkAdditionalWire) {
- items := m.GetByNetworkId(item.NetworkId)
- if items == nil {
- items = make([]*models.SNetworkAdditionalWire, 0)
- }
- items = append(items, item)
- m.Store(item.NetworkId, items)
- }
- type networkAdditionalWireManager struct {
- dataMap *nawMap
- refreshInterval time.Duration
- }
- func (m *networkAdditionalWireManager) syncOnce() {
- log.Infof("NetworkAdditionalWireManager start sync")
- startTime := time.Now()
- q := models.NetworkAdditionalWireManager.Query()
- ret := make([]models.SNetworkAdditionalWire, 0)
- err := db.FetchModelObjects(models.NetworkAdditionalWireManager, q, &ret)
- if err != nil {
- log.Errorf("NetworkAdditionalWireManager fetch err: %v", err)
- return
- }
- m.dataMap = newNawMap()
- for i := range ret {
- obj := &ret[i]
- m.dataMap.Add(obj)
- }
- log.Infof("NetworkAdditionalWireManager end sync, consume %s", time.Since(startTime))
- }
- func (m *networkAdditionalWireManager) sync() {
- wait.Forever(m.syncOnce, m.refreshInterval)
- }
- func (m *networkAdditionalWireManager) GetByNetworkId(networkId string) []*models.SNetworkAdditionalWire {
- list := m.dataMap.GetByNetworkId(networkId)
- return list
- }
- func FetchNetworkAdditionalWireIds(networkId string) []string {
- naws := manager.GetByNetworkId(networkId)
- wires := make([]string, len(naws))
- for i := range naws {
- wires[i] = naws[i].WireId
- }
- return wires
- }
|