restore logic for icmp and null ports
diff --git a/openstack/compute/v2/extensions/defsecrules/fixtures.go b/openstack/compute/v2/extensions/defsecrules/fixtures.go
index bf708f8..4fee896 100644
--- a/openstack/compute/v2/extensions/defsecrules/fixtures.go
+++ b/openstack/compute/v2/extensions/defsecrules/fixtures.go
@@ -83,8 +83,8 @@
{
"security_group_default_rule": {
"ip_protocol": "ICMP",
- "from_port": 80,
- "to_port": 80,
+ "from_port": 0,
+ "to_port": 0,
"cidr": "10.10.12.0/24"
}
}
@@ -96,13 +96,13 @@
fmt.Fprintf(w, `
{
"security_group_default_rule": {
- "from_port": 80,
+ "from_port": 0,
"id": "{ruleID}",
"ip_protocol": "ICMP",
"ip_range": {
"cidr": "10.10.12.0/24"
},
- "to_port": 80
+ "to_port": 0
}
}
`)
diff --git a/openstack/compute/v2/extensions/defsecrules/requests.go b/openstack/compute/v2/extensions/defsecrules/requests.go
index 5d74256..184fdc9 100644
--- a/openstack/compute/v2/extensions/defsecrules/requests.go
+++ b/openstack/compute/v2/extensions/defsecrules/requests.go
@@ -1,6 +1,8 @@
package defsecrules
import (
+ "strings"
+
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/pagination"
)
@@ -15,9 +17,9 @@
// CreateOpts represents the configuration for adding a new default rule.
type CreateOpts struct {
// The lower bound of the port range that will be opened.s
- FromPort int `json:"from_port" required:"true"`
+ FromPort int `json:"from_port"`
// The upper bound of the port range that will be opened.
- ToPort int `json:"to_port" required:"true"`
+ ToPort int `json:"to_port"`
// The protocol type that will be allowed, e.g. TCP.
IPProtocol string `json:"ip_protocol" required:"true"`
// ONLY required if FromGroupID is blank. This represents the IP range that
@@ -33,6 +35,12 @@
// ToRuleCreateMap builds the create rule options into a serializable format.
func (opts CreateOpts) ToRuleCreateMap() (map[string]interface{}, error) {
+ if opts.FromPort == 0 && strings.ToUpper(opts.IPProtocol) != "ICMP" {
+ return nil, gophercloud.ErrMissingInput{Argument: "FromPort"}
+ }
+ if opts.ToPort == 0 && strings.ToUpper(opts.IPProtocol) != "ICMP" {
+ return nil, gophercloud.ErrMissingInput{Argument: "ToPort"}
+ }
return gophercloud.BuildRequestBody(opts, "security_group_default_rule")
}
diff --git a/openstack/compute/v2/extensions/defsecrules/requests_test.go b/openstack/compute/v2/extensions/defsecrules/requests_test.go
index 3cbc990..df568fe 100644
--- a/openstack/compute/v2/extensions/defsecrules/requests_test.go
+++ b/openstack/compute/v2/extensions/defsecrules/requests_test.go
@@ -77,8 +77,8 @@
opts := CreateOpts{
IPProtocol: "ICMP",
- FromPort: 80,
- ToPort: 80,
+ FromPort: 0,
+ ToPort: 0,
CIDR: "10.10.12.0/24",
}
@@ -87,8 +87,8 @@
expected := &DefaultRule{
ID: ruleID,
- FromPort: 80,
- ToPort: 80,
+ FromPort: 0,
+ ToPort: 0,
IPProtocol: "ICMP",
IPRange: secgroups.IPRange{CIDR: "10.10.12.0/24"},
}