Kubernetes Java API(模型)深度复制



我正在尝试从官方Kubernetes Java V1 API模型中深度复制项,但在任何模型对象中都没有任何复制构造函数、CloneableSerializable接口实现。有人对如何实现这一目标有什么想法吗?


编辑:

鉴于@RoddyofFrozenPeas的混淆,我想澄清那些没有使用API的人的情况。

V1对象具有其他深度嵌套的V1对象。以V1Pod为例,它有一个V1PodSpec。仅在顶层复制对象字段将导致对嵌套对象的引用。任何嵌套对象的修改将在保留对所述对象的引用的其他对象中观察到。

编辑2:

一个简单的自包含测试,执行后会有结果。也许我做错了什么?

V1Container v1Container = new V1ContainerBuilder()
.withName("original container")
.addToArgs("original argument 1")
.build();
V1Pod original = new V1PodBuilder()
.withNewMetadata()
.withName("Original Pod")
.endMetadata()
.withNewSpec()
.withContainers(v1Container)
.endSpec()
.build();
V1Pod copy = new V1Pod();
copy.setMetadata(original.getMetadata());
copy.getMetadata().setName("copy of pod");
copy.setSpec(original.getSpec());
copy.getSpec().getContainers().get(0).setName("copy container");

原件:

class V1Pod {
apiVersion: null
kind: null
metadata: class V1ObjectMeta {
annotations: null
clusterName: null
creationTimestamp: null
deletionGracePeriodSeconds: null
deletionTimestamp: null
finalizers: null
generateName: null
generation: null
labels: null
managedFields: null
name: copy of pod
namespace: null
ownerReferences: null
resourceVersion: null
selfLink: null
uid: null
}
spec: class V1PodSpec {
activeDeadlineSeconds: null
affinity: null
automountServiceAccountToken: null
containers: [class V1Container {
args: [original argument 1]
command: null
env: null
envFrom: null
image: null
imagePullPolicy: null
lifecycle: null
livenessProbe: null
name: copy container
ports: null
readinessProbe: null
resources: null
securityContext: null
startupProbe: null
stdin: null
stdinOnce: null
terminationMessagePath: null
terminationMessagePolicy: null
tty: null
volumeDevices: null
volumeMounts: null
workingDir: null
}]
//...
}
status: null
}

副本:

class V1Pod {
apiVersion: null
kind: null
metadata: class V1ObjectMeta {
annotations: null
clusterName: null
creationTimestamp: null
deletionGracePeriodSeconds: null
deletionTimestamp: null
finalizers: null
generateName: null
generation: null
labels: null
managedFields: null
name: copy of pod
namespace: null
ownerReferences: null
resourceVersion: null
selfLink: null
uid: null
}
spec: class V1PodSpec {
activeDeadlineSeconds: null
affinity: null
automountServiceAccountToken: null
containers: [class V1Container {
args: [original argument 1]
command: null
env: null
envFrom: null
image: null
imagePullPolicy: null
lifecycle: null
livenessProbe: null
name: copy container
ports: null
readinessProbe: null
resources: null
securityContext: null
startupProbe: null
stdin: null
stdinOnce: null
terminationMessagePath: null
terminationMessagePolicy: null
tty: null
volumeDevices: null
volumeMounts: null
workingDir: null
}]
/...
}
status: null
}

复制K8s Java API资源的最简单方法是利用V1对象构建器模式中可用的withNew[field name]Like方法。下面是一个简单的自包含示例,演示了上面案例的用法。

示例:

V1Container v1Container = new V1ContainerBuilder()
.withName("original container")
.addToArgs("original argument 1")
.build();
V1Pod original = new V1PodBuilder()
.withNewMetadata()
.withName("Original Pod")
.endMetadata()
.withNewSpec()
.withContainers(v1Container)
.endSpec()
.build();
V1Pod copy = new V1PodBuilder()
.withNewMetadataLike(original.getMetadata())
.endMetadata()
.withNewSpecLike(original.getSpec())
.endSpec()
.build();
copy.getMetadata().setName("copy of pod");
copy.getSpec().getContainers().get(0).setName("copy container");

原件:

class V1Pod {
apiVersion: null
kind: null
metadata: class V1ObjectMeta {
annotations: null
clusterName: null
creationTimestamp: null
deletionGracePeriodSeconds: null
deletionTimestamp: null
finalizers: null
generateName: null
generation: null
labels: null
managedFields: null
name: Original Pod
namespace: null
ownerReferences: null
resourceVersion: null
selfLink: null
uid: null
}
spec: class V1PodSpec {
activeDeadlineSeconds: null
affinity: null
automountServiceAccountToken: null
containers: [class V1Container {
args: [original argument 1]
command: null
env: null
envFrom: null
image: null
imagePullPolicy: null
lifecycle: null
livenessProbe: null
name: original container
ports: null
readinessProbe: null
resources: null
securityContext: null
startupProbe: null
stdin: null
stdinOnce: null
terminationMessagePath: null
terminationMessagePolicy: null
tty: null
volumeDevices: null
volumeMounts: null
workingDir: null
}]
# ...
}
status: null
}

复制:

class V1Pod {
apiVersion: null
kind: null
metadata: class V1ObjectMeta {
annotations: null
clusterName: null
creationTimestamp: null
deletionGracePeriodSeconds: null
deletionTimestamp: null
finalizers: null
generateName: null
generation: null
labels: null
managedFields: null
name: copy of pod
namespace: null
ownerReferences: null
resourceVersion: null
selfLink: null
uid: null
}
spec: class V1PodSpec {
activeDeadlineSeconds: null
affinity: null
automountServiceAccountToken: null
containers: [class V1Container {
args: [original argument 1]
command: null
env: null
envFrom: null
image: null
imagePullPolicy: null
lifecycle: null
livenessProbe: null
name: copy container
ports: null
readinessProbe: null
resources: null
securityContext: null
startupProbe: null
stdin: null
stdinOnce: null
terminationMessagePath: null
terminationMessagePolicy: null
tty: null
volumeDevices: null
volumeMounts: null
workingDir: null
}]
# ...
}
status: null
}

最新更新