kernels.go raw

   1  package linodego
   2  
   3  import (
   4  	"context"
   5  	"encoding/json"
   6  	"time"
   7  
   8  	"github.com/linode/linodego/internal/parseabletime"
   9  )
  10  
  11  // LinodeKernel represents a Linode Instance kernel object
  12  type LinodeKernel struct {
  13  	ID           string     `json:"id"`
  14  	Label        string     `json:"label"`
  15  	Version      string     `json:"version"`
  16  	Architecture string     `json:"architecture"`
  17  	Deprecated   bool       `json:"deprecated"`
  18  	KVM          bool       `json:"kvm"`
  19  	XEN          bool       `json:"xen"`
  20  	PVOPS        bool       `json:"pvops"`
  21  	Built        *time.Time `json:"-"`
  22  }
  23  
  24  // UnmarshalJSON implements the json.Unmarshaler interface
  25  func (i *LinodeKernel) UnmarshalJSON(b []byte) error {
  26  	type Mask LinodeKernel
  27  
  28  	p := struct {
  29  		*Mask
  30  
  31  		Built *parseabletime.ParseableTime `json:"built"`
  32  	}{
  33  		Mask: (*Mask)(i),
  34  	}
  35  
  36  	if err := json.Unmarshal(b, &p); err != nil {
  37  		return err
  38  	}
  39  
  40  	i.Built = (*time.Time)(p.Built)
  41  
  42  	return nil
  43  }
  44  
  45  // ListKernels lists linode kernels. This endpoint is cached by default.
  46  func (c *Client) ListKernels(ctx context.Context, opts *ListOptions) ([]LinodeKernel, error) {
  47  	endpoint, err := generateListCacheURL("linode/kernels", opts)
  48  	if err != nil {
  49  		return nil, err
  50  	}
  51  
  52  	if result := c.getCachedResponse(endpoint); result != nil {
  53  		return result.([]LinodeKernel), nil
  54  	}
  55  
  56  	response, err := getPaginatedResults[LinodeKernel](ctx, c, "linode/kernels", opts)
  57  	if err != nil {
  58  		return nil, err
  59  	}
  60  
  61  	c.addCachedResponse(endpoint, response, nil)
  62  
  63  	return response, nil
  64  }
  65  
  66  // GetKernel gets the kernel with the provided ID. This endpoint is cached by default.
  67  func (c *Client) GetKernel(ctx context.Context, kernelID string) (*LinodeKernel, error) {
  68  	e := formatAPIPath("linode/kernels/%s", kernelID)
  69  
  70  	if result := c.getCachedResponse(e); result != nil {
  71  		result := result.(LinodeKernel)
  72  		return &result, nil
  73  	}
  74  
  75  	response, err := doGETRequest[LinodeKernel](ctx, c, e)
  76  	if err != nil {
  77  		return nil, err
  78  	}
  79  
  80  	c.addCachedResponse(e, response, nil)
  81  
  82  	return response, nil
  83  }
  84