diff --git a/pkg/vpcagent/models/models.go b/pkg/vpcagent/models/models.go index a59c64ffc2..4224443005 100644 --- a/pkg/vpcagent/models/models.go +++ b/pkg/vpcagent/models/models.go @@ -21,6 +21,8 @@ import ( type Vpc struct { compute_models.SVpc + RouteTable *RouteTable `json:"-"` + Wire *Wire `json:"-"` Networks Networks `json:"-"` } @@ -31,6 +33,18 @@ func (el *Vpc) Copy() *Vpc { } } +type RouteTable struct { + compute_models.SRouteTable + + Vpc *Vpc +} + +func (el *RouteTable) Copy() *RouteTable { + return &RouteTable{ + SRouteTable: el.SRouteTable, + } +} + type Wire struct { compute_models.SWire diff --git a/pkg/vpcagent/models/modelset.go b/pkg/vpcagent/models/modelset.go index b88fbd8e8e..d3b3d39171 100644 --- a/pkg/vpcagent/models/modelset.go +++ b/pkg/vpcagent/models/modelset.go @@ -41,6 +41,8 @@ type ( Guestsecgroups map[string]*Guestsecgroup // key: guestId/secgroupId DnsRecords map[string]*DnsRecord + + RouteTables map[string]*RouteTable ) func (set Vpcs) ModelManager() mcclient_modulebase.IBaseManager { @@ -80,6 +82,28 @@ func (ms Vpcs) joinWires(subEntries Wires) bool { return correct } +func (ms Vpcs) joinRouteTables(subEntries RouteTables) bool { + correct := true + for _, subEntry := range subEntries { + vpcId := subEntry.VpcId + m, ok := ms[vpcId] + if !ok { + log.Warningf("vpc_id %s of route table %s(%s) is not present", vpcId, subEntry.Name, subEntry.Id) + correct = false + continue + } + subEntry.Vpc = m + if m.RouteTable != nil { + log.Warningf("vpc %s has more than 1 route table available, skipping %s(%s)", + m.Name, m.Id, subEntry.Name, subEntry.Id) + correct = false + continue + } + m.RouteTable = subEntry + } + return correct +} + func (ms Vpcs) joinNetworks(subEntries Networks) bool { for _, m := range ms { m.Networks = Networks{} @@ -631,3 +655,24 @@ func (set DnsRecords) Copy() apihelper.IModelSet { } return setCopy } + +func (set RouteTables) ModelManager() mcclient_modulebase.IBaseManager { + return &mcclient_modules.RouteTables +} + +func (set RouteTables) NewModel() db.IModel { + return &RouteTable{} +} + +func (set RouteTables) AddModel(i db.IModel) { + m := i.(*RouteTable) + set[m.Id] = m +} + +func (set RouteTables) Copy() apihelper.IModelSet { + setCopy := RouteTables{} + for id, el := range set { + setCopy[id] = el.Copy() + } + return setCopy +} diff --git a/pkg/vpcagent/models/modelsets.go b/pkg/vpcagent/models/modelsets.go index aeeb498d68..c60da70394 100644 --- a/pkg/vpcagent/models/modelsets.go +++ b/pkg/vpcagent/models/modelsets.go @@ -34,6 +34,8 @@ type ModelSetsMaxUpdatedAt struct { NetworkAddresses time.Time DnsRecords time.Time + + RouteTables time.Time } func NewModelSetsMaxUpdatedAt() *ModelSetsMaxUpdatedAt { @@ -51,6 +53,8 @@ func NewModelSetsMaxUpdatedAt() *ModelSetsMaxUpdatedAt { NetworkAddresses: apihelper.PseudoZeroTime, DnsRecords: apihelper.PseudoZeroTime, + + RouteTables: apihelper.PseudoZeroTime, } } @@ -68,6 +72,8 @@ type ModelSets struct { NetworkAddresses NetworkAddresses DnsRecords DnsRecords + + RouteTables RouteTables } func NewModelSets() *ModelSets { @@ -85,6 +91,8 @@ func NewModelSets() *ModelSets { NetworkAddresses: NetworkAddresses{}, DnsRecords: DnsRecords{}, + + RouteTables: RouteTables{}, } } @@ -104,6 +112,8 @@ func (mss *ModelSets) ModelSetList() []apihelper.IModelSet { mss.NetworkAddresses, mss.DnsRecords, + + mss.RouteTables, } } @@ -126,6 +136,8 @@ func (mss *ModelSets) copy_() *ModelSets { NetworkAddresses: mss.NetworkAddresses.Copy().(NetworkAddresses), DnsRecords: mss.DnsRecords.Copy().(DnsRecords), + + RouteTables: mss.RouteTables.Copy().(RouteTables), } return mssCopy } @@ -164,6 +176,7 @@ func (mss *ModelSets) join() bool { mss.Guests.initJoin() var p []bool p = append(p, mss.Vpcs.joinWires(mss.Wires)) + p = append(p, mss.Vpcs.joinRouteTables(mss.RouteTables)) p = append(p, mss.Wires.joinNetworks(mss.Networks)) p = append(p, mss.Vpcs.joinNetworks(mss.Networks)) p = append(p, mss.Networks.joinGuestnetworks(mss.Guestnetworks))