AnyCall API Extension Guide - cloud-barista/cb-spider GitHub Wiki

[AnyCall API Extension Overview]

  • ๋ฉ€ํ‹ฐํด๋ผ์šฐ๋“œ ๊ณตํ†ต ์ œ์–ด๋ฅผ ์ œ๊ณตํ•˜๋Š” CB-Spider API๋Š” ํŠน์ • Cloud์˜ ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๋ถˆ์ถฉ๋ถ„ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
  • AnyCall API ํ™•์žฅ(AnyCall API Extension) ๊ธฐ๋Šฅ์€ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ
    • ํŠน์ • CSP์— ํŠนํ™”๋œ API๋ฅผ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • AnyCall ๊ธฐ๋Šฅ์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด
    • (1)AnyCall MSG, (2)AnyCall API, (3)AnyCallHandler ๋ฐ ์ถ”๊ฐ€๋˜๋Š” (4)Ext-Function๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • CB-Spider๋Š” API ํ™•์žฅ ๊ธฐ๋Šฅ ์ œ๊ณต์„ ์œ„ํ•˜์—ฌ
    • ๋ฒ”์šฉ์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ (2)AncyCall API์™€ (3)AnyCallHandler๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ,
  • ๊ฐœ๋ฐœ์ž๊ธ‰ ์‚ฌ์šฉ์ž๋Š” ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” API(ํ•จ์ˆ˜)์˜
    • (1)AnyCall MSG ์ •์˜์™€ (4)Ext-Function์˜ ์ถ”๊ฐ€ ๊ฐœ๋ฐœ๋กœ API ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ณ„ ์„ธ๋ถ€ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • (1) AnyCall MSG
      • ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” API(ํ•จ์ˆ˜)์˜ ํ•จ์ˆ˜ ์ด๋ฆ„, ์ธ์ž ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’ ๋“ฑ์„ ์ •์˜ํ•˜๋Š” ๋ฉ”์‹œ์ง€์ด๋ฉฐ,
      • (2)AnyCall API๋กœ ์ „๋‹ฌํ•˜๋Š” Input MSG์™€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ ๋ฐ›๋Š” Output MSG๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.
      • AnyCall MSG๊ฐ€ ํฌํ•จํ•˜๋Š” ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
          - To. Cloud: ํ•จ์ˆ˜ ์‹คํ–‰ ๋Œ€์ƒ ํด๋ผ์šฐ๋“œ(๋“ฑ๋ก๋œ Cloud Connection Name)
          - Function ID: ์ถ”๊ฐ€ํ•  ํ•จ์ˆ˜ ์ด๋ฆ„(๋ฌธ์ž์—ด)
          - input List: ํ•จ์ˆ˜ ์ž…๋ ฅ ์ธ์ž ๋ฆฌ์ŠคํŠธ(Key-Value List)
          - output List: ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์ •๋ณด ๋ฆฌ์ŠคํŠธ(Key-Value List)
        
    • (2) AnyCall API
      • ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ (1)AnyCall MSG๋ฅผ Spider Server์— ์ „๋‹ฌ ๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๋ฒ”์šฉ REST API์ด๋ฉฐ,
      • REST API ์„ธ๋ถ€ ๊ทœ๊ฒฉ์€ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
    • (3) AnyCall Handler
      • AnyCall Handler๋Š” API ํ™•์žฅ ๋Œ€์ƒ Cloud Driver๋ณ„๋กœ ์กด์žฌํ•˜๋ฉฐ,
      • (2)AnyCall API๋ฅผ ํ†ตํ•ด์„œ ์ „๋‹ฌ๋˜๋Š” ์‹คํ–‰ ์š”์ฒญ(AnyCall Input MSG) ์ •๋ณด๋ฅผ ํ™œ์šฉํ•˜์—ฌ
      • ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•œ ๋Œ€์ƒ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฐ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜์„ ๊ด€์žฅํ•œ๋‹ค.
    • (4) Ext-Functions
      • ์‚ฌ์šฉ์ž๊ฐ€ ์ถ”๊ฐ€ํ•˜๊ณ ์ž ํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•œ ํ•จ์ˆ˜๋กœ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ• ๋“ฑ ์„ธ๋ถ€ ๋‚ด์šฉ์€ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

