fix: desinate ip addresses when batch creating guests (#17859)

Co-authored-by: Qiu Jian <qiujian@yunionyun.com>
This commit is contained in:
Jian Qiu
2023-08-29 21:19:43 +08:00
committed by GitHub
co-authored by Qiu Jian
parent c100036989
commit 784fa91bab
25 changed files with 872 additions and 741 deletions
+11
View File
@@ -239,6 +239,17 @@ func ParseNetworkConfig(desc string, idx int) (*compute.NetworkConfig, error) {
netConfig.Mac = netutils.MacUnpackHex(p)
} else if strings.HasPrefix(p, "wire=") {
netConfig.Wire = p[len("wire="):]
} else if strings.HasPrefix(p, "macs=") {
macSegs := strings.Split(p[len("macs="):], ",")
macs := make([]string, len(macSegs))
for i := range macSegs {
macs[i] = netutils.MacUnpackHex(macSegs[i])
}
netConfig.Macs = macs
} else if strings.HasPrefix(p, "ips=") {
netConfig.Addresses = strings.Split(p[len("ips="):], ",")
} else if strings.HasPrefix(p, "ip6s=") {
netConfig.Addresses6 = strings.Split(p[len("ip6s="):], ",")
} else if p == "[require_designated_ip]" {
netConfig.RequireDesignatedIP = true
} else if p == "[random_exit]" {
+16
View File
@@ -253,6 +253,22 @@ func ValidateCreateData(funcName string, manager IModelManager, ctx context.Cont
return mergeInputOutputData(data, resVal), nil
}
func ExpandBatchCreateData(manager IModelManager, ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict, index int) (*jsonutils.JSONDict, error) {
funcName := "ExpandBatchCreateData"
ret, err := call(manager, funcName, ctx, userCred, ownerId, query, data, index)
if err != nil {
return nil, errors.Wrapf(err, "call %s", funcName)
}
if len(ret) != 2 {
return nil, httperrors.NewInternalServerError("Invald %s return value", funcName)
}
resVal := ret[0]
if err := ValueToError(ret[1]); err != nil {
return nil, errors.Wrap(err, "ValueToError")
}
return mergeInputOutputData(data, resVal), nil
}
func ListItemFilter(manager IModelManager, ctx context.Context, q *sqlchemy.SQuery, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (*sqlchemy.SQuery, error) {
return _callListQueryFilter(manager, "ListItemFilter", ctx, q, userCred, query)
}
+22 -5
View File
@@ -1428,11 +1428,18 @@ func (dispatcher *DBModelDispatcher) Create(ctx context.Context, query jsonutils
OpsLog.LogEvent(model, ACT_CREATE, notes, userCred)
logclient.AddActionLogWithContext(ctx, model, logclient.ACT_CREATE, notes, userCred, true)
}
manager.OnCreateComplete(ctx, []IModel{model}, userCred, ownerId, query, data)
manager.OnCreateComplete(ctx, []IModel{model}, userCred, ownerId, query, []jsonutils.JSONObject{data})
return getItemDetails(manager, model, ctx, userCred, query)
}
func expandMultiCreateParams(manager IModelManager, data jsonutils.JSONObject, count int) ([]jsonutils.JSONObject, error) {
func expandMultiCreateParams(manager IModelManager,
ctx context.Context,
userCred mcclient.TokenCredential,
ownerId mcclient.IIdentityProvider,
query jsonutils.JSONObject,
data jsonutils.JSONObject,
count int,
) ([]jsonutils.JSONObject, error) {
jsonDict, ok := data.(*jsonutils.JSONDict)
if !ok {
return nil, httperrors.NewInputParameterError("body is not a json?")
@@ -1450,7 +1457,16 @@ func expandMultiCreateParams(manager IModelManager, data jsonutils.JSONObject, c
}
ret := make([]jsonutils.JSONObject, count)
for i := 0; i < count; i += 1 {
ret[i] = jsonDict.Copy()
input, err := ExpandBatchCreateData(manager, ctx, userCred, ownerId, query, jsonDict.Copy(), i)
if err != nil {
if errors.Cause(err) == MethodNotFoundError {
ret[i] = jsonDict.Copy()
} else {
return nil, errors.Wrap(err, "ExpandBatchCreateData")
}
} else {
ret[i] = input
}
}
return ret, nil
}
@@ -1508,7 +1524,7 @@ func (dispatcher *DBModelDispatcher) BatchCreate(ctx context.Context, query json
return nil, errors.Wrap(err, "manager.BatchPreValidate")
}
multiData, err = expandMultiCreateParams(manager, data, count)
multiData, err = expandMultiCreateParams(manager, ctx, userCred, ownerId, query, data, count)
if err != nil {
return nil, errors.Wrap(err, "expandMultiCreateParams")
}
@@ -1517,6 +1533,7 @@ func (dispatcher *DBModelDispatcher) BatchCreate(ctx context.Context, query json
ret := make([]sCreateResult, len(multiData))
for i := range multiData {
var model IModel
log.Debugf("batchCreateDoCreateItem %d %s", i, multiData[i].String())
model, err = batchCreateDoCreateItem(manager, ctx, userCred, ownerId, query, multiData[i], i+1)
if err == nil {
ret[i] = sCreateResult{model: model, err: nil}
@@ -1576,7 +1593,7 @@ func (dispatcher *DBModelDispatcher) BatchCreate(ctx context.Context, query json
lockman.LockClass(ctx, manager, GetLockClassKey(manager, ownerId))
defer lockman.ReleaseClass(ctx, manager, GetLockClassKey(manager, ownerId))
manager.OnCreateComplete(ctx, models, userCred, ownerId, query, multiData[0])
manager.OnCreateComplete(ctx, models, userCred, ownerId, query, multiData)
}
return results, nil
}
+1 -1
View File
@@ -190,7 +190,7 @@ func attachItems(
}
item.PostCreate(ctx, userCred, nil, query, data)
OpsLog.LogAttachEvent(ctx, master, slave, userCred, jsonutils.Marshal(item))
dispatcher.manager.OnCreateComplete(ctx, []IModel{item}, userCred, nil, query, data)
dispatcher.manager.OnCreateComplete(ctx, []IModel{item}, userCred, nil, query, []jsonutils.JSONObject{data})
return getItemDetails(dispatcher.JointModelManager(), item, ctx, userCred, query)
}
+1 -1
View File
@@ -96,7 +96,7 @@ type IModelManager interface {
// BatchCreateValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error)
// ValidateCreateData dynamic called by dispatcher
// ValidateCreateData(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error)
OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject)
OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject)
BatchPreValidate(ctx context.Context, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider,
query jsonutils.JSONObject, data *jsonutils.JSONDict, count int) error
+1 -1
View File
@@ -271,7 +271,7 @@ func (manager *SModelBaseManager) ValidateCreateData(ctx context.Context, userCr
return input, nil
}
func (manager *SModelBaseManager) OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data jsonutils.JSONObject) {
func (manager *SModelBaseManager) OnCreateComplete(ctx context.Context, items []IModel, userCred mcclient.TokenCredential, ownerId mcclient.IIdentityProvider, query jsonutils.JSONObject, data []jsonutils.JSONObject) {
// do nothing
}