Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CallLog: Need to check the elapsed time of the CSP Call #359

Closed
powerkimhub opened this issue May 10, 2021 · 18 comments
Closed

CallLog: Need to check the elapsed time of the CSP Call #359

powerkimhub opened this issue May 10, 2021 · 18 comments
Assignees
Labels
bug Something isn't working HisCall

Comments

@powerkimhub
Copy link
Member

What happened

  • CSP 자원 제어 API 호출에 소요되는 시간 측정 구간이 CSP 마다 상이함.(특히 VM)

What you expected to happen

  • CSP 자원 제어에 소요되는 시간 측정 구간이 의미상 동일해야 함.

Proposed solution

  • 측정 대상 자원:
    • 공통자원: VPC/Subnet, Security Group, VM KeyPair, VM, VM Image, VM Spec
    • 추가자원: StartVM()시에 필요한 다른 자원 제어 시에 추가로 호출하는 자원 호출 정보 추가 가능
  • 측정 방법
    • 단일 자원에 대한 단일 API 호출 시간
    • VM의 경우 이슈가 존재할 수 있음.
@powerkimhub
Copy link
Member Author

powerkimhub commented May 10, 2021

[현황 분석 및 이슈]

[드라이버별 확인 사항] @dev4unet @hyokyungk @innodreamer

  • StartVM() CallLog elapsed time 구간 확인

    • Azure VM의 경우 'WaitForCompletionRef' 호출을 포함하여 측정하고 있음.
      • 그외 CSP는 API 호출 시간만 측정하고 있음.
    • CSP별 제공하는 WaitFor() 종류 함수 동작 확인 필요:
      • VM의 상태가 'running'일때까지 기다리는 건지?
      • VM에 요청한 API 동작만 완료될때까지 기다리는 건지?
  • VM외에 다른 자원도 elapsed time도 드라이버별로 재점검 필요

AWS 참고

  • HisCall StartVM 측정 구간
        runResult, err := vmHandler.Client.RunInstances(input)
        callLogInfo.ElapsedTime = call.Elapsed(callLogStart)
        cblogger.Info(runResult)

        ...

        WaitForRun(vmHandler.Client, newVmId)
        ...

func WaitForRun(svc *ec2.EC2, instanceID string) {
        cblogger.Infof("EC2 ID : [%s]", instanceID)

        input := &ec2.DescribeInstancesInput{
                InstanceIds: []*string{
                        aws.String(instanceID),
                },
        }
        err := svc.WaitUntilInstanceRunning(input)
        if err != nil {
                cblogger.Errorf("failed to wait until instances exist: %v", err)
        }
        cblogger.Info("=========WaitForRun() 醫~E猷~L")
}

GCP 참고

  • HisCall StartVM 측정 구간
        callLogStart := call.Start()
        op, err1 := vmHandler.Client.Instances.Insert(projectID, zone, instance).Do()
        callLogInfo.ElapsedTime = call.Elapsed(callLogStart)

        ...

        vmStatus, _ := vmHandler.WaitForRun(irs.IID{NameId: vmName, SystemId: vmName})  //  until "Running" status

  • 이슈: WaitForRun()를 통해서 'Running' status까지 기다려야 하는 이유 확인 필요
    • 과정에서 에러 핸들링이 어렵고, loss가 발생하고 있음.
    • 관련 이슈: GCP VM provisioning error #340
    • 아래 그림 GCP Starting 상태처럼, 'Provisioning staging' 등 현재 상태를 반환하면 문제가 있었는지 확인 필요

Azure 참고

  • HisCall StartVM 측정 구간
        start := call.Start()
        future, err := vmHandler.Client.CreateOrUpdate(vmHandler.Ctx, vmHandler.Region.ResourceGroup, vmReqInfo.IId.NameId, vmOpts)
        if err != nil {
                LoggingError(hiscallInfo, err)
                return irs.VMInfo{}, err
        }
        err = future.WaitForCompletionRef(vmHandler.Ctx, vmHandler.Client.Client)
        if err != nil {
                LoggingError(hiscallInfo, err)
                return irs.VMInfo{}, err
        }
        LoggingInfo(hiscallInfo, start)

Alibaba 참고

  • 이슈: HisCall VPCHandler만 처리하고 있음.
  • 이슈: EC2 문자열 제거 필요

OpenStack 참고

  • HisCall StartVM 측정 구간
        start := call.Start()
        server, err := servers.Create(vmHandler.Client, createOpts).Extract()
        if err != nil {
                LoggingError(hiscallInfo, err)
                return irs.VMInfo{}, err
        }
        LoggingInfo(hiscallInfo, start)

