github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/cce/v3/addons/requests.go (about)

     1  package addons
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"github.com/chnsz/golangsdk"
     7  )
     8  
     9  // ListOpts allows the filtering of list data using given parameters.
    10  type ListOpts struct {
    11  	AddonTemplateName string `json:"addonTemplateName"`
    12  	Uid               string `json:"uid"`
    13  	Version           string `json:"version"`
    14  	Status            string `json:"status"`
    15  }
    16  
    17  // List returns collection of addons.
    18  func List(client *golangsdk.ServiceClient, clusterID string, opts ListOpts) ([]Addon, error) {
    19  	var r ListResult
    20  	_, r.Err = client.Get(resourceListURL(client, clusterID), &r.Body, nil)
    21  
    22  	allAddons, err := r.ExtractAddon()
    23  
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	return FilterAddons(allAddons, opts), nil
    29  }
    30  
    31  func FilterAddons(addons []Addon, opts ListOpts) []Addon {
    32  
    33  	var refinedAddons []Addon
    34  	var matched bool
    35  
    36  	m := map[string]FilterStruct{}
    37  
    38  	if opts.AddonTemplateName != "" {
    39  		m["AddonTemplateName"] = FilterStruct{Value: opts.AddonTemplateName, Driller: []string{"Spec"}}
    40  	}
    41  	if opts.Version != "" {
    42  		m["Version"] = FilterStruct{Value: opts.Version, Driller: []string{"Spec"}}
    43  	}
    44  	if opts.Uid != "" {
    45  		m["Id"] = FilterStruct{Value: opts.Uid, Driller: []string{"Metadata"}}
    46  	}
    47  	if opts.Status != "" {
    48  		m["Status"] = FilterStruct{Value: opts.Status, Driller: []string{"Status"}}
    49  	}
    50  
    51  	if len(m) > 0 && len(addons) > 0 {
    52  		for _, addon := range addons {
    53  			matched = true
    54  
    55  			for key, value := range m {
    56  				if sVal := GetStructNestedField(&addon, key, value.Driller); sVal != value.Value {
    57  					matched = false
    58  					break
    59  				}
    60  			}
    61  			if matched {
    62  				refinedAddons = append(refinedAddons, addon)
    63  			}
    64  		}
    65  	}
    66  
    67  	return refinedAddons
    68  }
    69  
    70  func GetStructNestedField(v *Addon, field string, structDriller []string) string {
    71  	r := reflect.ValueOf(v)
    72  	for _, drillField := range structDriller {
    73  		f := reflect.Indirect(r).FieldByName(drillField).Interface()
    74  		r = reflect.ValueOf(f)
    75  	}
    76  	f1 := reflect.Indirect(r).FieldByName(field)
    77  	return string(f1.String())
    78  }
    79  
    80  type FilterStruct struct {
    81  	Value   string
    82  	Driller []string
    83  }
    84  
    85  // CreateOptsBuilder allows extensions to add additional parameters to the
    86  // Create request.
    87  type CreateOptsBuilder interface {
    88  	ToAddonCreateMap() (map[string]interface{}, error)
    89  }
    90  
    91  // CreateOpts contains all the values needed to create a new addon
    92  type CreateOpts struct {
    93  	// API type, fixed value Addon
    94  	Kind string `json:"kind" required:"true"`
    95  	// API version, fixed value v3
    96  	ApiVersion string `json:"apiVersion" required:"true"`
    97  	// Metadata required to create an addon
    98  	Metadata CreateMetadata `json:"metadata" required:"true"`
    99  	// specifications to create an addon
   100  	Spec RequestSpec `json:"spec" required:"true"`
   101  }
   102  
   103  type CreateMetadata struct {
   104  	Anno CreateAnnotations `json:"annotations" required:"true"`
   105  }
   106  
   107  type CreateAnnotations struct {
   108  	AddonInstallType string `json:"addon.install/type" required:"true"`
   109  }
   110  
   111  // Specifications to create an addon
   112  type RequestSpec struct {
   113  	// For the addon version.
   114  	Version string `json:"version,omitempty"`
   115  	// Cluster ID.
   116  	ClusterID string `json:"clusterID" required:"true"`
   117  	// Addon Template Name.
   118  	AddonTemplateName string `json:"addonTemplateName" required:"true"`
   119  	// Addon Parameters
   120  	Values Values `json:"values" required:"true"`
   121  }
   122  
   123  type Values struct {
   124  	Basic  map[string]interface{} `json:"basic" required:"true"`
   125  	Custom map[string]interface{} `json:"custom,omitempty"`
   126  	Flavor map[string]interface{} `json:"flavor,omitempty"`
   127  }
   128  
   129  // UpdateOptsBuilder allows extensions to add additional parameters to the Update request.
   130  type UpdateOptsBuilder interface {
   131  	ToAddonUpdateMap() (map[string]interface{}, error)
   132  }
   133  
   134  type UpdateOpts struct {
   135  	// API type, fixed value Addon
   136  	Kind string `json:"kind" required:"true"`
   137  	// API version, fixed value v3
   138  	ApiVersion string `json:"apiVersion" required:"true"`
   139  	// Metadata required to create an addon
   140  	Metadata UpdateMetadata `json:"metadata" required:"true"`
   141  	// specifications to create an addon
   142  	Spec RequestSpec `json:"spec" required:"true"`
   143  }
   144  
   145  type UpdateMetadata struct {
   146  	Anno UpdateAnnotations `json:"annotations" required:"true"`
   147  }
   148  
   149  type UpdateAnnotations struct {
   150  	AddonUpgradeType string `json:"addon.upgrade/type" required:"true"`
   151  }
   152  
   153  // ToAddonCreateMap builds a create request body from CreateOpts.
   154  func (opts CreateOpts) ToAddonCreateMap() (map[string]interface{}, error) {
   155  	return golangsdk.BuildRequestBody(opts, "")
   156  }
   157  
   158  // Create accepts a CreateOpts struct and uses the values to create a new
   159  // addon.
   160  func Create(c *golangsdk.ServiceClient, opts CreateOptsBuilder, cluster_id string) (r CreateResult) {
   161  	b, err := opts.ToAddonCreateMap()
   162  	if err != nil {
   163  		r.Err = err
   164  		return
   165  	}
   166  	reqOpt := &golangsdk.RequestOpts{OkCodes: []int{201}}
   167  	_, r.Err = c.Post(rootURL(c, cluster_id), b, &r.Body, reqOpt)
   168  	return
   169  }
   170  
   171  // ToAddonUpdateMap builds a update request body from UpdateOpts.
   172  func (opts UpdateOpts) ToAddonUpdateMap() (map[string]interface{}, error) {
   173  	return golangsdk.BuildRequestBody(opts, "")
   174  }
   175  
   176  // Update accepts a UpdateOpts struct and uses the values to update the addon.
   177  func Update(c *golangsdk.ServiceClient, opts UpdateOptsBuilder, id, cluster_id string) (r UpdateResult) {
   178  	b, err := opts.ToAddonUpdateMap()
   179  	if err != nil {
   180  		r.Err = err
   181  		return
   182  	}
   183  	reqOpt := &golangsdk.RequestOpts{OkCodes: []int{200}}
   184  	_, r.Err = c.Put(resourceUpdateURL(c, id, cluster_id), b, &r.Body, reqOpt)
   185  	return
   186  }
   187  
   188  // Get retrieves a particular addon based on its unique ID.
   189  func Get(c *golangsdk.ServiceClient, id, cluster_id string) (r GetResult) {
   190  	_, r.Err = c.Get(resourceURL(c, id, cluster_id), &r.Body, nil)
   191  	return
   192  }
   193  
   194  // Delete will permanently delete a particular addon based on its unique ID.
   195  func Delete(c *golangsdk.ServiceClient, id, cluster_id string) (r DeleteResult) {
   196  	reqOpt := &golangsdk.RequestOpts{OkCodes: []int{200}}
   197  	_, r.Err = c.Delete(resourceURL(c, id, cluster_id), reqOpt)
   198  	return
   199  }