From 8a47f253dfe2d8115dac30388a2c7fa9d37a200b Mon Sep 17 00:00:00 2001 From: dogfootman Date: Fri, 15 Sep 2023 09:09:09 +0900 Subject: [PATCH 1/6] GCP RegionZoneHandler --- .../gcp/connect/GCP_CloudConnection.go | 7 + .../drivers/gcp/main/Test_Resources.go | 69 ++++- .../drivers/gcp/main/conf/Test_Config.go | 6 +- .../gcp/resources/RegionZoneHandler.go | 267 ++++++++++++++++++ .../interfaces/connect/CloudConnect.go | 1 + 5 files changed, 346 insertions(+), 4 deletions(-) create mode 100644 cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go b/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go index 403bc842b..31cddb8bb 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go @@ -43,6 +43,7 @@ type GCPCloudConnection struct { SubnetClient *compute.Service VMSpecHandler *compute.Service VPCHandler *compute.Service + RegionZoneHandler *compute.Service ContainerClient *container.Service } @@ -135,3 +136,9 @@ func (cloudConn *GCPCloudConnection) CreateClusterHandler() (irs.ClusterHandler, func (cloudConn *GCPCloudConnection) CreateAnyCallHandler() (irs.AnyCallHandler, error) { return nil, errors.New("GCP Driver: not implemented") } + +func (cloudConn *GCPCloudConnection) CreateRegionZoneHandler() (irs.RegionZoneHandler, error) { + cblogger.Info("GCP Cloud Driver: called CreateRegionZoneHandler()!") + regionZoneHandler := gcprs.GCPRegionZoneHandler{cloudConn.Region, cloudConn.Ctx, cloudConn.VMClient, cloudConn.Credential} + return ®ionZoneHandler, nil +} diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/main/Test_Resources.go b/cloud-control-manager/cloud-driver/drivers/gcp/main/Test_Resources.go index 68b60ca8e..1a284f1df 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/main/Test_Resources.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/main/Test_Resources.go @@ -1793,7 +1793,71 @@ func handleMyImage() { } } -//import "path/filepath" +func handleRegionZone() { + cblogger.Debug("Start RegionZoneHandler Resource Test") + + ResourceHandler, err := testconf.GetResourceHandler("RegionZone") + if err != nil { + panic(err) + } + handler := ResourceHandler.(irs.RegionZoneHandler) + + for { + fmt.Println("RegionZoneHandler Management") + fmt.Println("0. Quit") + fmt.Println("1. RegionZone List") + fmt.Println("2. OrgRegion List") + fmt.Println("3. OrgZone List") + + var commandNum int + inputCnt, err := fmt.Scan(&commandNum) + if err != nil { + panic(err) + } + + if inputCnt == 1 { + switch commandNum { + case 0: + return + + case 1: + result, err := handler.ListRegionZone() + if err != nil { + cblogger.Infof(" RegionZone 목록 조회 실패 : ", err) + } else { + cblogger.Info("RegionZone 목록 조회 결과") + cblogger.Info(result) + cblogger.Info("출력 결과 수 : ", len(result)) + spew.Dump(result) + //spew.Dump(result) + + //조회및 삭제 테스트를 위해 리스트의 첫번째 정보의 ID를 요청ID로 자동 갱신함. + // if result != nil { + // diskReqInfo.IId = result[0].IId // 조회 및 삭제를 위해 생성된 ID로 변경 + // } + } + + case 2: + result, err := handler.ListOrgRegion() + if err != nil { + cblogger.Infof("[%s] ListOrgZone 조회 실패 : ", err) + } else { + cblogger.Infof("[%s] ListOrgZone 조회 성공 : ", result) + spew.Dump(result) + } + + case 3: + result, err := handler.ListOrgZone() + if err != nil { + cblogger.Infof("[%s] ListOrgZone 조회 실패 : ", err) + } else { + cblogger.Infof("[%s] ListOrgZone 조회 성공 : ", result) + spew.Dump(result) + } + } + } + } +} func main() { cblogger.Info("GCP Resource Test") @@ -1802,10 +1866,11 @@ func main() { //handleImage() //AMI //handleKeyPair() //handleSecurity() - handleVM() + //handleVM() //handleLoadBalancer() //handleDisk() //handleMyImage() + handleRegionZone() //cblogger.Info(filepath.Join("a/b", "\\cloud-driver-libs\\.ssh-gcp\\")) //cblogger.Info(filepath.Join("\\cloud-driver-libs\\.ssh-gcp\\", "/b/c/d")) } diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/main/conf/Test_Config.go b/cloud-control-manager/cloud-driver/drivers/gcp/main/conf/Test_Config.go index 3fc35164a..8dce50180 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/main/conf/Test_Config.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/main/conf/Test_Config.go @@ -44,8 +44,8 @@ type Config struct { } // 환경변수 : GOOGLE_APPLICATION_CREDENTIALS - 인증용 .json 파일의 위치 -//handlerType : resources폴더의 xxxHandler.go에서 Handler이전까지의 문자열 -//(예) ImageHandler.go -> "Image" +// handlerType : resources폴더의 xxxHandler.go에서 Handler이전까지의 문자열 +// (예) ImageHandler.go -> "Image" func GetResourceHandler(handlerType string) (interface{}, error) { var cloudDriver idrv.CloudDriver cloudDriver = new(gcpdrv.GCPDriver) @@ -100,6 +100,8 @@ func GetResourceHandler(handlerType string) (interface{}, error) { resourceHandler, err = cloudConnection.CreateVMSpecHandler() case "VPCHandler": resourceHandler, err = cloudConnection.CreateVPCHandler() + case "RegionZone": + resourceHandler, err = cloudConnection.CreateRegionZoneHandler() } if err != nil { diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go new file mode 100644 index 000000000..0984cfe4e --- /dev/null +++ b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go @@ -0,0 +1,267 @@ +package resources + +import ( + "context" + "errors" + "fmt" + "reflect" + "strings" + + call "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/call-log" + idrv "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces" + irs "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces/resources" + compute "google.golang.org/api/compute/v1" +) + +type GCPRegionZoneHandler struct { + Region idrv.RegionInfo + Ctx context.Context + Client *compute.Service + Credential idrv.CredentialInfo +} + +// // -------- Const +// type ZoneStatus string + +// const ( +// ZoneAvailable ZoneStatus = "Available" +// ZoneUnavailable ZoneStatus = "Unavailable" +// ) + +// type RegionZoneInfo struct { +// Name string +// DisplayName string +// ZoneList []ZoneInfo + +// KeyValueList []KeyValue +// } + +// type ZoneInfo struct { +// Name string +// DisplayName string +// Status ZoneStatus // Available | Unavailable + +// KeyValueList []KeyValue +// } + +// required Compute Engine IAM ROLE : compute.regions.list +func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZoneInfo, error) { + var regionZoneInfoList []*irs.RegionZoneInfo + projectID := regionZoneHandler.Credential.ProjectID + //prefix := "https://www.googleapis.com/compute/v1/projects/" + projectID + //GET https://compute.googleapis.com/compute/v1/projects/{project}/regions + + // logger for HisCall + callogger := call.GetLogger("HISCALL") + callLogInfo := call.CLOUDLOGSCHEMA{ + CloudOS: call.GCP, + RegionZone: regionZoneHandler.Region.Zone, + ResourceType: call.REGIONZONE, + ResourceName: "", + CloudOSAPI: "List()", + ElapsedTime: "", + ErrorMSG: "", + } + + callLogStart := call.Start() + resp, err := regionZoneHandler.Client.Regions.List(projectID).Do() + callLogInfo.ElapsedTime = call.Elapsed(callLogStart) + callogger.Info(call.String(callLogInfo)) + if err != nil { + callLogInfo.ErrorMSG = err.Error() + cblogger.Error(err) + return regionZoneInfoList, err + } + if resp == nil { + return nil, errors.New("Not Found : Region Zone information not found") + } + + for _, item := range resp.Items { + // Name string + // DisplayName string + // ZoneList []ZoneInfo + // KeyValueList []KeyValue + info := irs.RegionZoneInfo{} + info.Name = item.Name + info.DisplayName = item.Name + + // ZoneList + var zoneInfoList []*irs.ZoneInfo + for _, zoneUrl := range item.Zones { + // "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/northamerica-northeast1-a" + startIndex := strings.Index(zoneUrl, "/zones/") + len("/zones/") + if startIndex < len("/zones/") { + //fmt.Println("Invalid URL:", zoneUrl) + cblogger.Error("Invalid URL:", zoneUrl) + continue + } + zone := zoneUrl[startIndex:] + + zoneInfo := irs.ZoneInfo{} + zoneInfo.Name = zone + zoneInfo.DisplayName = zone + + zoneInfoList = append(zoneInfoList, &zoneInfo) + } + + // KeyValueList + keyValueList := []irs.KeyValue{} + // + // keyValue := irs.KeyValue{} + // keyValue.Key = "Kind" + // keyValue.Value = item.Kind + // info.KeyValueList = keyValueList + + // t := reflect.TypeOf(item) + itemType := reflect.TypeOf(item) + if itemType.Kind() == reflect.Ptr { + itemType = itemType.Elem() + } + // v := reflect.ValueOf(item) + itemValue := reflect.ValueOf(item) + if itemValue.Kind() == reflect.Ptr { + itemValue = itemValue.Elem() + } + + // numFields := t.NumField() + numFields := itemType.NumField() + + // 속성 이름과 값을 출력합니다. + for i := 0; i < numFields; i++ { + field := itemType.Field(i) + value := itemValue.Field(i).Interface() + + keyValue := irs.KeyValue{} + keyValue.Key = field.Name + keyValue.Value = fmt.Sprintf("%v", value) + info.KeyValueList = keyValueList + } + + regionZoneInfoList = append(regionZoneInfoList, &info) + } + + return regionZoneInfoList, nil +} +func (regionZoneHandler *GCPRegionZoneHandler) ListOrgRegion() (string, error) { + // regionResp, err := regionZoneHandler.Client.Regions.(projectID).Do() + // if err != nil { + // cblogger.Error(err) + // return regionZoneInfoList, err + // } + // if regionResp == nil { + // return nil, errors.New("Not Found : Region Zone information not found") + // } + + projectID := regionZoneHandler.Credential.ProjectID + + callogger := call.GetLogger("HISCALL") + callLogInfo := call.CLOUDLOGSCHEMA{ + CloudOS: call.GCP, + RegionZone: regionZoneHandler.Region.Zone, + ResourceType: call.REGIONZONE, + ResourceName: "", + CloudOSAPI: "List()", + ElapsedTime: "", + ErrorMSG: "", + } + callLogStart := call.Start() + resp, err := regionZoneHandler.Client.Regions.List(projectID).Do() + callLogInfo.ElapsedTime = call.Elapsed(callLogStart) + + if err != nil { + callLogInfo.ErrorMSG = err.Error() + callogger.Info(call.String(callLogInfo)) + cblogger.Error(err) + return "", err + } + callogger.Info(call.String(callLogInfo)) + j, _ := resp.MarshalJSON() + + callogger.Info(j) + return string(j), err +} +func (regionZoneHandler *GCPRegionZoneHandler) ListOrgZone() (string, error) { + projectID := regionZoneHandler.Credential.ProjectID + + callogger := call.GetLogger("HISCALL") + callLogInfo := call.CLOUDLOGSCHEMA{ + CloudOS: call.GCP, + RegionZone: regionZoneHandler.Region.Zone, + ResourceType: call.REGIONZONE, + ResourceName: "", + CloudOSAPI: "List()", + ElapsedTime: "", + ErrorMSG: "", + } + callLogStart := call.Start() + resp, err := regionZoneHandler.Client.Zones.List(projectID).Do() + callLogInfo.ElapsedTime = call.Elapsed(callLogStart) + + if err != nil { + callLogInfo.ErrorMSG = err.Error() + callogger.Info(call.String(callLogInfo)) + cblogger.Error(err) + return "", err + } + callogger.Info(call.String(callLogInfo)) + j, _ := resp.MarshalJSON() + + callogger.Info(j) + return string(j), err +} + +/** +// Region 조회 성공 시 result +{ + "kind": "compute#regionList", + "id": "projects/csta-349809/regions", + "items": [ + { + "kind": "compute#region", + "id": "1510", + "creationTimestamp": "1969-12-31T16:00:00.000-08:00", + "name": "europe-west8", + "description": "europe-west8", + "status": "UP", + "zones": [ + "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/europe-west8-a", + "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/europe-west8-b", + "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/europe-west8-c" + ], + "quotas": [ + // CPUS, DISKS_TOTAL_GB ... 많아서 생략 + ], + "selfLink": "https://www.googleapis.com/compute/v1/projects/csta-349809/regions/europe-west8", + "supportsPzs": false + } + ], + "selfLink": "https://www.googleapis.com/compute/v1/projects/csta-349809/regions" +} + + +// Zone 조회 성공 시 +{ + "kind": "compute#zone", + "id": "2231", + "creationTimestamp": "1969-12-31T16:00:00.000-08:00", + "name": "us-east1-b", + "description": "us-east1-b", + "status": "UP", + "region": "https://www.googleapis.com/compute/v1/projects/csta-349809/regions/us-east1", + "selfLink": "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/us-east1-b", + "availableCpuPlatforms": [ + "Intel Broadwell", + "Intel Cascade Lake", + "AMD Genoa", + "Intel Haswell", + "Intel Ice Lake", + "Intel Ivy Bridge", + "AMD Milan", + "AMD Rome", + "Intel Sandy Bridge", + "Intel Sapphire Rapids", + "Intel Skylake" + ], + "supportsPzs": false +} +**/ diff --git a/cloud-control-manager/cloud-driver/interfaces/connect/CloudConnect.go b/cloud-control-manager/cloud-driver/interfaces/connect/CloudConnect.go index 8881997ec..e349dd046 100644 --- a/cloud-control-manager/cloud-driver/interfaces/connect/CloudConnect.go +++ b/cloud-control-manager/cloud-driver/interfaces/connect/CloudConnect.go @@ -31,6 +31,7 @@ type CloudConnection interface { CreateClusterHandler() (irs.ClusterHandler, error) CreateAnyCallHandler() (irs.AnyCallHandler, error) + CreateRegionZoneHandler() (irs.RegionZoneHandler, error) IsConnected() (bool, error) Close() error From 7c87b6cf452db69ce8db68004f5e485b040f53b6 Mon Sep 17 00:00:00 2001 From: dogfootman Date: Fri, 15 Sep 2023 14:45:50 +0900 Subject: [PATCH 2/6] =?UTF-8?q?connection=EC=97=90=20=EC=A0=95=EC=9D=98?= =?UTF-8?q?=EB=90=9C=20xxxHandler=EB=A5=BC=20xxxClient=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go | 5 ++--- .../cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go b/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go index 20fd1e1af..29afbe6ca 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go @@ -90,8 +90,8 @@ func (driver *GCPDriver) ConnectCloud(connectionInfo idrv.ConnectionInfo) (icon. // VNetClient: VMClient, // VNicClient: VMClient, SubnetClient: VMClient, - VMSpecHandler: VMClient, - VPCHandler: VMClient, + VMSpecClient: VMClient, + VPCClient: VMClient, ContainerClient: containerClient, } @@ -173,4 +173,3 @@ func getContainerClient(credential idrv.CredentialInfo) (context.Context, *conta return ctx, containerClient, nil } - diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go b/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go index 31cddb8bb..0fdffd1cd 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go @@ -41,9 +41,9 @@ type GCPCloudConnection struct { VNetClient *compute.Service VNicClient *compute.Service SubnetClient *compute.Service - VMSpecHandler *compute.Service - VPCHandler *compute.Service - RegionZoneHandler *compute.Service + VMSpecClient *compute.Service + VPCClient *compute.Service + RegionZoneClient *compute.Service ContainerClient *container.Service } From 6a601888015e375fbe356fbbb65fa38686c61ac6 Mon Sep 17 00:00:00 2001 From: dogfootman Date: Fri, 15 Sep 2023 14:46:43 +0900 Subject: [PATCH 3/6] =?UTF-8?q?GetZoneListByRegion=EC=9D=84=20commonHandle?= =?UTF-8?q?r=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drivers/gcp/resources/CommonHandler.go | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/CommonHandler.go b/cloud-control-manager/cloud-driver/drivers/gcp/resources/CommonHandler.go index 94b16ba51..a15807f35 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/CommonHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/resources/CommonHandler.go @@ -22,11 +22,11 @@ import ( "sync" "time" - "github.com/davecgh/go-spew/spew" cblog "github.com/cloud-barista/cb-log" call "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/call-log" idrv "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces" irs "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces/resources" + "github.com/davecgh/go-spew/spew" "github.com/sirupsen/logrus" compute "google.golang.org/api/compute/v1" container "google.golang.org/api/container/v1" @@ -512,6 +512,46 @@ func WaitContainerOperationDone(client *container.Service, project string, regio return nil } +// region에 해당하는 zone 목록 조회 +func GetZoneListByRegion(client *compute.Service, regionUrl string) (*compute.ZoneList, error) { + projectId := "" + regionName := "" + + arrLink := strings.Split(regionUrl, "/") + if len(arrLink) > 0 { + regionName = arrLink[len(arrLink)-1] + for pos, item := range arrLink { + if strings.EqualFold(item, "projects") { + projectId = arrLink[pos+1] + break + } + } + } + cblogger.Infof("projectId : [%s] / imageName : [%s]", projectId, regionName) + if projectId == "" { + return nil, errors.New("ProjectId information not found in URL.") + } + + resp, err := client.Zones.List(projectId).Do() + + if err != nil { + cblogger.Error(err) + return nil, err + } + return resp, nil + +} + +// Available or Unavailable 로 return +// Status of the zone, either UP or DOWN. +func GetZoneStatus(status string) irs.ZoneStatus { + if status == "UP" { + return irs.ZoneAvailable + } else { + return irs.ZoneUnavailable + } +} + /* ### container operation ### (*container.Operation)(0xc0003d6a00)({ From fc45d5835590c23f40f87880d18f0b454d7dd563 Mon Sep 17 00:00:00 2001 From: dogfootman Date: Fri, 15 Sep 2023 14:47:22 +0900 Subject: [PATCH 4/6] =?UTF-8?q?Region=EC=A1=B0=ED=9A=8C=EC=8B=9C=20Zone?= =?UTF-8?q?=EC=9D=98=20Status=EB=A5=BC=20=EC=9C=84=ED=95=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gcp/resources/RegionZoneHandler.go | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go index 0984cfe4e..bb1deb238 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "reflect" - "strings" call "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/call-log" idrv "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces" @@ -87,23 +86,38 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZo // ZoneList var zoneInfoList []*irs.ZoneInfo - for _, zoneUrl := range item.Zones { - // "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/northamerica-northeast1-a" - startIndex := strings.Index(zoneUrl, "/zones/") + len("/zones/") - if startIndex < len("/zones/") { - //fmt.Println("Invalid URL:", zoneUrl) - cblogger.Error("Invalid URL:", zoneUrl) - continue - } - zone := zoneUrl[startIndex:] - + resultZones, err := GetZoneListByRegion(regionZoneHandler.Client, item.SelfLink) + if err != nil { + // failed to get ZoneInfo by region + } + for _, zone := range resultZones.Items { zoneInfo := irs.ZoneInfo{} - zoneInfo.Name = zone - zoneInfo.DisplayName = zone + zoneInfo.Name = zone.Name + zoneInfo.DisplayName = zone.Name + zoneInfo.Status = GetZoneStatus(zone.Status) zoneInfoList = append(zoneInfoList, &zoneInfo) } + //zoneInfo.Status = GetRegionStatus() + + // for _, zoneUrl := range item.Zones { + // // "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/northamerica-northeast1-a" + // startIndex := strings.Index(zoneUrl, "/zones/") + len("/zones/") + // if startIndex < len("/zones/") { + // //fmt.Println("Invalid URL:", zoneUrl) + // cblogger.Error("Invalid URL:", zoneUrl) + // continue + // } + // zone := zoneUrl[startIndex:] + + // zoneInfo := irs.ZoneInfo{} + // zoneInfo.Name = zone + // zoneInfo.DisplayName = zone + + // zoneInfoList = append(zoneInfoList, &zoneInfo) + // } + // KeyValueList keyValueList := []irs.KeyValue{} // @@ -194,6 +208,7 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListOrgZone() (string, error) { ErrorMSG: "", } callLogStart := call.Start() + resp, err := regionZoneHandler.Client.Zones.List(projectID).Do() callLogInfo.ElapsedTime = call.Elapsed(callLogStart) From 1153bd693991bb79f00deb85380652f7622bc76e Mon Sep 17 00:00:00 2001 From: dogfootman Date: Mon, 18 Sep 2023 09:45:27 +0900 Subject: [PATCH 5/6] =?UTF-8?q?drvCapabilityInfo.RegionZoneHandler=20=3D?= =?UTF-8?q?=20false=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud-driver/drivers/gcp/GCPDriver.go | 10 ++-- .../gcp/connect/GCP_CloudConnection.go | 2 +- .../gcp/resources/RegionZoneHandler.go | 54 ++----------------- .../cloud-driver/interfaces/CloudDriver.go | 19 +++---- 4 files changed, 20 insertions(+), 65 deletions(-) diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go b/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go index 29afbe6ca..8f73d3e8a 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/GCPDriver.go @@ -49,6 +49,7 @@ func (GCPDriver) GetDriverCapability() idrv.DriverCapabilityInfo { drvCapabilityInfo.VPCHandler = true drvCapabilityInfo.DiskHandler = false drvCapabilityInfo.MyImageHandler = false + drvCapabilityInfo.RegionZoneHandler = false drvCapabilityInfo.ClusterHandler = true return drvCapabilityInfo @@ -89,10 +90,11 @@ func (driver *GCPDriver) ConnectCloud(connectionInfo idrv.ConnectionInfo) (icon. SecurityGroupClient: VMClient, // VNetClient: VMClient, // VNicClient: VMClient, - SubnetClient: VMClient, - VMSpecClient: VMClient, - VPCClient: VMClient, - ContainerClient: containerClient, + SubnetClient: VMClient, + VMSpecClient: VMClient, + VPCClient: VMClient, + RegionZoneClient: VMClient, + ContainerClient: containerClient, } //fmt.Println("################## resource ConnectionInfo ##################") diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go b/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go index 0fdffd1cd..bcfc1d42a 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/connect/GCP_CloudConnection.go @@ -139,6 +139,6 @@ func (cloudConn *GCPCloudConnection) CreateAnyCallHandler() (irs.AnyCallHandler, func (cloudConn *GCPCloudConnection) CreateRegionZoneHandler() (irs.RegionZoneHandler, error) { cblogger.Info("GCP Cloud Driver: called CreateRegionZoneHandler()!") - regionZoneHandler := gcprs.GCPRegionZoneHandler{cloudConn.Region, cloudConn.Ctx, cloudConn.VMClient, cloudConn.Credential} + regionZoneHandler := gcprs.GCPRegionZoneHandler{cloudConn.Region, cloudConn.Ctx, cloudConn.RegionZoneClient, cloudConn.Credential} return ®ionZoneHandler, nil } diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go index bb1deb238..8d69afaa7 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go @@ -19,30 +19,6 @@ type GCPRegionZoneHandler struct { Credential idrv.CredentialInfo } -// // -------- Const -// type ZoneStatus string - -// const ( -// ZoneAvailable ZoneStatus = "Available" -// ZoneUnavailable ZoneStatus = "Unavailable" -// ) - -// type RegionZoneInfo struct { -// Name string -// DisplayName string -// ZoneList []ZoneInfo - -// KeyValueList []KeyValue -// } - -// type ZoneInfo struct { -// Name string -// DisplayName string -// Status ZoneStatus // Available | Unavailable - -// KeyValueList []KeyValue -// } - // required Compute Engine IAM ROLE : compute.regions.list func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZoneInfo, error) { var regionZoneInfoList []*irs.RegionZoneInfo @@ -76,10 +52,6 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZo } for _, item := range resp.Items { - // Name string - // DisplayName string - // ZoneList []ZoneInfo - // KeyValueList []KeyValue info := irs.RegionZoneInfo{} info.Name = item.Name info.DisplayName = item.Name @@ -99,8 +71,7 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZo zoneInfoList = append(zoneInfoList, &zoneInfo) } - //zoneInfo.Status = GetRegionStatus() - + // 가져온 결과에서 Zone 정보 추출 : Zone의 status를 찾지 못해 조회하는 것으로 변경 // for _, zoneUrl := range item.Zones { // // "https://www.googleapis.com/compute/v1/projects/csta-349809/zones/northamerica-northeast1-a" // startIndex := strings.Index(zoneUrl, "/zones/") + len("/zones/") @@ -118,26 +89,15 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZo // zoneInfoList = append(zoneInfoList, &zoneInfo) // } - // KeyValueList keyValueList := []irs.KeyValue{} - // - // keyValue := irs.KeyValue{} - // keyValue.Key = "Kind" - // keyValue.Value = item.Kind - // info.KeyValueList = keyValueList - - // t := reflect.TypeOf(item) itemType := reflect.TypeOf(item) if itemType.Kind() == reflect.Ptr { itemType = itemType.Elem() } - // v := reflect.ValueOf(item) itemValue := reflect.ValueOf(item) if itemValue.Kind() == reflect.Ptr { itemValue = itemValue.Elem() } - - // numFields := t.NumField() numFields := itemType.NumField() // 속성 이름과 값을 출력합니다. @@ -157,14 +117,6 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZo return regionZoneInfoList, nil } func (regionZoneHandler *GCPRegionZoneHandler) ListOrgRegion() (string, error) { - // regionResp, err := regionZoneHandler.Client.Regions.(projectID).Do() - // if err != nil { - // cblogger.Error(err) - // return regionZoneInfoList, err - // } - // if regionResp == nil { - // return nil, errors.New("Not Found : Region Zone information not found") - // } projectID := regionZoneHandler.Credential.ProjectID @@ -191,7 +143,7 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListOrgRegion() (string, error) { callogger.Info(call.String(callLogInfo)) j, _ := resp.MarshalJSON() - callogger.Info(j) + //callogger.Info(j) return string(j), err } func (regionZoneHandler *GCPRegionZoneHandler) ListOrgZone() (string, error) { @@ -221,7 +173,7 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListOrgZone() (string, error) { callogger.Info(call.String(callLogInfo)) j, _ := resp.MarshalJSON() - callogger.Info(j) + //callogger.Info(j) return string(j), err } diff --git a/cloud-control-manager/cloud-driver/interfaces/CloudDriver.go b/cloud-control-manager/cloud-driver/interfaces/CloudDriver.go index c1170c4b0..a1946f931 100644 --- a/cloud-control-manager/cloud-driver/interfaces/CloudDriver.go +++ b/cloud-control-manager/cloud-driver/interfaces/CloudDriver.go @@ -19,15 +19,16 @@ type DriverCapabilityInfo struct { ImageHandler bool // support: true, do not support: false VPCHandler bool // support: true, do not support: false //VNetworkHandler bool // support: true, do not support: false - SecurityHandler bool // support: true, do not support: false - KeyPairHandler bool // support: true, do not support: false - VNicHandler bool // support: true, do not support: false - PublicIPHandler bool // support: true, do not support: false - VMHandler bool // support: true, do not support: false - VMSpecHandler bool // support: true, do not support: false - DiskHandler bool // support: true, do not support: false - MyImageHandler bool // support: true, do not support: false - ClusterHandler bool // support: true, do not support: false + SecurityHandler bool // support: true, do not support: false + KeyPairHandler bool // support: true, do not support: false + VNicHandler bool // support: true, do not support: false + PublicIPHandler bool // support: true, do not support: false + VMHandler bool // support: true, do not support: false + VMSpecHandler bool // support: true, do not support: false + DiskHandler bool // support: true, do not support: false + MyImageHandler bool // support: true, do not support: false + RegionZoneHandler bool + ClusterHandler bool // support: true, do not support: false FIXED_SUBNET_CIDR bool // support: true, do not support: false VPC_CIDR bool // support: true, do not support: false From f6adbd44b2910f96f4ae81547b1172b1f2cc95cc Mon Sep 17 00:00:00 2001 From: dogfootman Date: Mon, 18 Sep 2023 15:24:21 +0900 Subject: [PATCH 6/6] =?UTF-8?q?keyValueList=20set=20=EB=B3=B4=EC=99=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud-driver/drivers/gcp/resources/RegionZoneHandler.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go index 8d69afaa7..a74f6afd8 100644 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/gcp/resources/RegionZoneHandler.go @@ -108,8 +108,9 @@ func (regionZoneHandler *GCPRegionZoneHandler) ListRegionZone() ([]*irs.RegionZo keyValue := irs.KeyValue{} keyValue.Key = field.Name keyValue.Value = fmt.Sprintf("%v", value) - info.KeyValueList = keyValueList + keyValueList = append(keyValueList, keyValue) } + info.KeyValueList = keyValueList regionZoneInfoList = append(regionZoneInfoList, &info) }