CloudIt 참고

  • HisCall StartVM 측정 구간
        start := call.Start()
        creatingVm, err := server.Start(vmHandler.Client, &requestOpts)
        if err != nil {
                LoggingError(hiscallInfo, err)
                return irs.VMInfo{}, err
        }
        LoggingInfo(hiscallInfo, start)

NCP 드라이버 단에서 자체 확인


---------------------- 참고

image

@powerkimhub
Copy link
Member Author

driver별 확인 결과 comment로 작성 부탁드립니다.

CSP별 제공하는 WaitFor() 종류 함수 동작 확인 필요:
VM의 상태가 'running'일때까지 기다리는 건지?
VM에 요청한 API 동작만 완료될때까지 기다리는 건지?

예시)

  • AWS
    • WaitForRun() 사용: API 동작 완료까지만 기다림(예시임, 확인 필요)

@dev4unet
Copy link
Member

dev4unet commented May 10, 2021

@powerkimhub
AWS / GCP / Alibaba의 경우 이전에 문의 했을 때 각 메소드별로 내부에서 처리하는 로직들이 상이하고 호출되는 API들이 많은데 모든 API마다 호출해야 할 지 함수 시작전과 종료에서 호출해야 할지 문의 했었습니다.
당시에 메인 함수의 용도에 맞는 API 하나에 대해서만 호출하는 것으로 하고 향후 개선하는 것으로 얘기가 되어서 해당 함수명 이름에 맞는 API하나의 호출만 체크하고 있습니다.
예를 들어, VM생성의 경우 VM생성 함수 호출전에 체크를 시작해서 API 호출이 끝나면 체크를 종료합니다.
그 뒤의 런닝 상태까지 대기 하거나 다른 API 호출 등은 체크하고 있지 않고 있습니다.

[런닝 상태를 체크하는 이유]
VM이 런닝되지 않으면 VM의 정보를 조회할 수 없기 때문에 그렇습니다.
현재 StartVM()은 VM 생성 후 VM의 id만 정보 리턴하는 것이 아닌 생성된 VM에 필요한 정보를 리턴하도록 되어 있는데
VM이 런닝되기전에 정보 조회 요청이 들어가면 에러가 발생합니다.
그리고 초반에는 PublicIp 할당도 있었는데 일부 정보는 VM 기동전에는 확인이 안되었던 정보들입니다.
또한, 리턴되는 정보는 GetVM()과 동일하기 때문에 값을 통일하기 위해 VM의 상태가 완전히 구동될 때까지 대기 후 GetVM으로 최신 정보를 조회해서 리턴 값을 처리하고 있습니다.
vmInfo, errVmInfo := vmHandler.GetVM(irs.IID{NameId: vmName, SystemId: vmName})

@dev4unet
Copy link
Member

@powerkimhub 음..추가로...
AWS의 경우 초반에 EIP(PublicIp)를 할당하는 부분이 있었는데 EIP는 Pending 상태에서는 VM에 할당할 수 없어서 대기 했지만 현재는 EIP 로직은 사라졌으며...
오래되어서 기억이 가물거려서 테스트는 해 봐야겠지만 리턴되는 일부 정보가 누락(?)되더라도 AWS는 아마도 VM이 런닝되기 전에 VM 조회는 가능하기 때문에 에러는 발생하지 않을거라 필요하다면 AWS의 경우에는 VM 생성 시 WaitForRun(vmHandler.Client, newVmId) 부분은 생략할 수 있으리라 봅니다.

AWS는 동기 방식이라 VM 생성까지 진행되지만 GCP의 경우에는 비동기 방식이라서 Running 외의 다른 상태에서 조회가 가능할지는 모르겠네요.

@powerkimhub
Copy link
Member Author

@dev4unet

  • 현황 공유 감사드립니다.

  • StartVM() Interface 반환 값을 아이디와 상태 정보만 반환했었어야 하는데... 라고 후회 중입니다.

    • 현재는 StartVM()이 복잡해질 수 밖에 없네요.
    • 사용자가 이런식으로 쓰면, 됐을 텐데요
      • result=StartVM() -> Loop: if(GetStatus(result.vmid)!='running') -> GetVM(result.vmid)
    • 현재는 TB에서 사용 중이어서 바꾸기가 부담스러운 상황이네요.
  • 일단, CSP별 현황 파악되시면 정보 공유 부탁드립니다.

  • 전체 현황 파악 후에 방안을 마련 해보도록하겠습니다.

@dev4unet
Copy link
Member

dev4unet commented May 11, 2021

