You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2014/09/10 17:37:57 UTC

[1/6] Backports all neutron changes from master for 1.8.1

Repository: jclouds-labs-openstack
Updated Branches:
  refs/heads/1.8.x c8a0d36db -> f21914db4


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_list_response_paged1.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_list_response_paged1.json b/openstack-neutron/src/test/resources/security_group_list_response_paged1.json
new file mode 100644
index 0000000..dcf91c8
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_list_response_paged1.json
@@ -0,0 +1,126 @@
+{
+    "security_groups": [
+        {
+            "description": "default",
+            "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "name": "default",
+            "security_group_rules": [
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv6",
+                    "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv4",
+                    "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv6",
+                    "id": "c0b09f00-1d49-4e64-a0a7-8a186d928138",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv4",
+                    "id": "f7d45c89-008e-4bab-88ad-d6811724c51c",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                }
+            ],
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "description": "default",
+            "id": "85cc3048-abc3-43cc-89b3-377341426ac52",
+            "name": "default",
+            "security_group_rules": [
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv6",
+                    "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff2",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv4",
+                    "id": "93aa42e5-80db-4581-9391-3a608bd0e4482",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv6",
+                    "id": "c0b09f00-1d49-4e64-a0a7-8a186d9281382",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv4",
+                    "id": "f7d45c89-008e-4bab-88ad-d6811724c51c2",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                }
+            ],
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        }
+    ],
+    "security_groups_links": [
+        {
+            "href": "/v2.0/security-groups.json?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718",
+            "rel": "next"
+        },
+        {
+            "href": "/v2.0/security-groups.json?marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True",
+            "rel": "previous"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_list_response_paged2.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_list_response_paged2.json b/openstack-neutron/src/test/resources/security_group_list_response_paged2.json
new file mode 100644
index 0000000..ded8067
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_list_response_paged2.json
@@ -0,0 +1,122 @@
+{
+    "security_groups": [
+        {
+            "description": "default",
+            "id": "85cc3048-abc3-43cc-89b3-377341426ac53",
+            "name": "default",
+            "security_group_rules": [
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv6",
+                    "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv4",
+                    "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv6",
+                    "id": "c0b09f00-1d49-4e64-a0a7-8a186d928138",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv4",
+                    "id": "f7d45c89-008e-4bab-88ad-d6811724c51c",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                }
+            ],
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "description": "default",
+            "id": "85cc3048-abc3-43cc-89b3-377341426ac524",
+            "name": "default",
+            "security_group_rules": [
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv6",
+                    "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff2",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv4",
+                    "id": "93aa42e5-80db-4581-9391-3a608bd0e4482",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv6",
+                    "id": "c0b09f00-1d49-4e64-a0a7-8a186d9281382",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv4",
+                    "id": "f7d45c89-008e-4bab-88ad-d6811724c51c2",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                }
+            ],
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        }
+    ],
+    "security_groups_links": [
+        {
+            "href": "/v2.0/security-groups.json?marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True",
+            "rel": "previous"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_rule_create_request.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_rule_create_request.json b/openstack-neutron/src/test/resources/security_group_rule_create_request.json
new file mode 100644
index 0000000..14bea85
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_rule_create_request.json
@@ -0,0 +1,11 @@
+{
+    "security_group_rule": {
+        "direction": "ingress",
+        "port_range_min": 80,
+        "ethertype": "IPv4",
+        "port_range_max": 80,
+        "protocol": "tcp",
+        "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+        "security_group_id": "a7734e61-b545-452d-a3cd-0189cbd9747a"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_rule_create_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_rule_create_response.json b/openstack-neutron/src/test/resources/security_group_rule_create_response.json
new file mode 100644
index 0000000..0037e94
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_rule_create_response.json
@@ -0,0 +1,15 @@
+{
+    "security_group_rule": {
+        "direction": "ingress",
+        "ethertype": "IPv4",
+        "id": "2bc0accf-312e-429a-956e-e4407625eb62",
+        "port_range_max": 80,
+        "port_range_min": 80,
+        "protocol": "tcp",
+        "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+        "remote_ip_prefix": null,
+        "security_group_id": "a7734e61-b545-452d-a3cd-0189cbd9747a",
+        "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_rule_get_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_rule_get_response.json b/openstack-neutron/src/test/resources/security_group_rule_get_response.json
new file mode 100644
index 0000000..7225101
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_rule_get_response.json
@@ -0,0 +1,14 @@
+{
+    "security_group_rule": {
+        "direction": "egress",
+        "ethertype": "IPv6",
+        "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+        "port_range_max": null,
+        "port_range_min": null,
+        "protocol": null,
+        "remote_group_id": null,
+        "remote_ip_prefix": null,
+        "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+        "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_rule_list_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_rule_list_response.json b/openstack-neutron/src/test/resources/security_group_rule_list_response.json
new file mode 100644
index 0000000..fbdeddf
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_rule_list_response.json
@@ -0,0 +1,52 @@
+{
+    "security_group_rules": [
+        {
+            "direction": "egress",
+            "ethertype": "IPv6",
+            "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": null,
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "egress",
+            "ethertype": "IPv4",
+            "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": null,
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "ingress",
+            "ethertype": "IPv6",
+            "id": "c0b09f00-1d49-4e64-a0a7-8a186d928138",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "ingress",
+            "ethertype": "IPv4",
+            "id": "f7d45c89-008e-4bab-88ad-d6811724c51c",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_rule_list_response_paged1.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_rule_list_response_paged1.json b/openstack-neutron/src/test/resources/security_group_rule_list_response_paged1.json
new file mode 100644
index 0000000..5ecbfd3
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_rule_list_response_paged1.json
@@ -0,0 +1,62 @@
+{
+    "security_group_rules": [
+        {
+            "direction": "egress",
+            "ethertype": "IPv6",
+            "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": null,
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "egress",
+            "ethertype": "IPv4",
+            "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": null,
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "ingress",
+            "ethertype": "IPv6",
+            "id": "c0b09f00-1d49-4e64-a0a7-8a186d928138",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "ingress",
+            "ethertype": "IPv4",
+            "id": "f7d45c89-008e-4bab-88ad-d6811724c51c",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        }
+    ],
+    "security_group_rules_links": [
+        {
+            "href": "/v2.0/security-group-rules.json?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718",
+            "rel": "next"
+        },
+        {
+            "href": "/v2.0/security-group-rules.json?marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True",
+            "rel": "previous"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_rule_list_response_paged2.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_rule_list_response_paged2.json b/openstack-neutron/src/test/resources/security_group_rule_list_response_paged2.json
new file mode 100644
index 0000000..1688ede
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_rule_list_response_paged2.json
@@ -0,0 +1,58 @@
+{
+    "security_group_rules": [
+        {
+            "direction": "egress",
+            "ethertype": "IPv6",
+            "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff2",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": null,
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "egress",
+            "ethertype": "IPv4",
+            "id": "93aa42e5-80db-4581-9391-3a608bd0e4482",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": null,
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "ingress",
+            "ethertype": "IPv6",
+            "id": "c0b09f00-1d49-4e64-a0a7-8a186d9281382",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "direction": "ingress",
+            "ethertype": "IPv4",
+            "id": "f7d45c89-008e-4bab-88ad-d6811724c51c2",
+            "port_range_max": null,
+            "port_range_min": null,
+            "protocol": null,
+            "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "remote_ip_prefix": null,
+            "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        }
+    ],
+    "security_group_rules_links": [
+        {
+            "href": "/v2.0/security-group-rules.json?marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True",
+            "rel": "previous"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/features/CDNApi.java
----------------------------------------------------------------------
diff --git a/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/features/CDNApi.java b/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/features/CDNApi.java
index 27a9e8c..3628e2d 100644
--- a/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/features/CDNApi.java
+++ b/rackspace-cloudfiles/src/main/java/org/jclouds/rackspace/cloudfiles/v1/features/CDNApi.java
@@ -39,7 +39,6 @@ import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
-import org.jclouds.rackspace.cloudfiles.v1.CloudFilesApi;
 import org.jclouds.rackspace.cloudfiles.v1.binders.BindCDNPurgeEmailAddressesToHeaders;
 import org.jclouds.rackspace.cloudfiles.v1.domain.CDNContainer;
 import org.jclouds.rackspace.cloudfiles.v1.functions.ParseCDNContainerFromHeaders;
@@ -60,11 +59,11 @@ import com.google.common.collect.FluentIterable;
  * Provides access to the Rackspace Cloud Files CDN API features.
  *
  * <h3>NOTE</h3>
- * Before a container can be CDN enabled, it must exist in the storage system. 
- * To CDN enable the container, perform PUT request against it using the <code>publicURL</code> 
- * noted in the service catalog for Cloud Files during Authentication and set the 
+ * Before a container can be CDN enabled, it must exist in the storage system.
+ * To CDN enable the container, perform PUT request against it using the <code>publicURL</code>
+ * noted in the service catalog for Cloud Files during Authentication and set the
  * <code>X-CDN-Enabled</code> header to <code>true</code>.
- * 
+ *
  * @see {@link CloudFilesApi#getCDNApiForRegion(String)}
  */
 @Beta
@@ -74,7 +73,7 @@ public interface CDNApi extends Closeable {
 
    /**
     * Lists up to 10,000 CDN containers.
-    * 
+    *
     * @return a list of CDN enabled containers ordered by name.
     */
    @Named("cdn:list")
@@ -86,10 +85,10 @@ public interface CDNApi extends Closeable {
 
    /**
     * Lists CDN containers, with the given options.
-    * 
+    *
     * @param options
     *           the options to control output.
-    * 
+    *
     * @return a list of CDN enabled containers ordered by name.
     */
    @Named("cdn:list")
@@ -101,10 +100,10 @@ public interface CDNApi extends Closeable {
 
    /**
     * Gets the specified CDN Container.
-    * 
+    *
     * @param containerName
     *           the name of the CDN Container
-    * 
+    *
     * @return the CDNContainer or null, if not found.
     */
    @Named("cdn:get")
@@ -117,10 +116,10 @@ public interface CDNApi extends Closeable {
 
    /**
     * Enables the {@link CDNContainer}.
-    * 
+    *
     * @param containerName
     *           corresponds to {@link CDNContainer#getName()}.
-    *           
+    *
     * @return the CDN container {@link URI} or {@code null}, if not found.
     */
    @Named("cdn:enable")
@@ -134,12 +133,12 @@ public interface CDNApi extends Closeable {
 
    /**
     * Enables the {@link CDNContainer} with a TTL.
-    * 
+    *
     * @param containerName
     *           corresponds to {@link CDNContainer#getName()}.
     * @param ttl
     *           the TTL for the CDN Container.
-    *           
+    *
     * @return the CDN container {@link URI} or {@code null}, if not found.
     */
    @Named("cdn:enable")
@@ -149,15 +148,15 @@ public interface CDNApi extends Closeable {
    @Path("/{containerName}")
    @Headers(keys = CDN_ENABLED, values = "true")
    @Nullable
-   URI enable(@PathParam("containerName") String containerName, 
+   URI enable(@PathParam("containerName") String containerName,
          @HeaderParam(CDN_TTL) int ttl);
 
    /**
     * Disables the {@link CDNContainer}.
-    * 
+    *
     * @param containerName
     *           corresponds to {@link CDNContainer#getName()}.
-    *           
+    *
     * @return {@code true} if the container was disabled, {@code false} if not.
     */
    @Named("cdn:disable")
@@ -169,14 +168,14 @@ public interface CDNApi extends Closeable {
 
    /**
     * Purges an object from the CDN.
-    * 
+    *
     * @param containerName
     *           corresponds to {@link CDNContainer#getName()}.
     * @param objectName
     *           the object in the {@link CDNContainer} to purge.
     * @param emails
     *           the email addresses to notify after purging.
-    * 
+    *
     * @return {@code true} if the object was successfully purged, {@code false} if not.
     */
    @Named("cdn:purge")
@@ -184,16 +183,16 @@ public interface CDNApi extends Closeable {
    @Fallback(FalseOnNotFoundOr404.class)
    @Path("/{containerName}/{objectName}")
    @Headers(keys = CloudFilesHeaders.CDN_PURGE_OBJECT_EMAIL, values = "{email}")
-   boolean purgeObject(@PathParam("containerName") String containerName, 
-         @PathParam("objectName") String objectName, 
+   boolean purgeObject(@PathParam("containerName") String containerName,
+         @PathParam("objectName") String objectName,
          @BinderParam(BindCDNPurgeEmailAddressesToHeaders.class) Iterable<String> emails);
 
    /**
     * Updates a CDN container with the supplied {@link UpdateCDNContainerOptions} options.
-    * 
+    *
     * @param containerName
     *           corresponds to {@link CDNContainer#getName()}.
-    *           
+    *
     * @param options
     *           the {@link UpdateCDNContainerOptions} options.
     */


[6/6] git commit: Backports all neutron changes from master for 1.8.1

Posted by za...@apache.org.
Backports all neutron changes from master for 1.8.1


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/f21914db
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/f21914db
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/f21914db

Branch: refs/heads/1.8.x
Commit: f21914db4ea99a9ffd25a0b7b02cca2fcbc8beb0
Parents: c8a0d36
Author: Zack Shoylev <za...@rackspace.com>
Authored: Tue Sep 9 14:21:47 2014 -0500
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Wed Sep 10 10:34:20 2014 -0500

----------------------------------------------------------------------
 .../openstack/neutron/v2/NeutronApi.java        |  82 ++-
 .../neutron/v2/NeutronApiMetadata.java          |  30 +-
 .../neutron/v2/domain/AddressPair.java          |  48 +-
 .../neutron/v2/domain/AllocationPool.java       |  33 +-
 .../neutron/v2/domain/ExternalGatewayInfo.java  |  33 +-
 .../neutron/v2/domain/ExtraDhcpOption.java      |  32 +-
 .../openstack/neutron/v2/domain/FloatingIP.java | 315 +++++++++
 .../neutron/v2/domain/FloatingIPs.java          |  36 +
 .../openstack/neutron/v2/domain/HostRoute.java  |  37 +-
 .../jclouds/openstack/neutron/v2/domain/IP.java |  31 +-
 .../neutron/v2/domain/IPv6DHCPMode.java         |   2 +-
 .../openstack/neutron/v2/domain/Network.java    |  61 +-
 .../neutron/v2/domain/NetworkSegment.java       |  40 +-
 .../neutron/v2/domain/NetworkStatus.java        |   5 +-
 .../neutron/v2/domain/NetworkType.java          |  17 +-
 .../openstack/neutron/v2/domain/Networks.java   |   7 +-
 .../openstack/neutron/v2/domain/Port.java       |  62 +-
 .../openstack/neutron/v2/domain/Ports.java      |   9 +-
 .../openstack/neutron/v2/domain/Router.java     |  58 +-
 .../neutron/v2/domain/RouterInterface.java      |  33 +-
 .../openstack/neutron/v2/domain/Routers.java    |   9 +-
 .../openstack/neutron/v2/domain/Rule.java       | 376 +++++++++++
 .../neutron/v2/domain/RuleDirection.java        |  61 ++
 .../neutron/v2/domain/RuleEthertype.java        |  61 ++
 .../neutron/v2/domain/RuleProtocol.java         |  65 ++
 .../openstack/neutron/v2/domain/Rules.java      |  35 +
 .../neutron/v2/domain/SecurityGroup.java        | 218 ++++++
 .../neutron/v2/domain/SecurityGroups.java       |  36 +
 .../openstack/neutron/v2/domain/Subnet.java     |  61 +-
 .../openstack/neutron/v2/domain/Subnets.java    |   9 +-
 .../openstack/neutron/v2/domain/VIFType.java    |   2 +-
 .../openstack/neutron/v2/domain/VNICType.java   |   2 +-
 .../neutron/v2/extensions/FloatingIPApi.java    | 138 ++++
 .../neutron/v2/extensions/RouterApi.java        |  77 +--
 .../neutron/v2/extensions/SecurityGroupApi.java | 186 ++++++
 .../v2/fallbacks/EmptyFloatingIPsFallback.java  |  45 ++
 .../v2/fallbacks/EmptyRulesFallback.java        |  45 ++
 .../fallbacks/EmptySecurityGroupsFallback.java  |  45 ++
 .../neutron/v2/features/NetworkApi.java         |  65 +-
 .../openstack/neutron/v2/features/PortApi.java  |  38 +-
 .../neutron/v2/features/SubnetApi.java          |  38 +-
 .../functions/FloatingIPsToPagedIterable.java   |  64 ++
 .../neutron/v2/functions/ParseFloatingIPs.java  |  37 ++
 .../neutron/v2/functions/ParseRules.java        |  38 ++
 .../v2/functions/ParseSecurityGroups.java       |  38 ++
 .../v2/functions/RouterToPagedIterable.java     |  41 +-
 .../v2/functions/RulesToPagedIterable.java      |  66 ++
 .../SecurityGroupsToPagedIterable.java          |  66 ++
 .../neutron/v2/options/EmptyOptions.java        |  28 +-
 .../openstack/neutron/v2_0/NeutronApi.java      |  88 ++-
 .../neutron/v2_0/NeutronApiMetadata.java        |  15 +-
 .../v2_0/config/NeutronHttpApiModule.java       |  30 +-
 .../neutron/v2_0/domain/AllocationPool.java     |   4 +-
 .../neutron/v2_0/domain/HostRoute.java          |   4 +-
 .../neutron/v2_0/domain/ReferenceWithName.java  |   2 +-
 .../openstack/neutron/v2_0/domain/Subnet.java   |   2 +-
 .../neutron/v2_0/extensions/RouterApi.java      |  30 +-
 .../neutron/v2_0/features/NetworkApi.java       |   2 +-
 .../neutron/v2_0/features/PortApi.java          |   2 +-
 .../neutron/v2_0/features/SubnetApi.java        |   2 +-
 .../v2_0/functions/ParseNetworkDetails.java     |  24 +-
 .../neutron/v2_0/functions/ParseNetworks.java   |  24 +-
 .../v2_0/functions/ParsePortDetails.java        |  24 +-
 .../neutron/v2_0/functions/ParsePorts.java      |  24 +-
 .../v2_0/functions/ParseRouterDetails.java      |  24 +-
 .../neutron/v2_0/functions/ParseRouters.java    |  24 +-
 .../v2_0/functions/ParseSubnetDetails.java      |  24 +-
 .../neutron/v2_0/functions/ParseSubnets.java    |  24 +-
 .../neutron/v2/NeutronApiMetadataTest.java      |  28 +-
 .../v2/extensions/FloatingIPApiLiveTest.java    |  92 +++
 .../v2/extensions/FloatingIPApiMockTest.java    | 436 ++++++++++++
 .../v2/extensions/RouterApiLiveTest.java        | 173 +++++
 .../v2/extensions/RouterApiMockTest.java        | 631 ++++++++++++++++++
 .../v2/extensions/SecurityGroupApiLiveTest.java |  99 +++
 .../v2/extensions/SecurityGroupApiMockTest.java | 659 +++++++++++++++++++
 .../v2/features/ExtensionApiLiveTest.java       |  83 +++
 .../v2/features/ExtensionApiMockTest.java       | 152 +++++
 .../neutron/v2/features/NetworkApiLiveTest.java |  14 +-
 .../neutron/v2/features/NetworkApiMockTest.java |  16 +-
 .../neutron/v2/features/PortApiLiveTest.java    |  26 +-
 .../neutron/v2/features/PortApiMockTest.java    |  20 +-
 .../neutron/v2/features/RouterApiLiveTest.java  | 171 -----
 .../neutron/v2/features/RouterApiMockTest.java  | 631 ------------------
 .../neutron/v2/features/SubnetApiLiveTest.java  |  16 +-
 .../neutron/v2/features/SubnetApiMockTest.java  |  16 +-
 .../v2/internal/BaseNeutronApiLiveTest.java     |  28 +-
 .../v2/internal/BaseNeutronApiMockTest.java     |   8 +-
 .../v2_0/extensions/RouterApiExpectTest.java    |  21 +-
 .../v2_0/extensions/RouterApiLiveTest.java      |  13 +-
 .../v2_0/features/NetworkApiExpectTest.java     |  23 +-
 .../v2_0/features/NetworkApiLiveTest.java       |  18 +-
 .../v2_0/features/PortApiExpectTest.java        |  20 +-
 .../neutron/v2_0/features/PortApiLiveTest.java  |   1 +
 .../v2_0/features/SubnetApiLiveTest.java        |   1 +
 .../src/test/resources/extension_details.json   |  10 +
 .../src/test/resources/extension_list.json      | 140 ++++
 .../resources/floatingip_create_request.json    |   6 +
 .../resources/floatingip_create_response.json   |  11 +
 .../test/resources/floatingip_get_response.json |  11 +
 .../resources/floatingip_list_response.json     |  22 +
 .../floatingip_list_response_paged1.json        |  32 +
 .../floatingip_list_response_paged2.json        |  28 +
 .../floatingip_update_dissociate_request.json   |   5 +
 .../floatingip_update_dissociate_response.json  |  11 +
 .../resources/floatingip_update_request.json    |   5 +
 .../resources/floatingip_update_response.json   |  11 +
 .../security_group_create_request.json          |   6 +
 .../security_group_create_response.json         |  34 +
 .../resources/security_group_get_response.json  |  58 ++
 .../resources/security_group_list_response.json | 116 ++++
 .../security_group_list_response_paged1.json    | 126 ++++
 .../security_group_list_response_paged2.json    | 122 ++++
 .../security_group_rule_create_request.json     |  11 +
 .../security_group_rule_create_response.json    |  15 +
 .../security_group_rule_get_response.json       |  14 +
 .../security_group_rule_list_response.json      |  52 ++
 ...ecurity_group_rule_list_response_paged1.json |  62 ++
 ...ecurity_group_rule_list_response_paged2.json |  58 ++
 .../cloudfiles/v1/features/CDNApi.java          |  45 +-
 119 files changed, 6166 insertions(+), 1575 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
index 4585972..b54fa39 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApi.java
@@ -1,30 +1,33 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2;
 
 import java.io.Closeable;
 import java.util.Set;
 
-import org.jclouds.javax.annotation.Nullable;
+import javax.ws.rs.Path;
+
+import org.jclouds.Constants;
+
 import org.jclouds.location.Region;
 import org.jclouds.location.functions.RegionToEndpoint;
+import org.jclouds.openstack.neutron.v2.extensions.FloatingIPApi;
 import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
+import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApi;
 import org.jclouds.openstack.neutron.v2.features.NetworkApi;
 import org.jclouds.openstack.neutron.v2.features.PortApi;
 import org.jclouds.openstack.neutron.v2.features.SubnetApi;
@@ -36,8 +39,9 @@ import com.google.common.base.Optional;
 import com.google.inject.Provides;
 
 /**
- * Provides synchronous access to the OpenStack Networking (Neutron) v2 API
+ * Provides access to the OpenStack Networking (Neutron) v2 API.
  */
+@Path("{" + Constants.PROPERTY_API_VERSION + "}")
 public interface NeutronApi extends Closeable {
    /**
     * @return the Region codes configured
@@ -47,32 +51,56 @@ public interface NeutronApi extends Closeable {
    Set<String> getConfiguredRegions();
 
    /**
-    * Provides synchronous access to Extension features.
+    * Provides access to Extension features.
+    */
+   @Delegate
+   ExtensionApi getExtensionApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to Network features.
+    */
+   @Delegate
+   NetworkApi getNetworkApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to Subnet features.
     */
    @Delegate
-   ExtensionApi getExtensionApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+   SubnetApi getSubnetApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
 
    /**
-    * Provides synchronous access to Network features.
+    * Provides access to Port features.
     */
    @Delegate
-   NetworkApi getNetworkApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+   PortApi getPortApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
 
    /**
-    * Provides synchronous access to Subnet features
+    * Provides access to Router features.
+    *
+    * <h3>NOTE</h3>
+    * This API is an extension that may or may not be present in your OpenStack cloud. Use the Optional return type
+    * to determine if it is present.
     */
    @Delegate
-   SubnetApi getSubnetApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+   Optional<RouterApi> getRouterApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
 
    /**
-    * Provides synchronous access to Port features.
+    * Provides access to Floating IP features.
+    *
+    * <h3>NOTE</h3>
+    * This API is an extension that may or may not be present in your OpenStack cloud. Use the Optional return type
+    * to determine if it is present.
     */
    @Delegate
-   PortApi getPortApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+   Optional<FloatingIPApi> getFloatingIPApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
 
    /**
-    * Provides synchronous access to Router features.
+    * Provides access to SecurityGroup features.
+    *
+    * <h3>NOTE</h3>
+    * This API is an extension that may or may not be present in your OpenStack cloud. Use the Optional return type
+    * to determine if it is present.
     */
    @Delegate
-   Optional<? extends RouterApi> getRouterExtensionApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+   Optional<SecurityGroupApi> getSecurityGroupApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
index ef2b11d..043bed8 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadata.java
@@ -1,20 +1,18 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2;
 
@@ -72,7 +70,7 @@ public class NeutronApiMetadata extends BaseHttpApiMetadata<NeutronApi> {
             .credentialName("${password}")
             .endpointName("Neutron base url ending in /v2.0/")
             .documentation(URI.create("http://docs.openstack.org/api/openstack-network/2.0/content/"))
-            .version("2.0")
+            .version("v2.0")
             .defaultEndpoint("http://localhost:5000/v2.0/")
             .defaultProperties(NeutronApiMetadata.defaultProperties())
             .defaultModules(ImmutableSet.<Class<? extends Module>>builder()

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AddressPair.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AddressPair.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AddressPair.java
index 4e222af..e2d888c 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AddressPair.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AddressPair.java
@@ -1,29 +1,30 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.base.Objects;
+import static com.google.common.base.Preconditions.checkNotNull;
 
-import javax.inject.Named;
 import java.beans.ConstructorProperties;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
 
 /**
  * Contains a mapping between a MAC address and an IP address.
@@ -59,6 +60,7 @@ public class AddressPair  {
    /**
     * @return the macAddress of the AddressPair
     */
+   @Nullable
    public String getMacAddress() {
       return macAddress;
    }
@@ -66,6 +68,7 @@ public class AddressPair  {
    /**
     * @return the ipAddress of the AddressPair
     */
+   @Nullable
    public String getIpAddress() {
       return ipAddress;
    }
@@ -99,20 +102,11 @@ public class AddressPair  {
     * In this case, both parameters are required.
     * @return the Builder for AddressPair
     */
-   public static Builder createOptions(String macAddress, String ipAddress) {
+   public static Builder builder(String macAddress, String ipAddress) {
       return new Builder(macAddress, ipAddress);
    }
 
    /**
-    * Returns a builder, but requires the user to specify any parameters required when updating a resource.
-    * In this case, there are none.
-    * @return the Builder for AddressPair
-    */
-   public static Builder updateOptions() {
-      return new Builder();
-   }
-
-   /**
     * Gets a Builder configured as this object.
     */
    public Builder toBuilder() {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AllocationPool.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AllocationPool.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AllocationPool.java
index 6df93cd..6d20999 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AllocationPool.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/AllocationPool.java
@@ -1,23 +1,25 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
+import java.beans.ConstructorProperties;
+
+import org.jclouds.javax.annotation.Nullable;
+
 import com.google.common.base.Objects;
 
 /**
@@ -33,6 +35,7 @@ public class AllocationPool {
    protected final String start;
    protected final String end;
 
+   @ConstructorProperties({"start", "end"})
    protected AllocationPool(String start, String end) {
       this.start = start;
       this.end = end;
@@ -41,6 +44,7 @@ public class AllocationPool {
    /**
     * @return the start of the AllocationPool
     */
+   @Nullable
    public String getStart() {
       return start;
    }
@@ -48,6 +52,7 @@ public class AllocationPool {
    /**
     * @return the end of the AllocationPool
     */
+   @Nullable
    public String getEnd() {
       return end;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExternalGatewayInfo.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExternalGatewayInfo.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExternalGatewayInfo.java
index d66bc04..cab2d79 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExternalGatewayInfo.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExternalGatewayInfo.java
@@ -1,26 +1,26 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
 import com.google.common.base.Objects;
+import org.jclouds.javax.annotation.Nullable;
 
 import javax.inject.Named;
+import java.beans.ConstructorProperties;
 
 /**
  * Information on the external gateway for the router
@@ -32,6 +32,7 @@ public class ExternalGatewayInfo {
    @Named("enable_snat")
    protected final Boolean enableSnat;
 
+   @ConstructorProperties({"network_id", "enable_snat"})
    protected ExternalGatewayInfo(String networkId, Boolean enableSnat) {
       this.networkId = networkId;
       this.enableSnat = enableSnat;
@@ -40,6 +41,7 @@ public class ExternalGatewayInfo {
    /**
     * @return the networkId of the ExternalGatewayInfo
     */
+   @Nullable
    public String getNetworkId() {
       return networkId;
    }
@@ -47,6 +49,7 @@ public class ExternalGatewayInfo {
    /**
     * @return the enableSnat status of the ExternalGatewayInfo
     */
+   @Nullable
    public Boolean getEnableSnat() {
       return enableSnat;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExtraDhcpOption.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExtraDhcpOption.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExtraDhcpOption.java
index 6b7dfd8..89060f7 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExtraDhcpOption.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/ExtraDhcpOption.java
@@ -1,26 +1,26 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
 import com.google.common.base.Objects;
+import org.jclouds.javax.annotation.Nullable;
 
 import javax.inject.Named;
+import java.beans.ConstructorProperties;
 
 /**
  * This is used to provide additional DHCP-related options to Subnet. This is
@@ -40,6 +40,7 @@ public class ExtraDhcpOption {
    @Named("opt_value")
    protected final String optionValue;
 
+   @ConstructorProperties({"id", "opt_name", "opt_value"})
    protected ExtraDhcpOption(String id, String optionName, String optionValue) {
       this.id = id;
       this.optionName = optionName;
@@ -49,6 +50,7 @@ public class ExtraDhcpOption {
    /**
     * @return the id of the ExtraDhcpOption
     */
+   @Nullable
    public String getId() {
       return id;
    }
@@ -56,6 +58,7 @@ public class ExtraDhcpOption {
    /**
     * @return the optionName of the ExtraDhcpOption
     */
+   @Nullable
    public String getOptionName() {
       return optionName;
    }
@@ -63,6 +66,7 @@ public class ExtraDhcpOption {
    /**
     * @return the optionValue of the ExtraDhcpOption
     */
+   @Nullable
    public String getOptionValue() {
       return optionValue;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIP.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIP.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIP.java
new file mode 100644
index 0000000..fb20a6f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIP.java
@@ -0,0 +1,315 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.domain;
+
+import java.beans.ConstructorProperties;
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+import com.google.common.base.Objects;
+
+/**
+ * A Neutron Floating IP
+ *
+ */
+public class FloatingIP {
+
+   private String id;
+   @Named("router_id")
+   private String routerId;
+   @Named("tenant_id")
+   private String tenantId;
+   // Only mandatory attribute when creating
+   @Named("floating_network_id")
+   private String floatingNetworkId;
+   @Named("fixed_ip_address")
+   private String fixedIpAddress;
+   @Named("floating_ip_address")
+   private String floatingIpAddress;
+   @Named("port_id")
+   private String portId;
+
+   /**
+    * Deserialization constructor
+    */
+   @ConstructorProperties({"id", "router_id", "tenant_id", "floating_network_id", "fixed_ip_address",
+         "floating_ip_address", "port_id"})
+   private FloatingIP(String id, String routerId, String tenantId, String floatingNetworkId, String fixedIpAddress,
+         String floatingIpAddress, String portId) {
+      this.id = id;
+      this.routerId = routerId;
+      this.tenantId = tenantId;
+      this.floatingNetworkId = floatingNetworkId;
+      this.fixedIpAddress = fixedIpAddress;
+      this.floatingIpAddress = floatingIpAddress;
+      this.portId = portId;
+   }
+
+   private FloatingIP() {}
+
+   /**
+    * @param floatingIP The floating IP to copy from
+    */
+   private FloatingIP(FloatingIP floatingIP) {
+      this(floatingIP.id, floatingIP.routerId, floatingIP.tenantId, floatingIP.floatingNetworkId,
+            floatingIP.fixedIpAddress, floatingIP.floatingIpAddress, floatingIP.portId);
+   }
+
+   /**
+    * @return the id of the floating IP
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return the router id of this floating IP
+    */
+   @Nullable
+   public String getRouterId() {
+      return routerId;
+   }
+
+   /**
+    * @return the tenant id of the Floating IP
+    */
+   @Nullable
+   public String getTenantId() {
+      return tenantId;
+   }
+
+   /**
+    * @return the floating network id for this floating IP
+    */
+   @Nullable
+   public String getFloatingNetworkId() {
+      return floatingNetworkId;
+   }
+
+   /**
+    * @return the fixed IP address for this floating IP
+    */
+   @Nullable
+   public String getFixedIpAddress() {
+      return fixedIpAddress;
+   }
+
+   /**
+    * @return the floating IP address for this floating IP
+    */
+   @Nullable
+   public String getFloatingIpAddress() {
+      return floatingIpAddress;
+   }
+
+   /**
+    * @return the port id for this floating IP
+    */
+   @Nullable
+   public String getPortId() {
+      return portId;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o)
+         return true;
+      if (o == null || getClass() != o.getClass())
+         return false;
+
+      FloatingIP that = (FloatingIP) o;
+
+      return Objects.equal(this.id, that.id) &&
+            Objects.equal(this.routerId, that.routerId) &&
+            Objects.equal(this.tenantId, that.tenantId) &&
+            Objects.equal(this.floatingNetworkId, that.floatingNetworkId) &&
+            Objects.equal(this.fixedIpAddress, that.fixedIpAddress) &&
+            Objects.equal(this.floatingIpAddress, that.floatingIpAddress) &&
+            Objects.equal(this.portId, that.portId);
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, routerId, tenantId, floatingNetworkId, fixedIpAddress, floatingIpAddress,
+            portId);
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this)
+            .add("id", id)
+            .add("routerId", routerId)
+            .add("tenantId", tenantId)
+            .add("floatingNetworkId", floatingNetworkId)
+            .add("fixedIpAddress", fixedIpAddress)
+            .add("floatingIpAddress", floatingIpAddress)
+            .add("portId", portId)
+            .toString();
+   }
+
+   /**
+    * @return the Builder for creating a new floating IP
+    */
+   public static CreateBuilder createBuilder(String floatingNetworkId) {
+      return new CreateBuilder(floatingNetworkId);
+   }
+
+   /**
+    * @return the Builder for updating a floating IP
+    */
+   public static UpdateBuilder updateBuilder() {
+      return new UpdateBuilder();
+   }
+
+   private abstract static class Builder<ParameterizedBuilderType> {
+      protected FloatingIP floatingIP;
+
+      /**
+       * No-parameters constructor.
+       * */
+      private Builder() {
+         floatingIP = new FloatingIP();
+      }
+
+      protected abstract ParameterizedBuilderType self();
+
+      /**
+       * Provide the tenantId for this Floating IP. Admin-only.
+       * When keystone is enabled, it is not mandatory to specify tenant_id for resources in create requests, as the
+       * tenant identifier will be derived from the Authentication token. Please note that the default authorization
+       * settings only allow administrative users to create resources on behalf of a different tenant.
+       *
+       * @return the Builder.
+       * @see FloatingIP#getTenantId()
+       */
+      public ParameterizedBuilderType tenantId(String tenantId) {
+         floatingIP.tenantId = tenantId;
+         return self();
+      }
+
+      /**
+       * Provides the floating network id for this Floating IP.
+       * Mandatory when creating a floating IP.
+       * Floating IPs can only be created on external networks. If the network specified by floating_network_id is not
+       * external (for example, router:external=false), a 400 error is returned.
+       *
+       * @return the Builder.
+       * @see FloatingIP#getFloatingNetworkId() ()
+       */
+      public ParameterizedBuilderType floatingNetworkId(String floatingNetworkId) {
+         floatingIP.floatingNetworkId = floatingNetworkId;
+         return self();
+      }
+
+      /**
+       * Provides the fixed ip address for this Floating IP.
+       * As an OpenStack Networking port might be associated with multiple IP addresses, the particular IP address to
+       * associate with the floating IP can be specified using the fixed_ip_address request body parameter. The default
+       * logic of this operation is to associate the floating IP with a single IP address configured on a port; hence,
+       * if a port has multiple IP addresses, it is mandatory to specify the fixed_ip_address attribute. If an invalid
+       * IP address is specified in fixed_ip_address a 400 error will be returned.
+       *
+       * @return the Builder.
+       * @see FloatingIP#getFixedIpAddress()
+       */
+      public ParameterizedBuilderType fixedIpAddress(String fixedIpAddress) {
+         floatingIP.fixedIpAddress = fixedIpAddress;
+         return self();
+      }
+
+      /**
+       * Provides the port id for this Floating IP.
+       * Users can associate the floating IP with an internal port using the port_id attribute in the request body.
+       * If an invalid port identifier is specified, a 404 error will be returned. The internal OpenStack Networking
+       * port associated with the Floating IP must have at least an IP address configured, otherwise a 400 error will
+       * be returned.
+       *
+       * @return the Builder.
+       * @see FloatingIP#getPortId()
+       */
+      public ParameterizedBuilderType portId(String portId) {
+         floatingIP.portId = portId;
+         return self();
+      }
+   }
+
+   public static class CreateBuilder extends Builder<CreateBuilder> {
+      /**
+       * Supply required properties for creating a Builder
+       */
+      private CreateBuilder(String floatingNetworkId) {
+         floatingIP.floatingNetworkId = floatingNetworkId;
+      }
+
+      /**
+       * @return a CreateOptions constructed with this Builder.
+       */
+      public CreateFloatingIP build() {
+         return new CreateFloatingIP(floatingIP);
+      }
+
+      protected CreateBuilder self() {
+         return this;
+      }
+   }
+
+   public static class UpdateBuilder extends Builder<UpdateBuilder> {
+      /**
+       * Supply required properties for updating a Builder
+       */
+      private UpdateBuilder() {
+      }
+
+      /**
+       * Provide the floating ip address for this Floating IP.
+       * An address for the floating ip will be automatically allocated, unless the floating_ip_address attribute is
+       * specified in the request body. If the requested floating IP address does not fall in the external network's
+       * subnet range, a 400 error will be returned. If the requested floating IP address is already in use, a 409
+       * error code will be returned.
+       *
+       * @return the Builder.
+       * @see FloatingIP#getFloatingIpAddress()
+       */
+      public UpdateBuilder floatingIpAddress(String floatingIpAddress) {
+         floatingIP.floatingIpAddress = floatingIpAddress;
+         return this;
+      }
+
+      /**
+       * @return a UpdateOptions constructed with this Builder.
+       */
+      public UpdateFloatingIP build() {
+         return new UpdateFloatingIP(floatingIP);
+      }
+
+      protected UpdateBuilder self() {
+         return this;
+      }
+   }
+
+   public static class CreateFloatingIP extends FloatingIP {
+      private CreateFloatingIP(FloatingIP floatingIP) {
+         super(floatingIP);
+      }
+   }
+   public static class UpdateFloatingIP extends FloatingIP {
+      private UpdateFloatingIP(FloatingIP floatingIP) {
+         super(floatingIP);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIPs.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIPs.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIPs.java
new file mode 100644
index 0000000..8befa3e
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/FloatingIPs.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.domain;
+
+import java.beans.ConstructorProperties;
+
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A collection of Floating IPs
+ */
+public class FloatingIPs extends PaginatedCollection<FloatingIP> {
+   public static final FloatingIPs EMPTY = new FloatingIPs(ImmutableSet.<FloatingIP> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({"floatingips", "floatingips_links"})
+   protected FloatingIPs(Iterable<FloatingIP> floatingIPs, Iterable<Link> floatingIPsLinks) {
+      super(floatingIPs, floatingIPsLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/HostRoute.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/HostRoute.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/HostRoute.java
index 04c3bda..6ff0ddc 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/HostRoute.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/HostRoute.java
@@ -1,28 +1,30 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
+import java.beans.ConstructorProperties;
 
 import javax.inject.Named;
 
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
+
 /**
  * A Neutron Subnet Host Route
  *
@@ -35,6 +37,7 @@ public class HostRoute {
    @Named("nexthop")
    private final String nextHop;
 
+   @ConstructorProperties({"destination", "nexthop"})
    protected HostRoute(String destinationCidr, String nextHop) {
       this.destinationCidr = destinationCidr;
       this.nextHop = nextHop;
@@ -43,6 +46,7 @@ public class HostRoute {
    /**
     * @return the destination CIDR for this route.
     */
+   @Nullable
    public String getDestinationCidr() {
       return destinationCidr;
    }
@@ -50,6 +54,7 @@ public class HostRoute {
    /**
     * @return the IP of the next hop to forward traffic to.
     */
+   @Nullable
    public String getNextHop() {
       return nextHop;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IP.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IP.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IP.java
index 1885e99..9c64604 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IP.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IP.java
@@ -1,26 +1,26 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
 import com.google.common.base.Objects;
+import org.jclouds.javax.annotation.Nullable;
 
 import javax.inject.Named;
+import java.beans.ConstructorProperties;
 
 /**
  * Describes an IP address
@@ -32,6 +32,7 @@ public class IP {
    @Named("subnet_id")
    protected final String subnetId;
 
+   @ConstructorProperties({"ip_address", "subnet_id"})
    protected IP(String ipAddress, String subnetId) {
       this.ipAddress = ipAddress;
       this.subnetId = subnetId;
@@ -40,6 +41,7 @@ public class IP {
    /**
     * @return the ipAddress of the IP
     */
+   @Nullable
    public String getIpAddress() {
       return ipAddress;
    }
@@ -47,6 +49,7 @@ public class IP {
    /**
     * @return the subnetId of the IP
     */
+   @Nullable
    public String getSubnetId() {
       return subnetId;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IPv6DHCPMode.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IPv6DHCPMode.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IPv6DHCPMode.java
index f985041..654e053 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IPv6DHCPMode.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/IPv6DHCPMode.java
@@ -40,7 +40,7 @@ public enum IPv6DHCPMode {
       return name;
    }
 
-   /**
+   /*
     * This provides GSON enum support in jclouds.
     * */
    public static IPv6DHCPMode fromValue(String name){

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Network.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Network.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Network.java
index 1810fa2..57ae047 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Network.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Network.java
@@ -1,32 +1,31 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-import org.jclouds.javax.annotation.Nullable;
+import static com.google.common.base.Preconditions.checkNotNull;
 
-import javax.inject.Named;
 import java.beans.ConstructorProperties;
-import java.util.Set;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * A Neutron network
@@ -369,18 +368,18 @@ public class Network {
    /**
     * @return the Builder for creating a new Router
     */
-   public static CreateBuilder createOptions(String name) {
+   public static CreateBuilder createBuilder(String name) {
       return new CreateBuilder(name);
    }
 
    /**
     * @return the Builder for updating a Router
     */
-   public static UpdateBuilder updateOptions() {
+   public static UpdateBuilder updateBuilder() {
       return new UpdateBuilder();
    }
 
-   private static abstract class Builder<ParameterizedBuilderType> {
+   private abstract static class Builder<ParameterizedBuilderType> {
       protected Network network;
 
       /**
@@ -587,8 +586,8 @@ public class Network {
       /**
        * @return a CreateOptions constructed with this Builder.
        */
-      public CreateOptions build() {
-         return new CreateOptions(network);
+      public CreateNetwork build() {
+         return new CreateNetwork(network);
       }
 
       protected CreateBuilder self() {
@@ -609,8 +608,8 @@ public class Network {
       /**
        * @return a UpdateOptions constructed with this Builder.
        */
-      public UpdateOptions build() {
-         return new UpdateOptions(network);
+      public UpdateNetwork build() {
+         return new UpdateNetwork(network);
       }
 
       protected UpdateBuilder self() {
@@ -622,11 +621,11 @@ public class Network {
     * Create and Update options - extend the domain class, passed to API update and create calls.
     * Essentially the same as the domain class. Ensure validation and safe typing.
     */
-   public static class CreateOptions extends Network {
+   public static class CreateNetwork extends Network {
       /**
        * Copy constructor
        */
-      private CreateOptions(Network network) {
+      private CreateNetwork(Network network) {
          super(network);
          checkNotNull(network.name, "name should not be null");
       }
@@ -636,11 +635,11 @@ public class Network {
     * Create and Update options - extend the domain class, passed to API update and create calls.
     * Essentially the same as the domain class. Ensure validation and safe typing.
     */
-   public static class UpdateOptions extends Network  {
+   public static class UpdateNetwork extends Network  {
       /**
        * Copy constructor
        */
-      private UpdateOptions(Network network) {
+      private UpdateNetwork(Network network) {
          super(network);
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkSegment.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkSegment.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkSegment.java
index 3406746..aacd5c1 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkSegment.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkSegment.java
@@ -1,26 +1,26 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
 import com.google.common.base.Objects;
+import org.jclouds.javax.annotation.Nullable;
 
 import javax.inject.Named;
+import java.beans.ConstructorProperties;
 
 /**
  * A Neutron Network Segment
@@ -37,9 +37,10 @@ public class NetworkSegment {
    @Named("provider:physical_network")
    protected final String physicalNetwork;
    @Named("provider:segmentation_id")
-   protected final int segmentationId;
+   protected final Integer segmentationId;
 
-   protected NetworkSegment(NetworkType networkType, String physicalNetwork, int segmentationId) {
+   @ConstructorProperties({"provider:network_type", "provider:physical_network", "provider:segmentation_id"})
+   protected NetworkSegment(NetworkType networkType, String physicalNetwork, Integer segmentationId) {
       this.networkType = networkType;
       this.physicalNetwork = physicalNetwork;
       this.segmentationId = segmentationId;
@@ -48,6 +49,7 @@ public class NetworkSegment {
    /**
     * @return the networkType of the NetworkSegment
     */
+   @Nullable
    public NetworkType getNetworkType() {
       return networkType;
    }
@@ -55,6 +57,7 @@ public class NetworkSegment {
    /**
     * @return the physicalNetwork of the NetworkSegment
     */
+   @Nullable
    public String getPhysicalNetwork() {
       return physicalNetwork;
    }
@@ -62,7 +65,8 @@ public class NetworkSegment {
    /**
     * @return the segmentationId of the NetworkSegment
     */
-   public int getSegmentationId() {
+   @Nullable
+   public Integer getSegmentationId() {
       return segmentationId;
    }
 
@@ -110,7 +114,7 @@ public class NetworkSegment {
    public static class Builder {
       protected NetworkType networkType;
       protected String physicalNetwork;
-      protected int segmentationId;
+      protected Integer segmentationId;
 
       /**
        * Provide the networkType to the NetworkSegment's Builder.

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkStatus.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkStatus.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkStatus.java
index 059ffa7..04334d0 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkStatus.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkStatus.java
@@ -17,6 +17,9 @@
 
 package org.jclouds.openstack.neutron.v2.domain;
 
+/**
+ * Enumerates Network Status.
+ */
 public enum NetworkStatus {
    ACTIVE("active"),
    DOWN("down"),
@@ -38,7 +41,7 @@ public enum NetworkStatus {
       return name();
    }
 
-   /**
+   /*
     * This provides GSON enum support in jclouds.
     * @param name The string representation of this enum value.
     * @return The corresponding enum value.

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkType.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkType.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkType.java
index 950138a..89c3e9a 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkType.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/NetworkType.java
@@ -18,10 +18,7 @@
 package org.jclouds.openstack.neutron.v2.domain;
 
 /**
- * Enumerates supported Network types. 
- * 
- * @see <a href=
- *      "http://docs.openstack.org/api/openstack-network/2.0/content/provider_ext.html">api doc</a>
+ * Enumerates supported Network types.
  */
 public enum NetworkType {
    /**
@@ -37,15 +34,15 @@ public enum NetworkType {
     */
    VLAN("vlan"),
    /**
-    * Used to describe a Virtual Extensible LAN (VXLAN) network. 
-    * It uses a VLAN-like encapsulation technique to encapsulate MAC-based 
+    * Used to describe a Virtual Extensible LAN (VXLAN) network.
+    * It uses a VLAN-like encapsulation technique to encapsulate MAC-based
     * OSI layer 2 Ethernet frames within layer 4 UDP packets.
     */
    VXLAN("vxlan"),
    /**
-    * Used to describe a GRE tunnel network. A virtual network realized as 
-    * packets encapsulated using Generic Routing Encapsulation. GRE tunnel 
-    * packets are routed by the compute node hosts, so GRE tunnels are not 
+    * Used to describe a GRE tunnel network. A virtual network realized as
+    * packets encapsulated using Generic Routing Encapsulation. GRE tunnel
+    * packets are routed by the compute node hosts, so GRE tunnels are not
     * associated by the openvswitch plugin with specific physical networks.
     */
    GRE("gre"),
@@ -65,7 +62,7 @@ public enum NetworkType {
       return name;
    }
 
-   /**
+   /*
     * This provides GSON enum support in jclouds.
     * @param name The string representation of this enum value.
     * @return The corresponding enum value.

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Networks.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Networks.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Networks.java
index 45f6c56..9b3bf10 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Networks.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Networks.java
@@ -16,11 +16,12 @@
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.collect.ImmutableSet;
+import java.beans.ConstructorProperties;
+
 import org.jclouds.openstack.v2_0.domain.Link;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 
-import java.beans.ConstructorProperties;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * A collection of Networks
@@ -28,7 +29,7 @@ import java.beans.ConstructorProperties;
 public class Networks extends PaginatedCollection<Network> {
    public static final Networks EMPTY = new Networks(ImmutableSet.<Network> of(), ImmutableSet.<Link> of());
 
-   @ConstructorProperties({ "networks", "networks_links" })
+   @ConstructorProperties({"networks", "networks_links"})
    protected Networks(Iterable<Network> networks, Iterable<Link> networksLinks) {
       super(networks, networksLinks);
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Port.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Port.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Port.java
index 6ed3b98..ea76ce8 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Port.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Port.java
@@ -1,32 +1,32 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import org.jclouds.javax.annotation.Nullable;
+import static com.google.common.base.Preconditions.checkNotNull;
 
-import javax.inject.Named;
 import java.beans.ConstructorProperties;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * A Neutron port
@@ -461,18 +461,18 @@ public class Port {
    /**
     * @return the Builder for creating a new Router
     */
-   public static CreateBuilder createOptions(String networkId) {
+   public static CreateBuilder createBuilder(String networkId) {
       return new CreateBuilder(networkId);
    }
 
    /**
     * @return the Builder for updating a Router
     */
-   public static UpdateBuilder updateOptions() {
+   public static UpdateBuilder updateBuilder() {
       return new UpdateBuilder();
    }
 
-   private static abstract class Builder<ParameterizedBuilderType> {
+   private abstract static class Builder<ParameterizedBuilderType> {
       protected Port port;
 
       /**
@@ -703,8 +703,8 @@ public class Port {
       /**
        * @return a CreateOptions constructed with this Builder.
        */
-      public CreateOptions build() {
-         return new CreateOptions(port);
+      public CreatePort build() {
+         return new CreatePort(port);
       }
 
       protected CreateBuilder self() {
@@ -725,8 +725,8 @@ public class Port {
       /**
        * @return a UpdateOptions constructed with this Builder.
        */
-      public UpdateOptions build() {
-         return new UpdateOptions(port);
+      public UpdatePort build() {
+         return new UpdatePort(port);
       }
 
       protected UpdateBuilder self() {
@@ -738,11 +738,11 @@ public class Port {
     * Create and Update options - extend the domain class, passed to API update and create calls.
     * Essentially the same as the domain class. Ensure validation and safe typing.
     */
-   public static class CreateOptions extends Port {
+   public static class CreatePort extends Port {
       /**
        * Copy constructor
        */
-      private CreateOptions(Port port) {
+      private CreatePort(Port port) {
          super(port);
          checkNotNull(port.networkId, "networkId should not be null");
       }
@@ -752,11 +752,11 @@ public class Port {
     * Create and Update options - extend the domain class, passed to API update and create calls.
     * Essentially the same as the domain class. Ensure validation and safe typing.
     */
-   public static class UpdateOptions extends Port {
+   public static class UpdatePort extends Port {
       /**
        * Copy constructor
        */
-      private UpdateOptions(Port port) {
+      private UpdatePort(Port port) {
          super(port);
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Ports.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Ports.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Ports.java
index f7a6d5d..8cf449b 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Ports.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Ports.java
@@ -16,19 +16,20 @@
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.collect.ImmutableSet;
+import java.beans.ConstructorProperties;
+
 import org.jclouds.openstack.v2_0.domain.Link;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 
-import java.beans.ConstructorProperties;
+import com.google.common.collect.ImmutableSet;
 
 /**
- * A collection of Networks
+ * A collection of Ports
  */
 public class Ports extends PaginatedCollection<Port> {
    public static final Ports EMPTY = new Ports(ImmutableSet.<Port> of(), ImmutableSet.<Link> of());
 
-   @ConstructorProperties({ "ports", "ports_links" })
+   @ConstructorProperties({"ports", "ports_links"})
    protected Ports(Iterable<Port> ports, Iterable<Link> portsLinks) {
       super(ports, portsLinks);
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Router.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Router.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Router.java
index fb50d07..f6e2f5f 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Router.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Router.java
@@ -1,28 +1,28 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.base.Objects;
-import org.jclouds.javax.annotation.Nullable;
+import java.beans.ConstructorProperties;
 
 import javax.inject.Named;
-import java.beans.ConstructorProperties;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
 
 /**
  * A Neutron Router
@@ -126,14 +126,14 @@ public class Router {
    /**
     * @return the Builder for creating a new Router
     */
-   public static CreateBuilder createOptions() {
+   public static CreateBuilder createBuilder() {
       return new CreateBuilder();
    }
 
    /**
     * @return the Builder for updating a Router
     */
-   public static UpdateBuilder updateOptions() {
+   public static UpdateBuilder updateBuilder() {
       return new UpdateBuilder();
    }
 
@@ -171,7 +171,7 @@ public class Router {
             .toString();
    }
 
-   private static abstract class Builder<ParameterizedBuilderType> {
+   private abstract static class Builder<ParameterizedBuilderType> {
       protected Router router;
 
       /**
@@ -238,8 +238,8 @@ public class Router {
       /**
        * @return a CreateOptions constructed with this Builder.
        */
-      public CreateOptions build() {
-         return new CreateOptions(router);
+      public CreateRouter build() {
+         return new CreateRouter(router);
       }
 
       protected CreateBuilder self() {
@@ -257,8 +257,8 @@ public class Router {
       /**
        * @return a UpdateOptions constructed with this Builder.
        */
-      public UpdateOptions build() {
-         return new UpdateOptions(router);
+      public UpdateRouter build() {
+         return new UpdateRouter(router);
       }
 
       protected UpdateBuilder self() {
@@ -266,19 +266,19 @@ public class Router {
       }
    }
 
-   public static class CreateOptions extends Router{
+   public static class CreateRouter extends Router{
       /**
        * Copy constructor
        */
-      private CreateOptions(Router router) {
+      private CreateRouter(Router router) {
          super(router);
       }
    }
-   public static class UpdateOptions extends Router{
+   public static class UpdateRouter extends Router{
       /**
        * Copy constructor
        */
-      private UpdateOptions(Router router) {
+      private UpdateRouter(Router router) {
          super(router);
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RouterInterface.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RouterInterface.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RouterInterface.java
index 091bf99..3a86612 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RouterInterface.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RouterInterface.java
@@ -1,26 +1,26 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
 import com.google.common.base.Objects;
+import org.jclouds.javax.annotation.Nullable;
 
 import javax.inject.Named;
+import java.beans.ConstructorProperties;
 
 /**
  * A Neutron Router Interface
@@ -36,6 +36,7 @@ public class RouterInterface {
    @Named("port_id")
    protected final String portId;
 
+   @ConstructorProperties({"subnet_id", "port_id"})
    protected RouterInterface(String subnetId, String portId) {
       this.subnetId = subnetId;
       this.portId = portId;
@@ -44,6 +45,7 @@ public class RouterInterface {
    /**
     * @return the subnetId of the RouterInterface
     */
+   @Nullable
    public String getSubnetId() {
       return subnetId;
    }
@@ -51,6 +53,7 @@ public class RouterInterface {
    /**
     * @return the portId of the RouterInterface
     */
+   @Nullable
    public String getPortId() {
       return portId;
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Routers.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Routers.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Routers.java
index 8f926bf..c02c382 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Routers.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Routers.java
@@ -16,19 +16,20 @@
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.collect.ImmutableSet;
+import java.beans.ConstructorProperties;
+
 import org.jclouds.openstack.v2_0.domain.Link;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 
-import java.beans.ConstructorProperties;
+import com.google.common.collect.ImmutableSet;
 
 /**
- * A collection of Networks
+ * A collection of Routers
  */
 public class Routers extends PaginatedCollection<Router> {
    public static final Routers EMPTY = new Routers(ImmutableSet.<Router> of(), ImmutableSet.<Link> of());
 
-   @ConstructorProperties({ "routers", "routers_links" })
+   @ConstructorProperties({"routers", "routers_links"})
    protected Routers(Iterable<Router> routers, Iterable<Link> routersLinks) {
       super(routers, routersLinks);
    }


[5/6] Backports all neutron changes from master for 1.8.1

Posted by za...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rule.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rule.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rule.java
new file mode 100644
index 0000000..027d25f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rule.java
@@ -0,0 +1,376 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.domain;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+
+/**
+ * Contains a mapping between a MAC address and an IP address.
+ */
+public class Rule {
+
+   private String id;
+   @Named("tenant_id")
+   private String tenantId;
+   private RuleDirection direction;
+   @Named("security_group_id")
+   private String securityGroupId;
+   private RuleEthertype ethertype;
+   @Named("port_range_min")
+   private Integer portRangeMin;
+   @Named("port_range_max")
+   private Integer portRangeMax;
+   private RuleProtocol protocol;
+   @Named("remote_group_id")
+   private String remoteGroupId;
+   @Named("remote_ip_prefix")
+   private String remoteIpPrefix;
+
+   @ConstructorProperties({"id", "tenant_id", "direction", "security_group_id", "ethertype", "port_range_min",
+         "port_range_max", "protocol", "remote_group_id", "remote_ip_prefix"})
+   protected Rule(String id, String tenantId, RuleDirection direction, String securityGroupId,
+         RuleEthertype ethertype, Integer portRangeMin, Integer portRangeMax,
+         RuleProtocol protocol, String remoteGroupId, String remoteIpPrefix) {
+      this.id = id;
+      this.tenantId = tenantId;
+      this.direction = direction;
+      this.securityGroupId = securityGroupId;
+      this.ethertype = ethertype;
+      this.portRangeMin = portRangeMin;
+      this.portRangeMax = portRangeMax;
+      this.protocol = protocol;
+      this.remoteGroupId = remoteGroupId;
+      this.remoteIpPrefix = remoteIpPrefix;
+   }
+
+   private Rule(Rule rule) {
+      this(rule.id,
+            rule.tenantId,
+            rule.direction,
+            rule.securityGroupId,
+            rule.ethertype,
+            rule.portRangeMin,
+            rule.portRangeMax,
+            rule.protocol,
+            rule.remoteGroupId,
+            rule.remoteIpPrefix
+      );
+   }
+
+   private Rule() {}
+
+   /**
+    * @return The identifier for this rule.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return The identifier of the tenant for this rule.
+    */
+   @Nullable
+   public String getTenantId() {
+      return tenantId;
+   }
+
+   /**
+    * @return The direction in which the security group rule is applied.
+    */
+   @Nullable
+   public RuleDirection getDirection() {
+      return direction;
+   }
+
+   /**
+    * @return The security group ID to associate with this security group rule.
+    */
+   @Nullable
+   public String getSecurityGroupId() {
+      return securityGroupId;
+   }
+
+   /**
+    * @return The internet protocol version type of this rule.
+    */
+   @Nullable
+   public RuleEthertype getEthertype() {
+      return ethertype;
+   }
+
+   /**
+    * @return The minimum port number in the range that is matched by the security group rule. If the protocol is TCP
+    * or UDP, this value must be less than or equal to the value of the port_range_max attribute. If the protocol is
+    * ICMP, this value must be an ICMP type.
+    */
+   @Nullable
+   public Integer getPortRangeMin() {
+      return portRangeMin;
+   }
+
+   /**
+    * @return The maximum port number in the range that is matched by the security group rule. The port_range_min
+    * attribute constrains the port_range_max attribute. If the protocol is ICMP, this value must be an ICMP type.
+    */
+   @Nullable
+   public Integer getPortRangeMax() {
+      return portRangeMax;
+   }
+
+   /**
+    * @return The protocol that is matched by the security group rule. Valid values are null, tcp, udp, and icmp.
+    */
+   @Nullable
+   public RuleProtocol getProtocol() {
+      return protocol;
+   }
+
+   /**
+    * @return The remote group ID to be associated with this security group rule.
+    */
+   @Nullable
+   public String getRemoteGroupId() {
+      return remoteGroupId;
+   }
+
+   /**
+    * @return The remote IP prefix to be associated with this security group rule. This attribute matches the specified
+    * IP prefix as the source IP address of the IP packet.
+    */
+   @Nullable
+   public String getRemoteIpPrefix() {
+      return remoteIpPrefix;
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o)
+         return true;
+      if (o == null || getClass() != o.getClass())
+         return false;
+
+      Rule that = (Rule) o;
+
+      return Objects.equal(this.id, that.id) &&
+            Objects.equal(this.tenantId, that.tenantId) &&
+            Objects.equal(this.direction, that.direction) &&
+            Objects.equal(this.securityGroupId, that.securityGroupId) &&
+            Objects.equal(this.ethertype, that.ethertype) &&
+            Objects.equal(this.portRangeMin, that.portRangeMin) &&
+            Objects.equal(this.portRangeMax, that.portRangeMax) &&
+            Objects.equal(this.protocol, that.protocol) &&
+            Objects.equal(this.remoteGroupId, that.remoteGroupId) &&
+            Objects.equal(this.remoteIpPrefix, that.remoteIpPrefix);
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, tenantId, direction, securityGroupId, ethertype, portRangeMin,
+            portRangeMax, protocol, remoteGroupId, remoteIpPrefix);
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this)
+            .add("id", id)
+            .add("tenantId", tenantId)
+            .add("direction", direction)
+            .add("securityGroupId", securityGroupId)
+            .add("ethertype", ethertype)
+            .add("portRangeMin", portRangeMin)
+            .add("portRangeMax", portRangeMax)
+            .add("protocol", protocol)
+            .add("remoteGroupId", remoteGroupId)
+            .add("remoteIpPrefix", remoteIpPrefix)
+            .toString();
+   }
+
+
+   /*
+    * Methods to get the Create and Update builders follow
+    */
+
+   /**
+    * @return the Builder for creating a new SecurityGroupRule
+    */
+   public static CreateBuilder createBuilder(RuleDirection direction, String securityGroupId) {
+      return new CreateBuilder(direction, securityGroupId);
+   }
+
+   public abstract static class Builder<ParameterizedBuilderType> {
+      // Keep track of the builder's state.
+      protected Rule rule;
+
+      private Builder() {
+         rule = new Rule();
+      }
+
+      protected abstract ParameterizedBuilderType self();
+
+      /**
+       * The tenant id for this rule. Usually can only be specified by administrators.
+       *
+       * @return the Builder.
+       * @see Rule#getTenantId()
+       */
+      public ParameterizedBuilderType tenantId(String tenantId) {
+         rule.tenantId = tenantId;
+         return self();
+      }
+
+      /**
+       * The direction in which the security group rule is applied.
+       *
+       * @return the Builder.
+       * @see Rule#getDirection()
+       */
+      public ParameterizedBuilderType direction(RuleDirection direction) {
+         rule.direction = direction;
+         return self();
+      }
+
+      /**
+       * The security group ID to associate with this security group rule.
+       *
+       * @return the Builder.
+       * @see Rule#getSecurityGroupId()
+       */
+      public ParameterizedBuilderType securityGroupId(String securityGroupId) {
+         rule.securityGroupId = securityGroupId;
+         return self();
+      }
+
+      /**
+       * The internet protocol version for this rule.
+       *
+       * @return the Builder.
+       * @see Rule#getEthertype()
+       */
+      public ParameterizedBuilderType ethertype(RuleEthertype ethertype) {
+         rule.ethertype = ethertype;
+         return self();
+      }
+
+      /**
+       * The minimum port number in the range that is matched by the security group rule.
+       *
+       * @return the Builder.
+       * @see Rule#getPortRangeMin()
+       */
+      public ParameterizedBuilderType portRangeMin(Integer portRangeMin) {
+         rule.portRangeMin = portRangeMin;
+         return self();
+      }
+
+      /**
+       * The maximum port number in the range that is matched by the security group rule.
+       *
+       * @return the Builder.
+       * @see Rule#getPortRangeMax()
+       */
+      public ParameterizedBuilderType portRangeMax(Integer portRangeMax) {
+         rule.portRangeMax = portRangeMax;
+         return self();
+      }
+
+      /**
+       * The protocol that is matched by the security group rule. Valid values are null, tcp, udp, and icmp.
+       *
+       * @return the Builder.
+       * @see Rule#getProtocol()
+       */
+      public ParameterizedBuilderType protocol(RuleProtocol protocol) {
+         rule.protocol = protocol;
+         return self();
+      }
+
+      /**
+       * The remote group ID to be associated with this security group rule. You can specify either remote_group_id or
+       * remote_ip_prefix in the request body.
+       *
+       * @return the Builder.
+       * @see Rule#getRemoteGroupId()
+       */
+      public ParameterizedBuilderType remoteGroupId(String remoteGroupId) {
+         rule.remoteGroupId = remoteGroupId;
+         return self();
+      }
+
+      /**
+       * The remote IP prefix to be associated with this security group rule. You can specify either remote_group_id
+       * or remote_ip_prefix in the request body. This attribute matches the specified IP prefix as the source IP
+       * address of the IP packet.
+       *
+       * @return the Builder.
+       * @see Rule#getRemoteIpPrefix()
+       */
+      public ParameterizedBuilderType remoteIpPrefix(String remoteIpPrefix) {
+         rule.remoteIpPrefix = remoteIpPrefix;
+         return self();
+      }
+   }
+
+   /**
+    * This is used to build a CreateOptions object.
+    */
+   public static class CreateBuilder extends Builder<CreateBuilder> {
+      /**
+       * Supply required properties for creating a Builder
+       */
+      private CreateBuilder(RuleDirection direction, String securityGroupId) {
+         rule.direction = direction;
+         rule.securityGroupId = securityGroupId;
+      }
+
+      /**
+       * @return a CreateOptions constructed with this Builder.
+       */
+      public CreateRule build() {
+         return new CreateRule(rule);
+      }
+
+      protected CreateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Create and Update options - extend the domain class, passed to API update and create calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class CreateRule extends Rule {
+      private CreateRule(Rule rule) {
+         super(rule);
+         checkNotNull(this.getDirection(), "direction should not be null");
+         checkNotNull(this.getSecurityGroupId(), "security group id should not be null");
+         checkArgument(this.getPortRangeMax() >= this.getPortRangeMin(),
+               "port range max should be greater than or equal to port range min");
+         checkArgument(this.getRemoteGroupId() == null || this.getRemoteIpPrefix() == null,
+               "You can specify either remote_group_id or remote_ip_prefix in the request body.");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleDirection.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleDirection.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleDirection.java
new file mode 100644
index 0000000..52e4273
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleDirection.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.domain;
+
+/**
+ * The direction in which the security group rule is applied.
+ */
+public enum RuleDirection {
+   /**
+    * For a compute instance, an ‘ingress’ security group rule matches traffic that is incoming (ingress) for that instance.
+    */
+   INGRESS("ingress"),
+   /**
+    * An ‘egress’ rule is applied to traffic leaving the instance.
+    */
+   EGRESS("egress"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private RuleDirection(String name) {
+      this.name = name;
+   }
+
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static RuleDirection fromValue(String name){
+      if (name != null) {
+         for (RuleDirection value : RuleDirection.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleEthertype.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleEthertype.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleEthertype.java
new file mode 100644
index 0000000..dd3aa3f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleEthertype.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.domain;
+
+/**
+ * The direction in which the security group rule is applied.
+ */
+public enum RuleEthertype {
+   /**
+    * Internet Protocol version 4
+    */
+   IPV4("IPv4"),
+   /**
+    * Internet Protocol version 6
+    */
+   IPV6("IPv6"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private RuleEthertype(String name) {
+      this.name = name;
+   }
+
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static RuleEthertype fromValue(String name){
+      if (name != null) {
+         for (RuleEthertype value : RuleEthertype.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleProtocol.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleProtocol.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleProtocol.java
new file mode 100644
index 0000000..f6a4574
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/RuleProtocol.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.domain;
+
+/**
+ * The protocol that is matched by the security group rule. Valid values are null, tcp, udp, and icmp.
+ */
+public enum RuleProtocol {
+   /**
+    * Transmission Control Protocol
+    */
+   TCP("tcp"),
+   /**
+    * User Datagram Protocol
+    */
+   UDP("udp"),
+   /**
+    * Internet Control Message Protocol
+    */
+   ICMP("icmp"),
+   /**
+    * Used by jclouds when the service returns an unknown value other than null.
+    */
+   UNRECOGNIZED("unrecognized");
+
+   private String name;
+
+   private RuleProtocol(String name) {
+      this.name = name;
+   }
+
+   public String toString() {
+      return name;
+   }
+
+   /*
+    * This provides GSON enum support in jclouds.
+    * */
+   public static RuleProtocol fromValue(String name){
+      if (name != null) {
+         for (RuleProtocol value : RuleProtocol.values()) {
+            if (name.equalsIgnoreCase(value.name)) {
+               return value;
+            }
+         }
+         return UNRECOGNIZED;
+      }
+      return null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rules.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rules.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rules.java
new file mode 100644
index 0000000..4794a18
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Rules.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.domain;
+
+import java.beans.ConstructorProperties;
+
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A collection of Networks
+ */
+public class Rules extends PaginatedCollection<Rule> {
+   public static final Rules EMPTY = new Rules(ImmutableSet.<Rule> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({"security_group_rules", "security_group_rules_links"})
+   protected Rules(Iterable<Rule> securityGroups, Iterable<Link> securityGroupRulesLinks) {
+      super(securityGroups, securityGroupRulesLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroup.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroup.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroup.java
new file mode 100644
index 0000000..d9cab9f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroup.java
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.domain;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Named;
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Contains a mapping between a MAC address and an IP address.
+ */
+public class SecurityGroup {
+
+   private String id;
+   @Named("tenant_id")
+   private String tenantId;
+   private String name;
+   private String description;
+   @Named("security_group_rules")
+   private ImmutableList<Rule> rules;
+
+   @ConstructorProperties({"id", "tenant_id", "name", "description", "security_group_rules"})
+   protected SecurityGroup(String id, String tenantId, String name, String description,
+         ImmutableList<Rule> rules) {
+      this.id = id;
+      this.tenantId = tenantId;
+      this.name = name;
+      this.description = description;
+      this.rules = rules;
+   }
+
+   private SecurityGroup(SecurityGroup securityGroup) {
+      this(securityGroup.id,
+            securityGroup.tenantId,
+            securityGroup.name,
+            securityGroup.description,
+            securityGroup.rules
+      );
+   }
+
+   private SecurityGroup() {}
+
+   /**
+    * @return The identifier for this Security Group.
+    */
+   @Nullable
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * @return The identifier of the tenant for this Security Group.
+    */
+   @Nullable
+   public String getTenantId() {
+      return tenantId;
+   }
+
+   /**
+    * @return The name of the Security Group.
+    */
+   @Nullable
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * @return The description of the Security Group.
+    */
+   @Nullable
+   public String getDescription() {
+      return description;
+   }
+
+   /**
+    * @return The collection of rules for this Security Group.
+    */
+   public ImmutableList<Rule> getRules() {
+      return rules != null ? rules : ImmutableList.<Rule>of();
+   }
+
+   @Override
+   public boolean equals(Object o) {
+      if (this == o)
+         return true;
+      if (o == null || getClass() != o.getClass())
+         return false;
+
+      SecurityGroup that = (SecurityGroup) o;
+
+      return Objects.equal(this.id, that.id) &&
+            Objects.equal(this.tenantId, that.tenantId) &&
+            Objects.equal(this.name, that.name) &&
+            Objects.equal(this.description, that.description) &&
+            Objects.equal(this.rules, that.rules);
+   }
+
+   @Override
+   public int hashCode() {
+      return Objects.hashCode(id, tenantId, name, description, rules);
+   }
+
+   @Override
+   public String toString() {
+      return Objects.toStringHelper(this)
+            .add("id", id)
+            .add("tenantId", tenantId)
+            .add("name", name)
+            .add("description", description)
+            .add("securityGroupRules", rules)
+            .toString();
+   }
+
+   /*
+    * Methods to get the Create and Update builders follow
+    */
+
+   /**
+    * @return the Builder for creating a new SecurityGroup
+    */
+   public static CreateBuilder createBuilder() {
+      return new CreateBuilder();
+   }
+
+   private abstract static class Builder<ParameterizedBuilderType> {
+      // Keep track of the builder's state.
+      protected SecurityGroup securityGroup;
+
+      private Builder() {
+         securityGroup = new SecurityGroup();
+      }
+
+      protected abstract ParameterizedBuilderType self();
+
+      /**
+       * The tenant id for this Security Group. Usually can only be specified by administrators.
+       *
+       * @return the Builder.
+       * @see SecurityGroup#getTenantId()
+       */
+      public ParameterizedBuilderType tenantId(String tenantId) {
+         securityGroup.tenantId = tenantId;
+         return self();
+      }
+
+      /**
+       * The name for this Security Group.
+       *
+       * @return the Builder.
+       * @see SecurityGroup#getName()
+       */
+      public ParameterizedBuilderType name(String name) {
+         securityGroup.name = name;
+         return self();
+      }
+
+      /**
+       * The description for this Security Group.
+       *
+       * @return the Builder.
+       * @see SecurityGroup#getDescription()
+       */
+      public ParameterizedBuilderType description(String description) {
+         securityGroup.description = description;
+         return self();
+      }
+   }
+
+   /**
+    * Create and Update builders (inheriting from Builder)
+    */
+   public static class CreateBuilder extends Builder<CreateBuilder> {
+      /**
+       * Supply required properties for creating a Builder
+       */
+      private CreateBuilder() {
+      }
+
+      /**
+       * @return a CreateOptions constructed with this Builder.
+       */
+      public CreateSecurityGroup build() {
+         return new CreateSecurityGroup(securityGroup);
+      }
+
+      protected CreateBuilder self() {
+         return this;
+      }
+   }
+
+   /**
+    * Create and Update options - extend the domain class, passed to API update and create calls.
+    * Essentially the same as the domain class. Ensure validation and safe typing.
+    */
+   public static class CreateSecurityGroup extends SecurityGroup {
+      private CreateSecurityGroup(SecurityGroup securityGroup) {
+         super(securityGroup);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroups.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroups.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroups.java
new file mode 100644
index 0000000..044ce1c
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/SecurityGroups.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.domain;
+
+import java.beans.ConstructorProperties;
+
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * A collection of Networks
+ */
+public class SecurityGroups extends PaginatedCollection<SecurityGroup> {
+   public static final SecurityGroups EMPTY = new SecurityGroups(ImmutableSet.<SecurityGroup> of(), ImmutableSet.<Link> of());
+
+   @ConstructorProperties({"security_groups", "security_groups_links"})
+   protected SecurityGroups(Iterable<SecurityGroup> securityGroups, Iterable<Link> securityGroupsLinks) {
+      super(securityGroups, securityGroupsLinks);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnet.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnet.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnet.java
index 31d3327..d280b65 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnet.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnet.java
@@ -1,33 +1,32 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
-import org.jclouds.javax.annotation.Nullable;
+import static com.google.common.base.Preconditions.checkNotNull;
 
-import javax.inject.Named;
 import java.beans.ConstructorProperties;
 import java.util.Collection;
-import java.util.Set;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import javax.inject.Named;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * A Neutron subnet
@@ -268,18 +267,18 @@ public class Subnet {
    /**
     * @return the Builder for creating a new Router
     */
-   public static CreateBuilder createOptions(String networkId, String cidr) {
+   public static CreateBuilder createBuilder(String networkId, String cidr) {
       return new CreateBuilder(networkId, cidr);
    }
 
    /**
     * @return the Builder for updating a Router
     */
-   public static UpdateBuilder updateOptions() {
+   public static UpdateBuilder updateBuilder() {
       return new UpdateBuilder();
    }
 
-   private static abstract class Builder<ParameterizedBuilderType> {
+   private abstract static class Builder<ParameterizedBuilderType> {
       protected Subnet subnet;
 
       /**
@@ -406,8 +405,8 @@ public class Subnet {
       /**
        * @return a CreateOptions constructed with this Builder.
        */
-      public CreateOptions build() {
-         return new CreateOptions(subnet);
+      public CreateSubnet build() {
+         return new CreateSubnet(subnet);
       }
 
       protected CreateBuilder self() {
@@ -428,8 +427,8 @@ public class Subnet {
       /**
        * @return a UpdateOptions constructed with this Builder.
        */
-      public UpdateOptions build() {
-         return new UpdateOptions(subnet);
+      public UpdateSubnet build() {
+         return new UpdateSubnet(subnet);
       }
 
       protected UpdateBuilder self() {
@@ -441,11 +440,11 @@ public class Subnet {
     * Create and Update options - extend the domain class, passed to API update and create calls.
     * Essentially the same as the domain class. Ensure validation and safe typing.
     */
-   public static class CreateOptions extends Subnet {
+   public static class CreateSubnet extends Subnet {
       /**
        * Copy constructor
        */
-      private CreateOptions(Subnet subnet) {
+      private CreateSubnet(Subnet subnet) {
          super(subnet);
          checkNotNull(subnet.networkId, "networkId should not be null");
          checkNotNull(subnet.cidr, "cidr should not be null");
@@ -456,11 +455,11 @@ public class Subnet {
     * Create and Update options - extend the domain class, passed to API update and create calls.
     * Essentially the same as the domain class. Ensure validation and safe typing.
     */
-   public static class UpdateOptions extends Subnet {
+   public static class UpdateSubnet extends Subnet {
       /**
        * Copy constructor
        */
-      private UpdateOptions(Subnet subnet) {
+      private UpdateSubnet(Subnet subnet) {
          super(subnet);
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnets.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnets.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnets.java
index ac36a2b..fb9896e 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnets.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/Subnets.java
@@ -16,19 +16,20 @@
  */
 package org.jclouds.openstack.neutron.v2.domain;
 
-import com.google.common.collect.ImmutableSet;
+import java.beans.ConstructorProperties;
+
 import org.jclouds.openstack.v2_0.domain.Link;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 
-import java.beans.ConstructorProperties;
+import com.google.common.collect.ImmutableSet;
 
 /**
- * A collection of Networks
+ * A collection of Subnets
  */
 public class Subnets extends PaginatedCollection<Subnet> {
    public static final Subnets EMPTY = new Subnets(ImmutableSet.<Subnet> of(), ImmutableSet.<Link> of());
 
-   @ConstructorProperties({ "subnets", "subnets_links" })
+   @ConstructorProperties({"subnets", "subnets_links"})
    protected Subnets(Iterable<Subnet> subnets, Iterable<Link> subnetsLinks) {
       super(subnets, subnetsLinks);
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VIFType.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VIFType.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VIFType.java
index 0c53e77..5417065 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VIFType.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VIFType.java
@@ -45,7 +45,7 @@ public enum VIFType {
       return name;
    }
 
-   /**
+   /*
     * This provides GSON enum support in jclouds.
     * */
    public static VIFType fromValue(String name){

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VNICType.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VNICType.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VNICType.java
index b67063d..80fd4aa 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VNICType.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/domain/VNICType.java
@@ -39,7 +39,7 @@ public enum VNICType {
       return name;
    }
 
-   /**
+   /*
     * This provides GSON enum support in jclouds.
     * */
    public static VNICType fromValue(String name){

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApi.java
new file mode 100644
index 0000000..9a65543
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApi.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIP;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIPs;
+import org.jclouds.openstack.neutron.v2.fallbacks.EmptyFloatingIPsFallback;
+import org.jclouds.openstack.neutron.v2.functions.FloatingIPsToPagedIterable;
+import org.jclouds.openstack.neutron.v2.functions.ParseFloatingIPs;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.annotations.Transform;
+import org.jclouds.rest.annotations.WrapWith;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Provides access to Floating IP operations for the OpenStack Networking (Neutron) v2 API.
+ * <p/>
+ * A floating IP is an IP address on an external network, which is associated with a specific port, and optionally a
+ * specific IP address, on a private OpenStack Networking network. Therefore a floating IP allows access to an
+ * instance on a private network from an external network. Floating IPs can only be defined on networks for which the
+ * attribute floatingip:external (by the external network extension) has been set to True.
+ */
+@Beta
+@Path("/floatingips")
+@RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+public interface FloatingIPApi {
+
+   /**
+    * Returns a list of floating IPs to which the tenant has access. Default policy settings return only
+    * those floating IPs that are owned by the tenant who submits the request, unless the request is submitted by an
+    * user with administrative rights.
+    *
+    * @return the list of all floatingIP references configured for the tenant.
+    */
+   @Named("floatingip:list")
+   @GET
+   @Transform(FloatingIPsToPagedIterable.class)
+   @ResponseParser(ParseFloatingIPs.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   PagedIterable<FloatingIP> list();
+
+   /**
+    * @return the list of all floatingIP references configured for the tenant.
+    */
+   @Named("floatingip:list")
+   @GET
+   @ResponseParser(ParseFloatingIPs.class)
+   @Fallback(EmptyFloatingIPsFallback.class)
+   FloatingIPs list(PaginationOptions options);
+
+   /**
+    * Returns the details for a specific floating IP.
+    *
+    * @param id the id of the floatingIP to return
+    * @return FloatingIPs collection or empty if not found
+    */
+   @Named("floatingip:get")
+   @GET
+   @Path("/{id}")
+   @SelectJson("floatingip")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   FloatingIP get(@PathParam("id") String id);
+
+   /**
+    * Creates a floating IP.
+    *
+    * @param createFloatingIP Options for creating a Floating IP
+    * @return the newly created Floating IP
+    */
+   @Named("floatingip:create")
+   @POST
+   @SelectJson("floatingip")
+   FloatingIP create(@WrapWith("floatingip") FloatingIP.CreateFloatingIP createFloatingIP);
+
+   /**
+    * Update a Floating IP
+    *
+    * @param id the id of the Floating IP to update
+    * @param updateFloatingIP Contains only the attributes to update
+    * @return The modified Floating IP
+    */
+   @Named("floatingip:update")
+   @PUT
+   @Path("/{id}")
+   @SelectJson("floatingip")
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
+   FloatingIP update(@PathParam("id") String id, @WrapWith("floatingip") FloatingIP.UpdateFloatingIP updateFloatingIP);
+
+   /**
+    * Deletes the specified floatingIP
+    *
+    * @param id the id of the floatingIP to delete
+    * @return true if delete successful, false if not
+    */
+   @Named("floatingip:delete")
+   @DELETE
+   @Path("/{id}")
+   @Fallback(FalseOnNotFoundOr404.class)
+   boolean delete(@PathParam("id") String id);
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
index 1012117..e259d69 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/RouterApi.java
@@ -1,25 +1,34 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.extensions;
 
-import com.google.common.annotations.Beta;
-import org.jclouds.Fallbacks;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.collect.PagedIterable;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
@@ -40,18 +49,10 @@ import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.annotations.WrapWith;
 
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.MediaType;
+import com.google.common.annotations.Beta;
 
 /**
- * Provides synchronous access to Router operations on the OpenStack Neutron API.
+ * Provides access to Router operations for the OpenStack Networking (Neutron) v2 API.
  * <p/>
  * A logical entity for forwarding packets across internal subnets and NATting them on external
  * networks through an appropriate external gateway.
@@ -60,7 +61,7 @@ import javax.ws.rs.core.MediaType;
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/router_ext.html">api doc</a>
  */
 @Beta
-@Path("/v2.0/routers")
+@Path("/routers")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 public interface RouterApi {
@@ -75,7 +76,7 @@ public interface RouterApi {
    @GET
    @Transform(RouterToPagedIterable.class)
    @ResponseParser(ParseRouters.class)
-   @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
    PagedIterable<Router> list();
 
    /**
@@ -97,7 +98,7 @@ public interface RouterApi {
    @GET
    @Path("/{id}")
    @SelectJson("router")
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Fallback(NullOnNotFoundOr404.class)
    @Nullable
    Router get(@PathParam("id") String id);
 
@@ -110,7 +111,7 @@ public interface RouterApi {
    @Named("router:create")
    @POST
    @SelectJson("router")
-   Router create(@WrapWith("router") Router.CreateOptions router);
+   Router create(@WrapWith("router") Router.CreateRouter router);
 
    /**
     * Update a router
@@ -123,9 +124,9 @@ public interface RouterApi {
    @PUT
    @Path("/{id}")
    @SelectJson("router")
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Fallback(NullOnNotFoundOr404.class)
    @Nullable
-   Router update(@PathParam("id") String id, @WrapWith("router") Router.UpdateOptions router);
+   Router update(@PathParam("id") String id, @WrapWith("router") Router.UpdateRouter router);
 
    /**
     * Deletes the specified router
@@ -136,7 +137,7 @@ public interface RouterApi {
    @Named("router:delete")
    @DELETE
    @Path("/{id}")
-   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   @Fallback(FalseOnNotFoundOr404.class)
    boolean delete(@PathParam("id") String id);
 
    /**
@@ -150,7 +151,7 @@ public interface RouterApi {
    @PUT
    @Path("/{id}/add_router_interface")
    @MapBinder(EmptyOptions.class)
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Fallback(NullOnNotFoundOr404.class)
    @Nullable
    RouterInterface addInterfaceForSubnet(@PathParam("id") String routerId, @PayloadParam("subnet_id") String subnetId);
 
@@ -165,7 +166,7 @@ public interface RouterApi {
    @PUT
    @Path("/{id}/add_router_interface")
    @MapBinder(EmptyOptions.class)
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Fallback(NullOnNotFoundOr404.class)
    @Nullable
    RouterInterface addInterfaceForPort(@PathParam("id") String routerId, @PayloadParam("port_id") String portId);
 
@@ -179,7 +180,7 @@ public interface RouterApi {
    @PUT
    @Path("/{id}/remove_router_interface")
    @MapBinder(EmptyOptions.class)
-   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   @Fallback(FalseOnNotFoundOr404.class)
    boolean removeInterfaceForSubnet(@PathParam("id") String routerId, @PayloadParam("subnet_id") String subnetId);
 
    /**
@@ -192,6 +193,6 @@ public interface RouterApi {
    @PUT
    @Path("/{id}/remove_router_interface")
    @MapBinder(EmptyOptions.class)
-   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   @Fallback(FalseOnNotFoundOr404.class)
    boolean removeInterfaceForPort(@PathParam("id") String routerId, @PayloadParam("port_id") String portId);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java
new file mode 100644
index 0000000..0832d4c
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApi.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.domain.Rules;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
+import org.jclouds.openstack.neutron.v2.fallbacks.EmptyRulesFallback;
+import org.jclouds.openstack.neutron.v2.fallbacks.EmptySecurityGroupsFallback;
+import org.jclouds.openstack.neutron.v2.functions.ParseRules;
+import org.jclouds.openstack.neutron.v2.functions.ParseSecurityGroups;
+import org.jclouds.openstack.neutron.v2.functions.RulesToPagedIterable;
+import org.jclouds.openstack.neutron.v2.functions.SecurityGroupsToPagedIterable;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.annotations.Transform;
+import org.jclouds.rest.annotations.WrapWith;
+import com.google.common.annotations.Beta;
+
+/**
+ * Provides access to Security Group extension operations for the OpenStack Networking (Neutron) v2 API.
+ * <p/>
+ * Security groups and security group rules allows administrators and tenants the ability to specify the type of
+ * traffic and direction (ingress/egress) that is allowed to pass through a port. A security group is a container for
+ * security group rules.
+ */
+@Beta
+@RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Produces(MediaType.APPLICATION_JSON)
+public interface SecurityGroupApi {
+   /**
+    * Groups
+    */
+
+   /**
+    * @return all security groups currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-groups")
+   @Named("security-group:list")
+   @GET
+   @ResponseParser(ParseSecurityGroups.class)
+   @Transform(SecurityGroupsToPagedIterable.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   PagedIterable<SecurityGroup> listSecurityGroups();
+
+   /**
+    * @return all security groups currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-groups")
+   @Named("security-group:list")
+   @GET
+   @ResponseParser(ParseSecurityGroups.class)
+   @Fallback(EmptySecurityGroupsFallback.class)
+   SecurityGroups listSecurityGroups(PaginationOptions options);
+
+   /**
+    * @param id the id of the security group to return
+    * @return SecurityGroup or null if not found.
+    */
+   @Path("/security-groups/{id}")
+   @Named("security-group:get")
+   @GET
+   @SelectJson("security_group")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Nullable
+   SecurityGroup getSecurityGroup(@PathParam("id") String id);
+
+   /**
+    * Creates a new SecurityGroup.
+    *
+    * @param securityGroup Describes the security group to be created.
+    * @return a reference of the newly-created security group
+    */
+   @Path("/security-groups")
+   @Named("secuity-group:create")
+   @POST
+   @SelectJson("security_group")
+   SecurityGroup create(@WrapWith("security_group") SecurityGroup.CreateSecurityGroup securityGroup);
+
+   /**
+    * Deletes the specified Security Group.
+    *
+    * @param id the id of the security group to delete
+    * @return true if delete was successful, false if not
+    */
+   @Path("/security-groups/{id}")
+   @Named("security-group:delete")
+   @DELETE
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteSecurityGroup(@PathParam("id") String id);
+
+   /**
+    * Rules
+    */
+
+   /**
+    * @return all security groups rules currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-group-rules")
+   @Named("security-group-rule:list")
+   @GET
+   @ResponseParser(ParseRules.class)
+   @Transform(RulesToPagedIterable.class)
+   @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
+   PagedIterable<Rule> listRules();
+
+   /**
+    * @return all security groups rules currently defined in Neutron for the current tenant.
+    */
+   @Path("/security-group-rules")
+   @Named("security-group-rule:list")
+   @GET
+   @ResponseParser(ParseRules.class)
+   @Fallback(EmptyRulesFallback.class)
+   Rules listRules(PaginationOptions options);
+
+   /**
+    * @param id the id of the security group rule to return.
+    * @return SecurityGroupRule or null if not found.
+    */
+   @Path("/security-group-rules/{id}")
+   @Named("security-group-rule:get")
+   @GET
+   @SelectJson("security_group_rule")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Nullable
+   Rule get(@PathParam("id") String id);
+
+   /**
+    * Creates a new Security Group Rule.
+    *
+    * @param securityGroupRule Describes the security group rule to be created.
+    * @return a reference of the newly-created security group rule.
+    */
+   @Path("/security-group-rules")
+   @Named("security-group-rule:create")
+   @POST
+   @SelectJson("security_group_rule")
+   Rule create(@WrapWith("security_group_rule") Rule.CreateRule securityGroupRule);
+
+   /**
+    * Deletes the specified Security Group Rule.
+    *
+    * @param id the id of the security group rule to delete.
+    * @return true if delete was successful, false if not.
+    */
+   @Path("/security-group-rules/{id}")
+   @Named("security-group-rule:delete")
+   @DELETE
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteRule(@PathParam("id") String id);
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyFloatingIPsFallback.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyFloatingIPsFallback.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyFloatingIPsFallback.java
new file mode 100644
index 0000000..b9b03c4
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyFloatingIPsFallback.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.fallbacks;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.jclouds.Fallback;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIPs;
+import org.jclouds.rest.ResourceNotFoundException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Throwables.propagate;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static org.jclouds.http.HttpUtils.contains404;
+import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
+
+public class EmptyFloatingIPsFallback implements Fallback<FloatingIPs> {
+
+   public ListenableFuture<FloatingIPs> create(Throwable t) throws Exception {
+      return immediateFuture(createOrPropagate(t));
+   }
+
+   @Override
+   public FloatingIPs createOrPropagate(Throwable t) throws Exception {
+      if ((getFirstThrowableOfType(checkNotNull(t, "throwable"), ResourceNotFoundException.class) != null)
+            || contains404(t)) {
+         return FloatingIPs.EMPTY;
+      }
+      throw propagate(t);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyRulesFallback.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyRulesFallback.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyRulesFallback.java
new file mode 100644
index 0000000..a559f4f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptyRulesFallback.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.fallbacks;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Throwables.propagate;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static org.jclouds.http.HttpUtils.contains404;
+import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
+
+import org.jclouds.Fallback;
+import org.jclouds.openstack.neutron.v2.domain.Rules;
+import org.jclouds.rest.ResourceNotFoundException;
+import com.google.common.util.concurrent.ListenableFuture;
+
+public class EmptyRulesFallback implements Fallback<Rules> {
+
+   public ListenableFuture<Rules> create(Throwable t) throws Exception {
+      return immediateFuture(createOrPropagate(t));
+   }
+
+   @Override
+   public Rules createOrPropagate(Throwable t) throws Exception {
+      if ((getFirstThrowableOfType(checkNotNull(t, "throwable"), ResourceNotFoundException.class) != null)
+            || contains404(t)) {
+         return Rules.EMPTY;
+      }
+      throw propagate(t);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptySecurityGroupsFallback.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptySecurityGroupsFallback.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptySecurityGroupsFallback.java
new file mode 100644
index 0000000..5343c3f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/fallbacks/EmptySecurityGroupsFallback.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.fallbacks;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.jclouds.Fallback;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
+import org.jclouds.rest.ResourceNotFoundException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Throwables.propagate;
+import static com.google.common.util.concurrent.Futures.immediateFuture;
+import static org.jclouds.http.HttpUtils.contains404;
+import static org.jclouds.util.Throwables2.getFirstThrowableOfType;
+
+public class EmptySecurityGroupsFallback implements Fallback<SecurityGroups> {
+
+   public ListenableFuture<SecurityGroups> create(Throwable t) throws Exception {
+      return immediateFuture(createOrPropagate(t));
+   }
+
+   @Override
+   public SecurityGroups createOrPropagate(Throwable t) throws Exception {
+      if ((getFirstThrowableOfType(checkNotNull(t, "throwable"), ResourceNotFoundException.class) != null)
+            || contains404(t)) {
+         return SecurityGroups.EMPTY;
+      }
+      throw propagate(t);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
index cd02cac..08e5586 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/NetworkApi.java
@@ -1,26 +1,32 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.features;
 
-import com.google.common.annotations.Beta;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
 import org.jclouds.Fallbacks;
 import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
 import org.jclouds.collect.PagedIterable;
@@ -39,19 +45,12 @@ import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.annotations.WrapWith;
 
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
+import com.google.common.annotations.Beta;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableList;
 
 /**
- * Provides synchronous access to Network operations on the openstack Neutron API.
+ * Provides access to Network operations for the OpenStack Networking (Neutron) v2 API.
  * <p/>
  * Each tenant can define one or more networks. A network is a virtual isolated layer-2 broadcast domain reserved to the
  * tenant. A tenant can create several ports for a network, and plug virtual interfaces into these ports.
@@ -60,7 +59,7 @@ import javax.ws.rs.core.MediaType;
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/Networks.html">api doc</a>
  */
 @Beta
-@Path("/v2.0/networks")
+@Path("/networks")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
@@ -110,7 +109,7 @@ public interface NetworkApi {
    @Named("network:create")
    @POST
    @SelectJson("network")
-   Network create(@WrapWith("network") Network.CreateOptions network);
+   Network create(@WrapWith("network") Network.CreateNetwork network);
 
    /**
     * Create multiple networks
@@ -121,7 +120,7 @@ public interface NetworkApi {
    @Named("network:createBulk")
    @POST
    @SelectJson("networks")
-   FluentIterable<Network> createBulk(@WrapWith("networks") ImmutableList<Network.CreateOptions> networks);
+   FluentIterable<Network> createBulk(@WrapWith("networks") ImmutableList<Network.CreateNetwork> networks);
 
    /**
     * Update a network
@@ -136,7 +135,7 @@ public interface NetworkApi {
    @SelectJson("network")
    @Fallback(Fallbacks.NullOnNotFoundOr404.class)
    @Nullable
-   Network update(@PathParam("id") String id, @WrapWith("network") Network.UpdateOptions network);
+   Network update(@PathParam("id") String id, @WrapWith("network") Network.UpdateNetwork network);
 
    /**
     * Deletes the specified network

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
index 356111e..6466a90 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/PortApi.java
@@ -1,20 +1,18 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.features;
 
@@ -50,7 +48,7 @@ import javax.ws.rs.core.MediaType;
 import java.util.List;
 
 /**
- * Provides synchronous access to Port operations on the openstack Neutron API.
+ * Provides access to Port operations for the OpenStack Networking (Neutron) v2 API.
  * <p/>
  * A port represents a virtual switch port on a logical network switch where all the interfaces attached to a given network are connected.
  * <p/>
@@ -59,7 +57,7 @@ import java.util.List;
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/Ports.html">api doc</a>
  */
 @Beta
-@Path("/v2.0/ports")
+@Path("/ports")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 public interface PortApi {
@@ -109,7 +107,7 @@ public interface PortApi {
    @Named("port:create")
    @POST
    @SelectJson("port")
-   Port create(@WrapWith("port") Port.CreateOptions port);
+   Port create(@WrapWith("port") Port.CreatePort port);
 
    /**
     * Create multiple ports
@@ -120,7 +118,7 @@ public interface PortApi {
    @Named("port:createBulk")
    @POST
    @SelectJson("ports")
-   FluentIterable<Port> createBulk(@WrapWith("ports") List<Port.CreateOptions> ports);
+   FluentIterable<Port> createBulk(@WrapWith("ports") List<Port.CreatePort> ports);
 
    /**
     * Update a port
@@ -134,7 +132,7 @@ public interface PortApi {
    @Path("/{id}")
    @SelectJson("port")
    @Fallback(Fallbacks.NullOnNotFoundOr404.class)
-   Port update(@PathParam("id") String id, @WrapWith("port") Port.UpdateOptions port);
+   Port update(@PathParam("id") String id, @WrapWith("port") Port.UpdatePort port);
 
    /**
     * Delete a port

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
index a50e486..7b6f54e 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/features/SubnetApi.java
@@ -1,20 +1,18 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.features;
 
@@ -50,12 +48,12 @@ import javax.ws.rs.core.MediaType;
 import java.util.List;
 
 /**
- * Provides synchronous access to Subnet operations on the Openstack Neutron API.
+ * Provides access to Subnet operations for the OpenStack Networking (Neutron) v2 API.
  *
  * @see <a href=
  *      "http://docs.openstack.org/api/openstack-network/2.0/content/Subnets.html">api doc</a>
  */
-@Path("/v2.0/subnets")
+@Path("/subnets")
 @RequestFilters(AuthenticateRequest.class)
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
@@ -106,7 +104,7 @@ public interface SubnetApi {
    @Named("subnet:create")
    @POST
    @SelectJson("subnet")
-   Subnet create(@WrapWith("subnet") Subnet.CreateOptions subnet);
+   Subnet create(@WrapWith("subnet") Subnet.CreateSubnet subnet);
 
    /**
     * Create multiple subnets
@@ -117,7 +115,7 @@ public interface SubnetApi {
    @Named("subnet:createBulk")
    @POST
    @SelectJson("subnets")
-   FluentIterable<Subnet> createBulk(@WrapWith("subnets") List<Subnet.CreateOptions> subnets);
+   FluentIterable<Subnet> createBulk(@WrapWith("subnets") List<Subnet.CreateSubnet> subnets);
 
    /**
     * Update a subnet
@@ -130,7 +128,7 @@ public interface SubnetApi {
    @Path("/{id}")
    @SelectJson("subnet")
    @Fallback(Fallbacks.NullOnNotFoundOr404.class)
-   Subnet update(@PathParam("id") String id, @WrapWith("subnet") Subnet.UpdateOptions subnet);
+   Subnet update(@PathParam("id") String id, @WrapWith("subnet") Subnet.UpdateSubnet subnet);
 
    /**
     * Delete a subnet

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FloatingIPsToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FloatingIPsToPagedIterable.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FloatingIPsToPagedIterable.java
new file mode 100644
index 0000000..4d54d1f
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/FloatingIPsToPagedIterable.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.functions;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.internal.Arg0ToPagedIterable;
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIP;
+import org.jclouds.openstack.neutron.v2.extensions.FloatingIPApi;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+
+import javax.inject.Inject;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Ensures Floating IPs works as PagedIterable.
+ */
+public class FloatingIPsToPagedIterable extends Arg0ToPagedIterable.FromCaller<FloatingIP, FloatingIPsToPagedIterable> {
+
+   private final NeutronApi api;
+
+   @Inject
+   protected FloatingIPsToPagedIterable(NeutronApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   protected Function<Object, IterableWithMarker<FloatingIP>> markerToNextForArg0(Optional<Object> arg0) {
+      String region = arg0.isPresent() ? arg0.get().toString() : null;
+      final FloatingIPApi floatingIPApi = api.getFloatingIPApi(region).get();
+      return new Function<Object, IterableWithMarker<FloatingIP>>() {
+
+         @SuppressWarnings("unchecked")
+         @Override
+         public IterableWithMarker<FloatingIP> apply(Object input) {
+            PaginationOptions paginationOptions = PaginationOptions.class.cast(input);
+            return IterableWithMarker.class.cast(floatingIPApi.list(paginationOptions));
+         }
+
+         @Override
+         public String toString() {
+            return "listfloatingIPs()";
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFloatingIPs.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFloatingIPs.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFloatingIPs.java
new file mode 100644
index 0000000..6529627
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseFloatingIPs.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.functions;
+
+import com.google.inject.TypeLiteral;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIPs;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+/**
+ * Used by jclouds to provide more specific collections and fallbacks.
+ */
+@Singleton
+public class ParseFloatingIPs extends ParseJson<FloatingIPs> {
+
+   @Inject
+   public ParseFloatingIPs(Json json) {
+      super(json, TypeLiteral.get(FloatingIPs.class));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseRules.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseRules.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseRules.java
new file mode 100644
index 0000000..954180b
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseRules.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.functions;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.neutron.v2.domain.Rules;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Used by jclouds to provide more specific collections and fallbacks.
+ */
+@Singleton
+public class ParseRules extends ParseJson<Rules> {
+
+   @Inject
+   public ParseRules(Json json) {
+      super(json, TypeLiteral.get(Rules.class));
+   }
+}


[4/6] Backports all neutron changes from master for 1.8.1

Posted by za...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseSecurityGroups.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseSecurityGroups.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseSecurityGroups.java
new file mode 100644
index 0000000..3864781
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/ParseSecurityGroups.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.functions;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Used by jclouds to provide more specific collections and fallbacks.
+ */
+@Singleton
+public class ParseSecurityGroups extends ParseJson<SecurityGroups> {
+
+   @Inject
+   public ParseSecurityGroups(Json json) {
+      super(json, TypeLiteral.get(SecurityGroups.class));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RouterToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RouterToPagedIterable.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RouterToPagedIterable.java
index 8c3f1a5..5ce4def 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RouterToPagedIterable.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RouterToPagedIterable.java
@@ -1,25 +1,25 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.functions;
 
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.openstack.neutron.v2.NeutronApi;
@@ -27,9 +27,8 @@ import org.jclouds.openstack.neutron.v2.domain.Router;
 import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
 
 /**
  * Ensures Routers works as PagedIterable.
@@ -46,7 +45,7 @@ public class RouterToPagedIterable extends Arg0ToPagedIterable.FromCaller<Router
    @Override
    protected Function<Object, IterableWithMarker<Router>> markerToNextForArg0(Optional<Object> arg0) {
       String region = arg0.isPresent() ? arg0.get().toString() : null;
-      final RouterApi routerApi = api.getRouterExtensionApi(region).get();
+      final RouterApi routerApi = api.getRouterApi(region).get();
       return new Function<Object, IterableWithMarker<Router>>() {
 
          @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
new file mode 100644
index 0000000..d664cd6
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/RulesToPagedIterable.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.internal.Arg0ToPagedIterable;
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApi;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
+/**
+ * Ensures Routers works as PagedIterable.
+ */
+public class RulesToPagedIterable extends
+      Arg0ToPagedIterable.FromCaller<Rule, RulesToPagedIterable> {
+
+   private final NeutronApi api;
+
+   @Inject
+   protected RulesToPagedIterable(NeutronApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   protected Function<Object, IterableWithMarker<Rule>> markerToNextForArg0(Optional<Object> arg0) {
+      String region = arg0.isPresent() ? arg0.get().toString() : null;
+      final SecurityGroupApi securityGroupApi = api.getSecurityGroupApi(region).get();
+      return new Function<Object, IterableWithMarker<Rule>>() {
+
+         @SuppressWarnings("unchecked")
+         @Override
+         public IterableWithMarker<Rule> apply(Object input) {
+            PaginationOptions paginationOptions = PaginationOptions.class.cast(input);
+            return IterableWithMarker.class.cast(securityGroupApi.listRules(paginationOptions));
+         }
+
+         @Override
+         public String toString() {
+            return "listRules()";
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
new file mode 100644
index 0000000..15c7c14
--- /dev/null
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/functions/SecurityGroupsToPagedIterable.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.internal.Arg0ToPagedIterable;
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.extensions.SecurityGroupApi;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
+/**
+ * Ensures Routers works as PagedIterable.
+ */
+public class SecurityGroupsToPagedIterable extends
+      Arg0ToPagedIterable.FromCaller<SecurityGroup, SecurityGroupsToPagedIterable> {
+
+   private final NeutronApi api;
+
+   @Inject
+   protected SecurityGroupsToPagedIterable(NeutronApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   protected Function<Object, IterableWithMarker<SecurityGroup>> markerToNextForArg0(Optional<Object> arg0) {
+      String region = arg0.isPresent() ? arg0.get().toString() : null;
+      final SecurityGroupApi securityGroupApi = api.getSecurityGroupApi(region).get();
+      return new Function<Object, IterableWithMarker<SecurityGroup>>() {
+
+         @SuppressWarnings("unchecked")
+         @Override
+         public IterableWithMarker<SecurityGroup> apply(Object input) {
+            PaginationOptions paginationOptions = PaginationOptions.class.cast(input);
+            return IterableWithMarker.class.cast(securityGroupApi.listSecurityGroups(paginationOptions));
+         }
+
+         @Override
+         public String toString() {
+            return "listSecurityGroups()";
+         }
+      };
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/options/EmptyOptions.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/options/EmptyOptions.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/options/EmptyOptions.java
index 381abc1..98205fc 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/options/EmptyOptions.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2/options/EmptyOptions.java
@@ -1,20 +1,18 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.options;
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApi.java
index 55515df..a5ff027 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApi.java
@@ -17,10 +17,12 @@
 
 package org.jclouds.openstack.neutron.v2_0;
 
-import com.google.common.base.Optional;
-import com.google.inject.Provides;
-import org.jclouds.javax.annotation.Nullable;
+import java.io.Closeable;
+import java.util.Set;
+
+import org.jclouds.location.Region;
 import org.jclouds.location.Zone;
+import org.jclouds.location.functions.RegionToEndpoint;
 import org.jclouds.location.functions.ZoneToEndpoint;
 import org.jclouds.openstack.neutron.v2_0.extensions.RouterApi;
 import org.jclouds.openstack.neutron.v2_0.features.NetworkApi;
@@ -30,53 +32,103 @@ import org.jclouds.openstack.v2_0.features.ExtensionApi;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 
-import java.io.Closeable;
-import java.util.Set;
+import com.google.common.base.Optional;
+import com.google.inject.Provides;
 
 /**
- * Provides synchronous access to Neutron.
+ * Provides access to the OpenStack Networking (Neutron) v2 API.
  * <p/>
  *
- * @see <a href="http://docs.openstack.org/api/openstack-network/2.0/content/">api doc</a>
- * @deprecated Use v2 instead of v2_0
+ * @deprecated Please use {@link org.jclouds.openstack.neutron.v2.NeutronApi} as this
+ *             interface will be removed in jclouds 3.0.
  */
 @Deprecated
 public interface NeutronApi extends Closeable {
+
+   /**
+    * @return the Region codes configured
+    */
+   @Provides
+   @Region
+   Set<String> getConfiguredRegions();
+
+   /**
+    * Provides access to Extension features.
+    */
+   @Delegate
+   ExtensionApi getExtensionApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to Network features.
+    */
+   @Delegate
+   NetworkApi getNetworkApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to Subnet features.
+    */
+   @Delegate
+   SubnetApi getSubnetApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to Port features.
+    */
+   @Delegate
+   PortApi getPortApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
+   /**
+    * Provides access to Router features.
+    */
+   @Delegate
+   Optional<? extends RouterApi> getRouterApi(@EndpointParam(parser = RegionToEndpoint.class) String region);
+
    /**
     * @return the Zone codes configured
+    * @deprecated Please use {@link #getConfiguredRegions()} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Provides
    @Zone
    Set<String> getConfiguredZones();
 
    /**
-    * Provides synchronous access to Extension features.
+    * Provides access to Extension features.
+    * @deprecated Please use {@link #getExtensionApi(String)} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    ExtensionApi getExtensionApiForZone(
-           @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+           @EndpointParam(parser = ZoneToEndpoint.class) String zone);
 
    /**
-    * Provides synchronous access to Network features.
+    * Provides access to Network features.
+    * @deprecated Please use {@link #getNetworkApi(String)} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
-   NetworkApi getNetworkApiForZone(@EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+   NetworkApi getNetworkApiForZone(@EndpointParam(parser = ZoneToEndpoint.class) String zone);
 
    /**
-    * Provides synchronous access to Subnet features
+    * Provides access to Subnet features.
+    * @deprecated Please use {@link #getSubnetApi(String)} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
-   SubnetApi getSubnetApiForZone(@EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+   SubnetApi getSubnetApiForZone(@EndpointParam(parser = ZoneToEndpoint.class) String zone);
 
    /**
-    * Provides synchronous access to Port features.
+    * Provides access to Port features.
+    * @deprecated Please use {@link #getPortApi(String)} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
-   PortApi getPortApiForZone(@EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+   PortApi getPortApiForZone(@EndpointParam(parser = ZoneToEndpoint.class) String zone);
 
    /**
-    * Provides synchronous access to Router features.
+    * Provides access to Router features.
+    * @deprecated Please use {@link #getRouterApi(String)} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
-   Optional<? extends RouterApi> getRouterExtensionForZone(@EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+   Optional<? extends RouterApi> getRouterExtensionForZone(@EndpointParam(parser = ZoneToEndpoint.class) String zone);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApiMetadata.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApiMetadata.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApiMetadata.java
index 1c09c11..6327f1e 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApiMetadata.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/NeutronApiMetadata.java
@@ -17,8 +17,12 @@
 
 package org.jclouds.openstack.neutron.v2_0;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERVICE_TYPE;
+
+import java.net.URI;
+import java.util.Properties;
+
 import org.jclouds.apis.ApiMetadata;
 import org.jclouds.openstack.keystone.v2_0.config.AuthenticationApiModule;
 import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
@@ -28,11 +32,8 @@ import org.jclouds.openstack.neutron.v2_0.config.NeutronHttpApiModule;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
-import java.net.URI;
-import java.util.Properties;
-
-import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
-import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERVICE_TYPE;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
 
 /**
  * Implementation of {@link org.jclouds.apis.ApiMetadata} for Neutron 2.0 API

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/config/NeutronHttpApiModule.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/config/NeutronHttpApiModule.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/config/NeutronHttpApiModule.java
index 521453a..fe3d74c 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/config/NeutronHttpApiModule.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/config/NeutronHttpApiModule.java
@@ -16,12 +16,11 @@
  */
 package org.jclouds.openstack.neutron.v2_0.config;
 
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Multimap;
-import com.google.inject.Provides;
+import java.net.URI;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import javax.inject.Provider;
+import javax.inject.Singleton;
 import org.jclouds.http.HttpErrorHandler;
 import org.jclouds.http.annotation.ClientError;
 import org.jclouds.http.annotation.Redirection;
@@ -35,27 +34,26 @@ import org.jclouds.openstack.v2_0.functions.PresentWhenExtensionAnnotationNamesp
 import org.jclouds.rest.ConfiguresHttpApi;
 import org.jclouds.rest.config.HttpApiModule;
 import org.jclouds.rest.functions.ImplicitOptionalConverter;
-
-import javax.inject.Provider;
-import javax.inject.Singleton;
-import java.net.URI;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Multimap;
+import com.google.inject.Provides;
 
 /**
  * Configures the Neutron connection.
  */
-@Deprecated
 @ConfiguresHttpApi
 public class NeutronHttpApiModule extends HttpApiModule<NeutronApi> {
-
+   
    @Override
    protected void configure() {
       bind(DateAdapter.class).to(Iso8601DateAdapter.class);
       bind(ImplicitOptionalConverter.class).to(PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.class);
       super.configure();
    }
-
+   
    @Provides
    @Singleton
    public Multimap<URI, URI> aliases() {
@@ -74,7 +72,7 @@ public class NeutronHttpApiModule extends HttpApiModule<NeutronApi> {
                }
             });
    }
-
+   
    @Override
    protected void bindErrorHandlers() {
       bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(NeutronErrorHandler.class);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/AllocationPool.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/AllocationPool.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/AllocationPool.java
index f81192e..6e1ff7f 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/AllocationPool.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/AllocationPool.java
@@ -17,11 +17,11 @@
 
 package org.jclouds.openstack.neutron.v2_0.domain;
 
+import java.beans.ConstructorProperties;
+
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 
-import java.beans.ConstructorProperties;
-
 /**
  * A Neutron Subnet Allocation Pool
  *

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/HostRoute.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/HostRoute.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/HostRoute.java
index c5dcb56..42c2a40 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/HostRoute.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/HostRoute.java
@@ -17,11 +17,11 @@
 
 package org.jclouds.openstack.neutron.v2_0.domain;
 
+import java.beans.ConstructorProperties;
+
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 
-import java.beans.ConstructorProperties;
-
 /**
  * A Neutron Subnet Host Route
  *

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/ReferenceWithName.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/ReferenceWithName.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/ReferenceWithName.java
index 28db0be..f5fe4d5 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/ReferenceWithName.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/ReferenceWithName.java
@@ -17,8 +17,8 @@
 
 package org.jclouds.openstack.neutron.v2_0.domain;
 
-import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Objects;
 import com.google.common.base.Strings;
 
 import java.beans.ConstructorProperties;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/Subnet.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/Subnet.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/Subnet.java
index 9faf8bd..d8be96c 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/Subnet.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/domain/Subnet.java
@@ -17,8 +17,8 @@
 
 package org.jclouds.openstack.neutron.v2_0.domain;
 
-import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableSet;
 
 import java.beans.ConstructorProperties;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApi.java
index b740271..dca4427 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApi.java
@@ -17,9 +17,20 @@
 
 package org.jclouds.openstack.neutron.v2_0.extensions;
 
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
 import org.jclouds.Fallbacks;
 import org.jclouds.collect.PagedIterable;
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.neutron.v2_0.domain.ReferenceWithName;
 import org.jclouds.openstack.neutron.v2_0.domain.Router;
@@ -39,27 +50,14 @@ import org.jclouds.rest.annotations.ResponseParser;
 import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.Transform;
 
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.MediaType;
-
-import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
-
 /**
- * Provides synchronous access to Router operations on the OpenStack Neutron API.
+ * Provides access to Router operations for the OpenStack Networking (Neutron) v2 API.
  * <p/>
  * A logical entity for forwarding packets across internal subnets and NATting them on external
  * networks through an appropriate external gateway.
  *
- * @see <a href=
- *      "http://docs.openstack.org/api/openstack-network/2.0/content/router_ext.html">api doc</a>
- * @deprecated Use v2 instead of v2_0
+ * @deprecated Please use {@link org.jclouds.openstack.neutron.v2.extensions.RouterApi} as this
+ *             interface will be removed in jclouds 3.0.
  */
 @Deprecated
 @Path("/v2.0/routers")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApi.java
index f11fe7c..c2b4aa5 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApi.java
@@ -52,7 +52,7 @@ import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
 import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 
 /**
- * Provides synchronous access to Network operations on the openstack Neutron API.
+ * Provides access to Network operations for the OpenStack Networking (Neutron) v2 API.
  * <p/>
  * Each tenant can define one or more networks. A network is a virtual isolated layer-2 broadcast domain reserved to the
  * tenant. A tenant can create several ports for a network, and plug virtual interfaces into these ports.

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/PortApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/PortApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/PortApi.java
index 0b6b8a6..7390131 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/PortApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/PortApi.java
@@ -54,7 +54,7 @@ import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
 import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 
 /**
- * Provides synchronous access to Port operations on the openstack Neutron API.
+ * Provides access to Port operations for the OpenStack Networking (Neutron) v2 API.
  * <p/>
  * A port represents a virtual switch port on a logical network switch where all the interfaces attached to a given network are connected.
  * <p/>

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApi.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApi.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApi.java
index 27dcddb..5c2acc5 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApi.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApi.java
@@ -53,7 +53,7 @@ import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
 import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 
 /**
- * Provides synchronous access to Subnet operations on the Openstack Neutron API.
+ * Provides access to Subnet operations for the OpenStack Networking (Neutron) v2 API.
  *
 
  * @see <a href=

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworkDetails.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworkDetails.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworkDetails.java
index d0a43d4..421bf71 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworkDetails.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworkDetails.java
@@ -16,28 +16,32 @@
  */
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
 import org.jclouds.json.Json;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.neutron.v2_0.NeutronApi;
 import org.jclouds.openstack.neutron.v2_0.domain.Network;
 import org.jclouds.openstack.neutron.v2_0.features.NetworkApi;
 import org.jclouds.openstack.neutron.v2_0.functions.ParseNetworkDetails.Networks;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParseNetworkDetails extends ParseJson<Networks> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworks.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworks.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworks.java
index 9a22848..a1c1448 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworks.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseNetworks.java
@@ -16,28 +16,32 @@
  */
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
 import org.jclouds.json.Json;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.neutron.v2_0.NeutronApi;
 import org.jclouds.openstack.neutron.v2_0.domain.ReferenceWithName;
 import org.jclouds.openstack.neutron.v2_0.features.NetworkApi;
 import org.jclouds.openstack.neutron.v2_0.functions.ParseNetworks.Networks;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParseNetworks extends ParseJson<Networks> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePortDetails.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePortDetails.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePortDetails.java
index 3a0359b..a4e461e 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePortDetails.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePortDetails.java
@@ -16,29 +16,33 @@
  */
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
 import org.jclouds.json.Json;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.neutron.v2_0.NeutronApi;
 import org.jclouds.openstack.neutron.v2_0.domain.Port;
 import org.jclouds.openstack.neutron.v2_0.domain.ReferenceWithName;
 import org.jclouds.openstack.neutron.v2_0.features.PortApi;
 import org.jclouds.openstack.neutron.v2_0.functions.ParsePortDetails.Ports;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParsePortDetails extends ParseJson<Ports> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePorts.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePorts.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePorts.java
index 73ae114..1a11231 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePorts.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParsePorts.java
@@ -16,28 +16,32 @@
  */
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
 import org.jclouds.json.Json;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.neutron.v2_0.NeutronApi;
 import org.jclouds.openstack.neutron.v2_0.domain.ReferenceWithName;
 import org.jclouds.openstack.neutron.v2_0.features.PortApi;
 import org.jclouds.openstack.neutron.v2_0.functions.ParsePorts.Ports;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParsePorts extends ParseJson<Ports> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouterDetails.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouterDetails.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouterDetails.java
index 88fbf2e..537cc97 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouterDetails.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouterDetails.java
@@ -17,10 +17,14 @@
 
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.openstack.v2_0.options.PaginationOptions.Builder.marker;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
@@ -32,13 +36,13 @@ import org.jclouds.openstack.neutron.v2_0.functions.ParseRouterDetails.Routers;
 import org.jclouds.openstack.v2_0.domain.Link;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.openstack.v2_0.options.PaginationOptions.Builder.marker;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParseRouterDetails extends ParseJson<Routers> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouters.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouters.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouters.java
index a9842ab..eb612f4 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouters.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseRouters.java
@@ -17,10 +17,14 @@
 
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.openstack.v2_0.options.PaginationOptions.Builder.marker;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
@@ -32,13 +36,13 @@ import org.jclouds.openstack.neutron.v2_0.functions.ParseRouters.Routers;
 import org.jclouds.openstack.v2_0.domain.Link;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.jclouds.openstack.v2_0.options.PaginationOptions.Builder.marker;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParseRouters extends ParseJson<Routers> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnetDetails.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnetDetails.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnetDetails.java
index 0f63aec..17201f2 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnetDetails.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnetDetails.java
@@ -16,28 +16,32 @@
  */
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
 import org.jclouds.json.Json;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.neutron.v2_0.NeutronApi;
 import org.jclouds.openstack.neutron.v2_0.domain.Subnet;
 import org.jclouds.openstack.neutron.v2_0.features.SubnetApi;
 import org.jclouds.openstack.neutron.v2_0.functions.ParseSubnetDetails.Subnets;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParseSubnetDetails extends ParseJson<Subnets> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnets.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnets.java b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnets.java
index 4191d8b..bc7ef13 100644
--- a/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnets.java
+++ b/openstack-neutron/src/main/java/org/jclouds/openstack/neutron/v2_0/functions/ParseSubnets.java
@@ -16,28 +16,32 @@
  */
 package org.jclouds.openstack.neutron.v2_0.functions;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.inject.TypeLiteral;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
 import org.jclouds.collect.IterableWithMarker;
 import org.jclouds.collect.internal.Arg0ToPagedIterable;
 import org.jclouds.http.functions.ParseJson;
 import org.jclouds.json.Json;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.neutron.v2_0.NeutronApi;
 import org.jclouds.openstack.neutron.v2_0.domain.ReferenceWithName;
 import org.jclouds.openstack.neutron.v2_0.features.SubnetApi;
 import org.jclouds.openstack.neutron.v2_0.functions.ParseSubnets.Subnets;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import java.beans.ConstructorProperties;
-
-import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.inject.TypeLiteral;
 
+/**
+ */
 @Beta
 @Singleton
 public class ParseSubnets extends ParseJson<Subnets> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadataTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadataTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadataTest.java
index 5a06b96..f38136a 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadataTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/NeutronApiMetadataTest.java
@@ -1,20 +1,18 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2;
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiLiveTest.java
new file mode 100644
index 0000000..a3d5f3d
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiLiveTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.domain.FloatingIP;
+import org.jclouds.openstack.neutron.v2.domain.IP;
+import org.jclouds.openstack.neutron.v2.domain.Network;
+import org.jclouds.openstack.neutron.v2.domain.NetworkType;
+import org.jclouds.openstack.neutron.v2.domain.Subnet;
+import org.jclouds.openstack.neutron.v2.features.NetworkApi;
+import org.jclouds.openstack.neutron.v2.features.SubnetApi;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests parsing and Guice wiring of RouterApi
+ */
+@Test(groups = "live", testName = "FloatingIPApiLiveTest")
+public class FloatingIPApiLiveTest extends BaseNeutronApiLiveTest {
+
+   public void testCreateUpdateAndDeleteFloatingIP() {
+      for (String region : api.getConfiguredRegions()) {
+
+         SubnetApi subnetApi = api.getSubnetApi(region);
+         FloatingIPApi floatingIPApi = api.getFloatingIPApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+
+         FloatingIP floatingIPGet = null;
+         String ipv4SubnetId = null;
+         Network network = null;
+
+         try {
+            network = networkApi.create(
+                  Network.createBuilder("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+            assertNotNull(network);
+
+            ipv4SubnetId = subnetApi.create(Subnet.createBuilder(network.getId(), "198.51.100.0/24").ipVersion(4)
+                  .name("JClouds-Live-IPv4-Subnet").build()).getId();
+
+            floatingIPApi.create(FloatingIP.createBuilder(network.getId()).build());
+
+            /* List and Get test */
+            Set<FloatingIP> floatingIPs = floatingIPApi.list().concat().toSet();
+            FloatingIP floatingIPList = floatingIPs.iterator().next();
+            floatingIPGet = floatingIPApi.get(floatingIPList.getId());
+
+            assertNotNull(floatingIPGet);
+            assertEquals(floatingIPGet, floatingIPList);
+         }
+         finally {
+            try {
+               assertTrue(floatingIPApi.delete(floatingIPGet.getId()));
+            }
+            finally {
+               try {
+                  assertTrue(subnetApi.delete(ipv4SubnetId));
+               }
+               finally {
+                  assertTrue(networkApi.delete(network.getId()));
+               }
+            }
+         }
+      }
+   }
+
+   public Set<IP> getFixedAddresses(String subnetId) {
+      return ImmutableSet.of(IP.builder().subnetId(subnetId).build());
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiMockTest.java
new file mode 100644
index 0000000..c28b1c8
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/FloatingIPApiMockTest.java
@@ -0,0 +1,436 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIP;
+import org.jclouds.openstack.neutron.v2.domain.FloatingIPs;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests Floating Api Guice wiring and parsing
+ *
+ */
+@Test
+public class FloatingIPApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testCreateFloatingIP() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/floatingip_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP.CreateFloatingIP createFip = FloatingIP.createBuilder("376da547-b977-4cfe-9cba-275c80debf57")
+               .portId("ce705c24-c1ef-408a-bda3-7bbd946164ab")
+               .build();
+
+         FloatingIP floatingIP = api.create(createFip);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/floatingips", "/floatingip_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIP);
+         assertEquals(floatingIP.getRouterId(), "d23abc8d-2991-4a55-ba98-2aaea84cc72f");
+         assertEquals(floatingIP.getTenantId(), "4969c491a3c74ee4af974e6d800c62de");
+         assertEquals(floatingIP.getFloatingNetworkId(), "376da547-b977-4cfe-9cba-275c80debf57");
+         assertEquals(floatingIP.getFixedIpAddress(), "10.0.0.3");
+         assertEquals(floatingIP.getFloatingIpAddress(), "172.24.4.228");
+         assertEquals(floatingIP.getPortId(), "ce705c24-c1ef-408a-bda3-7bbd946164ab");
+         assertEquals(floatingIP.getId(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateFloatingIPFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP.CreateFloatingIP createFip = FloatingIP.createBuilder("376da547-b977-4cfe-9cba-275c80debf57")
+               .portId("ce705c24-c1ef-408a-bda3-7bbd946164ab")
+               .build();
+
+         FloatingIP floatingIP = api.create(createFip);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageFloatingIP() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/floatingip_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIPs floatingIPs = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIPs);
+         assertEquals(floatingIPs.size(), 2);
+         assertEquals(floatingIPs.first().get().getId(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7");
+         assertEquals(floatingIPs.get(1).getId(), "61cea855-49cb-4846-997d-801b70c71bdd");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageFloatingIPFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIPs floatingIPs = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIPs);
+         assertTrue(floatingIPs.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedFloatingIP() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/floatingip_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/floatingip_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<FloatingIP> floatingIPs = api.list().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIPs);
+         assertEquals(floatingIPs.size(), 4);
+         assertEquals(floatingIPs.get(0).getId(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7");
+         assertEquals(floatingIPs.get(3).getId(), "61cea855-49cb-4846-997d-801b70c71bdd2");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedFloatingIPFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<FloatingIP> floatingIPs = api.list().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIPs);
+         assertTrue(floatingIPs.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetFloatingIP() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/floatingip_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP floatingIP = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIP);
+         assertEquals(floatingIP.getId(), "2f245a7b-796b-4f26-9cf9-9e82d248fda7");
+         assertEquals(floatingIP.getPortId(), "ce705c24-c1ef-408a-bda3-7bbd946164ab");
+         assertEquals(floatingIP.getFloatingIpAddress(), "172.24.4.228");
+         assertEquals(floatingIP.getFixedIpAddress(), "10.0.0.3");
+         assertEquals(floatingIP.getFloatingNetworkId(), "376da547-b977-4cfe-9cba-275c80debf57");
+         assertEquals(floatingIP.getRouterId(), "d23abc8d-2991-4a55-ba98-2aaea84cc72f");
+         assertEquals(floatingIP.getTenantId(), "4969c491a3c74ee4af974e6d800c62de");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetFloatingIPFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP floatingIP = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/floatingips/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(floatingIP);
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateFloatingIP() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/floatingip_update_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP.UpdateFloatingIP updateFloatingIP = FloatingIP.updateBuilder()
+               .portId("fc861431-0e6c-4842-a0ed-e2363f9bc3a8")
+               .build();
+
+         FloatingIP floatingIP = api.update("12345", updateFloatingIP);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/floatingips/12345", "/floatingip_update_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIP);
+         assertEquals(floatingIP.getPortId(), "fc861431-0e6c-4842-a0ed-e2363f9bc3a8");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateFloatingIPDissociate() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/floatingip_update_dissociate_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP.UpdateFloatingIP updateFloatingIP = FloatingIP.updateBuilder().build();
+
+         FloatingIP floatingIP = api.update("12345", updateFloatingIP);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/floatingips/12345", "/floatingip_update_dissociate_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(floatingIP);
+         assertNull(floatingIP.getPortId());
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateFloatingIPFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         FloatingIP.UpdateFloatingIP updateFloatingIP = FloatingIP.updateBuilder()
+               .portId("fc861431-0e6c-4842-a0ed-e2363f9bc3a8")
+               .build();
+
+         FloatingIP floatingIP = api.update("12345", updateFloatingIP);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/floatingips/12345", "/floatingip_update_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(floatingIP);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteFloatingIP() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         boolean result = api.delete("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/floatingips/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteFloatingIPFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         FloatingIPApi api = neutronApi.getFloatingIPApi("RegionOne").get();
+
+         boolean result = api.delete("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/floatingips/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java
new file mode 100644
index 0000000..2a006e8
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiLiveTest.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
+import org.jclouds.openstack.neutron.v2.domain.Network;
+import org.jclouds.openstack.neutron.v2.domain.NetworkType;
+import org.jclouds.openstack.neutron.v2.domain.Port;
+import org.jclouds.openstack.neutron.v2.domain.Router;
+import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
+import org.jclouds.openstack.neutron.v2.domain.Subnet;
+import org.jclouds.openstack.neutron.v2.features.NetworkApi;
+import org.jclouds.openstack.neutron.v2.features.PortApi;
+import org.jclouds.openstack.neutron.v2.features.SubnetApi;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.testng.annotations.Test;
+
+/**
+ * Tests parsing and Guice wiring of RouterApi
+ */
+@Test(groups = "live", testName = "RouterApiLiveTest")
+public class RouterApiLiveTest extends BaseNeutronApiLiveTest {
+
+   public void testCreateUpdateAndDeleteRouter() {
+      for (String region : api.getConfiguredRegions()) {
+         RouterApi routerApi = api.getRouterApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+         SubnetApi subnetApi = api.getSubnetApi(region);
+
+         Network network = networkApi.create(
+               Network.createBuilder("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network);
+
+         Subnet subnet = subnetApi.create(Subnet.createBuilder(network.getId(), "192.168.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet);
+
+         Router router = routerApi.create(Router.createBuilder().name("jclouds-router-test")
+            .externalGatewayInfo(ExternalGatewayInfo.builder().networkId(network.getId()).build()).build());
+         assertNotNull(router);
+
+         /* List and Get test */
+         Set<Router> routers = api.getRouterApi(region).get().list().concat().toSet();
+         Router routerList = routers.iterator().next();
+         Router routerGet = api.getRouterApi(region).get().get(routerList.getId());
+
+         assertNotNull(routerGet);
+         assertEquals(routerGet, routerList);
+         /***/
+
+         routerGet = routerApi.get(router.getId());
+
+         assertEquals(routerGet.getName(), router.getName());
+         assertEquals(routerGet.getId(), router.getId());
+         assertEquals(routerGet.getExternalGatewayInfo(), router.getExternalGatewayInfo());
+
+         Router routerUpdate = routerApi.update(router.getId(), Router.updateBuilder().name("jclouds-router-test-rename").build());
+         assertNotNull(routerUpdate);
+         assertEquals(routerUpdate.getName(), "jclouds-router-test-rename");
+
+         routerGet = routerApi.get(router.getId());
+
+         assertEquals(routerGet.getId(), router.getId());
+         assertEquals(routerGet.getName(), "jclouds-router-test-rename");
+
+         assertTrue(routerApi.delete(router.getId()));
+         assertTrue(subnetApi.delete(subnet.getId()));
+         assertTrue(networkApi.delete(network.getId()));
+      }
+   }
+
+   public void testCreateAndDeleteRouterInterfaceForSubnet() {
+      for (String region : api.getConfiguredRegions()) {
+         RouterApi routerApi = api.getRouterApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+         SubnetApi subnetApi = api.getSubnetApi(region);
+
+         Network network = networkApi.create(Network.createBuilder("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network);
+
+         Subnet subnet = subnetApi.create(Subnet.createBuilder(network.getId(), "192.168.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet);
+
+         Network network2 = networkApi.create(Network.createBuilder("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network2);
+
+         Subnet subnet2 = subnetApi.create(Subnet.createBuilder(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet2);
+
+         Router router = routerApi.create(Router.createBuilder().name("jclouds-router-test").build());
+         assertNotNull(router);
+
+         RouterInterface routerInterface = routerApi.addInterfaceForSubnet(router.getId(), subnet.getId());
+         assertNotNull(routerInterface);
+
+         RouterInterface routerInterface2 = routerApi.addInterfaceForSubnet(router.getId(), subnet2.getId());
+         assertNotNull(routerInterface2);
+
+         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet.getId()));
+         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet2.getId()));
+         assertTrue(routerApi.delete(router.getId()));
+         assertTrue(subnetApi.delete(subnet.getId()));
+         assertTrue(networkApi.delete(network.getId()));
+         assertTrue(subnetApi.delete(subnet2.getId()));
+         assertTrue(networkApi.delete(network2.getId()));
+      }
+   }
+
+   public void testCreateAndDeleteRouterInterfaceForPort() {
+      for (String region : api.getConfiguredRegions()) {
+         RouterApi routerApi = api.getRouterApi(region).get();
+         NetworkApi networkApi = api.getNetworkApi(region);
+         SubnetApi subnetApi = api.getSubnetApi(region);
+         PortApi portApi = api.getPortApi(region);
+
+         Network network = networkApi.create(Network.createBuilder("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network);
+
+         Subnet subnet = subnetApi.create(Subnet.createBuilder(network.getId(), "192.168.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet);
+
+         Network network2 = networkApi.create(Network.createBuilder("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
+         assertNotNull(network2);
+
+         Subnet subnet2 = subnetApi.create(Subnet.createBuilder(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
+         assertNotNull(subnet2);
+
+         Port port = portApi.create(Port.createBuilder(network.getId()).build());
+         assertNotNull(port);
+
+         Port port2 = portApi.create(Port.createBuilder(network2.getId()).build());
+         assertNotNull(port2);
+
+         Router router = routerApi.create(Router.createBuilder().name("jclouds-router-test").build());
+         assertNotNull(router);
+
+         RouterInterface routerInterface = routerApi.addInterfaceForPort(router.getId(), port.getId());
+         assertNotNull(routerInterface);
+
+         RouterInterface routerInterface2 = routerApi.addInterfaceForPort(router.getId(), port2.getId());
+         assertNotNull(routerInterface2);
+
+         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port.getId()));
+         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port2.getId()));
+         assertTrue(routerApi.delete(router.getId()));
+         assertTrue(subnetApi.delete(subnet.getId()));
+         assertTrue(networkApi.delete(network.getId()));
+         assertTrue(subnetApi.delete(subnet2.getId()));
+         assertTrue(networkApi.delete(network2.getId()));
+      }
+   }
+
+}


[3/6] Backports all neutron changes from master for 1.8.1

Posted by za...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java
new file mode 100644
index 0000000..346e820
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/RouterApiMockTest.java
@@ -0,0 +1,631 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
+import org.jclouds.openstack.neutron.v2.domain.NetworkStatus;
+import org.jclouds.openstack.neutron.v2.domain.Router;
+import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
+import org.jclouds.openstack.neutron.v2.domain.Routers;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests NetworkApi Guice wiring and parsing
+ *
+ */
+@Test
+public class RouterApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testCreateRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.CreateRouter createRouter = Router.createBuilder().name("another_router").adminStateUp(true)
+               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.create(createRouter);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/routers", "/router_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(router);
+         assertEquals(router.getName(), "another_router");
+         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "8ca37218-28ff-41cb-9b10-039601ea7e6b");
+         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
+         assertEquals(router.isAdminStateUp().booleanValue(), true);
+         assertEquals(router.getId(), "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e");
+         assertEquals(router.getTenantId(), "6b96ff0cb17a4b859e1e575d221683d3");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.CreateRouter createRouter = Router.createBuilder().name("another_router").adminStateUp(true)
+               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         api.create(createRouter);
+         fail("Should have failed with not found exception");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Routers routers = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertEquals(routers.size(), 2);
+         assertEquals(routers.first().get().getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Routers routers = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertTrue(routers.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Router> routers = api.list().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertEquals(routers.size(), 4);
+         assertEquals(routers.get(0).getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
+         assertEquals(routers.get(3).getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d_4");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Router> routers = api.list().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routers);
+         assertTrue(routers.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router router = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(router);
+         assertEquals(router.getName(), "router1");
+         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8");
+         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
+         assertEquals(router.isAdminStateUp().booleanValue(), true);
+         assertEquals(router.getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
+         assertEquals(router.getTenantId(), "33a40233088643acb66ff6eb0ebea679");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router router = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(router);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_update_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.UpdateRouter updateRouter = Router.updateBuilder()
+               .externalGatewayInfo(
+                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.update("12345", updateRouter);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345", "/router_update_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(router);
+         assertEquals(router.getName(), "another_router");
+         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "8ca37218-28ff-41cb-9b10-039601ea7e6b");
+         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
+         assertEquals(router.isAdminStateUp().booleanValue(), true);
+         assertEquals(router.getId(), "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e");
+         assertEquals(router.getTenantId(), "6b96ff0cb17a4b859e1e575d221683d3");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testUpdateRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         Router.UpdateRouter updateRouter = Router.updateBuilder()
+               .externalGatewayInfo(
+                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
+               .build();
+
+         Router router = api.update("12345", updateRouter);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345", "/router_update_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(router);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteRouter() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.delete("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteRouterFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.delete("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/routers/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForSubnet() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_add_interface_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routerInterface);
+         assertEquals(routerInterface.getSubnetId(), "a2f1f29d-571b-4533-907f-5803ab96ead1");
+         assertEquals(routerInterface.getPortId(), "3a44f4e5-1694-493a-a1fb-393881c673a4");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForSubnetFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(routerInterface);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForPort() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_add_interface_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routerInterface);
+         assertEquals(routerInterface.getSubnetId(), "a2f1f29d-571b-4533-907f-5803ab96ead1");
+         assertEquals(routerInterface.getPortId(), "3a44f4e5-1694-493a-a1fb-393881c673a4");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testAddRouterInterfaceForPortFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         RouterInterface routerInterface = api.addInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertNull(routerInterface);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForSubnet() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_subnet_request.json");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForSubnetFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_subnet_request.json");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForPort() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveRouterInterfaceForPortFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         RouterApi api = neutronApi.getRouterApi("RegionOne").get();
+
+         boolean result = api.removeInterfaceForPort("12345", "portid");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_port_request.json");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java
new file mode 100644
index 0000000..a7ef1a6
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiLiveTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.domain.RuleDirection;
+import org.jclouds.openstack.neutron.v2.domain.RuleEthertype;
+import org.jclouds.openstack.neutron.v2.domain.RuleProtocol;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.testng.annotations.Test;
+
+/**
+ * Tests parsing and Guice wiring of RouterApi
+ */
+@Test(groups = "live", testName = "SecurityGroupApiLiveTest")
+public class SecurityGroupApiLiveTest extends BaseNeutronApiLiveTest {
+
+   /**
+    * Smoke test for the Security Group extension for Neutron
+    */
+   public void testCreateUpdateAndDeleteSecurityGroup() {
+      for (String region : api.getConfiguredRegions()) {
+         SecurityGroupApi sgApi = null;
+         Rule rule = null;
+         SecurityGroup securityGroup = null;
+
+         try {
+            sgApi = api.getSecurityGroupApi(region).get();
+
+            securityGroup = sgApi.create(
+                  SecurityGroup.createBuilder().name("jclouds-test").description("jclouds test security group")
+                        .build());
+            assertNotNull(securityGroup);
+
+            rule = sgApi.create(
+                  Rule.createBuilder(RuleDirection.EGRESS, securityGroup.getId())
+                        .ethertype(RuleEthertype.IPV6)
+                        .portRangeMax(90)
+                        .portRangeMin(80)
+                        .protocol(RuleProtocol.TCP)
+                        .build());
+
+            assertNotNull(rule);
+
+            // Refresh
+            securityGroup = sgApi.getSecurityGroup(securityGroup.getId());
+
+            assertEquals(securityGroup.getName(), "jclouds-test");
+            assertEquals(securityGroup.getDescription(), "jclouds test security group");
+
+            assertEquals(securityGroup.getRules().size(), 3);
+
+            Rule newSecGroupRule = null;
+
+            for (Rule sgr : securityGroup.getRules()) {
+               if (sgr.getId().equals(rule.getId())) {
+                  newSecGroupRule = sgr;
+                  break;
+               }
+            }
+            assertNotNull(newSecGroupRule, "Did not find the new rule in the group.");
+
+            assertEquals(rule, newSecGroupRule);
+
+            assertEquals(rule.getEthertype(), RuleEthertype.IPV6);
+            assertEquals(rule.getProtocol(), RuleProtocol.TCP);
+            assertEquals(rule.getPortRangeMax().intValue(), 90);
+            assertEquals(rule.getPortRangeMin().intValue(), 80);
+            assertEquals(rule.getDirection(), RuleDirection.EGRESS);
+         } finally {
+            try {
+               assertTrue(sgApi.deleteRule(rule.getId()));
+            } finally {
+               assertTrue(sgApi.deleteSecurityGroup(securityGroup.getId()));
+            }
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java
new file mode 100644
index 0000000..dfe6a80
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/extensions/SecurityGroupApiMockTest.java
@@ -0,0 +1,659 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.extensions;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.List;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.domain.Rule;
+import org.jclouds.openstack.neutron.v2.domain.RuleDirection;
+import org.jclouds.openstack.neutron.v2.domain.RuleEthertype;
+import org.jclouds.openstack.neutron.v2.domain.RuleProtocol;
+import org.jclouds.openstack.neutron.v2.domain.Rules;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroup;
+import org.jclouds.openstack.neutron.v2.domain.SecurityGroups;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests NetworkApi Guice wiring and parsing
+ *
+ */
+@Test
+public class SecurityGroupApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testCreateSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup.CreateSecurityGroup createSecurityGroup = SecurityGroup.createBuilder().name("new-webservers")
+               .description("security group for webservers")
+               .build();
+
+         SecurityGroup securityGroup = api.create(createSecurityGroup);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/security-groups", "/security_group_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroup);
+         assertEquals(securityGroup.getId(), "2076db17-a522-4506-91de-c6dd8e837028");
+         assertEquals(securityGroup.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         assertEquals(securityGroup.getName(), "new-webservers");
+         assertEquals(securityGroup.getDescription(), "security group for webservers");
+
+         Rule sgr0 = securityGroup.getRules().get(0);
+         Rule sgr1 = securityGroup.getRules().get(1);
+
+         assertEquals(sgr0.getId(), "38ce2d8e-e8f1-48bd-83c2-d33cb9f50c3d");
+         assertEquals(sgr1.getId(), "565b9502-12de-4ffd-91e9-68885cff6ae1");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup.CreateSecurityGroup createSecurityGroup = SecurityGroup.createBuilder().name("new-webservers")
+               .description("security group for webservers")
+               .build();
+
+         SecurityGroup securityGroup = api.create(createSecurityGroup);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testCreateSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_rule_create_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule.CreateRule createSecurityGroupRule = Rule.createBuilder(
+               RuleDirection.INGRESS, "a7734e61-b545-452d-a3cd-0189cbd9747a")
+               .portRangeMin(80)
+               .portRangeMax(80)
+               .ethertype(RuleEthertype.IPV4)
+               .protocol(RuleProtocol.TCP)
+               .remoteGroupId("85cc3048-abc3-43cc-89b3-377341426ac5")
+               .build();
+
+         Rule rule = api.create(createSecurityGroupRule);
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "POST", "/v2.0/security-group-rules", "/security_group_rule_create_request.json");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rule);
+         assertEquals(rule.getId(), "2bc0accf-312e-429a-956e-e4407625eb62");
+         assertEquals(rule.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         assertEquals(rule.getDirection(), RuleDirection.INGRESS);
+         assertEquals(rule.getPortRangeMax().intValue(), 80);
+         assertEquals(rule.getPortRangeMin().intValue(), 80);
+         assertEquals(rule.getEthertype(), RuleEthertype.IPV4);
+         assertEquals(rule.getProtocol(), RuleProtocol.TCP);
+         assertEquals(rule.getRemoteGroupId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(rule.getSecurityGroupId(), "a7734e61-b545-452d-a3cd-0189cbd9747a");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testCreateSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule.CreateRule createSecurityGroupRule = Rule.createBuilder(
+               RuleDirection.INGRESS, "a7734e61-b545-452d-a3cd-0189cbd9747a")
+               .portRangeMin(80)
+               .portRangeMax(80)
+               .ethertype(RuleEthertype.IPV4)
+               .protocol(RuleProtocol.TCP)
+               .remoteGroupId("85cc3048-abc3-43cc-89b3-377341426ac5")
+               .build();
+
+         Rule rule = api.create(createSecurityGroupRule);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroups securityGroups = api.listSecurityGroups(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertEquals(securityGroups.size(), 2);
+         // Ensures the full collection is parsed and ordering is preserved.
+         assertEquals(securityGroups.first().get().getId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(securityGroups.get(1).getId(), "85cc3048-abc3-43cc-89b3-377341426ac52");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroups securityGroups = api.listSecurityGroups(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertTrue(securityGroups.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_rule_list_response_paged1.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rules rules = api.listRules(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertEquals(rules.size(), 4);
+         // Ensures the full collection is parsed and ordering is preserved.
+         assertEquals(rules.first().get().getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+         assertEquals(rules.get(3).getId(), "f7d45c89-008e-4bab-88ad-d6811724c51c");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListSpecificPageSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rules rules = api.listRules(PaginationOptions.Builder.limit(2).marker("abcdefg"));
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules?limit=2&marker=abcdefg");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertTrue(rules.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroups() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<SecurityGroup> securityGroups = api.listSecurityGroups().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertEquals(securityGroups.size(), 4);
+         // Ensures ordering is preserved and both pages are parsed.
+         assertEquals(securityGroups.get(0).getId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(securityGroups.get(3).getId(), "85cc3048-abc3-43cc-89b3-377341426ac524");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroupsFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<SecurityGroup> securityGroups = api.listSecurityGroups().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroups);
+         assertTrue(securityGroups.isEmpty());
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroupRules() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_rule_list_response_paged1.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/security_group_rule_list_response_paged2.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Rule> rules = api.listRules().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 3);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules");
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertEquals(rules.size(), 8);
+         // Ensures both pages are tested and ordering is preserved.
+         assertEquals(rules.get(0).getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+         assertEquals(rules.get(7).getId(), "f7d45c89-008e-4bab-88ad-d6811724c51c2");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListPagedSecurityGroupRulesFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         // Note: Lazy! Have to actually look at the collection.
+         List<Rule> rules = api.listRules().concat().toList();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rules);
+         assertTrue(rules.isEmpty());
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup securityGroup = api.getSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(securityGroup);
+         assertEquals(securityGroup.getName(), "default");
+         assertEquals(securityGroup.getDescription(), "default");
+         assertEquals(securityGroup.getId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+         assertEquals(securityGroup.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         Rule sgr = securityGroup.getRules().get(0);
+         assertEquals(sgr.getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         SecurityGroup securityGroup = api.getSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(securityGroup);
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201).setBody(stringFromResource("/security_group_rule_get_response.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule rule = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertNotNull(rule);
+         assertEquals(rule.getDirection(), RuleDirection.EGRESS);
+         assertEquals(rule.getEthertype(), RuleEthertype.IPV6);
+         assertEquals(rule.getId(), "3c0e45ff-adaf-4124-b083-bf390e5482ff");
+         assertEquals(rule.getTenantId(), "e4f50856753b4dc6afee5fa6b9b6c550");
+         assertEquals(rule.getSecurityGroupId(), "85cc3048-abc3-43cc-89b3-377341426ac5");
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         Rule rule = api.get("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertNull(rule);
+
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroup() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroupFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteSecurityGroup("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-groups/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroupRule() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(201)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteRule("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertTrue(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDeleteSecurityGroupRuleFail() throws IOException, InterruptedException, URISyntaxException {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(
+            new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         SecurityGroupApi api = neutronApi.getSecurityGroupApi("RegionOne").get();
+
+         boolean result = api.deleteRule("12345");
+
+         /*
+          * Check request
+          */
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "DELETE", "/v2.0/security-group-rules/12345");
+
+         /*
+          * Check response
+          */
+         assertFalse(result);
+      } finally {
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java
new file mode 100644
index 0000000..6dd729a
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiLiveTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
+import org.jclouds.openstack.v2_0.domain.Extension;
+import org.jclouds.openstack.v2_0.features.ExtensionApi;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@link ExtensionApi}
+ */
+@Test(groups = "live", testName = "ExtensionApiLiveTest")
+public class ExtensionApiLiveTest extends BaseNeutronApiLiveTest {
+
+   /**
+    * Tests the listing of Neutron Extensions.
+    *
+    * @throws Exception
+    */
+   public void testListExtensions() throws Exception {
+      for (String regionId : api.getConfiguredRegions()) {
+         ExtensionApi extensionApi = api.getExtensionApi(regionId);
+         Set<Extension> response = extensionApi.list();
+         assertNotNull(response);
+         assertFalse(response.isEmpty());
+
+         for (Extension extension : response) {
+            assertNotNull(extension.getId());
+            assertNotNull(extension.getName());
+            assertNotNull(extension.getDescription());
+            assertNotNull(extension.getNamespace());
+            assertNotNull(extension.getUpdated());
+            assertNotNull(extension.getLinks());
+         }
+      }
+   }
+
+   /**
+    * Tests retrieval of Neutron Extensions by their alias.
+    *
+    * @throws Exception
+    */
+   public void testGetExtensionByAlias() throws Exception {
+      for (String regionId : api.getConfiguredRegions()) {
+         ExtensionApi extensionApi = api.getExtensionApi(regionId);
+         Set<Extension> response = extensionApi.list();
+         assertNotNull(response);
+
+         for (Extension extension : response) {
+            Extension details = extensionApi.get(extension.getId());
+            assertNotNull(details);
+            assertEquals(details.getId(), extension.getId());
+            assertEquals(details.getName(), extension.getName());
+            assertEquals(details.getDescription(), extension.getDescription());
+            assertEquals(details.getNamespace(), extension.getNamespace());
+            assertEquals(details.getUpdated(), extension.getUpdated());
+            assertEquals(details.getLinks(), extension.getLinks());
+         }
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java
new file mode 100644
index 0000000..b9615d6
--- /dev/null
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/ExtensionApiMockTest.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.neutron.v2.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
+import org.jclouds.openstack.v2_0.domain.Extension;
+import org.jclouds.openstack.v2_0.features.ExtensionApi;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests annotation parsing of {@code ExtensionApi}
+ */
+@Test(groups = "unit", testName = "ExtensionApiMockTest")
+public class ExtensionApiMockTest extends BaseNeutronApiMockTest {
+
+   public void testListExtensions() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse()
+         .setResponseCode(200).setBody(stringFromResource("/extension_list.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         ExtensionApi api = neutronApi.getExtensionApi("RegionOne");
+
+         Set<Extension> extensions = api.list();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertExtensions(server, "/v2.0");
+
+         /*
+          * Check response
+          */
+         assertNotNull(extensions);
+         assertEquals(extensions.size(), 17);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListExtensionsIsEmpty() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+         ExtensionApi api = neutronApi.getExtensionApi("RegionOne");
+
+         Set<Extension> extensions = api.list();
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/extensions");
+
+         /*
+          * Check response
+          */
+         assertTrue(extensions.isEmpty());
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetExtensionByAlias() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse()
+         .setResponseCode(200).setBody(stringFromResource("/extension_details.json"))));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+
+         Extension routerExtension = neutronApi.getExtensionApi("RegionOne").get("router");
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/extensions/router");
+
+         /*
+          * Check response
+          */
+         assertNotNull(routerExtension);
+         assertEquals(routerExtension.getName(), "Neutron L3 Router");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetExtensionByAliasFail() throws Exception {
+      MockWebServer server = mockOpenStackServer();
+      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
+      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
+
+      try {
+         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
+
+         Extension routerExtension = neutronApi.getExtensionApi("RegionOne").get("router");
+
+         /*
+          * Check request
+          */
+         assertEquals(server.getRequestCount(), 2);
+         assertAuthentication(server);
+         assertRequest(server.takeRequest(), "GET", "/v2.0/extensions/router");
+
+         /*
+          * Check response
+          */
+         assertNull(routerExtension);
+      } finally {
+         server.shutdown();
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
index ba5b9ee..1d4e3a0 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiLiveTest.java
@@ -40,8 +40,8 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
    public void testCreateUpdateAndDeleteNetwork() {
       for (String region : api.getConfiguredRegions()) {
          NetworkApi networkApi = api.getNetworkApi(region);
-         Network net = networkApi.create(Network.createOptions("jclouds-test").networkType(NetworkType.LOCAL).build());
-         Network test = networkApi.create(Network.createOptions("jclouds-test").build());
+         Network net = networkApi.create(Network.createBuilder("jclouds-test").networkType(NetworkType.LOCAL).build());
+         Network test = networkApi.create(Network.createBuilder("jclouds-test").build());
          assertNotNull(net);
 
          /* List and get tests */
@@ -57,7 +57,7 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(network.getName(), "jclouds-test");
          assertEquals(network.getNetworkType(), NetworkType.LOCAL);
          assertTrue(network.getSubnets().isEmpty());
-         assertNotNull(networkApi.update(net.getId(), Network.updateOptions().name("jclouds-live-test").build()));
+         assertNotNull(networkApi.update(net.getId(), Network.updateBuilder().name("jclouds-live-test").build()));
 
          network = networkApi.get(net.getId());
 
@@ -65,7 +65,7 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(network.getName(), "jclouds-live-test");
          assertTrue(network.getSubnets().isEmpty());
 
-         Network net2 = networkApi.create(Network.createOptions("jclouds-test2").networkType(NetworkType.LOCAL).build());
+         Network net2 = networkApi.create(Network.createBuilder("jclouds-test2").networkType(NetworkType.LOCAL).build());
          assertNotNull(net2);
 
          assertTrue(networkApi.delete(net.getId()));
@@ -79,9 +79,9 @@ public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {
          NetworkApi networkApi = api.getNetworkApi(region);
          Set<Network> nets = networkApi.createBulk(
                ImmutableList.of(
-                  Network.createOptions("jclouds-live-test-1").networkType(NetworkType.LOCAL).adminStateUp(true).build(),
-                  Network.createOptions("jclouds-live-test-2").networkType(NetworkType.LOCAL).adminStateUp(false).build(),
-                  Network.createOptions("jclouds-live-test-3").networkType(NetworkType.LOCAL).adminStateUp(false).build()
+                  Network.createBuilder("jclouds-live-test-1").networkType(NetworkType.LOCAL).adminStateUp(true).build(),
+                  Network.createBuilder("jclouds-live-test-2").networkType(NetworkType.LOCAL).adminStateUp(false).build(),
+                  Network.createBuilder("jclouds-live-test-3").networkType(NetworkType.LOCAL).adminStateUp(false).build()
                )
          ).toSet();
          Set<Network> existingNets = networkApi.list().concat().toSet();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
index 3ef3a85..641e276 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/NetworkApiMockTest.java
@@ -56,7 +56,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -92,7 +92,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -285,11 +285,11 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork1 = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork1 = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
-         Network.CreateOptions createNetwork2 = Network.createOptions("jclouds-wibble2")
+         Network.CreateNetwork createNetwork2 = Network.createBuilder("jclouds-wibble2")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -332,11 +332,11 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.CreateOptions createNetwork1 = Network.createOptions("jclouds-wibble")
+         Network.CreateNetwork createNetwork1 = Network.createBuilder("jclouds-wibble")
                .networkType(NetworkType.LOCAL)
                .build();
 
-         Network.CreateOptions createNetwork2 = Network.createOptions("jclouds-wibble2")
+         Network.CreateNetwork createNetwork2 = Network.createBuilder("jclouds-wibble2")
                .networkType(NetworkType.LOCAL)
                .build();
 
@@ -355,7 +355,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.UpdateOptions updateNetwork = Network.updateOptions()
+         Network.UpdateNetwork updateNetwork = Network.updateBuilder()
                .name("jclouds-wibble-updated")
                .networkType(NetworkType.LOCAL)
                .build();
@@ -388,7 +388,7 @@ public class NetworkApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          NetworkApi api = neutronApi.getNetworkApi("RegionOne");
 
-         Network.UpdateOptions updateNetwork = Network.updateOptions()
+         Network.UpdateNetwork updateNetwork = Network.updateBuilder()
                .name("jclouds-wibble-updated")
                .networkType(NetworkType.LOCAL)
                .build();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
index 8ca9f9a..bcde014 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiLiveTest.java
@@ -48,19 +48,19 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
          SubnetApi subnetApi = api.getSubnetApi(region);
          PortApi portApi = api.getPortApi(region);
          String networkId = networkApi.create(
-               Network.createOptions("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
-         String ipv4SubnetId = subnetApi.create(Subnet.createOptions(networkId, "198.51.100.0/24").ipVersion(4)
+               Network.createBuilder("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
+         String ipv4SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "198.51.100.0/24").ipVersion(4)
                .name("JClouds-Live-IPv4-Subnet").build()).getId();
-         String ipv6SubnetId = subnetApi.create(Subnet.createOptions(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
+         String ipv6SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
                .name("JClouds-Live-IPv6-Subnet").build()).getId();
 
          assertNotNull(networkId);
          assertNotNull(ipv4SubnetId);
          assertNotNull(ipv6SubnetId);
 
-         String ipv4PortId = portApi.create(Port.createOptions(networkId).name("JClouds-Live-IPv4-Port")
+         String ipv4PortId = portApi.create(Port.createBuilder(networkId).name("JClouds-Live-IPv4-Port")
                .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv4SubnetId))).build()).getId();
-         String ipv6PortId = portApi.create(Port.createOptions(networkId).name("JClouds-Live-IPv6-Port")
+         String ipv6PortId = portApi.create(Port.createBuilder(networkId).name("JClouds-Live-IPv6-Port")
                .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv6SubnetId))).build()).getId();
 
          /* List and get test */
@@ -83,7 +83,7 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(ipv6Port.getId(), ipv6PortId);
          assertEquals(ipv6Port.getName(), "JClouds-Live-IPv6-Port");
 
-         assertNotNull(portApi.update(ipv4PortId, Port.updateOptions().name("Updated").build()));
+         assertNotNull(portApi.update(ipv4PortId, Port.updateBuilder().name("Updated").build()));
          Port updatedIpv4Port = portApi.get(ipv4PortId);
          assertEquals(updatedIpv4Port.getName(), "Updated");
 
@@ -102,10 +102,10 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
          PortApi portApi = api.getPortApi(region);
 
          String networkId = networkApi.create(
-               Network.createOptions("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
-         String ipv4SubnetId = subnetApi.create(Subnet.createOptions(networkId, "198.51.100.0/24").ipVersion(4)
+               Network.createBuilder("JClouds-Live-Network").networkType(NetworkType.LOCAL).build()).getId();
+         String ipv4SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "198.51.100.0/24").ipVersion(4)
                .name("JClouds-Live-IPv4-Subnet").build()).getId();
-         String ipv6SubnetId = subnetApi.create(Subnet.createOptions(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
+         String ipv6SubnetId = subnetApi.create(Subnet.createBuilder(networkId, "a1ca:1e1:c:107d::/96").ipVersion(6)
                .name("JClouds-Live-IPv6-Subnet").build()).getId();
 
          assertNotNull(networkId);
@@ -114,13 +114,13 @@ public class PortApiLiveTest extends BaseNeutronApiLiveTest {
 
          Set<? extends Port> ports = portApi.createBulk(
                ImmutableList.of(
-                     Port.createOptions(networkId).name("JClouds-Live-IPv4-Subnet-1")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv4-Subnet-1")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv4SubnetId))).build(),
-                     Port.createOptions(networkId).name("JClouds-Live-IPv4-Subnet-2")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv4-Subnet-2")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv4SubnetId))).build(),
-                     Port.createOptions(networkId).name("JClouds-Live-IPv6-Subnet-1")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv6-Subnet-1")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv6SubnetId))).build(),
-                     Port.createOptions(networkId).name("JClouds-Live-IPv6-Subnet-2")
+                     Port.createBuilder(networkId).name("JClouds-Live-IPv6-Subnet-2")
                            .fixedIps(ImmutableSet.copyOf(getFixedAddresses(ipv6SubnetId))).build()
                )
          ).toSet();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
index d1d3c3b..a9a2dc4 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/PortApiMockTest.java
@@ -61,11 +61,11 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort = Port.createOptions("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
+         Port.CreatePort createPort = Port.createBuilder("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
                .name("port1")
                .adminStateUp(true)
                .deviceId("d6b4d3a5-c700-476f-b609-1493dd9dadc0")
-               .allowedAddressPairs(ImmutableSet.of(AddressPair.createOptions("12", "111.222.333.444").build()))
+               .allowedAddressPairs(ImmutableSet.of(AddressPair.builder("12", "111.222.333.444").build()))
                .build();
 
          Port port = api.create(createPort);
@@ -108,11 +108,11 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort = Port.createOptions("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
+         Port.CreatePort createPort = Port.createBuilder("6aeaf34a-c482-4bd3-9dc3-7faf36412f12")
                .name("port1")
                .adminStateUp(true)
                .deviceId("d6b4d3a5-c700-476f-b609-1493dd9dadc0")
-               .allowedAddressPairs(ImmutableSet.of(AddressPair.createOptions("12", "111.222.333.444").build()))
+               .allowedAddressPairs(ImmutableSet.of(AddressPair.builder("12", "111.222.333.444").build()))
                .build();
 
          Port port = api.create(createPort);
@@ -246,14 +246,14 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort1 = Port.createOptions("64239a54-dcc4-4b39-920b-b37c2144effa")
+         Port.CreatePort createPort1 = Port.createBuilder("64239a54-dcc4-4b39-920b-b37c2144effa")
                .name("port1")
                .adminStateUp(true)
                .deviceId("24df1d04-d5cb-41e1-8de5-61ed77c558df")
                .securityGroups(ImmutableSet.of("dbc107f4-afcd-4d5a-9352-f68f82241d5b"))
                .build();
 
-         Port.CreateOptions createPort2 = Port.createOptions("e6031bc2-901a-4c66-82da-f4c32ed89406")
+         Port.CreatePort createPort2 = Port.createBuilder("e6031bc2-901a-4c66-82da-f4c32ed89406")
                .name("port2")
                .adminStateUp(false)
                .securityGroups(
@@ -291,14 +291,14 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.CreateOptions createPort1 = Port.createOptions("64239a54-dcc4-4b39-920b-b37c2144effa")
+         Port.CreatePort createPort1 = Port.createBuilder("64239a54-dcc4-4b39-920b-b37c2144effa")
                .name("port1")
                .adminStateUp(true)
                .deviceId("24df1d04-d5cb-41e1-8de5-61ed77c558df")
                .securityGroups(ImmutableSet.of("dbc107f4-afcd-4d5a-9352-f68f82241d5b"))
                .build();
 
-         Port.CreateOptions createPort2 = Port.createOptions("e6031bc2-901a-4c66-82da-f4c32ed89406")
+         Port.CreatePort createPort2 = Port.createBuilder("e6031bc2-901a-4c66-82da-f4c32ed89406")
                .name("port2")
                .adminStateUp(false)
                .securityGroups(
@@ -384,7 +384,7 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.UpdateOptions updatePort = Port.updateOptions()
+         Port.UpdatePort updatePort = Port.updateBuilder()
                .securityGroups(
                      ImmutableSet.of("85cc3048-abc3-43cc-89b3-377341426ac5", "c5ab5c29-2c99-44cb-a4b8-e70a88b77799"))
                .build();
@@ -417,7 +417,7 @@ public class PortApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          PortApi api = neutronApi.getPortApi("RegionOne");
 
-         Port.UpdateOptions updatePort = Port.updateOptions()
+         Port.UpdatePort updatePort = Port.updateBuilder()
                .securityGroups(ImmutableSet.of("85cc3048-abc3-43cc-89b3-377341426ac5", "c5ab5c29-2c99-44cb-a4b8-e70a88b77799"))
                .build();
 


[2/6] Backports all neutron changes from master for 1.8.1

Posted by za...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java
deleted file mode 100644
index 4e364a5..0000000
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiLiveTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.jclouds.openstack.neutron.v2.features;
-
-import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
-import org.jclouds.openstack.neutron.v2.domain.Network;
-import org.jclouds.openstack.neutron.v2.domain.NetworkType;
-import org.jclouds.openstack.neutron.v2.domain.Port;
-import org.jclouds.openstack.neutron.v2.domain.Router;
-import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
-import org.jclouds.openstack.neutron.v2.domain.Subnet;
-import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
-import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiLiveTest;
-import org.testng.annotations.Test;
-
-import java.util.Set;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
-/**
- * Tests parsing and Guice wiring of RouterApi
- */
-@Test(groups = "live", testName = "RouterApiLiveTest")
-public class RouterApiLiveTest extends BaseNeutronApiLiveTest {
-
-   public void testCreateUpdateAndDeleteRouter() {
-      for (String region : api.getConfiguredRegions()) {
-         RouterApi routerApi = api.getRouterExtensionApi(region).get();
-         NetworkApi networkApi = api.getNetworkApi(region);
-         SubnetApi subnetApi = api.getSubnetApi(region);
-
-         Network network = networkApi.create(
-               Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network);
-
-         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet);
-
-         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test")
-            .externalGatewayInfo(ExternalGatewayInfo.builder().networkId(network.getId()).build()).build());
-         assertNotNull(router);
-
-         /* List and Get test */
-         Set<Router> routers = api.getRouterExtensionApi(region).get().list().concat().toSet();
-         Router routerList = routers.iterator().next();
-         Router routerGet = api.getRouterExtensionApi(region).get().get(routerList.getId());
-
-         assertNotNull(routerGet);
-         assertEquals(routerGet, routerList);
-         /***/
-
-         routerGet = routerApi.get(router.getId());
-
-         assertEquals(routerGet.getName(), router.getName());
-         assertEquals(routerGet.getId(), router.getId());
-         assertEquals(routerGet.getExternalGatewayInfo(), router.getExternalGatewayInfo());
-
-         Router routerUpdate = routerApi.update(router.getId(), Router.updateOptions().name("jclouds-router-test-rename").build());
-         assertNotNull(routerUpdate);
-         assertEquals(routerUpdate.getName(), "jclouds-router-test-rename");
-
-         routerGet = routerApi.get(router.getId());
-
-         assertEquals(routerGet.getId(), router.getId());
-         assertEquals(routerGet.getName(), "jclouds-router-test-rename");
-
-         assertTrue(routerApi.delete(router.getId()));
-         assertTrue(subnetApi.delete(subnet.getId()));
-         assertTrue(networkApi.delete(network.getId()));
-      }
-   }
-
-   public void testCreateAndDeleteRouterInterfaceForSubnet() {
-      for (String region : api.getConfiguredRegions()) {
-         RouterApi routerApi = api.getRouterExtensionApi(region).get();
-         NetworkApi networkApi = api.getNetworkApi(region);
-         SubnetApi subnetApi = api.getSubnetApi(region);
-
-         Network network = networkApi.create(Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network);
-
-         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet);
-
-         Network network2 = networkApi.create(Network.createOptions("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network2);
-
-         Subnet subnet2 = subnetApi.create(Subnet.createOptions(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet2);
-
-         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test").build());
-         assertNotNull(router);
-
-         RouterInterface routerInterface = routerApi.addInterfaceForSubnet(router.getId(), subnet.getId());
-         assertNotNull(routerInterface);
-
-         RouterInterface routerInterface2 = routerApi.addInterfaceForSubnet(router.getId(), subnet2.getId());
-         assertNotNull(routerInterface2);
-
-         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet.getId()));
-         assertTrue(routerApi.removeInterfaceForSubnet(router.getId(), subnet2.getId()));
-         assertTrue(routerApi.delete(router.getId()));
-         assertTrue(subnetApi.delete(subnet.getId()));
-         assertTrue(networkApi.delete(network.getId()));
-         assertTrue(subnetApi.delete(subnet2.getId()));
-         assertTrue(networkApi.delete(network2.getId()));
-      }
-   }
-
-   public void testCreateAndDeleteRouterInterfaceForPort() {
-      for (String region : api.getConfiguredRegions()) {
-         RouterApi routerApi = api.getRouterExtensionApi(region).get();
-         NetworkApi networkApi = api.getNetworkApi(region);
-         SubnetApi subnetApi = api.getSubnetApi(region);
-         PortApi portApi = api.getPortApi(region);
-
-         Network network = networkApi.create(Network.createOptions("jclouds-network-test").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network);
-
-         Subnet subnet = subnetApi.create(Subnet.createOptions(network.getId(), "192.168.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet);
-
-         Network network2 = networkApi.create(Network.createOptions("jclouds-network-test2").external(true).networkType(NetworkType.LOCAL).build());
-         assertNotNull(network2);
-
-         Subnet subnet2 = subnetApi.create(Subnet.createOptions(network2.getId(), "192.169.0.0/16").ipVersion(4).build());
-         assertNotNull(subnet2);
-
-         Port port = portApi.create(Port.createOptions(network.getId()).build());
-         assertNotNull(port);
-
-         Port port2 = portApi.create(Port.createOptions(network2.getId()).build());
-         assertNotNull(port2);
-
-         Router router = routerApi.create(Router.createOptions().name("jclouds-router-test").build());
-         assertNotNull(router);
-
-         RouterInterface routerInterface = routerApi.addInterfaceForPort(router.getId(), port.getId());
-         assertNotNull(routerInterface);
-
-         RouterInterface routerInterface2 = routerApi.addInterfaceForPort(router.getId(), port2.getId());
-         assertNotNull(routerInterface2);
-
-         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port.getId()));
-         assertTrue(routerApi.removeInterfaceForPort(router.getId(), port2.getId()));
-         assertTrue(routerApi.delete(router.getId()));
-         assertTrue(subnetApi.delete(subnet.getId()));
-         assertTrue(networkApi.delete(network.getId()));
-         assertTrue(subnetApi.delete(subnet2.getId()));
-         assertTrue(networkApi.delete(network2.getId()));
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java
deleted file mode 100644
index 0b2424c..0000000
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/RouterApiMockTest.java
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.openstack.neutron.v2.features;
-
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-import org.jclouds.openstack.neutron.v2.NeutronApi;
-import org.jclouds.openstack.neutron.v2.domain.ExternalGatewayInfo;
-import org.jclouds.openstack.neutron.v2.domain.NetworkStatus;
-import org.jclouds.openstack.neutron.v2.domain.Router;
-import org.jclouds.openstack.neutron.v2.domain.RouterInterface;
-import org.jclouds.openstack.neutron.v2.domain.Routers;
-import org.jclouds.openstack.neutron.v2.extensions.RouterApi;
-import org.jclouds.openstack.neutron.v2.internal.BaseNeutronApiMockTest;
-import org.jclouds.openstack.v2_0.options.PaginationOptions;
-import org.jclouds.rest.ResourceNotFoundException;
-import org.testng.annotations.Test;
-
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.util.List;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
-/**
- * Tests NetworkApi Guice wiring and parsing
- *
- */
-@Test
-public class RouterApiMockTest extends BaseNeutronApiMockTest {
-
-   public void testCreateRouter() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_create_response.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Router.CreateOptions createRouter = Router.createOptions().name("another_router").adminStateUp(true)
-               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.create(createRouter);
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "POST", "/v2.0/routers", "/router_create_request.json");
-
-         /*
-          * Check response
-          */
-         assertNotNull(router);
-         assertEquals(router.getName(), "another_router");
-         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "8ca37218-28ff-41cb-9b10-039601ea7e6b");
-         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
-         assertEquals(router.isAdminStateUp().booleanValue(), true);
-         assertEquals(router.getId(), "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e");
-         assertEquals(router.getTenantId(), "6b96ff0cb17a4b859e1e575d221683d3");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   @Test(expectedExceptions = ResourceNotFoundException.class)
-   public void testCreateRouterFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Router.CreateOptions createRouter = Router.createOptions().name("another_router").adminStateUp(true)
-               .externalGatewayInfo(ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.create(createRouter);
-         fail("Should have failed with not found exception");
-
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testListSpecificPagePort() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged1.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Routers routers = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?limit=2&marker=abcdefg");
-
-         /*
-          * Check response
-          */
-         assertNotNull(routers);
-         assertEquals(routers.size(), 2);
-         assertEquals(routers.first().get().getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testListSpecificPagePortFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Routers routers = api.list(PaginationOptions.Builder.limit(2).marker("abcdefg"));
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?limit=2&marker=abcdefg");
-
-         /*
-          * Check response
-          */
-         assertNotNull(routers);
-         assertTrue(routers.isEmpty());
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testListPagedRouter() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged1.json"))));
-      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(200).setBody(stringFromResource("/router_list_response_paged2.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         // Note: Lazy! Have to actually look at the collection.
-         List<Router> routers = api.list().concat().toList();
-
-         /*
-          * Check request
-          */
-         assertEquals(server.getRequestCount(), 3);
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers");
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718");
-
-         /*
-          * Check response
-          */
-         assertNotNull(routers);
-         assertEquals(routers.size(), 4);
-         assertEquals(routers.get(0).getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
-         assertEquals(routers.get(3).getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d_4");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testListPagedRouterFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         // Note: Lazy! Have to actually look at the collection.
-         List<Router> routers = api.list().concat().toList();
-
-         /*
-          * Check request
-          */
-         assertEquals(server.getRequestCount(), 2);
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers");
-
-         /*
-          * Check response
-          */
-         assertNotNull(routers);
-         assertTrue(routers.isEmpty());
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testGetRouter() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_get_response.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Router router = api.get("12345");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers/12345");
-
-         /*
-          * Check response
-          */
-         assertNotNull(router);
-         assertEquals(router.getName(), "router1");
-         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "3c5bcddd-6af9-4e6b-9c3e-c153e521cab8");
-         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
-         assertEquals(router.isAdminStateUp().booleanValue(), true);
-         assertEquals(router.getId(), "a9254bdb-2613-4a13-ac4c-adc581fba50d");
-         assertEquals(router.getTenantId(), "33a40233088643acb66ff6eb0ebea679");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testGetRouterFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Router router = api.get("12345");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "GET", "/v2.0/routers/12345");
-
-         /*
-          * Check response
-          */
-         assertNull(router);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testUpdateRouter() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_update_response.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Router.UpdateOptions updateOptions = Router.updateOptions()
-               .externalGatewayInfo(
-                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.update("12345", updateOptions);
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345", "/router_update_request.json");
-
-         /*
-          * Check response
-          */
-         assertNotNull(router);
-         assertEquals(router.getName(), "another_router");
-         assertEquals(router.getExternalGatewayInfo().getNetworkId(), "8ca37218-28ff-41cb-9b10-039601ea7e6b");
-         assertEquals(router.getStatus(), NetworkStatus.ACTIVE);
-         assertEquals(router.isAdminStateUp().booleanValue(), true);
-         assertEquals(router.getId(), "8604a0de-7f6b-409a-a47c-a1cc7bc77b2e");
-         assertEquals(router.getTenantId(), "6b96ff0cb17a4b859e1e575d221683d3");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testUpdateRouterFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         Router.UpdateOptions updateOptions = Router.updateOptions()
-               .externalGatewayInfo(
-                     ExternalGatewayInfo.builder().networkId("8ca37218-28ff-41cb-9b10-039601ea7e6b").build())
-               .build();
-
-         Router router = api.update("12345", updateOptions);
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345", "/router_update_request.json");
-
-         /*
-          * Check response
-          */
-         assertNull(router);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testDeleteRouter() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         boolean result = api.delete("12345");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "DELETE", "/v2.0/routers/12345");
-
-         /*
-          * Check response
-          */
-         assertTrue(result);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testDeleteRouterFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         boolean result = api.delete("12345");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "DELETE", "/v2.0/routers/12345");
-
-         /*
-          * Check response
-          */
-         assertFalse(result);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testAddRouterInterfaceForSubnet() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_add_interface_response.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         RouterInterface routerInterface = api.addInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_request.json");
-
-         /*
-          * Check response
-          */
-         assertNotNull(routerInterface);
-         assertEquals(routerInterface.getSubnetId(), "a2f1f29d-571b-4533-907f-5803ab96ead1");
-         assertEquals(routerInterface.getPortId(), "3a44f4e5-1694-493a-a1fb-393881c673a4");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testAddRouterInterfaceForSubnetFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         RouterInterface routerInterface = api.addInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_request.json");
-
-         /*
-          * Check response
-          */
-         assertNull(routerInterface);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testAddRouterInterfaceForPort() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201).setBody(stringFromResource("/router_add_interface_response.json"))));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         RouterInterface routerInterface = api.addInterfaceForPort("12345", "portid");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_port_request.json");
-
-         /*
-          * Check response
-          */
-         assertNotNull(routerInterface);
-         assertEquals(routerInterface.getSubnetId(), "a2f1f29d-571b-4533-907f-5803ab96ead1");
-         assertEquals(routerInterface.getPortId(), "3a44f4e5-1694-493a-a1fb-393881c673a4");
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testAddRouterInterfaceForPortFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         RouterInterface routerInterface = api.addInterfaceForPort("12345", "portid");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/add_router_interface", "/router_add_interface_port_request.json");
-
-         /*
-          * Check response
-          */
-         assertNull(routerInterface);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testRemoveRouterInterfaceForSubnet() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         boolean result = api.removeInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_subnet_request.json");
-
-         /*
-          * Check response
-          */
-         assertTrue(result);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testRemoveRouterInterfaceForSubnetFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         boolean result = api.removeInterfaceForSubnet("12345", "a2f1f29d-571b-4533-907f-5803ab96ead1");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_subnet_request.json");
-
-         /*
-          * Check response
-          */
-         assertFalse(result);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testRemoveRouterInterfaceForPort() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(201)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         boolean result = api.removeInterfaceForPort("12345", "portid");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_port_request.json");
-
-         /*
-          * Check response
-          */
-         assertTrue(result);
-      } finally {
-         server.shutdown();
-      }
-   }
-
-   public void testRemoveRouterInterfaceForPortFail() throws IOException, InterruptedException, URISyntaxException {
-      MockWebServer server = mockOpenStackServer();
-      server.enqueue(addCommonHeaders(new MockResponse().setBody(stringFromResource("/access.json"))));
-      server.enqueue(addCommonHeaders(
-            new MockResponse().setResponseCode(404)));
-
-      try {
-         NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
-         RouterApi api = neutronApi.getRouterExtensionApi("RegionOne").get();
-
-         boolean result = api.removeInterfaceForPort("12345", "portid");
-
-         /*
-          * Check request
-          */
-         assertAuthentication(server);
-         assertRequest(server.takeRequest(), "PUT", "/v2.0/routers/12345/remove_router_interface", "/router_remove_interface_port_request.json");
-
-         /*
-          * Check response
-          */
-         assertFalse(result);
-      } finally {
-         server.shutdown();
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiLiveTest.java
index 3e1adb8..3c5d7a8 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiLiveTest.java
@@ -44,7 +44,7 @@ public class SubnetApiLiveTest extends BaseNeutronApiLiveTest {
    public void testCreateUpdateAndDeleteSubnet() {
       for (String region : api.getConfiguredRegions()) {
          NetworkApi networkApi = api.getNetworkApi(region);
-         String networkId = networkApi.create(Network.createOptions("jclouds-live-test").networkType(NetworkType.LOCAL).build()).getId();
+         String networkId = networkApi.create(Network.createBuilder("jclouds-live-test").networkType(NetworkType.LOCAL).build()).getId();
 
          SubnetApi subnetApi = api.getSubnetApi(region);
          ImmutableSet<AllocationPool> allocationPools = ImmutableSet.of(
@@ -54,7 +54,7 @@ public class SubnetApiLiveTest extends BaseNeutronApiLiveTest {
          ImmutableSet<HostRoute> hostRoutes = ImmutableSet.of(
             HostRoute.builder().destinationCidr("a3:bc00::/48").nextHop("a3:bc00::0004").build()
          );
-         Subnet subnet = subnetApi.create(Subnet.createOptions(networkId, "a3:bc00::/48").ipVersion(6).allocationPools(allocationPools).hostRoutes(hostRoutes).build());
+         Subnet subnet = subnetApi.create(Subnet.createBuilder(networkId, "a3:bc00::/48").ipVersion(6).allocationPools(allocationPools).hostRoutes(hostRoutes).build());
          assertNotNull(subnet);
 
          /* Test list and get */
@@ -71,7 +71,7 @@ public class SubnetApiLiveTest extends BaseNeutronApiLiveTest {
          assertTrue(retrievedSubnet.getDnsNameservers().isEmpty());
          assertEquals(retrievedSubnet.getAllocationPools().size(), 2);
          assertEquals(retrievedSubnet.getHostRoutes().size(), 1);
-         assertNotNull(subnetApi.update(retrievedSubnet.getId(), Subnet.updateOptions().name("jclouds-live-test-update").build()));
+         assertNotNull(subnetApi.update(retrievedSubnet.getId(), Subnet.updateBuilder().name("jclouds-live-test-update").build()));
 
          retrievedSubnet = subnetApi.get(retrievedSubnet.getId());
 
@@ -79,7 +79,7 @@ public class SubnetApiLiveTest extends BaseNeutronApiLiveTest {
          assertEquals(retrievedSubnet.getName(), "jclouds-live-test-update");
          assertTrue(retrievedSubnet.getDnsNameservers().isEmpty());
 
-         Subnet subnet2 = subnetApi.create(Subnet.createOptions(networkId, "a3:bd01::/48").ipVersion(6).build());
+         Subnet subnet2 = subnetApi.create(Subnet.createBuilder(networkId, "a3:bd01::/48").ipVersion(6).build());
          assertNotNull(subnet2);
 
          assertTrue(subnetApi.delete(subnet.getId()));
@@ -91,14 +91,14 @@ public class SubnetApiLiveTest extends BaseNeutronApiLiveTest {
    public void testBulkCreateSubnet() {
       for (String region : api.getConfiguredRegions()) {
          NetworkApi networkApi = api.getNetworkApi(region);
-         String networkId = networkApi.create(Network.createOptions("jclouds-live-test").networkType(NetworkType.LOCAL).build()).getId();
+         String networkId = networkApi.create(Network.createBuilder("jclouds-live-test").networkType(NetworkType.LOCAL).build()).getId();
 
          SubnetApi subnetApi = api.getSubnetApi(region);
          Set<? extends Subnet> subnets = subnetApi.createBulk(
                ImmutableList.of(
-                  Subnet.createOptions("jclouds-live-test-1", "a3:bd01::/48").ipVersion(6).networkId(networkId).build(),
-                  Subnet.createOptions("jclouds-live-test-2", "a3:bd02::/48").ipVersion(6).networkId(networkId).build(),
-                  Subnet.createOptions("jclouds-live-test-3", "a3:bd03::/48").ipVersion(6).networkId(networkId).build()
+                  Subnet.createBuilder("jclouds-live-test-1", "a3:bd01::/48").ipVersion(6).networkId(networkId).build(),
+                  Subnet.createBuilder("jclouds-live-test-2", "a3:bd02::/48").ipVersion(6).networkId(networkId).build(),
+                  Subnet.createBuilder("jclouds-live-test-3", "a3:bd03::/48").ipVersion(6).networkId(networkId).build()
                )
          ).toSet();
          Set<Subnet> existingSubnets = subnetApi.list().concat().toSet();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiMockTest.java
index 51855ad..3571b0c 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/features/SubnetApiMockTest.java
@@ -55,7 +55,7 @@ public class SubnetApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          SubnetApi api = neutronApi.getSubnetApi("RegionOne");
 
-         Subnet.CreateOptions createSubnet = Subnet.createOptions("1234567890", "10.0.3.0/24")
+         Subnet.CreateSubnet createSubnet = Subnet.createBuilder("1234567890", "10.0.3.0/24")
                .name("jclouds-wibble")
                .ipVersion(4)
                .build();
@@ -92,7 +92,7 @@ public class SubnetApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          SubnetApi api = neutronApi.getSubnetApi("RegionOne");
 
-         Subnet.CreateOptions createSubnet = Subnet.createOptions("1234567890", "cidr")
+         Subnet.CreateSubnet createSubnet = Subnet.createBuilder("1234567890", "cidr")
                .name("jclouds-wibble")
                .ipVersion(4)
                .build();
@@ -284,12 +284,12 @@ public class SubnetApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          SubnetApi api = neutronApi.getSubnetApi("RegionOne");
 
-         Subnet.CreateOptions createSubnet1 = Subnet.createOptions("e6031bc2-901a-4c66-82da-f4c32ed89406",
+         Subnet.CreateSubnet createSubnet1 = Subnet.createBuilder("e6031bc2-901a-4c66-82da-f4c32ed89406",
                "192.168.199.0/24")
                .ipVersion(4)
                .build();
 
-         Subnet.CreateOptions createSubnet2 = Subnet.createOptions("64239a54-dcc4-4b39-920b-b37c2144effa",
+         Subnet.CreateSubnet createSubnet2 = Subnet.createBuilder("64239a54-dcc4-4b39-920b-b37c2144effa",
                "10.56.4.0/22")
                .ipVersion(4)
                .build();
@@ -333,12 +333,12 @@ public class SubnetApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          SubnetApi api = neutronApi.getSubnetApi("RegionOne");
 
-         Subnet.CreateOptions createSubnet1 = Subnet.createOptions("e6031bc2-901a-4c66-82da-f4c32ed89406",
+         Subnet.CreateSubnet createSubnet1 = Subnet.createBuilder("e6031bc2-901a-4c66-82da-f4c32ed89406",
                "192.168.199.0/24")
                .ipVersion(4)
                .build();
 
-         Subnet.CreateOptions createSubnet2 = Subnet.createOptions("64239a54-dcc4-4b39-920b-b37c2144effa",
+         Subnet.CreateSubnet createSubnet2 = Subnet.createBuilder("64239a54-dcc4-4b39-920b-b37c2144effa",
                "10.56.4.0/22")
                .ipVersion(4)
                .build();
@@ -358,7 +358,7 @@ public class SubnetApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          SubnetApi api = neutronApi.getSubnetApi("RegionOne");
 
-         Subnet.UpdateOptions updateSubnet = Subnet.updateOptions()
+         Subnet.UpdateSubnet updateSubnet = Subnet.updateBuilder()
                .name("new_name")
                .gatewayIp("10.0.3.254")
                .build();
@@ -393,7 +393,7 @@ public class SubnetApiMockTest extends BaseNeutronApiMockTest {
          NeutronApi neutronApi = api(server.getUrl("/").toString(), "openstack-neutron", overrides);
          SubnetApi api = neutronApi.getSubnetApi("RegionOne");
 
-         Subnet.UpdateOptions updateSubnet = Subnet.updateOptions()
+         Subnet.UpdateSubnet updateSubnet = Subnet.updateBuilder()
                .name("new_name")
                .gatewayIp("10.0.3.254")
                .build();

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiLiveTest.java
index 7ebcaf6..f220a92 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiLiveTest.java
@@ -1,20 +1,18 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- *   http://www.apache.org/licenses/LICENSE-2.0
+ *     http://www.apache.org/licenses/LICENSE-2.0
  *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 package org.jclouds.openstack.neutron.v2.internal;
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
index a1ac790..fd4a50e 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2/internal/BaseNeutronApiMockTest.java
@@ -16,13 +16,13 @@
  */
 package org.jclouds.openstack.neutron.v2.internal;
 
-import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
-import org.jclouds.openstack.neutron.v2.NeutronApi;
-import org.jclouds.openstack.v2_0.internal.BaseOpenStackMockTest;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
 
 import java.util.Properties;
 
-import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
+import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
+import org.jclouds.openstack.neutron.v2.NeutronApi;
+import org.jclouds.openstack.v2_0.internal.BaseOpenStackMockTest;
 
 /**
  * Base class for writing Neutron Mock tests

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiExpectTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiExpectTest.java
index 222ca1a..c3f04cc 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiExpectTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiExpectTest.java
@@ -17,7 +17,16 @@
 
 package org.jclouds.openstack.neutron.v2_0.extensions;
 
-import com.google.common.collect.ImmutableSet;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import javax.ws.rs.core.MediaType;
+
 import org.jclouds.http.HttpResponse;
 import org.jclouds.openstack.neutron.v2_0.domain.ExternalGatewayInfo;
 import org.jclouds.openstack.neutron.v2_0.domain.ReferenceWithName;
@@ -31,17 +40,11 @@ import org.jclouds.openstack.neutron.v2_0.parse.ParseRouterTest;
 import org.jclouds.rest.AuthorizationException;
 import org.testng.annotations.Test;
 
-import javax.ws.rs.core.MediaType;
-import java.util.Set;
-
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * Tests parsing and Guice wiring of RouterApi
+ *
  */
 @Test(groups = "unit", testName = "RouterApiExpectTest")
 public class RouterApiExpectTest extends BaseNeutronApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiLiveTest.java
index d38b805..e51a8c4 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/extensions/RouterApiLiveTest.java
@@ -17,6 +17,12 @@
 
 package org.jclouds.openstack.neutron.v2_0.extensions;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
 import org.jclouds.openstack.neutron.v2_0.domain.ExternalGatewayInfo;
 import org.jclouds.openstack.neutron.v2_0.domain.Network;
 import org.jclouds.openstack.neutron.v2_0.domain.NetworkType;
@@ -34,14 +40,9 @@ import org.jclouds.openstack.neutron.v2_0.options.CreateRouterOptions;
 import org.jclouds.openstack.neutron.v2_0.options.UpdateRouterOptions;
 import org.testng.annotations.Test;
 
-import java.util.Set;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
 /**
  * Tests parsing and Guice wiring of RouterApi
+ *
  */
 @Test(groups = "live", testName = "RouterApiLiveTest")
 public class RouterApiLiveTest extends BaseNeutronApiLiveTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiExpectTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiExpectTest.java
index 40d676d..2d2b09c 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiExpectTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiExpectTest.java
@@ -16,8 +16,16 @@
  */
 package org.jclouds.openstack.neutron.v2_0.features;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
+import javax.ws.rs.core.MediaType;
+
 import org.jclouds.http.HttpResponse;
 import org.jclouds.openstack.neutron.v2_0.domain.BulkNetwork;
 import org.jclouds.openstack.neutron.v2_0.domain.Network;
@@ -31,17 +39,12 @@ import org.jclouds.openstack.neutron.v2_0.parse.ParseNetworkTest;
 import org.jclouds.rest.AuthorizationException;
 import org.testng.annotations.Test;
 
-import javax.ws.rs.core.MediaType;
-import java.util.Set;
-
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * Tests parsing and Guice wiring of NetworkApi
+ *
  */
 @Test(groups = "unit", testName = "NetworkApiExpectTest")
 public class NetworkApiExpectTest extends BaseNeutronApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiLiveTest.java
index e123c2e..cc72b1c 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/NetworkApiLiveTest.java
@@ -16,9 +16,12 @@
  */
 package org.jclouds.openstack.neutron.v2_0.features;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
 import org.jclouds.openstack.neutron.v2_0.domain.BulkNetwork;
 import org.jclouds.openstack.neutron.v2_0.domain.Network;
 import org.jclouds.openstack.neutron.v2_0.domain.NetworkType;
@@ -30,14 +33,13 @@ import org.jclouds.openstack.neutron.v2_0.options.UpdateNetworkOptions;
 import org.jclouds.openstack.neutron.v2_0.util.PredicateUtil;
 import org.testng.annotations.Test;
 
-import java.util.Set;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 
 /**
  * Tests parsing and Guice wiring of NetworkApi
+ *
  */
 @Test(groups = "live", testName = "NetworkApiLiveTest")
 public class NetworkApiLiveTest extends BaseNeutronApiLiveTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiExpectTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiExpectTest.java
index 2231e81..7f5338d 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiExpectTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiExpectTest.java
@@ -16,8 +16,14 @@
  */
 package org.jclouds.openstack.neutron.v2_0.features;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.Set;
+
 import org.jclouds.http.HttpResponse;
 import org.jclouds.openstack.neutron.v2_0.domain.BulkPort;
 import org.jclouds.openstack.neutron.v2_0.domain.Port;
@@ -31,16 +37,12 @@ import org.jclouds.openstack.neutron.v2_0.parse.ParsePortTest;
 import org.jclouds.rest.AuthorizationException;
 import org.testng.annotations.Test;
 
-import java.util.Set;
-
-import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * Tests parsing and Guice wiring of PortApi
+ *
  */
 @Test(groups = "unit", testName = "PortApiExpectTest")
 public class PortApiExpectTest extends BaseNeutronApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiLiveTest.java
index 6a5d4a6..76f3734 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/PortApiLiveTest.java
@@ -43,6 +43,7 @@ import com.google.common.collect.Sets;
 
 /**
  * Tests PortApi in combination with the Network & SubnetApi
+ *
  */
 @Test(groups = "live", testName = "PortApiLiveTest")
 public class PortApiLiveTest extends BaseNeutronApiLiveTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApiLiveTest.java b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApiLiveTest.java
index 3bde9a1..b463339 100644
--- a/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApiLiveTest.java
+++ b/openstack-neutron/src/test/java/org/jclouds/openstack/neutron/v2_0/features/SubnetApiLiveTest.java
@@ -43,6 +43,7 @@ import com.google.common.collect.Sets;
 
 /**
  * Tests subnet api in combination with the network api
+ *
  */
 @Test(groups = "live", testName = "SubnetApiLiveTest")
 public class SubnetApiLiveTest extends BaseNeutronApiLiveTest {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/extension_details.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/extension_details.json b/openstack-neutron/src/test/resources/extension_details.json
new file mode 100644
index 0000000..9e10fef
--- /dev/null
+++ b/openstack-neutron/src/test/resources/extension_details.json
@@ -0,0 +1,10 @@
+{
+    "extension": {
+        "name": "Neutron L3 Router",
+        "namespace": "http://docs.openstack.org/ext/neutron/router/api/v1.0",
+        "alias": "router",
+        "updated": "2012-07-20T10:00:00-00:00",
+        "description": "Router abstraction for basic L3 forwarding between L2 Neutron networks and access to external networks via a NAT gateway.",
+        "links": []
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/extension_list.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/extension_list.json b/openstack-neutron/src/test/resources/extension_list.json
new file mode 100644
index 0000000..9f85e1e
--- /dev/null
+++ b/openstack-neutron/src/test/resources/extension_list.json
@@ -0,0 +1,140 @@
+{
+    "extensions": [
+        {
+            "updated": "2013-01-20T00:00:00-00:00",
+            "name": "Neutron Service Type Management",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/service-type/api/v1.0",
+            "alias": "service-type",
+            "description": "API for retrieving service providers for Neutron advanced services"
+        },
+        {
+            "updated": "2012-10-05T10:00:00-00:00",
+            "name": "security-group",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/securitygroups/api/v2.0",
+            "alias": "security-group",
+            "description": "The security groups extension."
+        },
+        {
+            "updated": "2013-02-07T10:00:00-00:00",
+            "name": "L3 Agent Scheduler",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/l3_agent_scheduler/api/v1.0",
+            "alias": "l3_agent_scheduler",
+            "description": "Schedule routers among l3 agents"
+        },
+        {
+            "updated": "2013-02-07T10:00:00-00:00",
+            "name": "Loadbalancer Agent Scheduler",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/lbaas_agent_scheduler/api/v1.0",
+            "alias": "lbaas_agent_scheduler",
+            "description": "Schedule pools among lbaas agents"
+        },
+        {
+            "updated": "2013-03-28T10:00:00-00:00",
+            "name": "Neutron L3 Configurable external gateway mode",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/ext-gw-mode/api/v1.0",
+            "alias": "ext-gw-mode",
+            "description": "Extension of the router abstraction for specifying whether SNAT should occur on the external gateway"
+        },
+        {
+            "updated": "2014-02-03T10:00:00-00:00",
+            "name": "Port Binding",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/binding/api/v1.0",
+            "alias": "binding",
+            "description": "Expose port bindings of a virtual port to external application"
+        },
+        {
+            "updated": "2012-09-07T10:00:00-00:00",
+            "name": "Provider Network",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/provider/api/v1.0",
+            "alias": "provider",
+            "description": "Expose mapping of virtual networks to physical networks"
+        },
+        {
+            "updated": "2013-02-03T10:00:00-00:00",
+            "name": "agent",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/agent/api/v2.0",
+            "alias": "agent",
+            "description": "The agent management extension."
+        },
+        {
+            "updated": "2012-07-29T10:00:00-00:00",
+            "name": "Quota management support",
+            "links": [],
+            "namespace": "http://docs.openstack.org/network/ext/quotas-sets/api/v2.0",
+            "alias": "quotas",
+            "description": "Expose functions for quotas management per tenant"
+        },
+        {
+            "updated": "2013-02-07T10:00:00-00:00",
+            "name": "DHCP Agent Scheduler",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/dhcp_agent_scheduler/api/v1.0",
+            "alias": "dhcp_agent_scheduler",
+            "description": "Schedule networks among dhcp agents"
+        },
+        {
+            "updated": "2013-06-27T10:00:00-00:00",
+            "name": "Multi Provider Network",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/multi-provider/api/v1.0",
+            "alias": "multi-provider",
+            "description": "Expose mapping of virtual networks to multiple physical networks"
+        },
+        {
+            "updated": "2013-01-14T10:00:00-00:00",
+            "name": "Neutron external network",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/external_net/api/v1.0",
+            "alias": "external-net",
+            "description": "Adds external network attribute to network resource."
+        },
+        {
+            "updated": "2012-07-20T10:00:00-00:00",
+            "name": "Neutron L3 Router",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/router/api/v1.0",
+            "alias": "router",
+            "description": "Router abstraction for basic L3 forwarding between L2 Neutron networks and access to external networks via a NAT gateway."
+        },
+        {
+            "updated": "2013-07-23T10:00:00-00:00",
+            "name": "Allowed Address Pairs",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/allowedaddresspairs/api/v2.0",
+            "alias": "allowed-address-pairs",
+            "description": "Provides allowed address pairs"
+        },
+        {
+            "updated": "2013-03-17T12:00:00-00:00",
+            "name": "Neutron Extra DHCP opts",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/extra_dhcp_opt/api/v1.0",
+            "alias": "extra_dhcp_opt",
+            "description": "Extra options configuration for DHCP. For example PXE boot options to DHCP clients can be specified (e.g. tftp-server, server-ip-address, bootfile-name)"
+        },
+        {
+            "updated": "2012-10-07T10:00:00-00:00",
+            "name": "LoadBalancing service",
+            "links": [],
+            "namespace": "http://wiki.openstack.org/neutron/LBaaS/API_1.0",
+            "alias": "lbaas",
+            "description": "Extension for LoadBalancing service"
+        },
+        {
+            "updated": "2013-02-01T10:00:00-00:00",
+            "name": "Neutron Extra Route",
+            "links": [],
+            "namespace": "http://docs.openstack.org/ext/neutron/extraroutes/api/v1.0",
+            "alias": "extraroute",
+            "description": "Extra routes configuration for L3 router"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_create_request.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_create_request.json b/openstack-neutron/src/test/resources/floatingip_create_request.json
new file mode 100644
index 0000000..72ed72f
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_create_request.json
@@ -0,0 +1,6 @@
+{
+    "floatingip": {
+        "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+        "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_create_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_create_response.json b/openstack-neutron/src/test/resources/floatingip_create_response.json
new file mode 100644
index 0000000..4dbb82c
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_create_response.json
@@ -0,0 +1,11 @@
+{
+    "floatingip": {
+        "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
+        "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+        "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+        "fixed_ip_address": "10.0.0.3",
+        "floating_ip_address": "172.24.4.228",
+        "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab",
+        "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_get_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_get_response.json b/openstack-neutron/src/test/resources/floatingip_get_response.json
new file mode 100644
index 0000000..4dbb82c
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_get_response.json
@@ -0,0 +1,11 @@
+{
+    "floatingip": {
+        "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
+        "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+        "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+        "fixed_ip_address": "10.0.0.3",
+        "floating_ip_address": "172.24.4.228",
+        "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab",
+        "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_list_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_list_response.json b/openstack-neutron/src/test/resources/floatingip_list_response.json
new file mode 100644
index 0000000..6b41bf9
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_list_response.json
@@ -0,0 +1,22 @@
+{
+    "floatingips": [
+        {
+            "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
+            "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+            "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+            "fixed_ip_address": "10.0.0.3",
+            "floating_ip_address": "172.24.4.228",
+            "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab",
+            "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
+        },
+        {
+            "router_id": null,
+            "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+            "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+            "fixed_ip_address": null,
+            "floating_ip_address": "172.24.4.227",
+            "port_id": null,
+            "id": "61cea855-49cb-4846-997d-801b70c71bdd"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_list_response_paged1.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_list_response_paged1.json b/openstack-neutron/src/test/resources/floatingip_list_response_paged1.json
new file mode 100644
index 0000000..7b809f8
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_list_response_paged1.json
@@ -0,0 +1,32 @@
+{
+    "floatingips": [
+        {
+            "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
+            "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+            "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+            "fixed_ip_address": "10.0.0.3",
+            "floating_ip_address": "172.24.4.228",
+            "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab",
+            "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
+        },
+        {
+            "router_id": null,
+            "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+            "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+            "fixed_ip_address": null,
+            "floating_ip_address": "172.24.4.227",
+            "port_id": null,
+            "id": "61cea855-49cb-4846-997d-801b70c71bdd"
+        }
+    ],
+    "floatingips_links": [
+        {
+            "href": "/v2.0/floatingips.json?marker=71c1e68c-171a-4aa2-aca5-50ea153a3718",
+            "rel": "next"
+        },
+        {
+            "href": "/v2.0/floatingips.json?marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True",
+            "rel": "previous"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_list_response_paged2.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_list_response_paged2.json b/openstack-neutron/src/test/resources/floatingip_list_response_paged2.json
new file mode 100644
index 0000000..9ca8cd2
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_list_response_paged2.json
@@ -0,0 +1,28 @@
+{
+    "floatingips": [
+        {
+            "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f2",
+            "tenant_id": "4969c491a3c74ee4af974e6d800c62de2",
+            "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf572",
+            "fixed_ip_address": "10.0.0.3",
+            "floating_ip_address": "172.24.4.228",
+            "port_id": "ce705c24-c1ef-408a-bda3-7bbd946164ab2",
+            "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda72"
+        },
+        {
+            "router_id": null,
+            "tenant_id": "4969c491a3c74ee4af974e6d800c62de2",
+            "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf572",
+            "fixed_ip_address": null,
+            "floating_ip_address": "172.24.4.227",
+            "port_id": null,
+            "id": "61cea855-49cb-4846-997d-801b70c71bdd2"
+        }
+    ],
+    "floatingips_links": [
+        {
+            "href": "/v2.0/floatingips.json?marker=396f12f8-521e-4b91-8e21-2e003500433a&page_reverse=True",
+            "rel": "previous"
+        }
+    ]
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_update_dissociate_request.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_update_dissociate_request.json b/openstack-neutron/src/test/resources/floatingip_update_dissociate_request.json
new file mode 100644
index 0000000..a45f500
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_update_dissociate_request.json
@@ -0,0 +1,5 @@
+{
+    "floatingip": {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_update_dissociate_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_update_dissociate_response.json b/openstack-neutron/src/test/resources/floatingip_update_dissociate_response.json
new file mode 100644
index 0000000..5515a22
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_update_dissociate_response.json
@@ -0,0 +1,11 @@
+{
+    "floatingip": {
+        "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
+        "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+        "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+        "fixed_ip_address": null,
+        "floating_ip_address": "172.24.4.228",
+        "port_id": null,
+        "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_update_request.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_update_request.json b/openstack-neutron/src/test/resources/floatingip_update_request.json
new file mode 100644
index 0000000..2772b5a
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_update_request.json
@@ -0,0 +1,5 @@
+{
+    "floatingip": {
+        "port_id": "fc861431-0e6c-4842-a0ed-e2363f9bc3a8"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/floatingip_update_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/floatingip_update_response.json b/openstack-neutron/src/test/resources/floatingip_update_response.json
new file mode 100644
index 0000000..59c8a68
--- /dev/null
+++ b/openstack-neutron/src/test/resources/floatingip_update_response.json
@@ -0,0 +1,11 @@
+{
+    "floatingip": {
+        "router_id": "d23abc8d-2991-4a55-ba98-2aaea84cc72f",
+        "tenant_id": "4969c491a3c74ee4af974e6d800c62de",
+        "floating_network_id": "376da547-b977-4cfe-9cba-275c80debf57",
+        "fixed_ip_address": "10.0.0.4",
+        "floating_ip_address": "172.24.4.228",
+        "port_id": "fc861431-0e6c-4842-a0ed-e2363f9bc3a8",
+        "id": "2f245a7b-796b-4f26-9cf9-9e82d248fda7"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_create_request.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_create_request.json b/openstack-neutron/src/test/resources/security_group_create_request.json
new file mode 100644
index 0000000..8a93ef9
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_create_request.json
@@ -0,0 +1,6 @@
+{
+    "security_group": {
+        "name": "new-webservers",
+        "description": "security group for webservers"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_create_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_create_response.json b/openstack-neutron/src/test/resources/security_group_create_response.json
new file mode 100644
index 0000000..1ded327
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_create_response.json
@@ -0,0 +1,34 @@
+{
+    "security_group": {
+        "description": "security group for webservers",
+        "id": "2076db17-a522-4506-91de-c6dd8e837028",
+        "name": "new-webservers",
+        "security_group_rules": [
+            {
+                "direction": "egress",
+                "ethertype": "IPv4",
+                "id": "38ce2d8e-e8f1-48bd-83c2-d33cb9f50c3d",
+                "port_range_max": null,
+                "port_range_min": null,
+                "protocol": null,
+                "remote_group_id": null,
+                "remote_ip_prefix": null,
+                "security_group_id": "2076db17-a522-4506-91de-c6dd8e837028",
+                "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+            },
+            {
+                "direction": "egress",
+                "ethertype": "IPv6",
+                "id": "565b9502-12de-4ffd-91e9-68885cff6ae1",
+                "port_range_max": null,
+                "port_range_min": null,
+                "protocol": null,
+                "remote_group_id": null,
+                "remote_ip_prefix": null,
+                "security_group_id": "2076db17-a522-4506-91de-c6dd8e837028",
+                "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+            }
+        ],
+        "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_get_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_get_response.json b/openstack-neutron/src/test/resources/security_group_get_response.json
new file mode 100644
index 0000000..126b5d2
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_get_response.json
@@ -0,0 +1,58 @@
+{
+    "security_group": {
+        "description": "default",
+        "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+        "name": "default",
+        "security_group_rules": [
+            {
+                "direction": "egress",
+                "ethertype": "IPv6",
+                "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+                "port_range_max": null,
+                "port_range_min": null,
+                "protocol": null,
+                "remote_group_id": null,
+                "remote_ip_prefix": null,
+                "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+            },
+            {
+                "direction": "egress",
+                "ethertype": "IPv4",
+                "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
+                "port_range_max": null,
+                "port_range_min": null,
+                "protocol": null,
+                "remote_group_id": null,
+                "remote_ip_prefix": null,
+                "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+            },
+            {
+                "direction": "ingress",
+                "ethertype": "IPv6",
+                "id": "c0b09f00-1d49-4e64-a0a7-8a186d928138",
+                "port_range_max": null,
+                "port_range_min": null,
+                "protocol": null,
+                "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                "remote_ip_prefix": null,
+                "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+            },
+            {
+                "direction": "ingress",
+                "ethertype": "IPv4",
+                "id": "f7d45c89-008e-4bab-88ad-d6811724c51c",
+                "port_range_max": null,
+                "port_range_min": null,
+                "protocol": null,
+                "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                "remote_ip_prefix": null,
+                "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+            }
+        ],
+        "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/f21914db/openstack-neutron/src/test/resources/security_group_list_response.json
----------------------------------------------------------------------
diff --git a/openstack-neutron/src/test/resources/security_group_list_response.json b/openstack-neutron/src/test/resources/security_group_list_response.json
new file mode 100644
index 0000000..c0cf747
--- /dev/null
+++ b/openstack-neutron/src/test/resources/security_group_list_response.json
@@ -0,0 +1,116 @@
+{
+    "security_groups": [
+        {
+            "description": "default",
+            "id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+            "name": "default",
+            "security_group_rules": [
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv6",
+                    "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv4",
+                    "id": "93aa42e5-80db-4581-9391-3a608bd0e448",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv6",
+                    "id": "c0b09f00-1d49-4e64-a0a7-8a186d928138",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv4",
+                    "id": "f7d45c89-008e-4bab-88ad-d6811724c51c",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                }
+            ],
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        },
+        {
+            "description": "default",
+            "id": "85cc3048-abc3-43cc-89b3-377341426ac52",
+            "name": "default",
+            "security_group_rules": [
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv6",
+                    "id": "3c0e45ff-adaf-4124-b083-bf390e5482ff2",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "egress",
+                    "ethertype": "IPv4",
+                    "id": "93aa42e5-80db-4581-9391-3a608bd0e4482",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": null,
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv6",
+                    "id": "c0b09f00-1d49-4e64-a0a7-8a186d9281382",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                },
+                {
+                    "direction": "ingress",
+                    "ethertype": "IPv4",
+                    "id": "f7d45c89-008e-4bab-88ad-d6811724c51c2",
+                    "port_range_max": null,
+                    "port_range_min": null,
+                    "protocol": null,
+                    "remote_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "remote_ip_prefix": null,
+                    "security_group_id": "85cc3048-abc3-43cc-89b3-377341426ac5",
+                    "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+                }
+            ],
+            "tenant_id": "e4f50856753b4dc6afee5fa6b9b6c550"
+        }
+    ]
+}