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 180mgo test 명령어에 붙여 실행 한다.

   GO TEST 실행 시 권한 문제가 발생 할 경우

   $ gcloud auth application-default login 명령어를 통해 auth 로그인을 실행 하면 된다.


'기타' 카테고리의 다른 글

가상머신 ssh 접속 방법  (0) 2017.06.29

+ Recent posts