Skip to content

Guidance for developers of support new CSP

Sooyoung Kim edited this page Dec 21, 2022 · 8 revisions

준비

  • CB-Tumblebug conf.env 에서 CSP별 Region 및 Spec 정보 확인 합니다.
  • CB-Spider Connection-config 스크립트를 활용하여 Driver, Credential, Region, Connection Config를 생성합니다.

개요

신규 CSP 지원 시 아래와 같이 소스 코드 및 테스트 스크립트를 수정합니다.

  • 소스 코드

    • src/core/app/const.go : CSP 상수를 추가합니다.
    • src/core/model/types.go : Node struct 에 csp 이름을 추가합니다.
    • src/core/service/csp.go : CSP의 Ubuntu 18.08 이미지 스펙 아이디를 정의하고 할당될 CIDR 대역을 정의 합니다.
    • src/core/service/mcir.go : CSP 파라메터 검증 로직을 수정합니다.
  • 테스트 스크립트

    • docs/test/conf.env : driver이름 환경변수를 추가합니다.
    • docs/test/batch-register-cloud-info.sh : credential 환경변수를 추가합니다.
    • docs/test/connectioninfo-create.sh : CSP 별 credential 정보를 등록하는 로직을 추가합니다.

소스 코드

src/core/app/const.go

  • 신규 CSP 상수를 추가합니다.
CSP_ACLOUD  CSP = "Acloud"

src/core/model/types.go

  • Node struct 의 enums 에 csp 명을 추가합니다.
type Node struct {
  Model
  ...
  //Csp   app.CSP  `json:"csp" enums:"aws,gcp,azure,alibaba,tencent,openstack,ibm,cloudit"`
  Csp  app.CSP  `json:"csp" enums:"aws,gcp,azure,alibaba,tencent,openstack,ibm,cloudit,acloud"`
  ...
}

src/core/service/csp.go

  • CSP의 Ubuntu18.04 이미지 아이디 상수를 정의합니다.
var acloudImageMap = map[string]string{
  "KR1": "5396655e-166a-4875-80d2-ed8613aa054f", //한국1
  "KR2": "71893505-923c-4982-b0eb-844eb520661c", //한국2
  "JP1": "ca69fad9-92f3-4c9b-a6e4-7e8b0e4d3a58", //일본
}
  • getCSPImageId() 함수에서 CSP의 이미지 아이디를 리턴하도록 수정합니다.
} else if csp == app.CSP_ACLOUD  {
 ....
}
  • getCSPCidrBlock() 함수에서 CSP별로 할당할 CIDR 대역을 중복되지 않도록 정의하고 리턴처리힙니다.
switch csp {
 ...
case app.CSP_ACLOUD:
  return fmt.Sprintf("192.168.%d.0/24", 200+rand.Intn(10))
}

src/core/service/mcir.go

  • CreateIfNotExist() 함수 CSP 파라메터 검증 로직 수정합니다.
//for _, c := range []string{string(app.CSP_AWS), string(app.CSP_GCP), string(app.CSP_AZURE), string(app.CSP_ALIBABA), string(app.CSP_TENCENT), string(app.CSP_OPENSTACK), string(app.CSP_IBM), string(app.CSP_CLOUDIT)}
for _, c := range []string{string(app.CSP_AWS), string(app.CSP_GCP), string(app.CSP_AZURE), string(app.CSP_ALIBABA), string(app.CSP_TENCENT), string(app.CSP_OPENSTACK), string(app.CSP_IBM), string(app.CSP_CLOUDIT), string(app.CSP_ACLOUD)}

테스트 스크립트

docs/test/conf.env

  • driver 환경변수를 정의합니다.
export c_ACLOUD_DRIVER="acloud-driver-v1.0"

docs/test/batch-register-cloud-info.sh

  • CSP credential 환경변수 추가합니다.
# A Cloud
export ACLOUD_IDENTITY_ENDPOINT="https://api-identity.acloud.com"
export ACLOUD_USERNAME="[email protected]"
export ACLOUD_PASSWORD="XXXXXX" 
export ACLOUD_TENANT_ID="xxxxxxxxxxxxxxxxxxxxxx"
export ACLOUD_DOMAINNAME="default"
export ACLOUD_REGION="KR1"
export ACLOUD_ZONE="kr-zone-a"
​
./connectioninfo-create.sh ACLOUD

docs/test/connectioninfo-create.sh

  • CSP 별 credential 정보 등록 로직을 추가합니다. (ACLOUD 예제 참조)
# ACLOUD
if [ "${v_CSP}" == "ACLOUD" ]; then
​
    if [ "${v_OPTION}" != "add" ]; then
