Skip to content

Commit

Permalink
fix: export missing keys && export panic
Browse files Browse the repository at this point in the history
  • Loading branch information
Qiu Jian committed May 8, 2020
1 parent 0c45818 commit bfa8786
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 31 deletions.
48 changes: 25 additions & 23 deletions pkg/cloudcommon/db/db_dispatcher.go
Expand Up @@ -352,7 +352,7 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
showDetails = true
}
items := make([]interface{}, 0)
extraResults := make([]jsonutils.JSONObject, 0)
extraResults := make([]*jsonutils.JSONDict, 0)
rows, err := q.Rows()
if err != nil && err != sql.ErrNoRows {
return nil, err
Expand All @@ -371,7 +371,7 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
return nil, err
}

if exportKeys != nil {
if len(exportKeys) > 0 {
rowMap, err := q.Row2Map(rows)
if err != nil {
return nil, err
Expand Down Expand Up @@ -404,45 +404,45 @@ func Query2List(manager IModelManager, ctx context.Context, userCred mcclient.To
}
}

// jsonDict := jsonutils.Marshal(item).(*jsonutils.JSONDict)
// jsonDict = jsonDict.CopyIncludes([]string(listF)...)
// jsonDict.Update(extraData)
// ignore GetExtraDetails since release/3.2
/*if showDetails && !query.Contains("export_keys") {
extraDict, _ := GetExtraDetails(item, ctx, userCred, query, true)
if extraDict != nil {
// Fix for Now
extraDict.Update(jsonDict)
jsonDict = extraDict
}
// jsonDict = getModelExtraDetails(item, ctx, jsonDict)
}*/
// results = append(results, jsonDict)
items = append(items, item)
}
results := make([]jsonutils.JSONObject, len(items))
if showDetails && !query.Contains("export_keys") {
if showDetails || len(exportKeys) > 0 {
var sortedListFields stringutils2.SSortedStrings
if len(fieldFilter) > 0 {
if len(exportKeys) > 0 {
sortedListFields = exportKeys
} else if len(fieldFilter) > 0 {
sortedListFields = stringutils2.NewSortedStrings(fieldFilter)
}
extraRows, err := FetchCustomizeColumns(manager, ctx, userCred, query, items, sortedListFields, true)

if err != nil {
return nil, errors.Wrap(err, "FetchCustomizeColumns")
}

if len(extraRows) == len(results) {
for i := range results {
results[i] = extraRows[i].CopyExcludes(listExcludes...)
jsonDict := extraRows[i].CopyExcludes(listExcludes...)
if i < len(extraResults) {
extraResults[i].Update(jsonDict)
jsonDict = extraResults[i]
}
if len(exportKeys) > 0 {
jsonDict = jsonDict.CopyIncludes(exportKeys...)
}
if len(fieldFilter) > 0 {
jsonDict = jsonDict.CopyIncludes(fieldFilter...)
}
results[i] = jsonDict
}
} else {
return nil, httperrors.NewInternalServerError("FetchCustomizeColumns return incorrect number of results")
}
} else {
for i := range items {
jsonDict := jsonutils.Marshal(items[i]).(*jsonutils.JSONDict).CopyExcludes(listExcludes...)
if i < len(extraResults) {
jsonDict.Update(extraResults[i])
if len(fieldFilter) > 0 {
jsonDict = jsonDict.CopyIncludes(fieldFilter...)
}
results[i] = jsonDict
}
Expand Down Expand Up @@ -653,7 +653,9 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok
}

if pagingConf != nil {
q = q.Limit(int(limit) + 1)
if limit > 0 {
q = q.Limit(int(limit) + 1)
}
if len(pagingMarker) > 0 {
markers := decodePagingMarker(pagingMarker)
for markerIdx, marker := range markers {
Expand All @@ -671,7 +673,7 @@ func ListItems(manager IModelManager, ctx context.Context, userCred mcclient.Tok
return nil, httperrors.NewGeneralError(err)
}
nextMarkers := make([]string, 0)
if int64(len(retList)) > limit {
if limit > 0 && int64(len(retList)) > limit {
for _, markerField := range pagingConf.MarkerFields {
nextMarker, _ := retList[limit].GetString(markerField)
nextMarkers = append(nextMarkers, nextMarker)
Expand Down
4 changes: 2 additions & 2 deletions pkg/compute/models/elasticcache_instances.go
Expand Up @@ -1492,13 +1492,13 @@ func (manager *SElasticcacheManager) ListItemExportKeys(ctx context.Context,
}
}
if keys.Contains("zone") {
q, err = manager.SZoneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SZoneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"zone"}))
if err != nil {
return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemExportKeys")
}
}
if keys.ContainsAny("network", "wire") {
q, err = manager.SNetworkResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SNetworkResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"network", "wire"}))
if err != nil {
return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemExportKeys")
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/compute/models/loadbalancerclusters.go
Expand Up @@ -423,7 +423,7 @@ func (manager *SLoadbalancerClusterManager) ListItemExportKeys(ctx context.Conte
}
}
if keys.Contains("wire") {
q, err = manager.SWireResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SWireResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"wire"}))
if err != nil {
return nil, errors.Wrap(err, "SWireResourceBaseManager.ListItemExportKeys")
}
Expand Down
6 changes: 3 additions & 3 deletions pkg/compute/models/loadbalancers.go
Expand Up @@ -1117,19 +1117,19 @@ func (manager *SLoadbalancerManager) ListItemExportKeys(ctx context.Context,
}
}
if keys.Contains("zone") {
q, err = manager.SZoneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SZoneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"zone"}))
if err != nil {
return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemExportKeys")
}
}
if keys.Contains("vpc") {
q, err = manager.SVpcResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SVpcResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"vpc"}))
if err != nil {
return nil, errors.Wrap(err, "SVpcResourceBaseManager.ListItemExportKeys")
}
}
if keys.ContainsAny("network", "wire") {
q, err = manager.SNetworkResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SNetworkResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"network", "wire"}))
if err != nil {
return nil, errors.Wrap(err, "SNetworkResourceBaseManager.ListItemExportKeys")
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/compute/models/skus.go
Expand Up @@ -1537,7 +1537,7 @@ func (manager *SServerSkuManager) ListItemExportKeys(ctx context.Context,
}
}
if keys.Contains("zone") {
q, err = manager.SZoneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SZoneResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"zone"}))
if err != nil {
return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemExportKeys")
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/compute/models/snapshots.go
Expand Up @@ -1101,7 +1101,7 @@ func (manager *SSnapshotManager) ListItemExportKeys(ctx context.Context,
}
}
if keys.Contains("disk") {
q, err = manager.SDiskResourceBaseManager.ListItemExportKeys(ctx, q, userCred, keys)
q, err = manager.SDiskResourceBaseManager.ListItemExportKeys(ctx, q, userCred, stringutils2.NewSortedStrings([]string{"disk"}))
if err != nil {
return nil, errors.Wrap(err, "SDiskResourceBaseManager.ListItemExportKeys")
}
Expand Down
11 changes: 11 additions & 0 deletions pkg/compute/models/storages.go
Expand Up @@ -1509,5 +1509,16 @@ func (manager *SStorageManager) ListItemExportKeys(ctx context.Context,
return nil, errors.Wrap(err, "SZoneResourceBaseManager.ListItemExportKeys")
}
}
if keys.Contains("schedtag") {
schedtagsQ := SchedtagManager.Query("id", "name").SubQuery()
storageSchedtagQ := StorageschedtagManager.Query("storage_id", "schedtag_id").SubQuery()

subQ := storageSchedtagQ.Query(storageSchedtagQ.Field("storage_id"), sqlchemy.GROUP_CONCAT("schedtag", schedtagsQ.Field("name")))
subQ = subQ.Join(schedtagsQ, sqlchemy.Equals(schedtagsQ.Field("id"), storageSchedtagQ.Field("schedtag_id")))
subQ = subQ.GroupBy(storageSchedtagQ.Field("storage_id"))
subQT := subQ.SubQuery()
q = q.LeftJoin(subQT, sqlchemy.Equals(q.Field("id"), subQT.Field("storage_id")))
q = q.AppendField(subQT.Field("schedtag"))
}
return q, nil
}

0 comments on commit bfa8786

Please sign in to comment.