diff --git a/openstack/autoscaling/v1/groups_hcs/requests.go b/openstack/autoscaling/v1/groups_hcs/requests.go new file mode 100644 index 000000000..8249076bf --- /dev/null +++ b/openstack/autoscaling/v1/groups_hcs/requests.go @@ -0,0 +1,190 @@ +package groups_hcs + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +//CreateGroupBuilder is an interface from which can build the request of creating group +type CreateOptsBuilder interface { + ToGroupCreateMap() (map[string]interface{}, error) +} + +//CreateGroupOps is a struct contains the parameters of creating group +type CreateOpts struct { + Name string `json:"scaling_group_name" required:"true"` + ConfigurationID string `json:"scaling_configuration_id,omitempty"` + DesireInstanceNumber int `json:"desire_instance_number,omitempty"` + MinInstanceNumber int `json:"min_instance_number,omitempty"` + MaxInstanceNumber int `json:"max_instance_number,omitempty"` + CoolDownTime int `json:"cool_down_time,omitempty"` + LBListenerID string `json:"lb_listener_id,omitempty"` + LBaaSListeners []LBaaSListenerOpts `json:"lbaas_listeners,omitempty"` + AvailableZones []string `json:"available_zones,omitempty"` + Networks []NetworkOpts `json:"networks" required:"ture"` + SecurityGroup []SecurityGroupOpts `json:"security_groups" required:"ture"` + VpcID string `json:"vpc_id" required:"ture"` + HealthPeriodicAuditMethod string `json:"health_periodic_audit_method,omitempty"` + HealthPeriodicAuditTime int `json:"health_periodic_audit_time,omitempty"` + InstanceTerminatePolicy string `json:"instance_terminate_policy,omitempty"` + Notifications []string `json:"notifications,omitempty"` + IsDeletePublicip bool `json:"delete_publicip,omitempty"` +} + +type NetworkOpts struct { + ID string `json:"id,omitempty"` +} + +type SecurityGroupOpts struct { + ID string `json:"id,omitempty"` +} + +type LBaaSListenerOpts struct { + ListenerID string `json:"listener_id" required:"true"` + ProtocolPort int `json:"protocol_port" required:"true"` + Weight int `json:"weight,omitempty"` +} + +func (opts CreateOpts) ToGroupCreateMap() (map[string]interface{}, error) { + return golangsdk.BuildRequestBody(opts, "") +} + +//CreateGroup is a method of creating group +func Create(client *golangsdk.ServiceClient, opts CreateOptsBuilder) (r CreateResult) { + b, err := opts.ToGroupCreateMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(createURL(client), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{200}, + }) + return +} + +//DeleteGroup is a method of deleting a group by group id +func Delete(client *golangsdk.ServiceClient, id string) (r DeleteResult) { + _, r.Err = client.Delete(deleteURL(client, id), nil) + return +} + +//GetGroup is a method of getting the detailed information of the group by id +func Get(client *golangsdk.ServiceClient, id string) (r GetResult) { + _, r.Err = client.Get(getURL(client, id), &r.Body, nil) + return +} + +type ListOptsBuilder interface { + ToGroupListQuery() (string, error) +} + +type ListOpts struct { + Name string `q:"scaling_group_name"` + ConfigurationID string `q:"scaling_configuration_id"` + Status string `q:"scaling_group_status"` +} + +// ToGroupListQuery formats a ListOpts into a query string. +func (opts ListOpts) ToGroupListQuery() (string, error) { + q, err := golangsdk.BuildQueryString(opts) + return q.String(), err +} + +func List(client *golangsdk.ServiceClient, ops ListOptsBuilder) pagination.Pager { + url := listURL(client) + if ops != nil { + q, err := ops.ToGroupListQuery() + if err != nil { + return pagination.Pager{Err: err} + } + url += q + } + + return pagination.NewPager(client, url, func(r pagination.PageResult) pagination.Page { + return GroupPage{pagination.SinglePageBase(r)} + }) +} + +//UpdateOptsBuilder is an interface which can build the map paramter of update function +type UpdateOptsBuilder interface { + ToGroupUpdateMap() (map[string]interface{}, error) +} + +//UpdateOpts is a struct which represents the parameters of update function +type UpdateOpts struct { + Name string `json:"scaling_group_name,omitempty"` + DesireInstanceNumber int `json:"desire_instance_number"` + MinInstanceNumber int `json:"min_instance_number"` + MaxInstanceNumber int `json:"max_instance_number"` + CoolDownTime int `json:"cool_down_time,omitempty"` + LBListenerID string `json:"lb_listener_id,omitempty"` + LBaaSListeners []LBaaSListenerOpts `json:"lbaas_listeners,omitempty"` + AvailableZones []string `json:"available_zones,omitempty"` + Networks []NetworkOpts `json:"networks,omitempty"` + SecurityGroup []SecurityGroupOpts `json:"security_groups,omitempty"` + HealthPeriodicAuditMethod string `json:"health_periodic_audit_method,omitempty"` + HealthPeriodicAuditTime int `json:"health_periodic_audit_time,omitempty"` + InstanceTerminatePolicy string `json:"instance_terminate_policy,omitempty"` + Notifications []string `json:"notifications,omitempty"` + IsDeletePublicip bool `json:"delete_publicip,omitempty"` + ConfigurationID string `json:"scaling_configuration_id,omitempty"` +} + +func (opts UpdateOpts) ToGroupUpdateMap() (map[string]interface{}, error) { + return golangsdk.BuildRequestBody(opts, "") +} + +//Update is a method which can be able to update the group via accessing to the +//autoscaling service with Put method and parameters +func Update(client *golangsdk.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) { + body, err := opts.ToGroupUpdateMap() + if err != nil { + r.Err = err + return + } + + _, r.Err = client.Put(updateURL(client, id), body, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{200}, + }) + return +} + +type ActionOptsBuilder interface { + ToActionMap() (map[string]interface{}, error) +} + +type ActionOpts struct { + Action string `json:"action" required:"true"` +} + +func (opts ActionOpts) ToActionMap() (map[string]interface{}, error) { + return golangsdk.BuildRequestBody(opts, "") +} + +func doAction(client *golangsdk.ServiceClient, id string, opts ActionOptsBuilder) (r ActionResult) { + b, err := opts.ToActionMap() + if err != nil { + r.Err = err + return + } + _, r.Err = client.Post(enableURL(client, id), &b, nil, &golangsdk.RequestOpts{ + OkCodes: []int{204}, + }) + return +} + +//Enable is an operation by which can make the group enable service +func Enable(client *golangsdk.ServiceClient, id string) (r ActionResult) { + opts := ActionOpts{ + Action: "resume", + } + return doAction(client, id, opts) +} + +//Disable is an operation by which can be able to pause the group +func Disable(client *golangsdk.ServiceClient, id string) (r ActionResult) { + opts := ActionOpts{ + Action: "pause", + } + return doAction(client, id, opts) +} diff --git a/openstack/autoscaling/v1/groups_hcs/results.go b/openstack/autoscaling/v1/groups_hcs/results.go new file mode 100644 index 000000000..8a0aa253e --- /dev/null +++ b/openstack/autoscaling/v1/groups_hcs/results.go @@ -0,0 +1,116 @@ +package groups_hcs + +import ( + "github.com/huaweicloud/golangsdk" + "github.com/huaweicloud/golangsdk/pagination" +) + +//CreateGroupResult is a struct retured by CreateGroup request +type CreateResult struct { + golangsdk.Result +} + +//Extract the create group result as a string type. +func (r CreateResult) Extract() (string, error) { + var a struct { + GroupID string `json:"scaling_group_id"` + } + err := r.Result.ExtractInto(&a) + return a.GroupID, err +} + +//DeleteGroupResult contains the body of the deleting group request +type DeleteResult struct { + golangsdk.ErrResult +} + +//GetGroupResult contains the body of getting detailed group request +type GetResult struct { + golangsdk.Result +} + +//Extract method will parse the result body into Group struct +func (r GetResult) Extract() (Group, error) { + var g Group + err := r.Result.ExtractIntoStructPtr(&g, "scaling_group") + return g, err +} + +//Group represents the struct of one autoscaling group +type Group struct { + Name string `json:"scaling_group_name"` + ID string `json:"scaling_group_id"` + Status string `json:"scaling_group_status"` + ConfigurationID string `json:"scaling_configuration_id"` + ConfigurationName string `json:"scaling_configuration_name"` + ActualInstanceNumber int `json:"current_instance_number"` + DesireInstanceNumber int `json:"desire_instance_number"` + MinInstanceNumber int `json:"min_instance_number"` + MaxInstanceNumber int `json:"max_instance_number"` + CoolDownTime int `json:"cool_down_time"` + LBListenerID string `json:"lb_listener_id"` + LBaaSListeners []LBaaSListener `json:"lbaas_listeners"` + AvailableZones []string `json:"available_zones"` + Networks []Network `json:"networks"` + SecurityGroups []SecurityGroup `json:"security_groups"` + CreateTime string `json:"create_time"` + VpcID string `json:"vpc_id"` + Detail string `json:"detail"` + IsScaling bool `json:"is_scaling"` + HealthPeriodicAuditMethod string `json:"health_periodic_audit_method"` + HealthPeriodicAuditTime int `json:"health_periodic_audit_time"` + InstanceTerminatePolicy string `json:"instance_terminate_policy"` + Notifications []string `json:"notifications"` + DeletePublicip bool `json:"delete_publicip"` + CloudLocationID string `json:"cloud_location_id"` +} + +type Network struct { + ID string `json:"id"` +} + +type SecurityGroup struct { + ID string `json:"id"` +} + +type LBaaSListener struct { + ListenerID string `json:"listener_id"` + PoolID string `json:"pool_id"` + ProtocolPort int `json:"protocol_port"` + Weight int `json:"weight"` +} + +type GroupPage struct { + pagination.SinglePageBase +} + +// IsEmpty returns true if a ListResult contains no Volumes. +func (r GroupPage) IsEmpty() (bool, error) { + groups, err := r.Extract() + return len(groups) == 0, err +} + +func (r GroupPage) Extract() ([]Group, error) { + var gs []Group + err := r.Result.ExtractIntoSlicePtr(&gs, "scaling_groups") + return gs, err +} + +//UpdateResult is a struct from which can get the result of udpate method +type UpdateResult struct { + golangsdk.Result +} + +//Extract will deserialize the result to group id with string +func (r UpdateResult) Extract() (string, error) { + var a struct { + ID string `json:"scaling_group_id"` + } + err := r.Result.ExtractInto(&a) + return a.ID, err +} + +//this is the action result which is the result of enable or disable operations +type ActionResult struct { + golangsdk.ErrResult +} diff --git a/openstack/autoscaling/v1/groups_hcs/urls.go b/openstack/autoscaling/v1/groups_hcs/urls.go new file mode 100644 index 000000000..ed01cbdb7 --- /dev/null +++ b/openstack/autoscaling/v1/groups_hcs/urls.go @@ -0,0 +1,35 @@ +package groups_hcs + +import ( + "log" + + "github.com/huaweicloud/golangsdk" +) + +const resourcePath = "scaling_group" + +func createURL(c *golangsdk.ServiceClient) string { + ur := c.ServiceURL(resourcePath) + log.Printf("[DEBUG] Create URL is: %#v", ur) + return ur +} + +func deleteURL(c *golangsdk.ServiceClient, id string) string { + return c.ServiceURL(resourcePath, id) +} + +func getURL(c *golangsdk.ServiceClient, id string) string { + return c.ServiceURL(resourcePath, id) +} + +func listURL(c *golangsdk.ServiceClient) string { + return c.ServiceURL(resourcePath) +} + +func enableURL(c *golangsdk.ServiceClient, id string) string { + return c.ServiceURL(resourcePath, id, "action") +} + +func updateURL(c *golangsdk.ServiceClient, id string) string { + return c.ServiceURL(resourcePath, id) +} diff --git a/openstack/networking/v2/extensions/lbaas_v2/certificates/requests.go b/openstack/networking/v2/extensions/lbaas_v2/certificates/requests.go index 060164d38..f563bc794 100644 --- a/openstack/networking/v2/extensions/lbaas_v2/certificates/requests.go +++ b/openstack/networking/v2/extensions/lbaas_v2/certificates/requests.go @@ -80,7 +80,9 @@ func Create(c *golangsdk.ServiceClient, opts CreateOptsBuilder) (r CreateResult) r.Err = err return } - _, r.Err = c.Post(rootURL(c), b, &r.Body, nil) + _, r.Err = c.Post(rootURL(c), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{200, 201}, + }) return }