in server/service/kv/kv_svc.go [74:140]
func Create(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, *errsvc.Error) {
if kv.Status == "" {
kv.Status = common.StatusDisabled
}
err := validator.Validate(kv)
if err != nil {
return nil, config.NewError(config.ErrInvalidParams, err.Error())
}
err = quota.PreCreate(kv.Domain, kv.Project, "", 1)
if err != nil {
if err == quota.ErrReached {
openlog.Error(fmt.Sprintf("can not create kv %s@%s, due to quota violation", kv.Key, kv.Project))
return nil, config.NewError(config.ErrNotEnoughQuota, err.Error())
}
openlog.Error(err.Error())
return nil, config.NewError(config.ErrInternal, "quota check failed")
}
if kv.Labels == nil {
kv.Labels = map[string]string{}
}
kv.LabelFormat = stringutil.FormatMap(kv.Labels)
if kv.ValueType == "" {
kv.ValueType = datasource.DefaultValueType
}
//check whether the project has certain labels or not
exist, err := datasource.GetBroker().GetKVDao().Exist(
ctx,
kv.Key,
kv.Project,
kv.Domain,
datasource.WithLabelFormat(kv.LabelFormat),
datasource.WithLabels(kv.Labels),
)
if err != nil {
openlog.Error(err.Error())
return nil, config.NewError(config.ErrInternal, "create kv failed")
}
if exist {
return kv, config.NewError(config.ErrRecordAlreadyExists, datasource.ErrKVAlreadyExists.Error())
}
revision, err := datasource.GetBroker().GetRevisionDao().ApplyRevision(ctx, kv.Domain)
if err != nil {
openlog.Error(err.Error())
return nil, config.NewError(config.ErrInternal, "create kv failed")
}
err = completeKV(kv, revision)
if err != nil {
openlog.Error(err.Error())
return nil, config.NewError(config.ErrInternal, "create kv failed")
}
kv, err = datasource.GetBroker().GetKVDao().Create(ctx, kv, datasource.WithSync(sync.FromContext(ctx)))
if err != nil {
openlog.Error(fmt.Sprintf("post err:%s", err.Error()))
return nil, util.SvcErr(err)
}
err = datasource.GetBroker().GetHistoryDao().AddHistory(ctx, kv)
if err != nil {
openlog.Warn(
fmt.Sprintf("can not updateKeyValue version for [%s] [%s] in [%s]",
kv.Key, kv.Labels, kv.Domain))
}
openlog.Debug(fmt.Sprintf("create %s with labels %s length [%d]", kv.Key, kv.Labels, len(kv.Value)))
datasource.ClearPart(kv)
return kv, nil
}