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 }