@powerkimhub CSP에 따라서 다르다 보니 VM 생성 하자마자 조회하면 에러 나는 경우들이 있습니다.^^
AWS는 그럭저럭 예외 위주로 처리해서 상관 없는데 다른 CSP 들도 비슷하게 처리하다가 IP 정보를 리턴해야 해서 Running으로 바꾸면서 예외가 덜처리된 부분들도 있고 호출 시점에 따라서 차이가 조금 있을 것같네요.

GCP의 경우 비동기로 동작하는데 API 호출이 성공했어도 완전히 생성되기 전에 조회 API를 호출하면 에러가 발생합니다.
아마도, VM 생성 후 리턴되는 전체 항목을 전부 사용하지는 않을테니 GetVM을 호출하지 않고 리턴하더라도 에러가 발생할 수 있어서 테스트가 필요한 데 GCP의 경우 카드 변경에 따른 결제 카드 이슈가 발생해서 현재 계정이 중지된 상태라 관련 이슈 해결후 테스트 해보겠습니다만 현재로서 가장 이슈가 될 소지가 큰 CSP는 GCP일 것같네요^^

AWS의 경우 기존 답변처럼 VM 생성 요청이 성공한다면 조회도 문제가 없기 때문에 생성된 VM에 EIP같은 특정 추가 작업이 진행되지 않는다면 굳이 런닝 상태를 기다릴 필요는 없어서 조회되는 정보가 적을 뿐 큰 이슈는 없고 동기 방식이라 가장 문제가 적으리라 봅니다.

Alibaba Cloud의 경우 AWS하고 비슷하게 동작하기는 하지만 VM 생성 요청이 성공했어도 VM 정보 조회할 때 정보가 바로 나오지는 않고 일정 시간은 Not Found로 리턴됩니다.
Alibaba도 정보 조회할 때 예외는 어느 정도 처리했었는데 기존 소스에서는 Private Ip 정보를 조회하는 부분에서 에러가 있네요.
일단, Running 상태를 기다리지 않도록 하고 Private IP 조회 로직의 에러를 수정했으며 Alibaba도 리턴되는 정보만 적을 뿐 런닝 상태를 대기하지 않아도 되리라 봅니다.

[요약]

  • AWS / Alibaba의 경우 VM 생성시 WaitForRun 제거 가능
    다만, VM의 상태에 따라서 조회 가능한 정보들이 다르기 때문에 조회 시점에 따라 리턴 정보는 달라짐.
    (혹시라도, StartVM 호출 후 특정 값을 사용하는 부분이 있다면 리턴 정보 확인 필요)

  • Alibaba의 경우 VM 생성과 동시에 VM 조회가 호출될 경우 짧은 시간 동안은 Not Found로 조회됨.
    따라서, StartVM에서 VM 생성 후 리턴되는 정보는 VM iid 정보만 리턴하거나 특정 정보를 채워야 할 경우에는...
    1~3초 정도 Sleep후 GetVM정보를 리턴 Or Pending 상태를 조회할 수 있다면 Pending 상태가 될때까지 대기했다가 GetVM 정보를 리턴하면 될 것같음.

  • GCP의 경우 Alibaba 보다 좀 더 제약적이라 테스트가 필요하지만 현재 테스트 불가^^;;


AWS - VM생성 시 WaitForRun 제거시

(resources.VMInfo) {
IId: (resources.IID) {
NameId: (string) (len=26) "mcloud-barista-iid-vm-test",
SystemId: (string) (len=19) "i-09b82465c28d7bff0"
},
StartTime: (time.Time) 2021-05-11 00:18:41 +0000 UTC,
Region: (resources.RegionInfo) {
Region: (string) (len=14) "ap-northeast-1",
Zone: (string) (len=15) "ap-northeast-1a"
},
ImageIId: (resources.IID) {
NameId: (string) (len=21) "ami-059b6d3840b03d6dd",
SystemId: (string) (len=21) "ami-059b6d3840b03d6dd"
},
VMSpecName: (string) (len=8) "t2.micro",
VpcIID: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=21) "vpc-0c4d36a3ac3924419"
},
SubnetIID: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=24) "subnet-0a6ca346752be1ca4"
},
SecurityGroupIIds: ([]resources.IID) (len=1 cap=1) {
(resources.IID) {
NameId: (string) (len=9) "sgnewuser",
SystemId: (string) (len=20) "sg-0556ddbff4cab480e"
}
},
KeyPairIId: (resources.IID) {
NameId: (string) (len=20) "CB-KeyPairTest123123",
SystemId: (string) (len=20) "CB-KeyPairTest123123"
},
VMUserId: (string) "",
VMUserPasswd: (string) "",
NetworkInterface: (string) (len=28) "eni-attach-0d180d5abcef77c14",
PublicIP: (string) "",
PublicDNS: (string) "",
PrivateIP: (string) (len=10) "10.0.1.184",
PrivateDNS: (string) (len=45) "ip-10-0-1-184.ap-northeast-1.compute.internal",
VMBootDisk: (string) (len=9) "/dev/sda1",
VMBlockDisk: (string) "",
SSHAccessPoint: (string) "",
KeyValueList: ([]resources.KeyValue) (len=5 cap=8) {
(resources.KeyValue) {
Key: (string) (len=5) "State",
Value: (string) (len=7) "pending"
},
(resources.KeyValue) {
Key: (string) (len=12) "Architecture",
Value: (string) (len=6) "x86_64"
},
(resources.KeyValue) {
Key: (string) (len=5) "VpcId",
Value: (string) (len=21) "vpc-0c4d36a3ac3924419"
},
(resources.KeyValue) {
Key: (string) (len=8) "SubnetId",
Value: (string) (len=24) "subnet-0a6ca346752be1ca4"
},
(resources.KeyValue) {
Key: (string) (len=7) "KeyName",
Value: (string) (len=20) "CB-KeyPairTest123123"
}
}
}