​
        v_ACLOUD_ENDPOINT="${ACLOUD_IDENTITY_ENDPOINT}"
        if [ "${v_ACLOUD_ENDPOINT}" == "" ]; then
            read -e -p "Identity Endpoint ? [예:https://api-identity.acloud.com] : "  v_ACLOUD_ENDPOINT
            if [ "${v_ACLOUD_ENDPOINT}" == "" ]; then echo "[ERROR] missing <acloud identity endpoint>"; exit -1;fi
        fi
​
        v_ACLOUD_USERNAME="${ACLOUD_USERNAME}"
        if [ "${v_ACLOUD_USERNAME}" == "" ]; then
            read -e -p "Username ? [예:mcks] : "  v_ACLOUD_USERNAME
            if [ "${v_ACLOUD_USERNAME}" == "" ]; then echo "[ERROR] missing <acloud username>"; exit -1;fi
        fi
​
        v_ACLOUD_PASSWORD="${ACLOUD_PASSWORD}"
        if [ "${v_ACLOUD_PASSWORD}" == "" ]; then
            read -e -p "Password ? [예:asdfqwer12] : "  v_ACLOUD_PASSWORD
            if [ "${v_ACLOUD_PASSWORD}" == "" ]; then echo "[ERROR] missing <acloud password>"; exit -1;fi
        fi
​
        v_ACLOUD_TENANT_ID="${ACLOUD_TENANT_ID}"
        if [ "${v_ACLOUD_TENANT_ID}" == "" ]; then
            read -e -p "Tenant Id ? [예:edfasdfsasdff] : "  v_ACLOUD_TENANT_ID
            if [ "${v_ACLOUD_TENANT_ID}" == "" ]; then echo "[ERROR] missing <aloud tenant id>"; exit -1;fi
        fi
​
        v_ACLOUD_DOMAIN="${ACLOUD_DOMAINNAME}"
        if [ "${v_ACLOUD_DOMAIN}" == "" ]; then
            read -e -p "Domain Name ? [예:default] : "  v_ACLOUD_DOMAIN
            if [ "${v_ACLOUD_DOMAIN}" == "" ]; then echo "[ERROR] missing <acloud domainname>"; exit -1;fi
        fi
​
    fi
​
    # region
    v_REGION="${ACLOUD_REGION}"
    if [ "${v_REGION}" == "" ]; then
        read -e -p "region ? [예:KR1] : "  v_REGION
        if [ "${v_REGION}" == "" ]; then echo "[ERROR] missing region"; exit -1;fi
    fi
​
    # zone
    v_ZONE="${NHN_ZONE}"
    if [ "${v_ZONE}" == "" ]; then
        read -e -p "zone ? [예:kr-pub-a] : "  v_ZONE
        if [ "${v_ZONE}" == "" ]; then
            if [[ "${v_REGION}" =~ "1" ]]; then
                v_REGION_LOWER="$(echo ${v_REGION} | tr [:upper:] [:lower:] | tr -cd 'a-z')"
            else
                v_REGION_LOWER="$(echo ${v_REGION} | tr [:upper:] [:lower:])"
            fi
        v_ZONE="${v_REGION_LOWER}-pub-a";fi
    fi
fi
elif [ "${v_CSP}" == "ACLOUD" ]; then
echo "- Zone                        is '${v_ZONE}'"
echo "- acloud_identity_endpoint 	is '${v_ACLOUD_ENDPOINT}'"
echo "- acloud_username  		is '${v_ACLOUD_USERNAME}'"
echo "- acloud_password  		is '${v_ACLOUD_PASSWORD}'"
echo "- acloud_domainname		is '${v_ACLOUD_DOMAIN}'"
echo "- acloud_tenantid		 	is '${v_ACLOUD_TENANT_ID}'"
  fi
elif [ "${v_CSP}" == "ACLOUD" ]; then
  curl -sX DELETE ${c_URL_SPIDER}/credential/${NM_CREDENTIAL} -H "${c_CT}" -o /dev/null -w "CREDENTIAL.delete():%{http_code}\n"
  curl -sX POST   ${c_URL_SPIDER}/credential                  -H "${c_CT}" -o /dev/null -w "CREDENTIAL.regist():%{http_code}\n" -d @- <<EOF
  {
  "CredentialName":"${NM_CREDENTIAL}",
  "ProviderName":"${v_CSP}",
  "KeyValueInfoList": [
    {"Key":"IdentityEndpoint", "Value":"${v_ACLOUD_ENDPOINT}"},
    {"Key":"Username", "Value":"${v_ACLOUD_USERNAME}"},
    {"Key":"Password", "Value":"${v_ACLOUD_PASSWORD}"},
    {"Key":"DomainName", "Value":"${v_ACLOUD_DOMAIN}"},
    {"Key":"TenantId", "Value":"${v_ACLOUD_TENANT_ID}"}
  ]
  }
EOF