From 880fa9ceb384793fbf12e7d1e7443d2fe9b63cb9 Mon Sep 17 00:00:00 2001 From: Zhenguo Niu Date: Tue, 11 May 2021 12:22:37 +0000 Subject: [PATCH] Add elb v3 listeners --- openstack/elb/v3/listeners/requests.go | 204 +++++++++++++++++++++++++ openstack/elb/v3/listeners/results.go | 120 +++++++++++++++ openstack/elb/v3/listeners/urls.go | 16 ++ 3 files changed, 340 insertions(+) create mode 100644 openstack/elb/v3/listeners/requests.go create mode 100644 openstack/elb/v3/listeners/results.go create mode 100644 openstack/elb/v3/listeners/urls.go diff --git a/openstack/elb/v3/listeners/requests.go b/openstack/elb/v3/listeners/requests.go new file mode 100644 index 00000000..790e1576 --- /dev/null +++ b/openstack/elb/v3/listeners/requests.go @@ -0,0 +1,204 @@ +package listeners + +import ( + "github.com/huaweicloud/golangsdk" +) + +// Type Protocol represents a listener protocol. +type Protocol string + +// Supported attributes for create/update operations. +const ( + ProtocolTCP Protocol = "TCP" + ProtocolUDP Protocol = "UDP" + ProtocolHTTP Protocol = "HTTP" + ProtocolHTTPS Protocol = "HTTPS" +) + +// CreateOptsBuilder allows extensions to add additional parameters to the +// Create request. +type CreateOptsBuilder interface { + ToListenerCreateMap() (map[string]interface{}, error) +} + +// CreateOpts represents options for creating a listener. +type CreateOpts struct { + // The administrative state of the Listener. A valid value is true (UP) + // or false (DOWN). + AdminStateUp *bool `json:"admin_state_up,omitempty"` + + // the ID of the CA certificate used by the listener. + CAContainerRef string `json:"client_ca_tls_container_ref,omitempty"` + + // The ID of the default pool with which the Listener is associated. + DefaultPoolID string `json:"default_pool_id,omitempty"` + + // A reference to a Barbican container of TLS secrets. + DefaultTlsContainerRef string `json:"default_tls_container_ref,omitempty"` + + // Human-readable description for the Listener. + Description string `json:"description,omitempty"` + + // whether to use HTTP2. + Http2Enable *bool `json:"http2_enable,omitempty"` + + // The load balancer on which to provision this listener. + LoadbalancerID string `json:"loadbalancer_id" required:"true"` + + // Human-readable name for the Listener. Does not have to be unique. + Name string `json:"name,omitempty"` + + // ProjectID is only required if the caller has an admin role and wants + // to create a pool for another project. + ProjectID string `json:"project_id,omitempty"` + + // The protocol - can either be TCP, HTTP or HTTPS. + Protocol Protocol `json:"protocol" required:"true"` + + // The port on which to listen for client traffic. + ProtocolPort int `json:"protocol_port" required:"true"` + + // A list of references to TLS secrets. + SniContainerRefs []string `json:"sni_container_refs,omitempty"` + + // Specifies the security policy used by the listener. + TlsCiphersPolicy string `json:"tls_ciphers_policy,omitempty"` + + // Whether enable member retry + EnableMemberRetry *bool `json:"enable_member_retry,omitempty"` + + // The keepalive timeout of the Listener. + KeepaliveTimeout *int `json:"keepalive_timeout,omitempty"` + + // The client timeout of the Listener. + ClientTimeout *int `json:"client_timeout,omitempty"` + + // The member timeout of the Listener. + MemberTimeout *int `json:"member_timeout,omitempty"` + + // The ipgroup of the Listener. + IpGroup IpGroup `json:"ipgroup,omitempty"` + + // Transparent client ip enable + TransparentClientIP *bool `json:"transparent_client_ip_enable,omitempty"` + + // Enhance L7policy enable + EnhanceL7policy *bool `json:"enhance_l7policy_enable,omitempty"` +} + +type IpGroup struct { + IpGroupId string `json:"ipgroup_id" required:"true"` + Enable *bool `json:"enable_ipgroup" required:"true"` + Type string `json:"type" required:"true"` +} + +// ToListenerCreateMap builds a request body from CreateOpts. +func (opts CreateOpts) ToListenerCreateMap() (map[string]interface{}, error) { + return golangsdk.BuildRequestBody(opts, "listener") +} + +// Create is an operation which provisions a new Listeners based on the +// configuration defined in the CreateOpts struct. Once the request is +// validated and progress has started on the provisioning process, a +// CreateResult will be returned. +// +// Users with an admin role can create Listeners on behalf of other tenants by +// specifying a TenantID attribute different than their own. +func Create(c *golangsdk.ServiceClient, opts CreateOptsBuilder) (r CreateResult) { + b, err := opts.ToListenerCreateMap() + if err != nil { + r.Err = err + return + } + _, r.Err = c.Post(rootURL(c), b, &r.Body, nil) + return +} + +// Get retrieves a particular Listeners based on its unique ID. +func Get(c *golangsdk.ServiceClient, id string) (r GetResult) { + _, r.Err = c.Get(resourceURL(c, id), &r.Body, nil) + return +} + +// UpdateOptsBuilder allows extensions to add additional parameters to the +// Update request. +type UpdateOptsBuilder interface { + ToListenerUpdateMap() (map[string]interface{}, error) +} + +// UpdateOpts represents options for updating a Listener. +type UpdateOpts struct { + // The administrative state of the Listener. A valid value is true (UP) + // or false (DOWN). + AdminStateUp *bool `json:"admin_state_up,omitempty"` + + // the ID of the CA certificate used by the listener. + CAContainerRef string `json:"client_ca_tls_container_ref,omitempty"` + + // The ID of the default pool with which the Listener is associated. + DefaultPoolID string `json:"default_pool_id,omitempty"` + + // A reference to a Barbican container of TLS secrets. + DefaultTlsContainerRef string `json:"default_tls_container_ref,omitempty"` + + // Human-readable description for the Listener. + Description string `json:"description,omitempty"` + + // whether to use HTTP2. + Http2Enable *bool `json:"http2_enable,omitempty"` + + // Human-readable name for the Listener. Does not have to be unique. + Name string `json:"name,omitempty"` + + // A list of references to TLS secrets. + SniContainerRefs []string `json:"sni_container_refs,omitempty"` + + // Specifies the security policy used by the listener. + TlsCiphersPolicy string `json:"tls_ciphers_policy,omitempty"` + + // Whether enable member retry + EnableMemberRetry *bool `json:"enable_member_retry,omitempty"` + + // The keepalive timeout of the Listener. + KeepaliveTimeout *int `json:"keepalive_timeout,omitempty"` + + // The client timeout of the Listener. + ClientTimeout *int `json:"client_timeout,omitempty"` + + // The member timeout of the Listener. + MemberTimeout *int `json:"member_timeout,omitempty"` + + // The ipgroup of the Listener. + IpGroup IpGroup `json:"ipgroup,omitempty"` + + // Transparent client ip enable + TransparentClientIP *bool `json:"transparent_client_ip_enable,omitempty"` + + // Enhance L7policy enable + EnhanceL7policy *bool `json:"enhance_l7policy_enable,omitempty"` +} + +// ToListenerUpdateMap builds a request body from UpdateOpts. +func (opts UpdateOpts) ToListenerUpdateMap() (map[string]interface{}, error) { + return golangsdk.BuildRequestBody(opts, "listener") +} + +// Update is an operation which modifies the attributes of the specified +// Listener. +func Update(c *golangsdk.ServiceClient, id string, opts UpdateOpts) (r UpdateResult) { + b, err := opts.ToListenerUpdateMap() + if err != nil { + r.Err = err + return + } + _, r.Err = c.Put(resourceURL(c, id), b, &r.Body, &golangsdk.RequestOpts{ + OkCodes: []int{200, 202}, + }) + return +} + +// Delete will permanently delete a particular Listeners based on its unique ID. +func Delete(c *golangsdk.ServiceClient, id string) (r DeleteResult) { + _, r.Err = c.Delete(resourceURL(c, id), nil) + return +} diff --git a/openstack/elb/v3/listeners/results.go b/openstack/elb/v3/listeners/results.go new file mode 100644 index 00000000..bbe85c40 --- /dev/null +++ b/openstack/elb/v3/listeners/results.go @@ -0,0 +1,120 @@ +package listeners + +import ( + "github.com/huaweicloud/golangsdk" +) + +type LoadBalancerID struct { + ID string `json:"id"` +} + +// Listener is the primary load balancing configuration object that specifies +// the loadbalancer and port on which client traffic is received, as well +// as other details such as the load balancing method to be use, protocol, etc. +type Listener struct { + // The unique ID for the Listener. + ID string `json:"id"` + + // The administrative state of the Listener. A valid value is true (UP) or false (DOWN). + AdminStateUp bool `json:"admin_state_up"` + + // the ID of the CA certificate used by the listener. + CAContainerRef string `json:"client_ca_tls_container_ref"` + + // The maximum number of connections allowed for the Loadbalancer. + // Default is -1, meaning no limit. + ConnLimit int `json:"connection_limit"` + + // The UUID of default pool. Must have compatible protocol with listener. + DefaultPoolID string `json:"default_pool_id"` + + // A reference to a Barbican container of TLS secrets. + DefaultTlsContainerRef string `json:"default_tls_container_ref"` + + // Human-readable description for the Listener. + Description string `json:"description"` + + // whether to use HTTP2. + Http2Enable bool `json:"http2_enable"` + + // A list of load balancer IDs. + Loadbalancers []LoadBalancerID `json:"loadbalancers"` + + // Human-readable name for the Listener. Does not have to be unique. + Name string `json:"name"` + + // The protocol to loadbalance. A valid value is TCP, HTTP, or HTTPS. + Protocol string `json:"protocol"` + + // The port on which to listen to client traffic that is associated with the + // Loadbalancer. A valid value is from 0 to 65535. + ProtocolPort int `json:"protocol_port"` + + // The list of references to TLS secrets. + SniContainerRefs []string `json:"sni_container_refs"` + + // Specifies the security policy used by the listener. + TlsCiphersPolicy string `json:"tls_ciphers_policy"` + + // The provisioning status of the listener. + // This value is ACTIVE, PENDING_* or ERROR. + ProvisioningStatus string `json:"provisioning_status"` + + // Whether enable member retry + EnableMemberRetry *bool `json:"enable_member_retry,omitempty"` + + // The keepalive timeout of the Listener. + KeepaliveTimeout *int `json:"keepalive_timeout,omitempty"` + + // The client timeout of the Listener. + ClientTimeout *int `json:"client_timeout,omitempty"` + + // The member timeout of the Listener. + MemberTimeout *int `json:"member_timeout,omitempty"` + + // The ipgroup of the Listener. + IpGroup IpGroup `json:"ipgroup,omitempty"` + + // Transparent client ip enable + TransparentClientIP *bool `json:"transparent_client_ip_enable,omitempty"` + + // Enhance L7policy enable + EnhanceL7policy *bool `json:"enhance_l7policy_enable,omitempty"` +} + +type commonResult struct { + golangsdk.Result +} + +// Extract is a function that accepts a result and extracts a listener. +func (r commonResult) Extract() (*Listener, error) { + var s struct { + Listener *Listener `json:"listener"` + } + err := r.ExtractInto(&s) + return s.Listener, err +} + +// CreateResult represents the result of a create operation. Call its Extract +// method to interpret it as a Listener. +type CreateResult struct { + commonResult +} + +// GetResult represents the result of a get operation. Call its Extract +// method to interpret it as a Listener. +type GetResult struct { + commonResult +} + +// UpdateResult represents the result of an update operation. Call its Extract +// method to interpret it as a Listener. +type UpdateResult struct { + commonResult +} + +// DeleteResult represents the result of a delete operation. Call its +// ExtractErr method to determine if the request succeeded or failed. +type DeleteResult struct { + golangsdk.ErrResult +} diff --git a/openstack/elb/v3/listeners/urls.go b/openstack/elb/v3/listeners/urls.go new file mode 100644 index 00000000..237a5022 --- /dev/null +++ b/openstack/elb/v3/listeners/urls.go @@ -0,0 +1,16 @@ +package listeners + +import "github.com/huaweicloud/golangsdk" + +const ( + rootPath = "elb" + resourcePath = "listeners" +) + +func rootURL(c *golangsdk.ServiceClient) string { + return c.ServiceURL(rootPath, resourcePath) +} + +func resourceURL(c *golangsdk.ServiceClient, id string) string { + return c.ServiceURL(rootPath, resourcePath, id) +}