1. GO 환경 변수 설정
GOPATH 환경 변수는 workspace 의 위치를 지정
GOROOT 환경 변수는는 현재 만들고있는 GO 프로그램의 위치다. go get으로 패키지를 설치하고, go build로 빌드를 할때 GOROOT와 더불어 패키지와 명령들을 찾을 위치를 지정
ex)
$ export GOPATH=$HOME/cpi/bosh-google-cpi-release
$ export GOROOT=/usr/local/go
$ export PATH=$PATH:GOPATH/bin
1. 패키지 단위 테스트 방법
$ go test -v bosh-google-cpi/action/
2. 패키지 단위 테스트 HTML 변환 방법
$ go test bosh-google-cpi/action/ -coverprofile=c.out -covermode=count -v
$ go tool cover -html=c.out
$ sudo 권한의 tmp 파일 위치에 html 파일이 생성 된다.
3. 통합 테스트 방법_GCP 환경 설정
전제 조건 – GCP 콘솔 화면에서 환경 설정이 되어 있어야 한다.
전제 조건 – GCP SDK CLI가 설치가 되어 있어야 한다.
l 실제 환경 설정이 존재 하지 않으면 에러가 발생 하지만, 이 정보들을 사용 하진 않는 것 같다.
#!/usr/bin/env bash set -e
source utils.sh #source /etc/profile.d/chruby-with-ruby-2.1.2.sh
echo "Creating google json key..." mkdir -p $HOME/.config/gcloud/ echo "Configuring google account..." gcloud auth activate-service-account --key-file $HOME/Downloads/dasdas-asdasd-c01849ff4681.json << replace Service Accont Json Key
google_project=asdas<< replace Project Id google_region=asia-northeast1 << replace Resion google_zone=asia-northeast1-a << replace Zone google_service_account=cpitest << replace service account ID google_address_director_ubuntu=director << replace external IP 1 Name google_address_bats_ubuntu=bat << replace external IP 2 Name google_address_int_ubuntu=int << replace external IP 2 Name google_auto_network=autonetwork << replace network Name google_network=network << replace network Name google_subnetwork=network-sub << replace subnet Name google_subnetwork_range=192.168.10.0/24 << replace subnet Range google_firewall_internal=internal << replace firewall google_firewall_external=external << replace firewall google_target_pool=target << replace network service Name google_backend_service=instance << replace back network Service Name google_region_backend_service=backend << replace back network Service region Name
gcloud config set project ${google_project} gcloud config set compute/region ${google_region} gcloud config set compute/zone ${google_zone}
echo "Setting up google infrastructure..." gcloud -q iam service-accounts create ${google_service_account} gcloud -q compute addresses create ${google_address_director_ubuntu} --region ${google_region} gcloud -q compute addresses create ${google_address_bats_ubuntu} --region ${google_region} gcloud -q compute addresses create ${google_address_int_ubuntu} --region ${google_region} gcloud -q compute networks create ${google_auto_network} gcloud -q compute networks create ${google_network} --mode custom gcloud -q compute networks subnets create ${google_subnetwork} --network=${google_network} --range=${google_subnetwork_range} gcloud -q compute firewall-rules create ${google_firewall_internal} --description "BOSH CI Internal traffic" --network ${google_network} --source-tags ${google_firewall_internal} --target-tags ${google_firewall_internal} --allow tcp,udp,icmp gcloud -q compute firewall-rules create ${google_firewall_external} --description "BOSH CI External traffic" --network ${google_network} --target-tags ${google_firewall_external} --allow tcp:22,tcp:443,tcp:4222,tcp:6868,tcp:25250,tcp:25555,tcp:25777,udp:53
# Target pool gcloud -q compute target-pools create ${google_target_pool} --region=${google_region}
# Backend service gcloud -q compute instance-groups unmanaged create ${google_backend_service} --zone ${google_zone} gcloud -q compute http-health-checks create ${google_backend_service} gcloud -q compute backend-services create ${google_backend_service} --http-health-checks ${google_backend_service} --port-name "http" --timeout "30" gcloud -q compute backend-services add-backend ${google_backend_service} --instance-group ${google_backend_service} --zone ${google_zone} --balancing-mode "UTILIZATION" --capacity-scaler "1" --max-utilization "0.8"
# Region Backend service gcloud -q compute instance-groups unmanaged create ${google_region_backend_service} --zone ${google_zone} gcloud -q compute health-checks create tcp ${google_region_backend_service}
# This is a hack required to give the instance group a network association gcloud -q compute instances create ${google_region_backend_service} --zone ${google_zone} --network ${google_network} --subnet ${google_subnetwork} --machine-type f1-micro
gcloud -q compute instance-groups unmanaged add-instances ${google_region_backend_service} --instances ${google_region_backend_service} --zone ${google_zone} gcloud -q compute backend-services create ${google_region_backend_service} --region ${google_region} --health-checks ${google_region_backend_service} --protocol "TCP" --load-balancing-scheme "INTERNAL" --timeout "30" gcloud -q compute backend-services add-backend ${google_region_backend_service} --instance-group ${google_region_backend_service} --zone ${google_zone} --region ${google_region} gcloud -q compute instances delete ${google_region_backend_service} --zone ${google_zone} |
1. 통합 테스트 방법_실제 실행 되는 데이터들이 존재 하는 소스 파일
bosh-google-cpi-release/src/bosh-google-cpi/integration/config.go에 위치 한다.
변수 값 설정
envRequired -> 반드시 필요한 값 설정 하지 않으면 에러 발생.
envOrDefault -> 환경 변수가 존재 하지 않으면 Default 값으로 설정 된다.
package integration
import ( "bytes" "encoding/json" "fmt" "io" "io/ioutil" "os" "strings"
"bosh-google-cpi/action" boshapi "bosh-google-cpi/api" boshdisp "bosh-google-cpi/api/dispatcher" "bosh-google-cpi/api/transport" boshcfg "bosh-google-cpi/config" "bosh-google-cpi/google/client"
boshlogger "github.com/cloudfoundry/bosh-utils/logger" "github.com/cloudfoundry/bosh-utils/uuid" )
var ( // A stemcell that will be created in integration_suite_test.go existingStemcell string
// Provided by user googleProject = envRequired("GOOGLE_PROJECT") externalStaticIP = envRequired("EXTERNAL_STATIC_IP") stemcellURL = envRequired("STEMCELL_URL") serviceAccount = envRequired("SERVICE_ACCOUNT")
// Configurable defaults stemcellFile = envOrDefault("STEMCELL_FILE", "") stemcellSHA1 = envOrDefault("STEMCELL_SHA1", "") networkName = envOrDefault("NETWORK_NAME", "bosh") customNetworkName = envOrDefault("CUSTOM_NETWORK_NAME", "bosh") customSubnetworkName = envOrDefault("CUSTOM_SUBNETWORK_NAME", "cf-net") ipAddrs = strings.Split("10.146.0.102,10.146.0.103,10.146.0.104", ",") targetPool = envOrDefault("TARGET_POOL", "cfintegration") backendService = envOrDefault("BACKEND_SERVICE", "cfintegration") regionBackendService = envOrDefault("REGION_BACKEND_SERVICE", "region-cfintegration") instanceGroup = envOrDefault("BACKEND_SERVICE", "cfintegration") ilbInstanceGroup = envOrDefault("ILB_INSTANCE_GROUP", "cfintegration-ilb") zone = envOrDefault("ZONE", "us-central1-a") region = envOrDefault("REGION", "us-central1") imageURL = envOrDefault("IMAGE_URL", "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1404-trusty-v20161213")
// Channel that will be used to retrieve IPs to use ips chan string
// If true, CPI will not wait for delete to complete. Speeds up tests significantly. asyncDelete = envOrDefault("CPI_ASYNC_DELETE", "true")
cfgContent = fmt.Sprintf(`{ "cloud": { "plugin": "google", "properties": { "google": { "project": "%v" }, "agent": { "mbus": "http://127.0.0.1", "blobstore": { "provider": "local" } }, "registry": { "use_gce_metadata": true } } } }`, googleProject) )
func toggleAsyncDelete() { key := "CPI_ASYNC_DELETE" current := os.Getenv(key) if current == "" { os.Setenv(key, "true") } else { os.Setenv(key, "") } }
func execCPI(request string) (boshdisp.Response, error) { var err error var cfg boshcfg.Config var in, out, errOut, errOutLog bytes.Buffer var boshResponse boshdisp.Response var googleClient client.GoogleClient
if cfg, err = boshcfg.NewConfigFromString(cfgContent); err != nil { return boshResponse, err }
multiWriter := io.MultiWriter(&errOut, &errOutLog) logger := boshlogger.NewWriterLogger(boshlogger.LevelDebug, multiWriter, multiWriter) multiLogger := boshapi.MultiLogger{Logger: logger, LogBuff: &errOutLog} uuidGen := uuid.NewGenerator() if googleClient, err = client.NewGoogleClient(cfg.Cloud.Properties.Google, multiLogger); err != nil { return boshResponse, err }
actionFactory := action.NewConcreteFactory( googleClient, uuidGen, cfg, multiLogger, )
caller := boshdisp.NewJSONCaller() dispatcher := boshdisp.NewJSON(actionFactory, caller, multiLogger)
in.WriteString(request) cli := transport.NewCLI(&in, &out, dispatcher, multiLogger)
var response []byte
if err = cli.ServeOnce(); err != nil { return boshResponse, err }
if response, err = ioutil.ReadAll(&out); err != nil { return boshResponse, err }
if err = json.Unmarshal(response, &boshResponse); err != nil { return boshResponse, err } return boshResponse, nil }
func envRequired(key string) (val string) { if val = os.Getenv(key); val == "" { panic(fmt.Sprintf("Could not find required environment variable '%s'", key)) } return }
func envOrDefault(key, defaultVal string) (val string) { if val = os.Getenv(key); val == "" { val = defaultVal } return } |
2. 통합 테스트 방법_환경 변수 설정
$ export GOOGLE_PROJECT=project
$ export EXTERNAL_STATIC_IP=35.194.127.6
$ export STEMCELL_URL=https://storage.googleapis.com/bosh-cpi-artifacts/bosh-stemcell-3262.12-google-kvm-ubuntu-trusty-go_agent-raw.tar.gz
$ export SERVICE_ACCOUNT=bosh-535@paas-ta.iam.gserviceaccount.com
$ export NETWORK_NAME=default
$ export CUSTOM_NETWORK_NAME=default
$ export CUSTOM_SUBNETWORK_NAME=default
$ export TARGET_POOL=target
$ export BACKEND_SERVICE=backendservice
$ export REGION_BACKEND_SERVICE=backendservice
$ export ILB_INSTANCE_GROUP=backendservice
$ export REGION=asia-northeast1
$ export ZONE=asia-northeast1-a
3. 통합 테스트 실행
$ cd bosh-google-cpi-release/src/bosh-google-cpi/integration
$ go test -x -v -timeout 180m
4. 통합 테스트 주의 사항
GO TEST 실행 시 Default time이 10분 -> 통합 테스트는 1시간이 넘게 걸리는데 10분이 지나면 Time out 실패 에러 메시지가 발생 한다.
l 해결 방법 -timeout 180m를 go test 명령어에 붙여 실행 한다.
GO TEST 실행 시 권한 문제가 발생 할 경우
$ gcloud auth application-default login 명령어를 통해 auth 로그인을 실행 하면 된다.
'기타' 카테고리의 다른 글
가상머신 ssh 접속 방법 (0) | 2017.06.29 |
---|