[AnyCall API Extension Example]

  • ๋ณธ ์˜ˆ์‹œ๋Š” Mock Driver๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์ด๋“œ ํ•œ๋‹ค.

  • ์ •๊ทœ Mock Driver๋Š” VPC ๋ฐ Security Group(SG) ๋“ฑ์˜ ์ž์› ๊ฐœ์ˆ˜ ๋งŒ์„ ์ œ๊ณตํ•˜๋Š” API๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ณธ ์˜ˆ์‹œ์—์„œ๋Š” AnyCall ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ VPC, SG์— ๋Œ€ํ•œ ๊ฐœ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” API ํ™•์žฅ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ธฐ์ˆ ํ•œ๋‹ค.

  • (1) AnyCall MSG ์ •์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • To. Cloud(Connection Name): mock-config01(์ƒํ™ฉ์— ๋งž๊ฒŒ ๊ฐ€๋ณ€)
    • Funcion ID: countAll
    • Input List: { "Key" : "rsType", "Value" : "vpc" } // Value= vpc or sg
    • Output List: { "Key" : "Count", "Value" : "10" } // Value= depend on resource number
  • (2) AnyCall REST API ํ˜ธ์ถœ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    curl -sX POST http://localhost:1024/spider/anycall -H 'Content-Type: application/json' -d \
    '{
          "ConnectionName" : "mock-config01",
          "ReqInfo" : {
                  "FID" : "countAll",
                  "IKeyValueList" : [{"Key":"rsType", "Value":"vpc"}]
          }
    }' | json_pp
    
    • ์‹คํ–‰ ๊ฒฐ๊ณผ์ธ AnyCall Output MSG ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    {
       "FID" : "countAll",
       "IKeyValueList" : [
        {
           "Key" : "rsType",
           "Value" : "vpc"
        }
       ],
       "OKeyValueList" : [
        {
           "Key" : "Count",
           "Value" : "10"
        }
       ]
    }
    
  • (3) AnyCallHandler ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    • 44-45 Line ์ฐธ๊ณ 
      39 func (anyCallHandler *MockAnyCallHandler) AnyCall(callInfo irs.AnyCallInfo) (irs.AnyCallInfo, error) {
      40         cblogger := cblog.GetLogger("CB-SPIDER")
      41         cblogger.Info("Mock Driver: called AnyCall()!")
      42
      43         switch callInfo.FID {
      44         case "countAll" :
      45                 return countAll(anyCallHandler, callInfo)
      46
      47         // add more ...
      48
      49         default :
      50                 return irs.AnyCallInfo{}, errors.New("Mock Driver: " + callInfo.FID + " Function is not implemented!")
      51         }
      52 }
    
  • (4) Ext-Function countAll()์˜ ๊ตฌํ˜„ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

     55 ///////////////////////////////////////////////////////////////////
     56 // implemented by developer user, like 'countAll(rsType string) int'
     57 ///////////////////////////////////////////////////////////////////
     58 func countAll(anyCallHandler *MockAnyCallHandler, callInfo irs.AnyCallInfo) (irs.AnyCallInfo, error) {
     59         cblogger := cblog.GetLogger("CB-SPIDER")
     60         cblogger.Info("Mock Driver: called AnyCall()/countAll()!")
     61
     62         mockName := anyCallHandler.MockName
     63
     64         // Input Arg Validation
     65         if callInfo.IKeyValueList == nil {
     66                 return irs.AnyCallInfo{}, errors.New("Mock Driver: " + callInfo.FID + "'s Argument is empty!")
     67         }
     68         if callInfo.IKeyValueList[0].Key != "rsType" {
     69                 return irs.AnyCallInfo{}, errors.New("Mock Driver: " + callInfo.FID + "'s Argument is not 'rsType'!")
     70         }
     71
     72         // get info
     73         strCount := ""
     74         switch callInfo.IKeyValueList[0].Value {
     75         case "vpc":
     76                 infoList, ok := vpcInfoMap[mockName]
     77                 if !ok {
     78                         strCount = "0"
     79                 } else {
     80                         strCount = strconv.Itoa(len(infoList))
     81                 }
     82         case "sg":
     83                 infoList, ok := securityInfoMap[mockName]
     84                 if !ok {
     85                         strCount = "0"
     86                 } else {
     87                         strCount = strconv.Itoa(len(infoList))
     88                 }
     89         }
     90
     91         // make results
     92         if callInfo.OKeyValueList == nil {
     93                 callInfo.OKeyValueList = []irs.KeyValue{}
     94         }
     95         callInfo.OKeyValueList = append(callInfo.OKeyValueList, irs.KeyValue{"Count", strCount} )
     96
     97         return callInfo, nil
     98 }
    

[AnyCall API Extension AWS Driver ์ ์šฉ ์‚ฌ๋ก€]

[AnyCall API Extension GCP Driver ์ ์šฉ ์‚ฌ๋ก€]

  • GCP Driver์— TPU ์ ์šฉ ์‚ฌ๋ก€
    • GCP/TPU ์ œ๊ณต์„ ์œ„ํ•œ ํ™•์žฅ API
    • CB-Spider๋ฅผ ํ™œ์šฉํ•œ TPU ๊ธฐ๋ฐ˜ AI ์ธํ”„๋ผ ํ™œ์šฉ ํ๋ฆ„
    • ์ฝ”๋“œ ์ฐธ๊ณ :   2c74d37

  • ๋งŒ์ผ, ๋Œ€์ƒ Driver์— AnyCallHandler๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ์‹ ๊ทœ AnyCallHandler ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • (1) ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ {driver}/connect/* ์œ„์น˜์— CreateAnyCallHandler() ํ•จ์ˆ˜ ์ถ”๊ฐ€
    • (2) ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ {driver}/resources/AnyCallHandler.go๋ฅผ ์ถ”๊ฐ€