GCP - VM생성 시 WaitForRun 제거 시

테스트 필요


AlibabaCloud - VM생성 시 WaitForRun 제거 시

리턴값
{"RequestId":"1AC9E2D8-BD28-4887-B910-7D48D6E89C93","InstanceIdSets":{"InstanceIdSet":["**i-6weipz7d6g3lt8l2u173**"]}} )

생성된 VM 정보 조회 - Not Found 발생
`
[CB-SPIDER].[INFO]: 2021-05-11 09:49:32 VMHandler.go:361, github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).GetVM() - vmID : [i-6weipz7d6g3lt8l2u173]
(*ecs.DescribeInstancesResponse)(0xc0004965a0)(HTTP/1.1 200 OK
Content-Type: application/json;charset=utf-8
Connection: keep-alive
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-Requested-With, X-Sequence, _aop_secret, _aop_signature
X-Acs-Request-Id: 15C16CCC-1D5F-4314-8428-81B4C2A6FB13
Date: Tue, 11 May 2021 00:49:31 GMT
Content-Length: 139
Access-Control-Allow-Origin: *
Access-Control-Max-Age: 172800

{"Instances":{"Instance":[]},"TotalCount":0,"RequestId":"15C16CCC-1D5F-4314-8428-81B4C2A6FB13","PageSize":10,"NextToken":"","PageNumber":1}
)
[CB-SPIDER].[ERROR]: 2021-05-11 09:49:32 VMHandler.go:201, github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).StartVM() - Notfound: 'i-6weipz7d6g3lt8l2u173' VM Not found
[CB-SPIDER].[ERROR]: 2021-05-11 09:49:32 Test_Resources.go:845, main.handleVM() - Notfound: 'i-6weipz7d6g3lt8l2u173' VM Not found
[CB-SPIDER].[INFO]: 2021-05-11 09:49:32 Test_Resources.go:853, main.handleVM() - Finish Create VM
`

