mirror of
https://github.com/kubernetes/client-go.git
synced 2025-08-01 15:28:01 +00:00
Add Apply and ApplyStatus methods to dynamic ResourceInterface
Kubernetes-commit: 581ac7f4465ed97ddc5c62f04376ac427e121601
This commit is contained in:
parent
2cf1a8ffd6
commit
4eab6be14c
@ -454,6 +454,51 @@ func (c *dynamicResourceClient) Patch(ctx context.Context, name string, pt types
|
|||||||
return ret, err
|
return ret, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: opts are currently ignored.
|
||||||
|
func (c *dynamicResourceClient) Apply(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error) {
|
||||||
|
outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var uncastRet runtime.Object
|
||||||
|
switch {
|
||||||
|
case len(c.namespace) == 0 && len(subresources) == 0:
|
||||||
|
uncastRet, err = c.client.Fake.
|
||||||
|
Invokes(testing.NewRootPatchAction(c.resource, name, types.ApplyPatchType, outBytes), &metav1.Status{Status: "dynamic patch fail"})
|
||||||
|
|
||||||
|
case len(c.namespace) == 0 && len(subresources) > 0:
|
||||||
|
uncastRet, err = c.client.Fake.
|
||||||
|
Invokes(testing.NewRootPatchSubresourceAction(c.resource, name, types.ApplyPatchType, outBytes, subresources...), &metav1.Status{Status: "dynamic patch fail"})
|
||||||
|
|
||||||
|
case len(c.namespace) > 0 && len(subresources) == 0:
|
||||||
|
uncastRet, err = c.client.Fake.
|
||||||
|
Invokes(testing.NewPatchAction(c.resource, c.namespace, name, types.ApplyPatchType, outBytes), &metav1.Status{Status: "dynamic patch fail"})
|
||||||
|
|
||||||
|
case len(c.namespace) > 0 && len(subresources) > 0:
|
||||||
|
uncastRet, err = c.client.Fake.
|
||||||
|
Invokes(testing.NewPatchSubresourceAction(c.resource, c.namespace, name, types.ApplyPatchType, outBytes, subresources...), &metav1.Status{Status: "dynamic patch fail"})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if uncastRet == nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := &unstructured.Unstructured{}
|
||||||
|
if err := c.client.scheme.Convert(uncastRet, ret, nil); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return ret, err
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *dynamicResourceClient) ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions) (*unstructured.Unstructured, error) {
|
||||||
|
return c.Apply(ctx, name, obj, options, "status")
|
||||||
|
}
|
||||||
|
|
||||||
func convertObjectsToUnstructured(s *runtime.Scheme, objs []runtime.Object) ([]runtime.Object, error) {
|
func convertObjectsToUnstructured(s *runtime.Scheme, objs []runtime.Object) ([]runtime.Object, error) {
|
||||||
ul := make([]runtime.Object, 0, len(objs))
|
ul := make([]runtime.Object, 0, len(objs))
|
||||||
|
|
||||||
|
@ -40,6 +40,8 @@ type ResourceInterface interface {
|
|||||||
List(ctx context.Context, opts metav1.ListOptions) (*unstructured.UnstructuredList, error)
|
List(ctx context.Context, opts metav1.ListOptions) (*unstructured.UnstructuredList, error)
|
||||||
Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
|
Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
|
||||||
Patch(ctx context.Context, name string, pt types.PatchType, data []byte, options metav1.PatchOptions, subresources ...string) (*unstructured.Unstructured, error)
|
Patch(ctx context.Context, name string, pt types.PatchType, data []byte, options metav1.PatchOptions, subresources ...string) (*unstructured.Unstructured, error)
|
||||||
|
Apply(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error)
|
||||||
|
ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, options metav1.ApplyOptions) (*unstructured.Unstructured, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type NamespaceableResourceInterface interface {
|
type NamespaceableResourceInterface interface {
|
||||||
|
@ -324,6 +324,48 @@ func (c *dynamicResourceClient) Patch(ctx context.Context, name string, pt types
|
|||||||
return uncastObj.(*unstructured.Unstructured), nil
|
return uncastObj.(*unstructured.Unstructured), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *dynamicResourceClient) Apply(ctx context.Context, name string, obj *unstructured.Unstructured, opts metav1.ApplyOptions, subresources ...string) (*unstructured.Unstructured, error) {
|
||||||
|
if len(name) == 0 {
|
||||||
|
return nil, fmt.Errorf("name is required")
|
||||||
|
}
|
||||||
|
outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
accessor, err := meta.Accessor(obj)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
managedFields := accessor.GetManagedFields()
|
||||||
|
if len(managedFields) > 0 {
|
||||||
|
return nil, fmt.Errorf(`cannot apply an object with managed fields already set.
|
||||||
|
Use the client-go/applyconfigurations "UnstructructuredExtractor" to obtain the unstructured ApplyConfiguration for the given field manager that you can use/modify here to apply`)
|
||||||
|
}
|
||||||
|
patchOpts := opts.ToPatchOptions()
|
||||||
|
|
||||||
|
result := c.client.client.
|
||||||
|
Patch(types.ApplyPatchType).
|
||||||
|
AbsPath(append(c.makeURLSegments(name), subresources...)...).
|
||||||
|
Body(outBytes).
|
||||||
|
SpecificallyVersionedParams(&patchOpts, dynamicParameterCodec, versionV1).
|
||||||
|
Do(ctx)
|
||||||
|
if err := result.Error(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
retBytes, err := result.Raw()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
uncastObj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, retBytes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return uncastObj.(*unstructured.Unstructured), nil
|
||||||
|
}
|
||||||
|
func (c *dynamicResourceClient) ApplyStatus(ctx context.Context, name string, obj *unstructured.Unstructured, opts metav1.ApplyOptions) (*unstructured.Unstructured, error) {
|
||||||
|
return c.Apply(ctx, name, obj, opts, "status")
|
||||||
|
}
|
||||||
|
|
||||||
func (c *dynamicResourceClient) makeURLSegments(name string) []string {
|
func (c *dynamicResourceClient) makeURLSegments(name string) []string {
|
||||||
url := []string{}
|
url := []string{}
|
||||||
if len(c.resource.Group) == 0 {
|
if len(c.resource.Group) == 0 {
|
||||||
|
Loading…
Reference in New Issue
Block a user