diff --git a/cloud-control-manager/cloud-driver/common/common.go b/cloud-control-manager/cloud-driver/common/common.go index 387d3d709..94648f53b 100644 --- a/cloud-control-manager/cloud-driver/common/common.go +++ b/cloud-control-manager/cloud-driver/common/common.go @@ -9,60 +9,79 @@ package common import ( - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "io/ioutil" + "bytes" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "encoding/pem" + "fmt" + "io/ioutil" - "golang.org/x/crypto/ssh" + "golang.org/x/crypto/ssh" ) // generate a KeyPair with 4KB length // returns: privateKeyBytes, publicKeyBytes, error func GenKeyPair() ([]byte, []byte, error) { - // (1) Generate a private Key - keyLength := 4096 - privateKey, err := rsa.GenerateKey(rand.Reader, keyLength) - if err != nil { - return nil, nil, err - } + // (1) Generate a private Key + keyLength := 4096 + privateKey, err := rsa.GenerateKey(rand.Reader, keyLength) + if err != nil { + return nil, nil, err + } - err = privateKey.Validate() - if err != nil { - return nil, nil, err - } + err = privateKey.Validate() + if err != nil { + return nil, nil, err + } - // for ASN.1 DER format - DERKey := x509.MarshalPKCS1PrivateKey(privateKey) - keyBlock := pem.Block{ - Type: "RSA PRIVATE KEY", - Headers: nil, - Bytes: DERKey, - } + // for ASN.1 DER format + DERKey := x509.MarshalPKCS1PrivateKey(privateKey) + keyBlock := pem.Block{ + Type: "RSA PRIVATE KEY", + Headers: nil, + Bytes: DERKey, + } - // for PEM format - privateKeyBytes := pem.EncodeToMemory(&keyBlock) + // for PEM format + privateKeyBytes := pem.EncodeToMemory(&keyBlock) - - // (2) Generate a public key + // (2) Generate a public key publicKey, err := ssh.NewPublicKey(&privateKey.PublicKey) - if err != nil { - return nil, nil, err - } + if err != nil { + return nil, nil, err + } - publicKeyBytes := ssh.MarshalAuthorizedKey(publicKey) + publicKeyBytes := ssh.MarshalAuthorizedKey(publicKey) - return privateKeyBytes, publicKeyBytes, nil + return privateKeyBytes, publicKeyBytes, nil } // save a key to a file func SaveKey(keyBytes []byte, targetFile string) error { - err := ioutil.WriteFile(targetFile, keyBytes, 0600) - if err != nil { - return err - } + err := ioutil.WriteFile(targetFile, keyBytes, 0600) + if err != nil { + return err + } + + return nil +} + +// ParseKey reads the given RSA private key and create a public one for it. +func MakePublicKeyFromPrivateKey(pem string) (string, error) { + key, err := ssh.ParseRawPrivateKey([]byte(pem)) + if err != nil { + return "", err + } + rsaKey, ok := key.(*rsa.PrivateKey) + if !ok { + return "", fmt.Errorf("%q is not a RSA key", pem) + } + pub, err := ssh.NewPublicKey(&rsaKey.PublicKey) + if err != nil { + return "", err + } - return nil + return string(bytes.TrimRight(ssh.MarshalAuthorizedKey(pub), "\n")), nil } diff --git a/cloud-control-manager/cloud-driver/drivers/alibaba/main/Test_Resources.go b/cloud-control-manager/cloud-driver/drivers/alibaba/main/Test_Resources.go index fc1161784..75f3c219d 100644 --- a/cloud-control-manager/cloud-driver/drivers/alibaba/main/Test_Resources.go +++ b/cloud-control-manager/cloud-driver/drivers/alibaba/main/Test_Resources.go @@ -341,7 +341,7 @@ func handleSecurity() { securityName := "CB-SecurityTestCidr" securityId := "sg-6wedru4yb4m6qqfvd3sj" - vpcId := "vpc-0jl4l19l51gn2exrohgci" + vpcId := "vpc-6wed2mg4ox4xphl18461h" for { fmt.Println("Security Management") @@ -383,11 +383,11 @@ func handleSecurity() { SecurityRules: &[]irs.SecurityRuleInfo{ //보안 정책 설정 //CIDR 테스트 { - FromPort: "30", - ToPort: "30", + FromPort: "20", + ToPort: "22", IPProtocol: "tcp", Direction: "inbound", - CIDR: "10.13.1.10/32", + CIDR: "0.0.0.0/0", }, { FromPort: "40", @@ -850,9 +850,9 @@ func handleVM() { ImageIID: irs.IID{SystemId: "ubuntu_18_04_x64_20G_alibase_20210420.vhd"}, //VpcIID: irs.IID{SystemId: "vpc-0jl4l19l51gn2exrohgci"}, //SubnetIID: irs.IID{SystemId: "vsw-0jlj155cbwhjumtipnm6d"}, - SubnetIID: irs.IID{SystemId: "vsw-0jlj177cbwhjumtipnm6d"}, //없는 Subnet 테스트 + SubnetIID: irs.IID{SystemId: "vsw-6we1o1arx7bivz7iu3o9k"}, //없는 Subnet 테스트 //SecurityGroupIIDs: []irs.IID{{SystemId: "sg-6we0rxnoai067qbkdkgw"}, {SystemId: "sg-6weeb9xaodr65g7bq10c"}}, - SecurityGroupIIDs: []irs.IID{{SystemId: "sg-0jlcxdq9lpyi67vzuft1"}}, + SecurityGroupIIDs: []irs.IID{{SystemId: "sg-6we1dc6xqy9e7zjtzkkk"}}, //VMSpecName: "ecs.t5-lc2m1.nano", VMSpecName: "ecs.g6.large", //cn-wulanchabu 리전 KeyPairIID: irs.IID{SystemId: "CB-KeyPairTest123123"}, @@ -972,11 +972,11 @@ func main() { cblogger.Info("Alibaba Cloud Resource Test") cblogger.Debug("Debug mode") - //handleVPC() //VPC + handleVPC() //VPC //handleVMSpec() //handleImage() //AMI - //handleSecurity() - //handleKeyPair() + handleSecurity() + handleKeyPair() handleVM() //handlePublicIP() // PublicIP 생성 후 conf diff --git a/cloud-control-manager/cloud-driver/drivers/alibaba/resources/KeyPairHandler.go b/cloud-control-manager/cloud-driver/drivers/alibaba/resources/KeyPairHandler.go index e50f6aa56..cb70e632c 100644 --- a/cloud-control-manager/cloud-driver/drivers/alibaba/resources/KeyPairHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/alibaba/resources/KeyPairHandler.go @@ -11,19 +11,15 @@ package resources import ( - "bytes" - "crypto/rsa" "errors" - "fmt" "io/ioutil" - "log" "os" "strings" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" - "golang.org/x/crypto/ssh" call "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/call-log" + keypair "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/common" 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" @@ -144,7 +140,7 @@ func (keyPairHandler *AlibabaKeyPairHandler) CreateKey(keyPairReqInfo irs.KeyPai spew.Dump(result) cblogger.Info("공개키 생성") - publicKey, errPub := makePublicKeyFromPrivateKey(result.PrivateKeyBody) + publicKey, errPub := keypair.MakePublicKeyFromPrivateKey(result.PrivateKeyBody) if errPub != nil { cblogger.Error(errPub) return irs.KeyPairInfo{}, err @@ -171,13 +167,13 @@ func (keyPairHandler *AlibabaKeyPairHandler) CreateKey(keyPairReqInfo irs.KeyPai cblogger.Infof("savePublicFileTo : [%s]", savePublicFileTo) // 파일에 private Key를 쓴다 - err = writeKeyToFile([]byte(keyPairInfo.PrivateKey), savePrivateFileTo) + err = keypair.SaveKey([]byte(keyPairInfo.PrivateKey), savePrivateFileTo) if err != nil { return irs.KeyPairInfo{}, err } // 파일에 public Key를 쓴다 - err = writeKeyToFile([]byte(keyPairInfo.PublicKey), savePublicFileTo) + err = keypair.SaveKey([]byte(keyPairInfo.PublicKey), savePublicFileTo) if err != nil { return irs.KeyPairInfo{}, err } @@ -381,33 +377,3 @@ func (keyPairHandler *AlibabaKeyPairHandler) CheckKeyPairFolder(keyPairPath stri } return nil } - -// ParseKey reads the given RSA private key and create a public one for it. -func makePublicKeyFromPrivateKey(pem string) (string, error) { - key, err := ssh.ParseRawPrivateKey([]byte(pem)) - if err != nil { - cblogger.Error(err) - return "", err - } - rsaKey, ok := key.(*rsa.PrivateKey) - if !ok { - return "", fmt.Errorf("%q is not a RSA key", pem) - } - pub, err := ssh.NewPublicKey(&rsaKey.PublicKey) - if err != nil { - return "", err - } - - return string(bytes.TrimRight(ssh.MarshalAuthorizedKey(pub), "\n")), nil -} - -// 파일에 Key를 쓴다 -func writeKeyToFile(keyBytes []byte, saveFileTo string) error { - err := ioutil.WriteFile(saveFileTo, keyBytes, 0600) - if err != nil { - return err - } - - log.Printf("Key 저장위치: %s", saveFileTo) - return nil -} diff --git a/cloud-control-manager/cloud-driver/drivers/aws/main/Test_Resources.go b/cloud-control-manager/cloud-driver/drivers/aws/main/Test_Resources.go index 80440fb99..2bf90df79 100644 --- a/cloud-control-manager/cloud-driver/drivers/aws/main/Test_Resources.go +++ b/cloud-control-manager/cloud-driver/drivers/aws/main/Test_Resources.go @@ -900,9 +900,10 @@ func handleVM() { IId: irs.IID{NameId: "mcloud-barista-iid-vm-test"}, //ImageIID: irs.IID{SystemId: "ami-001b6f8703b50e077"}, //centos-stable-7.2003.13-ebs-202005201235 //ImageIID: irs.IID{SystemId: "ami-059b6d3840b03d6dd"}, //Ubuntu Server 20.04 LTS (HVM) + //ImageIID: irs.IID{SystemId: "ami-09e67e426f25ce0d7"}, //Ubuntu Server 20.04 LTS (HVM) - 버지니아 북부 리전 ImageIID: irs.IID{SystemId: "ami-059b6d3840b03d6dd"}, //Ubuntu Server 20.04 LTS (HVM) - SubnetIID: irs.IID{SystemId: "subnet-0a6ca346752be1ca4"}, - SecurityGroupIIDs: []irs.IID{{SystemId: "sg-0556ddbff4cab480e"}}, + SubnetIID: irs.IID{SystemId: "subnet-05af5eb87ef3f01c2"}, + SecurityGroupIIDs: []irs.IID{{SystemId: "sg-02421ce44c38e4deb"}}, VMSpecName: "t2.micro", KeyPairIID: irs.IID{SystemId: "CB-KeyPairTest123123"}, } @@ -1125,9 +1126,9 @@ func main() { //handleKeyPair() //handlePublicIP() // PublicIP 생성 후 conf //handleSecurity() - //handleVM() + handleVM() - handleImage() //AMI + //handleImage() //AMI //handleVNic() //Lancard //handleVMSpec() } diff --git a/cloud-control-manager/cloud-driver/drivers/aws/resources/KeyPairHandler.go b/cloud-control-manager/cloud-driver/drivers/aws/resources/KeyPairHandler.go index 9f0672fea..e0e7e014c 100644 --- a/cloud-control-manager/cloud-driver/drivers/aws/resources/KeyPairHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/aws/resources/KeyPairHandler.go @@ -1,9 +1,7 @@ package resources import ( - "bytes" "crypto/md5" - "crypto/rsa" "errors" "fmt" "io" @@ -20,7 +18,8 @@ import ( irs "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces/resources" "github.com/davecgh/go-spew/spew" _ "github.com/davecgh/go-spew/spew" - "golang.org/x/crypto/ssh" + + keypair "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/common" ) type AwsKeyPairHandler struct { @@ -145,7 +144,7 @@ func (keyPairHandler *AwsKeyPairHandler) CreateKey(keyPairReqInfo irs.KeyPairReq cblogger.Infof("Created key pair %q %s\n%s\n", *result.KeyName, *result.KeyFingerprint, *result.KeyMaterial) cblogger.Info("공개키 생성") - publicKey, errPub := makePublicKeyFromPrivateKey(*result.KeyMaterial) + publicKey, errPub := keypair.MakePublicKeyFromPrivateKey(*result.KeyMaterial) if errPub != nil { cblogger.Error(errPub) return irs.KeyPairInfo{}, err @@ -186,13 +185,13 @@ func (keyPairHandler *AwsKeyPairHandler) CreateKey(keyPairReqInfo irs.KeyPairReq cblogger.Infof("savePublicFileTo : [%s]", savePublicFileTo) // 파일에 private Key를 쓴다 - err = writeKeyToFile([]byte(keyPairInfo.PrivateKey), savePrivateFileTo) + err = keypair.SaveKey([]byte(keyPairInfo.PrivateKey), savePrivateFileTo) if err != nil { return irs.KeyPairInfo{}, err } // 파일에 public Key를 쓴다 - err = writeKeyToFile([]byte(keyPairInfo.PublicKey), savePublicFileTo) + err = keypair.SaveKey([]byte(keyPairInfo.PublicKey), savePublicFileTo) if err != nil { return irs.KeyPairInfo{}, err } @@ -410,35 +409,6 @@ func (keyPairHandler *AwsKeyPairHandler) CheckKeyPairFolder(keyPairPath string) return nil } -// ParseKey reads the given RSA private key and create a public one for it. -func makePublicKeyFromPrivateKey(pem string) (string, error) { - key, err := ssh.ParseRawPrivateKey([]byte(pem)) - if err != nil { - return "", err - } - rsaKey, ok := key.(*rsa.PrivateKey) - if !ok { - return "", fmt.Errorf("%q is not a RSA key", pem) - } - pub, err := ssh.NewPublicKey(&rsaKey.PublicKey) - if err != nil { - return "", err - } - - return string(bytes.TrimRight(ssh.MarshalAuthorizedKey(pub), "\n")), nil -} - -// 파일에 Key를 쓴다 -func writeKeyToFile(keyBytes []byte, saveFileTo string) error { - err := ioutil.WriteFile(saveFileTo, keyBytes, 0600) - if err != nil { - return err - } - - log.Printf("Key 저장위치: %s", saveFileTo) - return nil -} - // @TODO - PK 이슈 처리해야 함. (A User / B User / User 하위의 IAM 계정간의 호환성에 이슈가 없어야 하는데 현재는 안 됨.) // - 따라서 AWS는 대안으로 KeyPair의 FingerPrint를 이용하도록 변경 - 필요시 리전및 키 이름과 혼용해서 만들어야할 듯. // KeyPair 해시 생성 함수 (PK 이슈로 현재는 사용하지 않음) diff --git a/cloud-control-manager/cloud-driver/drivers/aws/resources/VMHandler.go b/cloud-control-manager/cloud-driver/drivers/aws/resources/VMHandler.go index 2c0c813d6..98bceada5 100644 --- a/cloud-control-manager/cloud-driver/drivers/aws/resources/VMHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/aws/resources/VMHandler.go @@ -57,7 +57,7 @@ func Connect(region string) *ec2.EC2 { return svc } -// 1개의 VM만 생성되도록 수정 (MinCount / MaxCount 이용 안 함) +//1개의 VM만 생성되도록 수정 (MinCount / MaxCount 이용 안 함) //키페어 이름(예:mcloud-barista)은 아래 URL에 나오는 목록 중 "키페어 이름"의 값을 적으면 됨. //https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#KeyPairs:sort=keyName func (vmHandler *AwsVMHandler) StartVM(vmReqInfo irs.VMReqInfo) (irs.VMInfo, error) { diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/main/old/Test_Vm.go b/cloud-control-manager/cloud-driver/drivers/gcp/main/old/Test_Vm.go deleted file mode 100644 index e363543c9..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/main/old/Test_Vm.go +++ /dev/null @@ -1,213 +0,0 @@ -// Proof of Concepts of CB-Spider. -// The CB-Spider is sub-Framework of the Cloud-Barista Multi-Cloud Project. -// The CB-Spider Mission is to connect all the clouds with a single interface. -// -// * Cloud-Barista: https://github.com/cloud-barista -// -// This is a Cloud Driver Example for PoC Test. -// -// by devunet@mz.co.kr, 2019.11. - -package main - -import ( - "fmt" - - irs "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/interfaces/resources" - "github.com/davecgh/go-spew/spew" - "github.com/sirupsen/logrus" - - testconf "./conf" - cblog "github.com/cloud-barista/cb-log" -) - -var cblogger *logrus.Logger - -func init() { - // cblog is a global variable. - cblogger = cblog.GetLogger("GCP Resource Test") - cblog.SetLevel("debug") -} - -// Test VM -func handleVM() { - cblogger.Info("Start VM Resource Test") - - ResourceHandler, err := testconf.GetResourceHandler("VM") - if err != nil { - panic(err) - } - - handler := ResourceHandler.(irs.VMHandler) - - VmID := irs.IID{ - NameId: "vm123", - SystemId: "vm123", - } - - for { - fmt.Println("VM Management") - fmt.Println("0. Quit") - fmt.Println("1. VM Start") - fmt.Println("2. VM Info") - fmt.Println("3. Suspend VM") - fmt.Println("4. Resume VM") - fmt.Println("5. Reboot VM") - fmt.Println("6. Terminate VM") - - fmt.Println("7. GetVMStatus VM") - fmt.Println("8. ListVMStatus VM") - fmt.Println("9. ListVM") - - var commandNum int - inputCnt, err := fmt.Scan(&commandNum) - if err != nil { - panic(err) - } - - if inputCnt == 1 { - switch commandNum { - case 0: - return - - case 1: - vmReqInfo := irs.VMReqInfo{ - //VMName: "vmsg02", - IId: VmID, - ImageIID: irs.IID{ - NameId: "projects/ubuntu-os-cloud/global/images/ubuntu-minimal-1804-bionic-v20200415", - SystemId: "projects/ubuntu-os-cloud/global/images/ubuntu-minimal-1804-bionic-v20200415", - }, - VpcIID: irs.IID{ - NameId: "vpc-11", - SystemId: "vpc-11", - }, - SubnetIID: irs.IID{ - NameId: "sub3", - SystemId: "sub3", - }, - SecurityGroupIIDs: []irs.IID{ - { - NameId: "sg1234", - SystemId: "sg1234", - }, - }, - - //NetworkInterfaceId: "eni-00befb6d8c3a87b24", - - //SecurityGroupIds: []string{config.Aws.SecurityGroupID}, - VMUserId: "cb-user", - - KeyPairIID: irs.IID{ - NameId: "cb-keyPairTest", - SystemId: "cb-keyPairTest", - }, - VMSpecName: "f1-micro", - } - - vmInfo, err := handler.StartVM(vmReqInfo) - if err != nil { - //panic(err) - cblogger.Error(err) - } else { - cblogger.Info("VM 생성 완료!!", vmInfo) - spew.Dump(vmInfo) - VmID = vmInfo.IId - cblogger.Infof("==>테스트를 위한 VM Name이 [%s]로 변경됨!!", VmID) - } - - case 2: - vmInfo, err := handler.GetVM(VmID) - if err != nil { - cblogger.Errorf("[%s] VM 정보 조회 실패", VmID) - cblogger.Error(err) - } else { - cblogger.Infof("[%s] VM 정보 조회 결과", VmID) - cblogger.Info(vmInfo) - spew.Dump(vmInfo) - } - - case 3: - cblogger.Info("Start Suspend VM ...") - result, err := handler.SuspendVM(VmID) - if err != nil { - cblogger.Errorf("[%s] VM Suspend 실패 - [%s]", VmID, result) - cblogger.Error(err) - } else { - cblogger.Infof("[%s] VM Suspend 성공 - [%s]", VmID, result) - } - - case 4: - cblogger.Info("Start Resume VM ...") - result, err := handler.ResumeVM(VmID) - if err != nil { - cblogger.Errorf("[%s] VM Resume 실패 - [%s]", VmID, result) - cblogger.Error(err) - } else { - cblogger.Infof("[%s] VM Resume 성공 - [%s]", VmID, result) - } - - case 5: - cblogger.Info("Start Reboot VM ...") - result, err := handler.RebootVM(VmID) - if err != nil { - cblogger.Errorf("[%s] VM Reboot 실패 - [%s]", VmID, result) - cblogger.Error(err) - } else { - cblogger.Infof("[%s] VM Reboot 성공 - [%s]", VmID, result) - } - - case 6: - cblogger.Info("Start Terminate VM ...") - result, err := handler.TerminateVM(VmID) - if err != nil { - cblogger.Errorf("[%s] VM Terminate 실패 - [%s]", VmID, result) - cblogger.Error(err) - } else { - cblogger.Infof("[%s] VM Terminate 성공 - [%s]", VmID, result) - } - - case 7: - cblogger.Info("Start Get VM Status...") - vmStatus, err := handler.GetVMStatus(VmID) - if err != nil { - cblogger.Errorf("[%s] VM Get Status 실패", VmID) - cblogger.Error(err) - } else { - cblogger.Infof("[%s] VM Get Status 성공 : [%s]", VmID, vmStatus) - } - - case 8: - cblogger.Info("Start ListVMStatus ...") - vmStatusInfos, err := handler.ListVMStatus() - if err != nil { - cblogger.Error("ListVMStatus 실패") - cblogger.Error(err) - } else { - cblogger.Info("ListVMStatus 성공") - cblogger.Info(vmStatusInfos) - spew.Dump(vmStatusInfos) - } - - case 9: - cblogger.Info("Start ListVM ...") - vmList, err := handler.ListVM() - if err != nil { - cblogger.Error("ListVM 실패") - cblogger.Error(err) - } else { - cblogger.Info("ListVM 성공") - cblogger.Info("=========== VM 목록 ================") - cblogger.Info(vmList) - spew.Dump(vmList) - } - - } - } - } -} - -func main() { - cblogger.Info("GCP Resource Test") - handleVM() -} diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/main/old/compute.go b/cloud-control-manager/cloud-driver/drivers/gcp/main/old/compute.go deleted file mode 100644 index cceac8536..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/main/old/compute.go +++ /dev/null @@ -1,760 +0,0 @@ -// Copyright 2017 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package main - -import ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "os" - "reflect" - "strconv" - "strings" - "time" - - "github.com/davecgh/go-spew/spew" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - - compute "google.golang.org/api/compute/v1" - "google.golang.org/api/googleapi" -) - -func init() { - scopes := strings.Join([]string{ - compute.DevstorageFullControlScope, - compute.ComputeScope, - }, " ") - fmt.Println("init :", scopes) - //computeMain() - // registerDemo("compute", scopes, computeMain) -} - -const ProjectID = "mcloud-barista-251102" - -type Config struct { - Type string `json:"type"` - ProjectID string `json:"project_id"` - PrivateKeyID string `json:"private_key_id"` - PrivateKey string `json:"private_key"` - ClientEmail string `json:"client_email"` - ClientID string `json:"client_id"` - AuthURI string `json:"auth_uri"` - TokenURI string `json:"token_uri"` - AuthProvider string `json:"auth_provider_x509_cert_url"` -} - -type InstanceInfo struct { - zone string - region string - instnaceName string -} - -type vmInstanceInfo struct { - VMId string -} -type KeyValue struct { - Key string - Value string -} - -type SecurityReqInfo struct { - Name string - Direction string // GCP 는 하나에 한개의 Direction만 생성/조회 가능 - SecurityRules *[]SecurityRuleInfo -} - -type SecurityRuleInfo struct { - FromPort string - ToPort string - IPProtocol string - Direction string -} -type VNicInfo struct { - Id string - Name string - PublicIP string - MacAddress string - OwnedVMID string - SecurityGroupIds []string - Status string - - KeyValueList []KeyValue -} -type SecurityInfo struct { - Id string - Name string - Direction string // GCP 는 하나에 한개의 Direction만 생성/조회 가능 - SecurityRules *[]SecurityRuleInfo - - KeyValueList []KeyValue -} -type PublicIPInfo struct { - Name string // AWS - Id string - // @todo - - Domain string // AWS - PublicIp string // AWS - PublicIpv4Pool string // AWS - AllocationId string // AWS:할당ID - AssociationId string // AWS:연결ID - InstanceId string // AWS:연결된 VM, GCP:연결된 VM name - NetworkInterfaceId string // AWS:연결된 Nic - NetworkInterfaceOwnerId string // AWS - PrivateIpAddress string // AWS - - Region string // GCP - CreationTimestamp string // GCP - Address string // GCP - NetworkTier string // GCP : PREMIUM, STANDARD - AddressType string // GCP : External, INTERNAL, UNSPECIFIED_TYPE - Status string // GCP : IN_USE, RESERVED, RESERVING - KeyValueList []KeyValue -} - -type CredentialInfo struct { - // @todo TBD - // key-value pairs - ClientId string // Azure Credential - ClientSecret string // Azure Credential - TenantId string // Azure Credential - SubscriptionId string // Azure Credential - IdentityEndpoint string // OpenStack Credential - Username string // OpenStack Credential - Password string // OpenStack Credential - DomainName string // OpenStack Credential - ProjectID string // OpenStack Credential - AuthToken string // Cloudit Credential - Client_Email string // GCP - Private_Key string // GCP - -} - -func createInstance(service *compute.Service, conf Config, zone string, vmname string, diskname string) { - - projectID := conf.ProjectID - - prefix := "https://www.googleapis.com/compute/v1/projects/" + projectID - imageURL := "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-7-wheezy-v20140606" - zone = zone - instanceName := vmname - - // Show the current images that are available. - // res, err := service.Images.List(projectID).Do() - // log.Printf("Got compute.Images.List, err: %#v, %v", res, err) - - instance := &compute.Instance{ - Name: instanceName, - Description: "compute sample instance", - MachineType: prefix + "/zones/" + zone + "/machineTypes/n1-standard-1", - Disks: []*compute.AttachedDisk{ - { - AutoDelete: true, - Boot: true, - Type: "PERSISTENT", - InitializeParams: &compute.AttachedDiskInitializeParams{ - DiskName: diskname, - SourceImage: imageURL, - }, - }, - }, - NetworkInterfaces: []*compute.NetworkInterface{ - { - AccessConfigs: []*compute.AccessConfig{ - { - Type: "ONE_TO_ONE_NAT", - Name: "External NAT", - }, - }, - Network: prefix + "/global/networks/default", - }, - }, - ServiceAccounts: []*compute.ServiceAccount{ - { - Email: conf.ClientEmail, - Scopes: []string{ - compute.DevstorageFullControlScope, - compute.ComputeScope, - }, - }, - }, - } - - op, err := service.Instances.Insert(projectID, zone, instance).Do() - js, err := op.MarshalJSON() - if err != nil { - log.Fatal(err) - } - fmt.Println("Insert vm to marshal Json : ", string(js)) - log.Printf("Got compute.Operation, err: %#v, %v", op, err) - etag := op.Header.Get("Etag") - log.Printf("Etag=%v", etag) - - inst, err := service.Instances.Get(projectID, zone, instanceName).IfNoneMatch(etag).Do() - log.Printf("Got compute.Instance, err: %#v, %v", inst, err) - if googleapi.IsNotModified(err) { - log.Printf("Instance not modified since insert.") - } else { - log.Printf("Instance modified since insert.") - } - -} -func getPublicIPFromInstance(instance *compute.Instance) { - fmt.Println("network Interface : ", instance.NetworkInterfaces[0].AccessConfigs[0].Name) -} -func getPublicIP(ctx context.Context, service *compute.Service, region string, publicNm string, conf Config) { - info, err := service.Addresses.Get(conf.ProjectID, region, publicNm).Do() - if err != nil { - log.Fatal(err) - } - - infoByte, err := info.MarshalJSON() - var result map[string]interface{} - - fmt.Println("infoByte : ", string(infoByte)) - if err != nil { - log.Fatal(err) - } - - var publicInfo PublicIPInfo - err = json.Unmarshal(infoByte, &publicInfo) - //key value 담아서 넣기 - json.Unmarshal(infoByte, &result) - var keyValueList []KeyValue - for k, v := range result { - fmt.Println("key : ", k) - fmt.Println("value : ", v) - keyValueList = append(keyValueList, KeyValue{k, v.(string)}) - } - fmt.Println("KeyValueList : ", keyValueList) - fmt.Println("publicInfo addressip : ", publicInfo.Address) - - //getkeyvaluelist test - kl := GetKeyValueList(result) - fmt.Println("GetKeyValueList : ", kl) - getValue := GetKeyValue(kl, "address") - fmt.Println("getValue :", getValue) - if users := info.Users; users != nil { - vmArr := strings.Split(users[0], "/") - publicInfo.InstanceId = vmArr[len(vmArr)-1] - } - - if err != nil { - log.Fatal(err) - } - - fmt.Println("publicInfo : ", publicInfo) - -} -func GetKeyValueList(i map[string]interface{}) []KeyValue { - var keyValueList []KeyValue - for k, v := range i { - keyValueList = append(keyValueList, KeyValue{k, v.(string)}) - fmt.Println("getKeyValueList : ", keyValueList) - } - - return keyValueList -} - -func GetKeyValue(keyValusList []KeyValue, key string) interface{} { - var getValue string - for _, v := range keyValusList { - fmt.Println(v.Key) - if v.Key != "" && v.Key == key { - getValue = v.Value - return getValue - } - } - return nil -} - -func getInstance(ctx context.Context, service *compute.Service, zone string, instanceName string, conf Config) *compute.Instance { - /// ctx := context.Background() - inst, err := service.Instances.Get(conf.ProjectID, zone, instanceName).Context(ctx).Do() - //log.Printf("Got compute.Instance, err: %#v, %v", inst, err) - if err != nil { - log.Fatal(err) - } - js, err := inst.MarshalJSON() - if err != nil { - log.Fatal(err) - } - - fmt.Println("get Instance Marshal Json : ", string(js)) - fmt.Println("Instance status :", inst.Status) - - return inst -} - -func stopVM(ctx context.Context, service *compute.Service, zone string, instanceName string, conf Config) (string, error) { - // ctx := context.Background() - - inst, err := service.Instances.Stop(conf.ProjectID, zone, instanceName).Context(ctx).Do() - if err != nil { - log.Fatal(err) - } - js, err := inst.MarshalJSON() - fmt.Println("Instance marshaljson :", string(js)) - log.Printf("Instances Stop, err: %#v, %v", inst, err) - fmt.Println("Instance Status :", inst.Status) - return inst.Status, err -} - -func startVM(ctx context.Context, service *compute.Service, zone string, instanceName string, conf Config) (string, error) { - - getInst := getInstance(ctx, service, zone, instanceName, conf) - - if getInst.Status == "TERMINATED" { - fmt.Println("터미네이터 이다.") - } - - inst, err := service.Instances.Start(conf.ProjectID, zone, instanceName).Context(ctx).Do() - js, err := inst.MarshalJSON() - fmt.Println("Instance marshaljson :", string(js)) - log.Printf("StartVM, err: %#v, %v", inst, err) - fmt.Println("Status :", inst.Status) - fmt.Println("VM type : ", reflect.TypeOf(inst)) - return inst.Status, err -} - -func deleteVM(ctx context.Context, service *compute.Service, zone string, instanceName string, conf Config) (string, error) { - //ctx := context.Background() - inst, err := service.Instances.Delete(conf.ProjectID, zone, instanceName).Context(ctx).Do() - js, err := inst.MarshalJSON() - fmt.Println("Instance marshaljson :", string(js)) - log.Printf("StartVM, err: %#v, %v", inst, err) - fmt.Println("Status :", inst.Status) - fmt.Println("VM type : ", reflect.TypeOf(inst)) - return inst.Status, err -} - -func rebootVM(ctx context.Context, service *compute.Service, zone string, instanceName string, conf Config) (string, error) { - //ctx := context.Background() - st, err := stopVM(ctx, service, zone, instanceName, conf) - if err != nil { - log.Fatal(err) - } - - return st, err -} - -func ListPublicIP(ctx context.Context, service *compute.Service, conf Config, region string) (string, string) { - list, err := service.Addresses.List(conf.ProjectID, region).Context(ctx).Do() - listInfo, err := list.MarshalJSON() - if err != nil { - log.Fatal(err) - } - - var result map[string]interface{} - json.Unmarshal(listInfo, &result) - - fmt.Println("ListPublicIP Info : ", result) - // fmt.Println("ListPublicIP[0] Name : ", list.Items[0].Name) - // fmt.Println("ListPublicIP[0] Address : ", list.Items[0].Address) - //log.Printf("getGlovalAddressList, err: %#v, %v", list, err) - var publicInfoArr []*PublicIPInfo - - var rejson map[string]interface{} - for _, item := range list.Items { - // fmt.Println("index : ", index) - fmt.Println("item : ", item) - var publicIPInfos PublicIPInfo - publicIPInfos.Name = item.Name - publicIPInfos.Id = strconv.FormatUint(item.Id, 10) - publicIPInfos.Region = item.Region - publicIPInfos.CreationTimestamp = item.CreationTimestamp - publicIPInfos.Address = item.Address - publicIPInfos.NetworkTier = item.Network - if user := item.Users; user != nil { - publicIPInfos.InstanceId = user[0] - } - - it := item - fmt.Println("it :", it) - // bts := json.Marshal(it) - // json.Unmarshal(bts, &rejson) - // publicIPInfos[index].InstanceId = item.Users[0] - publicIPInfos.Status = item.Status - publicInfoArr = append(publicInfoArr, &publicIPInfos) - - } - - fmt.Println("rejson : ", rejson) - // for _, st := range publicIPInfos { - - // if st.Status == "RESERVED" { - // fmt.Println(st.Status) - // } - // } - fmt.Println("publicInfos Arr : ", publicInfoArr) - name := list.Items[0].Name - address := list.Items[0].Address - return name, address -} -func getGlobalAddressList(ctx context.Context, service *compute.Service, config Config) { - - list, err := service.GlobalAddresses.List(config.ProjectID).Context(ctx).Do() - log.Printf("getGlovalAddressList, err: %#v, %v", list, err) - -} - -func readFileConfig(filepath string) (Config, error) { - - data, err := ioutil.ReadFile(filepath) - if err != nil { - panic(err) - } - - var config Config - json.Unmarshal(data, &config) - fmt.Println("readFileConfig Json : ", config.ClientEmail) - - return config, err - -} - -func connect(filePath string) *compute.Service { - gcpType := "service_account" - clientEmail := "675581125193-compute@developer.gserviceaccount.com" - privateKey := "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCT+RlOV3L1si2q\npcjZj7jx+6MU24GjyDOjCL4Lo67scAP5QWHePzvqndIQzN1LqLeIJVtcYKLEzwER\nvM0wSzCnW768k9ek+Rpfu5znbas7wF9p36v9Z0qL3BaimkRxSb1kI6ENz7qbM/EY\nepS3do+G2+GeOKEA4JfAhGVQiit0EUEKQ1m7WB2izobjkgCZooaGt1suapG3VUzN\n8PYmn6mB0+Ls21TO/wTGZEhTkBzUN1S0+bc4Wum8M93mJ3n2VouGu6xXaqXgDdIu\nZZDqPdWGDvXzEBvk/4imtBt7+Chs4J9dvk48e0B4rvFx4H8HBWA6oFysZgwZkR51\nupf8WKxxAgMBAAECggEAMaVNnD8yzsQtFifxLy1NO8LVgFX1NOIikPyJ5pXQRnt+\nmc4Z69sDW0AADqrtREki6oa+FExH0Agzr6PMo/tWI5BgehyQKUV6V8w2ZF8jKDTu\nzjLBHY/eLvZ0kbF4bRn0dPiPPHcJgLD4nuHhq3wXw4NaOx98xTKVN340D8WLtrDg\nmrFnytZNyRqS/eHbNQtOWclMffbdA6hDJBBUA/J7bWnSkcjg+lccO+zs+yZgJ5wr\nKiN83dgXORimbjUWcdNnxoSC7HfgqmqziYg1s1MrdlVe9eL8fMi1Pz9jUnZwtk0D\nzJKDp8xbEsX4AXOHJK2KMsy3zJvUfgRH+J+L0ytPUQKBgQDI6UlaTTh4MRCgsVPr\n8yjiseCrAwXlxDyVX1Oy1ud5lkW1VvmxTs0KN8DScCj4jkXWKct2mh77v6Wg81MU\nxuUF8nC4bSYfLtahMmcaCN2Ccad4QaWGnEmKit6apOW+HbgU2i8pBvmcvv9JvJ59\n+p8jOKa/e9aVoY4zCNwxGXFYiwKBgQC8i+E9XdiSZ1ownHXz+GkdRoWsx0X+Tdkp\nS0XxEGaORh8DfXAo73O08eoBOjftS+aQfj/qEu31JQb0i07qZAAaZbf1WO8aG97G\n8JZLV5Aez0iNiSgNZJfKgjxlG+IVlpP0oWJXbpomIkWsjuONLYDX5f+jUlQeYb3U\n97O83wBycwKBgFr2hGeGHtMMI+MdZkmlxhUdRAMpUzo8JtHaXyLReevqxZTc1CAa\n9Wpy47JjZaljgOr98Ui5bt28X1kH0c3OX1LZ+X8GrAPiSPqiv1tiOCgfHRutXSwd\nBo7bYP3TOtFg0z9dqYyBw/Hb5+mSpI+VMQfZVmXLw9PrWV5x3H++bTsRAoGAKtOC\n99NnK+n53GzNhfr4tUOdfV9OELNSDkUgv96/zLU0ujA117Z8C6+fPWQh6+5/knZ6\nwgpGrpYYfFdgN3E7bMOKA1qOBNorwfhHyxk6jST8D9oFlPUyXTczzKuGsOyg8sHt\nenqO3PaP6OAT469gQqnlZQ2AOd5tpgAVfWMR0O0CgYBPJ6DSGlGlzCHpqpg2JGzO\nn3kXVxVvQA58cfZWz7hzmjyJr9B2bPFfeSidLJEBHjujW28663+9NVp7xwZRotir\nFw8k3/z97EKadjrvZB6m2CPS7NFFWDgDqSPz1YyNYxGyJynT5GIKpLFdqcMMc9Bk\nT9NsVtofa1Iu7Vos4vd+NA==\n-----END PRIVATE KEY-----\n" - data := make(map[string]string) - data["type"] = gcpType - data["private_key"] = privateKey - data["client_email"] = clientEmail - - res, err := json.Marshal(data) - - dt, err := ioutil.ReadFile(filePath) - - if err != nil { - log.Fatal(err) - } - fmt.Println(dt) - // s := string(data) - // d := []byte(s) - conf, err := google.JWTConfigFromJSON(res, "https://www.googleapis.com/auth/compute") - if err != nil { - log.Fatal(err) - } - - fmt.Println("Connection Success : ", reflect.TypeOf(res)) - - client := conf.Client(oauth2.NoContext) - - computeService, err := compute.New(client) - - return computeService - -} - -func CreatePublicIP(ctx context.Context, service *compute.Service, name string, region string, conf Config) { - address := &compute.Address{ - Name: name, - } - info, err := service.Addresses.Insert(conf.ProjectID, region, address).Context(ctx).Do() - if err != nil { - log.Fatal(err) - } - infoJson, err := info.MarshalJSON() - if err != nil { - log.Fatal(err) - } - fmt.Println("createPublicIP Info : ", string(infoJson)) - time.Sleep(time.Second * 3) - - getPublicIP(ctx, service, region, name, conf) - -} - -func ListVM(ctx context.Context, service *compute.Service, zone string, conf Config) []byte { - list, err := service.Instances.List(conf.ProjectID, zone).Do() - if err != nil { - log.Fatal(err) - } - - listJson, err := list.MarshalJSON() - if err != nil { - log.Fatal(err) - } - - fmt.Println("List Vm : ", string(listJson)) - - return listJson -} - -func ListImage(ctx context.Context, service *compute.Service, conf Config) []byte { - projectID := conf.ProjectID - list, err := service.Images.List(projectID).Do() - log.Printf("Got compute.Images.List, err: %#v, %v", list, err) - req := service.Images.List(projectID) - if err := req.Pages(ctx, func(page *compute.ImageList) error { - for i, image := range page.Items { - // TODO: Change code below to process each `image` resource: - fmt.Printf("get ImagetList : %#v\n", image, i) - } - return nil - }); err != nil { - log.Fatal(err) - } - - if err != nil { - log.Fatal(err) - } - - imageListJson, err := list.MarshalJSON() - if err != nil { - log.Fatal(err) - } - - fmt.Println("List Vm : ", string(imageListJson)) - - return imageListJson -} - -func createVnet(ctx context.Context, service *compute.Service, conf Config, name string) { - network := &compute.Network{ - Name: name, - AutoCreateSubnetworks: true, - } - - res, err1 := service.Networks.Insert(conf.ProjectID, network).Context(ctx).Do() - if err1 != nil { - fmt.Println("create vnet error") - log.Fatal(err1) - } - fmt.Println("result", res) - time.Sleep(time.Second * 15) - info, err2 := service.Networks.Get(conf.ProjectID, name).Context(ctx).Do() - if err2 != nil { - fmt.Println("Get Vnetwork error") - log.Fatal(err2) - } - - js, _ := info.MarshalJSON() - fmt.Println("getVnet : ", string(js)) - -} - -func getVnet(ctx context.Context, service *compute.Service, conf Config, name string) { - info, err2 := service.Networks.Get(ProjectID, name).Context(ctx).Do() - if err2 != nil { - fmt.Println("Get Vnetwork error") - log.Fatal(err2) - } - - js, _ := info.MarshalJSON() - fmt.Println("getVnet : ", string(js)) -} - -func getFireWall(service *compute.Service, name string) { - - security, err := service.Firewalls.Get(ProjectID, name).Do() - if err != nil { - log.Fatal(err) - - } - - // //전부 keyvalue 저장 - // var result map[string]interface{} - // var keyValueList []KeyValue - // security.Id = strconv.FormatUint(security.Id, 10) - mjs, _ := security.MarshalJSON() - fmt.Println(string(mjs)) - //json.Unmarshal(mjs, &result) - - // for k, v := range result { - // keyValueList = append(keyValueList, KeyValue{ - // Key: k, Value: v.(string), - // }) - // } - // fmt.Println(result) - // var securityRules irs.SecurityRuleInfogi - // securityInfo := irs.SecurityInfo{ - // Id: strconv.FormatUint(security.Id,10), - // Name: security.Name, - // KeyValueList: keyValueList, - - // } - -} - -func createFireWall(securityReqInfo SecurityReqInfo, service *compute.Service) { - ports := *securityReqInfo.SecurityRules - fmt.Println("ports : ", ports) - var firewallAllowed []*compute.FirewallAllowed - - // fmt.Println(reflect.TypeOf(t)) - // t = append(t, &compute.FirewallAllowed{ - // IPProtocol: "tcp", - // }) - - // fmt.Println(t) - // for _, item := range ports { - // var port string - // fp := item.FromPort - // tp := item.ToPort - - // if tp != "" && fp != "" { - // port = fp + "-" + tp - // } - // if tp != "" && fp == "" { - // port = tp - // } - // if tp == "" && fp != "" { - // port = fp - // } - // // if tp == "" && fp == "" { - // // port = "" - // // } - // fmt.Println(port) - // t = append(t, &compute.FirewallAllowed{ - // IPProtocol: item.IPProtocol, - // Ports: []string{port}, - // }) - // } - // fmt.Println(t[0]) - - for _, item := range ports { - var port string - fp := item.FromPort - tp := item.ToPort - - if tp != "" && fp != "" { - port = fp + "-" + tp - } - if tp != "" && fp == "" { - port = tp - } - if tp == "" && fp != "" { - port = fp - } - - firewallAllowed = append(firewallAllowed, &compute.FirewallAllowed{ - IPProtocol: item.IPProtocol, - Ports: []string{ - port, - }, - }) - } - fireWall := &compute.Firewall{ - Allowed: firewallAllowed, - Direction: securityReqInfo.Direction, //INGRESS(inbound), EGRESS(outbound) - SourceRanges: []string{ - "0.0.0.0/0", - }, - Name: securityReqInfo.Name, - } - - res, err := service.Firewalls.Insert(ProjectID, fireWall).Do() - if err != nil { - log.Fatal(err) - } - fmt.Println("create result : ", res) -} -func getVNic(service *compute.Service) { - res, err := service.Instances.Get(ProjectID, "asia-northeast1-b", "2578782397763975033").Do() - if err != nil { - log.Fatal(err) - } - networkInfo := mappingNetworkInfo(res) - spew.Dump(networkInfo) - fmt.Println("networkInfo : ", networkInfo) -} -func listVNic(service *compute.Service) { - - res, err := service.Instances.List(ProjectID, "asia-northeast1-b").Do() - if err != nil { - log.Fatal(err) - } - var vNicInfo []*VNicInfo - for _, item := range res.Items { - info := mappingNetworkInfo(item) - vNicInfo = append(vNicInfo, &info) - } - spew.Dump(vNicInfo) - fmt.Println("networkInfo : ", vNicInfo) - -} -func mappingNetworkInfo(res *compute.Instance) VNicInfo { - netWorkInfo := VNicInfo{ - Id: strconv.FormatUint(res.Id, 10), - Name: res.NetworkInterfaces[0].Name, - PublicIP: res.NetworkInterfaces[0].AccessConfigs[0].NatIP, - OwnedVMID: strconv.FormatUint(res.Id, 10), - Status: res.Status, //nic 상태를 알 수 있는 것이 없어서 Instance의 상태값을 가져다 넣어줌 - KeyValueList: []KeyValue{ - {"Network", res.NetworkInterfaces[0].Network}, - {"NetworkIP", res.NetworkInterfaces[0].NetworkIP}, - {"PublicIPName", res.NetworkInterfaces[0].AccessConfigs[0].Name}, - {"NetworkTier", res.NetworkInterfaces[0].AccessConfigs[0].NetworkTier}, - {"Network", res.NetworkInterfaces[0].Network}, - }, - } - - return netWorkInfo - -} -func main() { - credentialFilePath := os.Getenv("GOOGLE_APPLICATION_CREDENTIALS") - //config, _ := readFileConfig(credentialFilePath) - - // securityReq := SecurityReqInfo{ - // Name: "firewalltest", - // Direction: "INGRESS", - // SecurityRules: &[]SecurityRuleInfo{ - // {FromPort: "22", ToPort: "25", IPProtocol: "tcp"}, - // {FromPort: "65234", ToPort: "", IPProtocol: "udp"}, - // }, - // } - - client := connect(credentialFilePath) - //createFireWall(securityReq, client) - //getVNic(client) - listVNic(client) - //zone := "asia-northeast1-b" - //instanceName := "cscmcloud" - //diskname := "mzcsc21" - //region := "asia-northeast1" - //ctx := context.Background() - - // getFireWall(client, "firewall1") - // fmt.Println(reflect.TypeOf(client)) - // fmt.Println("config Project ID : ", config.ProjectID) - - //createInstance(client, config, zone, instanceName, diskname) - //instance := getInstance(ctx, client, zone, instanceName, config) - //fmt.Println("output instance : ", instance) - //getInstance(ctx, client, zone, instanceName, config) - //stopVM(ctx, client, zone, instanceName, config) - //startVM(ctx, client, zone, instanceName, config) - //getGlobalAddressList(ctx, client, config) - //getPublicIP(ctx, client, region, "natip", config) - //CreatePublicIP(ctx, client, "publicip6", region, config) - //getPublicIP(ctx, client, region, "publicip6", config) - // name, address := ListPublicIP(ctx, client, config, region) - // fmt.Println("output name : ", name) - // fmt.Println("output address : ", address) - //createVnet(ctx, client, config, "mynetwork2") - //getVnet(ctx, client, config, "test1") - //getVMlist := ListVM(ctx, client, zone, config) - //fmt.Println("getVMList : ", string(getVMlist)) - //getImagelist := ListImage(ctx, client, config) - //fmt.Println("getVMList : ", string(getImagelist)) - -} diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/main/old/key.go b/cloud-control-manager/cloud-driver/drivers/gcp/main/old/key.go deleted file mode 100644 index 4716ec2a4..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/main/old/key.go +++ /dev/null @@ -1,121 +0,0 @@ -package main - -import ( - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/asn1" - "encoding/gob" - "encoding/pem" - "fmt" - "io/ioutil" - "log" - "os" - - "golang.org/x/crypto/ssh" -) - -func main() { - reader := rand.Reader - bitSize := 2048 - fmt.Println("reader : ", reader) - key, err := rsa.GenerateKey(reader, bitSize) - checkError(err) - - publicKey, err := generatePublicKey(&key.PublicKey) - if err != nil { - log.Fatal(err) - } - pubstr := string(publicKey) - byteUser := []byte("cscservice") - fmt.Println("byteUser :", byteUser) - pubstr = pubstr + "cscservice" - publicKey = append(publicKey, byteUser...) - fmt.Println("public key :", string(publicKey)) - - fmt.Println("public key :", []byte(pubstr)) - err = writeKeyToFile([]byte(pubstr)) - // //("private.key", key) - // savePEMKey("private.pem", key) - - //saveGobKey("public.key", publicKey) - //savePublicPEMKey("public.pem", key.PublicKey) - // username := "cscservice" - // cmdStr := `ssh-keygen -t rsa -f ./gce-vm-key -q -N "" -C ` + username - // fmt.Println(cmdStr) - // path, _ := os.Getwd() - // cmd := exec.Command(path, cmdStr) - // err = cmd.Run() - // log.Fatal(err) - -} -func generatePublicKey(privatekey *rsa.PublicKey) ([]byte, error) { - publicRsaKey, err := ssh.NewPublicKey(privatekey) - if err != nil { - return nil, err - } - - pubKeyBytes := ssh.MarshalAuthorizedKey(publicRsaKey) - - log.Println("Public key 생성") - //fmt.Println(pubKeyBytes) - return pubKeyBytes, nil -} -func saveGobKey(fileName string, key interface{}) { - outFile, err := os.Create(fileName) - checkError(err) - defer outFile.Close() - - encoder := gob.NewEncoder(outFile) - err = encoder.Encode(key) - checkError(err) -} - -func savePEMKey(fileName string, key *rsa.PrivateKey) { - outFile, err := os.Create(fileName) - checkError(err) - defer outFile.Close() - - var privateKey = &pem.Block{ - Type: "PRIVATE KEY", - Bytes: x509.MarshalPKCS1PrivateKey(key), - } - - err = pem.Encode(outFile, privateKey) - checkError(err) -} - -func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) { - asn1Bytes, err := asn1.Marshal(pubkey) - checkError(err) - - var pemkey = &pem.Block{ - Type: "PUBLIC KEY", - Bytes: asn1Bytes, - } - - pemfile, err := os.Create(fileName) - checkError(err) - defer pemfile.Close() - - err = pem.Encode(pemfile, pemkey) - checkError(err) -} -func writeKeyToFile(keyBytes []byte) error { - saveFileTo, _ := os.Getwd() - - err := ioutil.WriteFile(saveFileTo+"/gcp-key", keyBytes, 0600) - if err != nil { - return err - } - - log.Printf("Key 저장위치: %s", saveFileTo) - return nil -} - -func checkError(err error) { - if err != nil { - fmt.Println("Fatal error ", err.Error()) - os.Exit(1) - } -} diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/PublicIPHandler.go.del b/cloud-control-manager/cloud-driver/drivers/gcp/resources/PublicIPHandler.go.del deleted file mode 100644 index 350521946..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/PublicIPHandler.go.del +++ /dev/null @@ -1,182 +0,0 @@ -// Proof of Concepts of CB-Spider. -// The CB-Spider is a sub-Framework of the Cloud-Barista Multi-Cloud Project. -// The CB-Spider Mission is to connect all the clouds with a single interface. -// -// * Cloud-Barista: https://github.com/cloud-barista -// -// This is a Cloud Driver Example for PoC Test. -// -// program by ysjeon@mz.co.kr, 2019.07. -// modify by devunet@mz.co.kr, 2019.11. - -package resources - -import ( - "context" - "encoding/json" - "fmt" - "strconv" - "strings" - "time" - - 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" - compute "google.golang.org/api/compute/v1" -) - -type GCPPublicIPHandler struct { - Region idrv.RegionInfo - Ctx context.Context - Client *compute.Service - Credential idrv.CredentialInfo -} - -//GCP에서 PublicIP를 변경하려 할때 deleteaccessConfig => addAccessconfig 이때 넣어줘야 할 값은 -// natIp, NetworkTier 이 2개를 추가 해 줘야 하며 -// 추가 또는 삭제 시에는 networkInterface Name, zone, instananceName, projectId, accessConfig Name 등을 알아야 한다. - -func (publicIpHandler *GCPPublicIPHandler) CreatePublicIP(publicIPReqInfo irs.PublicIPReqInfo) (irs.PublicIPInfo, error) { - cblogger.Info(publicIPReqInfo) - - projectID := publicIpHandler.Credential.ProjectID - region := publicIpHandler.Region.Region - publicIpName := publicIPReqInfo.Name - address := &compute.Address{ - Name: publicIpName, - } - - result, errInsert := publicIpHandler.Client.Addresses.Insert(projectID, region, address).Do() - if errInsert != nil { - cblogger.Error("PublicIp 생성 실패1!") - cblogger.Error(errInsert) - return irs.PublicIPInfo{}, errInsert - } - cblogger.Info("PublicIP 생성 요청 성공 - 정보 조회를 위해 3초간 대기") - cblogger.Info(result) - time.Sleep(time.Second * 3) - - publicIPInfo, err := publicIpHandler.GetPublicIP(publicIpName) - if err != nil { - cblogger.Error("PublicIp 생성 실패!") - cblogger.Error(err) - return irs.PublicIPInfo{}, err - } - cblogger.Info(publicIPInfo) - - return publicIPInfo, nil -} - -func (publicIpHandler *GCPPublicIPHandler) ListPublicIP() ([]*irs.PublicIPInfo, error) { - projectID := publicIpHandler.Credential.ProjectID - region := publicIpHandler.Region.Region - - list, err := publicIpHandler.Client.Addresses.List(projectID, region).Do() - spew.Dump(list) - if err != nil { - cblogger.Error(err) - return nil, err - } - - var publicIpInfoArr []*irs.PublicIPInfo - for _, item := range list.Items { - var publicInfo irs.PublicIPInfo - publicInfo.Name = item.Name - publicInfo.PublicIP = item.Address - publicInfo.Status = item.Status - //publicInfo.KeyValueList = GetKeyValueList() - if users := item.Users; users != nil { - vmArr := strings.Split(users[0], "/") - publicInfo.OwnedVMID = vmArr[len(vmArr)-1] - } - keyValueList := []irs.KeyValue{ - {"id", strconv.FormatUint(item.Id, 10)}, - {"creationTimestamp", item.CreationTimestamp}, - {"region", item.Region}, - {"selfLink", item.SelfLink}, - {"networkTier", item.NetworkTier}, - {"addressType", item.AddressType}, - {"kind", item.Kind}, - } - publicInfo.KeyValueList = keyValueList - - publicIpInfoArr = append(publicIpInfoArr, &publicInfo) - - } - return publicIpInfoArr, nil -} - -func (publicIpHandler *GCPPublicIPHandler) GetPublicIP(publicIPID string) (irs.PublicIPInfo, error) { - cblogger.Infof("publicIPID : [%s]", publicIPID) - projectID := publicIpHandler.Credential.ProjectID - region := publicIpHandler.Region.Region - name := publicIPID // name or resource ID - - info, err := publicIpHandler.Client.Addresses.Get(projectID, region, name).Do() - //cblogger.Info(info) - spew.Dump(info) - if err != nil { - cblogger.Error("PublicIP 정보 조회 실패") - cblogger.Error(err) - return irs.PublicIPInfo{}, err - } - cblogger.Infof("PublicIP[%s] 정보 조회 API 응답 수신", publicIPID) - - //바인딩 하기위해 []byte로 변환 처리 - infoByte, err2 := info.MarshalJSON() - cblogger.Info(infoByte) - //spew.Dump(infoByte) - if err2 != nil { - cblogger.Error("JSON 변환 실패") - cblogger.Error(err2) - return irs.PublicIPInfo{}, err2 - } - - var publicInfo irs.PublicIPInfo - var keyValueList []irs.KeyValue - - publicInfo.Name = info.Name - publicInfo.PublicIP = info.Address - if users := info.Users; users != nil { - vmArr := strings.Split(users[0], "/") - publicInfo.OwnedVMID = vmArr[len(vmArr)-1] - } - publicInfo.Status = info.Status - - // 구조체 안에 해당값을 바인딩해준다. - var result map[string]interface{} - - json.Unmarshal(infoByte, &result) - //spew.Dump(result) - //cblogger.Info(result) - - keyValueList = GetKeyValueList(result) - // for key, value := range result { - // keyValueList = append(keyValueList, irs.KeyValue{key, value}) - // } - - publicInfo.KeyValueList = keyValueList - return publicInfo, nil -} - -func (publicIpHandler *GCPPublicIPHandler) DeletePublicIP(publicIPID string) (bool, error) { - projectID := publicIpHandler.Credential.ProjectID - region := publicIpHandler.Region.Region - name := publicIPID // name or resource ID - - info, err := publicIpHandler.Client.Addresses.Delete(projectID, region, name).Do() - if err != nil { - cblogger.Error(err) - return false, err - } - fmt.Println(info) - - return true, nil -} - -// func (*GCPPublicIPHandler) mappingPublicIpInfo(infos []byte) (irs.PublicIPInfo, error) { -// var publicInfo irs.PublicIPInfo -// err := json.Unmarshal(infos, &publicInfo) - -// return publicInfo -// } diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VNetworkHandler.go.del b/cloud-control-manager/cloud-driver/drivers/gcp/resources/VNetworkHandler.go.del deleted file mode 100644 index 3c309c7e2..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VNetworkHandler.go.del +++ /dev/null @@ -1,239 +0,0 @@ -// Proof of Concepts of CB-Spider. -// The CB-Spider is a sub-Framework of the Cloud-Barista Multi-Cloud Project. -// The CB-Spider Mission is to connect all the clouds with a single interface. -// -// * Cloud-Barista: https://github.com/cloud-barista -// -// This is a Cloud Driver Example for PoC Test. -// -// program by ysjeon@mz.co.kr, 2019.07. -// modify by devunet@mz.co.kr, 2019.11. - -package resources - -import ( - "context" - "errors" - "strconv" - - compute "google.golang.org/api/compute/v1" - - "time" - - 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" -) - -type GCPVNetworkHandler struct { - Region idrv.RegionInfo - Ctx context.Context - Client *compute.Service - Credential idrv.CredentialInfo -} - -func (vNetworkHandler *GCPVNetworkHandler) CreateVNetwork(vNetworkReqInfo irs.VNetworkReqInfo) (irs.VNetworkInfo, error) { - cblogger.Info(vNetworkReqInfo) - - var cnt string - isFirst := false - - projectID := vNetworkHandler.Credential.ProjectID - region := vNetworkHandler.Region.Region - name := GetCBDefaultVNetName() - - cblogger.Infof("생성된 [%s] VNetwork가 있는지 체크", name) - vNetInfo, errVnet := vNetworkHandler.Client.Networks.Get(projectID, name).Do() - spew.Dump(vNetInfo) - if errVnet != nil { - isFirst = true - cblogger.Error(errVnet) - - cblogger.Infof("존재하는 [%s] VNetwork가 없으므로 새로 생성해야 함", name) - network := &compute.Network{ - Name: name, - //Name: GetCBDefaultVNetName(), - AutoCreateSubnetworks: true, // subnet 자동으로 생성됨 - } - - cblogger.Infof("[%s] VNetwork 생성 시작", name) - cblogger.Info(network) - _, err := vNetworkHandler.Client.Networks.Insert(projectID, network).Do() - if err != nil { - cblogger.Errorf("[%s] VNetwork 생성 실패", name) - cblogger.Error(err) - return irs.VNetworkInfo{}, errVnet - } - - cblogger.Infof("[%s] VNetwork 정상적으로 생성되고 있습니다.", name) - before_time := time.Now() - max_time := 120 - - // loop --> 생성 check --> 생성 되었으면, break; 안됐으면 sleep 5초 --> - // if(total sleep 120sec?) error - - cblogger.Info("VNetwork가 모두 생성될 때까지 5초 텀으로 체크 시작") - for { - cblogger.Infof("==> [%s] VNetwork 정보 조회", name) - _, errVnet := vNetworkHandler.Client.Networks.Get(projectID, name).Do() - if errVnet != nil { - cblogger.Errorf("==> [%s] VNetwork 정보 조회 실패", name) - cblogger.Error(errVnet) - - time.Sleep(time.Second * 5) - after_time := time.Now() - diff := after_time.Sub(before_time) - if int(diff.Seconds()) > max_time { - cblogger.Errorf("[%d]초 동안 [%s] VNetwork 정보가 조회되지 않아서 강제로 종료함.", max_time, name) - return irs.VNetworkInfo{}, errVnet - } - } else { - //생성된 VPC와 서브넷 이름이 동일하지 않으면 VPC의 기본 서브넷이 모두 생성될 때까지 20초 정도 대기 - //if name != vNetworkReqInfo.Name { - cblogger.Info("생성된 VNetwork정보가 조회되어도 리전에서는 계속 생성되고 있기 때문에 20초 대기") - time.Sleep(time.Second * 20) - //} - - cblogger.Infof("==> [%s] VNetwork 정보 생성 완료", name) - //서브넷이 비동기로 생성되고 있기 때문에 다시 체크해야 함. - newvNetInfo, _ := vNetworkHandler.Client.Networks.Get(projectID, name).Do() - cnt = strconv.Itoa(len(newvNetInfo.Subnetworks) + 1) - break - } - } - } else { - cblogger.Infof("이미 [%s] VNetworks가 존재함.", name) - cnt = strconv.Itoa(len(vNetInfo.Subnetworks) + 1) - } - - cblogger.Info("현재 생성된 서브넷 수 : ", cnt) - cblogger.Infof("생성할 [%s] Subnet이 존재하는지 체크", vNetworkReqInfo.Name) - - subnetInfo, errSubnet := vNetworkHandler.GetVNetwork(vNetworkReqInfo.Name) - if errSubnet == nil { - spew.Dump(subnetInfo) - //최초 생성인 경우 VNetwork와 Subnet 이름이 동일하면 이미 생성되었으므로 추가로 생성하지 않고 리턴 함. - if isFirst { - cblogger.Error("최초 VNetwork 생성이므로 에러 없이 조회된 서브넷 정보를 리턴 함.") - return subnetInfo, nil - } else { - cblogger.Error(errSubnet) - return irs.VNetworkInfo{}, errors.New("Already Exist - " + vNetworkReqInfo.Name) - } - } - - // vNetResult, _ := vNetworkHandler.ListVNetwork() - - networkUrl := "https://www.googleapis.com/compute/v1/projects/" + projectID + "/global/networks/" + name - subnetWork := &compute.Subnetwork{ - Name: vNetworkReqInfo.Name, - IpCidrRange: "192.168." + cnt + ".0/24", - Network: networkUrl, - } - cblogger.Infof("[%s] Subnet 생성시작", vNetworkReqInfo.Name) - cblogger.Info(subnetWork) - res, err := vNetworkHandler.Client.Subnetworks.Insert(projectID, region, subnetWork).Do() - if err != nil { - cblogger.Error("Subnet 생성 실패") - cblogger.Error(err) - return irs.VNetworkInfo{}, err - } - cblogger.Infof("[%s] Subnet 생성완료", vNetworkReqInfo.Name) - cblogger.Info(res) - - //생성되는데 시간이 필요 함. 약 20초정도? - //time.Sleep(time.Second * 20) - - info, err2 := vNetworkHandler.Client.Subnetworks.Get(projectID, region, vNetworkReqInfo.Name).Do() - if err2 != nil { - cblogger.Error(err2) - return irs.VNetworkInfo{}, err2 - } - networkInfo := irs.VNetworkInfo{ - Name: info.Name, - Id: strconv.FormatUint(info.Id, 10), - AddressPrefix: info.IpCidrRange, - KeyValueList: []irs.KeyValue{ - {"SubnetId", info.Name}, - {"Region", info.Region}, - {"GatewayAddress", info.GatewayAddress}, - {"SelfLink", info.SelfLink}, - }, - } - - return networkInfo, nil -} - -func (vNetworkHandler *GCPVNetworkHandler) ListVNetwork() ([]*irs.VNetworkInfo, error) { - projectID := vNetworkHandler.Credential.ProjectID - region := vNetworkHandler.Region.Region - - vNetworkList, err := vNetworkHandler.Client.Subnetworks.List(projectID, region).Do() - if err != nil { - - return nil, err - } - var vNetworkInfo []*irs.VNetworkInfo - for _, item := range vNetworkList.Items { - networkInfo := irs.VNetworkInfo{ - Name: item.Name, - Id: strconv.FormatUint(item.Id, 10), - AddressPrefix: item.IpCidrRange, - KeyValueList: []irs.KeyValue{ - {"SubnetId", item.Name}, - {"Region", item.Region}, - {"GatewayAddress", item.GatewayAddress}, - {"SelfLink", item.SelfLink}, - }, - } - - vNetworkInfo = append(vNetworkInfo, &networkInfo) - - } - - return vNetworkInfo, nil -} - -func (vNetworkHandler *GCPVNetworkHandler) GetVNetwork(vNetworkID string) (irs.VNetworkInfo, error) { - - projectID := vNetworkHandler.Credential.ProjectID - region := vNetworkHandler.Region.Region - //name := vNetworkID - name := GetCBDefaultVNetName() - cblogger.Infof("Name : [%s] / Subnet : [%s]", name, vNetworkID) - info, err := vNetworkHandler.Client.Subnetworks.Get(projectID, region, vNetworkID).Do() - if err != nil { - cblogger.Error(err) - return irs.VNetworkInfo{}, err - } - - networkInfo := irs.VNetworkInfo{ - Name: info.Name, - Id: strconv.FormatUint(info.Id, 10), - AddressPrefix: info.IpCidrRange, - KeyValueList: []irs.KeyValue{ - {"SubnetId", info.Name}, - {"Region", info.Region}, - {"GatewayAddress", info.GatewayAddress}, - {"SelfLink", info.SelfLink}, - }, - } - - return networkInfo, nil -} - -func (vNetworkHandler *GCPVNetworkHandler) DeleteVNetwork(vNetworkID string) (bool, error) { - projectID := vNetworkHandler.Credential.ProjectID - region := vNetworkHandler.Region.Region - //name := vNetworkID - name := GetCBDefaultVNetName() - cblogger.Infof("Name : [%s]", name) - info, err := vNetworkHandler.Client.Subnetworks.Delete(projectID, region, vNetworkID).Do() - cblogger.Info(info) - if err != nil { - cblogger.Error(err) - return false, err - } - //fmt.Println(info) - return true, nil -} diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VNicHandler.go.del b/cloud-control-manager/cloud-driver/drivers/gcp/resources/VNicHandler.go.del deleted file mode 100644 index 3a6051289..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VNicHandler.go.del +++ /dev/null @@ -1,107 +0,0 @@ -// Proof of Concepts of CB-Spider. -// The CB-Spider is a sub-Framework of the Cloud-Barista Multi-Cloud Project. -// The CB-Spider Mission is to connect all the clouds with a single interface. -// -// * Cloud-Barista: https://github.com/cloud-barista -// -// This is a Cloud Driver Example for PoC Test. -// -// program by ysjeon@mz.co.kr, 2019.07. -// modify by devunet@mz.co.kr, 2019.11. - -package resources - -import ( - "context" - "errors" - "strconv" - - 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" -) - -// GCP는 networkInterface 를 따로 핸들링 하는 API는 갖고 있지 않다. -// 따라서 Instance에서 추출해서 써야 함. -// securityGroup는 나중에 vnet에 할당 또는 tag를 달아서 태그에 할당하는 형태 -// networkInterface name은 자동으로 생성됨 지정 못함. -type GCPVNicHandler struct { - Region idrv.RegionInfo - Ctx context.Context - Client *compute.Service - Credential idrv.CredentialInfo -} - -func (vNicHandler *GCPVNicHandler) CreateVNic(vNicReqInfo irs.VNicReqInfo) (irs.VNicInfo, error) { - - return irs.VNicInfo{}, errors.New("Unsupported feature.") -} - -func (vNicHandler *GCPVNicHandler) ListVNic() ([]*irs.VNicInfo, error) { - projectId := vNicHandler.Credential.ProjectID - zone := vNicHandler.Region.Zone - res, err := vNicHandler.Client.Instances.List(projectId, zone).Do() - if err != nil { - cblogger.Error(err) - return nil, err - } - - var vNicInfo []*irs.VNicInfo - for _, item := range res.Items { - info := vNicHandler.mappingNetworkInfo(item) - vNicInfo = append(vNicInfo, &info) - } - return vNicInfo, nil -} - -func (vNicHandler *GCPVNicHandler) GetVNic(vNicID string) (irs.VNicInfo, error) { - projectId := vNicHandler.Credential.ProjectID - zone := vNicHandler.Region.Zone - - res, err := vNicHandler.Client.Instances.Get(projectId, zone, vNicID).Do() - if err != nil { - cblogger.Error(err) - return irs.VNicInfo{}, err - } - vNicInfo := irs.VNicInfo{ - Id: strconv.FormatUint(res.Id, 10), - Name: res.NetworkInterfaces[0].Name, - PublicIP: res.NetworkInterfaces[0].AccessConfigs[0].NatIP, - OwnedVMID: strconv.FormatUint(res.Id, 10), - Status: res.Status, //nic 상태를 알 수 있는 것이 없어서 Instance의 상태값을 가져다 넣어줌 - KeyValueList: []irs.KeyValue{ - {"Network", res.NetworkInterfaces[0].Network}, - {"NetworkIP", res.NetworkInterfaces[0].NetworkIP}, - {"PublicIPName", res.NetworkInterfaces[0].AccessConfigs[0].Name}, - {"NetworkTier", res.NetworkInterfaces[0].AccessConfigs[0].NetworkTier}, - {"Network", res.NetworkInterfaces[0].Network}, - }, - } - - return vNicInfo, nil -} - -func (vNicHandler *GCPVNicHandler) DeleteVNic(vNicID string) (bool, error) { - // networkInterface를 삭제 하는 API 및 기능이 없음 - return false, errors.New("Unsupported feature.") -} - -func (*GCPVNicHandler) mappingNetworkInfo(res *compute.Instance) irs.VNicInfo { - netWorkInfo := irs.VNicInfo{ - Id: strconv.FormatUint(res.Id, 10), - Name: res.NetworkInterfaces[0].Name, - PublicIP: res.NetworkInterfaces[0].AccessConfigs[0].NatIP, - OwnedVMID: strconv.FormatUint(res.Id, 10), - Status: res.Status, //nic 상태를 알 수 있는 것이 없어서 Instance의 상태값을 가져다 넣어줌 - KeyValueList: []irs.KeyValue{ - {"Network", res.NetworkInterfaces[0].Network}, - {"NetworkIP", res.NetworkInterfaces[0].NetworkIP}, - {"PublicIPName", res.NetworkInterfaces[0].AccessConfigs[0].Name}, - {"NetworkTier", res.NetworkInterfaces[0].AccessConfigs[0].NetworkTier}, - {"Network", res.NetworkInterfaces[0].Network}, - }, - } - - return netWorkInfo - -} diff --git a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VPCHandler.go.del b/cloud-control-manager/cloud-driver/drivers/gcp/resources/VPCHandler.go.del deleted file mode 100644 index c45960ea7..000000000 --- a/cloud-control-manager/cloud-driver/drivers/gcp/resources/VPCHandler.go.del +++ /dev/null @@ -1,287 +0,0 @@ -// Proof of Concepts of CB-Spider. -// The CB-Spider is a sub-Framework of the Cloud-Barista Multi-Cloud Project. -// The CB-Spider Mission is to connect all the clouds with a single interface. -// -// * Cloud-Barista: https://github.com/cloud-barista -// -// This is a Cloud Driver Example for PoC Test. -// -// program by ysjeon@mz.co.kr, 2019.07. -// modify by devunet@mz.co.kr, 2019.11. - -package resources - -import ( - "context" - "errors" - "strconv" - - compute "google.golang.org/api/compute/v1" - - "time" - - 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" -) - -type GCPVPCHandler struct { - Region idrv.RegionInfo - Ctx context.Context - Client *compute.Service - Credential idrv.CredentialInfo -} - -func (vVPCHandler *GCPVPCHandler) CreateVPC(vpcReqInfo irs.VPCReqInfo) (irs.VPCInfo, error) { - cblogger.Info(vpcReqInfo) - - var cnt string - isFirst := false - - projectID := vVPCHandler.Credential.ProjectID - region := vVPCHandler.Region.Region - //name := GetCBDefaultVNetName() - name := vpcReqInfo.IId.NameId - - //서브넷 있는지 확인 - autoCreateSubnetworks := false - - if vpcReqInfo.SubnetInfoList != nil { - autoCreateSubnetworks := true - } - - cblogger.Infof("생성된 [%s] VPC가 있는지 체크", name) - vNetInfo, errVnet := vVPCHandler.Client.Networks.Get(projectID, name).Do() - spew.Dump(vNetInfo) - if errVnet != nil { - isFirst = true - cblogger.Error(errVnet) - - cblogger.Infof("존재하는 [%s] VPC가 없으므로 새로 생성해야 함", name) - network := &compute.Network{ - Name: name, - //Name: GetCBDefaultVNetName(), - AutoCreateSubnetworks: autoCreateSubnetworks, // subnet 유무에 따라서 달라짐 true, false - } - - cblogger.Infof("[%s] VPC 생성 시작", name) - cblogger.Info(network) - _, err := vVPCHandler.Client.Networks.Insert(projectID, network).Do() - if err != nil { - cblogger.Errorf("[%s] VPC 생성 실패", name) - cblogger.Error(err) - return irs.VPCInfo{}, errVnet - } - - cblogger.Infof("[%s] VPC 정상적으로 생성되고 있습니다.", name) - before_time := time.Now() - max_time := 120 - - // loop --> 생성 check --> 생성 되었으면, break; 안됐으면 sleep 5초 --> - // if(total sleep 120sec?) error - - cblogger.Info("VPC가 모두 생성될 때까지 5초 텀으로 체크 시작") - for { - cblogger.Infof("==> [%s] VPC 정보 조회", name) - _, errVnet := vVPCHandler.Client.Networks.Get(projectID, name).Do() - if errVnet != nil { - cblogger.Errorf("==> [%s] VPC 정보 조회 실패", name) - cblogger.Error(errVnet) - - time.Sleep(time.Second * 5) - after_time := time.Now() - diff := after_time.Sub(before_time) - if int(diff.Seconds()) > max_time { - cblogger.Errorf("[%d]초 동안 [%s] VPC 정보가 조회되지 않아서 강제로 종료함.", max_time, name) - return irs.VPCInfo{}, errVnet - } - } else { - //생성된 VPC와 서브넷 이름이 동일하지 않으면 VPC의 기본 서브넷이 모두 생성될 때까지 20초 정도 대기 - //if name != VPCReqInfo.Name { - cblogger.Info("생성된 VPC정보가 조회되어도 리전에서는 계속 생성되고 있기 때문에 20초 대기") - time.Sleep(time.Second * 20) - //} - - cblogger.Infof("==> [%s] VPC 정보 생성 완료", name) - //서브넷이 비동기로 생성되고 있기 때문에 다시 체크해야 함. - newvNetInfo, _ := vVPCHandler.Client.Networks.Get(projectID, name).Do() - cnt = strconv.Itoa(len(newvNetInfo.Subnetworks) + 1) - break - } - } - } else { - cblogger.Infof("이미 [%s] VPCs가 존재함.", name) - cnt = strconv.Itoa(len(vNetInfo.Subnetworks) + 1) - } - - cblogger.Info("현재 생성된 서브넷 수 : ", cnt) - - // 여기서부터 서브넷 체크하는 로직이 들어가야 하네. 하필 배열이네 - for _, item := range vpcReqInfo.SubnetInfoList{ - - } - cblogger.Infof("생성할 [%s] Subnet이 존재하는지 체크", vpcReqInfo.Name) - - subnetInfo, errSubnet := vVPCHandler.GetVPC(vPC) - if errSubnet == nil { - spew.Dump(subnetInfo) - //최초 생성인 경우 VPC와 Subnet 이름이 동일하면 이미 생성되었으므로 추가로 생성하지 않고 리턴 함. - if isFirst { - cblogger.Error("최초 VPC 생성이므로 에러 없이 조회된 서브넷 정보를 리턴 함.") - return subnetInfo, nil - } else { - cblogger.Error(errSubnet) - return irs.VPCInfo{}, errors.New("Already Exist - " + VPCReqInfo.Name) - } - } - - // vNetResult, _ := vVPCHandler.ListVPC() - - networkUrl := "https://www.googleapis.com/compute/v1/projects/" + projectID + "/global/networks/" + name - subnetWork := &compute.Subnetwork{ - Name: VPCReqInfo.Name, - IpCidrRange: "192.168." + cnt + ".0/24", - Network: networkUrl, - } - cblogger.Infof("[%s] Subnet 생성시작", VPCReqInfo.Name) - cblogger.Info(subnetWork) - res, err := vVPCHandler.Client.Subnetworks.Insert(projectID, region, subnetWork).Do() - if err != nil { - cblogger.Error("Subnet 생성 실패") - cblogger.Error(err) - return irs.VPCInfo{}, err - } - cblogger.Infof("[%s] Subnet 생성완료", VPCReqInfo.Name) - cblogger.Info(res) - - //생성되는데 시간이 필요 함. 약 20초정도? - //time.Sleep(time.Second * 20) - - info, err2 := vVPCHandler.Client.Subnetworks.Get(projectID, region, VPCReqInfo.Name).Do() - if err2 != nil { - cblogger.Error(err2) - return irs.VPCInfo{}, err2 - } - networkInfo := irs.VPCInfo{ - Name: info.Name, - Id: strconv.FormatUint(info.Id, 10), - AddressPrefix: info.IpCidrRange, - KeyValueList: []irs.KeyValue{ - {"SubnetId", info.Name}, - {"Region", info.Region}, - {"GatewayAddress", info.GatewayAddress}, - {"SelfLink", info.SelfLink}, - }, - } - - return networkInfo, nil -} - -func (vVPCHandler *GCPVPCHandler) ListVPC() ([]*irs.VPCInfo, error) { - projectID := vVPCHandler.Credential.ProjectID - region := vVPCHandler.Region.Region - - vpcList, err := vVPCHandler.Client.Networks.List(projectID).Do() - - if err != nil { - - return nil, err - } - var vpcInfo []*irs.VPCInfo - - for _, item := range vpcList.Items { - iId := irs.IID{ - NameId: item.Name, - SystemId: strconv.FormatUint(item.Id,10), - } - subnetInfo := vVPCHandler.GetVPC(iId) - - vpcInfo = append(vpcInfo,&subnetInfo) - - - } - - return vpcInfo, nil -} - -func (vVPCHandler *GCPVPCHandler) GetVPC(vpcIID irs.IID) (irs.VPCInfo, error) { - - projectID := vVPCHandler.Credential.ProjectID - region := vVPCHandler.Region.Region - //name := VPCID - name := vpcIID.NameId - systemId := vpcIID.SystemId - - cblogger.Infof("NameID : [%s] / SystemID : [%s]", name, systemId) - subnetInfoList := []irs.SubnetInfo{} - - infoVPC, err := vVPCHandler.Client.Networks.Get(projectID,systemId).Do() - if err != nil { - cblogger.Error(err) - return irs.VPCInfo{}, err - } - if infoVPC.Subnetworks != nil { - for _, item := range infoVPC.Subnetworks{ - str := strings.Split(item,"/") - subnet := str[len(str)-1] - infoSubnet, err := vVPCHandler.Client.Subnetworks.Get(projectID,region,subnet).Do() - if err != nil { - cblogger.Error(err) - return irs.VPCInfo{}, err - } - subnetInfoList = append(subnetInfoList,mappingSubnet(infoSubnet)) - } - - } - - networkInfo := irs.VPCInfo{ - IId : irs.IID{ - NameId: info.Name, - SystemId: strconv.FormatUint(info.Id, 10), - }, - IPv4_CIDR:"Not support IPv4_CIDR at GCP VPC", - SubnetInfoList: subnetInfoList, - KeyValueList: []irs.KeyValue{ - {"RoutingMode", info.RoutingMode, - {"Description", info.Description}, - {"GatewayAddress", info.GatewayAddress}, - {"SelfLink", info.SelfLink}, - }, - } - - return networkInfo, nil -} - -func mappingSubnet(subnet *compute.Subnetwork) irs.SubnetInfo{ - //str := subnet.SelfLink - str := strings.Split(subnet.SelfLink,"/") - vpcName := str[len(str)-1] - subnetInfo := irs.SubnetInfo{ - IId: irs.IID{ - NameId: subnet.Name, - SystemId: strconv.FormatUint(subnet.Id,10), - }, - IPv4_CIDR: subnet.IpCidrRange, - KeyValueList: []irs.KeyValue{ - {"region",subnet.Region}, - {"vpc",vpcName}, - }, - } - return subnetInfo -} - -func (vVPCHandler *GCPVPCHandler) DeleteVPC(VPCID string) (bool, error) { - projectID := vVPCHandler.Credential.ProjectID - region := vVPCHandler.Region.Region - //name := VPCID - name := GetCBDefaultVNetName() - cblogger.Infof("Name : [%s]", name) - info, err := vVPCHandler.Client.Subnetworks.Delete(projectID, region, VPCID).Do() - cblogger.Info(info) - if err != nil { - cblogger.Error(err) - return false, err - } - //fmt.Println(info) - return true, nil -} diff --git a/cloud-control-manager/cloud-driver/drivers/tencent/main/Test_Resources.go b/cloud-control-manager/cloud-driver/drivers/tencent/main/Test_Resources.go index 34f2e3d46..fbbc41f1b 100644 --- a/cloud-control-manager/cloud-driver/drivers/tencent/main/Test_Resources.go +++ b/cloud-control-manager/cloud-driver/drivers/tencent/main/Test_Resources.go @@ -640,7 +640,7 @@ func handleVM() { SubnetIID: irs.IID{SystemId: "subnet-ccawa5nz"}, SecurityGroupIIDs: []irs.IID{{SystemId: "sg-3baxppe6"}}, VMSpecName: "S5.SMALL1", - KeyPairIID: irs.IID{SystemId: "skey-9mvd64l5"}, + KeyPairIID: irs.IID{SystemId: "skey-cjuxapcr"}, //VMUserId: "root", //root만 가능 //VMUserPasswd: "Cbuser!@#", //대문자 소문자 모두 사용되어야 함. 그리고 숫자나 특수 기호 중 하나가 포함되어야 함. } @@ -754,12 +754,12 @@ func handleVM() { func main() { cblogger.Info("Tencent Cloud Resource Test") - handleVPC() //VPC - //handleKeyPair() + //handleVPC() //VPC //handleVMSpec() //handleSecurity() //handleImage() //AMI - //handleVM() + handleKeyPair() + handleVM() //handlePublicIP() // PublicIP 생성 후 conf //handleVNic() //Lancard diff --git a/cloud-control-manager/cloud-driver/drivers/tencent/resources/KeyPairHandler.go b/cloud-control-manager/cloud-driver/drivers/tencent/resources/KeyPairHandler.go index 29f4c437c..6ef1a261b 100644 --- a/cloud-control-manager/cloud-driver/drivers/tencent/resources/KeyPairHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/tencent/resources/KeyPairHandler.go @@ -1,9 +1,7 @@ package resources import ( - "bytes" "crypto/md5" - "crypto/rsa" "errors" "fmt" "io" @@ -13,13 +11,13 @@ import ( "strings" call "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/call-log" + keypair "github.com/cloud-barista/cb-spider/cloud-control-manager/cloud-driver/common" 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/davecgh/go-spew/spew" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312" - "golang.org/x/crypto/ssh" ) type TencentKeyPairHandler struct { @@ -208,13 +206,13 @@ func (keyPairHandler *TencentKeyPairHandler) CreateKey(keyPairReqInfo irs.KeyPai cblogger.Infof("savePublicFileTo : [%s]", savePublicFileTo) // 파일에 private Key를 쓴다 - err = writeKeyToFile([]byte(keyPairInfo.PrivateKey), savePrivateFileTo) + err = keypair.SaveKey([]byte(keyPairInfo.PrivateKey), savePrivateFileTo) if err != nil { return irs.KeyPairInfo{}, err } // 파일에 public Key를 쓴다 - err = writeKeyToFile([]byte(keyPairInfo.PublicKey), savePublicFileTo) + err = keypair.SaveKey([]byte(keyPairInfo.PublicKey), savePublicFileTo) if err != nil { return irs.KeyPairInfo{}, err } @@ -409,35 +407,6 @@ func (keyPairHandler *TencentKeyPairHandler) CheckKeyPairFolder(keyPairPath stri return nil } -// ParseKey reads the given RSA private key and create a public one for it. -func makePublicKeyFromPrivateKey(pem string) (string, error) { - key, err := ssh.ParseRawPrivateKey([]byte(pem)) - if err != nil { - return "", err - } - rsaKey, ok := key.(*rsa.PrivateKey) - if !ok { - return "", fmt.Errorf("%q is not a RSA key", pem) - } - pub, err := ssh.NewPublicKey(&rsaKey.PublicKey) - if err != nil { - return "", err - } - - return string(bytes.TrimRight(ssh.MarshalAuthorizedKey(pub), "\n")), nil -} - -// 파일에 Key를 쓴다 -func writeKeyToFile(keyBytes []byte, saveFileTo string) error { - err := ioutil.WriteFile(saveFileTo, keyBytes, 0600) - if err != nil { - return err - } - - log.Printf("Key 저장위치: %s", saveFileTo) - return nil -} - // @TODO - PK 이슈 처리해야 함. (A User / B User / User 하위의 IAM 계정간의 호환성에 이슈가 없어야 하는데 현재는 안 됨.) // - 따라서 AWS는 대안으로 KeyPair의 FingerPrint를 이용하도록 변경 - 필요시 리전및 키 이름과 혼용해서 만들어야할 듯. // KeyPair 해시 생성 함수 (PK 이슈로 현재는 사용하지 않음) diff --git a/cloud-control-manager/cloud-driver/drivers/tencent/resources/SecurityHandler.go b/cloud-control-manager/cloud-driver/drivers/tencent/resources/SecurityHandler.go index 512f5596a..edaa71e88 100644 --- a/cloud-control-manager/cloud-driver/drivers/tencent/resources/SecurityHandler.go +++ b/cloud-control-manager/cloud-driver/drivers/tencent/resources/SecurityHandler.go @@ -220,6 +220,7 @@ func (securityHandler *TencentSecurityHandler) GetSecurity(securityIID irs.IID) if *response.Response.TotalCount > 0 { securityInfo := irs.SecurityInfo{} + securityInfo.VpcIID = irs.IID{NameId: "N/A", SystemId: "N/A"} securityInfo.IId = irs.IID{NameId: *response.Response.SecurityGroupSet[0].SecurityGroupName, SystemId: *response.Response.SecurityGroupSet[0].SecurityGroupId} securityInfo.SecurityRules, err = securityHandler.GetSecurityRuleInfo(securityIID)