1

我正在尝试更新对象的 Env 字段,但我不想遍历它们以确定哪些字段已经存在并且需要更新而不是插入(如果没有必要)。我正在使用控制器运行时。

我尝试使用 ApplyPatchType 进行修补,如下所示:
r.Patch(ctx, myDeployment, client.Apply)
where client.Apply is here,并且myDeployment*appsv1.Deployment我找到List(...)然后修改的。

这失败了415 Unsupported Media Type。我认为它与需要在 YAML 中编码有关(因为类型的值是“application/apply-patch+yaml”

我通过这样做使它工作(r有一个嵌入式控制器运行时客户端):

newDeploy := dep.DeepCopy()
original := dep.DeepCopy()
// ... (changing newDeploy)
rawObj, _ := apijson.Marshal(newDeploy)
r.Patch(ctx, original, client.ConstantPatch(types.StrategicMergePatchType, rawObj))

但这感觉效率低下,可能有不必要的 DeepCopies,而且我觉得我在不必要地编组我的对象。我想我可以以某种方式使用Patch类似于我使用命令的方式的Update命令,在这里我可以传入已修改状态的对象并获得 StrategicMergePatchType(或 ApplyPatchType)行为。

在我看来,如果我只想传入修改后的对象并让客户端“弄清楚”要修补什么,我想使用 client.Apply (ApplyPatchType) 行为,因为我认为StrategicMergePatchType 仅用于差异apply (尽管我认为提供整个对象仍然可以是有效的差异)。任何指导表示赞赏!

4

1 回答 1

2

现在,我得到了我正在寻找的行为,而无需使用client.MergeFrom手动编写合并逻辑:

MergeFrom 创建一个补丁,该补丁使用以给定对象为基础的合并补丁策略进行补丁。

相关代码:

r.Patch(ctx, newDeploy, client.MergeFrom(original))

于 2019-09-09T21:10:08.637 回答