github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/autoscaling/v1/configurations/requests.go (about) 1 package configurations 2 3 import ( 4 "encoding/base64" 5 "log" 6 7 "github.com/chnsz/golangsdk" 8 "github.com/chnsz/golangsdk/pagination" 9 ) 10 11 type CreateOptsBuilder interface { 12 ToConfigurationCreateMap() (map[string]interface{}, error) 13 } 14 15 type CreateOpts struct { 16 Name string `json:"scaling_configuration_name" required:"true"` 17 InstanceConfig InstanceConfigOpts `json:"instance_config" required:"true"` 18 } 19 20 func (opts CreateOpts) ToConfigurationCreateMap() (map[string]interface{}, error) { 21 b, err := golangsdk.BuildRequestBody(opts, "") 22 if err != nil { 23 return nil, err 24 } 25 26 if opts.InstanceConfig.UserData != nil { 27 var userData string 28 if _, err := base64.StdEncoding.DecodeString(string(opts.InstanceConfig.UserData)); err != nil { 29 userData = base64.StdEncoding.EncodeToString(opts.InstanceConfig.UserData) 30 } else { 31 userData = string(opts.InstanceConfig.UserData) 32 } 33 b["instance_config"].(map[string]interface{})["user_data"] = &userData 34 } 35 log.Printf("[DEBUG] ToConfigurationCreateMap b is: %#v", b) 36 return b, nil 37 } 38 39 // InstanceConfigOpts is an inner struct of CreateOpts 40 type InstanceConfigOpts struct { 41 InstanceID string `json:"instance_id,omitempty"` 42 FlavorRef string `json:"flavorRef,omitempty"` 43 ImageRef string `json:"imageRef,omitempty"` 44 SSHKey string `json:"key_name,omitempty"` 45 ServerGroupID string `json:"server_group_id,omitempty"` 46 Tenancy string `json:"tenancy,omitempty"` 47 DedicatedHostID string `json:"dedicated_host_id,omitempty"` 48 FlavorPriorityPolicy string `json:"multi_flavor_priority_policy,omitempty"` 49 MarketType string `json:"market_type,omitempty"` 50 51 Disk []DiskOpts `json:"disk,omitempty"` 52 Personality []PersonalityOpts `json:"personality,omitempty"` 53 PubicIP *PublicIpOpts `json:"public_ip,omitempty"` 54 SecurityGroups []SecurityGroupOpts `json:"security_groups,omitempty"` 55 56 // UserData contains configuration information or scripts to use upon launch. 57 // Create will base64-encode it for you, if it isn't already. 58 UserData []byte `json:"-"` 59 Metadata map[string]interface{} `json:"metadata,omitempty"` 60 } 61 62 // DiskOpts is an inner struct of InstanceConfigOpts 63 type DiskOpts struct { 64 Size int `json:"size" required:"true"` 65 VolumeType string `json:"volume_type" required:"true"` 66 DiskType string `json:"disk_type" required:"true"` 67 DedicatedStorageID string `json:"dedicated_storage_id,omitempty"` 68 DataDiskImageID string `json:"data_disk_image_id,omitempty"` 69 SnapshotId string `json:"snapshot_id,omitempty"` 70 Metadata map[string]string `json:"metadata,omitempty"` 71 } 72 73 type PersonalityOpts struct { 74 Path string `json:"path" required:"true"` 75 Content string `json:"content" required:"true"` 76 } 77 78 type PublicIpOpts struct { 79 Eip EipOpts `json:"eip" required:"true"` 80 } 81 82 type EipOpts struct { 83 Type string `json:"ip_type" required:"true"` 84 Bandwidth BandwidthOpts `json:"bandwidth" required:"true"` 85 } 86 87 type BandwidthOpts struct { 88 ShareType string `json:"share_type" required:"true"` 89 Size int `json:"size,omitempty"` 90 ChargingMode string `json:"charging_mode,omitempty"` 91 ID string `json:"id,omitempty"` 92 } 93 94 type SecurityGroupOpts struct { 95 ID string `json:"id" required:"true"` 96 } 97 98 // Create is a method by which can be able to access to create a configuration 99 // of autoscaling 100 func Create(client *golangsdk.ServiceClient, opts CreateOptsBuilder) (r CreateResult) { 101 b, err := opts.ToConfigurationCreateMap() 102 if err != nil { 103 r.Err = err 104 return 105 } 106 _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ 107 OkCodes: []int{200}, 108 }) 109 return 110 } 111 112 // Get is a method by which can be able to access to get a configuration of 113 // autoscaling detailed information 114 func Get(client *golangsdk.ServiceClient, id string) (r GetResult) { 115 _, r.Err = client.Get(getURL(client, id), &r.Body, nil) 116 return 117 } 118 119 // Delete is a method by which can be able to delete a configuration of autoscaling 120 func Delete(client *golangsdk.ServiceClient, id string) (r DeleteResult) { 121 _, r.Err = client.Delete(deleteURL(client, id), nil) 122 return 123 } 124 125 type ListOptsBuilder interface { 126 ToConfigurationListQuery() (string, error) 127 } 128 129 type ListOpts struct { 130 Name string `q:"scaling_configuration_name"` 131 ImageID string `q:"image_id"` 132 } 133 134 func (opts ListOpts) ToConfigurationListQuery() (string, error) { 135 q, err := golangsdk.BuildQueryString(opts) 136 return q.String(), err 137 } 138 139 // List is method that can be able to list all configurations of autoscaling service 140 func List(client *golangsdk.ServiceClient, opts ListOptsBuilder) pagination.Pager { 141 url := listURL(client) 142 if opts != nil { 143 query, err := opts.ToConfigurationListQuery() 144 if err != nil { 145 return pagination.Pager{Err: err} 146 } 147 url += query 148 } 149 150 return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { 151 return ConfigurationPage{pagination.SinglePageBase(r)} 152 }) 153 }