Skip to content

Instantly share code, notes, and snippets.

@aaronjwood
aaronjwood / apply.go
Last active July 25, 2021 08:25
Stitching it together
func DiscoverParseApply(ctx context.Context, client kubernetes.Interface, dynamicClient dynamic.Interface, manifest string) error {
groupResources, err := restmapper.GetAPIGroupResources(client.Discovery())
if err != nil {
return err
}
var resources []*Resource
docs := ParseDocuments(manifest)
for _, doc := range docs {
resource, err := ParseSearchConstruct(groupResources, dynamicClient, doc)
@aaronjwood
aaronjwood / restmapping.go
Created July 25, 2021 08:12
REST mapping
func restMapping(resources []*restmapper.APIGroupResources, gvk *schema.GroupVersionKind) (*meta.RESTMapping, error) {
mapping, err := restmapper.NewDiscoveryRESTMapper(resources).RESTMapping(schema.GroupKind{Group: gvk.Group, Kind: gvk.Kind}, gvk.Version)
if err != nil {
return nil, err
}
return mapping, nil
}
@aaronjwood
aaronjwood / decode.go
Created July 25, 2021 08:11
Decode document into unstructured
func decode(doc string) (*unstructured.Unstructured, *schema.GroupVersionKind, error) {
unstruct := &unstructured.Unstructured{}
_, gvk, err := scheme.Codecs.UniversalDeserializer().Decode([]byte(doc), nil, unstruct)
if err != nil {
return nil, nil, err
}
return unstruct, gvk, nil
}
@aaronjwood
aaronjwood / search.go
Created July 25, 2021 08:09
Searching an unstructured
func search(unstruct *unstructured.Unstructured, fields ...string) (interface{}, bool, error) {
field, found, err := unstructured.NestedFieldCopy(unstruct.Object, fields...)
if err != nil {
return "", found, err
}
return field, found, nil
}
@aaronjwood
aaronjwood / parse.go
Last active August 3, 2021 17:12
Parsing documents from a manifest
func ParseSearchConstruct(resources []*restmapper.APIGroupResources, dynamicClient dynamic.Interface, doc string) (*Resource, error) {
unstruct, gvk, err := decode(doc)
if err != nil {
return nil, err
}
ns, nsFound, err := search(unstruct, "metadata", "namespace")
if err != nil {
return nil, err
}
@aaronjwood
aaronjwood / parser.go
Created July 25, 2021 07:56
Manifest parser
var separator = regexp.MustCompile(`(?m)^---$`)
var commentStart = regexp.MustCompile(`(?m)^#.*$`)
// ParseDocuments parses a collection of YAML documents out of a single string.
func ParseDocuments(data string) []string {
docs := make([]string, 0)
if data == "" {
return docs
}
@aaronjwood
aaronjwood / apply.go
Created July 25, 2021 07:41
Apply method
// Apply takes parsed resources and applies them into a cluster.
func Apply(ctx context.Context, resources ...*Resource) error {
for _, resource := range resources {
_, createErr := resource.Action.Create(ctx, resource.Unstruct, metav1.CreateOptions{})
if createErr != nil {
if apiErrs.IsAlreadyExists(createErr) {
updateErr := Update(ctx, resource)
if updateErr != nil {
return updateErr
}
@aaronjwood
aaronjwood / resources.go
Created July 25, 2021 07:31
Resources type
type Resource struct {
Action dynamic.ResourceInterface
Unstruct *unstructured.Unstructured
Mapping *meta.RESTMapping
Ns string
Name string
}
@aaronjwood
aaronjwood / apply.go
Created July 25, 2021 07:26
Apply method stub
// Apply takes parsed resources and applies them into a cluster.
func Apply(ctx context.Context, resources ...*Resource) error {
return nil
}
{
"__inputs": [],
"__requires": [
{
"type": "panel",
"id": "gauge",
"name": "Gauge",
"version": ""
},
{