Merge branch 'release/2.6.0' of ssh://git.yunion.io/~qiujian/onecloud into feature/qj-network-type-pxe-ipmi

This commit is contained in:
Qiu Jian
2019-01-29 23:40:14 +08:00
4 changed files with 37 additions and 85 deletions
+1 -1
View File
@@ -97,7 +97,7 @@ func (self *SBaremetalGuestDriver) ValidateResizeDisk(guest *models.SGuest, disk
}
func (self *SBaremetalGuestDriver) GetNamedNetworkConfiguration(guest *models.SGuest, userCred mcclient.TokenCredential, host *models.SHost, netConfig *models.SNetworkConfig) (*models.SNetwork, string, int8, models.IPAddlocationDirection) {
netif, net := host.GetNetinterfaceWithNetworkAndCredential(netConfig.Network, userCred, netConfig.Reserved)
netif, net := host.GetNetinterfaceWithIdAndCredential(netConfig.Network, userCred, netConfig.Reserved)
if netif != nil {
return net, netif.Mac, netif.Index, models.IPAllocationStepup
}
+6 -13
View File
@@ -17,6 +17,12 @@ const (
BAREMETAL_AGENT_OFFLINE = "offline"
)
const (
AgentTypeBaremetal = "baremetal"
AgentTypeEsxi = "esxiagent"
AgentTypeDefault = AgentTypeBaremetal
)
type SBaremetalagentManager struct {
db.SStandaloneResourceBaseManager
}
@@ -79,14 +85,6 @@ func (self *SBaremetalagent) ValidateUpdateData(ctx context.Context, userCred mc
return nil, httperrors.NewConflictError("Conflict manager_uri %s", mangerUri)
}
}
accessIp, err := data.GetString("access_ip")
if err == nil {
count := BaremetalagentManager.Query().Equals("access_ip", accessIp).
NotEquals("id", self.Id).Count()
if count > 0 {
return nil, httperrors.NewConflictError("Conflict access_ip %s", accessIp)
}
}
return self.SStandaloneResourceBase.ValidateUpdateData(ctx, userCred, query, data)
}
@@ -96,11 +94,6 @@ func (manager *SBaremetalagentManager) ValidateCreateData(ctx context.Context, u
if count > 0 {
return nil, httperrors.NewDuplicateResourceError("Duplicate manager_uri %s", mangerUri)
}
//accessIp, _ := data.GetString("access_ip")
//count = manager.Query().Equals("access_ip", accessIp).Count()
//if count > 0 {
// return nil, httperrors.NewDuplicateResourceError("Duplicate access_ip %s", accessIp)
//}
return manager.SStandaloneResourceBaseManager.ValidateCreateData(ctx, userCred, ownerProjId, query, data)
}
+19 -69
View File
@@ -1681,96 +1681,46 @@ func (self *SHost) getNetworkOfIPOnHost(ipAddr string) (*SNetwork, error) {
return net, nil
}
func (self *SHost) GetNetinterfaceWithNetworkAndCredential(netId string, userCred mcclient.TokenCredential, reserved bool) (*SNetInterface, *SNetwork) {
netif, net := self.getNetifWithNetworkAndCredential(netId, userCred, true, reserved)
if netif != nil {
return netif, net
func (self *SHost) GetNetinterfaceWithIdAndCredential(netId string, userCred mcclient.TokenCredential, reserved bool) (*SNetInterface, *SNetwork) {
netObj, err := NetworkManager.FetchById(netId)
if err != nil {
return nil, nil
}
net := netObj.(*SNetwork)
if net.getFreeAddressCount() == 0 && !reserved {
return nil, nil
}
return self.getNetifWithNetworkAndCredential(netId, userCred, false, reserved)
}
func (self *SHost) getNetifWithNetworkAndCredential(netId string, userCred mcclient.TokenCredential, isPublic bool, reserved bool) (*SNetInterface, *SNetwork) {
netifs := self.GetNetInterfaces()
var maxFreeCnt = 0
var maxFreeNet *SNetwork
var maxFreeNetif *SNetInterface
for i := 0; i < len(netifs); i++ {
if !netifs[i].IsUsableServernic() {
continue
}
wire := netifs[i].GetWire()
if wire != nil {
if isPublic {
nets, _ := wire.getPublicNetworks()
for _, net := range nets {
if net.Id == netId || net.GetName() == netId {
freeCnt := net.getFreeAddressCount()
if maxFreeNet == nil || maxFreeCnt < freeCnt {
maxFreeNetif = &netifs[i]
maxFreeNet = &net
}
}
}
} else {
nets, _ := wire.getPrivateNetworks(userCred)
for _, net := range nets {
if net.Id == netId || net.GetName() == netId {
freeCnt := net.getFreeAddressCount()
if maxFreeNet == nil || maxFreeCnt < freeCnt {
maxFreeNetif = &netifs[i]
maxFreeNet = &net
}
}
}
}
if netifs[i].WireId == net.WireId {
return &netifs[i], net
}
}
return maxFreeNetif, maxFreeNet
return nil, nil
}
func (self *SHost) GetNetworkWithIdAndCredential(netId string, userCred mcclient.TokenCredential, reserved bool) (*SNetwork, error) {
net, err := self.getNetworkWithIdAndCredential(netId, userCred, true, reserved)
if err == nil {
return net, nil
}
return self.getNetworkWithIdAndCredential(netId, userCred, false, reserved)
}
func (self *SHost) getNetworkWithIdAndCredential(netId string, userCred mcclient.TokenCredential, isPublic bool, reserved bool) (*SNetwork, error) {
networks := NetworkManager.Query().SubQuery()
hostwires := HostwireManager.Query().SubQuery()
hosts := HostManager.Query().SubQuery()
q := networks.Query()
q = q.Join(hostwires, sqlchemy.AND(sqlchemy.Equals(hostwires.Field("wire_id"), networks.Field("wire_id")),
sqlchemy.IsFalse(hostwires.Field("deleted"))))
q = q.Join(hosts, sqlchemy.AND(sqlchemy.Equals(hosts.Field("id"), hostwires.Field("host_id")),
sqlchemy.IsFalse(hosts.Field("deleted"))))
q = q.Join(hostwires, sqlchemy.Equals(hostwires.Field("wire_id"), networks.Field("wire_id")))
q = q.Join(hosts, sqlchemy.Equals(hosts.Field("id"), hostwires.Field("host_id")))
q = q.Filter(sqlchemy.Equals(hosts.Field("id"), self.Id))
q = q.Filter(sqlchemy.OR(sqlchemy.Equals(networks.Field("id"), netId),
sqlchemy.Equals(networks.Field("name"), netId)))
if isPublic {
q = q.Filter(sqlchemy.IsTrue(networks.Field("is_public")))
} else {
q = q.Filter(sqlchemy.Equals(networks.Field("tenant_id"), userCred.GetProjectId()))
}
q = q.Filter(sqlchemy.Equals(networks.Field("id"), netId))
nets := make([]SNetwork, 0)
err := db.FetchModelObjects(NetworkManager, q, &nets)
net := SNetwork{}
net.SetModelManager(NetworkManager)
err := q.First(&net)
if err != nil {
return nil, err
}
var maxFreeNet *SNetwork
maxFrees := 0
for i := 0; i < len(nets); i += 1 {
freeCnt := nets[i].getFreeAddressCount()
if maxFreeNet == nil || maxFrees < freeCnt {
maxFrees = freeCnt
maxFreeNet = &nets[i]
}
}
if reserved || maxFrees > 0 {
return maxFreeNet, nil
if reserved || net.getFreeAddressCount() > 0 {
return &net, nil
}
return nil, fmt.Errorf("No IP address")
}
+11 -2
View File
@@ -739,9 +739,18 @@ func parseNetworkInfo(userCred mcclient.TokenCredential, info jsonutils.JSONObje
} else {
netObj, err := NetworkManager.FetchByIdOrName(userCred, p)
if err != nil {
return nil, err
if err == sql.ErrNoRows {
return nil, httperrors.NewResourceNotFoundError2(NetworkManager.Keyword(), p)
} else {
return nil, err
}
}
net := netObj.(*SNetwork)
if net.IsOwner(userCred) || net.IsPublic || db.IsAdminAllowGet(userCred, net) {
netConfig.Network = netObj.GetId()
} else {
return nil, httperrors.NewForbiddenError("no allow to access network %s", p)
}
netConfig.Network = netObj.GetId()
}
}
if netConfig.BwLimit == 0 {