Honor forceAllowCreate in service registry

pull/564/head
Jennifer Buckley 2019-02-11 11:05:30 -08:00
parent 8d8157f490
commit 1a5e48e29d
2 changed files with 66 additions and 24 deletions

View File

@ -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)

View File

@ -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)
}
} }
} }