Tag and Cloud Driver API - cloud-barista/cb-spider GitHub Wiki

CB-Spider Multi-Cloud Tag and Cloud Driver API

- CB-Spider Tag Specification V0.5
- V0.5 : CSP Tag κΈ°λŠ₯의 좔상화 제곡(FindTag 보λ₯˜)

1. CB-Spider Tag 관리 κ°œμš”

  • SpiderλŠ” μ—°λ™λœ ν΄λΌμš°λ“œμ˜ 관리 μžμ›λ“€μ— Tag κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
  • μ‚¬μš©μžλŠ” Tagλ₯Ό μ‚¬μš©ν•˜μ—¬ μžμ›λ“€μ„ κ·Έλ£Ήν™”ν•˜κ³  식별할 수 있으며,
  • 이λ₯Ό 톡해 λŒ€κ·œλͺ¨ μžμ›μ˜ 관리 μžλ™ν™”, λΉ„μš© 관리 λ“± λ‹€μ–‘ν•œ λͺ©μ μ— 맞게 ν™œμš©ν•  수 μžˆλ‹€.
  • Spider Tag ꡬ성
    • ν•˜λ‚˜μ˜ TagλŠ” λ¬Έμžμ—΄ Key와 λ¬Έμžμ—΄ Value 쌍으둜 κ΅¬μ„±λ˜λ©°,
    • Key 값은 ν•„μˆ˜μ΄λ‚˜, ValueλŠ” μ˜΅μ…˜μœΌλ‘œ μƒλž΅ κ°€λŠ₯ν•˜λ‹€.
  • μ‚¬μš©μžλŠ” λ‹€μŒκ³Ό 같이 두 κ°€μ§€ λ°©λ²•μœΌλ‘œ μžμ›μ— Tagλ₯Ό μΆ”κ°€ ν•  수 μžˆλ‹€.
    • (1) μžμ› 생성 μš”μ²­ μ‹œ Tag 리슀트λ₯Ό μ„€μ •ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬ 개의 Tag μΆ”κ°€ κ°€λŠ₯
    • (2) κΈ°μ‘΄ μžμ›μ— Tag 관리 APIλ₯Ό μ‚¬μš©ν•œ Tag μΆ”κ°€ κ°€λŠ₯: Swagger UI: [Tag Management] μ°Έκ³ 

2. CB-Spider Tag 제곡 ν˜„ν™©

  • CSP별 μžμ›λ³„ Tag 제곡 ν˜„ν™©μ΄ λ‹€μŒκ³Ό κ°™λ‹€.

    Provider VPC Subnet SecurityGroup VM KeyPair VM Disk MyImage NLB Cluster
    AWS O O O O O O O O O
    Azure O - O O O O O O O
    GCP - - - - O O - - O
    Alibaba β–³ β–³ O O O O O O -
    Tencent O O O O O O O O O
    IBM VPC O O O O O O O O O
    OpenStack O O O - O - - O -
    NCP Classic - - - - O - - - -
    KT Classic - - - - O O O - -
    β€» β–³: μžμ› 생성 μ‹œμ—λ§Œ Tagging 제곡
    β€»  - : CSPκ°€ Tagging을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ” μžμ›
    β€» NHN, NCPVPC, KTVPC: Tagging을 μ œκ³΅ν•˜μ§€ μ•ŠμŒ
       - Tag API ν˜ΈμΆœμ‹œ λ‹€μŒ 였λ₯˜ λ©”μ‹œμ§€ λ°˜ν™˜: "nhn-config does not support TagHandler"
    
    β€» Tag 미지원 μžμ›μ— λŒ€ν•œ API ν˜ΈμΆœμ‹œ λŒ€μ‘
      (1) μžμ› 생성 μš”μ²­ μ‹œ Tag μ„€μ • μš”μ²­: μžμ›μ€ μƒμ„±λ˜κ³ , TagλŠ” μΆ”κ°€λ˜μ§€ μ•ŠμŒ(Log 좜λ ₯ μ—†μŒ)
      (2) κΈ°μ‘΄ μžμ›μ— Tag μΆ”κ°€ μš”μ²­: λ‹€μŒ 곡톡 ν˜•μ‹μ˜ μ—λŸ¬ λ©”μ‹œμ§€ λ°˜ν™˜(Error Log 좜λ ₯)
         β€’ format: "[TAG_NOT_SUPPORTED] Tagging is not supported for the resource: {CSP}-{RESOURCE}"
         β€’ example: "[TAG_NOT_SUPPORTED] Tagging is not supported for the resource: GCP-keypair"
    

