13
13
package service
14
14
15
15
import (
16
- "encoding/json"
17
- "fmt"
18
16
"reflect"
19
- "sort"
20
17
"strconv"
21
18
"strings"
22
19
@@ -168,7 +165,8 @@ func (ps *ProcServer) GetServiceTemplate(ctx *rest.Contexts) {
168
165
templateIDStr := ctx .Request .PathParameter (common .BKServiceTemplateIDField )
169
166
templateID , err := strconv .ParseInt (templateIDStr , 10 , 64 )
170
167
if err != nil {
171
- ctx .RespErrorCodeF (common .CCErrCommParamsInvalid , "create service template failed, err: %v" , common .BKServiceTemplateIDField , err )
168
+ ctx .RespErrorCodeF (common .CCErrCommParamsInvalid , "create service template failed, err: %v" ,
169
+ common .BKServiceTemplateIDField , err )
172
170
return
173
171
}
174
172
template , err := ps .CoreAPI .CoreService ().Process ().GetServiceTemplate (ctx .Kit .Ctx , ctx .Kit .Header , templateID )
@@ -185,10 +183,12 @@ func (ps *ProcServer) GetServiceTemplateDetail(ctx *rest.Contexts) {
185
183
templateIDStr := ctx .Request .PathParameter (common .BKServiceTemplateIDField )
186
184
templateID , err := strconv .ParseInt (templateIDStr , 10 , 64 )
187
185
if err != nil {
188
- ctx .RespErrorCodeF (common .CCErrCommParamsInvalid , "create service template failed, err: %v" , common .BKServiceTemplateIDField , err )
186
+ ctx .RespErrorCodeF (common .CCErrCommParamsInvalid , "create service template failed, err: %v" ,
187
+ common .BKServiceTemplateIDField , err )
189
188
return
190
189
}
191
- templateDetail , err := ps .CoreAPI .CoreService ().Process ().GetServiceTemplateWithStatistics (ctx .Kit .Ctx , ctx .Kit .Header , templateID )
190
+ templateDetail , err := ps .CoreAPI .CoreService ().Process ().GetServiceTemplateWithStatistics (ctx .Kit .Ctx ,
191
+ ctx .Kit .Header , templateID )
192
192
if err != nil {
193
193
ctx .RespWithError (err , common .CCErrCommHTTPDoRequestFailed , "get service template failed, err: %v" , err )
194
194
return
@@ -424,8 +424,9 @@ func (ps *ProcServer) ExecServiceTemplateHostApplyRule(ctx *rest.Contexts) {
424
424
ctx .RespEntity (nil )
425
425
}
426
426
427
- func (s * ProcServer ) getUpdateDataStrByApplyRule (kit * rest.Kit , rules []metadata.CreateHostApplyRuleOption ) (
428
- string , errors.CCErrorCoder ) {
427
+ func (s * ProcServer ) getUpdateDataByApplyRule (kit * rest.Kit , rules []metadata.CreateHostApplyRuleOption ) (
428
+ map [string ]interface {}, errors.CCErrorCoder ) {
429
+
429
430
attributeIDs := make ([]int64 , 0 )
430
431
attrIDMap := make (map [int64 ]struct {})
431
432
for _ , rule := range rules {
@@ -449,51 +450,61 @@ func (s *ProcServer) getUpdateDataStrByApplyRule(kit *rest.Kit, rules []metadata
449
450
attrRes , err := s .CoreAPI .CoreService ().Model ().ReadModelAttr (kit .Ctx , kit .Header , common .BKInnerObjIDHost , attCond )
450
451
if err != nil {
451
452
blog .Errorf ("read model attr failed, err: %v, attrCond: %#v, rid: %s" , err , attCond , kit .Rid )
452
- return "" , kit .CCError .CCError (common .CCErrCommHTTPDoRequestFailed )
453
+ return nil , kit .CCError .CCError (common .CCErrCommHTTPDoRequestFailed )
453
454
}
454
455
455
456
attrMap := make (map [int64 ]string )
456
457
for _ , attr := range attrRes .Info {
457
458
attrMap [attr .ID ] = attr .PropertyID
458
459
}
459
460
460
- fields := make ([] string , len ( rules ) )
461
+ updateData := make (map [ string ] interface {} )
461
462
462
- for index , field := range rules {
463
- value , _ := json .Marshal (field .PropertyValue )
464
- fields [index ] = fmt .Sprintf (`"%s":%s` , attrMap [field .AttributeID ], string (value ))
463
+ for _ , field := range rules {
464
+ updateData [attrMap [field.AttributeID ]] = field .PropertyValue
465
465
}
466
466
467
- sort .Strings (fields )
468
- return "{" + strings .Join (fields , "," ) + "}" , nil
467
+ return updateData , nil
469
468
}
470
469
471
- func generateCondition (dataStr string , hostIDs []int64 ) (map [string ]interface {}, map [string ]interface {}) {
472
- data := make (map [string ]interface {})
473
- _ = json .Unmarshal ([]byte (dataStr ), & data )
470
+ func generateCondition (kit * rest.Kit , data map [string ]interface {}, hostIDs []int64 ) (map [string ]interface {},
471
+ errors.CCErrorCoder ) {
474
472
475
473
cond := make ([]map [string ]interface {}, 0 )
476
474
477
475
for key , value := range data {
476
+ // host special field is array type
477
+ if util .InArray (key , metadata .HostSpecialFields ) {
478
+ valueStr , ok := value .(string )
479
+ if ! ok {
480
+ blog .Errorf ("host special field %s value %v is not string type, rid: %s" , key , value , kit .Rid )
481
+ return nil , kit .CCError .CCErrorf (common .CCErrCommParamsNeedString , key )
482
+ }
483
+ value = strings .Split (valueStr , "," )
484
+ }
478
485
cond = append (cond , map [string ]interface {}{
479
486
key : map [string ]interface {}{common .BKDBNE : value },
480
487
})
481
488
}
489
+
482
490
mergeCond := map [string ]interface {}{
483
491
common .BKHostIDField : map [string ]interface {}{common .BKDBIN : hostIDs },
484
492
common .BKDBOR : cond ,
485
493
}
486
- return mergeCond , data
494
+ return mergeCond , nil
487
495
}
488
496
489
497
func (s * ProcServer ) updateHostAttributes (kit * rest.Kit , planResult * metadata.HostApplyServiceTemplateOption ,
490
498
hostIDs []int64 ) errors.CCErrorCoder {
491
499
492
- dataStr , err := s .getUpdateDataStrByApplyRule (kit , planResult .AdditionalRules )
500
+ data , err := s .getUpdateDataByApplyRule (kit , planResult .AdditionalRules )
501
+ if err != nil {
502
+ return err
503
+ }
504
+ mergeCond , err := generateCondition (kit , data , hostIDs )
493
505
if err != nil {
494
506
return err
495
507
}
496
- mergeCond , data := generateCondition (dataStr , hostIDs )
497
508
counts , cErr := s .Engine .CoreAPI .CoreService ().Count ().GetCountByFilter (kit .Ctx , kit .Header ,
498
509
common .BKTableNameBaseHost , []map [string ]interface {}{mergeCond })
499
510
if cErr != nil {
@@ -744,7 +755,8 @@ func (ps *ProcServer) UpdateServiceTemplate(ctx *rest.Contexts) {
744
755
var tpl * metadata.ServiceTemplate
745
756
txnErr := ps .Engine .CoreAPI .CoreService ().Txn ().AutoRunTxn (ctx .Kit .Ctx , ctx .Kit .Header , func () error {
746
757
var err error
747
- tpl , err = ps .CoreAPI .CoreService ().Process ().UpdateServiceTemplate (ctx .Kit .Ctx , ctx .Kit .Header , option .ID , updateParam )
758
+ tpl , err = ps .CoreAPI .CoreService ().Process ().UpdateServiceTemplate (ctx .Kit .Ctx , ctx .Kit .Header , option .ID ,
759
+ updateParam )
748
760
if err != nil {
749
761
blog .Errorf ("update service template failed, err: %v" , err )
750
762
return err
@@ -988,19 +1000,18 @@ func (ps *ProcServer) ListServiceTemplates(ctx *rest.Contexts) {
988
1000
func (ps * ProcServer ) FindServiceTemplateCountInfo (ctx * rest.Contexts ) {
989
1001
bizID , err := strconv .ParseInt (ctx .Request .PathParameter (common .BKAppIDField ), 10 , 64 )
990
1002
if err != nil {
991
- blog .Errorf ("FindServiceTemplateCountInfo failed, parse bk_biz_id error, err: %s , rid: %s" , err , ctx .Kit .Rid )
1003
+ blog .Errorf ("parse bk_biz_id error, err: %v , rid: %s" , err , ctx .Kit .Rid )
992
1004
ctx .RespAutoError (ctx .Kit .CCError .CCErrorf (common .CCErrCommParamsIsInvalid , "bk_biz_id" ))
993
1005
return
994
1006
}
995
1007
996
1008
input := new (metadata.FindServiceTemplateCountInfoOption )
997
- if err := ctx .DecodeInto (input ); nil != err {
1009
+ if err := ctx .DecodeInto (input ); err != nil {
998
1010
ctx .RespAutoError (err )
999
1011
return
1000
1012
}
1001
1013
1002
- rawErr := input .Validate ()
1003
- if rawErr .ErrCode != 0 {
1014
+ if rawErr := input .Validate (); rawErr .ErrCode != 0 {
1004
1015
ctx .RespAutoError (rawErr .ToCCError (ctx .Kit .CCError ))
1005
1016
return
1006
1017
}
@@ -1015,38 +1026,44 @@ func (ps *ProcServer) FindServiceTemplateCountInfo(ctx *rest.Contexts) {
1015
1026
}
1016
1027
1017
1028
// process templates reference count
1018
- processTemplateCounts , err := ps .CoreAPI .CoreService ().Count ().GetCountByFilter (ctx .Kit .Ctx , ctx .Kit .Header , common .BKTableNameProcessTemplate , filters )
1029
+ processTemplateCounts , err := ps .CoreAPI .CoreService ().Count ().GetCountByFilter (ctx .Kit .Ctx , ctx .Kit .Header ,
1030
+ common .BKTableNameProcessTemplate , filters )
1019
1031
if err != nil {
1020
- ctx .RespWithError (err , common .CCErrProcGetProcessTemplatesFailed , "count process template by filters: %+v failed." , filters )
1032
+ blog .Errorf ("count process template by filters: %+v failed, err: %v, rid: %s" , filters , err , ctx .Kit .Rid )
1033
+ ctx .RespAutoError (err )
1021
1034
return
1022
1035
}
1023
1036
if len (processTemplateCounts ) != len (input .ServiceTemplateIDs ) {
1024
- ctx . RespWithError ( ctx .Kit .CCError . CCError ( common . CCErrProcGetProcessTemplatesFailed ), common . CCErrProcGetProcessTemplatesFailed ,
1025
- "the count of process must be equal with the count of service templates, filters:%#v" , filters )
1037
+ blog . Errorf ( "proc temp count != service temp count, filters: %#v, rid: %s" , filters , ctx .Kit .Rid )
1038
+ ctx . RespAutoError ( ctx . Kit . CCError . CCError ( common . CCErrProcGetProcessTemplatesFailed ) )
1026
1039
return
1027
1040
}
1028
1041
1029
1042
// module reference count
1030
- moduleCounts , err := ps .CoreAPI .CoreService ().Count ().GetCountByFilter (ctx .Kit .Ctx , ctx .Kit .Header , common .BKTableNameBaseModule , filters )
1043
+ moduleCounts , err := ps .CoreAPI .CoreService ().Count ().GetCountByFilter (ctx .Kit .Ctx , ctx .Kit .Header ,
1044
+ common .BKTableNameBaseModule , filters )
1031
1045
if err != nil {
1032
- ctx .RespWithError (err , common .CCErrTopoModuleSelectFailed , "count process template by filters: %+v failed." , filters )
1046
+ blog .Errorf ("count module by filters: %+v failed, err: %v, rid: %s" , filters , err , ctx .Kit .Rid )
1047
+ ctx .RespAutoError (err )
1033
1048
return
1034
1049
}
1035
1050
if len (moduleCounts ) != len (input .ServiceTemplateIDs ) {
1036
- ctx . RespWithError ( ctx .Kit .CCError . CCError ( common . CCErrTopoModuleSelectFailed ), common . CCErrTopoModuleSelectFailed ,
1037
- "the count of modules must be equal with the count of service templates, filters:%#v" , filters )
1051
+ blog . Errorf ( "module count != service template count, filters: %#v, rid: %s" , filters , ctx .Kit .Rid )
1052
+ ctx . RespAutoError ( ctx . Kit . CCError . CCError ( common . CCErrTopoModuleSelectFailed ) )
1038
1053
return
1039
1054
}
1040
1055
1041
1056
// service instance reference count
1042
- serviceInstanceCounts , err := ps .CoreAPI .CoreService ().Count ().GetCountByFilter (ctx .Kit .Ctx , ctx .Kit .Header , common .BKTableNameServiceInstance , filters )
1057
+ serviceInstanceCounts , err := ps .CoreAPI .CoreService ().Count ().GetCountByFilter (ctx .Kit .Ctx , ctx .Kit .Header ,
1058
+ common .BKTableNameServiceInstance , filters )
1043
1059
if err != nil {
1044
- ctx .RespWithError (err , common .CCErrProcGetServiceInstancesFailed , "count process template by filters: %+v failed." , filters )
1060
+ blog .Errorf ("count service instance by filters: %+v failed, err: %v, rid: %s" , filters , err , ctx .Kit .Rid )
1061
+ ctx .RespAutoError (err )
1045
1062
return
1046
1063
}
1047
1064
if len (serviceInstanceCounts ) != len (input .ServiceTemplateIDs ) {
1048
- ctx . RespWithError ( ctx .Kit .CCError . CCError ( common . CCErrProcGetServiceInstancesFailed ), common . CCErrProcGetServiceInstancesFailed ,
1049
- "the count of service instance must be equal with the count of service templates, filters:%#v" , filters )
1065
+ blog . Errorf ( "service instance count != service template count, filters: %#v, rid: %s" , filters , ctx .Kit .Rid )
1066
+ ctx . RespAutoError ( ctx . Kit . CCError . CCError ( common . CCErrProcGetServiceInstancesFailed ) )
1050
1067
return
1051
1068
}
1052
1069
@@ -1059,7 +1076,6 @@ func (ps *ProcServer) FindServiceTemplateCountInfo(ctx *rest.Contexts) {
1059
1076
ModuleCount : moduleCounts [idx ],
1060
1077
})
1061
1078
}
1062
-
1063
1079
ctx .RespEntity (result )
1064
1080
}
1065
1081
0 commit comments