mirror of https://github.com/k3s-io/k3s
Honor forceAllowCreate in service registry
parent
8d8157f490
commit
1a5e48e29d
|
@ -337,6 +337,18 @@ func (rs *REST) healthCheckNodePortUpdate(oldService, service *api.Service, node
|
||||||
func (rs *REST) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) {
|
func (rs *REST) Update(ctx context.Context, name string, objInfo rest.UpdatedObjectInfo, createValidation rest.ValidateObjectFunc, updateValidation rest.ValidateObjectUpdateFunc, forceAllowCreate bool, options *metav1.UpdateOptions) (runtime.Object, bool, error) {
|
||||||
oldObj, err := rs.services.Get(ctx, name, &metav1.GetOptions{})
|
oldObj, err := rs.services.Get(ctx, name, &metav1.GetOptions{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
// Support create on update, if forced to.
|
||||||
|
if forceAllowCreate {
|
||||||
|
obj, err := objInfo.UpdatedObject(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
createdObj, err := rs.Create(ctx, obj, createValidation, &metav1.CreateOptions{DryRun: options.DryRun})
|
||||||
|
if err != nil {
|
||||||
|
return nil, false, err
|
||||||
|
}
|
||||||
|
return createdObj, true, nil
|
||||||
|
}
|
||||||
return nil, false, err
|
return nil, false, err
|
||||||
}
|
}
|
||||||
oldService := oldObj.(*api.Service)
|
oldService := oldObj.(*api.Service)
|
||||||
|
|
|
@ -61,32 +61,62 @@ func TestApplyAlsoCreates(t *testing.T) {
|
||||||
_, client, closeFn := setup(t)
|
_, client, closeFn := setup(t)
|
||||||
defer closeFn()
|
defer closeFn()
|
||||||
|
|
||||||
_, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType).
|
testCases := []struct {
|
||||||
Namespace("default").
|
resource string
|
||||||
Resource("pods").
|
name string
|
||||||
Name("test-pod").
|
body string
|
||||||
Body([]byte(`{
|
}{
|
||||||
"apiVersion": "v1",
|
{
|
||||||
"kind": "Pod",
|
resource: "pods",
|
||||||
"metadata": {
|
name: "test-pod",
|
||||||
"name": "test-pod"
|
body: `{
|
||||||
},
|
"apiVersion": "v1",
|
||||||
"spec": {
|
"kind": "Pod",
|
||||||
"containers": [{
|
"metadata": {
|
||||||
"name": "test-container",
|
"name": "test-pod"
|
||||||
"image": "test-image"
|
},
|
||||||
}]
|
"spec": {
|
||||||
}
|
"containers": [{
|
||||||
}`)).
|
"name": "test-container",
|
||||||
Do().
|
"image": "test-image"
|
||||||
Get()
|
}]
|
||||||
if err != nil {
|
}
|
||||||
t.Fatalf("Failed to create object using Apply patch: %v", err)
|
}`,
|
||||||
|
}, {
|
||||||
|
resource: "services",
|
||||||
|
name: "test-svc",
|
||||||
|
body: `{
|
||||||
|
"apiVersion": "v1",
|
||||||
|
"kind": "Service",
|
||||||
|
"metadata": {
|
||||||
|
"name": "test-svc"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"ports": [{
|
||||||
|
"port": 8080,
|
||||||
|
"protocol": "UDP"
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = client.CoreV1().RESTClient().Get().Namespace("default").Resource("pods").Name("test-pod").Do().Get()
|
for _, tc := range testCases {
|
||||||
if err != nil {
|
_, err := client.CoreV1().RESTClient().Patch(types.ApplyPatchType).
|
||||||
t.Fatalf("Failed to retrieve object: %v", err)
|
Namespace("default").
|
||||||
|
Resource(tc.resource).
|
||||||
|
Name(tc.name).
|
||||||
|
Body([]byte(tc.body)).
|
||||||
|
Do().
|
||||||
|
Get()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to create object using Apply patch: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = client.CoreV1().RESTClient().Get().Namespace("default").Resource(tc.resource).Name(tc.name).Do().Get()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to retrieve object: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue