Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 190 additions & 0 deletions openstack/autoscaling/v1/groups_hcs/requests.go
Original file line number Diff line number Diff line change
@@ -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)
}
116 changes: 116 additions & 0 deletions openstack/autoscaling/v1/groups_hcs/results.go
Original file line number Diff line number Diff line change
@@ -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
}
35 changes: 35 additions & 0 deletions openstack/autoscaling/v1/groups_hcs/urls.go
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down