fix: network allocation according to sharing status

This commit is contained in:
Qiu Jian
2020-04-26 00:36:30 +08:00
parent 74eef22025
commit 68c03778a2
9 changed files with 59 additions and 39 deletions
+2 -2
View File
@@ -193,9 +193,9 @@ func (self *SBaremetalGuestDriver) Attach2RandomNetwork(guest *models.SGuest, ct
}
var net *models.SNetwork
if netConfig.Private {
net, _ = wire.GetCandidatePrivateNetwork(userCred, netConfig.Exit, netTypes)
net, _ = wire.GetCandidatePrivateNetwork(userCred, models.NetworkManager.AllowScope(userCred), netConfig.Exit, netTypes)
} else {
net, _ = wire.GetCandidatePublicNetwork(netConfig.Exit, netTypes)
net, _ = wire.GetCandidatePublicNetwork(userCred, models.NetworkManager.AllowScope(userCred), netConfig.Exit, netTypes)
}
if net != nil {
netsAvaiable = append(netsAvaiable, *net)
+2 -2
View File
@@ -121,9 +121,9 @@ func (self *SVirtualizedGuestDriver) Attach2RandomNetwork(guest *models.SGuest,
var net *models.SNetwork
if netConfig.Private {
net, _ = wire.GetCandidatePrivateNetwork(userCred, netConfig.Exit, netTypes)
net, _ = wire.GetCandidatePrivateNetwork(userCred, models.NetworkManager.AllowScope(userCred), netConfig.Exit, netTypes)
} else {
net, _ = wire.GetCandidatePublicNetwork(netConfig.Exit, netTypes)
net, _ = wire.GetCandidatePublicNetwork(userCred, models.NetworkManager.AllowScope(userCred), netConfig.Exit, netTypes)
}
if net != nil {
netsAvaiable = append(netsAvaiable, *net)
+3 -3
View File
@@ -2690,16 +2690,16 @@ func getCloudNicNetwork(vnic cloudprovider.ICloudNic, host *SHost, ipList []stri
vnet := vnic.GetINetwork()
if vnet == nil {
if vnic.InClassicNetwork() {
vpc, err := VpcManager.NewVpcForClassicNetwork(host)
vpc, err := VpcManager.GetOrCreateVpcForClassicNetwork(host)
if err != nil {
return nil, errors.Wrap(err, "NewVpcForClassicNetwork")
}
zone := host.GetZone()
wire, err := WireManager.NewWireForClassicNetwork(vpc, zone)
wire, err := WireManager.GetOrCreateWireForClassicNetwork(vpc, zone)
if err != nil {
return nil, errors.Wrap(err, "NewWireForClassicNetwork")
}
return NetworkManager.NewClassicNetwork(wire)
return NetworkManager.GetOrCreateClassicNetwork(wire)
}
ip := vnic.GetIP()
if len(ip) == 0 {
+5 -5
View File
@@ -2137,7 +2137,7 @@ func (self *SHost) SyncHostVMs(ctx context.Context, userCred mcclient.TokenCrede
func (self *SHost) getNetworkOfIPOnHost(ipAddr string) (*SNetwork, error) {
netInterfaces := self.GetNetInterfaces()
for _, netInterface := range netInterfaces {
network, err := netInterface.GetCandidateNetworkForIp(auth.AdminCredential(), ipAddr)
network, err := netInterface.GetCandidateNetworkForIp(nil, rbacutils.ScopeNone, ipAddr)
if err == nil && network != nil {
return network, nil
}
@@ -2989,7 +2989,7 @@ func (manager *SHostManager) ValidateCreateData(
wire := wireObj.(*SWire)
lockman.LockObject(ctx, wire)
defer lockman.ReleaseObject(ctx, wire)
net, err := wire.GetCandidatePrivateNetwork(userCred, false, []string{api.NETWORK_TYPE_PXE, api.NETWORK_TYPE_BAREMETAL, api.NETWORK_TYPE_GUEST})
net, err := wire.GetCandidatePrivateNetwork(userCred, NetworkManager.AllowScope(userCred), false, []string{api.NETWORK_TYPE_PXE, api.NETWORK_TYPE_BAREMETAL, api.NETWORK_TYPE_GUEST})
if err != nil {
return input, httperrors.NewGeneralError(err)
}
@@ -3699,7 +3699,7 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti
return httperrors.NewInputParameterError("invalid ipaddr %s", ipAddr)
}
findAddr := false
swNets, err := sw.getNetworks()
swNets, err := sw.getNetworks(userCred, NetworkManager.AllowScope(userCred))
if err != nil {
return httperrors.NewInputParameterError("no networks on wire %s", wire)
}
@@ -3872,7 +3872,7 @@ func (self *SHost) EnableNetif(ctx context.Context, userCred mcclient.TokenCrede
var net *SNetwork
var err error
if len(ipAddr) > 0 {
net, err = netif.GetCandidateNetworkForIp(userCred, ipAddr)
net, err = netif.GetCandidateNetworkForIp(userCred, NetworkManager.AllowScope(userCred), ipAddr)
if net != nil {
log.Infof("find network %s for ip %s", net.GetName(), ipAddr)
} else if requireDesignatedIp {
@@ -3911,7 +3911,7 @@ func (self *SHost) EnableNetif(ctx context.Context, userCred mcclient.TokenCrede
} else {
netTypes = []string{api.NETWORK_TYPE_BAREMETAL}
}
net, err = wire.GetCandidatePrivateNetwork(userCred, false, netTypes)
net, err = wire.GetCandidatePrivateNetwork(userCred, NetworkManager.AllowScope(userCred), false, netTypes)
if err != nil {
return fmt.Errorf("fail to find network %s", err)
}
+3 -2
View File
@@ -26,6 +26,7 @@ import (
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/rbacutils"
)
type SNetInterface struct {
@@ -265,12 +266,12 @@ func (self *SNetInterface) Remove(ctx context.Context, userCred mcclient.TokenCr
return err
}
func (self *SNetInterface) GetCandidateNetworkForIp(userCred mcclient.TokenCredential, ipAddr string) (*SNetwork, error) {
func (self *SNetInterface) GetCandidateNetworkForIp(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope, ipAddr string) (*SNetwork, error) {
wire := self.GetWire()
if wire == nil {
return nil, nil
}
return wire.GetCandidateNetworkForIp(userCred, ipAddr)
return wire.GetCandidateNetworkForIp(ownerId, scope, ipAddr)
}
func (self *SNetInterface) IsUsableServernic() bool {
+16 -2
View File
@@ -36,9 +36,11 @@ import (
"yunion.io/x/onecloud/pkg/apis"
api "yunion.io/x/onecloud/pkg/apis/compute"
"yunion.io/x/onecloud/pkg/cloudcommon/consts"
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
"yunion.io/x/onecloud/pkg/cloudcommon/db/taskman"
"yunion.io/x/onecloud/pkg/cloudcommon/policy"
"yunion.io/x/onecloud/pkg/cloudprovider"
"yunion.io/x/onecloud/pkg/compute/options"
"yunion.io/x/onecloud/pkg/httperrors"
@@ -310,7 +312,7 @@ func (self *SNetwork) GetNetworkInterfacesCount() (int, error) {
return NetworkInterfaceManager.Query().In("id", sq).CountWithError()
}
func (manager *SNetworkManager) NewClassicNetwork(wire *SWire) (*SNetwork, error) {
func (manager *SNetworkManager) GetOrCreateClassicNetwork(wire *SWire) (*SNetwork, error) {
_network, err := db.FetchByExternalId(manager, wire.Id)
if err == nil {
return _network.(*SNetwork), nil
@@ -575,7 +577,7 @@ func (self *SNetwork) IsExitNetwork() bool {
}
func (manager *SNetworkManager) getNetworksByWire(wire *SWire) ([]SNetwork, error) {
return wire.getNetworks()
return wire.getNetworks(nil, rbacutils.ScopeNone)
/* nets := make([]SNetwork, 0)
q := manager.Query().Equals("wire_id", wire.Id)
err := db.FetchModelObjects(manager, q, &nets)
@@ -2587,3 +2589,15 @@ func (manager *SNetworkManager) ListItemExportKeys(ctx context.Context,
}
return q, nil
}
func (manager *SNetworkManager) AllowScope(userCred mcclient.TokenCredential) rbacutils.TRbacScope {
if consts.IsRbacEnabled() {
return policy.PolicyManager.AllowScope(userCred, api.SERVICE_TYPE, NetworkManager.KeywordPlural(), policy.PolicyActionGet)
} else {
if userCred.HasSystemAdminPrivilege() {
return rbacutils.ScopeSystem
} else {
return rbacutils.ScopeProject
}
}
}
+2 -1
View File
@@ -27,6 +27,7 @@ import (
"yunion.io/x/onecloud/pkg/cloudcommon/db"
"yunion.io/x/onecloud/pkg/cloudcommon/db/lockman"
"yunion.io/x/onecloud/pkg/mcclient"
"yunion.io/x/onecloud/pkg/util/rbacutils"
)
type IPurgeableManager interface {
@@ -939,7 +940,7 @@ func (net *SNetwork) purge(ctx context.Context, userCred mcclient.TokenCredentia
}
func (wire *SWire) purgeNetworks(ctx context.Context, userCred mcclient.TokenCredential) error {
nets, err := wire.getNetworks()
nets, err := wire.getNetworks(nil, rbacutils.ScopeNone)
if err != nil {
return err
}
+1 -1
View File
@@ -179,7 +179,7 @@ func (manager *SVpcManager) getVpcExternalIdForClassicNetwork(regionId, cloudpro
return fmt.Sprintf("%s-%s", regionId, cloudproviderId)
}
func (manager *SVpcManager) NewVpcForClassicNetwork(host *SHost) (*SVpc, error) {
func (manager *SVpcManager) GetOrCreateVpcForClassicNetwork(host *SHost) (*SVpc, error) {
region := host.GetRegion()
cloudprovider := host.GetCloudprovider()
externalId := manager.getVpcExternalIdForClassicNetwork(region.Id, cloudprovider.Id)
+25 -21
View File
@@ -183,7 +183,7 @@ func (manager *SWireManager) getWireExternalIdForClassicNetwork(provider string,
return vpcId
}
func (manager *SWireManager) NewWireForClassicNetwork(vpc *SVpc, zone *SZone) (*SWire, error) {
func (manager *SWireManager) GetOrCreateWireForClassicNetwork(vpc *SVpc, zone *SZone) (*SWire, error) {
cloudprovider := vpc.GetCloudprovider()
if cloudprovider == nil {
return nil, fmt.Errorf("failed to found cloudprovider for vpc %s(%s)", vpc.Id, vpc.Id)
@@ -373,7 +373,7 @@ func (self *SWire) syncWithCloudWire(ctx context.Context, userCred mcclient.Toke
}
func (self *SWire) markNetworkUnknown(userCred mcclient.TokenCredential) error {
nets, err := self.getNetworks()
nets, err := self.getNetworks(nil, rbacutils.ScopeNone)
if err != nil {
return err
}
@@ -602,12 +602,16 @@ func (manager *SWireManager) TotalCount(
return stat
}
func (self *SWire) getNetworkQuery() *sqlchemy.SQuery {
return NetworkManager.Query().Equals("wire_id", self.Id)
func (self *SWire) getNetworkQuery(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope) *sqlchemy.SQuery {
q := NetworkManager.Query().Equals("wire_id", self.Id)
if ownerId != nil {
q = NetworkManager.FilterByOwner(q, ownerId, scope)
}
return q
}
func (self *SWire) getNetworks() ([]SNetwork, error) {
q := self.getNetworkQuery()
func (self *SWire) getNetworks(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope) ([]SNetwork, error) {
q := self.getNetworkQuery(ownerId, scope)
nets := make([]SNetwork, 0)
err := db.FetchModelObjects(NetworkManager, q, &nets)
if err != nil {
@@ -616,15 +620,15 @@ func (self *SWire) getNetworks() ([]SNetwork, error) {
return nets, nil
}
func (self *SWire) getGatewayNetworkQuery() *sqlchemy.SQuery {
q := self.getNetworkQuery()
func (self *SWire) getGatewayNetworkQuery(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope) *sqlchemy.SQuery {
q := self.getNetworkQuery(ownerId, scope)
q = q.IsNotNull("guest_gateway").IsNotEmpty("guest_gateway")
q = q.Equals("status", api.NETWORK_STATUS_AVAILABLE)
return q
}
func (self *SWire) getPublicNetworks() ([]SNetwork, error) {
q := self.getGatewayNetworkQuery()
func (self *SWire) getPublicNetworks(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope) ([]SNetwork, error) {
q := self.getGatewayNetworkQuery(ownerId, scope)
q = q.IsTrue("is_public")
nets := make([]SNetwork, 0)
err := db.FetchModelObjects(NetworkManager, q, &nets)
@@ -634,9 +638,9 @@ func (self *SWire) getPublicNetworks() ([]SNetwork, error) {
return nets, nil
}
func (self *SWire) getPrivateNetworks(userCred mcclient.TokenCredential) ([]SNetwork, error) {
q := self.getGatewayNetworkQuery()
q = q.Equals("tenant_id", userCred.GetProjectId()).IsFalse("is_public")
func (self *SWire) getPrivateNetworks(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope) ([]SNetwork, error) {
q := self.getGatewayNetworkQuery(ownerId, scope)
q = q.IsFalse("is_public")
nets := make([]SNetwork, 0)
err := db.FetchModelObjects(NetworkManager, q, &nets)
if err != nil {
@@ -645,28 +649,28 @@ func (self *SWire) getPrivateNetworks(userCred mcclient.TokenCredential) ([]SNet
return nets, nil
}
func (self *SWire) GetCandidatePrivateNetwork(userCred mcclient.TokenCredential, isExit bool, serverTypes []string) (*SNetwork, error) {
nets, err := self.getPrivateNetworks(userCred)
func (self *SWire) GetCandidatePrivateNetwork(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope, isExit bool, serverTypes []string) (*SNetwork, error) {
nets, err := self.getPrivateNetworks(ownerId, scope)
if err != nil {
return nil, err
}
return ChooseCandidateNetworks(nets, isExit, serverTypes), nil
}
func (self *SWire) GetCandidatePublicNetwork(isExit bool, serverTypes []string) (*SNetwork, error) {
nets, err := self.getPublicNetworks()
func (self *SWire) GetCandidatePublicNetwork(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope, isExit bool, serverTypes []string) (*SNetwork, error) {
nets, err := self.getPublicNetworks(ownerId, scope)
if err != nil {
return nil, err
}
return ChooseCandidateNetworks(nets, isExit, serverTypes), nil
}
func (self *SWire) GetCandidateNetworkForIp(userCred mcclient.TokenCredential, ipAddr string) (*SNetwork, error) {
func (self *SWire) GetCandidateNetworkForIp(ownerId mcclient.IIdentityProvider, scope rbacutils.TRbacScope, ipAddr string) (*SNetwork, error) {
ip, err := netutils.NewIPV4Addr(ipAddr)
if err != nil {
return nil, err
}
netPrivates, err := self.getPrivateNetworks(userCred)
netPrivates, err := self.getPrivateNetworks(ownerId, scope)
if err != nil {
return nil, err
}
@@ -675,7 +679,7 @@ func (self *SWire) GetCandidateNetworkForIp(userCred mcclient.TokenCredential, i
return &net, nil
}
}
netPublics, err := self.getPublicNetworks()
netPublics, err := self.getPublicNetworks(ownerId, scope)
if err != nil {
return nil, err
}
@@ -1016,7 +1020,7 @@ func (wire *SWire) GetChangeOwnerCandidateDomainIds() []string {
}
func (wire *SWire) GetRequiredSharedDomainIds() []string {
networks, _ := wire.getNetworks()
networks, _ := wire.getNetworks(nil, rbacutils.ScopeNone)
if len(networks) == 0 {
return wire.SInfrasResourceBase.GetRequiredSharedDomainIds()
}