3. CB-Spider Tag Driver 규격

  • [μžμ› νƒ€μž…]

    • μžμ› νƒ€μž…λ³„λ‘œ μžμ› 생성 μ‹œ μΆ”κ°€ λ˜λŠ” μƒμ„±ν•œ μžμ›μ— Tagλ₯Ό 관리할 수 있으며,
    • 지원 λŒ€μƒ μžμ› νƒ€μž…μ˜ μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.(latest)
      type RSType string
      
      const (
          ALL       RSType = "all"
          IMAGE     RSType = "image"        # Tagμ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
          VPC       RSType = "vpc"
          SUBNET    RSType = "subnet"
          SG        RSType = "sg"
          KEY       RSType = "keypair"
          VM        RSType = "vm"
          NLB       RSType = "nlb"
          DISK      RSType = "disk"
          MYIMAGE   RSType = "myimage"
          CLUSTER   RSType = "cluster"
          NODEGROUP RSType = "nodegroup"    # Tagμ—μ„œλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
      )
      
  • [Tag 정보]

    • ν•˜λ‚˜μ˜ Tag 정보λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•˜μ—¬ λ‹€μŒκ³Ό 같은 정보 ꡬ쑰λ₯Ό μ œκ³΅ν•œλ‹€.
        type TagInfo struct {
            ResType RSType // VPC, SUBNET, VM, etc.,.)
            ResIId  IID    // {NameId, SystemId}
      
            TagList      []KeyValue
            KeyValueList []KeyValue // reserved for optinal usage
        }
      
  • [Tag μΆ”κ°€]

    • API: AddTag(resType RSType, resIID IID, tag KeyValue) (KeyValue, error)
    • νŠΉμ • μžμ› νƒ€μž…μ˜ νŠΉμ • μžμ›μ„ λŒ€μƒμœΌλ‘œ Tag μΆ”κ°€ κ°€λŠ₯
      • ex) AddTag(VPC, vpc-01, {tag01, value01})
    • β€» 동일 μžμ›μ— 동일 μ΄λ¦„μ˜ KeyλŠ” 쀑볡 μΆ”κ°€ν•  수 μ—†μŒ
    • β€» AddTag()의 resType은 ALL νƒ€μž… μ‚¬μš© λΆˆκ°€
  • [Tag λͺ©λ‘]

    • API: ListTag(resType RSType, resIID IID) ([]KeyValue, error)
    • νŠΉμ • μžμ› νƒ€μž…μ˜ νŠΉμ • μžμ›μ— ν¬ν•¨λœ λͺ¨λ“  Tag λͺ©λ‘ 제곡
      • ex) ListTag(VPC, vpc-01)
    • β€» ListTag()의 resType은 ALL νƒ€μž… μ‚¬μš© λΆˆκ°€
  • [Tag 정보]

    • API: GetTag(resType RSType, resIID IID, key string) (KeyValue, error)
    • νŠΉμ • μžμ› νƒ€μž…μ˜ νŠΉμ • μžμ›μ— ν¬ν•¨λœ νŠΉμ • Tag 정보 제곡
      • ex) GetTag(VPC, vpc-01, tag01)
    • β€» GetTag()의 resType은 ALL νƒ€μž… μ‚¬μš© λΆˆκ°€
    • β€» GetTag()의 keyλŠ” strict match 지원
  • [Tag μ‚­μ œ]

    • API: RemoveTag(resType RSType, resIID IID, key string) (bool, error)
    • νŠΉμ • μžμ› νƒ€μž…μ˜ νŠΉμ • μžμ›μ— ν¬ν•¨λœ νŠΉμ • Tag μ‚­μ œ
      • ex) RemoveTag(VPC, vpc-01, tag01)
    • β€» RemoveTag()의 resType은 ALL νƒ€μž… μ‚¬μš© λΆˆκ°€
    • β€» RemoveTag()의 keyλŠ” strict match 지원
  • [Tag μ°ΎκΈ°] μΆ”ν›„ ν•„μš”μ‹œ 제곡

    • API: FindTag(resType RSType, keyword string) ([]*TagInfo, error)
    • λͺ¨λ“  μžμ› νƒ€μž…μ˜ λͺ¨λ“  μžμ›μ— ν¬ν•¨λœ Tag 정보 쀑 Keyλ‚˜ Value에 keywordλ₯Ό ν¬ν•¨ν•˜λŠ” Tag 정보 λͺ©λ‘ 제곡
      • ex) FindTag(ALL, tag0)
      • ex) FindTag(ALL, value0)
    • νŠΉμ • μžμ› νƒ€μž…μ˜ λͺ¨λ“  μžμ›μ— ν¬ν•¨λœ Tag 정보 쀑 Keyλ‚˜ Value에 keywordλ₯Ό ν¬ν•¨ν•˜λŠ” Tag 정보 λͺ©λ‘ 제곡
      • ex) FindTag(VPC, tag0)
      • ex) FindTag(VPC, value0)

