无法使用Java部署管理器SDK更新GCP部署



我正在尝试使用Deployment Manager SDK for Java编写一个应用程序来管理GCP部署。我能够成功列出部署,但无法更新部署,因为SDK抛出了如下所示的异常。

com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"message" : "The object 'projects/--redacted-project--/global/deployments' is not found.",
"reason" : "notFound"
} ],
"message" : "The object 'projects/--redacted-project--/global/deployments' is not found."
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:150)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1067)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)

我的呼叫代码是:

val content = new Deployment().setTarget(target)
val updateResult = client.deployments().update(project, name, content)
.setCreatePolicy("CREATE_OR_ACQUIRE")
.setDeletePolicy("DELETE")
.setPreview(false)
.execute()

当我打开SDK的调试时,我看到以下交换:

2020-04-13 17:52:36,353 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - -------------- REQUEST  --------------
PUT https://www.googleapis.com/deploymentmanager/v2/projects/--redacted-project--/global/deployments/--redacted-deployment--
Accept-Encoding: gzip
Authorization: <Not Logged>
User-Agent: Google-API-Java-Client Google-HTTP-Java-Client/1.25.0 (gzip)
Content-Type: application/json; charset=UTF-8
Content-Encoding: gzip
Content-Length: 565
2020-04-13 17:52:36,353 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - curl -v --compressed -X PUT -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: Google-API-Java-Client Google-HTTP-Java-Client/1.25.0 (gzip)' -H 'Content-Type: application/json; charset=UTF-8' -H 'Content-Encoding: gzip' -d '@-' -- 'https://www.googleapis.com/deploymentmanager/v2/projects/--redacted-project--/global/deployments/--redacted-deployment--' << $$$
2020-04-13 17:52:36,354 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - Total: 1,449 bytes
2020-04-13 17:52:36,354 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - {"target":{"config":{"content":"imports:n  - path: dep.jinjannresources:n  - name: testingn    type: dep.jinjan    properties:n      env: prodn      banana: yesn      retentionInDays: 5"},"imports":[{"content":"resources:n- name: riffraff-datasetn  type: bigquery.v2.datasetn  properties:n    location: europe-west2n    datasetReference:n      datasetId: riffraff_testn- name: test-tablen  type: bigquery.v2.tablen  metadata:n    dependsOn:n    - riffraff-datasetn  properties:n    datasetId: riffraff_testn    tableReference:n      tableId: bananan    schema:n      fields:n        - name: speciesn          type: stringn        - name: plantationn          type: stringn        - name: harvestedn          type: daten        - name: quantityn          type: numericn        - name: ediblen          type: booleann{% if properties['banana'] == "yes" %}n- name: test-topicn  type: gcp-types/pubsub-v1:projects.topicsn  properties:n    topic: riffraff-topicn{% endif %}n- name: riffraff-bucketn  type: storage.v1.bucketn  properties:n    location: europe-west2n    storageClass: STANDARDn    iamConfiguration:n      uniformBucketLevelAccess:n        enabled: Truen    {% if properties['retentionInDays'] %}n    lifecycle:n      rule:n        - action:n            type: Deleten          condition:n            age: {{ properties['retentionInDays'] }}n    {% endif %}","name":"dep.jinja"}]}}
2020-04-13 17:52:37,174 [deploy-akka.deploy-dispatcher-10] INFO  c.g.a.c.h.HttpTransport - -------------- RESPONSE --------------
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=UTF-8
Vary: Origin
Vary: X-Origin
Vary: Referer
Content-Encoding: gzip
Date: Mon, 13 Apr 2020 16:52:37 GMT
Server: ESF
Cache-Control: private
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
Transfer-Encoding: chunked

所以它看起来像是一个无效的URL或对象。

但是,如果我使用gcloud CLI工具对--log-http做同样的事情,我会发现它正在达到完全相同的端点,但没有得到404:

==== request start ====
uri: https://www.googleapis.com/deploymentmanager/v2/projects/--redacted-project--/global/deployments/--redacted-deployment--?alt=json&preview=False&createPolicy=CREATE_OR_ACQUIRE&deletePolicy=DELETE
method: PUT

不知道从这里去哪里。

经过进一步挖掘,我注意到PUT请求中的主体JSON中的字段有所不同。gcloudCLI发送fingerprintnametarget,而Java SDK仅发送target

隐藏在请求主体的文档中,它说您需要为update和其他一些方法设置fingerprint

我修改了代码以首先获取部署,并在请求中包含fingerprint,它就开始工作了。

val content = new Deployment().setName(name).setFingerprint(fingerprint).setTarget(target)
val updateResult = client.deployments().update(project, name, content)
.setCreatePolicy("CREATE_OR_ACQUIRE")
.setDeletePolicy("DELETE")
.setPreview(false)
.execute()

在我看来,404是错误的。Google应该返回一个400,因为客户端在请求中没有包含必需的字段。

此外,SDK会进行大量的前置条件检查来捕获无效请求,但不包括此请求。我已经向谷歌提出了一个问题。

最新更新