mirror of
https://github.com/kubernetes/client-go.git
synced 2025-06-28 16:07:29 +00:00
Manually set GVK in extract, add commentary to extractor
Kubernetes-commit: dda31bbf2e7a94624e3679e3db56c95e66509ce0
This commit is contained in:
parent
690f06e07a
commit
7525c0e37a
@ -10,20 +10,27 @@ import (
|
|||||||
"sigs.k8s.io/structured-merge-diff/v4/typed"
|
"sigs.k8s.io/structured-merge-diff/v4/typed"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// UnstructuredExtractor enables extracting the applied configuration state from object for fieldManager into an
|
||||||
|
// unstructured object type.
|
||||||
type UnstructuredExtractor interface {
|
type UnstructuredExtractor interface {
|
||||||
ExtractUnstructured(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error)
|
ExtractUnstructured(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error)
|
||||||
ExtractUnstructuredStatus(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error)
|
ExtractUnstructuredStatus(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type parserCache interface {
|
// objectTypeCache is a cache of typed.ParseableTypes
|
||||||
parserForGVK(gvk schema.GroupVersionKind) (*typed.ParseableType, error)
|
type objectTypeCache interface {
|
||||||
|
objectTypeForGVK(gvk schema.GroupVersionKind) (*typed.ParseableType, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type nonCachingParserCache struct {
|
// nonCachingObjectTypeCache is a objectTypeCache that does no caching
|
||||||
|
// (i.e. it downloads the OpenAPISchema every time)
|
||||||
|
// Useful during the proof-of-concept stage until we agree on a caching solution.
|
||||||
|
type nonCachingObjectTypeCache struct {
|
||||||
discoveryClient *discovery.DiscoveryClient
|
discoveryClient *discovery.DiscoveryClient
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *nonCachingParserCache) parserForGVK(gvk schema.GroupVersionKind) (*typed.ParseableType, error) {
|
// objectTypeForGVK retrieves the typed.ParseableType for a given gvk from the cache
|
||||||
|
func (c *nonCachingObjectTypeCache) objectTypeForGVK(gvk schema.GroupVersionKind) (*typed.ParseableType, error) {
|
||||||
doc, err := c.discoveryClient.OpenAPISchema()
|
doc, err := c.discoveryClient.OpenAPISchema()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -43,31 +50,38 @@ func (c *nonCachingParserCache) parserForGVK(gvk schema.GroupVersionKind) (*type
|
|||||||
}
|
}
|
||||||
|
|
||||||
type extractor struct {
|
type extractor struct {
|
||||||
cache parserCache
|
cache objectTypeCache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewUnstructuredExtractor creates the extractor with which you can extract the applied configuration
|
||||||
|
// for a given manager from an unstructured object.
|
||||||
func NewUnstructuredExtractor(dc *discovery.DiscoveryClient) UnstructuredExtractor {
|
func NewUnstructuredExtractor(dc *discovery.DiscoveryClient) UnstructuredExtractor {
|
||||||
return &extractor{
|
return &extractor{
|
||||||
cache: &nonCachingParserCache{dc},
|
cache: &nonCachingObjectTypeCache{dc},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExtractUnstructured extracts the applied configuration owned by fiieldManager from an unstructured object.
|
||||||
|
// Note that the apply configuration itself is also an unstructured object.
|
||||||
func (e *extractor) ExtractUnstructured(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error) {
|
func (e *extractor) ExtractUnstructured(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error) {
|
||||||
return e.extractUnstructured(object, fieldManager, "")
|
return e.extractUnstructured(object, fieldManager, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExtractUnstructuredStatus is the same as ExtractUnstructured except
|
||||||
|
// that it extracts the status subresource applied configuration.
|
||||||
|
// Experimental!
|
||||||
func (e *extractor) ExtractUnstructuredStatus(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error) {
|
func (e *extractor) ExtractUnstructuredStatus(object *unstructured.Unstructured, fieldManager string) (*unstructured.Unstructured, error) {
|
||||||
return e.extractUnstructured(object, fieldManager, "status")
|
return e.extractUnstructured(object, fieldManager, "status")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *extractor) extractUnstructured(object *unstructured.Unstructured, fieldManager string, subresource string) (*unstructured.Unstructured, error) {
|
func (e *extractor) extractUnstructured(object *unstructured.Unstructured, fieldManager string, subresource string) (*unstructured.Unstructured, error) {
|
||||||
gvk := object.GetObjectKind().GroupVersionKind()
|
gvk := object.GetObjectKind().GroupVersionKind()
|
||||||
parser, err := e.cache.parserForGVK(gvk)
|
objectType, err := e.cache.objectTypeForGVK(gvk)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
result := &unstructured.Unstructured{}
|
result := &unstructured.Unstructured{}
|
||||||
err = managedfields.ExtractInto(object, *parser, fieldManager, result, subresource)
|
err = managedfields.ExtractInto(object, *objectType, fieldManager, result, subresource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user