[VM을 생성하자 마자 GetVM호출할 경우] - Private IP 정보 조회 시 Null 예외 처리 필요
다른 필드들은 Null 처리되어 있음
`
*** 곧바로 List나 GetVM호출할 경우 누락된 필드 값 처리에 따른 에러 발생 - GetVM 로직 수정 필요 ***
[CB-SPIDER].[INFO]: 2021-05-11 10:13:58 VMHandler.go:477, github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).ListVM() - [%s] ECS 정보 조회i-6weipz7d6g3ltkf9id1z
[CB-SPIDER].[INFO]: 2021-05-11 10:13:58 VMHandler.go:361, github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).GetVM() - vmID : [i-6weipz7d6g3ltkf9id1z]
(*ecs.DescribeInstancesResponse)(0xc00061a1e0)(HTTP/1.1 200 OK
Access-Control-Max-Age: 172800
Date: Tue, 11 May 2021 01:13:58 GMT
Content-Length: 2188
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
X-Acs-Request-Id: 07C9FDCA-D007-4312-96E9-15E11C5D4492
Content-Type: application/json;charset=utf-8
Connection: keep-alive
Vary: Accept-Encoding
Access-Control-Allow-Headers: X-Requested-With, X-Sequence, _aop_secret, _aop_signature

{"Instances":{"Instance":[{"ResourceGroupId":"","Memory":512,"InstanceChargeType":"PostPaid","Cpu":1,"OSName":"Ubuntu 18.04 64位","InstanceNetworkType":"vpc","InnerIpAddress":{"IpAddress":[]},"ExpiredTime":"2099-12-31T15:59Z","ImageId":"ubuntu_18_04_x64_20G_alibase_20210318.vhd","EipAddress":{"AllocationId":"","IpAddress":"","InternetChargeType":""},"HostName":"","VlanId":"","Status":"Pending","HibernationOptions":{"Configured":false},"MetadataOptions":{"HttpTokens":"","HttpEndpoint":""},"InstanceId":"i-6weipz7d6g3ltkf9id1z","StoppedMode":"KeepCharging","CpuOptions":{"ThreadsPerCore":1,"Numa":"","CoreCount":1},"StartTime":"2021-05-11T01:13Z","DeletionProtection":false,"SecurityGroupIds":{"SecurityGroupId":["sg-6we1jpq012lnye7i4np4"]},"VpcAttributes":{"PrivateIpAddress":{"IpAddress":[]},"VpcId":"vpc-6welivp7nl6yw5a2rxj2w","VSwitchId":"vsw-6wedntef8vkfzctdps7dl","NatIpAddress":""},"InternetChargeType":"PayByBandwidth","InstanceName":"mcloud-barista-vm-test","DeploymentSetId":"","InternetMaxBandwidthOut":5,"SerialNumber":"","OSType":"linux","CreationTime":"2021-05-11T01:13Z","AutoReleaseTime":"","Description":"","InstanceTypeFamily":"ecs.t5","DedicatedInstanceAttribute":{"Tenancy":"","Affinity":""},"PublicIpAddress":{"IpAddress":[]},"GPUSpec":"","NetworkInterfaces":{"NetworkInterface":[{"Type":"Primary","NetworkInterfaceId":"eni-6we8ra7f0f32lknh4bkz","PrivateIpSets":{"PrivateIpSet":[{"Primary":true}]}}]},"SpotPriceLimit":0.0,"DeviceAvailable":true,"SaleCycle":"","InstanceType":"ecs.t5-lc2m1.nano","OSNameEn":"Ubuntu 18.04 64 bit","SpotStrategy":"NoSpot","KeyPairName":"CB-KeyPairTest123123","IoOptimized":true,"ZoneId":"ap-northeast-1a","ClusterId":"","EcsCapacityReservationAttr":{"CapacityReservationPreference":"","CapacityReservationId":""},"DedicatedHostAttribute":{"DedicatedHostId":"","DedicatedHostName":"","DedicatedHostClusterId":""},"GPUAmount":0,"OperationLocks":{"LockReason":[]},"InternetMaxBandwidthIn":100,"Recyclable":false,"RegionId":"ap-northeast-1","CreditSpecification":"Standard"}]},"TotalCount":1,"RequestId":"07C9FDCA-D007-4312-96E9-15E11C5D4492","PageSize":10,"NextToken":"4f1d7cc9f51e189000ee3c8c84872b550f55a0c7c15e43d4","PageNumber":1}
)
[CB-SPIDER].[INFO]: 2021-05-11 10:13:58 VMHandler.go:387, github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).ExtractDescribeInstances() - &{ ubuntu_18_04_x64_20G_alibase_20210318.vhd ecs.t5-lc2m1.nano true vpc 0 false PostPaid mcloud-barista-vm-test 0 Standard 0 false 0 2021-05-11T01:13Z ap-northeast-1a PayByBandwidth 100 Pending 0 1 0 Ubuntu 18.04 64位 Ubuntu 18.04 64 bit ap-northeast-1 true 5 ecs.t5 i-6weipz7d6g3ltkf9id1z false 2099-12-31T15:59Z linux 512 2021-05-11T01:13Z CB-KeyPairTest123123 0 KeepCharging NoSpot 0 false {[sg-6we1jpq012lnye7i4np4]} {[]} {[]} {[]} { 0} { } { 0 false} {1 1 } { } { } {vsw-6wedntef8vkfzctdps7dl vpc-6welivp7nl6yw5a2rxj2w {[]}} {[]} {[]} {[{ eni-6we8ra7f0f32lknh4bkz Primary {[]} {[{ true { }}]} {[]}}]}}
panic: runtime error: index out of range [0] with length 0

goroutine 1 [running]:
github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).ExtractDescribeInstances(0xc00040e980, 0xc0000fd600, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/home/devunet/go/src/github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources/VMHandler.go:404 +0xa4e
github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).GetVM(0xc00040e980, 0x0, 0x0, 0xc0002d2260, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
/home/devunet/go/src/github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources/VMHandler.go:379 +0x2b4
github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources.(*AlibabaVMHandler).ListVM(0xc00040e980, 0xc000000004, 0xc0006cf550, 0x1, 0x1, 0x1)
/home/devunet/go/src/github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/resources/VMHandler.go:478 +0x326
main.handleVM()
/home/devunet/go/src/github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/main/Test_Resources.go:930 +0x18ae
main.main()
/home/devunet/go/src/github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/drivers/alibaba/main/Test_Resources.go:956 +0x76
exit status 2
** Private Ip Null 처리 후**
([]*resources.VMInfo) (len=1 cap=1) {
(*resources.VMInfo)(0xc0004be000)({
IId: (resources.IID) {
NameId: (string) (len=22) "mcloud-barista-vm-test",
SystemId: (string) (len=22) "i-6wec7yfvwo07sqe6kz0s"
},
StartTime: (time.Time) 2021-05-11 01:50:00 +0000 UTC,
Region: (resources.RegionInfo) {
Region: (string) (len=14) "ap-northeast-1",
Zone: (string) (len=15) "ap-northeast-1a"
},
ImageIId: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=41) "ubuntu_18_04_x64_20G_alibase_20210318.vhd"
},
VMSpecName: (string) (len=17) "ecs.t5-lc2m1.nano",
VpcIID: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=25) "vpc-6welivp7nl6yw5a2rxj2w"
},
SubnetIID: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=25) "vsw-6wedntef8vkfzctdps7dl"
},
SecurityGroupIIds: ([]resources.IID) (len=1 cap=1) {
(resources.IID) {
NameId: (string) "",
SystemId: (string) (len=23) "sg-6we1jpq012lnye7i4np4"
}
},
KeyPairIId: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=20) "CB-KeyPairTest123123"
},
VMUserId: (string) (len=7) "cb-user",
VMUserPasswd: (string) "",
NetworkInterface: (string) (len=24) "eni-6weai6i2c0ps7awqexwd",
PublicIP: (string) "",
PublicDNS: (string) "",
PrivateIP: (string) "",
PrivateDNS: (string) "",
VMBootDisk: (string) "",
VMBlockDisk: (string) "",
SSHAccessPoint: (string) "",
KeyValueList: ([]resources.KeyValue) (len=1 cap=1) {
(resources.KeyValue) {
Key: (string) "",
Value: (string) ""
}
}
})
}
`

