From 14a6e4dc5c211fb819723774d07448e861d627f0 Mon Sep 17 00:00:00 2001 From: ShiChangkuo Date: Wed, 25 Dec 2019 20:38:18 +0800 Subject: [PATCH 1/2] Make creating response code of certificate be compatible with hcs and hc the creating response code of certificate on HuaweiCloud is 201, while the creating response code of certificate on HuaweiCloudStack is 200. --- .../v2/extensions/lbaas_v2/certificates/requests.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 } From c13de4eaa4a7229ab3e4a1ecce9fdc20c867f249 Mon Sep 17 00:00:00 2001 From: ShiChangkuo Date: Thu, 26 Dec 2019 15:58:51 +0800 Subject: [PATCH 2/2] Add new SDK package of AS groups for HCS the API of creating AS group with HCS is a little bit with huaweicloud, especially in lbaas_listeners, so we add a new sdk package. Signed-off-by: ShiChangkuo --- .../autoscaling/v1/groups_hcs/requests.go | 190 ++++++++++++++++++ .../autoscaling/v1/groups_hcs/results.go | 116 +++++++++++ openstack/autoscaling/v1/groups_hcs/urls.go | 35 ++++ 3 files changed, 341 insertions(+) create mode 100644 openstack/autoscaling/v1/groups_hcs/requests.go create mode 100644 openstack/autoscaling/v1/groups_hcs/results.go create mode 100644 openstack/autoscaling/v1/groups_hcs/urls.go 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) +}