feat(region): increase classmetadata limit for vpc, wire, network and host

host will inherit wire's classmetadata when adding netif and netif is
admin type
This commit is contained in:
rainzm
2022-03-02 17:25:29 +08:00
parent 9bfd62325b
commit 59c32ff7d6
4 changed files with 86 additions and 0 deletions
+6
View File
@@ -323,6 +323,12 @@ type IClassMetadataOwner interface {
GetAllClassMetadata() (map[string]string, error)
}
type ClassMetadataOwner map[string]string
func (w ClassMetadataOwner) GetAllClassMetadata() (map[string]string, error) {
return w, nil
}
func IsInSameClass(ctx context.Context, cmo1, cmo2 IClassMetadataOwner) (bool, error) {
pureTags, err := cmo1.GetAllClassMetadata()
if err != nil {
+7
View File
@@ -4197,6 +4197,13 @@ func (self *SHost) addNetif(ctx context.Context, userCred mcclient.TokenCredenti
if err != nil {
return httperrors.NewBadRequestError("%v", err)
}
// inherit wire's class metadata
if sw != nil {
err := db.Inherit(ctx, sw, self)
if err != nil {
return errors.Wrapf(err, "unable to inherit class metadata from sw %s", sw.GetName())
}
}
}
if len(ipAddr) > 0 {
err = self.EnableNetif(ctx, userCred, netif, "", ipAddr, "", "", reserve, requireDesignatedIp)
+44
View File
@@ -1638,6 +1638,26 @@ func (manager *SNetworkManager) ValidateCreateData(ctx context.Context, userCred
if input.ServerType != api.NETWORK_TYPE_EIP {
input.BgpType = ""
}
// check class metadata
if wire != nil {
var projectId string
if len(input.ProjectId) > 0 {
projectId = input.ProjectId
} else {
projectId = ownerId.GetProjectId()
}
project, err := db.TenantCacheManager.FetchTenantById(ctx, projectId)
if err != nil {
return input, errors.Wrapf(err, "unable to fetch tenant by id %s", projectId)
}
ok, err := db.IsInSameClass(ctx, wire, project)
if err != nil {
return input, errors.Wrapf(err, "unable to check if wire and project is in same class")
}
if !ok {
return input, httperrors.NewForbiddenError("the wire %s and project %s has different class metadata", wire.GetName(), project.GetName())
}
}
var (
ipStart = ipRange.StartIp()
@@ -2767,6 +2787,15 @@ func (manager *SNetworkManager) PerformTryCreateNetwork(ctx context.Context, use
return nil, err
}
newNetwork.PostCreate(ctx, userCred, userCred, query, input.JSON(input))
// inherit wire's class metadata
wire, err := newNetwork.GetWire()
if err != nil {
return nil, errors.Wrap(err, "unable to get wire")
}
err = db.Inherit(ctx, wire, newNetwork)
if err != nil {
return nil, errors.Wrap(err, "unable to inherit wire")
}
}
return ret, nil
}
@@ -2804,6 +2833,21 @@ func (network *SNetwork) ClearSchedDescCache() error {
}
func (network *SNetwork) PerformChangeOwner(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformChangeProjectOwnerInput) (jsonutils.JSONObject, error) {
wire, err := network.GetWire()
if err != nil {
return nil, errors.Wrap(err, "unable to get wire")
}
project, err := db.TenantCacheManager.FetchTenantById(ctx, input.ProjectId)
if err != nil {
return nil, errors.Wrapf(err, "unable to get project %s", input.ProjectId)
}
ok, err := db.IsInSameClass(ctx, wire, project)
if err != nil {
return nil, errors.Wrap(err, "unable to check if the wire and project is in same class")
}
if !ok {
return nil, httperrors.NewForbiddenError("the wire %s and the project %s has different class metadata", wire.GetName(), project.GetName())
}
ret, err := network.SSharableVirtualResourceBase.PerformChangeOwner(ctx, userCred, query, input)
if err != nil {
return nil, err
+29
View File
@@ -1280,6 +1280,23 @@ func (wm *SWireManager) handleWireIdChange(ctx context.Context, args *wireIdChan
return nil
}
func (wire *SWire) PerformSetClassMetadata(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformSetClassMetadataInput) (jsonutils.JSONObject, error) {
vpc, err := wire.GetVpc()
if err != nil {
return nil, errors.Wrapf(err, "unable to get vpc of wire %s", wire.GetId())
}
if vpc.GetId() != api.DEFAULT_VPC_ID {
ok, err := db.IsInSameClass(ctx, vpc, db.ClassMetadataOwner(input))
if err != nil {
return nil, errors.Wrapf(err, "unable to check if vpc and wire are in same class")
}
if !ok {
return nil, httperrors.NewForbiddenError("the vpc %s and this wire have different class metadata", vpc.GetName())
}
}
return wire.SStatusInfrasResourceBase.PerformSetClassMetadata(ctx, userCred, query, input)
}
// 二层网络列表
func (manager *SWireManager) ListItemFilter(
ctx context.Context,
@@ -1448,6 +1465,18 @@ func (model *SWire) CustomizeCreate(ctx context.Context, userCred mcclient.Token
return model.SInfrasResourceBase.CustomizeCreate(ctx, userCred, ownerId, query, data)
}
func (model *SWire) PostCreate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
model.SStatusInfrasResourceBase.PostCreate(ctx, userCred, ownerId, query, data)
vpc, err := model.GetVpc()
if err != nil {
log.Errorf("unable to getvpc of wire %s: %s", model.GetId(), vpc.GetId())
}
err = db.Inherit(ctx, vpc, model)
if err != nil {
log.Errorf("unable to inhert vpc to model %s: %s", model.GetId(), err.Error())
}
}
func (wire *SWire) GetChangeOwnerCandidateDomainIds() []string {
candidates := [][]string{}
vpc, _ := wire.GetVpc()