@powerkimhub powerkimhub pinned this issue May 11, 2021
@dev4unet
Copy link
Member

@powerkimhub
Alibaba Cloud의 경우 StartVM에서 Running 상태체크를 삭제하는 대신 VM 생성 후 조회에 따른 에러를 최소화 하기 위해 VM 생성 직후 NotExist 상태가 아닐때 까지만 최소한으로 대기하도록 수정해 놨습니다.

이 경우 VM 생성 후 리턴되는 정보는 아래와 같습니다.
(resources.VMInfo) {
IId: (resources.IID) {
NameId: (string) (len=22) "mcloud-barista-vm-test",
SystemId: (string) (len=22) "i-6weiy1hggdfn8w8rlouj"
},
StartTime: (time.Time) 2021-05-11 05:23:00 +0000 UTC,
Region: (resources.RegionInfo) {
Region: (string) (len=14) "ap-northeast-1",
Zone: (string) (len=15) "ap-northeast-1a"
},
ImageIId: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=41) "ubuntu_18_04_x64_20G_alibase_20210318.vhd"
},
VMSpecName: (string) (len=17) "ecs.t5-lc2m1.nano",
VpcIID: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=25) "vpc-6welivp7nl6yw5a2rxj2w"
},
SubnetIID: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=25) "vsw-6wedntef8vkfzctdps7dl"
},
SecurityGroupIIds: ([]resources.IID) (len=1 cap=1) {
(resources.IID) {
NameId: (string) "",
SystemId: (string) (len=23) "sg-6we1jpq012lnye7i4np4"
}
},
KeyPairIId: (resources.IID) {
NameId: (string) "",
SystemId: (string) (len=20) "CB-KeyPairTest123123"
},
VMUserId: (string) (len=7) "cb-user",
VMUserPasswd: (string) "",
NetworkInterface: (string) (len=24) "eni-6weipz7d6g3lwqv53ffi",
PublicIP: (string) "",
PublicDNS: (string) "",
PrivateIP: (string) "",
PrivateDNS: (string) "",
VMBootDisk: (string) "",
VMBlockDisk: (string) "",
SSHAccessPoint: (string) "",
KeyValueList: ([]resources.KeyValue) (len=1 cap=1) {
(resources.KeyValue) {
Key: (string) "",
Value: (string) ""
}
}
}

@powerkimhub
Copy link
Member Author

@dev4unet

  • 상세 설명 및 테스트 캄사드립니다.
  • 아직 코드 반영은 기다려 주시기 바랍니다.
  • 다른 CSP 및 Tumblebug 활용 현황 파악/협의 등 후에 방안을 마련토록하겠습니다.

