Files
cloudpods/pkg/lbagent/models/modelsets.go
Yousong Zhou 37fc897a11 Feature/yousong vpc elb (#11423)
* regiondrivers: kvm: lb: make "network" an optional argument

* loadbalancernetworks: add MacAddr field for lb with eip

* apis: compute: add LOADBALANCER to EIP_ASSOCIATE_VALID_TYPES

* regiondrivers: fix typo RequestAssociat{,e}Eip

* regiondrivers: kvm: RequestAssociatEip: standalone func for each type

* regiondrivers: kvm: RequestAssociateEip: support loadbalancer

* tasks: EipAssociateTask: add support for loadbalancer

* tasks: EipAssociateTask: allow using name for referring to instance

* elasticips: PerformAssociate: validate loadbalancer condition

* tasks: EipDissociateTask: support non-managed loadbalancer

* loadbalancers: add StartSyncstatus method for EipAssociateTask

* regiondrivers: kvm: allow creation of vpc lb

* loadbalanceragents: add timestamp fields for network objects

* climc: eips: add associate type loadbalancer

* mcclient: loadbalancernetworks: add Mac_Addr column

* vpcagent: models: add loadbalancernetworks

* vpcagent: ovn: route back vpc cidr block instead of all rest

* vpcagent: ovn: add ClaimLoadbalancerNetwork()

* mcclient: models: add LoadbalancerNetwork

* mcclient: models: add Network

* lbagent: models: use IBaseManager to accomodate joint manager

* lbagent: models: add {,Loadbalancer}Networks

* lbagent: models: export a few fields

* lbagent: models: add fields for vpc lb models

* iproute2: add NewAddressEx constructor

* lbagent: add worker for vpc lb

* vendor: add github.com/coreos/go-iptables

* lbagent: apihelper: use ovn worker

* lbagent: models: use pkg/compute/models

* mcclient: models: remove lb models

* lbagent: api: use pkg/apihelper

* vpcagent: models: add lblisteners and lbacls

* vpcagent: ovn: add lbacl support
2022-05-06 23:22:50 +08:00

194 lines
6.0 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package models
import (
"strings"
"time"
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/apihelper"
)
// pluralMap maps from KeyPlurals to underscore-separated field names
var pluralMap = map[string]string{}
func init() {
ss := []string{
"networks",
"loadbalancer_networks",
"loadbalancers",
"loadbalancer_listeners",
"loadbalancer_listener_rules",
"loadbalancer_backend_groups",
"loadbalancer_backends",
"loadbalancer_acls",
"loadbalancer_certificates",
}
for _, s := range ss {
k := strings.Replace(s, "_", "", -1)
pluralMap[k] = s
}
}
type ModelSetsMaxUpdatedAt struct {
Networks time.Time
LoadbalancerNetworks time.Time
Loadbalancers time.Time
LoadbalancerListeners time.Time
LoadbalancerListenerRules time.Time
LoadbalancerBackendGroups time.Time
LoadbalancerBackends time.Time
LoadbalancerAcls time.Time
LoadbalancerCertificates time.Time
}
func NewModelSetsMaxUpdatedAt() *ModelSetsMaxUpdatedAt {
return &ModelSetsMaxUpdatedAt{
Networks: apihelper.PseudoZeroTime,
LoadbalancerNetworks: apihelper.PseudoZeroTime,
Loadbalancers: apihelper.PseudoZeroTime,
LoadbalancerListeners: apihelper.PseudoZeroTime,
LoadbalancerListenerRules: apihelper.PseudoZeroTime,
LoadbalancerBackendGroups: apihelper.PseudoZeroTime,
LoadbalancerBackends: apihelper.PseudoZeroTime,
LoadbalancerAcls: apihelper.PseudoZeroTime,
LoadbalancerCertificates: apihelper.PseudoZeroTime,
}
}
type ModelSets struct {
Networks Networks
LoadbalancerNetworks LoadbalancerNetworks
Loadbalancers Loadbalancers
LoadbalancerListeners LoadbalancerListeners
LoadbalancerListenerRules LoadbalancerListenerRules
LoadbalancerBackendGroups LoadbalancerBackendGroups
LoadbalancerBackends LoadbalancerBackends
LoadbalancerAcls LoadbalancerAcls
LoadbalancerCertificates LoadbalancerCertificates
}
func NewModelSets() *ModelSets {
return &ModelSets{
Networks: Networks{},
LoadbalancerNetworks: LoadbalancerNetworks{},
Loadbalancers: Loadbalancers{},
LoadbalancerListeners: LoadbalancerListeners{},
LoadbalancerListenerRules: LoadbalancerListenerRules{},
LoadbalancerBackendGroups: LoadbalancerBackendGroups{},
LoadbalancerBackends: LoadbalancerBackends{},
LoadbalancerAcls: LoadbalancerAcls{},
LoadbalancerCertificates: LoadbalancerCertificates{},
}
}
func (mss *ModelSets) NewEmpty() apihelper.IModelSets {
return NewModelSets()
}
func (mss *ModelSets) ModelSetList() []apihelper.IModelSet {
// it's ordered this way to favour creation, not deletion
return []apihelper.IModelSet{
mss.LoadbalancerListenerRules,
mss.LoadbalancerListeners,
mss.LoadbalancerBackends,
mss.LoadbalancerBackendGroups,
mss.Loadbalancers,
mss.LoadbalancerAcls,
mss.LoadbalancerCertificates,
mss.LoadbalancerNetworks,
mss.Networks,
}
}
func (mss *ModelSets) copy_() *ModelSets {
mssCopy := &ModelSets{
Networks: mss.Networks.Copy().(Networks),
LoadbalancerNetworks: mss.LoadbalancerNetworks.Copy().(LoadbalancerNetworks),
Loadbalancers: mss.Loadbalancers.Copy().(Loadbalancers),
LoadbalancerListeners: mss.LoadbalancerListeners.Copy().(LoadbalancerListeners),
LoadbalancerListenerRules: mss.LoadbalancerListenerRules.Copy().(LoadbalancerListenerRules),
LoadbalancerBackendGroups: mss.LoadbalancerBackendGroups.Copy().(LoadbalancerBackendGroups),
LoadbalancerBackends: mss.LoadbalancerBackends.Copy().(LoadbalancerBackends),
LoadbalancerAcls: mss.LoadbalancerAcls.Copy().(LoadbalancerAcls),
LoadbalancerCertificates: mss.LoadbalancerCertificates.Copy().(LoadbalancerCertificates),
}
return mssCopy
}
func (mss *ModelSets) Copy() apihelper.IModelSets {
return mss.copy_()
}
func (mss *ModelSets) CopyJoined() apihelper.IModelSets {
mssCopy := mss.copy_()
mssCopy.join()
return mssCopy
}
func (mss *ModelSets) MaxSeenUpdatedAtParams() *jsonutils.JSONDict {
d := jsonutils.NewDict()
for _, ms := range mss.ModelSetList() {
k := ms.ModelManager().KeyString()
k = pluralMap[k]
t := apihelper.ModelSetMaxUpdatedAt(ms)
if !t.Equal(apihelper.PseudoZeroTime) {
d.Set(k, jsonutils.NewTimeString(t))
}
}
return d
}
func (mss *ModelSets) ApplyUpdates(mssNews apihelper.IModelSets) apihelper.ModelSetsUpdateResult {
r := apihelper.ModelSetsUpdateResult{
Changed: false,
Correct: true,
}
mssList := mss.ModelSetList()
mssNewsList := mssNews.ModelSetList()
for i, mss := range mssList {
mssNews := mssNewsList[i]
msR := apihelper.ModelSetApplyUpdates(mss, mssNews)
if !r.Changed && msR.Changed {
r.Changed = true
}
}
if r.Changed {
r.Correct = mss.join()
}
return r
}
func (mss *ModelSets) join() bool {
var p []bool
p = append(p, mss.LoadbalancerBackendGroups.JoinBackends(mss.LoadbalancerBackends))
p = append(p, mss.LoadbalancerListeners.JoinListenerRules(mss.LoadbalancerListenerRules))
p = append(p, mss.LoadbalancerListeners.JoinCertificates(mss.LoadbalancerCertificates))
p = append(p, mss.Loadbalancers.JoinListeners(mss.LoadbalancerListeners))
p = append(p, mss.Loadbalancers.JoinBackendGroups(mss.LoadbalancerBackendGroups))
p = append(p, mss.LoadbalancerNetworks.JoinLoadbalancers(mss.Loadbalancers))
p = append(p, mss.LoadbalancerNetworks.JoinNetworks(mss.Networks))
for _, b := range p {
if !b {
return false
}
}
return true
}