2.4 Go
2.4.2 Go SDK 使用
-Password IAM用户密码。
-ProjectID 项目ID。如何获取,请参考如 何获取IAM 用户名、账号ID 以及项目ID?。
-DomainID 账号ID。如何获取,请参考如
何获取IAM 用户名、账号ID 以及项目ID?。
-2.4.2 Go SDK 使用
2.4.2.1 Go SDK 认证方式
Go SDK支持token认证和AK/SK认证两种方式。
token 认证
token认证方式示例代码,参数详情请参考表2-20。
package main import (
"github.com/gophercloud/gophercloud/auth/token"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack"
"fmt"
)
func main() { //设置认证参数
tokenOpts := token.TokenOptions{
IdentityEndpoint: "https://iam.example.com/v3", Username: "{username}",
Password: "{password}", DomainID: "{domainid}", ProjectID: "{projectid}", }
//初始化provider client
provider, providerErr := openstack.AuthenticatedClient(tokenOpts) if providerErr != nil {
fmt.Println("init provider client error:", providerErr) panic(providerErr)
}
//初始化service client
sc, serviceErr := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{}) if serviceErr != nil {
fmt.Println("init compute service client error:", serviceErr) panic(serviceErr)
}
//列出所有服务器
allPages, err := servers.List(sc, servers.ListOpts{}).AllPages() if err != nil {
fmt.Println("request server list error:", err) panic(err)
}
//解析返回值
allServers, err := servers.ExtractServers(allPages) if err != nil {
fmt.Println("extract response data error:", err) if ue, ok := err.(*gophercloud.UnifiedError); ok { fmt.Println("ErrCode:", ue.ErrorCode()) fmt.Println("Message:", ue.Message()) }
return }
//打印信息
fmt.Println("List Servers:") for _, s := range allServers { fmt.Println("server ID is :", s.ID) fmt.Println("server name is :", s.Name) fmt.Println("server Status is :", s.Status)
fmt.Println("server AvailbiltyZone is :", s.AvailbiltyZone) }
}
● ProviderClient 是所有 OpenStack 服务需要的顶级客户端。该客户端包含所有认 证详情,如URL及token ID,通过认证后,编写的Go代码就可访问API。
● 访问某个服务时,还需要该服务的Service Client,详见各服务对应的章节。
表2-20 参数说明
名称 说明 取值样例
IdentityEnd
point 认证服务(IAM)的
Endpoint。
“https://
iam.example.com/v3”中的
“example”为“区域.云平台 域名”,参数详情可以访问这 里了解。
https://iam.cn-north-1.myhuaweicloud.com/v3
Username IAM用户名。如何获取,请参
考如何获取IAM 用户名、账 号ID以及项目ID?。
-Password IAM用户密码。
-ProjectID 项目ID。如何获取,请参考如 何获取IAM 用户名、账号ID 以及项目ID?。
-DomainID 账号ID。如何获取,请参考如
何获取IAM 用户名、账号ID 以及项目ID?。
-AKSK 认证
AK/SK认证方式示例代码,参数详情请参考表2-21。
package main import (
"github.com/gophercloud/gophercloud/auth/aksk"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
"github.com/gophercloud/gophercloud/openstack"
"fmt"
)
func main() { //设置认证参数
akskOpts := aksk.AKSKOptions{
IdentityEndpoint: "https://iam.example.com/v3", DomainID: "{domainid}",
provider, providerErr := openstack.AuthenticatedClient(akskOpts) if providerErr != nil {
fmt.Println("init provider client error:", providerErr) panic(providerErr)
}
//初始化service client
sc, serviceErr := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{}) if serviceErr != nil {
fmt.Println("init compute service client error:", serviceErr) panic(serviceErr)
}
//列出所有服务器
allPages, err := servers.List(sc, servers.ListOpts{}).AllPages() if err != nil {
fmt.Println("request server list error:", err) panic(err)
}
//解析返回值
allServers, err := servers.ExtractServers(allPages) if err != nil {
fmt.Println("extract response data error:", err) if ue, ok := err.(*gophercloud.UnifiedError); ok {
fmt.Println("List Servers:") for _, s := range allServers { fmt.Println("server ID is :", s.ID) fmt.Println("server name is :", s.Name) fmt.Println("server Status is :", s.Status)
fmt.Println("server AvailbiltyZone is :", s.AvailbiltyZone) }
}
AK/SK生成说明:登录控制台,进入“我的凭证”,点击“管理访问密钥”创建 AK/SK。
AKSK签名时间与UTC时间误差不可以超过15分钟,否则会鉴权失败。
AKSK签名连续失败超过5次,将锁定对应访问的源IP的AKSK请求,持续5分钟。
表2-21 参数说明
名称 说明 取值样例
IdentityEndp
oint 认证服务(IAM)的
Endpoint。
“https://
iam.example.com/v3”中的
“example”为“区域.云平 台域名”,参数详情可以访 问这里了解。
https://iam.cn-north-1.myhuaweicloud.com/v3
DomainID 账号ID。如何获取账号ID请 参考如何获取IAM 用户名、
账号ID以及项目ID?。
-ProjectID 项目ID。如何获取项目ID请 参考如何获取IAM 用户名、
账号ID以及项目ID?。
-ak/sk AK/SK访问密钥。
说明
● AK/SK生成说明:登录控制 台,进入“我的凭证”,点 击“管理访问密钥”创建 AK/SK。
● AK/SK签名时间与UTC时间 误差不可以超过15分钟,否 则会鉴权失败。
● AK/SK签名连续失败超过5 次,将锁定对应访问的源IP 的AKSK请求,持续5分钟。
-Region 区域名称。 cn-north-1
Cloud 云平台域名。 myhuaweicloud.com
2.4.2.2 Go SDK 故障排查
Go SDK打开debug的方法:
import (
"github.com/gophercloud/gophercloud"
)gophercloud.EnableDebug=true