github.com/gophercloud/gophercloud@v1.11.0/openstack/networking/v2/extensions/fwaas_v2/groups/requests.go (about) 1 package groups 2 3 import ( 4 "github.com/gophercloud/gophercloud" 5 "github.com/gophercloud/gophercloud/pagination" 6 ) 7 8 // ListOptsBuilder allows extensions to add additional parameters to the 9 // List request. 10 type ListOptsBuilder interface { 11 ToGroupListQuery() (string, error) 12 } 13 14 // ListOpts allows the filtering and sorting of paginated collections through 15 // the API. Filtering is achieved by passing in struct field values that map to 16 // the firewall group attributes you want to see returned. SortKey allows you 17 // to sort by a particular firewall group attribute. SortDir sets the direction, 18 // and is either `asc' or `desc'. Marker and Limit are used for pagination. 19 type ListOpts struct { 20 TenantID string `q:"tenant_id"` 21 Name string `q:"name"` 22 Description string `q:"description"` 23 IngressFirewallPolicyID string `q:"ingress_firewall_policy_id"` 24 EgressFirewallPolicyID string `q:"egress_firewall_policy_id"` 25 AdminStateUp *bool `q:"admin_state_up"` 26 Ports *[]string `q:"ports"` 27 Status string `q:"status"` 28 ID string `q:"id"` 29 Shared *bool `q:"shared"` 30 ProjectID string `q:"project_id"` 31 Limit int `q:"limit"` 32 Marker string `q:"marker"` 33 SortKey string `q:"sort_key"` 34 SortDir string `q:"sort_dir"` 35 } 36 37 // ToGroupListQuery formats a ListOpts into a query string. 38 func (opts ListOpts) ToGroupListQuery() (string, error) { 39 q, err := gophercloud.BuildQueryString(opts) 40 if err != nil { 41 return "", err 42 } 43 return q.String(), err 44 } 45 46 // List returns a Pager which allows you to iterate over a collection of 47 // firewall groups. It accepts a ListOpts struct, which allows you to filter 48 // and sort the returned collection for greater efficiency. 49 // 50 // Default group settings return only those firewall groups that are owned by the 51 // tenant who submits the request, unless an admin user submits the request. 52 func List(c *gophercloud.ServiceClient, opts ListOptsBuilder) pagination.Pager { 53 url := rootURL(c) 54 55 if opts != nil { 56 query, err := opts.ToGroupListQuery() 57 if err != nil { 58 return pagination.Pager{Err: err} 59 } 60 url += query 61 } 62 63 return pagination.NewPager(c, url, func(r pagination.PageResult) pagination.Page { 64 return GroupPage{pagination.LinkedPageBase{PageResult: r}} 65 }) 66 } 67 68 // Get retrieves a particular firewall group based on its unique ID. 69 func Get(c *gophercloud.ServiceClient, id string) (r GetResult) { 70 _, r.Err = c.Get(resourceURL(c, id), &r.Body, nil) 71 return 72 } 73 74 // CreateOptsBuilder is the interface options structs have to satisfy in order 75 // to be used in the main Create operation in this package. Since many 76 // extensions decorate or modify the common logic, it is useful for them to 77 // satisfy a basic interface in order for them to be used. 78 type CreateOptsBuilder interface { 79 ToFirewallGroupCreateMap() (map[string]interface{}, error) 80 } 81 82 // CreateOpts contains all the values needed to create a new firewall group. 83 type CreateOpts struct { 84 ID string `json:"id,omitempty"` 85 TenantID string `json:"tenant_id,omitempty"` 86 Name string `json:"name,omitempty"` 87 Description string `json:"description,omitempty"` 88 IngressFirewallPolicyID string `json:"ingress_firewall_policy_id,omitempty"` 89 EgressFirewallPolicyID string `json:"egress_firewall_policy_id,omitempty"` 90 AdminStateUp *bool `json:"admin_state_up,omitempty"` 91 Ports []string `json:"ports,omitempty"` 92 Shared *bool `json:"shared,omitempty"` 93 ProjectID string `json:"project_id,omitempty"` 94 } 95 96 // ToFirewallGroupCreateMap casts a CreateOpts struct to a map. 97 func (opts CreateOpts) ToFirewallGroupCreateMap() (map[string]interface{}, error) { 98 return gophercloud.BuildRequestBody(opts, "firewall_group") 99 } 100 101 // Create accepts a CreateOpts struct and uses the values to create a new firewall group 102 func Create(c *gophercloud.ServiceClient, opts CreateOptsBuilder) (r CreateResult) { 103 b, err := opts.ToFirewallGroupCreateMap() 104 if err != nil { 105 r.Err = err 106 return 107 } 108 _, r.Err = c.Post(rootURL(c), b, &r.Body, nil) 109 return 110 } 111 112 // UpdateOptsBuilder is the interface options structs have to satisfy in order 113 // to be used in the main Update operation in this package. Since many 114 // extensions decorate or modify the common logic, it is useful for them to 115 // satisfy a basic interface in order for them to be used. 116 type UpdateOptsBuilder interface { 117 ToFirewallGroupUpdateMap() (map[string]interface{}, error) 118 } 119 120 // UpdateOpts contains the values used when updating a firewall group. 121 type UpdateOpts struct { 122 Name *string `json:"name,omitempty"` 123 Description *string `json:"description,omitempty"` 124 IngressFirewallPolicyID *string `json:"ingress_firewall_policy_id,omitempty"` 125 EgressFirewallPolicyID *string `json:"egress_firewall_policy_id,omitempty"` 126 AdminStateUp *bool `json:"admin_state_up,omitempty"` 127 Ports *[]string `json:"ports,omitempty"` 128 Shared *bool `json:"shared,omitempty"` 129 } 130 131 // ToFirewallGroupUpdateMap casts a UpdateOpts struct to a map. 132 func (opts UpdateOpts) ToFirewallGroupUpdateMap() (map[string]interface{}, error) { 133 return gophercloud.BuildRequestBody(opts, "firewall_group") 134 } 135 136 // Update allows firewall groups to be updated. 137 func Update(c *gophercloud.ServiceClient, id string, opts UpdateOptsBuilder) (r UpdateResult) { 138 b, err := opts.ToFirewallGroupUpdateMap() 139 if err != nil { 140 r.Err = err 141 return 142 } 143 _, r.Err = c.Put(resourceURL(c, id), b, &r.Body, &gophercloud.RequestOpts{ 144 OkCodes: []int{200}, 145 }) 146 return 147 } 148 149 // Because of fwaas_v2 wait only UUID not string and base updateOpts has omitempty, 150 // only set nil allows firewall group policies to be unset. 151 // Two different functions, because can not specify both policy in one function. 152 // New functions needs new structs without omitempty. 153 // Separate function for BuildRequestBody is missing due to complication 154 // of code readability and bulkiness. 155 156 type RemoveIngressPolicyOpts struct { 157 IngressFirewallPolicyID *string `json:"ingress_firewall_policy_id"` 158 } 159 160 func RemoveIngressPolicy(c *gophercloud.ServiceClient, id string) (r UpdateResult) { 161 b, err := gophercloud.BuildRequestBody(RemoveIngressPolicyOpts{IngressFirewallPolicyID: nil}, "firewall_group") 162 if err != nil { 163 r.Err = err 164 return 165 } 166 _, r.Err = c.Put(resourceURL(c, id), b, &r.Body, &gophercloud.RequestOpts{ 167 OkCodes: []int{200}, 168 }) 169 return 170 } 171 172 type RemoveEgressPolicyOpts struct { 173 EgressFirewallPolicyID *string `json:"egress_firewall_policy_id"` 174 } 175 176 func RemoveEgressPolicy(c *gophercloud.ServiceClient, id string) (r UpdateResult) { 177 b, err := gophercloud.BuildRequestBody(RemoveEgressPolicyOpts{EgressFirewallPolicyID: nil}, "firewall_group") 178 if err != nil { 179 r.Err = err 180 return 181 } 182 _, r.Err = c.Put(resourceURL(c, id), b, &r.Body, &gophercloud.RequestOpts{ 183 OkCodes: []int{200}, 184 }) 185 return 186 } 187 188 // Delete will permanently delete a particular firewall group based on its unique ID. 189 func Delete(c *gophercloud.ServiceClient, id string) (r DeleteResult) { 190 _, r.Err = c.Delete(resourceURL(c, id), nil) 191 return 192 }