@dev4unet
Copy link
Member

@powerkimhub
GCP의 경우 지금 GCP 서버가 느린지 API 실행 후 약간의 지연은 있는 것 같기도 하지만...
GCP의 경우에도 VM 생성 후 추가 작업을 하지는 않아서 그런지 몇 번 테스트했을 때 에러까지는 발생하지 않네요.
1~2초 정도로 약간 반응이 빨리 온다 싶을 때에도 에러는 없었지만 AWS처럼 API 호출과 동시에 빠르게 반응이 오지는 않고 있어서 향후에 추가 테스트는 필요할 수 있을 것같지만 에러 리포팅을 받으면 대응하면 될 듯싶으니 참고만 하시기 바랍니다.

소스 반영은 WaitForRun 반영 상태로 돌려 놓고 WaitForRun 없이 호출하게될 경우 에러 나서 수정된 부분은 예외 처리가 추가된 부분이라 어차피 반영되어야 하는 부분이니 해당 부분만 반영된 상태로 나중에 Commit 할 때 모아서 반영하겠습니다.
향후 모든 CSP들의 정보가 취합된 후 WaitForRun 수정 방향이 잡히면 그때 정책에 따라서 소스에 반영하겠습니다.
현재는 VM생성 후 VM에 추가로 진행되는 작없이 없어서 AWS / GCP / Alibaba의 경우 문제는 없어 보입니다.

GCP의 StartVM에서 VM 생성 API 호출후 WaitForRun 없이 곧바로 GetVM이 호출되었을 때의 리턴 정보입니다.
(resources.VMInfo) {
IId: (resources.IID) {
NameId: (string) (len=22) "mcloud-barista-vm-test",
SystemId: (string) (len=22) "mcloud-barista-vm-test"
},
StartTime: (time.Time) 2021-05-11 00:20:51.689 -0700 -0700,
Region: (resources.RegionInfo) {
Region: (string) (len=15) "asia-northeast3",
Zone: (string) (len=17) "asia-northeast3-a"
},
ImageIId: (resources.IID) {
NameId: (string) (len=4) "Test",
SystemId: (string) (len=105) "https://www.googleapis.com/compute/v1/projects/ubuntu-os-cloud/global/images/ubuntu-1804-bionic-v20200521"
},
VMSpecName: (string) (len=8) "f1-micro",
VpcIID: (resources.IID) {
NameId: (string) (len=16) "cb-vpc-load-test",
SystemId: (string) (len=16) "cb-vpc-load-test"
},
SubnetIID: (resources.IID) {
NameId: (string) (len=17) "vpc-loadtest-sub1",
SystemId: (string) (len=17) "vpc-loadtest-sub1"
},
SecurityGroupIIds: ([]resources.IID) (len=1 cap=1) {
(resources.IID) {
NameId: (string) (len=16) "cb-securitytest1",
SystemId: (string) (len=16) "cb-securitytest1"
}
},
KeyPairIId: (resources.IID) {
NameId: (string) (len=20) "cb-keypairtest123123",
SystemId: (string) (len=20) "cb-keypairtest123123"
},
VMUserId: (string) (len=7) "cb-user",
VMUserPasswd: (string) "",
NetworkInterface: (string) (len=4) "nic0",
PublicIP: (string) "",
PublicDNS: (string) "",
PrivateIP: (string) "",
PrivateDNS: (string) "",
VMBootDisk: (string) "",
VMBlockDisk: (string) "",
SSHAccessPoint: (string) "",
KeyValueList: ([]resources.KeyValue) (len=5 cap=5) {
(resources.KeyValue) {
Key: (string) (len=10) "SubNetwork",
Value: (string) (len=119) "https://www.googleapis.com/compute/v1/projects/mcloud-barista2020/regions/asia-northeast3/subnetworks/vpc-loadtest-sub1"
},
(resources.KeyValue) {
Key: (string) (len=16) "AccessConfigName",
Value: (string) (len=12) "External NAT"
},
(resources.KeyValue) {
Key: (string) (len=11) "NetworkTier",
Value: (string) (len=7) "PREMIUM"
},
(resources.KeyValue) {
Key: (string) (len=14) "DiskDeviceName",
Value: (string) (len=17) "persistent-disk-0"
},
(resources.KeyValue) {
Key: (string) (len=8) "DiskName",
Value: (string) (len=136) "https://www.googleapis.com/compute/v1/projects/mcloud-barista2020/zones/asia-northeast3-a/disks/mcloud-barista-vm-test-asia-northeast3-a"
}
}
}

@powerkimhub
Copy link
Member Author

@dev4unet

  • 넵, 감사합니다.

@inno-cloudbarista
Copy link
Contributor

