我想使用Apache jclouds 1.8.0(通过Apache Brooklyn项目)访问HP Helion云,我以前使用的配置不再有效。文档建议我使用与控制台相同的用户名和密码,但这会给我一个HTTP 401身份验证错误。
正在发送的POST数据记录在日志中,看起来像这样(格式化和用户名/密码编辑):
{
"auth":{
"apiAccessKeyCredentials":{"accessKey":"user@example.org","secretKey":"XXXXXXXX"},
"tenantName":"user@example.org.com-tenant1"
}
}
我对jclouds的配置包括设置身份和凭据,如下所示:
identity = user@example.org-tenant1:user@example.org
credential = XXXXXXXX
异常跟踪如下:
java.lang.IllegalStateException: Not authorized to access cloud JcloudsLocation[HP Helion (US East):user@example.org-tenant1:user@example.org] to resolve PortableTemplateBuilder[ports=[22], os=ubuntu, locationId=region-b.geo-1, osVersionRegex=12.04, is64bit=true, imageChooserFunction=brooklyn.location.jclouds.BrooklynImageChooser$3@5ec6379b, minRam=2048]
at brooklyn.location.jclouds.JcloudsLocation.buildTemplate(JcloudsLocation.java:1052) ~[brooklyn-locations-jclouds-0.7.0-20140817.024657-169.jar:0.7.0-SNAPSHOT]
Caused by: org.jclouds.rest.AuthorizationException: POST https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens HTTP/1.1 -> HTTP/1.1 401 Unauthorized
at org.jclouds.openstack.nova.v2_0.handlers.NovaErrorHandler.handleError(NovaErrorHandler.java:93) ~[openstack-nova-1.8.0.jar:1.8.0]
Caused by: org.jclouds.http.HttpResponseException: request: POST https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens HTTP/1.1 [{"auth":{"apiAccessKeyCredentials":{"accessKey":"user@example.org","secretKey":"XXXXXXXX"},"tenantName":"user@example.org-tenant1"}}] failed with response: HTTP/1.1 401 Unauthorized
at org.jclouds.openstack.nova.v2_0.handlers.NovaErrorHandler.handleError(NovaErrorHandler.java:78) ~[openstack-nova-1.8.0.jar:1.8.0]
答案 0 :(得分:3)
事实证明,这有几个问题。首先,jclouds在1.8.0中的工作方式发生了变化,记录在release notes
中从1.8.0开始,HP Cloud Object Storage提供程序需要明确指定region属性。此属性现在用于选择适当的端点。如果未明确设置区域,则将选择任意端点,这可能与使用以前版本的jcloud时选择的端点不同。
这对我来说不是问题,但我现在无论如何都明确地在配置中设置区域。
其次,在向具有不同内容的端点发送一些POST请求之后,似乎jclouds正在使用基于访问密钥的身份验证,而不是用户名和密码身份验证。因此,在登录HP Helion console后,我从页面顶部的用户名下拉列表中选择了管理访问密钥。然后,我可以单击显示密钥以显示我需要的访问和密钥数据。如果现有的密钥已经过期,可能需要创建一个新密钥,但我不需要这样做。然后,我只需要更改jclouds 身份和凭据数据以适应:
identity = user@example.org-tenant1:ACCESSKEYDATA
credential = SECRETKEYDATA
这允许jclouds API成功连接和创建VM。
最后,我必须将区域名称配置为布鲁克林的位置描述符的一部分,但其他jclouds应用程序可能会这样做:
brooklyn.location.named.hpcloud-west = jclouds:hpcloud-compute
brooklyn.location.named.hpcloud-west.region = region-a.geo-1
brooklyn.location.named.hpcloud-west.displayName = HP Helion (US West)