3. Tag λ“œλΌμ΄λ²„ 개발 λ…ΈνŠΈ

  • CSP별 Tag κΈ°λŠ₯ 개발 λŒ€μƒ μžμ› μ°Έκ³ 

  • λ“œλΌμ΄λ²„λ³„ DriverCapabilityInfo μ„€μ •

  • μ§€μ›ν•˜λŠ” λͺ¨λ“  μžμ›λ³„λ‘œ μžμ› 생성 μž…λ ₯ 정보(XXXReqInfo or XXXInfo)에 TagList κ°’ μ‘΄μž¬μ‹œ Tag μΆ”κ°€ κΈ°λŠ₯ 개발

  • μžμ› μƒμ„±μ‹œ Tag μΆ”κ°€μ˜ 경우 Tag 생성 였λ₯˜ λ°œμƒμ‹œ 처리 κ°€μ΄λ“œ

    • λ‹€μŒμ²˜λŸΌ Info와 μ—λŸ¬ λ‘˜λ‹€ μ„€μ •/λ°˜ν™˜ 뢀탁 λ“œλ¦½λ‹ˆλ‹€.
      • (1) μƒμ„±λœ μžμ› μœ μ§€
      • (2) 생성 μ„±κ³΅ν•œ Tag듀은 λ°˜ν™˜ Info의 TagList 정보에 μ„€μ • ν›„ λ°˜ν™˜
      • (3) 생성 였λ₯˜ Tag듀은 λ‹€μŒ μ—λŸ¬ λ©”μ‹œμ§€ ν˜•μ‹μœΌλ‘œ error λ°˜ν™˜
        • "TaggingError: {Key01, Value01}, {Key05, Value05}: CSP μ—λŸ¬ λ©”μ‹œμ§€"
    • TaggingError ν™œμš©ν•˜μ—¬ μ„œλ²„μ—μ„œ λŒ€μ‘ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
  • TagHandler μΈν„°νŽ˜μ΄μŠ€ 개발

  • λ“œλΌμ΄λ²„ κ°œλ°œμ‹œ λΆ€μ‘±ν•œ λΆ€λΆ„μ΄λ‚˜ 이슈 μ‘΄μž¬μ‹œ 곡유 뢀탁 λ“œλ¦½λ‹ˆλ‹€.

4. Tag Driver Common API

  • Source Tree

    $tree cb-spider/cloud-control-manager/cloud-driver/interfaces/
    cb-spider/cloud-control-manager/cloud-driver/interfaces/
    |-- CloudDriver.go
    |-- README.md
    |-- connect
    |   `-- CloudConnect.go
    `-- resources
        |-- AnyCallHandler.go
        |-- ClusterHandler.go
        |-- DiskHandler.go
        |-- IId.go
        |-- ImageHandler.go
        |-- KeyPairHandler.go
        |-- KeyValue.go
        |-- MyImageHandler.go
        |-- NLBHandler.go
        |-- PriceInfoHandler.go
        |-- RegionZoneHandler.go
        |-- ResourceType.go
        |-- SecurityHandler.go
        |-- TagHandler.go              <================= Tag Driver API
        |-- VMHandler.go
        |-- VMSpecHandler.go
        `-- VPCHandler.go
    
  • Driver API Spec (latest)

          package resources
    
          // TagInfo represents the tagging information for a cloud resource.
          // @description Tag Information for a Cloud Resource.
          type TagInfo struct {
                  ResType RSType `json:"ResType" validate:"required" example:"VPC"`
                  ResIId  IID    `json:"ResIId" validate:"required"`
    
                  TagList      []KeyValue `json:"TagList,omitempty" validate:"omitempty"`
                  KeyValueList []KeyValue `json:"KeyValueList,omitempty" validate:"omitempty"`
          }
    
          type TagHandler interface {
                  AddTag(resType RSType, resIID IID, tag KeyValue) (KeyValue, error)
                  ListTag(resType RSType, resIID IID) ([]KeyValue, error)
                  GetTag(resType RSType, resIID IID, key string) (KeyValue, error)
                  RemoveTag(resType RSType, resIID IID, key string) (bool, error)
    
                  // Find tags by tag key or value
                  // resType: ALL | VPC, SUBNET, etc.,.
                  // keyword: The keyword to search for in the tag key or value.
                  // if you want to find all tags, set keyword to "" or "*".
                  FindTag(resType RSType, keyword string) ([]*TagInfo, error) -------- @ToDO
          }