@powerkimhub

Azure, OpenStack, Cloudit 드라이버의 StartVM() elapsed time 관련 내부 로직을 전리해 공유드립니다.
간단하게 요약하자면 OpenStack, Cloudit 모두 VM 생성 요청을 기준으로만 elapsed time 측정하며,
VM 프로비저닝 후 후처리 작업 (Public IP 연동, ssh user 생성 등)을 위해서 VM이 active 상태가 될 때까지 별도의 대기 로직이 주가되어 있는 상태입니다.

[Azure]

  • elapsed time에 API 호출 응답 시간 및 VM 프로비저닝 시간까지 대기
  • WaitForCompletionRef 함수를 통해 VM 생성이 완료되기까지 대기
  • elapsed time에 API 호출 시간을 포함해 VM 생성 완료 시간까지 포함

[OpenStack]

  • elapsed time에 API 호출 응답 시간만 포함
  • OpenStack의 경우 servers.Create() 함수는 API 동작만 완료될 때 까지 대기
  • OpenStack에서 Public IP 할당을 위해서 VM이 Active 상태(Running 상태와 동일)가 될 때까지 대기
  • VM 생성 후 Public IP 할당
  • VM 프로비저닝 관련 후처리 작업(Public IP 할당) 후 VM 정보를 조회해서 리턴

[Cloudit]

  • elapsed time에 API 호출 응답 시간만 포함
  • Cloudit의 경우 server.Start() 함수는 API 동작만 완료될 때 까지 대기
  • VM 생성 후 상세 VM 정보 조회를 하기 위해서는 VM 프로비저닝이 완료될 떄까지 대기 필요
  • VM 생성 API 후 Private IP가 할당될 때까지 for 루프를 통해 체크
  • VM 프로비저닝 완료 시 VM 정보를 조회해서 리턴

@powerkimhub
Copy link
Member Author

@inno-cloudbarista

  • 확인 후 방안 마련하도록 하겠습니다.
  • 감사합니다.

@powerkimhub
Copy link
Member Author

powerkimhub commented May 13, 2021

@dev4unet @hyokyungk @inno-cloudbarista @innodreamer

다음과 같이 2가지로 분리하여 마무리 하도록 하겠습니다.
(PR도 분리해서 추진해주시기 바랍니다. )
(대상 및 반영 시기 확인 해주시기 바랍니다.)

1. CallLog 처리

2. Waiting Loop 유무 및 개선

  • 현재처럼 유지: 반환 되는 VM 정보를 TB에서 잘 활용중이라고 합니다.
  • 에러 처리 개선, 에러 메시지 제공 개선 등은 필요
  • 향후, Waiting Loop 파트 제거 필요시 비동기 API 추가 예정입니다.
    • 예시) CreateVM(vmReqInfo VMReqInfo) (VMStatusInfo, error)
    • 반영시기: 행사 이후 미정(못할수도...)

@innodreamer
Copy link
Member

innodreamer commented May 13, 2021

@powerkimhub NCP driver의 경우, StartVM() 실행시, 구동되는 과정에서 WaitToGetInfo() 라는 function을 이용해서 VM status가 "Creating" / "Booting" 일때는 계속 기다리다 "Running" 상태일때 GetVM()으로 VM info를 가져옵니다.
Public IP는 GetVM()시에 pubic IP 정보가 없으면 public IP를 생성해서 mapping해 줍니다.

참고로, VM termination 시에는 TerminateVM()이 실행된 후 "Suspended" / "Terminating" 상태가 완전히 끝날때까지 기다렸다가 (termination이 완료되면) VM에 mapping 되어 있던 public IP를 반납합니다. Waiting이 없이 반납하면 때때로 error가 발생되어서요.

@inno-cloudbarista
Copy link
Contributor

@powerkimhub

Azure 드라이버 수정사항을 적용해 PR 요청을 올렸으니, 확인 부탁드리겠습니다.
#366

@powerkimhub
Copy link
Member Author

@inno-cloudbarista

  • 수고많으셨습니다.

@powerkimhub
Copy link
Member Author

@dev4unet @hyokyungk @inno-cloudbarista @innodreamer

1. CallLog 처리

과정에서, @powerkimhub이 다음 내용을 소스 반영하였습니다.
문제가 없는 지 검토부탁드립니다.

  • AWS: TerminateVM
    • SystemID를 얻기위한 GetVM() 삭제하고 입력 인자로 설정
  • Azure: TerminateVM
    • Calllog EndTime 위치 수정

2. Waiting Loop 유무 및 개선

@powerkimhub powerkimhub unpinned this issue May 17, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working HisCall
Projects
None yet
Development

No branches or pull requests

5 participants