github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/cce/v3/addons/requests.go (about)

     1  package addons
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/opentelekomcloud/gophertelekomcloud"
     7  )
     8  
     9  var RequestOpts = golangsdk.RequestOpts{
    10  	MoreHeaders: map[string]string{"Content-Type": "application/json"},
    11  }
    12  
    13  // CreateOptsBuilder allows extensions to add additional parameters to the
    14  // Create request.
    15  type CreateOptsBuilder interface {
    16  	ToAddonCreateMap() (map[string]interface{}, error)
    17  }
    18  
    19  // CreateOpts contains all the values needed to create a new addon
    20  type CreateOpts struct {
    21  	// API type, fixed value Addon
    22  	Kind string `json:"kind" required:"true"`
    23  	// API version, fixed value v3
    24  	ApiVersion string `json:"apiVersion" required:"true"`
    25  	// Metadata required to create an addon
    26  	Metadata CreateMetadata `json:"metadata" required:"true"`
    27  	// specifications to create an addon
    28  	Spec RequestSpec `json:"spec" required:"true"`
    29  }
    30  
    31  type CreateMetadata struct {
    32  	Annotations CreateAnnotations `json:"annotations" required:"true"`
    33  }
    34  
    35  type CreateAnnotations struct {
    36  	AddonInstallType string `json:"addon.install/type" required:"true"`
    37  }
    38  
    39  // Specifications to create an addon
    40  type RequestSpec struct {
    41  	// For the addon version.
    42  	Version string `json:"version" required:"true"`
    43  	// Cluster ID.
    44  	ClusterID string `json:"clusterID" required:"true"`
    45  	// Addon Template Name.
    46  	AddonTemplateName string `json:"addonTemplateName" required:"true"`
    47  	// Addon Parameters
    48  	Values Values `json:"values" required:"true"`
    49  }
    50  
    51  type Values struct {
    52  	Basic    map[string]interface{} `json:"basic" required:"true"`
    53  	Advanced map[string]interface{} `json:"custom,omitempty"`
    54  	Flavor   map[string]interface{} `json:"flavor,omitempty"`
    55  }
    56  
    57  // ToAddonCreateMap builds a create request body from CreateOpts.
    58  func (opts CreateOpts) ToAddonCreateMap() (map[string]interface{}, error) {
    59  	return golangsdk.BuildRequestBody(opts, "")
    60  }
    61  
    62  // Create accepts a CreateOpts struct and uses the values to create a new
    63  // addon.
    64  func Create(c *golangsdk.ServiceClient, opts CreateOptsBuilder, clusterId string) (r CreateResult) {
    65  	b, err := opts.ToAddonCreateMap()
    66  	if err != nil {
    67  		r.Err = err
    68  		return
    69  	}
    70  	reqOpt := &golangsdk.RequestOpts{OkCodes: []int{201}}
    71  	_, r.Err = c.Post(rootURL(c, clusterId), b, &r.Body, reqOpt)
    72  	return
    73  }
    74  
    75  // Get retrieves a particular addon based on its unique ID.
    76  func Get(c *golangsdk.ServiceClient, id, clusterId string) (r GetResult) {
    77  	_, r.Err = c.Get(resourceURL(c, id, clusterId), &r.Body, &golangsdk.RequestOpts{
    78  		OkCodes: []int{200},
    79  	})
    80  	return
    81  }
    82  
    83  // UpdateOptsBuilder allows extensions to add additional parameters to the
    84  // Update request.
    85  type UpdateOptsBuilder interface {
    86  	ToAddonUpdateMap() (map[string]interface{}, error)
    87  }
    88  
    89  type UpdateMetadata struct {
    90  	// Add-on annotations in the format of key-value pairs.
    91  	// For add-on upgrade, the value is fixed at {"addon.upgrade/type":"upgrade"}.
    92  	Annotations UpdateAnnotations `json:"annotations" required:"true"`
    93  	// Add-on labels in the format of key-value pairs.
    94  	Labels map[string]string `json:"metadata,omitempty"`
    95  }
    96  
    97  type UpdateAnnotations struct {
    98  	AddonUpdateType string `json:"addon.upgrade/type" required:"true"`
    99  }
   100  
   101  type UpdateOpts struct {
   102  	// API type, fixed value Addon
   103  	Kind string `json:"kind" required:"true"`
   104  	// API version, fixed value v3
   105  	ApiVersion string `json:"apiVersion" required:"true"`
   106  	// Metadata required to create an addon
   107  	Metadata UpdateMetadata `json:"metadata" required:"true"`
   108  	// specifications to create an addon
   109  	Spec RequestSpec `json:"spec" required:"true"`
   110  }
   111  
   112  func (opts UpdateOpts) ToAddonUpdateMap() (map[string]interface{}, error) {
   113  	return golangsdk.BuildRequestBody(opts, "")
   114  }
   115  
   116  func Update(c *golangsdk.ServiceClient, id, clusterId string, opts UpdateOpts) (r UpdateResult) {
   117  	b, err := opts.ToAddonUpdateMap()
   118  	if err != nil {
   119  		r.Err = err
   120  		return
   121  	}
   122  	_, r.Err = c.Put(resourceURL(c, id, clusterId), b, &r.Body, &golangsdk.RequestOpts{
   123  		OkCodes: []int{200},
   124  	})
   125  	return
   126  }
   127  
   128  // Delete will permanently delete a particular addon based on its unique ID.
   129  func Delete(c *golangsdk.ServiceClient, id, clusterId string) (r DeleteResult) {
   130  	_, r.Err = c.Delete(resourceURL(c, id, clusterId), &golangsdk.RequestOpts{
   131  		OkCodes:     []int{200},
   132  		MoreHeaders: RequestOpts.MoreHeaders, JSONBody: nil,
   133  	})
   134  	return
   135  }
   136  
   137  type ListOptsBuilder interface {
   138  	ToAddonListQuery() (string, error)
   139  }
   140  
   141  type ListOpts struct {
   142  	Name string `q:"addon_template_name"`
   143  }
   144  
   145  func (opts ListOpts) ToAddonListQuery() (string, error) {
   146  	u, err := golangsdk.BuildQueryString(opts)
   147  	if err != nil {
   148  		return "", err
   149  	}
   150  	return u.String(), nil
   151  }
   152  
   153  func ListTemplates(c *golangsdk.ServiceClient, clusterID string, opts ListOptsBuilder) (r ListTemplateResult) {
   154  	url := templatesURL(c, clusterID)
   155  	if opts != nil {
   156  		q, err := opts.ToAddonListQuery()
   157  		if err != nil {
   158  			r.Err = err
   159  			return
   160  		}
   161  		url += q
   162  	}
   163  	_, r.Err = c.Get(url, &r.Body, &golangsdk.RequestOpts{
   164  		OkCodes: []int{200},
   165  	})
   166  	return
   167  }
   168  
   169  func GetTemplates(c *golangsdk.ServiceClient) (r ListTemplateResult) {
   170  	_, r.Err = c.Get(addonTemplatesURL(c), &r.Body, &golangsdk.RequestOpts{
   171  		OkCodes: []int{200},
   172  	})
   173  	return
   174  }
   175  
   176  func ListAddonInstances(c *golangsdk.ServiceClient, clusterID string) (r ListInstanceResult) {
   177  	_, r.Err = c.Get(instanceURL(c, clusterID), &r.Body, &golangsdk.RequestOpts{
   178  		OkCodes: []int{200},
   179  	})
   180  	return
   181  }
   182  
   183  // WaitForAddonRunning - wait until addon status is `running`
   184  func WaitForAddonRunning(client *golangsdk.ServiceClient, id, clusterID string, timeoutSeconds int) error {
   185  	return golangsdk.WaitFor(timeoutSeconds, func() (bool, error) {
   186  		addon, err := Get(client, id, clusterID).Extract()
   187  		if err != nil {
   188  			return false, fmt.Errorf("error retriving addon status: %w", err)
   189  		}
   190  		if addon.Status.Status == "running" {
   191  			return true, nil
   192  		}
   193  		return false, nil
   194  	})
   195  }
   196  
   197  // WaitForAddonDeleted - wait until addon is deleted
   198  func WaitForAddonDeleted(client *golangsdk.ServiceClient, id, clusterID string, timeoutSeconds int) error {
   199  	return golangsdk.WaitFor(timeoutSeconds, func() (bool, error) {
   200  		_, err := Get(client, id, clusterID).Extract()
   201  		if err != nil {
   202  			if _, ok := err.(golangsdk.ErrDefault404); ok {
   203  				return true, nil
   204  			}
   205  			return false, fmt.Errorf("error retriving addon status: %w", err)
   206  		}
   207  		return false, nil
   208  	})
   209  }