Merge pull request #1943 from adamreese/feat/tpr-upgrade

feat(kube): support upgrading ThirdPartyResources
pull/1945/head
Adam Reese 8 years ago committed by GitHub
commit 1fda4e8a60

@ -29,6 +29,7 @@ import (
jsonpatch "github.com/evanphx/json-patch" jsonpatch "github.com/evanphx/json-patch"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
apps "k8s.io/kubernetes/pkg/apis/apps/v1beta1" apps "k8s.io/kubernetes/pkg/apis/apps/v1beta1"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
@ -353,18 +354,12 @@ func deleteResource(c *Client, info *resource.Info) error {
return reaper.Stop(info.Namespace, info.Name, 0, nil) return reaper.Stop(info.Namespace, info.Name, 0, nil)
} }
func createPatch(target *resource.Info, currentObj runtime.Object) ([]byte, api.PatchType, error) { func createPatch(mapping *meta.RESTMapping, target, current runtime.Object) ([]byte, api.PatchType, error) {
// Get a versioned object oldData, err := json.Marshal(current)
versionedObject, err := api.Scheme.New(target.Mapping.GroupVersionKind)
if err != nil {
return nil, api.StrategicMergePatchType, fmt.Errorf("failed to get versionedObject: %s", err)
}
oldData, err := json.Marshal(currentObj)
if err != nil { if err != nil {
return nil, api.StrategicMergePatchType, fmt.Errorf("serializing current configuration: %s", err) return nil, api.StrategicMergePatchType, fmt.Errorf("serializing current configuration: %s", err)
} }
newData, err := json.Marshal(target.Object) newData, err := json.Marshal(target)
if err != nil { if err != nil {
return nil, api.StrategicMergePatchType, fmt.Errorf("serializing target configuration: %s", err) return nil, api.StrategicMergePatchType, fmt.Errorf("serializing target configuration: %s", err)
} }
@ -373,19 +368,24 @@ func createPatch(target *resource.Info, currentObj runtime.Object) ([]byte, api.
return nil, api.StrategicMergePatchType, nil return nil, api.StrategicMergePatchType, nil
} }
switch target.Object.(type) { // Get a versioned object
case *runtime.Unstructured: versionedObject, err := api.Scheme.New(mapping.GroupVersionKind)
switch {
case runtime.IsNotRegisteredError(err):
// fall back to generic JSON merge patch
patch, err := jsonpatch.CreateMergePatch(oldData, newData) patch, err := jsonpatch.CreateMergePatch(oldData, newData)
return patch, api.MergePatchType, err return patch, api.MergePatchType, err
case err != nil:
return nil, api.StrategicMergePatchType, fmt.Errorf("failed to get versionedObject: %s", err)
default: default:
log.Printf("generating strategic merge patch for %T", target.Object) log.Printf("generating strategic merge patch for %T", target)
patch, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, versionedObject) patch, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, versionedObject)
return patch, api.StrategicMergePatchType, err return patch, api.StrategicMergePatchType, err
} }
} }
func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, recreate bool) error { func updateResource(c *Client, target *resource.Info, currentObj runtime.Object, recreate bool) error {
patch, patchType, err := createPatch(target, currentObj) patch, patchType, err := createPatch(target.Mapping, target.Object, currentObj)
if err != nil { if err != nil {
return fmt.Errorf("failed to create patch: %s", err) return fmt.Errorf("failed to create patch: %s", err)
} }

@ -169,7 +169,7 @@ func TestUpdate(t *testing.T) {
t.Fatalf("could not dump request: %s", err) t.Fatalf("could not dump request: %s", err)
} }
req.Body.Close() req.Body.Close()
expected := `{"spec":{"containers":[{"image":"abc/app:v4","name":"app:v4","ports":[{"containerPort":443,"name":"https"}],"resources":{}}]}}` expected := `{"spec":{"containers":[{"name":"app:v4","ports":[{"containerPort":443,"name":"https"},{"$patch":"delete","containerPort":80}]}]}}`
if string(data) != expected { if string(data) != expected {
t.Errorf("expected patch\n%s\ngot\n%s", expected, string(data)) t.Errorf("expected patch\n%s\ngot\n%s", expected, string(data))
} }

Loading…
Cancel
Save