我正在尝试通过管理Google Cloud Platform学习Go。我不明白如何使用有关Compute的相关功能。目的是列出带有一些go代码的实例。
这是https://godoc.org/google.golang.org/api/compute/v1#InstancesService.List的相关功能。
func (r *InstancesService) List(project string, zone string) *InstancesListCall
有两种结构,InstancesService和InstancesListCall
据我了解,我应该定义这些结构,但尚不清楚应在结构中定义的内容。我已经搜索了示例,但是其中很多使用rest调用而不是golang api。有任何想法如何使用go列出实例吗?
答案 0 :(得分:0)
今天我不得不写这样的东西,而谷歌搜索的例子却很少出现。我已经在下面写下了我学到的东西,但是,我对golang还是很陌生,所以也许聪明的人可以提出改进建议。
我的工作正在进行中:https://github.com/grenade/rubberneck
如果要从不在Google计算平台上的开发PC运行go程序,则:
GOOGLE_APPLICATION_CREDENTIALS
环境变量设置为本地密钥文件的路径package main
import (
"golang.org/x/net/context"
"google.golang.org/api/compute/v1"
"golang.org/x/oauth2/google"
"fmt"
"strings"
)
func main() {
projects := [...]string{
"my-project-one",
"my-project-two",
}
filters := [...]string{
"status = RUNNING",
"name != my-uninteresting-instance-one",
"name != my-uninteresting-instance-two",
}
ctx := context.Background()
client, err := google.DefaultClient(ctx,compute.ComputeScope)
if err != nil {
fmt.Println(err)
}
computeService, err := compute.New(client)
for _, project := range projects {
zoneListCall := computeService.Zones.List(project)
zoneList, err := zoneListCall.Do()
if err != nil {
fmt.Println("Error", err)
} else {
for _, zone := range zoneList.Items {
instanceListCall := computeService.Instances.List(project, zone.Name)
instanceListCall.Filter(strings.Join(filters[:], " "))
instanceList, err := instanceListCall.Do()
if err != nil {
fmt.Println("Error", err)
} else {
for _, instance := range instanceList.Items {
if workerType, isWorker := instance.Labels["worker-type"]; isWorker {
m := strings.Split(instance.MachineType, "/")
fmt.Printf("cloud: gcp, zone: %v, name: %v, instance id: %v, machine type: %v, worker type: %v, launch time: %v\n",
zone.Name,
instance.Name,
instance.Id,
m[len(m)-1],
workerType,
instance.CreationTimestamp)
}
}
}
}
}
}
}