You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by an...@apache.org on 2017/04/11 00:23:55 UTC

[01/11] libcloud git commit: 1&1 Compute Driver

Repository: libcloud
Updated Branches:
  refs/heads/trunk 30715a44c -> bcdf8b594


http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_load_balancer.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_load_balancer.json b/libcloud/test/compute/fixtures/oneandone/list_load_balancer.json
new file mode 100644
index 0000000..93a542a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_load_balancer.json
@@ -0,0 +1,78 @@
+[
+  {
+    "id": "B23F1B4F84E983B4FEDD5459E877058A",
+    "name": "My load balancer",
+    "state": "CONFIGURING",
+    "creation_date": "2015-03-03T11:12:00+00:00",
+    "description": "My load balancer description",
+    "ip": "10.5.138.52",
+    "health_check_test": "TCP",
+    "health_check_interval": 40,
+    "health_check_path": null,
+    "health_check_path_parser": null,
+    "persistence": true,
+    "persistence_time": 1200,
+    "method": "ROUND_ROBIN",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "rules": [
+      {
+        "id": "D7A0A7C445D844848EBB439C28B46183",
+        "protocol": "TCP",
+        "port_balancer": 22,
+        "port_server": 22,
+        "source": "0.0.0.0"
+      },
+      {
+        "id": "9AE836CDE379EEB361287F07B3300F84",
+        "protocol": "TCP",
+        "port_balancer": 85,
+        "port_server": 85,
+        "source": "0.0.0.0"
+      }
+    ],
+    "server_ips": [],
+    "cloudpanel_id": "LB99AA4_1"
+  },
+  {
+    "id": "B23F1B4F84E983B4FEDD5459E877058B",
+    "name": "My Load Balancer II",
+    "state": "CONFIGURING",
+    "creation_date": "2015-03-03T11:12:00+00:00",
+    "description": "My load balancer II description",
+    "ip": "10.5.138.53",
+    "health_check_test": "TCP",
+    "health_check_interval": 40,
+    "health_check_path": null,
+    "health_check_path_parser": null,
+    "persistence": true,
+    "persistence_time": 1200,
+    "method": "ROUND_ROBIN",
+    "region": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "rules": [
+      {
+        "id": "D7A0A7C445D844848EBB439C28B46184",
+        "protocol": "TCP",
+        "port_balancer": 22,
+        "port_server": 22,
+        "source": "0.0.0.0"
+      },
+      {
+        "id": "9AE836CDE379EEB361287F07B3300F85",
+        "protocol": "TCP",
+        "port_balancer": 9999,
+        "port_server": 9999,
+        "source": "0.0.0.0"
+      }
+    ],
+    "server_ips": [],
+    "cloudpanel_id": "LB99AA4_1"
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_monitoring_policies.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_monitoring_policies.json b/libcloud/test/compute/fixtures/oneandone/list_monitoring_policies.json
new file mode 100644
index 0000000..7d3c75b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_monitoring_policies.json
@@ -0,0 +1,152 @@
+[
+  {
+    "id": "0F9A1604FC80EB625FC6AEE7394893BE",
+    "name": "Default Policy",
+    "description": "Default Policy Description",
+    "default": 1,
+    "state": "ACTIVE",
+    "creation_date": "2014-10-29T07:52:46+00:00",
+    "email": "",
+    "agent": false,
+    "servers": [
+      {
+        "id": "E83777750130E1111AA89623B9557CAF",
+        "name": "My Server 1"
+      },
+      {
+        "id": "CB22C6E0428239348A6B70BAE0D67E66",
+        "name": "My Server 2"
+      },
+      {
+        "id": "6AAA2BD60813F419DEC8D69C6E4F6477",
+        "name": "My Server 3"
+      }
+    ],
+    "thresholds": {
+      "cpu": {
+        "warning": {
+          "value": 90,
+          "alert": false
+        },
+        "critical": {
+          "value": 95,
+          "alert": false
+        }
+      },
+      "ram": {
+        "warning": {
+          "value": 90,
+          "alert": false
+        },
+        "critical": {
+          "value": 95,
+          "alert": false
+        }
+      },
+      "transfer": {
+        "warning": {
+          "value": 1000,
+          "alert": false
+        },
+        "critical": {
+          "value": 2000,
+          "alert": false
+        }
+      },
+      "internal_ping": {
+        "warning": {
+          "value": 50,
+          "alert": false
+        },
+        "critical": {
+          "value": 100,
+          "alert": false
+        }
+      }
+    },
+    "ports": [],
+    "processes": [],
+    "cloudpanel_id": "mo99AA4_1"
+  },
+  {
+    "id": "C81F17AF6F6F6717372B79A882B25E92",
+    "name": "My monitoring policy",
+    "description": null,
+    "default": 0,
+    "state": "ACTIVE",
+    "creation_date": "2015-02-26T07:23:42+00:00",
+    "email": "",
+    "agent": true,
+    "servers": [],
+    "thresholds": {
+      "cpu": {
+        "warning": {
+          "value": 90,
+          "alert": false
+        },
+        "critical": {
+          "value": 95,
+          "alert": false
+        }
+      },
+      "ram": {
+        "warning": {
+          "value": 90,
+          "alert": false
+        },
+        "critical": {
+          "value": 95,
+          "alert": false
+        }
+      },
+      "disk": {
+        "warning": {
+          "value": 80,
+          "alert": false
+        },
+        "critical": {
+          "value": 90,
+          "alert": false
+        }
+      },
+      "transfer": {
+        "warning": {
+          "value": 1000,
+          "alert": false
+        },
+        "critical": {
+          "value": 2000,
+          "alert": false
+        }
+      },
+      "internal_ping": {
+        "warning": {
+          "value": 50,
+          "alert": false
+        },
+        "critical": {
+          "value": 100,
+          "alert": false
+        }
+      }
+    },
+    "ports": [
+      {
+        "id": "5F67F2706335AF34FFCDF71E5AF08B2B",
+        "protocol": "TCP",
+        "port": "22",
+        "alert_when": false,
+        "alert": true
+      }
+    ],
+    "processes": [
+      {
+        "id": "13CF2BEADA60230C6241C81C248F3C4B",
+        "process": "test",
+        "alert_when": false,
+        "alert": true
+      }
+    ],
+    "cloudpanel_id": "mo99AA4_2"
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_public_ips.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_public_ips.json b/libcloud/test/compute/fixtures/oneandone/list_public_ips.json
new file mode 100644
index 0000000..6d4260e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_public_ips.json
@@ -0,0 +1,59 @@
+[
+  {
+    "id": "569FA2EC06DD48C9E8635F3384A018DB",
+    "ip": "10.5.138.52",
+    "type": "IPV4",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "assigned_to": {
+      "id": "B23F1B4F84E983B4FEDD5459E877058A",
+      "name": "My load balancer",
+      "type": "LOAD_BALANCER"
+    },
+    "reverse_dns": null,
+    "is_dhcp": false,
+    "state": "ACTIVE",
+    "creation_date": "2015-03-03T11:12:10+00:00"
+  },
+  {
+    "id": "6F033A13C3EFCE0FB60783280A118D63",
+    "ip": "10.5.133.191",
+    "type": "IPV4",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "assigned_to": {
+      "id": "BDAF0EC6A36E9E554B80B7E7365821F5",
+      "name": "My Server 1",
+      "type": "SERVER"
+    },
+    "reverse_dns": null,
+    "is_dhcp": true,
+    "state": "ACTIVE",
+    "creation_date": "2015-05-04T07:21:37+00:00"
+  },
+  {
+    "id": "39C73A57B33DAF2F9FA1EBEA4C301FCF",
+    "ip": "10.5.138.81",
+    "type": "IPV4",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "assigned_to": {
+      "id": "B23F1B4F84E983B4FEDD5459E877058A",
+      "name": "My load balancer",
+      "type": "LOAD_BALANCER"
+    },
+    "reverse_dns": null,
+    "is_dhcp": false,
+    "state": "ACTIVE",
+    "creation_date": "2015-03-03T11:13:16+00:00"
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_servers.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_servers.json b/libcloud/test/compute/fixtures/oneandone/list_servers.json
new file mode 100644
index 0000000..f9e05b2
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_servers.json
@@ -0,0 +1,197 @@
+[
+   {
+      "id":"8A7D5122BDC173B6E52223878CEF2748",
+      "name":"Docs Content Ubuntu 16.04-1",
+      "description":"",
+      "status":{
+         "state":"POWERED_ON",
+         "percent":null
+      },
+      "datacenter":{
+         "id":"908DC2072407C94C8054610AD5A53B8C",
+         "country_code":"US",
+         "location":"United States of America"
+      },
+      "creation_date":"2016-10-03T16:44:34+00:00",
+      "image":{
+         "id":"4DBFA2D31B1A303A9CE0E4ECF8838FDE",
+         "name":"ubuntu1604-64std"
+      },
+      "hardware":{
+         "fixed_instance_size_id":"65929629F35BBFBA63022008F773F3EB",
+         "vcore":1,
+         "cores_per_processor":1,
+         "ram":1,
+         "hdds":[
+            {
+               "id":"F92B0519D2F9A7EFA961F956C4B381B4",
+               "size":40,
+               "is_main":true
+            }
+         ]
+      },
+      "ips":[
+         {
+            "id":"9774FB2A6DCC45733B115A98FCD59CC6",
+            "ip":"50.21.182.126"
+         }
+      ],
+      "alerts":null
+   },
+   {
+      "id":"E7D36EC025C73796035BF4F171379025",
+      "name":"Docs Content Test Server: CentOS 7-1",
+      "description":"",
+      "status":{
+         "state":"POWERED_ON",
+         "percent":null
+      },
+      "datacenter":{
+         "id":"908DC2072407C94C8054610AD5A53B8C",
+         "country_code":"US",
+         "location":"United States of America"
+      },
+      "creation_date":"2016-05-05T17:39:50+00:00",
+      "image":{
+         "id":"B5F778B85C041347BCDCFC3172AB3F3C",
+         "name":"centos7-64std"
+      },
+      "hardware":{
+         "fixed_instance_size_id":"65929629F35BBFBA63022008F773F3EB",
+         "vcore":1,
+         "cores_per_processor":1,
+         "ram":1,
+         "hdds":[
+            {
+               "id":"CDB278D95A92CB4C379A9CAAD6759F02",
+               "size":40,
+               "is_main":true
+            }
+         ]
+      },
+      "ips":[
+         {
+            "id":"FDBE99EDD57F8596CBF71B6B64BD0A92",
+            "ip":"62.151.179.99"
+         }
+      ],
+      "alerts":null
+   },
+   {
+      "id":"DDDC4CCA34AAB08132FA1E40F9FEAC25",
+      "name":"App Dev Server 5",
+      "description":"",
+      "status":{
+         "state":"POWERED_ON",
+         "percent":null
+      },
+      "datacenter":{
+         "id":"908DC2072407C94C8054610AD5A53B8C",
+         "country_code":"US",
+         "location":"United States of America"
+      },
+      "creation_date":"2016-03-04T21:29:00+00:00",
+      "image":{
+         "id":"96D5CEB497043FD54E834DEC4B8FF70A",
+         "name":"centos7-64cpanel"
+      },
+      "hardware":{
+         "fixed_instance_size_id":"65929629F35BBFBA63022008F773F3EB",
+         "vcore":1,
+         "cores_per_processor":1,
+         "ram":1,
+         "hdds":[
+            {
+               "id":"5E23F849DD3D6A47615D8EE441FE74CC",
+               "size":40,
+               "is_main":true
+            }
+         ]
+      },
+      "ips":[
+         {
+            "id":"E193E9D2213088B3CCE8AD69646CEF18",
+            "ip":"70.35.206.196"
+         }
+      ],
+      "alerts":null
+   },
+   {
+      "id":"D5C5C1D01249DE9B88BE3DAE973AA090",
+      "name":"Docs Test Server: CentOS 7-2",
+      "description":"",
+      "status":{
+         "state":"POWERED_ON",
+         "percent":null
+      },
+      "datacenter":{
+         "id":"908DC2072407C94C8054610AD5A53B8C",
+         "country_code":"US",
+         "location":"United States of America"
+      },
+      "creation_date":"2016-10-24T18:13:41+00:00",
+      "image":{
+         "id":"B5F778B85C041347BCDCFC3172AB3F3C",
+         "name":"centos7-64std"
+      },
+      "hardware":{
+         "fixed_instance_size_id":"3D4C49EAEDD42FBC23DB58FE3DEF464F",
+         "vcore":1,
+         "cores_per_processor":1,
+         "ram":0.5,
+         "hdds":[
+            {
+               "id":"35F875003212E7F083728E4072A188B0",
+               "size":30,
+               "is_main":true
+            }
+         ]
+      },
+      "ips":[
+         {
+            "id":"1C79CF2066A5AEEACCB97A68FF41DD00",
+            "ip":"74.208.88.88"
+         }
+      ],
+      "alerts":null
+   },
+   {
+      "id":"FB1765588A90364835782061CE48BA8E",
+      "name":"Docs Content Test Server Ubuntu 16.04-2",
+      "description":"",
+      "status":{
+         "state":"POWERED_ON",
+         "percent":null
+      },
+      "datacenter":{
+         "id":"908DC2072407C94C8054610AD5A53B8C",
+         "country_code":"US",
+         "location":"United States of America"
+      },
+      "creation_date":"2016-11-28T21:45:50+00:00",
+      "image":{
+         "id":"4DBFA2D31B1A303A9CE0E4ECF8838FDE",
+         "name":"ubuntu1604-64std"
+      },
+      "hardware":{
+         "fixed_instance_size_id":"65929629F35BBFBA63022008F773F3EB",
+         "vcore":1,
+         "cores_per_processor":1,
+         "ram":1,
+         "hdds":[
+            {
+               "id":"B45F054C54B5AAE9C45253C6D0A47E74",
+               "size":40,
+               "is_main":true
+            }
+         ]
+      },
+      "ips":[
+         {
+            "id":"7D8EA6722183DA82AEDFA09AECE243C4",
+            "ip":"70.35.206.233"
+         }
+      ],
+      "alerts":null
+   }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_shared_storages.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_shared_storages.json b/libcloud/test/compute/fixtures/oneandone/list_shared_storages.json
new file mode 100644
index 0000000..fd059a4
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_shared_storages.json
@@ -0,0 +1,64 @@
+[
+  {
+    "id": "6AD2F180B7B666539EF75A02FE227084",
+    "size": 200,
+    "state": "ACTIVE",
+    "description": "My shared storage test description",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "cloudpanel_id": "vid35780",
+    "size_used": "0.00",
+    "cifs_path": "vid50995.nas1.lanvid50995",
+    "nfs_path": "vid50995.nas1.lan/:vid50995",
+    "name": "My shared storage test",
+    "creation_date": "2015-05-06T08:33:25+00:00",
+    "servers": [
+      {
+        "id": "638ED28205B1AFD7ADEF569C725DD85F",
+        "name": "My server 1",
+        "rights": "RW"
+      }
+    ]
+  },
+  {
+    "id": "4406CE4723BB441C7956E25C51CE8C1B",
+    "size": 50,
+    "state": "ACTIVE",
+    "description": "My shared storage description",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "cloudpanel_id": "vid30534",
+    "size_used": "0.00",
+    "cifs_path": "vid50995.nas1.lanvid50995",
+    "nfs_path": "vid50995.nas1.lan/:vid50995",
+    "name": "My shared storage",
+    "creation_date": "2015-03-17T11:57:48+00:00",
+    "servers": [
+    ]
+  },
+  {
+    "id": "1A5418172DD3BD39F8010A6633F1018A",
+    "size": 250,
+    "state": "ACTIVE",
+    "description": null,
+    "cloudpanel_id": "vid19857",
+    "datacenter": {
+      "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+      "location": "USA",
+      "country_code": "US"
+    },
+    "size_used": "0.00",
+    "cifs_path": "vid50995.nas1.lanvid50995",
+    "nfs_path": "vid50995.nas1.lan/:vid50995",
+    "name": "My shared storage 2",
+    "creation_date": "2015-05-05T09:36:31+00:00",
+    "servers": [
+    ]
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/load_balancer.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/load_balancer.json b/libcloud/test/compute/fixtures/oneandone/load_balancer.json
new file mode 100644
index 0000000..c3d2e68
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/load_balancer.json
@@ -0,0 +1,38 @@
+{
+  "id": "BD8318616581A9C3C53F94402503230F",
+  "name": "My load balancer",
+  "state": "CONFIGURING",
+  "creation_date": "2015-05-04T07:26:24+00:00",
+  "description": "My load balancer description",
+  "ip": null,
+  "health_check_test": "TCP",
+  "health_check_interval": 40,
+  "health_check_path": null,
+  "health_check_path_parser": null,
+  "persistence": true,
+  "persistence_time": 1200,
+  "method": "ROUND_ROBIN",
+  "datacenter": {
+    "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+    "location": "USA",
+    "country_code": "US"
+  },
+  "rules": [
+    {
+      "id": "BCFAF421227674B2B324F779C1163ECB",
+      "protocol": "TCP",
+      "port_balancer": 80,
+      "port_server": 80,
+      "source": "0.0.0.0"
+    },
+    {
+      "id": "7390C04142800E006FF1B0132FFD8F9A",
+      "protocol": "TCP",
+      "port_balancer": 9999,
+      "port_server": 8888,
+      "source": "0.0.0.0"
+    }
+  ],
+  "server_ips": [],
+  "cloudpanel_id": "LB99AA4_1"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/load_balancer_rule.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/load_balancer_rule.json b/libcloud/test/compute/fixtures/oneandone/load_balancer_rule.json
new file mode 100644
index 0000000..a5c3d37
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/load_balancer_rule.json
@@ -0,0 +1,7 @@
+{
+  "id": "BCFAF421227674B2B324F779C1163ECB",
+  "protocol": "TCP",
+  "port_balancer": 80,
+  "port_server": 80,
+  "source": "0.0.0.0"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/load_balancer_rules.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/load_balancer_rules.json b/libcloud/test/compute/fixtures/oneandone/load_balancer_rules.json
new file mode 100644
index 0000000..0f20841
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/load_balancer_rules.json
@@ -0,0 +1,16 @@
+[
+  {
+    "id": "BCFAF421227674B2B324F779C1163ECB",
+    "protocol": "TCP",
+    "port_balancer": 80,
+    "port_server": 80,
+    "source": "0.0.0.0"
+  },
+  {
+    "id": "7390C04142800E006FF1B0132FFD8F9A",
+    "protocol": "TCP",
+    "port_balancer": 9999,
+    "port_server": 8888,
+    "source": "0.0.0.0"
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ip.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ip.json b/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ip.json
new file mode 100644
index 0000000..fdc4a2a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ip.json
@@ -0,0 +1,5 @@
+{
+  "id": "7C88E50FBC500A3D9D7F94E414255D6B",
+  "ip": "123.46.79.100",
+  "server_name": "My server 1"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ips.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ips.json b/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ips.json
new file mode 100644
index 0000000..21c945b
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/load_balancer_server_ips.json
@@ -0,0 +1,6 @@
+{
+  "server_ips": [
+    "7C88E50FBC500A3D9D7F94E414255D6B",
+    "7288E50FBC500A3D9D7F94E414255D6B"
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/monitoring_policy.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/monitoring_policy.json b/libcloud/test/compute/fixtures/oneandone/monitoring_policy.json
new file mode 100644
index 0000000..510c3c7
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/monitoring_policy.json
@@ -0,0 +1,73 @@
+{
+  "name": "Monitoring Policy",
+  "description": "Monitoring Policy Description",
+  "email": "test@test.com",
+  "agent": false,
+  "thresholds": {
+    "disk": {
+      "warning": {
+        "value": 80,
+        "alert": false
+      },
+      "critical": {
+        "value": 90,
+        "alert": false
+      }
+    },
+    "transfer": {
+      "warning": {
+        "value": 1000,
+        "alert": false
+      },
+      "critical": {
+        "value": 2000,
+        "alert": false
+      }
+    },
+    "ram": {
+      "warning": {
+        "value": 90,
+        "alert": false
+      },
+      "critical": {
+        "value": 95,
+        "alert": false
+      }
+    },
+    "internal_ping": {
+      "warning": {
+        "value": 50,
+        "alert": false
+      },
+      "critical": {
+        "value": 100,
+        "alert": true
+      }
+    },
+    "cpu": {
+      "warning": {
+        "value": 90,
+        "alert": false
+      },
+      "critical": {
+        "value": 95,
+        "alert": false
+      }
+    }
+  },
+  "ports": [
+    {
+      "alert_if": "NOT_RESPONDING",
+      "email_notification": true,
+      "protocol": "TCP",
+      "port": 443
+    }
+  ],
+  "processes": [
+    {
+      "process": "httpdeamon",
+      "alert_if": "NOT_RUNNING",
+      "email_notification": false
+    }
+  ]
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/monitoring_policy_port.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/monitoring_policy_port.json b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_port.json
new file mode 100644
index 0000000..909d587
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_port.json
@@ -0,0 +1,7 @@
+{
+  "id": "663D21E232530D79E4E584104C400EE4",
+  "protocol": "TCP",
+  "port": 22,
+  "alert_if": "RESPONDING",
+  "email_notifications": true
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/monitoring_policy_ports.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/monitoring_policy_ports.json b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_ports.json
new file mode 100644
index 0000000..a3f1f89
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_ports.json
@@ -0,0 +1,16 @@
+[
+  {
+    "id": "663D21E232530D79E4E584104C400EE4",
+    "protocol": "TCP",
+    "port": 22,
+    "alert_if": "RESPONDING",
+    "email_notifications": true
+  },
+  {
+    "id": "663D21E232530D79E4E584104C400AAA",
+    "protocol": "TCP",
+    "port": 80,
+    "alert_if": "NOT_RESPONDING",
+    "email_notifications": true
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/monitoring_policy_process.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/monitoring_policy_process.json b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_process.json
new file mode 100644
index 0000000..9f49bfa
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_process.json
@@ -0,0 +1,6 @@
+{
+  "id": "663D21E232530D79E4E584104C400EE4",
+  "process": "iexplorer",
+  "alert_if": "NOT_RUNNING",
+  "email_notifications": true
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/monitoring_policy_processes.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/monitoring_policy_processes.json b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_processes.json
new file mode 100644
index 0000000..a79b2f5
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_processes.json
@@ -0,0 +1,14 @@
+[
+  {
+    "id": "663D21E232530D79E4E584104C400EE4",
+    "process": "iexplorer",
+    "alert_if": "NOT_RUNNING",
+    "email_notifications": true
+  },
+  {
+    "id": "663D21E232530D79E4E584104C400EE4",
+    "process": "winword",
+    "alert_if": "NOT_RUNNING",
+    "email_notifications": true
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/monitoring_policy_servers.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/monitoring_policy_servers.json b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_servers.json
new file mode 100644
index 0000000..19dea3c
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/monitoring_policy_servers.json
@@ -0,0 +1,10 @@
+[
+  {
+    "id": "C72CF0A681B0CCE7EC624DD194D585C6",
+    "name": "My server 1"
+  },
+  {
+    "id": "4ECD9D188EB457317B2CF8F07885E7B4",
+    "name": "My server 2"
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/public_ip.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/public_ip.json b/libcloud/test/compute/fixtures/oneandone/public_ip.json
new file mode 100644
index 0000000..4bb51b0
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/public_ip.json
@@ -0,0 +1,15 @@
+{
+  "id": "44972922D045B9648118AA80FF2A51C9",
+  "ip": "10.4.140.155",
+  "type": "IPV4",
+  "datacenter": {
+    "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+    "location": "USA",
+    "country_code": "US"
+  },
+  "assigned_to": null,
+  "reverse_dns": "example.com",
+  "is_dhcp": false,
+  "state": "ACTIVE",
+  "creation_date": "2015-05-06T08:17:33+00:00"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/server_hardware.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/server_hardware.json b/libcloud/test/compute/fixtures/oneandone/server_hardware.json
new file mode 100644
index 0000000..899e757
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/server_hardware.json
@@ -0,0 +1,13 @@
+{
+  "fixed_instance_size_id": 0,
+  "vcore": 1,
+  "cores_per_processor": 1,
+  "ram": 2,
+  "hdds": [
+  {
+    "id": "8C626C1A7005D0D1F527143C413D461E",
+    "size": 40,
+    "is_main": true
+  }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/server_ip.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/server_ip.json b/libcloud/test/compute/fixtures/oneandone/server_ip.json
new file mode 100644
index 0000000..7cef3fc
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/server_ip.json
@@ -0,0 +1,8 @@
+{
+  "id": "01D4A802798AB77AA72DA2D05E1379E1",
+  "ip": "10.5.135.140",
+  "type": "IPV4",
+  "reverse_dns": null,
+  "firewall_policy": null,
+  "load_balancers": []
+}

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/server_ips.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/server_ips.json b/libcloud/test/compute/fixtures/oneandone/server_ips.json
new file mode 100644
index 0000000..6d4f6e5
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/server_ips.json
@@ -0,0 +1,10 @@
+[
+  {
+    "id": "01D4A802798AB77AA72DA2D05E1379E1",
+    "ip": "10.5.135.140",
+    "type": "IPV4",
+    "reverse_dns": null,
+    "firewall_policy": null,
+    "load_balancers": []
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/shared_storage.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/shared_storage.json b/libcloud/test/compute/fixtures/oneandone/shared_storage.json
new file mode 100644
index 0000000..566b240
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/shared_storage.json
@@ -0,0 +1,24 @@
+{
+  "id": "6AD2F180B7B666539EF75A02FE227084",
+  "size": 200,
+  "state": "ACTIVE",
+  "description": "My shared storage test description",
+  "datacenter": {
+    "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+    "location": "USA",
+    "country_code": "US"
+  },
+  "cloudpanel_id": "vid35780",
+  "size_used": "0.00",
+  "cifs_path": "vid50995.nas1.lanvid50995",
+  "nfs_path": "vid50995.nas1.lan/:vid50995",
+  "name": "My shared storage test",
+  "creation_date": "2015-05-06T08:33:25+00:00",
+  "servers": [
+    {
+      "id": "638ED28205B1AFD7ADEF569C725DD85F",
+      "name": "My server 1",
+      "rights": "RW"
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/ttt.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/ttt.json b/libcloud/test/compute/fixtures/oneandone/ttt.json
new file mode 100644
index 0000000..fd75651
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/ttt.json
@@ -0,0 +1,73 @@
+{
+  "name": "MonitoringPolicy_674",
+  "description": "MonitoringPolicy_674 description",
+  "email": "test-go-sdk@oneandone.com",
+  "agent": true,
+  "thresholds": {
+    "cpu": {
+      "warning": {
+        "value": 90,
+        "alert": false
+      },
+      "critical": {
+        "value": 95,
+        "alert": false
+      }
+    },
+    "ram": {
+      "warning": {
+        "value": 90,
+        "alert": false
+      },
+      "critical": {
+        "value": 95,
+        "alert": false
+      }
+    },
+    "disk": {
+      "warning": {
+        "value": 80,
+        "alert": false
+      },
+      "critical": {
+        "value": 90,
+        "alert": false
+      }
+    },
+    "transfer": {
+      "warning": {
+        "value": 1000,
+        "alert": false
+      },
+      "critical": {
+        "value": 2000,
+        "alert": false
+      }
+    },
+    "internal_ping": {
+      "warning": {
+        "value": 50,
+        "alert": false
+      },
+      "critical": {
+        "value": 100,
+        "alert": true
+      }
+    }
+  },
+  "ports": [
+    {
+      "protocol": "TCP",
+      "port": 443,
+      "alert_if": "NOT_RESPONDING",
+      "email_notification": true
+    }
+  ],
+  "processes": [
+    {
+      "process": "httpdeamon",
+      "alert_if": "NOT_RUNNING",
+      "email_notification": false
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/test_oneandone.py
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/test_oneandone.py b/libcloud/test/compute/test_oneandone.py
new file mode 100644
index 0000000..7de5e38
--- /dev/null
+++ b/libcloud/test/compute/test_oneandone.py
@@ -0,0 +1,1281 @@
+# 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.
+import sys
+
+from libcloud.compute.base import NodeImage, NodeAuthPassword, NodeLocation
+from libcloud.utils.py3 import httplib
+from libcloud.test import unittest, MockHttp
+from libcloud.test.file_fixtures import ComputeFileFixtures
+from libcloud.compute.types import Provider, NodeState
+from libcloud.test.secrets import ONEANDONE_PARAMS
+from libcloud.compute.providers import get_driver
+
+
+class OneAndOneTests(unittest.TestCase):
+    def setUp(self):
+        oneAndOne = get_driver(Provider.ONEANDONE)
+        oneAndOne.connectionCls.conn_class = OneAndOneMockHttp
+        self.driver = oneAndOne(ONEANDONE_PARAMS)
+
+    '''
+    Function tests for listing items
+    '''
+
+    def test_list_sizes(self):
+        sizes = self.driver.list_sizes()
+        self.assertEqual(len(sizes), 4)
+
+    def test_list_locations(self):
+        sizes = self.driver.list_locations()
+        self.assertEqual(len(sizes), 4)
+
+    def test_list_images(self):
+        appliances = self.driver.list_images("IMAGE")
+        self.assertEqual(len(appliances), 102)
+
+    def test_get_image(self):
+        appliance = self.driver.get_image('img_1')
+        self.assertNotEqual(appliance, None)
+
+    def test_list_nodes(self):
+        nodes = self.driver.list_nodes()
+        self.assertEqual(len(nodes), 5)
+
+        counter = 0
+
+        for node in nodes:
+            if counter == 0:
+                self.assertEqual(node.id, '8A7D5122BDC173B6E52223878CEF2748')
+                self.assertEqual(node.name, 'Docs Content Ubuntu 16.04-1')
+                self.assertEqual(node.state, NodeState.RUNNING)
+                self.assertEqual(node.public_ips, ['50.21.182.126'])
+                self.assertEqual(node.private_ips, [])
+            if counter == 1:
+                self.assertEqual(node.id, 'E7D36EC025C73796035BF4F171379025')
+                self.assertEqual(node.name,
+                                 'Docs Content Test Server: CentOS 7-1')
+                self.assertEqual(node.state, NodeState.RUNNING)
+                self.assertEqual(node.public_ips, ['62.151.179.99'])
+                self.assertEqual(node.private_ips, [])
+            if counter == 2:
+                self.assertEqual(node.id, 'DDDC4CCA34AAB08132FA1E40F9FEAC25')
+                self.assertEqual(node.name, 'App Dev Server 5')
+                self.assertEqual(node.state, NodeState.RUNNING)
+                self.assertEqual(node.public_ips, ['70.35.206.196'])
+                self.assertEqual(node.private_ips, [])
+            if counter == 3:
+                self.assertEqual(node.id, 'D5C5C1D01249DE9B88BE3DAE973AA090')
+                self.assertEqual(node.name, 'Docs Test Server: CentOS 7-2')
+                self.assertEqual(node.state, NodeState.RUNNING)
+                self.assertEqual(node.public_ips, ['74.208.88.88'])
+                self.assertEqual(node.private_ips, [])
+            if counter == 4:
+                self.assertEqual(node.id, 'FB1765588A90364835782061CE48BA8E')
+                self.assertEqual(node.name,
+                                 'Docs Content Test Server Ubuntu 16.04-2')
+                self.assertEqual(node.state, NodeState.RUNNING)
+                self.assertEqual(node.public_ips, ['70.35.206.233'])
+                self.assertEqual(node.private_ips, [])
+            counter += 1
+
+    def test_create_node(self):
+        node = self.driver.create_node(name="name",
+                                       image=NodeImage(
+                                           id="image_id",
+                                           name=None,
+                                           driver=self.driver),
+                                       ex_fixed_instance_size_id="instance_id",
+                                       location=NodeLocation(
+                                           "datacenter_id",
+                                           name="name",
+                                           country="GB",
+                                           driver=self.driver),
+                                       auth=NodeAuthPassword("password"),
+                                       ex_ip="1.1.1.1",
+                                       ex_monitoring_policy_id="mp_id",
+                                       ex_firewall_policy_id="fw_id",
+                                       ex_loadbalancer_id="lb_id",
+                                       ex_description="description",
+                                       ex_power_on="SHUTDOWN")
+
+        self.assertEqual(node.id, "E7D36EC025C73796035BF4F171379025")
+        self.assertEqual(node.name, "Docs Content Test Server: CentOS 7-1")
+        self.assertEqual(node.extra["description"], "My server description")
+
+        self.assertEqual(node.extra["status"]["percent"], None)
+        self.assertEqual(node.extra["status"]["state"], "POWERED_ON")
+
+        self.assertEqual(node.extra["image"]["id"],
+                         "B5F778B85C041347BCDCFC3172AB3F3C")
+        self.assertEqual(node.extra["image"]["name"], "centos7-64std")
+
+        self.assertEqual(node.extra["datacenter"]["id"],
+                         "908DC2072407C94C8054610AD5A53B8C")
+        self.assertEqual(node.extra["datacenter"]["country_code"], "US")
+        self.assertEqual(node.extra["datacenter"]["location"],
+                         "United States of America")
+
+        self.assertEqual(node.extra["hardware"]["fixed_instance_size_id"],
+                         "65929629F35BBFBA63022008F773F3EB")
+        self.assertEqual(node.extra["hardware"]["vcore"], 1)
+        self.assertEqual(node.extra["hardware"]["hdds"][0]["id"],
+                         "CDB278D95A92CB4C379A9CAAD6759F02")
+        self.assertEqual(node.extra["hardware"]["hdds"][0]["size"], 40)
+        self.assertEqual(node.extra["hardware"]["hdds"][0]["is_main"], True)
+        self.assertEqual(node.extra["hardware"]["cores_per_processor"], 1)
+        self.assertEqual(node.extra["hardware"]["vcore"], 1)
+        self.assertEqual(node.extra["hardware"]["ram"], 1)
+
+        self.assertEqual(node.extra["ips"][0]["id"],
+                         "FDBE99EDD57F8596CBF71B6B64BD0A92")
+        self.assertEqual(node.extra["ips"][0]["ip"], "62.151.179.99")
+
+        self.assertEqual(node.extra["monitoring_policy"], None)
+        self.assertEqual(node.extra["alerts"], [])
+        self.assertEqual(node.extra["snapshot"], None)
+        self.assertEqual(node.extra["dvd"], None)
+        self.assertEqual(node.extra["private_networks"], None)
+
+    def test_ex_list_datacenters(self):
+        datacenters = self.driver.ex_list_datacenters()
+
+        self.assertEqual(len(datacenters), 4)
+
+    def test_ex_shutdown_server(self):
+        server = self.driver.ex_shutdown_server("srv_1")
+        self.assertNotEqual(server, None)
+
+    def test_reboot_node(self):
+        node = self.driver.ex_get_server("srv_1")
+        node = self.driver.reboot_node(node)
+        self.assertNotEqual(node, None)
+
+    def test_ex_get_server(self):
+        server = self.driver.ex_get_server("srv_1")
+        self.assertNotEqual(server, None)
+
+    def test_destroy_node(self):
+        server = self.driver.ex_get_server("srv_1")
+
+        node = self.driver.destroy_node(server)
+        self.assertNotEqual(node, None)
+
+    def test_get_server_hardware(self):
+        hardware = self.driver.ex_get_server_hardware("srv_1")
+        self.assertNotEqual(hardware, None)
+        self.assertEqual(hardware['vcore'], 1)
+        self.assertEqual(hardware['cores_per_processor'], 1)
+        self.assertEqual(hardware['ram'], 2)
+        self.assertEqual(hardware['fixed_instance_size_id'], 0)
+        self.assertNotEqual(hardware['hdds'], None)
+        self.assertEqual(hardware['hdds'][0]['id'],
+                         '8C626C1A7005D0D1F527143C413D461E')
+        self.assertEqual(hardware['hdds'][0]['is_main'], True)
+        self.assertEqual(hardware['hdds'][0]['size'], 40)
+
+    def test_rename_server(self):
+        server = self.driver.ex_rename_server("srv_1", "name")
+        self.assertNotEqual(server, None)
+
+    def test_ex_modify_server_hardware(self):
+        node = self.driver.ex_modify_server_hardware("srv_1", vcore=1)
+        self.assertNotEqual(node, None)
+
+    def test_add_hdd(self):
+        node = self.driver.ex_add_hdd("srv_1", 1, True)
+        self.assertNotEqual(node, None)
+
+    def test_modify_hdd(self):
+        node = self.driver.ex_modify_server_hardware("srv_1", "hdd_id", 50)
+        self.assertNotEqual(node, None)
+
+    def test_remove_hdd(self):
+        node = self.driver.ex_remove_hdd("srv_1", "hdd_id")
+        self.assertNotEqual(node, None)
+
+    def test_ex_get_server_image(self):
+        image = self.driver.ex_get_server_image("srv_1")
+        self.assertNotEqual(image, None)
+        self.assertEqual(image['id'], "76EBF29C1250167C8754B2B3D1C05F68")
+        self.assertEqual(image['name'], "centos7-64std")
+
+    def test_ex_reinstall_server_image(self):
+        node = self.driver.ex_reinstall_server_image("srv_1", "img_id",
+                                                     "password")
+        self.assertNotEqual(node, None)
+
+    def test_ex_list_server_ips(self):
+        ips = self.driver.ex_list_server_ips("srv_1")
+        self.assertEqual(len(ips), 1)
+
+    def test_ex_get_server_ip(self):
+        ip = self.driver.ex_get_server_ip("srv_1", "ip_id")
+        self.assertNotEqual(ip, None)
+
+    def test_ex_assign_server(self):
+        node = self.driver.ex_assign_server_ip("srv_1", "IPV$")
+        self.assertNotEqual(node, None)
+
+    def test_ex_remove_server_ip(self):
+        node = self.driver.ex_remove_server_ip("srv_1", "ip_id", keep_ip=True)
+        self.assertNotEqual(node, None)
+
+    def test_ex_create_firewall_policy(self):
+        rules = [
+            {
+                "protocol": "TCP",
+                "port_from": 80,
+                "port_to": 80,
+                "source": "0.0.0.0"
+            },
+            {
+                "protocol": "TCP",
+                "port_from": 443,
+                "port_to": 443,
+                "source": "0.0.0.0"
+            }
+        ]
+        firewall = self.driver \
+            .ex_create_firewall_policy("name", rules,
+                                       description="desc")
+
+        self.assertNotEqual(firewall, None)
+
+    def test_ex_list_firewall_policies(self):
+        firewall = self.driver.ex_list_firewall_policies()
+        self.assertNotEqual(firewall, None)
+        self.assertEqual(len(firewall), 2)
+
+    def test_ex_get_firewall_policy(self):
+        firewall = self.driver.ex_get_firewall_policy("fw_id")
+        self.assertNotEqual(firewall, None)
+
+    def test_ex_delete_firewall_policy(self):
+        firewall = self.driver.ex_delete_firewall_policy("fw_id")
+        self.assertNotEqual(firewall, None)
+
+    def test_ex_get_server_firewall_policies(self):
+        firewall = self.driver \
+            .ex_get_server_firewall_policies("srv_id", "ip_id")
+        self.assertNotEqual(firewall, None)
+
+    def test_ex_remove_server_firewall_policies(self):
+        node = self.driver \
+            .ex_remove_server_firewall_policy("srv_id", "ip_id")
+        self.assertNotEqual(node, None)
+
+    def test_ex_add_server_firewall_policy(self):
+        node = self.driver \
+            .ex_add_server_firewall_policy("srv_id", "ip_id", "fw_id")
+        self.assertNotEqual(node, None)
+
+    def test_ex_list_shared_storages(self):
+        storages = self.driver.ex_list_shared_storages()
+        self.assertEquals(len(storages), 3)
+
+    def test_ex_get_shared_storage(self):
+        storage = self.driver.ex_get_shared_storage('storage_1')
+
+        self.assertNotEqual(storage, None)
+        self.assertEqual(storage['id'], "6AD2F180B7B666539EF75A02FE227084")
+        self.assertEqual(storage['size'], 200)
+        self.assertEqual(storage['state'], 'ACTIVE')
+        self.assertEqual(storage['description'],
+                         'My shared storage test description')
+        self.assertEqual(storage['datacenter']['id'],
+                         'D0F6D8C8ED29D3036F94C27BBB7BAD36')
+        self.assertEqual(storage['datacenter']['location'], 'USA')
+        self.assertEqual(storage['datacenter']['country_code'], 'US')
+        self.assertEqual(storage['cloudpanel_id'], 'vid35780')
+        self.assertEqual(storage['size_used'], '0.00')
+        self.assertEqual(storage["cifs_path"], "vid50995.nas1.lanvid50995")
+        self.assertEqual(storage["nfs_path"], "vid50995.nas1.lan/:vid50995")
+        self.assertEqual(storage["name"], "My shared storage test")
+        self.assertEqual(storage["creation_date"], "2015-05-06T08:33:25+00:00")
+        self.assertEqual(storage['servers'][0]['id'],
+                         '638ED28205B1AFD7ADEF569C725DD85F')
+        self.assertEqual(storage['servers'][0]["name"], "My server 1")
+        self.assertEqual(storage['servers'][0]["rights"], "RW")
+
+    def test_ex_create_shared_storage(self):
+        storage = self.driver.ex_create_shared_storage(
+            name='TEST', size=2, datacenter_id='dc_id')
+        self.assertNotEqual(storage, None)
+
+    def test_ex_delete_shared_storage(self):
+        storage = self.driver.ex_delete_shared_storage('storage_1')
+        self.assertNotEqual(storage, None)
+
+    def test_ex_attach_server_to_shared_storage(self):
+        storage = self.driver.ex_attach_server_to_shared_storage(
+            'storage_1', 'srv_1', 'RW')
+        self.assertNotEqual(storage, None)
+
+    def test_ex_get_shared_storage_server(self):
+        storage = self.driver.ex_get_shared_storage_server(
+            'storage_1', 'srv_1')
+        self.assertNotEqual(storage, None)
+
+    def test_ex_detach_server_from_shared_storage(self):
+        storage = self.driver.ex_detach_server_from_shared_storage(
+            'storage_1', 'srv_1')
+        self.assertNotEqual(storage, None)
+
+    def test_ex_create_load_balancers(self):
+        rules = [
+            {
+                "protocol": "TCP",
+                "port_balancer": 80,
+                "port_server": 80,
+                "source": "0.0.0.0"
+            },
+            {
+                "protocol": "TCP",
+                "port_balancer": 9999,
+                "port_server": 8888,
+                "source": "0.0.0.0"
+            }
+        ]
+        load_balancer = self.driver. \
+            ex_create_load_balancer(name='name',
+                                    method='ROUNDROBIN',
+                                    rules=rules,
+                                    persistence=True,
+                                    persistence_time=1)
+
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_list_load_balancers(self):
+        load_balancers = self.driver.ex_list_load_balancers()
+        self.assertEqual(len(load_balancers), 2)
+
+    def test_update_load_balancer(self):
+        load_balancer = self.driver. \
+            ex_update_load_balancer("lb_1", name='new name')
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_add_servers_to_load_balancer(self):
+        load_balancer = self.driver. \
+            ex_add_servers_to_load_balancer('lb_1', server_ips=["1.1.1.1"])
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_remove_server_from_load_balancer(self):
+        load_balancer = self.driver. \
+            ex_remove_server_from_load_balancer('lb_1', server_ip="srv_1")
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_add_load_balancer_rule(self):
+        load_balancer = self.driver. \
+            ex_add_load_balancer_rule('lb_1', protocol='TCP', port_balancer=82,
+                                      port_server=81, source='0.0.0.0')
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_remove_load_balancer_rule(self):
+        load_balancer = self.driver. \
+            ex_remove_load_balancer_rule('lb_1', 'rule_1')
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_get_load_balancer(self):
+        load_balancer = self.driver. \
+            ex_get_load_balancer('lb_1')
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_get_load_balancer_server_ip(self):
+        server_ip = self.driver. \
+            ex_get_load_balancer_server_ip('lb_1', 'srv_1')
+        self.assertNotEqual(server_ip, None)
+
+    def test_ex_list_load_balancer_rules(self):
+        rules = self.driver. \
+            ex_list_load_balancer_rules('lb_1')
+        self.assertNotEqual(rules, None)
+        self.assertEqual(len(rules), 2)
+
+    def test_ex_get_load_balancer_rule(self):
+        rule = self.driver. \
+            ex_get_load_balancer_rule('lb_1', 'rule_1')
+        self.assertNotEqual(rule, None)
+
+    def test_ex_delete_load_balancer(self):
+        load_balancer = self.driver. \
+            ex_delete_load_balancer('lb_1')
+        self.assertNotEqual(load_balancer, None)
+
+    def test_ex_list_public_ips(self):
+        ips = self.driver.ex_list_public_ips()
+        self.assertNotEqual(ips, None)
+        self.assertEqual(len(ips), 3)
+
+    def test_ex_create_public_ip(self):
+        ip = self.driver.ex_create_public_ip('IPv4')
+        self.assertNotEqual(ip, None)
+
+    def test_ex_get_public_ip(self):
+        ip = self.driver.ex_get_public_ip('ip_1')
+        self.assertNotEqual(ip, None)
+
+    def test_ex_delete_public_ip(self):
+        ip = self.driver.ex_delete_public_ip('ip_1')
+        self.assertNotEqual(ip, None)
+
+    def test_ex_update_public_ip(self):
+        ip = self.driver.ex_update_public_ip('ip_1', "reverse.dns")
+        self.assertNotEqual(ip, None)
+
+    def test_ex_create_monitoring_policy(self):
+        thresholds = {
+            "cpu": {
+                "warning": {
+                    "value": 90,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 95,
+                    "alert": False
+                }
+            },
+            "ram": {
+                "warning": {
+                    "value": 90,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 95,
+                    "alert": False
+                }
+            },
+            "disk": {
+                "warning": {
+                    "value": 80,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 90,
+                    "alert": False
+                }
+            },
+            "transfer": {
+                "warning": {
+                    "value": 1000,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 2000,
+                    "alert": False
+                }
+            },
+            "internal_ping": {
+                "warning": {
+                    "value": 50,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 100,
+                    "alert": False
+                }
+            }
+        }
+
+        ports = [
+            {
+                "protocol": "TCP",
+                "port": "22",
+                "alert_if": "RESPONDING",
+                "email_notification": True
+            }
+        ]
+
+        processes = [
+            {
+                "process": "test",
+                "alert_if": "NOT_RUNNING",
+                "email_notification": True
+            }
+        ]
+
+        policy = self.driver. \
+            ex_create_monitoring_policy(name='test_name',
+                                        thresholds=thresholds,
+                                        ports=ports,
+                                        processes=processes,
+                                        description='description',
+                                        email='test@domain.com',
+                                        agent=True)
+        self.assertNotEqual(policy, None)
+
+    def test_ex_list_monitoring_policies(self):
+        policies = self.driver.ex_list_monitoring_policies()
+        self.assertNotEqual(policies, None)
+        self.assertEqual(len(policies), 2)
+
+    def test_ex_get_monitoring_policy(self):
+        policy = self.driver.ex_get_monitoring_policy('pol_1')
+        self.assertNotEqual(policy, None)
+
+    def test_ex_update_monitoring_policy(self):
+        thresholds = {
+            "cpu": {
+                "warning": {
+                    "value": 90,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 95,
+                    "alert": False
+                }
+            },
+            "ram": {
+                "warning": {
+                    "value": 90,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 95,
+                    "alert": False
+                }
+            },
+            "disk": {
+                "warning": {
+                    "value": 80,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 90,
+                    "alert": False
+                }
+            },
+            "transfer": {
+                "warning": {
+                    "value": 1000,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 2000,
+                    "alert": False
+                }
+            },
+            "internal_ping": {
+                "warning": {
+                    "value": 50,
+                    "alert": False
+                },
+                "critical": {
+                    "value": 100,
+                    "alert": False
+                }
+            }
+        }
+
+        policy = self.driver. \
+            ex_update_monitoring_policy('pol_1', email='test@domain.com',
+                                        thresholds=thresholds,
+                                        name='new name',
+                                        description='new description')
+        self.assertNotEqual(policy, None)
+
+    def test_ex_get_monitoring_policy_ports(self):
+        ports = self.driver. \
+            ex_get_monitoring_policy_ports('pol_1')
+        self.assertNotEqual(ports, None)
+        self.assertEqual(len(ports), 2)
+
+    def test_ex_get_monitoring_policy_port(self):
+        port = self.driver. \
+            ex_get_monitoring_policy_port('pol_1', 'port_1')
+        self.assertNotEqual(port, None)
+
+    def test_ex_remove_monitoring_policy_port(self):
+        port = self.driver. \
+            ex_remove_monitoring_policy_port('pol_1', 'port_1')
+        self.assertNotEqual(port, None)
+
+    def test_ex_add_monitoring_policy_ports(self):
+        new_ports = [
+            {
+                "protocol": "TCP",
+                "port": "80",
+                "alert_if": "RESPONDING",
+                "email_notification": True
+            }
+        ]
+        ports = self.driver. \
+            ex_add_monitoring_policy_ports('pol_1', new_ports)
+        self.assertNotEqual(ports, None)
+        self.assertEqual(len(ports), 2)
+
+    def test_ex_get_monitoring_policy_processes(self):
+        processes = self.driver. \
+            ex_get_monitoring_policy_processes('pol_1')
+        self.assertNotEqual(processes, None)
+
+    def test_ex_get_monitoring_policy_process(self):
+        process = self.driver. \
+            ex_get_monitoring_policy_process('pol_1', 'proc_1')
+        self.assertNotEqual(process, None)
+
+    def test_ex_remove_monitoring_policy_process(self):
+        policy = self.driver. \
+            ex_remove_monitoring_policy_process('pol_1', 'proc_1')
+        self.assertNotEqual(policy, None)
+
+    def test_ex_add_monitoring_policy_processes(self):
+        processes = {
+            "processes": [
+                {
+                    "process": "taskmmgr",
+                    "alert_if": "RUNNING",
+                    "email_notification": True
+                }
+            ]
+        }
+        processes = self.driver. \
+            ex_add_monitoring_policy_processes(policy_id='pol_1',
+                                               processes=processes)
+        self.assertNotEqual(processes, None)
+        self.assertEqual(len(processes), 2)
+
+    def test_ex_list_monitoring_policy_servers(self):
+        servers = self.driver.ex_list_monitoring_policy_servers('pol_1')
+        self.assertNotEqual(servers, None)
+        self.assertEqual(len(servers), 2)
+
+    def test_ex_add_servers_to_monitoring_policy(self):
+        servers = self.driver. \
+            ex_add_servers_to_monitoring_policy('pol_1', 'serv_1')
+        self.assertNotEqual(servers, None)
+        self.assertEqual(len(servers), 2)
+
+    def test_ex_remove_server_from_monitoring_policy(self):
+        policy = self.driver. \
+            ex_remove_server_from_monitoring_policy('pol_1', 'serv_1')
+        self.assertNotEqual(policy, None)
+
+
+class OneAndOneMockHttp(MockHttp):
+    fixtures = ComputeFileFixtures('oneandone')
+
+    '''
+    Operation on Server Appliances
+
+    GET - Fetches Server Appliances
+    '''
+
+    def _v1_server_appliances(self, method, url, body, headers):
+        body = self.fixtures.load('list_images.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_server_appliances_img_1(self, method, url, body, headers):
+        body = self.fixtures.load('get_image.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_servers(self, method, url, body, headers):
+        if method == "GET":
+            body = self.fixtures.load('list_servers.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == "POST":
+            body = self.fixtures.load('create_node.json')
+            return (
+                httplib.ACCEPTED,
+                body,
+                {},
+                httplib.responses[httplib.ACCEPTED]
+            )
+
+    def _v1_create_node(self, method, url, body_headers):
+
+        body = self.fixtures.load('list_servers.json')
+
+        return (
+            httplib.ACCEPTED,
+            {},
+            body,
+            httplib.responses[httplib.ACCEPTED]
+        )
+
+    def _v1_datacenters(
+        self, method, url, body, headers
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('ex_list_datacenters.json')
+            return (
+                httplib.OK,
+                body,
+                {'content-type': 'application/json'},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_servers_srv_1(
+        self, method, url, body, headers
+    ):
+        pass
+
+        if method == 'PUT':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {'content-type': 'application/json'},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'GET':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {'content-type': 'application/json'},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'DELETE':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_servers_srv_1_status_action(self, method, url, body_headers, id):
+        body = self.fixtures.load('describe_server.json')
+
+        return (
+            httplib.ACCEPTED,
+            body,
+            {},
+            httplib.responses[httplib.ACCEPTED]
+        )
+
+    def _v1_servers_srv_1_hardware(
+        self, method, url, body, headers
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('server_hardware.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'PUT':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.ACCEPTED,
+                body,
+                {},
+                httplib.responses[httplib.ACCEPTED]
+            )
+
+    def _v1_servers_srv_1_hardware_hdds(
+        self, method, url, body, headers
+    ):
+        if method == 'POST':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'PUT':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.ACCEPTED,
+                body,
+                {},
+                httplib.responses[httplib.ACCEPTED]
+            )
+
+    def _v1_servers_srv_1_hardware_hdds_hdd_id(
+        self, method, url, body, headers
+    ):
+        if method == 'DELETE':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'PUT':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.ACCEPTED,
+                body,
+                {},
+                httplib.responses[httplib.ACCEPTED]
+            )
+
+    def _v1_servers_srv_1_image(
+        self, method, url, body, headers
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('get_server_image.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'PUT':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_servers_srv_1_ips(
+        self, method, url, body, headers
+    ):
+
+        if method == 'GET':
+            body = self.fixtures.load('server_ips.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'POST':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_servers_srv_1_ips_ip_id(
+        self, method, url, body, headers
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('server_ip.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'DELETE':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_firewall_policies(
+        self, method, url, body, headers
+    ):
+
+        if method == 'POST':
+            body = self.fixtures.load('describe_firewall_policy.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+        if method == 'GET':
+            body = self.fixtures.load('list_firewall_policies.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_firewall_policy_fw_id(
+        self, method, url, body, headers
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('describe_firewall_policy.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+        if method == 'DELETE':
+            body = self.fixtures.load('describe_firewall_policy.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_servers_srv_id_ips_ip_id_firewall_policy(
+        self, method, url, body, header
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('describe_id_firewall_policy.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'DELETE':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'POST':
+            body = self.fixtures.load('describe_server.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_shared_storages(
+        self, method, url, body, header
+    ):
+        if method == 'GET' or method == 'POST':
+            body = self.fixtures.load('list_shared_storages.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_shared_storages_storage_1(
+        self, method, url, body, header
+    ):
+        if method == 'GET' or method == 'DELETE':
+            body = self.fixtures.load('shared_storage.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_shared_storages_storage_1_servers(
+        self, method, url, body, header
+    ):
+        if method == 'POST' or method == 'DELETE':
+            body = self.fixtures.load('shared_storage.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_shared_storages_storage_1_servers_srv_1(
+        self, method, url, body, header
+    ):
+        if method == 'GET' or method == 'DELETE':
+            body = self.fixtures.load('shared_storage.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_load_balancers(
+        self, method, url, body, header
+    ):
+        if method == 'POST':
+            body = self.fixtures.load('load_balancer.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'GET':
+            body = self.fixtures.load('list_load_balancer.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_load_balancers_lb_1(
+        self, method, url, body, header
+    ):
+
+        body = self.fixtures.load('load_balancer.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_load_balancers_lb_1_server_ips(
+        self, method, url, body, header
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('load_balancer_server_ips.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+        if method == 'POST':
+            body = self.fixtures.load('load_balancer.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_load_balancers_lb_1_rules(
+        self, method, url, body, header
+    ):
+        if method == 'POST':
+            body = self.fixtures.load('load_balancer.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'GET':
+            body = self.fixtures.load('load_balancer_rules.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_load_balancers_lb_1_server_ips_srv_1(
+        self, method, url, body, header
+    ):
+        if method == 'DELETE':
+            body = self.fixtures.load('load_balancer.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+        if method == 'GET':
+            body = self.fixtures.load('load_balancer_server_ip.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_load_balancers_lb_1_rules_rule_1(
+        self, method, url, body, header
+    ):
+        if method == 'DELETE':
+            body = self.fixtures.load('load_balancer.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'GET':
+            body = self.fixtures.load('load_balancer_rule.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_public_ips(
+        self, method, url, body, header
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('list_public_ips.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'POST':
+            body = self.fixtures.load('public_ip.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_public_ips_ip_1(
+        self, method, url, body, header
+    ):
+        body = self.fixtures.load('public_ip.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies(
+        self, method, url, body, header
+    ):
+        if method == 'POST':
+            body = self.fixtures.load('monitoring_policy.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+        if method == 'GET':
+            body = self.fixtures.load('list_monitoring_policies.json')
+            return (
+                httplib.OK,
+                body,
+                {},
+                httplib.responses[httplib.OK]
+            )
+
+    def _v1_monitoring_policies_pol_1(
+        self, method, url, body, header
+    ):
+        body = self.fixtures.load('monitoring_policy.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies_pol_1_ports(
+        self, method, url, body, header
+    ):
+        body = self.fixtures.load('monitoring_policy_ports.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies_pol_1_ports_port_1(
+        self, method, url, body, header
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('monitoring_policy_port.json')
+        elif method == 'POST':
+            body = self.fixtures.load('monitoring_policy.json')
+
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies_pol_1_processes(
+        self, method, url, body, header
+    ):
+        body = self.fixtures.load('monitoring_policy_processes.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies_pol_1_processes_proc_1(
+        self, method, url, body, header
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('monitoring_policy_process.json')
+        elif method == 'POST':
+            body = self.fixtures.load('monitoring_policy.json')
+
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies_pol_1_servers(
+        self, method, url, body, header
+    ):
+        body = self.fixtures.load('monitoring_policy_servers.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_monitoring_policies_pol_1_servers_serv_1(
+        self, method, url, body, header
+    ):
+        if method == 'GET':
+            body = self.fixtures.load('monitoring_policy_servers.json')
+        elif method == 'POST':
+            body = self.fixtures.load('monitoring_policy.json')
+
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+    def _v1_servers_fixed_instance_sizes(
+        self, method, url, body, header
+    ):
+        body = self.fixtures.load('fixed_instance_sizes.json')
+        return (
+            httplib.OK,
+            body,
+            {},
+            httplib.responses[httplib.OK]
+        )
+
+
+if __name__ == '__main__':
+    sys.exit(unittest.main())

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/secrets.py-dist
----------------------------------------------------------------------
diff --git a/libcloud/test/secrets.py-dist b/libcloud/test/secrets.py-dist
index 2c21f84..6018a2a 100644
--- a/libcloud/test/secrets.py-dist
+++ b/libcloud/test/secrets.py-dist
@@ -28,6 +28,7 @@ HOSTINGCOM_PARAMS = ('user', 'secret')
 IBM_PARAMS = ('user', 'secret')
 ONAPP_PARAMS = ('key',)
 # OPENSTACK_PARAMS = ('user_name', 'api_key', secure_bool, 'host', port_int)
+ONEANDONE_PARAMS =('token')
 OPENSTACK_PARAMS = ('user_name', 'api_key', False, 'host', 8774)
 OPENNEBULA_PARAMS = ('user', 'key')
 DIMENSIONDATA_PARAMS = ('user', 'password')


[04/11] libcloud git commit: 1&1 Compute Driver

Posted by an...@apache.org.
1&1 Compute Driver


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/ff028ae2
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/ff028ae2
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/ff028ae2

Branch: refs/heads/trunk
Commit: ff028ae26b232e808f303e680aa0d6737224f605
Parents: 419c694
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Apr 11 00:19:46 2017 +0200
Committer: jasminSPC <ja...@stackpointcloud.com>
Committed: Tue Apr 11 00:19:46 2017 +0200

----------------------------------------------------------------------
 docs/compute/drivers/oneandone.rst              |   295 +
 .../compute/oneandone/create_firewall_policy.py |    33 +
 .../compute/oneandone/create_load_balancer.py   |    36 +
 .../oneandone/create_monitoring_policy.py       |    90 +
 docs/examples/compute/oneandone/create_node.py  |    36 +
 .../compute/oneandone/create_private_network.py |    14 +
 .../compute/oneandone/create_public_ip.py       |    14 +
 .../compute/oneandone/create_shared_storage.py  |    21 +
 .../compute/oneandone/instantiate_driver.py     |     9 +
 libcloud/common/base.py                         |     1 +
 libcloud/compute/drivers/oneandone.py           |  2263 +++
 libcloud/compute/providers.py                   |     2 +
 libcloud/compute/types.py                       |     1 +
 .../compute/fixtures/oneandone/auth_error.json  |     5 +
 .../compute/fixtures/oneandone/create_node.json |    43 +
 .../oneandone/describe_firewall_policy.json     |    26 +
 .../oneandone/describe_id_firewall_policy.json  |     4 +
 .../fixtures/oneandone/describe_server.json     |    49 +
 .../oneandone/describe_shared_stoage.json       |    29 +
 .../fixtures/oneandone/ex_list_datacenters.json |    26 +
 .../oneandone/fixed_instance_sizes.json         |    70 +
 .../compute/fixtures/oneandone/get_image.json   |    24 +
 .../fixtures/oneandone/get_server_image.json    |     4 +
 .../oneandone/list_firewall_policies.json       |    54 +
 .../compute/fixtures/oneandone/list_images.json | 17941 +++++++++++++++++
 .../fixtures/oneandone/list_load_balancer.json  |    78 +
 .../oneandone/list_monitoring_policies.json     |   152 +
 .../fixtures/oneandone/list_public_ips.json     |    59 +
 .../fixtures/oneandone/list_servers.json        |   197 +
 .../oneandone/list_shared_storages.json         |    64 +
 .../fixtures/oneandone/load_balancer.json       |    38 +
 .../fixtures/oneandone/load_balancer_rule.json  |     7 +
 .../fixtures/oneandone/load_balancer_rules.json |    16 +
 .../oneandone/load_balancer_server_ip.json      |     5 +
 .../oneandone/load_balancer_server_ips.json     |     6 +
 .../fixtures/oneandone/monitoring_policy.json   |    73 +
 .../oneandone/monitoring_policy_port.json       |     7 +
 .../oneandone/monitoring_policy_ports.json      |    16 +
 .../oneandone/monitoring_policy_process.json    |     6 +
 .../oneandone/monitoring_policy_processes.json  |    14 +
 .../oneandone/monitoring_policy_servers.json    |    10 +
 .../compute/fixtures/oneandone/public_ip.json   |    15 +
 .../fixtures/oneandone/server_hardware.json     |    13 +
 .../compute/fixtures/oneandone/server_ip.json   |     8 +
 .../compute/fixtures/oneandone/server_ips.json  |    10 +
 .../fixtures/oneandone/shared_storage.json      |    24 +
 .../test/compute/fixtures/oneandone/ttt.json    |    73 +
 libcloud/test/compute/test_oneandone.py         |  1281 ++
 libcloud/test/secrets.py-dist                   |     1 +
 49 files changed, 23263 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/compute/drivers/oneandone.rst
----------------------------------------------------------------------
diff --git a/docs/compute/drivers/oneandone.rst b/docs/compute/drivers/oneandone.rst
new file mode 100644
index 0000000..9145124
--- /dev/null
+++ b/docs/compute/drivers/oneandone.rst
@@ -0,0 +1,295 @@
+1&1 Compute Driver Documentation
+================================
+
+`1&1` is one of the world's largest hosting providers. We offer a range of services, including hosting solutions, domains, and websites.
+
+The data centers/availability zones are located in:
+
+- United States of America (US)
+- Germany (DE)
+- United Kingdom or Great Britain and Northern Ireland (GB)
+- Spain (ES)
+
+Instantiating a Driver
+----------------------
+
+To instantiate a driver you will need to pass the API key using the following constructor parameter:
+
+* ``key`` - Your 1&1 API Key
+
+You can obtain your API key in the `1&1 Cloud Panel` under Management ->
+Users where an API key will be generated.
+
+With a newly-generated API token you can instantiate a driver using:
+
+.. literalinclude:: /examples/compute/oneandone/instantiate_driver.py
+   :language: python
+
+
+1&1 Implementation of Libcloud
+------------------------------
+
+The 1&1 driver implements the following ``NodeDriver`` functions:
+
+* ``list_sizes`` - Returns a list of ``NodeSize``
+* ``list_locations`` - Returns a list of ``NodeLocation``
+* ``list_images`` - Returns a list of ``NodeImage``
+* ``get_image`` - Returns a ``NodeImage``
+* ``create_node`` - Creates a ``Node``
+* ``list_nodes`` - Returns a list of ``Node``
+* ``destroy_node`` - Destroys an existing ``Node``
+* ``reboot_node`` - Reboots a ``Node``
+
+1&1 Extension Functions
+-----------------------
+
+Server Functions
+-----------------
+* ``ex_rename_server`` - Allows you to change server name and description
+* ``ex_get_server_hardware`` - Returns server's hardware specification
+* ``ex_modify_server_hardware`` - Updates server hardware
+* ``ex_modify_server_hdd`` - Updates a single server HDD
+* ``ex_add_hdd`` - Adds a new HDD to server
+* ``ex_remove_hdd`` - Removes a HDD from server
+* ``ex_list_datacenters`` - Returns a list of available 1&1 data centers
+* ``ex_get_server`` - Gets a server
+* ``ex_shutdown_server`` - Shuts down a server
+* ``ex_get_server_image`` - Gets server image
+* ``ex_reinstall_server_image`` - Installs a new image on the server
+* ``ex_list_server_ips`` -  Gets all server IP objects
+* ``ex_assign_server_ip`` - Assigns a new IP address to the server
+* ``ex_remove_server_ip`` - Removes an IP address from the server
+* ``ex_get_server_firewall_policies`` - Gets a firewall policy attached to the server's IP address
+* ``ex_remove_server_firewall_policy`` - Removes a firewall policy from  the server's IP address
+* ``ex_add_server_firewall_policy`` - Adds a firewall policy to the server's IP address
+
+Monitoring Policy Functions
+---------------------------
+* ``ex_list_monitoring_policies`` - Lists all monitoring policies
+* ``ex_create_monitoring_policy`` - Creates a monitoring policy
+* ``ex_delete_monitoring_policy`` - Deletes a monitoring policy
+* ``ex_update_monitoring_policy`` - Updates monitoring policy
+* ``ex_get_monitoring_policy`` - Fetches a monitoring policy
+* ``ex_get_monitoring_policy_ports`` - Fetches monitoring policy ports
+* ``ex_get_monitoring_policy_port`` - Fetches monitoring policy port
+* ``ex_remove_monitoring_policy_port`` - Removes monitoring policy port
+* ``ex_add_monitoring_policy_ports`` - Adds monitoring policy ports
+* ``ex_get_monitoring_policy_processes`` - Fetches monitoring policy processes
+* ``ex_get_monitoring_policy_process`` - Fetches monitoring policy process
+* ``ex_remove_monitoring_policy_process`` - Removes monitoring policy process
+* ``ex_add_monitoring_policy_processes`` - Adds monitoring policy processes
+* ``ex_list_monitoring_policy_servers`` - List all servers that are being monitored by the policy
+* ``ex_add_servers_to_monitoring_policy`` - Adds servers to monitoring policy
+* ``ex_remove_server_from_monitoring_policy`` - Removes a server from monitoring policy
+
+Shared Storage Functions
+------------------------
+* ``ex_list_shared_storages`` - Lists shared storages
+* ``ex_get_shared_storage`` - Gets a shared storage
+* ``ex_create_shared_storage`` - Creates a shared storage
+* ``ex_delete_shared_storage`` - Removes a shared storage
+* ``ex_attach_server_to_shared_storage`` - Attaches a single server to a shared storage
+* ``ex_get_shared_storage_server`` - Gets a shared storage's server
+* ``ex_detach_server_from_shared_storage`` - Detaches a server from shared storage
+
+Public IP Functions
+-------------------
+* ``ex_list_public_ips`` - Lists all public IP addresses
+* ``ex_create_public_ip`` - Creates a public IP
+* ``ex_get_public_ip`` - Gets a public IP
+* ``ex_delete_public_ip`` - Deletes a public IP
+* ``ex_update_public_ip`` - Updates a Public IP
+
+Private Network Functions
+-------------------------
+* ``ex_list_private_networks`` - Lists all private networks
+* ``ex_create_private_network`` - Creates a private network
+* ``ex_delete_private_network`` - Deletes a private network
+* ``ex_update_private_network`` - Updates a private network
+* ``ex_list_private_network_servers`` - Lists all private network servers
+* ``ex_add_private_network_server`` - Adds servers to private network
+* ``ex_remove_server_from_private_network`` - Removes a server from the private network
+
+Load Balancer Functions
+-----------------------
+* ``ex_create_load_balancer`` - Creates a load balancer
+* ``ex_update_load_balancer`` - Updates a load balancer
+* ``ex_add_servers_to_load_balancer`` - Adds servers to a load balancers
+* ``ex_remove_server_from_load_balancer`` - Removes a server from a load balancer
+* ``ex_add_load_balancer_rule`` - Adds a rule to a load balancer
+* ``ex_remove_load_balancer_rule`` - Removes a rule from a load balancer
+* ``ex_list_load_balancers`` - Lists all load balancers
+* ``ex_get_load_balancer`` - Gets a load balancer
+* ``ex_list_load_balancer_server_ips`` - Lists load balanced server IP addresses
+* ``ex_get_load_balancer_server_ip`` - Gets a balanced server IP address
+* ``ex_list_load_balancer_rules`` - Lists load balancer rules
+* ``ex_get_load_balancer_rule`` - Gets a load balancer rule
+* ``ex_delete_load_balancer`` - Deletes a load balancer
+
+Firewall Policy Functions
+-------------------------
+* ``ex_create_firewall_policy`` - Creates a firewall policy
+* ``ex_list_firewall_policies`` - Lists firewall policies
+* ``ex_get_firewall_policy`` - Gets a firewall policy
+* ``ex_delete_firewall_policy`` - Deletes a firewall policy
+
+Create a Node
+-------------
+
+To create a node on 1&1 using Libcloud, follow this example:
+
+.. literalinclude:: /examples/compute/oneandone/create_node.py
+   :language: python
+
+This example will create a 1&1 server using 'S' as a small instance in  the 'ES' (spain) data center.
+
+`create_node` has the following parameters:
+
+Required parameters:
+
+* ``name`` - Desired node name. Must be unique.
+* ``image`` - Image ID retrieved from `list_images`.
+* ``ex_fixed_instance_size_id`` - This is an ID of a flavor.
+
+Optional parameters:
+
+* ``auth`` - Password for the server. If none is provided, 1&1 will generate one for you, and return it in the response.
+* ``location`` - Desired `NodeLocation`
+* ``ex_ip`` - ID of a public IP address which can be created using `ex_create_public_ip`.
+* ``ex_monitoring_policy_id`` - Id of a monitoring policy which can be created using `ex_create_monitoring_policy`.
+* ``ex_firewall_policy_id`` - Id of a firewall policy which can be create using `ex_create_firewall_policy`.
+* ``ex_loadbalancer_id`` - Id of a load balancer which can be create using `ex_create_load_balancer`.
+* ``ex_description`` - Description for the server.
+* ``ex_power_on`` - A boolean indicating whether a server will be `POWERED_ON` or `POWERED_OFF` when provisioned.
+
+
+Create a Firewall Policy
+------------------------
+
+To create a firewall policy, follow this example:
+
+.. literalinclude:: /examples/compute/oneandone/create_firewall_policy.py
+   :language: python
+
+This example will create a firewall policy with a TCP rule allowing access on port 80.
+
+`ex_create_firewall_policy` has the following parameters:
+
+Required parameters:
+
+* ``name`` - Desired name for the firewall policy. Must be unique.
+* ``rules`` - ``list`` of ``dict``:
+  * ``protocol`` - One of the follwing protocols can be set TCP, UDP, TCP/UDP, ICMP, IPSEC.
+  * ``port_from`` - Port range start. Must be between 1 and 65535.
+  * ``port_to`` - Port range end. Must be between 1 and 65535.
+  * ``source`` - Source IP address.
+
+
+Optional parameters:
+
+* ``description`` - Description of the firewall policy.
+
+
+Create a Monitoring Policy
+--------------------------
+
+To create a monitoring policy, follow this example:
+
+.. literalinclude:: /examples/compute/oneandone/create_monitoring_policy.py
+   :language: python
+
+`ex_create_monitoring_policy` has the following parameters:
+
+Required parameters:
+
+* ``name`` - Desired name for the monitoring policy. Must be unique.
+* ``thresholds`` - ``dict`` of thresholds to be monitored. See the example
+* ``ports`` - ``list`` of  ``dict`` defining which ports are to be monitored. See the example.
+* ``processes`` - ``list`` of  ``dict`` defining which processes are to be monitored. See the example.
+
+Optional parameters:
+
+* ``description`` - Description of the monitoring policy.
+* ``email`` - Email address where notifications will be sent.
+* ``agent`` - Indicating whether an agent application should be installed on the host.
+
+Create a Shared Storage
+-----------------------
+
+To create a shared storage, follow this example:
+
+.. literalinclude:: /examples/compute/oneandone/create_shared_storage.py
+   :language: python
+
+Required parameters:
+
+* ``name`` - ``str`` Desired name for the shared storage. Must be unique.
+* ``size`` - ``int`` Size of the shared storage.
+* ``datacenter_id`` - ``str`` 1&1 data center.
+
+Optional parameters:
+
+* ``description`` - Description of the shared storage.
+
+Create a Load Balancer
+----------------------
+
+
+To create a load balancer, follow this example:
+
+  .. literalinclude:: /examples/compute/oneandone/create_load_balancer.py
+   :language: python
+
+Required parameters:
+
+* ``name`` - ``str`` Desired name for the shared storage. Must be unique.
+* ``method`` - ``str``
+* ``rules`` - ``list`` of ``dict``
+
+Optional parameters:
+
+* ``persistence``
+* ``persistence_time``
+* ``health_check_test``
+* ``health_check_interval``
+* ``health_check_path``
+* ``health_check_parser``
+* ``datacenter_id``
+* ``description``
+
+
+Create a Public IP
+------------------
+
+To create a public IP address, follow this example:
+
+  .. literalinclude:: /examples/compute/oneandone/create_public_ip.py
+   :language: python
+
+Required parameters:
+
+* ``type`` - ``str`` IPV4 or IPV6
+
+Optional parameters:
+
+* ``reverse_dns`` - ``str``
+* ``datacenter_id`` - ``str`` 1&1 Datacenter
+
+
+Create a Private Network
+------------------------
+
+To create a private network, follow this example:
+
+  .. literalinclude:: /examples/compute/oneandone/create_private_network.py
+   :language: python
+
+Required parameters:
+
+* ``name`` - ``str`` name of the public network.
+
+Optional parameters:
+
+* ``datacenter_id`` - ``str``
+* ``network_address``
+* ``subnet_mask``

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_firewall_policy.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_firewall_policy.py b/docs/examples/compute/oneandone/create_firewall_policy.py
new file mode 100644
index 0000000..74db619
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_firewall_policy.py
@@ -0,0 +1,33 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+my_rules = [
+    {
+        "protocol": "TCP",
+        "port_from": 80,
+        "port_to": 80,
+        "source": "0.0.0.0"
+    },
+    {
+        "protocol": "TCP",
+        "port_from": 443,
+        "port_to": 443,
+        "source": "0.0.0.0"
+    }
+]
+
+print(type(my_rules))
+
+try:
+    fw_policy = drv.ex_create_firewall_policy(
+        name='Firewall Policy',
+        rules=my_rules,
+        description='FW Policy Description')
+    print(fw_policy)
+except Exception as e:
+    print(e)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_load_balancer.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_load_balancer.py b/docs/examples/compute/oneandone/create_load_balancer.py
new file mode 100644
index 0000000..5e08ed9
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_load_balancer.py
@@ -0,0 +1,36 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+rules = [
+    {
+        "protocol": "TCP",
+        "port_balancer": 80,
+        "port_server": 80,
+        "source": "0.0.0.0"
+    },
+    {
+        "protocol": "TCP",
+        "port_balancer": 9999,
+        "port_server": 8888,
+        "source": "0.0.0.0"
+    }
+]
+
+try:
+    shared_storage = drv.ex_create_load_balancer(
+        name="Test Load Balancer",
+        method='ROUND_ROBIN',
+        rules=rules,
+        persistence=False,
+        persistence_time=1200,
+        health_check_test='TCP',
+        health_check_interval=40)
+
+    print(shared_storage)
+except Exception as e:
+    print(e)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_monitoring_policy.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_monitoring_policy.py b/docs/examples/compute/oneandone/create_monitoring_policy.py
new file mode 100644
index 0000000..d84b80d
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_monitoring_policy.py
@@ -0,0 +1,90 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+ports = [
+    {
+        "protocol": "TCP",
+        "port": 443,
+        "alert_if": "NOT_RESPONDING",
+        "email_notification": True
+    }
+]
+
+processes = [
+    {
+        "process": "httpdeamon",
+        "alert_if": "NOT_RUNNING",
+        "email_notification": False
+    }
+]
+thresholds = {
+    "cpu": {
+        "warning": {
+            "value": 90,
+            "alert": False
+        },
+        "critical": {
+            "value": 95,
+            "alert": False
+        }
+    },
+    "ram": {
+        "warning": {
+            "value": 90,
+            "alert": False
+        },
+        "critical": {
+            "value": 95,
+            "alert": False
+        }
+    },
+    "disk": {
+        "warning": {
+            "value": 80,
+            "alert": False
+        },
+        "critical": {
+            "value": 90,
+            "alert": False
+        }
+    },
+    "transfer": {
+        "warning": {
+            "value": 1000,
+            "alert": False
+        },
+        "critical": {
+            "value": 2000,
+            "alert": False
+        }
+    },
+    "internal_ping": {
+        "warning": {
+            "value": 50,
+            "alert": False
+        },
+        "critical": {
+            "value": 100,
+            "alert": True
+        }
+    }
+}
+
+try:
+    monitoring_policy = drv.ex_create_monitoring_policy(
+        name='Monitoring Policy',
+        ports=ports,
+        thresholds=thresholds,
+        processes=processes,
+        description='Monitoring Policy Description',
+        email="test@test.com",
+        agent=True
+    )
+    print(monitoring_policy)
+except Exception as e:
+    print(e)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_node.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_node.py b/docs/examples/compute/oneandone/create_node.py
new file mode 100644
index 0000000..444de7d
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_node.py
@@ -0,0 +1,36 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+# First we need to get all avaliable sizes
+sizes = drv.list_sizes()
+
+# Then we select one we want to use to create a node. We pick 'S' as small.
+desired_size = [size for size in sizes if size.name == 'S']
+
+# Let's get all available images
+images = drv.list_images('IMAGE')
+
+# Now we select an image we want to install on to the node.
+# We pick Ubuntu 14.04
+desired_image = \
+    [img for img in images if 'ubuntu1404-64min' in img.name.lower()]
+
+# This step is optional.
+# Then we get the list of available datacenters (locations)
+locations = drv.list_locations()
+
+# And we pick one in this case Spain (ES)
+desired_location = [loc for loc in locations if loc.name == 'ES']
+
+# Now let's create that node:
+node = drv.create_node(name="Libcloud Test Node2",
+                       image=desired_image[0],
+                       ex_fixed_instance_size_id=desired_size[0].id,
+                       location=desired_location[0])
+
+print(node)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_private_network.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_private_network.py b/docs/examples/compute/oneandone/create_private_network.py
new file mode 100644
index 0000000..c6adb70
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_private_network.py
@@ -0,0 +1,14 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+try:
+    public_network = drv.ex_create_private_network(
+        name='TestPN')
+    print(public_network)
+except Exception as e:
+    print(e)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_public_ip.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_public_ip.py b/docs/examples/compute/oneandone/create_public_ip.py
new file mode 100644
index 0000000..ec76e05
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_public_ip.py
@@ -0,0 +1,14 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+try:
+    public_ip = drv.ex_create_public_ip(
+        type='IPV4')
+    print(public_ip)
+except Exception as e:
+    print(e)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/create_shared_storage.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/create_shared_storage.py b/docs/examples/compute/oneandone/create_shared_storage.py
new file mode 100644
index 0000000..dbec592
--- /dev/null
+++ b/docs/examples/compute/oneandone/create_shared_storage.py
@@ -0,0 +1,21 @@
+import os
+
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+cls = get_driver(Provider.ONEANDONE)
+drv = cls(key=os.environ.get('ONEANDONE_TOKEN'))
+
+locations = drv.list_locations()
+
+desired_location = [loc for loc in locations if loc.name == 'ES']
+
+try:
+    shared_storage = drv.ex_create_shared_storage(
+        name="Test Shared Storage", size=50,
+        datacenter_id=desired_location[0].id,
+        description=None
+    )
+    print(shared_storage)
+except Exception as e:
+    print(e)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/docs/examples/compute/oneandone/instantiate_driver.py
----------------------------------------------------------------------
diff --git a/docs/examples/compute/oneandone/instantiate_driver.py b/docs/examples/compute/oneandone/instantiate_driver.py
new file mode 100644
index 0000000..9111925
--- /dev/null
+++ b/docs/examples/compute/oneandone/instantiate_driver.py
@@ -0,0 +1,9 @@
+from libcloud.compute.types import Provider
+from libcloud.compute.providers import get_driver
+
+# First we need to instantiate desired libcoud driver.
+cls = get_driver(Provider.ONEANDONE)
+
+token = 'your_token'
+# Then pass in your security token
+drv = cls(key=token)

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/common/base.py
----------------------------------------------------------------------
diff --git a/libcloud/common/base.py b/libcloud/common/base.py
index c5759f3..f6826d2 100644
--- a/libcloud/common/base.py
+++ b/libcloud/common/base.py
@@ -514,6 +514,7 @@ class Connection(object):
 
     def request(self, action, params=None, data=None, headers=None,
                 method='GET', raw=False, stream=False):
+
         """
         Request a given `action`.
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/compute/drivers/oneandone.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/oneandone.py b/libcloud/compute/drivers/oneandone.py
new file mode 100644
index 0000000..a33fe3d
--- /dev/null
+++ b/libcloud/compute/drivers/oneandone.py
@@ -0,0 +1,2263 @@
+# 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.
+"""
+1&1 Cloud Server Compute driver
+"""
+import json
+
+from libcloud.compute.providers import Provider
+from libcloud.common.base import JsonResponse, ConnectionKey
+from libcloud.compute.base import NodeSize, NodeImage, NodeLocation, \
+    Node, NodeAuthPassword, NodeAuthSSHKey
+from libcloud.common.types import InvalidCredsError
+from libcloud.compute.types import NodeState
+from libcloud.utils.py3 import httplib
+from libcloud.compute.base import NodeDriver
+
+from time import sleep
+
+API_HOST = 'cloudpanel-api.1and1.com'
+API_VERSION = '/v1/'
+
+__all__ = [
+    'API_HOST',
+    'API_VERSION',
+    'OneAndOneResponse',
+    'OneAndOneConnection',
+    'OneAndOneNodeDriver'
+]
+
+
+class OneAndOneResponse(JsonResponse):
+    """
+    OneAndOne response parsing.
+    """
+    valid_response_codes = [httplib.OK, httplib.CREATED, httplib.ACCEPTED]
+
+    def parse_error(self):
+
+        if self.status == httplib.UNAUTHORIZED:
+            body = self.parse_body()
+            raise InvalidCredsError(body['message'])
+        else:
+            body = self.parse_body()
+            if 'message' in body:
+                error = '%s (code: %s)' % (body['message'], self.status)
+            else:
+                error = body
+            return error
+
+    def success(self):
+        return self.status in self.valid_response_codes
+
+
+class OneAndOneConnection(ConnectionKey):
+    """
+    Connection class for the 1&1 driver
+    """
+
+    host = API_HOST
+    api_prefix = API_VERSION
+    responseCls = OneAndOneResponse
+
+    def encode_data(self, data):
+        return json.dumps(data)
+
+    def add_default_headers(self, headers):
+        """
+        Add headers that are necessary for every request
+
+        This method adds ``token`` and ``Content-Type`` to the request.
+        """
+        headers['X-Token'] = self.key
+        headers['Content-Type'] = 'application/json'
+        return headers
+
+    def request(self, action, params=None, data=None, headers=None,
+                method='GET', raw=False):
+        """
+        Some requests will use the href attribute directly.
+        If this is not the case, then we should formulate the
+        url based on the action specified.
+        If we are using a full url, we need to remove the
+        host and protocol components.
+        """
+        action = self.api_prefix + action.lstrip('/')
+
+        return super(OneAndOneConnection, self). \
+            request(action=action,
+                    params=params,
+                    data=data,
+                    headers=headers,
+                    method=method,
+                    raw=raw)
+
+
+class OneAndOneNodeDriver(NodeDriver):
+    """
+      Base OneAndOne node driver.
+    """
+    connectionCls = OneAndOneConnection
+    name = '1and1'
+    website = 'http://www.1and1.com'
+    type = Provider.ONEANDONE
+
+    NODE_STATE_MAP = {
+        'POWERING_ON': NodeState.STARTING,
+        'POWERING_OFF': NodeState.PENDING,
+        'POWERED_OFF': NodeState.STOPPING,
+        'POWERED_ON': NodeState.RUNNING,
+        'REBOOTING': NodeState.REBOOTING,
+        'CONFIGURING': NodeState.RECONFIGURING,
+        'REMOVING': NodeState.UNKNOWN,
+        'DEPLOYING': NodeState.STARTING,
+    }
+
+    """
+    Core Functions
+    """
+
+    def list_sizes(self):
+        """
+        Lists all sizes
+
+        :return: A list of all configurable node sizes.
+        :rtype: ``list`` of :class:`NodeSize`
+        """
+        sizes = []
+
+        fixed_instances = self._list_fixed_instances()
+        for value in fixed_instances:
+            node_size = self._to_node_size(value)
+            sizes.append(node_size)
+
+        return sizes
+
+    def list_locations(self):
+        """
+        Lists all locations
+
+        :return: ``list`` of :class:`NodeLocation`
+        :rtype: ``list``
+        """
+        datacenters = self.ex_list_datacenters()
+        locations = []
+        for values in datacenters:
+            node_size = self._to_location(values)
+            locations.append(node_size)
+
+        return locations
+
+    def list_images(self, image_type=None):
+        """
+        :return: ``list`` of :class: `NodeImage`
+        :rtype: ``list``
+        """
+        response = self.connection.request(
+            action='server_appliances',
+            method='GET'
+        )
+
+        return self._to_images(response.object, image_type)
+
+    def get_image(self, image_id):
+        response = self.connection.request(
+            action='server_appliances/%s' % image_id,
+            method='GET'
+        )
+        return self._to_image(response.object)
+
+    """
+    Node functions
+    """
+
+    def create_node(self,
+                    name,
+                    image,
+                    ex_fixed_instance_size_id,
+                    location=None,
+                    auth=None,
+                    ex_ip=None,
+                    ex_monitoring_policy_id=None,
+                    ex_firewall_policy_id=None,
+                    ex_loadbalancer_id=None,
+                    ex_description=None,
+                    ex_power_on=None):
+        """
+        Creates a node.
+
+        :param name: The name of the new node
+        :type ```str```
+
+        :param image: Image from list_images
+        :rtype: ``NodeImage``
+
+        :param ex_fixed_instance_size_id:
+        Fixed instance size ID from list_sizes
+        :rtype: ``str``
+
+        :param location: 1&1 Data center Location
+        :type ```NodeLocation```
+
+        :param auth: SSH key or root password
+        :type: :class:`NodeAuthSSHKey` or :class:`NodeAuthPassword`
+
+        :param ex_ip: IP address
+        :type ```str```
+
+        :param ex_ssh_key: SSH Key
+        :type ```str```
+
+        :param password: Password
+        :type ```str```
+
+        :param ex_monitoring_policy_id:
+        :type ```str```
+
+        :param ex_firewall_policy_id:
+        :type ```str```
+
+        :param ex_loadbalancer_id:
+        :type ```str```
+
+        :param ex_description:
+        :type ```str```
+
+        :param ex_power_on:
+        :type ```bool```
+
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        body = {
+            "name": name,
+            "appliance_id": image.id,
+            "hardware": {
+                "fixed_instance_size_id": ex_fixed_instance_size_id
+            },
+        }
+
+        if location is not None:
+            body['datacenter_id'] = location.id
+        if ex_power_on is not None:
+            body["power_on"] = ex_power_on
+
+        if ex_description is not None:
+            body["description"] = ex_description
+
+        if ex_firewall_policy_id is not None:
+            body["firewall_policy_id"] = ex_firewall_policy_id
+
+        if ex_monitoring_policy_id is not None:
+            body["monitoring_policy_id"] = ex_monitoring_policy_id
+
+        if ex_loadbalancer_id is not None:
+            body["loadbalancer_id"] = ex_loadbalancer_id
+
+        if auth is not None:
+            if isinstance(auth, NodeAuthPassword):
+                body["password"] = auth.password
+            elif isinstance(auth, NodeAuthSSHKey):
+                body["rsa_key"] = auth.pubkey
+        if ex_ip is not None:
+            body["ip_id"] = ex_ip
+
+        response = self.connection.request(
+            action="servers",
+            data=body,
+            method='POST',
+        )
+
+        return self._to_node(response.object)
+
+    def list_nodes(self):
+        """
+        List all nodes.
+
+        :return: ``list`` of :class:`Node`
+        :rtype: ``list``
+        """
+        response = self.connection.request(
+            action='servers',
+            method='GET'
+        )
+
+        return self._to_nodes(response.object)
+
+    def destroy_node(self, node, ex_keep_ips=False):
+        """
+        Destroys a node.
+
+        :param node: The node you wish to destroy.
+        :type volume: :class:`Node`
+
+        :param ex_keep_ips: True to keep all IP addresses assigned to the node
+        :type ex_keep_ips: : ``bool``
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+        self.ex_shutdown_server(node.id)
+
+        self._wait_for_state(node.id, 'POWERED_OFF')
+
+        response = self.connection.request(
+            action='servers/%s' % node.id,
+            params={'keep_ips': ex_keep_ips},
+            method='DELETE'
+        )
+
+        return self._to_node(response.object)
+
+    def reboot_node(self, node):
+        """
+        Reboots the node.
+
+        :param node: The node you wish to destroy.
+        :type volume: :class:`Node`
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+        shutdown_body = {
+            "action": "REBOOT",
+            "method": "HARDWARE"
+        }
+        response = self.connection.request(
+            action='servers/%s/status/action' % node.id,
+            data=shutdown_body,
+            method='PUT',
+        )
+        return self._to_node(response.object)
+
+    """
+    Extension functions
+    """
+
+    def ex_rename_server(self, server_id, name=None, description=None):
+        """
+        Renames the server
+        :param  server_id: ID of the server you want to rename
+        :param  name: New name of the server
+        :rtype: ``str``
+
+        :param description: New description of the server
+        :rtype: ``str``
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        body = {}
+        if name is not None:
+            body["name"] = name
+        if description is not None:
+            body["description"] = description
+
+        response = self.connection.request(
+            action='servers/%s' % server_id,
+            data=body,
+            method='PUT'
+        )
+
+        return self._to_node(response.object)
+
+    def ex_get_server_hardware(self, server_id):
+        """
+        Gets all server hardware
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :return: Server's hardware
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='servers/%s/hardware' % server_id,
+            method='GET'
+        )
+        return response.object
+
+    """
+    Hardware operations
+    """
+
+    def ex_modify_server_hardware(self, server_id,
+                                  fixed_instance_size_id=None, vcore=None,
+                                  cores_per_processor=None, ram=None, ):
+        """
+        Modifies server's hardware
+
+        :param server_id:
+        :rtype: ``str``
+
+        :param fixed_instance_size_id: Id of the fixed instance size
+        :rtype: ``str``
+
+        :param vcore: Virtual cores count
+        :rtype: ``int``
+
+        :param cores_per_processor: Count of cores per procesor
+        :rtype: ``int``
+
+        :param ram: Amount of ram for the server
+        :rtype: ``int```
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        body = {}
+
+        if fixed_instance_size_id is not None:
+            body["firewall_policy_id"] = fixed_instance_size_id
+        if vcore is not None:
+            body["vcore"] = vcore
+        if cores_per_processor is not None:
+            body["cores_per_processor"] = cores_per_processor
+        if ram is not None:
+            body["ram"] = ram
+
+        response = self.connection.request(
+            action='servers/%s/hardware' % server_id,
+            data=body,
+            method='PUT'
+        )
+
+        return self._to_node(response.object)
+
+    """
+    HDD operations
+    """
+
+    def ex_modify_server_hdd(self, server_id, hdd_id=None, size=None):
+        """
+        Modifies server hard disk drives
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param hdd_id: Id of the hard disk
+        :rtype: ``str``
+
+        :param size: Size of the hard disk
+        :rtype: ``str``
+
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        body = {}
+
+        if size is not None:
+            body[size] = size
+
+            response = self.connection.request(
+                action='servers/%s/hardware/hdds/%s' % (server_id, hdd_id),
+                data=body,
+                method='PUT'
+            )
+
+            return self._to_node(response.object)
+
+    def ex_add_hdd(self, server_id, size, is_main):
+        """
+        Add a hard disk to the server
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param size: Size of the new disk
+        :rtype: ``str``
+
+        :param is_main: Indicates if the disk is going to be the boot disk
+        :rtype: ``boolean``
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+        body = {
+            "size": size,
+            "is_main": is_main
+        }
+
+        response = self.connection.request(
+            action='servers/%s/hardware/hdds' % server_id,
+            data=body,
+            method='POST'
+        )
+
+        return self._to_node(response.object)
+
+    def ex_remove_hdd(self, server_id, hdd_id):
+        """
+        Removes existing hard disk
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param hdd_id: Id of the hard disk
+        :rtype: ``str``
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        response = self.connection.request(
+            action='servers/%s/hardware/hdds/%s' % (server_id, hdd_id),
+            method='DELETE'
+        )
+
+        return self._to_node(response.object)
+
+    """
+    Data center operations
+    """
+
+    def ex_list_datacenters(self):
+        """
+        Lists all data centers
+
+        :return: List of data centers
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='datacenters',
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_server(self, server_id):
+        """
+        Gets a server
+
+        :param server_id: Id of the server to be retrieved
+        :rtype: ``str``
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        response = self.connection.request(
+            action='servers/%s' % (server_id),
+            method='GET'
+        )
+
+        return self._to_node(response.object)
+
+    def ex_shutdown_server(self, server_id, method='SOFTWARE'):
+        """
+        Shuts down the server
+
+        :param server_id: Id of the server to be shut down
+        :rtype: ``str``
+
+        :param method: Method of shutting down "SOFTWARE" or "HARDWARE"
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        shutdown_body = {
+            "action": "POWER_OFF",
+            "method": method
+        }
+        response = self.connection.request(
+            action='servers/%s/status/action' % (server_id),
+            data=shutdown_body,
+            method='PUT',
+        )
+        return self._to_node(response.object)
+
+    """
+    Image operations
+    """
+
+    def ex_get_server_image(self, server_id):
+        """
+        Gets server image
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :return: Server image
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='servers/%s/image' % server_id,
+            method='GET'
+        )
+        return response.object
+
+    def ex_reinstall_server_image(self, server_id, image_id, password=None):
+        """
+        Installs a new image on the server
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param image_id: Id of the image (Server Appliance)
+        :rtype: ``str``
+
+        :param password: New password for the server
+
+        :return:    Instance of class ``Node``
+        :rtype:     :class: `Node`
+        """
+
+        body = {
+            "id": image_id,
+        }
+
+        if password is not None:
+            body["password"] = password
+
+        response = self.connection.request(
+            action='servers/%s/image' % server_id,
+            data=body,
+            method='PUT'
+        )
+        return self._to_node(response.object)
+
+    """
+    Server IP operations
+    """
+
+    def ex_list_server_ips(self, server_id):
+        """
+        Gets all server IP objects
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :return: List of server IP objects
+        :rtype: ``list`` of ``dict``
+        """
+        response = self.connection.request(
+            action='servers/%s/ips' % server_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_server_ip(self, server_id, ip_id):
+        """
+        Get a single server IP object
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param ip_id: ID of the IP address
+        :rtype: ``str``
+
+        :return: IP address object
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='servers/%s/ips/%s' % (server_id, ip_id),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_assign_server_ip(self, server_id, ip_type):
+        """
+        Assigns a new IP address to the server
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param ip_type: Type of the IP address [IPV4,IPV6]
+        :rtype: ``str``
+
+        :return: ``Node`` instance
+        :rtype: ``Node``
+        """
+
+        body = {
+            "type": ip_type
+        }
+
+        response = self.connection.request(
+            action='servers/%s/ips' % server_id,
+            data=body,
+            method='POST'
+        )
+
+        return self._to_node(response.object)
+
+    def ex_remove_server_ip(self, server_id, ip_id, keep_ip=None):
+        """
+        Removes an IP address from the server
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param ip_id: ID of the IP address
+        :rtype: ``str``
+
+        :param keep_ip: Indicates whether IP address will be removed from
+        the Cloud Panel
+        :rtype: ``boolean``
+
+        :return: ``Node`` instance
+        :rtype: ``Node``
+        """
+
+        body = {}
+        if keep_ip is not None:
+            body['keep_ip'] = keep_ip
+
+        response = self.connection.request(
+            action='servers/%s/ips/%s' % (server_id, ip_id),
+            data=body,
+            method='DELETE'
+        )
+
+        return self._to_node(response.object)
+
+    def ex_get_server_firewall_policies(self, server_id, ip_id):
+        """
+        Gets a firewall policy of attached to the server's IP
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param ip_id: ID of the IP address
+        :rtype: ``str``
+
+        :return: IP address object
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='/servers/%s/ips/%s/firewall_policy' % (server_id, ip_id),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_remove_server_firewall_policy(self, server_id, ip_id):
+        """
+        Removes a firewall policy from server's IP
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param ip_id: ID of the IP address
+        :rtype: ``str``
+
+        :return: ``Node`` instance
+        :rtype: ``Node``
+        """
+        response = self.connection.request(
+            action='/servers/%s/ips/%s/firewall_policy' % (server_id, ip_id),
+            method='DELETE'
+        )
+
+        return self._to_node(response.object)
+
+    def ex_add_server_firewall_policy(self, server_id, ip_id, firewall_id):
+        """
+        Adds a firewall policy to the server's IP address
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :param ip_id: ID of the IP address
+        :rtype: ``str``
+
+        :param firewall_id: ID of the firewall policy
+        :rtype: ``str``
+
+        :return: ``Node`` instance
+        :rtype: ``Node``
+        """
+        body = {
+            "id": firewall_id
+        }
+        response = self.connection.request(
+            action='/servers/%s/ips/%s/firewall_policy' % (server_id, ip_id),
+            data=body,
+            method='POST'
+        )
+
+        return self._to_node(response.object)
+
+    """
+    Firewall Policy operations
+    """
+
+    def ex_create_firewall_policy(self, name, rules, description=None):
+        """
+        Creates a firewall Policy
+        :param name:
+        :param description:
+        :param rules:
+        :rtype 'dict':  [
+                            {
+                            "protocol": "TCP",
+                            "port_from": 80,
+                            "port_to": 80,
+                            "source": "0.0.0.0"
+                            }
+                        ]
+
+        :return: 'dict' firewall policy
+        """
+        body = {
+            "name": name
+        }
+
+        if description is not None:
+            body['description'] = description
+
+        if len(rules) == 0:
+            raise ValueError(
+                'At least one firewall rule is required.'
+            )
+        else:
+            body["rules"] = rules
+
+        response = self.connection.request(
+            action='firewall_policies',
+            data=body,
+            method='POST',
+        )
+
+        return response.object
+
+    def ex_list_firewall_policies(self):
+        """
+        List firewall policies
+        :return: 'dict'
+        """
+
+        response = self.connection.request(
+            action='firewall_policies',
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_firewall_policy(self, fw_id):
+        """
+        Gets firewall policy
+        :param fw_id: ID of the firewall policy
+        :return: 'dict'
+        """
+
+        response = self.connection.request(
+            action='firewall_policy/%s' % fw_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_delete_firewall_policy(self, fw_id):
+        """
+        Deletes firewall policy
+        :param fw_id: ID of the Firewall
+        :return: 'dict'
+        """
+        response = self.connection.request(
+            action='firewall_policy/%s' % fw_id,
+            method='DELETE'
+        )
+
+        return response.object
+
+    """
+    Shared storage operations
+    """
+
+    def ex_list_shared_storages(self):
+        """
+        List of shared storages
+        :return: 'dict'
+        """
+        response = self.connection.request(
+            action='shared_storages',
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_shared_storage(self, storage_id):
+        """
+                Gets a shared storage
+                :return: 'dict'
+                """
+        response = self.connection.request(
+            action='shared_storages/%s' % (storage_id),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_create_shared_storage(self, name, size, datacenter_id=None,
+                                 description=None):
+        """
+        Creates a shared storage
+        :param name: Name of the storage
+        :param size: Size of the storage
+        :param datacenter_id: datacenter where storage should be created
+        :param description: description ot the  storage
+        :return: 'dict'
+        """
+
+        body = {
+            "name": name,
+            "size": size,
+            "datacenter_id": datacenter_id
+        }
+
+        if description is not None:
+            body['description'] = description
+
+        response = self.connection.request(
+            action='shared_storages',
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_delete_shared_storage(self, storage_id):
+        """
+        Removes a shared storage
+
+        :param storage_id: Id of the shared storage
+        :rtype: ``str``
+
+        :return: Instnace of shared storage
+        :rtype: ``list`` of ``dict``
+        """
+        response = self.connection.request(
+            action='shared_storages/%s' % storage_id,
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_attach_server_to_shared_storage(self, storage_id,
+                                           server_id, rights):
+        """
+        Attaches a single server to a shared storage
+
+        :param storage_id: Id of the shared storage
+        :param server_id: Id of the server to be attached to the shared storage
+        :param rights:
+        :return:
+        :rtype: 'dict'
+        """
+        body = {
+            "severs": [
+                {
+                    "id": server_id,
+                    "rights": rights
+                }
+            ]
+        }
+
+        response = self.connection.request(
+            action='shared_storages/%s/servers' % storage_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_get_shared_storage_server(self, storage_id, server_id):
+        """
+        Gets a shared storage's server
+        :param storage_id:
+        :param server_id:
+        :return:
+        """
+        response = self.connection.request(
+            action='shared_storages/%s/servers/%s' % (storage_id, server_id),
+        )
+
+        return response.object
+
+    def ex_detach_server_from_shared_storage(self, storage_id,
+                                             server_id):
+        """
+        Detaches a server from shared storage
+
+        :param storage_id: Id of the shared storage
+        :rtype: ``str``
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :return: Instance of shared storage
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='shared_storages/%s/servers/%s' % (storage_id, server_id),
+            method='DELETE'
+        )
+
+        return response.object
+
+    """
+    Load Balancers operations
+    """
+
+    def ex_create_load_balancer(self, name, method, rules,
+                                persistence=None,
+                                persistence_time=None,
+                                health_check_test=None,
+                                health_check_interval=None,
+                                health_check_path=None,
+                                health_check_parser=None,
+                                datacenter_id=None,
+                                description=None):
+        """
+
+        :param name: Name of the load balancer
+        :rtype:``str``
+
+        :param method: Load balancer method
+        :rtype:``str``
+
+        :param rules: Load balancer rules
+        :rtype: ``list`` of ``dict``
+            "rules": [
+                {
+                    "protocol": "TCP",
+                    "port_balancer": 80,
+                    "port_server": 80,
+                    "source": "0.0.0.0"
+                },
+                {
+                    "protocol": "TCP",
+                    "port_balancer": 9999,
+                    "port_server": 8888,
+                    "source": "0.0.0.0"
+                }
+            ]
+        :param persistence: Indictes if persistance is set
+        :rtype: ``boolean``
+
+        :param persistence_time: Persistance time
+        :rtype: ``int``
+
+        :param health_check_test: Type of test
+        :rtype:``str``
+
+        :param health_check_interval: Interval of the check
+
+        :param health_check_path: Path
+        :rtype:``str``
+        :param health_check_parser: Parser
+        :rtype:``str``
+
+        :param datacenter_id: Data center id
+        :rtype:``str``
+
+        :param description: Description of load balancer
+        :rtype:``str``
+
+        :return: ``dict``
+        """
+
+        body = {
+            "name": name,
+            "method": method,
+        }
+
+        body['rules'] = []
+        body['rules'] = rules
+
+        if persistence is not None:
+            body['persistence'] = persistence
+        if persistence_time is not None:
+            body['persistence_time'] = persistence_time
+        if health_check_test is not None:
+            body['health_check_test'] = health_check_test
+        if health_check_interval is not None:
+            body['health_check_interval'] = health_check_interval
+        if health_check_path is not None:
+            body['health_check_path'] = health_check_path
+        if health_check_parser is not None:
+            body['health_check_parser'] = health_check_parser
+        if datacenter_id is not None:
+            body['datacenter_id'] = datacenter_id
+        if description is not None:
+            body['description'] = description
+
+        response = self.connection.request(
+            action='load_balancers',
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_update_load_balancer(self, lb_id, name=None, description=None,
+                                health_check_test=None,
+                                health_check_interval=None,
+                                persistence=None,
+                                persistence_time=None,
+                                method=None):
+        body = {}
+
+        if name is not None:
+            body['name'] = name
+        if description is not None:
+            body['description'] = description
+        if health_check_test is not None:
+            body['health_check_test'] = health_check_test
+        if health_check_interval is not None:
+            body['health_check_interval'] = health_check_interval
+        if persistence is not None:
+            body['persistence'] = persistence
+        if persistence_time is not None:
+            body['persistence_time'] = persistence_time
+        if method is not None:
+            body['method'] = method
+
+        response = self.connection.request(
+            action='load_balancers/%s' % lb_id,
+            data=body,
+            method='PUT'
+        )
+
+        return response.object
+
+    def ex_add_servers_to_load_balancer(self, lb_id, server_ips=[]):
+        """
+        Adds server's IP address to load balancer
+
+        :param lb_id: Load balancer ID
+        :rtype: ``str``
+
+        :param server_ips: Array of server IP IDs
+        :rtype: ``list`` of ``str``
+
+        :return: Instance of load balancer
+        :rtype: ``dict``
+        """
+        body = {
+            "server_ips": server_ips,
+        }
+
+        response = self.connection.request(
+            action='load_balancers/%s/server_ips' % lb_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_remove_server_from_load_balancer(self, lb_id, server_ip):
+        """
+        Removes server's IP from load balancer
+
+        :param lb_id: Load balancer ID
+        :rtype: ``str``
+
+        :param server_ip: ID of the server IP
+        :rtype: ``str``
+
+        :return: Instance of load balancer
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='/load_balancers/%s/server_ips/%s' % (lb_id, server_ip),
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_add_load_balancer_rule(self, lb_id, protocol, port_balancer,
+                                  port_server, source=None):
+        """
+        Adds a rule to load balancer
+
+        :param lb_id: Load balancer ID
+        :rtype: ``str``
+
+        :param protocol: Load balancer protocol
+        :rtype: ``str``
+
+        :param port_balancer: Port to be balananced
+        :rtype: ``int``
+
+        :param port_server: Server port
+        :rtype: ``int``
+
+        :param source: Source IP address
+        :rtype: ``str``
+
+        :return: Instance of load balancer
+        :rtype: ``dict``
+        """
+
+        body = {
+            "rules": [
+                {
+                    'protocol': protocol,
+                    'port_balancer': port_balancer,
+                    'port_server': port_server
+                }
+            ]
+        }
+
+        if source is not None:
+            body['rules'][0]['source'] = source
+
+        response = self.connection.request(
+            action='/load_balancers/%s/rules' % lb_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_remove_load_balancer_rule(self, lb_id, rule_id):
+        """
+        Removes load balancer rule
+
+        :param lb_id: Load balancer ID
+        :rtype: ``str``
+
+        :param rule_id: Rule ID
+        :rtype: ``str``
+
+        :return: Instance of load balancer
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='/load_balancers/%s/rules/%s' % (lb_id, rule_id),
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_list_load_balancers(self):
+        """
+        Lists all load balancers
+
+        :return: List of load balancers
+        :rtype: ``list`` of ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers',
+            method='GET'
+        )
+        return response.object
+
+    def ex_get_load_balancer(self, lb_id):
+        """
+        Gets a single load balancer
+
+        :param lb_id: ID of the load balancer
+        :rtype: ``str``
+
+        :return: Instance of load balancer
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers/%s' % lb_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_list_load_balancer_server_ips(self, lb_id):
+        """
+        List balanced server IP addresses
+
+        :param lb_id: ID of the load balancer
+        :rtype: ``str``
+
+        :return: Array of IP address IDs
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers/%s/server_ips' % lb_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_load_balancer_server_ip(self, lb_id, server_ip):
+        """
+        Gets load balanced server id
+
+        :param lb_id: ID of the load balancer
+        :rtype: ``str``
+
+        :param server_ip: ID of the server IP
+        :rtype: ``str``
+
+        :return: Server IP
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers/%s/server_ips/%s' % (lb_id, server_ip),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_list_load_balancer_rules(self, lb_id):
+        """
+        Lists loadbalancer rules
+
+        :param lb_id: ID of the load balancer
+        :rtype: ``str``
+
+        :return: Lists of rules
+        :rtype: ``list`` of ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers/%s/rules' % lb_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_load_balancer_rule(self, lb_id, rule_id):
+        """
+        Get a load balancer rule
+
+        :param lb_id: ID of the load balancer
+        :rtype: ``str``
+
+        :param rule_id: Rule ID
+        :rtype: ``str``
+
+        :return: A load balancer rule
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers/%s/rules/%s' % (lb_id, rule_id),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_delete_load_balancer(self, lb_id):
+        """
+        Deletes a load balancer rule
+
+        :param lb_id: ID of the load balancer
+        :rtype: ``str``
+
+        :param rule_id: Rule ID
+        :rtype: ``str``
+
+        :return: Instance of load balancer
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='load_balancers/%s' % lb_id,
+            method='DELETE'
+        )
+
+        return response.object
+
+    """
+    Public IP operations
+    """
+
+    def ex_list_public_ips(self):
+        """
+        Lists all public IP addresses
+
+        :return: Array of public addresses
+        :rtype: ``list`` of ``dict``
+        """
+        response = self.connection.request(
+            action='public_ips',
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_create_public_ip(self, type, reverse_dns=None, datacenter_id=None):
+        """
+        Creates a public IP
+
+        :param type: Type of IP IPV4 or IPV6]
+        :rtype: ``str``
+
+        :param reverse_dns: Reverse DNS
+        :rtype: ``str``
+
+        :param datacenter_id: Datacenter ID where IP address will be crated
+        :rtype: ``str``
+
+        :return: Instance of Public IP
+        :rtype: ``dict``
+        """
+        body = {
+            'type': type
+        }
+
+        if reverse_dns is not None:
+            body['reverse_dns'] = reverse_dns
+        if datacenter_id is not None:
+            body['datacenter_id'] = datacenter_id
+
+        response = self.connection.request(
+            action='public_ips',
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_get_public_ip(self, ip_id):
+        """
+        Gets a Public IP
+
+        :param ip_id: ID of the IP
+        :rtype: ``str``
+
+        :return: Instance of Public IP
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='public_ips/%s' % ip_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_delete_public_ip(self, ip_id):
+        """
+        Deletes a public IP
+
+        :param ip_id: ID of public IP
+        :rtype: ``str``
+
+        :return: Instance of IP Address
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='public_ips/%s' % ip_id,
+            method='DELETE'
+        )
+
+        return response
+
+    def ex_update_public_ip(self, ip_id, reverse_dns):
+        """
+        Updates a Public IP
+
+        :param ip_id: ID of public IP
+        :rtype: ``str``
+
+        :param reverse_dns: Reverse DNS
+        :rtype: ``str``
+
+        :return: Instance of Public IP
+        :rtype: ``dict``
+        """
+
+        body = {
+            'reverse_dns': reverse_dns
+        }
+        response = self.connection.request(
+            action='public_ips/%s' % ip_id,
+            data=body,
+            method='DELETE'
+        )
+
+        return response.object
+
+    """
+    Private Network Operations
+    """
+
+    def ex_list_private_networks(self):
+        """
+        Lists all private networks
+
+        :return: List of private networks
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='private_networks',
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_create_private_network(self, name, description=None,
+                                  datacenter_id=None,
+                                  network_address=None,
+                                  subnet_mask=None):
+        """
+        Creates a private network
+
+        :param name: Name of the private network
+        :rtype: ``str``
+
+        :param description: Description of the private network
+        :rtype: ``str``
+
+        :param datacenter_id: ID of the data center for the private network
+        :rtype: ``str``
+
+        :param network_address: Network address of the private network
+        :rtype: ``str``
+
+        :param subnet_mask: Subnet mask of the private network
+        :rtype: ``str``
+
+        :return: Newly created private network
+        :rtype: ``dict``
+        """
+
+        body = {
+            'name': name
+        }
+
+        if description is not None:
+            body['description'] = description
+        if datacenter_id is not None:
+            body['datacenter_id'] = datacenter_id
+        if network_address is not None:
+            body['network_address'] = network_address
+        if subnet_mask is not None:
+            body['subnet_maks'] = subnet_mask
+
+        response = self.connection.request(
+            action='private_networks',
+            data=body,
+            method='POST'
+        )
+        return response.object
+
+    def ex_delete_private_network(self, network_id):
+        """
+        Deletes a private network
+
+        :param network_id: Id of the private network
+        :rtype: ``str``
+
+        :return: Instance of the private network being deleted
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='private_networks' % network_id,
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_update_private_network(self, network_id,
+                                  name=None, description=None,
+                                  datacenter_id=None,
+                                  network_address=None,
+                                  subnet_mask=None):
+        """
+           Updates a private network
+
+           :param name: Name of the private network
+           :rtype: ``str``
+
+           :param description: Description of the private network
+           :rtype: ``str``
+
+           :param datacenter_id: ID of the data center for the private network
+           :rtype: ``str``
+
+           :param network_address: Network address of the private network
+           :rtype: ``str``
+
+           :param subnet_mask: Subnet mask of the private network
+           :rtype: ``str``
+
+           :return: Instance of private network
+           :rtype: ``dict``
+           """
+        body = {}
+
+        if name is not None:
+            body['name'] = name
+        if description is not None:
+            body['description'] = description
+        if datacenter_id is not None:
+            body['datacenter_id'] = datacenter_id
+        if network_address is not None:
+            body['network_address'] = network_address
+        if subnet_mask is not None:
+            body['subnet_maks'] = subnet_mask
+
+        response = self.connection.request(
+            action='private_networks/%s',
+            data=body,
+            method='PUT'
+        )
+
+        return response.object
+
+    def ex_list_private_network_servers(self, network_id):
+        """
+        Lists all private network servers
+
+        :param network_id: Private network ID
+        :rtype: ``str``
+
+        :return: List of private network servers
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='/private_networks/%s/servers' % network_id,
+            method='GET'
+        )
+        return response.object
+
+    def ex_add_private_network_server(self, network_id, server_ids):
+        """
+        Add servers to private network
+
+        :param network_id: Private Network ID
+        :rtype: ``str``
+
+        :param server_ids: List of server IDs
+        :rtype: ``list`` of ``str``
+
+        :return: List of attached servers
+        :rtype: ``dict``
+
+        """
+        body = {
+            'servers': server_ids
+
+        }
+
+        response = self.connection.request(
+            action='/private_networks/%s/servers' % network_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_remove_server_from_private_network(self, network_id, server_id):
+        """
+        Removes a server from the private network
+
+        :param network_id: Private Network ID
+        :rtype: ``str``
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :return: Instance of the private network
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='/private_networks/%s/servers/%s' % (network_id, server_id),
+            method='POST'
+        )
+        return response.object
+
+    """
+    Monitoring policy operations
+    """
+
+    def ex_list_monitoring_policies(self):
+        """
+        Lists all monitoring policies
+
+        :return: List of monitoring policies
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='monitoring_policies',
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_create_monitoring_policy(self, name, thresholds,
+                                    ports,
+                                    processes,
+                                    description=None,
+                                    email=None,
+                                    agent=None,
+                                    ):
+        """
+        Creates a monitoring policy
+
+        :param name: Name for the monitoring policy
+        :rtype: ``str``
+
+        :param thresholds: Thresholds for the monitoring policy
+        :rtype: ``dict``
+        {
+           "cpu":{
+              "warning":{
+                 "value":90,
+                 "alert":false
+              },
+              "critical":{
+                 "value":95,
+                 "alert":false
+              }
+           },
+           "ram":{
+              "warning":{
+                 "value":90,
+                 "alert":false
+              },
+              "critical":{
+                 "value":95,
+                 "alert":false
+              }
+           },
+           "disk":{
+              "warning":{
+                 "value":80,
+                 "alert":false
+              },
+              "critical":{
+                 "value":90,
+                 "alert":false
+              }
+           },
+           "transfer":{
+              "warning":{
+                 "value":1000,
+                 "alert":false
+              },
+              "critical":{
+                 "value":2000,
+                 "alert":false
+              }
+           },
+           "internal_ping":{
+              "warning":{
+                 "value":50,
+                 "alert":false
+              },
+              "critical":{
+                 "value":100,
+                 "alert":false
+              }
+           }
+        }
+        :param ports: Monitoring policies for ports
+        :rtype: ``dict``
+        [
+           {
+              "protocol":"TCP",
+              "port":"22",
+              "alert_if":"RESPONDING",
+              "email_notification":true
+           }
+        ]
+
+
+        :param processes: Processes to be monitored
+        :rtype: ``dict``
+        [
+           {
+              "process":"test",
+              "alert_if":"NOT_RUNNING",
+              "email_notification":true
+           }
+        ]
+
+        :param description: Description for the monitoring policy
+        :rtype: ``str``
+
+        :param email: Email for notifications
+        :rtype: ``str``
+
+        :param agent: Indicates if agent application will be installed
+        :rtype: ``boolean``
+
+        :return: Newly created instance of monitofing policy
+        :rtype: ``dict``
+        """
+        body = {
+            'name': name,
+            'thresholds': thresholds,
+            'ports': ports,
+            'processes': processes
+        }
+
+        if description is not None:
+            body['description'] = description
+        if email is not None:
+            body['email'] = email
+        if agent is not None:
+            body['agent'] = agent
+
+        response = self.connection.request(
+            action='monitoring_policies',
+            data=body,
+            method='POST'
+        )
+        return response.object
+
+    def ex_delete_monitoring_policy(self, policy_id):
+        """
+        Deletes a monitoring policy
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :return: Instance of the monitoring policy being deleted
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='monitoring_policies' % policy_id,
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_update_monitoring_policy(self, policy_id,
+                                    email,
+                                    thresholds,
+                                    name=None, description=None):
+        """
+        Updates monitoring policy
+
+        :param policy_id: Id of the monitoring policy
+        :param email: Email to send notifications to
+        :rtype: ``str``
+
+        :param thresholds: Thresholds for the monitoring policy
+        :rtype: ``dict``
+
+        :param name: Name of the monitoring policy
+        :rtype: ``str``
+
+        :param description: Description of the monitoring policy
+        :rtype: ``str``
+
+        :return: Instance of the monitoring policy being deleted
+        :rtype: ``dict``
+        """
+
+        body = {}
+
+        if name is not None:
+            body['name'] = name
+        if description is not None:
+            body['description'] = description
+        if thresholds is not None:
+            body['thresholds'] = thresholds
+        if email is not None:
+            body['email'] = email
+
+        response = self.connection.request(
+            action='monitoring_policies/%s' % policy_id,
+            data=body,
+            method='PUT'
+        )
+
+        return response.object
+
+    def ex_get_monitoring_policy(self, policy_id):
+        """
+        Fetches a monitoring policy
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='monitoring_policies/%s' % policy_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_monitoring_policy_ports(self, policy_id):
+        """
+        Fetches monitoring policy ports
+
+        :param policy_id: Id of the monitoring policy
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/ports' % policy_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_monitoring_policy_port(self, policy_id, port_id):
+        """
+        Fetches monitoring policy port
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param port_id: Id of the port
+        :rtype: ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/ports/%s' % (policy_id, port_id),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_remove_monitoring_policy_port(self, policy_id, port_id):
+        """
+        Removes monitoring policy port
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param port_id: Id of the port
+        :rtype: ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/ports/%s' % (policy_id, port_id),
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_add_monitoring_policy_ports(self, policy_id, ports):
+        """
+        Add monitoring policy ports
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param ports: List of ports
+        :rtype: ``dict``
+        [
+           {
+              "protocol":"TCP",
+              "port":"80",
+              "alert_if":"RESPONDING",
+              "email_notification":true
+           }
+        ]
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        body = {"ports": ports}
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/ports' % policy_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_get_monitoring_policy_processes(self, policy_id):
+        """
+        Fetches monitoring policy processes
+
+        :param policy_id: Id of the monitoring policy
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/processes' % policy_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_get_monitoring_policy_process(self, policy_id, process_id):
+        """
+        Fetches monitoring policy process
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param process_id: Id of the process
+        :rtype: ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/processes/%s'
+                   % (policy_id, process_id),
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_remove_monitoring_policy_process(self, policy_id, process_id):
+        """
+        Removes monitoring policy process
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param process_id: Id of the process
+        :rtype: ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/processes/%s'
+                   % (policy_id, process_id),
+            method='DELETE'
+        )
+
+        return response.object
+
+    def ex_add_monitoring_policy_processes(self, policy_id, processes):
+        """
+        Add monitoring policy processes
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param processes: List of processes
+        :rtype: ``list`` of ``dict``
+        [
+          {
+            "process": "taskmmgr",
+            "alert_if": "RUNNING",
+            "email_notification": true
+          }
+        ]
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+
+        body = {"processes": processes}
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/processes' % policy_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_list_monitoring_policy_servers(self, policy_id):
+        """
+        List all servers that are being monitoried by the policy
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :return: List of servers being monitored
+        :rtype: ``list`` of ``dict``
+        """
+
+        response = self.connection.request(
+            action='monitoring_policies/%s/servers' % policy_id,
+            method='GET'
+        )
+
+        return response.object
+
+    def ex_add_servers_to_monitoring_policy(self, policy_id, servers):
+        """
+        Adds servers to monitoring policy
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param servers: List of server ID
+        :rtype: ``list`` of ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+        body = {
+            'servers': servers
+        }
+        response = self.connection.request(
+            action='monitoring_policies/%s/servers' % policy_id,
+            data=body,
+            method='POST'
+        )
+
+        return response.object
+
+    def ex_remove_server_from_monitoring_policy(self, policy_id, server_id):
+        """
+        Removes a server from monitoring policy
+
+        :param policy_id: Id of the monitoring policy
+        :rtype: ``str``
+
+        :param server_id: Id of the server
+        :rtype: ``str``
+
+        :return: Instance of a monitoring policy
+        :rtype: ``dict``
+        """
+        response = self.connection.request(
+            action='monitoring_policies/%s/servers/%s'
+                   % (policy_id, server_id),
+            method='DELETE'
+        )
+
+        return response.object
+
+    """
+        Private Functions
+        """
+
+    def _to_images(self, object, image_type=None):
+        if image_type is not None:
+            images = [image for image in object if image['type'] == image_type]
+        else:
+            images = [image for image in object]
+
+        return [self._to_image(image) for image in images]
+
+    def _to_image(self, data):
+        extra = {
+            'os_family': data['os_family'],
+            'os': data['os'],
+            'os_version': data['os_version'],
+            'os_architecture': data['os_architecture'],
+            'os_image_type': data['os_image_type'],
+            'min_hdd_size': data['min_hdd_size'],
+            'available_datacenters': data['available_datacenters'],
+            'licenses': data['licenses'],
+            'version': data['version'],
+            'categories': data['categories']
+        }
+        return NodeImage(id=data['id'], name=data['name'], driver=self,
+                         extra=extra)
+
+    def _to_node_size(self, data):
+        """
+        Convert into NodeSize
+        """
+        return NodeSize(
+            id=data["id"],
+            name=data["name"],
+            ram=data["hardware"]["ram"],
+            disk=data["hardware"]["hdds"][0]["size"],
+            bandwidth=None,
+            price=None,
+            driver=self.connection.driver,
+            extra={
+                'vcores': data['hardware']["vcore"],
+                "cores_per_processor": data['hardware']['cores_per_processor']}
+
+        )
+
+    def _to_location(self, location):
+        return NodeLocation(
+            id=location['id'],
+            name=location['country_code'],
+            country=location['location'],
+            driver=self.connection.driver
+        )
+
+    def _to_nodes(self, servers):
+        return [self._to_node(
+            server) for server in servers]
+
+    def _to_node(self, server):
+        extra = {}
+        extra["datacenter"] = server['datacenter']
+
+        if 'description' in server:
+            extra['description'] = server['description']
+        if 'status' in server:
+            extra["status"] = server["status"]
+        if 'image' in server:
+            extra["image"] = server["image"]
+        if 'hardware' in server:
+            extra["hardware"] = server["hardware"]
+        if 'dvd' in server:
+            extra["dvd"] = server["dvd"]
+        if 'snapshot' in server:
+            extra["snapshot"] = server["snapshot"]
+        if 'ips' in server:
+            extra["ips"] = server["ips"]
+        if 'alerts' in server:
+            extra["alerts"] = server["alerts"]
+        if 'monitoring_policy' in server:
+            extra["monitoring_policy"] = server["monitoring_policy"]
+        if 'private_networks' in server:
+            extra["private_networks"] = server["private_networks"]
+
+        ips = []
+
+        if server['ips'] is not None:
+            for ip in server['ips']:
+                ips.append(ip['ip'])
+        state = self.NODE_STATE_MAP.get(
+            server['status']['state'])
+
+        return Node(
+            id=server['id'],
+            state=state,
+            name=server['name'],
+            driver=self.connection.driver,
+            public_ips=ips,
+            private_ips=None,
+            extra=extra
+        )
+
+    def _wait_for_state(self, server_id, state, retries=50):
+        for i in (0, retries):
+            server = self.ex_get_server(server_id)
+
+            if server.extra['status']['state'] == state:
+                return
+            sleep(5)
+
+            if i == retries:
+                raise Exception('Retries count reached')
+
+        pass
+
+    def _list_fixed_instances(self):
+        response = self.connection.request(
+            action='/servers/fixed_instance_sizes',
+            method='GET'
+        )
+
+        return response.object

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/compute/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index 2d5127e..df983e9 100644
--- a/libcloud/compute/providers.py
+++ b/libcloud/compute/providers.py
@@ -143,6 +143,8 @@ DRIVERS = {
     ('libcloud.compute.drivers.ecs', 'ECSDriver'),
     Provider.CLOUDSCALE:
     ('libcloud.compute.drivers.cloudscale', 'CloudscaleNodeDriver'),
+    Provider.ONEANDONE:
+        ('libcloud.compute.drivers.oneandone', 'OneAndOneNodeDriver'),
 }
 
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index 646725d..d57cc91 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -144,6 +144,7 @@ class Provider(Type):
     NIMBUS = 'nimbus'
     NINEFOLD = 'ninefold'
     NTTA = 'ntta'
+    ONEANDONE = 'oneandone'
     OPENNEBULA = 'opennebula'
     OPENSTACK = 'openstack'
     OPSOURCE = 'opsource'


[03/11] libcloud git commit: 1&1 Compute Driver

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/auth_error.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/auth_error.json b/libcloud/test/compute/fixtures/oneandone/auth_error.json
new file mode 100644
index 0000000..2049116
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/auth_error.json
@@ -0,0 +1,5 @@
+{
+   "type":"UNAUTHORIZED",
+   "message":"The Token you are using is not valid",
+   "errors":null
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/create_node.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/create_node.json b/libcloud/test/compute/fixtures/oneandone/create_node.json
new file mode 100644
index 0000000..8b53cdd
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/create_node.json
@@ -0,0 +1,43 @@
+{
+  "id": "E7D36EC025C73796035BF4F171379025",
+  "name": "Docs Content Test Server: CentOS 7-1",
+  "description": "My server description",
+  "status": {
+    "state": "POWERED_ON",
+    "percent": null
+  },
+  "datacenter": {
+    "id": "908DC2072407C94C8054610AD5A53B8C",
+    "country_code": "US",
+    "location": "United States of America"
+  },
+  "creation_date": "2016-05-05T17:39:50+00:00",
+  "image": {
+    "id": "B5F778B85C041347BCDCFC3172AB3F3C",
+    "name": "centos7-64std"
+  },
+  "hardware": {
+    "fixed_instance_size_id": "65929629F35BBFBA63022008F773F3EB",
+    "vcore": 1,
+    "cores_per_processor": 1,
+    "ram": 1,
+    "hdds": [
+      {
+        "id": "CDB278D95A92CB4C379A9CAAD6759F02",
+        "size": 40,
+        "is_main": true
+      }
+    ]
+  },
+  "ips": [
+    {
+      "id": "FDBE99EDD57F8596CBF71B6B64BD0A92",
+      "ip": "62.151.179.99"
+    }
+  ],
+  "dvd": null,
+  "snapshot": null,
+  "alerts": [],
+  "monitoring_policy": null,
+  "private_networks": null
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/describe_firewall_policy.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/describe_firewall_policy.json b/libcloud/test/compute/fixtures/oneandone/describe_firewall_policy.json
new file mode 100644
index 0000000..68d1960
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/describe_firewall_policy.json
@@ -0,0 +1,26 @@
+{
+  "id": "83522FC7DA9172F229E5352C587075BA",
+  "name": "My firewall policy test",
+  "description": "My firewall policy description",
+  "state": "CONFIGURING",
+  "creation_date": "2015-04-29T10:43:11+00:00",
+  "default": 0,
+  "rules": [
+    {
+      "id": "DA5CC179ED00079AE7DE595F0073D86E",
+      "protocol": "TCP",
+      "port_from": 80,
+      "port_to": 80,
+      "source": "0.0.0.0"
+    },
+    {
+      "id": "0766EC674A0CD9D4EC0FA0B07978A649",
+      "protocol": "TCP",
+      "port_from": 443,
+      "port_to": 443,
+      "source": "0.0.0.0"
+    }
+  ],
+  "server_ips": [],
+  "cloudpanel_id": "FW99AA4_7"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/describe_id_firewall_policy.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/describe_id_firewall_policy.json b/libcloud/test/compute/fixtures/oneandone/describe_id_firewall_policy.json
new file mode 100644
index 0000000..19f1cf1
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/describe_id_firewall_policy.json
@@ -0,0 +1,4 @@
+{
+  "id": "3C4F21EDFEEDD6ABB728EA5CE684E1AF",
+  "name": "Windows"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/describe_server.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/describe_server.json b/libcloud/test/compute/fixtures/oneandone/describe_server.json
new file mode 100644
index 0000000..4b1f99f
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/describe_server.json
@@ -0,0 +1,49 @@
+{
+  "id": "srv_1",
+  "cloudpanel_id": "958FA92",
+  "name": "My Server 1",
+  "description": "",
+  "datacenter": {
+    "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+    "location": "USA",
+    "country_code": "US"
+  },
+  "creation_date": "2015-05-04T06:32:15+00:00",
+  "first_password": "Fg52K21nz8",
+  "status": {
+    "state": "POWERED_OFF",
+    "percent": null
+  },
+  "hardware": {
+    "fixed_instance_size_id": 0,
+    "vcore": 1,
+    "cores_per_processor": 1,
+    "ram": 2,
+    "hdds": [
+    {
+      "id": "8C626C1A7005D0D1F527143C413D461E",
+      "size": 40,
+      "is_main": true
+    }
+    ]
+  },
+  "image": {
+    "id": "3C3B80327CBBD7F0023F793F666C24D0",
+    "name": "w2008r2datacenter64std"
+  },
+  "dvd": null,
+  "snapshot": null,
+  "ips": [
+  {
+    "id": "8D135204687B9CF9E79E7A93C096E336",
+    "ip": "10.4.140.213",
+    "type": "IPV4",
+    "reverse_dns": null,
+    "firewall_policy": null,
+    "load_balancers": []
+  }
+  ],
+  "alerts": [],
+  "monitoring_policy": null,
+  "private_networks": null
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/describe_shared_stoage.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/describe_shared_stoage.json b/libcloud/test/compute/fixtures/oneandone/describe_shared_stoage.json
new file mode 100644
index 0000000..bd3dcc2
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/describe_shared_stoage.json
@@ -0,0 +1,29 @@
+{
+  "id": "6AD2F180B7B666539EF75A02FE227084",
+  "size": 200,
+  "state": "ACTIVE",
+  "description": "My shared storage description",
+  "datacenter": {
+    "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+    "location": "USA",
+    "country_code": "US"
+  },
+  "cloudpanel_id": "vid35780",
+  "size_used": "0.00",
+  "cifs_path": "\\vid50995.nas1.lan\vid50995",
+  "nfs_path": "vid50995.nas1.lan/:vid50995",
+  "name": "My shared storage test rename",
+  "creation_date": "2015-05-06T08:33:25+00:00",
+  "servers": [
+    {
+      "id": "638ED28205B1AFD7ADEF569C725DD85F",
+      "name": "Mi servidor 1",
+      "rights": "RW"
+    },
+    {
+      "id": "39AA65F5D5B02FA02D58173094EBAF95",
+      "name": "My Server remame",
+      "rights": "R"
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/ex_list_datacenters.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/ex_list_datacenters.json b/libcloud/test/compute/fixtures/oneandone/ex_list_datacenters.json
new file mode 100644
index 0000000..8fc322a
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/ex_list_datacenters.json
@@ -0,0 +1,26 @@
+[
+   {
+      "id":"81DEF28500FBC2A973FC0C620DF5B721",
+      "location":"Spain",
+      "country_code":"ES",
+      "default":0
+   },
+   {
+      "id":"908DC2072407C94C8054610AD5A53B8C",
+      "location":"United States of America",
+      "country_code":"US",
+      "default":1
+   },
+   {
+      "id":"4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "location":"Germany",
+      "country_code":"DE",
+      "default":0
+   },
+   {
+      "id":"5091F6D8CBFEF9C26ACE957C652D5D49",
+      "location":"United Kingdom of Great Britain and Northern Ireland",
+      "country_code":"GB",
+      "default":0
+   }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/fixed_instance_sizes.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/fixed_instance_sizes.json b/libcloud/test/compute/fixtures/oneandone/fixed_instance_sizes.json
new file mode 100644
index 0000000..a9605dd
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/fixed_instance_sizes.json
@@ -0,0 +1,70 @@
+[
+  {
+    "name": "M",
+    "id": "8C626C1A7005D0D1F527143C413D461E",
+    "hardware": {
+      "vcore": 1,
+      "cores_per_processor": 1,
+      "ram": 1,
+      "unit": "GB",
+      "hdds": [
+        {
+          "size": 40,
+          "unit": "GB",
+          "is_main": true
+        }
+      ]
+    }
+  },
+  {
+    "name": "L",
+    "id": "8C626C1A7005D0D1F527143C413D461F",
+    "hardware": {
+      "vcore": 2,
+      "cores_per_processor": 1,
+      "ram": 2,
+      "unit": "GB",
+      "hdds": [
+        {
+          "size": 80,
+          "unit": "GiB",
+          "is_main": true
+        }
+      ]
+    }
+  },
+  {
+    "name": "XL",
+    "id": "8C626C1A7005D0D1F527143C413D4620",
+    "hardware": {
+      "vcore": 2,
+      "cores_per_processor": 1,
+      "ram": 4,
+      "unit": "GB",
+      "hdds": [
+        {
+          "size": 120,
+          "unit": "GB",
+          "is_main": true
+        }
+      ]
+    }
+  },
+  {
+    "name": "XXL",
+    "id": "8C626C1A7005D0D1F527143C413D4621",
+    "hardware": {
+      "vcore": 4,
+      "cores_per_processor": 1,
+      "ram": 8,
+      "unit": "GB",
+      "hdds": [
+        {
+          "size": 160,
+          "unit": "GiB",
+          "is_main": true
+        }
+      ]
+    }
+  }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/get_image.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/get_image.json b/libcloud/test/compute/fixtures/oneandone/get_image.json
new file mode 100644
index 0000000..cb94129
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/get_image.json
@@ -0,0 +1,24 @@
+{
+  "id": "6E1F2C70CCD3EE44ED194F4FFC47C4C9",
+  "name": "w2012r2datacenter64min",
+  "available_datacenters": [
+    "81DEF28500FBC2A973FC0C620DF5B721",
+    "908DC2072407C94C8054610AD5A53B8C",
+    "4EFAD5836CE43ACA502FD5B99BEE44EF",
+    "5091F6D8CBFEF9C26ACE957C652D5D49"
+  ],
+  "os_family": "Windows",
+  "os": "Windows2012R2",
+  "os_version": "WindowsDatacenter",
+  "os_architecture": 64,
+  "os_image_type": "MINIMAL",
+  "type": "IMAGE",
+  "min_hdd_size": 40,
+  "licenses": [
+    {
+      "name": "Windows 2012 Standard"
+    }
+  ],
+  "version": null,
+  "categories": []
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/get_server_image.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/get_server_image.json b/libcloud/test/compute/fixtures/oneandone/get_server_image.json
new file mode 100644
index 0000000..f1ad1ee
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/get_server_image.json
@@ -0,0 +1,4 @@
+{
+  "id": "76EBF29C1250167C8754B2B3D1C05F68",
+  "name": "centos7-64std"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_firewall_policies.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_firewall_policies.json b/libcloud/test/compute/fixtures/oneandone/list_firewall_policies.json
new file mode 100644
index 0000000..1889436
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_firewall_policies.json
@@ -0,0 +1,54 @@
+[
+  {
+    "id": "83522FC7DA9172F229E5352C587075BA",
+    "name": "My firewall policy test",
+    "description": "My firewall policy description",
+    "state": "CONFIGURING",
+    "creation_date": "2015-04-29T10:43:11+00:00",
+    "default": 0,
+    "rules": [
+      {
+        "id": "DA5CC179ED00079AE7DE595F0073D86E",
+        "protocol": "TCP",
+        "port_from": 80,
+        "port_to": 80,
+        "source": "0.0.0.0"
+      },
+      {
+        "id": "0766EC674A0CD9D4EC0FA0B07978A649",
+        "protocol": "TCP",
+        "port_from": 443,
+        "port_to": 443,
+        "source": "0.0.0.0"
+      }
+    ],
+    "server_ips": [],
+    "cloudpanel_id": "FW99AA4_7"
+  },
+  {
+    "id": "83522FC7DA9172F229E5352C587075B9",
+    "name": "My firewall policy test 2",
+    "description": "My firewall policy description",
+    "state": "CONFIGURING",
+    "creation_date": "2015-04-29T10:43:11+00:00",
+    "default": 0,
+    "rules": [
+      {
+        "id": "DA5CC179ED00079AE7DE595F0073D86F",
+        "protocol": "TCP",
+        "port_from": 80,
+        "port_to": 80,
+        "source": "0.0.0.0"
+      },
+      {
+        "id": "0766EC674A0CD9D4EC0FA0B07978A64A",
+        "protocol": "TCP",
+        "port_from": 443,
+        "port_to": 443,
+        "source": "0.0.0.0"
+      }
+    ],
+    "server_ips": [],
+    "cloudpanel_id": "FW99AA4_7"
+  }
+]
\ No newline at end of file


[10/11] libcloud git commit: Merge branch 'github-1029' into trunk Closes #1029

Posted by an...@apache.org.
Merge branch 'github-1029' into trunk
Closes #1029

Signed off by: Anthony Shaw


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/6bb17e87
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/6bb17e87
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/6bb17e87

Branch: refs/heads/trunk
Commit: 6bb17e87a066de42797969738f07fadaef2db92b
Parents: 30715a4 738a1d1
Author: Anthony Shaw <an...@apache.org>
Authored: Tue Apr 11 10:22:27 2017 +1000
Committer: Anthony Shaw <an...@apache.org>
Committed: Tue Apr 11 10:22:27 2017 +1000

----------------------------------------------------------------------
 docs/compute/drivers/oneandone.rst              |   295 +
 .../compute/oneandone/create_firewall_policy.py |    33 +
 .../compute/oneandone/create_load_balancer.py   |    36 +
 .../oneandone/create_monitoring_policy.py       |    90 +
 docs/examples/compute/oneandone/create_node.py  |    36 +
 .../compute/oneandone/create_private_network.py |    14 +
 .../compute/oneandone/create_public_ip.py       |    14 +
 .../compute/oneandone/create_shared_storage.py  |    21 +
 .../compute/oneandone/instantiate_driver.py     |     9 +
 libcloud/compute/drivers/oneandone.py           |  2260 +++
 libcloud/compute/providers.py                   |     2 +
 libcloud/compute/types.py                       |     1 +
 .../compute/fixtures/oneandone/auth_error.json  |     5 +
 .../compute/fixtures/oneandone/create_node.json |    43 +
 .../oneandone/describe_firewall_policy.json     |    26 +
 .../oneandone/describe_id_firewall_policy.json  |     4 +
 .../fixtures/oneandone/describe_server.json     |    49 +
 .../oneandone/describe_shared_stoage.json       |    29 +
 .../fixtures/oneandone/ex_list_datacenters.json |    26 +
 .../oneandone/fixed_instance_sizes.json         |    70 +
 .../compute/fixtures/oneandone/get_image.json   |    24 +
 .../fixtures/oneandone/get_server_image.json    |     4 +
 .../oneandone/list_firewall_policies.json       |    54 +
 .../compute/fixtures/oneandone/list_images.json | 17941 +++++++++++++++++
 .../fixtures/oneandone/list_load_balancer.json  |    78 +
 .../oneandone/list_monitoring_policies.json     |   152 +
 .../fixtures/oneandone/list_public_ips.json     |    59 +
 .../fixtures/oneandone/list_servers.json        |   197 +
 .../oneandone/list_shared_storages.json         |    64 +
 .../fixtures/oneandone/load_balancer.json       |    38 +
 .../fixtures/oneandone/load_balancer_rule.json  |     7 +
 .../fixtures/oneandone/load_balancer_rules.json |    16 +
 .../oneandone/load_balancer_server_ip.json      |     5 +
 .../oneandone/load_balancer_server_ips.json     |     6 +
 .../fixtures/oneandone/monitoring_policy.json   |    73 +
 .../oneandone/monitoring_policy_port.json       |     7 +
 .../oneandone/monitoring_policy_ports.json      |    16 +
 .../oneandone/monitoring_policy_process.json    |     6 +
 .../oneandone/monitoring_policy_processes.json  |    14 +
 .../oneandone/monitoring_policy_servers.json    |    10 +
 .../compute/fixtures/oneandone/public_ip.json   |    15 +
 .../fixtures/oneandone/server_hardware.json     |    13 +
 .../compute/fixtures/oneandone/server_ip.json   |     8 +
 .../compute/fixtures/oneandone/server_ips.json  |    10 +
 .../fixtures/oneandone/shared_storage.json      |    24 +
 .../test/compute/fixtures/oneandone/ttt.json    |    73 +
 libcloud/test/compute/test_oneandone.py         |  1281 ++
 libcloud/test/secrets.py-dist                   |     1 +
 48 files changed, 23259 insertions(+)
----------------------------------------------------------------------



[05/11] libcloud git commit: Merge remote-tracking branch 'upstream/trunk' into oneandone

Posted by an...@apache.org.
Merge remote-tracking branch 'upstream/trunk' into oneandone


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/e3dbb377
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/e3dbb377
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/e3dbb377

Branch: refs/heads/trunk
Commit: e3dbb3775d74c1d743195d723d38128cc0e328cc
Parents: ff028ae a5731ab
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Apr 11 00:20:45 2017 +0200
Committer: jasminSPC <ja...@stackpointcloud.com>
Committed: Tue Apr 11 00:20:45 2017 +0200

----------------------------------------------------------------------
 CHANGES.rst                                     | 227 ++++-
 contrib/scrape-ec2-prices.py                    |  19 +-
 demos/secrets.py-dist                           |   5 +-
 doap_libcloud.rdf                               |   7 +
 docs/_static/images/provider_logos/outscale.jpg | Bin 0 -> 17361 bytes
 docs/_static/images/provider_logos/outscale.png | Bin 8437 -> 0 bytes
 .../_supported_methods_image_management.rst     |   2 +-
 .../_supported_methods_key_pair_management.rst  |   2 +-
 docs/compute/_supported_methods_main.rst        |   2 +-
 docs/compute/_supported_providers.rst           | 120 +--
 docs/compute/drivers/cloudscale.rst             |   4 +-
 docs/compute/drivers/dimensiondata.rst          |  22 +
 docs/compute/drivers/outscale_inc.rst           |  11 +-
 docs/compute/drivers/outscale_sas.rst           |  21 +-
 docs/dns/_supported_methods.rst                 |   2 +
 docs/dns/_supported_providers.rst               |   2 +
 docs/dns/drivers/onapp.rst                      |  23 +
 .../Nodes_Create_mcp2_Uncustomised.py           |  57 ++
 docs/examples/compute/onapp/functionality.py    |  39 +-
 docs/examples/dns/onapp/instantiate_driver.py   |   9 +
 docs/loadbalancer/_supported_providers.rst      |   2 +-
 docs/other/changes_in_2_0.rst                   |  18 +-
 docs/storage/_supported_methods_cdn.rst         |  16 +-
 docs/storage/_supported_methods_main.rst        |  16 +-
 docs/storage/_supported_providers.rst           |  16 +-
 integration/README.rst                          |  20 +
 integration/__init__.py                         |   0
 integration/__main__.py                         |  41 +
 integration/api/__init__.py                     |   0
 integration/api/__main__.py                     |  21 +
 integration/api/data.py                         |  37 +
 integration/api/routes.py                       |  33 +
 integration/api/util.py                         |  33 +
 integration/config.py                           |  21 +
 integration/driver/__init__.py                  |   0
 integration/driver/test.py                      |  76 ++
 integration/requirements.txt                    |   1 +
 libcloud/__init__.py                            |   2 +-
 libcloud/common/aws.py                          |   4 +-
 libcloud/common/azure_arm.py                    |   2 +-
 libcloud/common/base.py                         |  32 +-
 libcloud/common/linode.py                       |  25 +-
 libcloud/common/ovh.py                          |   2 +-
 libcloud/compute/drivers/azure_arm.py           |   7 +-
 libcloud/compute/drivers/cloudscale.py          |   8 +-
 libcloud/compute/drivers/digitalocean.py        |   3 +-
 libcloud/compute/drivers/dimensiondata.py       |   1 -
 libcloud/compute/drivers/ec2.py                 | 931 ++++++++++++++++---
 libcloud/compute/drivers/ecs.py                 |  59 +-
 libcloud/compute/drivers/gce.py                 |  94 +-
 libcloud/compute/drivers/linode.py              |  50 +-
 libcloud/compute/drivers/onapp.py               | 107 ++-
 libcloud/compute/types.py                       |   4 +
 libcloud/data/pricing.json                      | 630 ++++++++++---
 libcloud/dns/drivers/onapp.py                   | 332 +++++++
 libcloud/dns/drivers/route53.py                 |  17 +-
 libcloud/dns/providers.py                       |   2 +
 libcloud/dns/types.py                           |   1 +
 libcloud/http.py                                | 299 ++++++
 libcloud/httplib_ssl.py                         | 273 ------
 libcloud/security.py                            |   2 +-
 libcloud/storage/drivers/s3.py                  | 424 +++++++--
 libcloud/storage/providers.py                   |  12 +
 libcloud/storage/types.py                       |   6 +
 .../2.4/deploy_customised_server.xml            |   7 +
 .../compute/fixtures/ec2/allocate_address.xml   |   2 +-
 .../fixtures/ec2/allocate_vpc_address.xml       |   2 +-
 .../compute/fixtures/ec2/associate_address.xml  |   2 +-
 .../fixtures/ec2/associate_vpc_address.xml      |   2 +-
 .../fixtures/ec2/attach_internet_gateway.xml    |   2 +-
 .../fixtures/ec2/attach_network_interface.xml   |   2 +-
 .../test/compute/fixtures/ec2/attach_volume.xml |   2 +-
 .../ec2/authorize_security_group_egress.xml     |   2 +-
 .../ec2/authorize_security_group_ingress.xml    |   2 +-
 .../test/compute/fixtures/ec2/copy_image.xml    |   2 +-
 .../test/compute/fixtures/ec2/create_image.xml  |   2 +-
 .../fixtures/ec2/create_internet_gateway.xml    |   2 +-
 .../compute/fixtures/ec2/create_key_pair.xml    |   2 +-
 .../fixtures/ec2/create_network_interface.xml   |   2 +-
 .../fixtures/ec2/create_placement_groups.xml    |   2 +-
 .../fixtures/ec2/create_security_group.xml      |   2 +-
 .../compute/fixtures/ec2/create_snapshot.xml    |   2 +-
 .../test/compute/fixtures/ec2/create_subnet.xml |   2 +-
 .../test/compute/fixtures/ec2/create_tags.xml   |   2 +-
 .../test/compute/fixtures/ec2/create_volume.xml |   2 +-
 .../test/compute/fixtures/ec2/create_vpc.xml    |   2 +-
 .../fixtures/ec2/delete_internet_gateway.xml    |   2 +-
 .../compute/fixtures/ec2/delete_key_pair.xml    |   2 +-
 .../fixtures/ec2/delete_network_interface.xml   |   2 +-
 .../fixtures/ec2/delete_placement_groups.xml    |   2 +-
 .../fixtures/ec2/delete_security_group.xml      |   2 +-
 .../compute/fixtures/ec2/delete_snapshot.xml    |   2 +-
 .../test/compute/fixtures/ec2/delete_subnet.xml |   2 +-
 .../test/compute/fixtures/ec2/delete_tags.xml   |   2 +-
 .../test/compute/fixtures/ec2/delete_volume.xml |   2 +-
 .../test/compute/fixtures/ec2/delete_vpc.xml    |   2 +-
 .../compute/fixtures/ec2/deregister_image.xml   |   2 +-
 .../ec2/describe_account_attributes.xml         |   2 +-
 .../compute/fixtures/ec2/describe_addresses.xml |   2 +-
 .../fixtures/ec2/describe_addresses_all.xml     |   2 +-
 .../fixtures/ec2/describe_addresses_multi.xml   |   2 +-
 .../fixtures/ec2/describe_addresses_single.xml  |   2 +-
 .../ec2/describe_availability_zones.xml         |   2 +-
 .../compute/fixtures/ec2/describe_images.xml    |  14 +-
 .../ec2/describe_images_ex_imageids.xml         |   9 +-
 .../ec2/describe_import_snapshot_tasks.xml      |  18 +
 .../describe_import_snapshot_tasks_active.xml   |  17 +
 .../compute/fixtures/ec2/describe_instances.xml |   2 +-
 .../fixtures/ec2/describe_internet_gateways.xml |   2 +-
 .../compute/fixtures/ec2/describe_key_pairs.xml |   2 +-
 .../ec2/describe_network_interfaces.xml         |   2 +-
 .../fixtures/ec2/describe_placement_groups.xml  |   2 +-
 .../ec2/describe_reserved_instances.xml         |   2 +-
 .../fixtures/ec2/describe_security_groups.xml   |   2 +-
 .../compute/fixtures/ec2/describe_snapshots.xml |   2 +-
 .../compute/fixtures/ec2/describe_subnets.xml   |   2 +-
 .../test/compute/fixtures/ec2/describe_tags.xml |   2 +-
 .../compute/fixtures/ec2/describe_volumes.xml   |   2 +-
 .../test/compute/fixtures/ec2/describe_vpcs.xml |   2 +-
 .../fixtures/ec2/detach_internet_gateway.xml    |   2 +-
 .../fixtures/ec2/detach_network_interface.xml   |   2 +-
 .../test/compute/fixtures/ec2/detach_volume.xml |   2 +-
 .../fixtures/ec2/disassociate_address.xml       |   2 +-
 .../compute/fixtures/ec2/get_console_output.xml |   2 +-
 .../compute/fixtures/ec2/import_key_pair.xml    |   2 +-
 .../compute/fixtures/ec2/import_snapshot.xml    |  16 +
 .../fixtures/ec2/modify_image_attribute.xml     |   2 +-
 .../fixtures/ec2/modify_instance_attribute.xml  |   2 +-
 .../fixtures/ec2/modify_snapshot_attribute.xml  |   4 +
 .../compute/fixtures/ec2/reboot_instances.xml   |   2 +-
 .../compute/fixtures/ec2/register_image.xml     |   2 +-
 .../compute/fixtures/ec2/release_address.xml    |   2 +-
 .../ec2/revoke_security_group_egress.xml        |   2 +-
 .../ec2/revoke_security_group_ingress.xml       |   2 +-
 .../test/compute/fixtures/ec2/run_instances.xml |   2 +-
 .../fixtures/ec2/run_instances_iam_profile.xml  |   2 +-
 .../compute/fixtures/ec2/run_instances_idem.xml |   2 +-
 ...instances_with_subnet_and_security_group.xml |   2 +-
 .../compute/fixtures/ec2/start_instances.xml    |   2 +-
 .../compute/fixtures/ec2/stop_instances.xml     |   2 +-
 .../fixtures/ec2/terminate_instances.xml        |   2 +-
 .../fixtures/ecs/join_security_group_by_id.xml  |   4 +
 .../fixtures/ecs/leave_security_group_by_id.xml |   4 +
 ...entral1_subnetworks_cf_972cf02e6ad49112.json |   1 +
 .../compute/fixtures/onapp/get_key_pair.json    |   9 +
 .../compute/fixtures/onapp/import_key_pair.json |   9 +
 .../compute/fixtures/onapp/list_images.json     |  47 +
 .../compute/fixtures/onapp/list_key_pairs.json  |  20 +
 .../test/compute/fixtures/onapp/profile.json    |  12 +
 .../test/compute/test_dimensiondata_v2_4.py     |  49 +
 libcloud/test/compute/test_ec2.py               |  77 +-
 libcloud/test/compute/test_ecs.py               |  20 +
 libcloud/test/compute/test_onapp.py             |  61 ++
 .../test/dns/fixtures/onapp/create_record.json  |   9 +
 .../test/dns/fixtures/onapp/create_zone.json    |  10 +
 .../dns/fixtures/onapp/dns_zone_not_found.json  |   5 +
 .../test/dns/fixtures/onapp/get_record.json     |   9 +
 .../fixtures/onapp/get_record_after_update.json |   9 +
 libcloud/test/dns/fixtures/onapp/get_zone.json  |  10 +
 .../test/dns/fixtures/onapp/list_records.json   |  65 ++
 .../test/dns/fixtures/onapp/list_zones.json     |  22 +
 libcloud/test/dns/test_onapp.py                 | 223 +++++
 libcloud/test/secrets.py-dist                   |   1 +
 libcloud/test/storage/test_s3.py                |  54 +-
 libcloud/test/test_connection.py                |  19 +-
 libcloud/test/test_http.py                      |  87 ++
 libcloud/test/test_httplib_ssl.py               |  87 --
 libcloud/test/test_logging_connection.py        |  18 +-
 libcloud/test/test_response_classes.py          |   2 +-
 libcloud/utils/compression.py                   |  42 -
 libcloud/utils/loggingconnection.py             |   7 -
 tox.ini                                         |   9 +-
 172 files changed, 4409 insertions(+), 1071 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/e3dbb377/libcloud/common/base.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/libcloud/blob/e3dbb377/libcloud/compute/types.py
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/libcloud/blob/e3dbb377/libcloud/test/secrets.py-dist
----------------------------------------------------------------------


[06/11] libcloud git commit: Addressing PR remarks

Posted by an...@apache.org.
Addressing PR remarks


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/0fd856f5
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/0fd856f5
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/0fd856f5

Branch: refs/heads/trunk
Commit: 0fd856f58ac33196847596d30f6c8b34e3e9e285
Parents: e3dbb37
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Apr 11 01:04:44 2017 +0200
Committer: jasminSPC <ja...@stackpointcloud.com>
Committed: Tue Apr 11 01:04:44 2017 +0200

----------------------------------------------------------------------
 libcloud/common/base.py       | 1 -
 libcloud/compute/providers.py | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/0fd856f5/libcloud/common/base.py
----------------------------------------------------------------------
diff --git a/libcloud/common/base.py b/libcloud/common/base.py
index f48bb15..9c5731e 100644
--- a/libcloud/common/base.py
+++ b/libcloud/common/base.py
@@ -486,7 +486,6 @@ class Connection(object):
 
     def request(self, action, params=None, data=None, headers=None,
                 method='GET', raw=False, stream=False):
-
         """
         Request a given `action`.
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/0fd856f5/libcloud/compute/providers.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/providers.py b/libcloud/compute/providers.py
index df983e9..a1c4868 100644
--- a/libcloud/compute/providers.py
+++ b/libcloud/compute/providers.py
@@ -144,7 +144,7 @@ DRIVERS = {
     Provider.CLOUDSCALE:
     ('libcloud.compute.drivers.cloudscale', 'CloudscaleNodeDriver'),
     Provider.ONEANDONE:
-        ('libcloud.compute.drivers.oneandone', 'OneAndOneNodeDriver'),
+    ('libcloud.compute.drivers.oneandone', 'OneAndOneNodeDriver'),
 }
 
 


[11/11] libcloud git commit: changes for #1029

Posted by an...@apache.org.
changes for #1029


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/bcdf8b59
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/bcdf8b59
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/bcdf8b59

Branch: refs/heads/trunk
Commit: bcdf8b59445162a2a22046947caab853d2abfb69
Parents: 6bb17e8
Author: Anthony Shaw <an...@apache.org>
Authored: Tue Apr 11 10:23:45 2017 +1000
Committer: Anthony Shaw <an...@apache.org>
Committed: Tue Apr 11 10:23:45 2017 +1000

----------------------------------------------------------------------
 CHANGES.rst | 4 ++++
 1 file changed, 4 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/bcdf8b59/CHANGES.rst
----------------------------------------------------------------------
diff --git a/CHANGES.rst b/CHANGES.rst
index 4ff0075..69ed853 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -14,6 +14,10 @@ Common
 Compute
 ~~~~~~~
 
+- Add 1&1 compute driver
+  [LIBCLOUD-911] [GITHUB-1029]
+  (Jasmin Gacic)
+
 - Fix Azure ARM driver condition for ex_list_publishers where location is specified
   [GITHUB-1030]
   (Joseph Hall)


[08/11] libcloud git commit: Test fix

Posted by an...@apache.org.
Test fix


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/38d40fe3
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/38d40fe3
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/38d40fe3

Branch: refs/heads/trunk
Commit: 38d40fe376e7ab5e1d9355b5af46a013233ed834
Parents: 560f0e4
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Apr 11 01:59:02 2017 +0200
Committer: jasminSPC <ja...@stackpointcloud.com>
Committed: Tue Apr 11 01:59:02 2017 +0200

----------------------------------------------------------------------
 libcloud/compute/drivers/oneandone.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/38d40fe3/libcloud/compute/drivers/oneandone.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/oneandone.py b/libcloud/compute/drivers/oneandone.py
index afe356e..2a5d1e4 100644
--- a/libcloud/compute/drivers/oneandone.py
+++ b/libcloud/compute/drivers/oneandone.py
@@ -843,7 +843,7 @@ class OneAndOneNodeDriver(NodeDriver):
         return response.object
 
     def ex_list_firewall_policies(self):
-        '""
+        """"
         List firewall policies
         :return: 'dict'
         """


[02/11] libcloud git commit: 1&1 Compute Driver

Posted by an...@apache.org.
http://git-wip-us.apache.org/repos/asf/libcloud/blob/ff028ae2/libcloud/test/compute/fixtures/oneandone/list_images.json
----------------------------------------------------------------------
diff --git a/libcloud/test/compute/fixtures/oneandone/list_images.json b/libcloud/test/compute/fixtures/oneandone/list_images.json
new file mode 100644
index 0000000..86bc86e
--- /dev/null
+++ b/libcloud/test/compute/fixtures/oneandone/list_images.json
@@ -0,0 +1,17941 @@
+[
+  {
+    "id": "6E1F2C70CCD3EE44ED194F4FFC47C4C9",
+    "name": "w2012r2datacenter64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "B77E19E062D5818532EFF11C747BD104",
+    "name": "w2012r2datacenter64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "7C5FA1D21B98DE39D7516333AAB7DA54",
+    "name": "w2012r2datacenter64std+SQL2012express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "D2127B1C773877A693D718C78181D430",
+    "name": "w2012r2datacenter64std+SQL2012web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "EB2C91E2DC1BA405C5C648ED9B9A7118",
+    "name": "w2012r2datacenter64std+SQL2012std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "71653B14F25069950DD34AF6FE1AFEDD",
+    "name": "Ubuntu 14.04",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu14.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "C14988A9ABC34EA64CD5AAC0D33ABCAF",
+    "name": "ubuntu1404-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu14.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "72A90ECC29F718404AC3093A3D78327C",
+    "name": "ubuntu1404-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu14.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "8E3BAA98E3DFD37857810E0288DD8FBA",
+    "name": "centos6-32min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 32,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E949B8557A0D95E3425088C496FD93F8",
+    "name": "centos6-32std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "650D003D3FC8A8FE554330E869B39FC0",
+    "name": "centos6-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "C598EAD5691CDADD1501A2AF29A2E91C",
+    "name": "centos6-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "DCA5686F1FC5E8A6E0B32E5A68BBB499",
+    "name": "w2008r2datacenter64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E156EA0B6CE014FEAB8BEB8CC9E3BB77",
+    "name": "w2008r2datacenter64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "3A3752FFAEA4C4F53EE701D29172E332",
+    "name": "w2008r2datacenter64std+SQL2012express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "295D0663A4868F920332DCDC15F395A7",
+    "name": "w2008r2datacenter64std+SQL2012web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "00A1CE098B4C6121A77B23262EAD4D76",
+    "name": "w2008r2datacenter64std+SQL2012std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E4B7589997B1147CCC5764A204F49E94",
+    "name": "Red Hat 6",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "RedHat6",
+    "os_version": "RedHat",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "F89443811E6952AF6B15E87E647D781A",
+    "name": "w2012r2datacenter64min+SQL2012express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "65F9A55A55A558F977CF55BDC70AF60E",
+    "name": "w2012r2datacenter64min+SQL2012web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "20C66A769CFA8B98D9EDD509A6458641",
+    "name": "w2012r2datacenter64min+SQL2012std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "06E189B1C60CB0F46501E49049C43B05",
+    "name": "w2008r2datacenter64min+SQL2012express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "9717A92E43E2350072A77B00F2DF8CF5",
+    "name": "w2008r2datacenter64min+SQL2012web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "79AFC562A2541DD8F904F8CF918B6899",
+    "name": "w2008r2datacenter64min+SQL2012std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2012 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "087BB7F082A7DE2817100EAD53A3845D",
+    "name": "centos6-32std+Plesk12unlimited",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "EC5DCA17E7CF86D968F60C222948C83F",
+    "name": "centos6-64std+Plesk12unlimited",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "B5F778B85C041347BCDCFC3172AB3F3C",
+    "name": "centos7-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "7B9067380CB74BBDFE7F473DEEA2AF5C",
+    "name": "centos7-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "9B9A214D50A7EEE8D9E37295DF834F70",
+    "name": "debian7-32min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "0D5A4BCDC5B47A33593239C2553F5ADC",
+    "name": "debian7-32std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "CF8318BDB7EFE797C9C769272AAA5F5C",
+    "name": "debian7-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "EBA74A8ED3760AE376F1E26AC6744B3F",
+    "name": "debian7-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "07324CD1A116A7D66B0F56B240F58CD2",
+    "name": "ubuntu1204-32min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu12.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 32,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "D86A31798B9D8EB7DFC28FF377EF7E42",
+    "name": "ubuntu1204-32std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu12.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "806447A8DC74E7FD56C743877B4A61CD",
+    "name": "ubuntu1204-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu12.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "84E3B902821F911BE6B43FA36ADA8199",
+    "name": "ubuntu1204-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu12.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "DBC37D7DF1726331AFC8A2153FC80EF0",
+    "name": "CentOS 7",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "61FA286137BD4E113DFEC6EE0BA5BEBD",
+    "name": "FreeBSD 10",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Others",
+    "os": "FreeBSD10",
+    "os_version": "FreeBSD",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "31CEEE904708A5354F0D119CA3E1C3D7",
+    "name": "FreeBSD 10",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Others",
+    "os": "FreeBSD10",
+    "os_version": "FreeBSD",
+    "os_architecture": 32,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "18AE0A62911AD1CC145DF6A4D92BD354",
+    "name": "Red Hat 7",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "RedHat7",
+    "os_version": "RedHat",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "9FB167C5495AC815C3A3CBF273123879",
+    "name": "w2012r2datacenter64std+SQL2014express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "31433BA1341A3EEED81ACE7DDDFA37BD",
+    "name": "w2012r2datacenter64std+SQL2014web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "1921A315152482071F4B36E4D141EC8A",
+    "name": "w2012r2datacenter64std+SQL2014std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "1B53FF641F19052859DA26CF799CC9D2",
+    "name": "w2008r2datacenter64std+SQL2014express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "D5FA67DFD00DB9F4FBFC363374B93306",
+    "name": "w2008r2datacenter64std+SQL2014web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "100E5AC8FA0690EBD9AE6937E5587991",
+    "name": "w2008r2datacenter64std+SQL2014std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "8B7DE48FF94B2407B7455B76F608F8CD",
+    "name": "w2012r2datacenter64min+SQL2014express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "BCA00B58DD301EBC649FEAC96377E7DC",
+    "name": "w2012r2datacenter64min+SQL2014web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "0398F06DE0FF331539842ADFB96279AB",
+    "name": "w2012r2datacenter64min+SQL2014std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "F61E08E34CA0B44904A331A83EED6AE2",
+    "name": "w2008r2datacenter64min+SQL2014express",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "729F1DB5BBB2EEC6EBC6651ABB19AE85",
+    "name": "w2008r2datacenter64min+SQL2014web",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "1EAFCF5E37C3331590AC7E3266ECF12E",
+    "name": "w2008r2datacenter64min+SQL2014std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2008R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia SQL Server 2014 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Datacenter"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "0735AA79194B274179A8FADE62208FED",
+    "name": "Solaris 10",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Others",
+    "os": "Solaris10",
+    "os_version": "Solaris",
+    "os_architecture": 32,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E8F733BBB99D1313652F5690D87B0E77",
+    "name": "Solaris 10",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Others",
+    "os": "Solaris10",
+    "os_version": "Solaris",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "F7E14983198CDC318267A5D0DEA330D8",
+    "name": "centos7-64std+cpanel",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "cPanel 11"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "6C902E5899CC6F7ED18595EBEB542EE1",
+    "name": "Docker",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 30,
+    "licenses": [],
+    "version": null,
+    "categories": [
+      "DEVELOPER TOOLS",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "8ED1E267A9E1367F731B4AE624FDF1C0",
+    "name": "W2012R2DATACENTER64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "35A31E95A968545236B2584771D3B8CA",
+    "name": "W2012R2DATACENTER64STD+SQL2012EXPRESS+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "698D35B35E01506574B4DA83A095C444",
+    "name": "W2012R2DATACENTER64STD+SQL2012WEB+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Licencia SQL Server 2012 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "2E79303E264846125F7AD6877AE155B5",
+    "name": "W2012R2DATACENTER64STD+SQL2012STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Licencia SQL Server 2012 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "F38F08898A742CF3046F8F825C9B199A",
+    "name": "UBUNTU1404-64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu14.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "AAC4EF1852B735A52D8D531381B81500",
+    "name": "CENTOS7-64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "051BC8159D2014F2B2D333E5D9BB671B",
+    "name": "DEBIAN7-32STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "D04943D702F82A1FC29B42FD635ACB51",
+    "name": "DEBIAN7-64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E5712C6F4ACFC3BCADFBBA2C0681E629",
+    "name": "UBUNTU1204-32STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu12.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E935C4BAA226D7179FF3EB753B4F9323",
+    "name": "UBUNTU1204-64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu12.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "A94D4970684581C3CFC135AE80E1FC39",
+    "name": "W2012R2DATACENTER64STD+SQL2014EXPRESS+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "BD727924A1E53F7D3B9D7B811F339D6B",
+    "name": "W2012R2DATACENTER64STD+SQL2014WEB+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Licencia SQL Server 2014 Web Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "95736E72DD3FFF9A825FF17ABBB96671",
+    "name": "W2012R2DATACENTER64STD+SQL2014STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Windows",
+    "os": "Windows2012R2",
+    "os_version": "WindowsDatacenter",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      },
+      {
+        "name": "Licencia SQL Server 2014 Standard Edition"
+      },
+      {
+        "name": "Windows 2012 Standard"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "C572494C271ED64142E5FD93E084BBFC",
+    "name": "CentOS 6",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "2D593C41B3EB2BA345AFE806A5BA41A3",
+    "name": "CentOS 6",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 32,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "5EDF485861FB263DDBB7C04867346A6E",
+    "name": "Plesk",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": "12.5",
+    "categories": [
+      "DEVELOPER TOOLS",
+      "INFRASTRUCTURE",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "96D5CEB497043FD54E834DEC4B8FF70A",
+    "name": "cPanel",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "cPanel 11"
+      }
+    ],
+    "version": null,
+    "categories": [
+      "DEVELOPER TOOLS",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "EAB1D06D1B78654A6E391FAC48BAA4B1",
+    "name": "Sharelock",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "0.1.0pre-4-r04",
+    "categories": [
+      "APPLICATION SECURITY",
+      "PASSWORD MANAGEMENT"
+    ]
+  },
+  {
+    "id": "2D012C80C31413503F1E31355CAA0240",
+    "name": "WildFly",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "10.0.0-0",
+    "categories": [
+      "APPLICATION SERVER",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "CACF27D3256071F13E471FCF5C25FCF7",
+    "name": "SimpleInvoices",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2013.1.beta.8-3",
+    "categories": [
+      "ACCOUNTING"
+    ]
+  },
+  {
+    "id": "A2302EA99E2A7E894277C4CF124F8951",
+    "name": "PROST",
+    "available_datacenters": [
+      "4EFAD5836CE43ACA502FD5B99BEE44EF"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu14.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "MY_IMAGE",
+    "min_hdd_size": 40,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "CA020E48664C63D5DBA879774B80632C",
+    "name": "KNOPPIX_7.6.1_32BITS",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Knoppix 7.6.1",
+    "os_version": "Knoppix",
+    "os_architecture": 32,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E678D53FF49EA13026C8CAE565373858",
+    "name": "KNOPPIX_7.6.1_64BITS",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Knoppix 7.6.1",
+    "os_version": "Knoppix",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "7BCAA13B5B5A9E11B496B3E2A7E49D7B",
+    "name": "Debian 8",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "590C67467416363FFA6DAEBA939CE9AA",
+    "name": "Debian 8",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "ISO_OS",
+    "type": "ISO",
+    "min_hdd_size": null,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "2193D3FE6136ECC25A2BCF5F506478A6",
+    "name": "debian8-32min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "C4DA59C0E4D5C63E89536ABF309DD942",
+    "name": "debian8-32std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "E9783B668B3E3D3C46A47B68ECA49858",
+    "name": "DEBIAN8-32STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "FF696FFE6FB96FC54638DB47E9321E25",
+    "name": "debian8-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "868B25F5DDC3E110ACDEF034B1B81863",
+    "name": "debian8-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "74B24B20E8DC35548B3A11387C1B3BCD",
+    "name": "DEBIAN8-64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian8",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "6D9435667B9BFC6583C9D052F0F1D48B",
+    "name": "ubuntu1604-32min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu16.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 32,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "4871EEE48030E0E5FAE813B780760BCD",
+    "name": "ubuntu1604-32std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu16.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "753E3C1F859874AA74EB63B3302601F5",
+    "name": "ubuntu1604-64min",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu16.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "MINIMAL",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "4DBFA2D31B1A303A9CE0E4ECF8838FDE",
+    "name": "ubuntu1604-64std",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu16.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "5FEDF374F19FE3BFA536DBC0660DDB1E",
+    "name": "Publify",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "8.2.0-3",
+    "categories": [
+      "BLOG"
+    ]
+  },
+  {
+    "id": "A66EC633504CE600B9D659EA28082732",
+    "name": "Squash",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "20151209-4",
+    "categories": [
+      "CODE REVIEW"
+    ]
+  },
+  {
+    "id": "93DF6BD0351A6E1BF698896F95E8CFE4",
+    "name": "REFINERY CMS",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.1.5-8",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "E08D613211F4CFC7367052614BA0E1E7",
+    "name": "Spree",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.0.7-2",
+    "categories": [
+      "E-COMMERCE"
+    ]
+  },
+  {
+    "id": "3DEF9E1E82F8F14B7AC57595990E2E2E",
+    "name": "OPEN EDX",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "20160414-2",
+    "categories": [
+      "COLLABORATION",
+      "ELEARNING"
+    ]
+  },
+  {
+    "id": "E8564D74944AC4F005E8CE951340D849",
+    "name": "WordPress",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "4.5.2.php56-0",
+    "categories": [
+      "BLOG",
+      "CMS"
+    ]
+  },
+  {
+    "id": "49130A36E7961805F0F3494D47724625",
+    "name": "CANVAS LMS",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2016.04.23.03-1",
+    "categories": [
+      "ELEARNING"
+    ]
+  },
+  {
+    "id": "040FBEF43407931C74EE074CCEC759AF",
+    "name": "CENTOS6-64STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "FDB280E565E2CC9D210BBE0F7B688E45",
+    "name": "CENTOS6-32STD+PLESK12.5UNLIMITED",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos6",
+    "os_version": "Centos",
+    "os_architecture": 32,
+    "os_image_type": "STANDARD",
+    "type": "IMAGE",
+    "min_hdd_size": 20,
+    "licenses": [
+      {
+        "name": "Licencia Plesk 10.4 - Ilimitados dominios"
+      }
+    ],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "6044F1B4DCAAB9F877ED7BBE2B6F26BE",
+    "name": "TYPO3",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "8.1.2-0",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "7C48549F3DED9540B7CE75F761C96F62",
+    "name": "PostgreSQL",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "9.5.3-0",
+    "categories": [
+      "DATABASE",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "D15BA431C4EBE5AAA454892309E69A44",
+    "name": "Redis",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.2.1-0",
+    "categories": [
+      "DATABASE",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "274A1F47D79E07587939BF90A7845176",
+    "name": "Memcached",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "1.4.28-0",
+    "categories": [
+      "CACHE",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "D1C6FCCBA91EDEA95B7F3EA3C4B0F91E",
+    "name": "RabbitMQ",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.6.3-0",
+    "categories": [
+      "DEVELOPER TOOLS",
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "332AEAC8F58655EF5C6CFC18BDEAB5BB",
+    "name": "Redmine",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.3.0-1-r05",
+    "categories": [
+      "BUG TRACKING",
+      "DEVELOPER TOOLS",
+      "POPULAR",
+      "PROJECT MANAGEMENT"
+    ]
+  },
+  {
+    "id": "1DDB874AC504E01DF1357D961274BEAE",
+    "name": "OpenProject",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "5.0.19-1-r05",
+    "categories": [
+      "PROJECT MANAGEMENT"
+    ]
+  },
+  {
+    "id": "F213BAD2BC86F2383656606D1800070E",
+    "name": "CHT1-GB-IMAGE",
+    "available_datacenters": [
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Debian7",
+    "os_version": "Debian",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "MY_IMAGE",
+    "min_hdd_size": 30,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "1DC90B8D32CC6DB41FE2ABA027381AEA",
+    "name": "CHT1-DE-IMAGE_20160720",
+    "available_datacenters": [
+      "4EFAD5836CE43ACA502FD5B99BEE44EF"
+    ],
+    "os_family": "Linux",
+    "os": "Ubuntu16.04",
+    "os_version": "Ubuntu",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "MY_IMAGE",
+    "min_hdd_size": 30,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "DA40BC2BC45E15117E723E07648AB74C",
+    "name": "CHT1-ES-IMAGE",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "MY_IMAGE",
+    "min_hdd_size": 30,
+    "licenses": [],
+    "version": null,
+    "categories": []
+  },
+  {
+    "id": "FD7D017C0BDD327F3DF206A85699FFF5",
+    "name": "ocPortal",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "9.0.28-0",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "74FECE8CC262CB31A11F051499B1B30E",
+    "name": "NGINX",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "1.10.1-1",
+    "categories": [
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "F84262237686F207C9E961EEBF7F9A05",
+    "name": "MyBB",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "1.8.7-2",
+    "categories": [
+      "FORUM"
+    ]
+  },
+  {
+    "id": "FB593AF3F89A8B26B0B6E78F2E232B39",
+    "name": "PrestaShop",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "1.6.1.6-2",
+    "categories": [
+      "E-COMMERCE",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "DE91B3C9C152C3A9189F170F9F0A8CD0",
+    "name": "MediaWiki",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "1.26.3-1",
+    "categories": [
+      "WIKI"
+    ]
+  },
+  {
+    "id": "2C0D250864B6EA5D0898A20A950D35ED",
+    "name": "Drupal",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "7.50-2",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "BAA7787F8931D571A572192E3F663384",
+    "name": "Joomla!",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.6.0-1",
+    "categories": [
+      "CMS",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "CB7DE59A819E818711A9E339E7C9E618",
+    "name": "ownCloud",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "9.1.0-0",
+    "categories": [
+      "MEDIA SHARING",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "DA24D87F4772BFE5FAB3EB112CA66A90",
+    "name": "SugarCRM",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "6.5.24-0",
+    "categories": [
+      "CRM"
+    ]
+  },
+  {
+    "id": "C86A0850D804AEB0222E486BE3208983",
+    "name": "WORDPRESS MULTISITE",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "4.5.3-1",
+    "categories": [
+      "BLOG",
+      "CMS"
+    ]
+  },
+  {
+    "id": "64D9900D1EA66D4FE4479B8C34EBB88B",
+    "name": "WordPress",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "4.5.3-1",
+    "categories": [
+      "BLOG",
+      "CMS",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "6AF74675A2203B02E0E2D717CA9EF9B1",
+    "name": "phpBB",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.1.9-2",
+    "categories": [
+      "FORUM"
+    ]
+  },
+  {
+    "id": "F6363C60A8D4C25107419C6DC9071FEE",
+    "name": "XOOPS",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.5.7.2-3",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "D41BE971AC2EDC441F81972AA56BE301",
+    "name": "OrangeHRM",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.3.2-2",
+    "categories": [
+      "HUMAN RESOURCE MANAGEMENT"
+    ]
+  },
+  {
+    "id": "91AF83F9EA73478EEC2DA5D11480FD9C",
+    "name": "Mean",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.2.8-1",
+    "categories": [
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "94118CB46246C958A542D5E21AE4098E",
+    "name": "ResourceSpace",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "7.8-3",
+    "categories": [
+      "MEDIA SHARING",
+      "PHOTO SHARING",
+      "VIDEO SHARING"
+    ]
+  },
+  {
+    "id": "D9A859F560AA227DD07488945459DDFF",
+    "name": "Odoo",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "9.0.20160620-2",
+    "categories": [
+      "CRM",
+      "ERP",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "AC223698D543228BD97BB355112DC887",
+    "name": "LIVE HELPER CHAT",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.46v-1",
+    "categories": [
+      "CHAT"
+    ]
+  },
+  {
+    "id": "41BA5BD5A162B87C5275854CBF3BC4D3",
+    "name": "Moodle",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.1.1-1",
+    "categories": [
+      "ELEARNING",
+      "POPULAR"
+    ]
+  },
+  {
+    "id": "2C191B48E1B1E678951CA83C7F14BA01",
+    "name": "Ruby",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.3.1-4",
+    "categories": [
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "A20125D799D01E829AB996B73499501F",
+    "name": "Hadoop",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.7.2-1",
+    "categories": [
+      "DEVELOPER TOOLS"
+    ]
+  },
+  {
+    "id": "C9C4E5912736CF2928BC412E8FD1DC1E",
+    "name": "EXO PLATFORM",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "4.3.0-4",
+    "categories": [
+      "SOCIAL NETWORKING"
+    ]
+  },
+  {
+    "id": "F823CA021043AE2D08913ED689994F6A",
+    "name": "LET&#39;S CHAT",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "0.4.7-1",
+    "categories": [
+      "CHAT",
+      "COLLABORATION",
+      "SOCIAL NETWORKING"
+    ]
+  },
+  {
+    "id": "53133AE1EB34BBD576A17F345CD95467",
+    "name": "JRuby",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "9.1.2.0-1",
+    "categories": [
+      "INFRASTRUCTURE"
+    ]
+  },
+  {
+    "id": "206A0FB72271162B051E7E6B61E0E3B9",
+    "name": "Liferay",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "7.0.1-2",
+    "categories": [
+      "PORTAL SERVER"
+    ]
+  },
+  {
+    "id": "3C54989CFAAC3866BA0D09595433B1DF",
+    "name": "Openfire",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "4.0.2-2",
+    "categories": [
+      "CHAT"
+    ]
+  },
+  {
+    "id": "704E8A5FAF76C2AFF2D6B747F2833E51",
+    "name": "Neos",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.1.6-3",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "169077A5C3977104306F38F8E5799D21",
+    "name": "Noalyss",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "6.9.0.0-4",
+    "categories": [
+      "ACCOUNTING"
+    ]
+  },
+  {
+    "id": "137727284539B72CB5CC594BDA11ACCA",
+    "name": "PROCESSMAKER OPEN SOURCE EDITION",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.0.1.8-3",
+    "categories": [
+      "BPM",
+      "COLLABORATION"
+    ]
+  },
+  {
+    "id": "54627DC0DBFBC1CAEAD9CB65B6335E14",
+    "name": "OpenCart",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.2.0.0-2",
+    "categories": [
+      "E-COMMERCE"
+    ]
+  },
+  {
+    "id": "7E09821C352A16C055216BF337261172",
+    "name": "OPEN ATRIUM",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.54-3",
+    "categories": [
+      "CMS",
+      "PROJECT MANAGEMENT"
+    ]
+  },
+  {
+    "id": "75E9BF70942168A9F2A184830AD52C1E",
+    "name": "Pootle",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "2.7.3-1",
+    "categories": [
+      "TRANSLATION TOOLS"
+    ]
+  },
+  {
+    "id": "EC1971DE44DDB26B228AAF7E3E09B0F9",
+    "name": "Pimcore",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.1.1-5",
+    "categories": [
+      "CMS"
+    ]
+  },
+  {
+    "id": "9583B74D82356958FA0ECC6919D90336",
+    "name": "phpList",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": "3.2.5-1",
+    "categories": [
+      "NEWSLETTER MANAGER"
+    ]
+  },
+  {
+    "id": "FEB02845D85AA3CC2A044C34EF82990F",
+    "name": "OSQA",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+      "908DC2072407C94C8054610AD5A53B8C",
+      "4EFAD5836CE43ACA502FD5B99BEE44EF",
+      "5091F6D8CBFEF9C26ACE957C652D5D49"
+    ],
+    "os_family": "Linux",
+    "os": "Centos7",
+    "os_version": "Centos",
+    "os_architecture": 64,
+    "os_image_type": null,
+    "type": "APPLICATION",
+    "min_hdd_size": 20,
+    "licenses": [],
+    "version": null,
+    "categories": [
+      "FORUM"
+    ]
+  },
+  {
+    "id": "B1E51217B6EACE01AAD94DAD749DA7D7",
+    "name": "OXID ESHOP",
+    "available_datacenters": [
+      "81DEF28500FBC2A973FC0C620DF5B721",
+ 

<TRUNCATED>

[07/11] libcloud git commit: Addressing PR remarks

Posted by an...@apache.org.
Addressing PR remarks


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/560f0e44
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/560f0e44
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/560f0e44

Branch: refs/heads/trunk
Commit: 560f0e4450c1259e49731393c4b69410abff7a05
Parents: 0fd856f
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Apr 11 01:54:58 2017 +0200
Committer: jasminSPC <ja...@stackpointcloud.com>
Committed: Tue Apr 11 01:54:58 2017 +0200

----------------------------------------------------------------------
 libcloud/compute/drivers/oneandone.py | 279 ++++++++++++++---------------
 1 file changed, 138 insertions(+), 141 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/560f0e44/libcloud/compute/drivers/oneandone.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/oneandone.py b/libcloud/compute/drivers/oneandone.py
index a33fe3d..afe356e 100644
--- a/libcloud/compute/drivers/oneandone.py
+++ b/libcloud/compute/drivers/oneandone.py
@@ -199,44 +199,44 @@ class OneAndOneNodeDriver(NodeDriver):
         Creates a node.
 
         :param name: The name of the new node
-        :type ```str```
+        :type `str`
 
         :param image: Image from list_images
-        :rtype: ``NodeImage``
+        :rtype: image:
 
         :param ex_fixed_instance_size_id:
         Fixed instance size ID from list_sizes
         :rtype: ``str``
 
         :param location: 1&1 Data center Location
-        :type ```NodeLocation```
+        :type `NodeLocation`
 
         :param auth: SSH key or root password
         :type: :class:`NodeAuthSSHKey` or :class:`NodeAuthPassword`
 
         :param ex_ip: IP address
-        :type ```str```
+        :type `str`
 
         :param ex_ssh_key: SSH Key
-        :type ```str```
+        :type `str`
 
         :param password: Password
-        :type ```str```
+        :type `str`
 
         :param ex_monitoring_policy_id:
-        :type ```str```
+        :type `str`
 
         :param ex_firewall_policy_id:
-        :type ```str```
+        :type `str`
 
         :param ex_loadbalancer_id:
-        :type ```str```
+        :type `str`
 
         :param ex_description:
-        :type ```str```
+        :type `str`
 
         :param ex_power_on:
-        :type ```bool```
+        :type `bool`
 
 
         :return:    Instance of class ``Node``
@@ -244,40 +244,40 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         body = {
-            "name": name,
-            "appliance_id": image.id,
-            "hardware": {
-                "fixed_instance_size_id": ex_fixed_instance_size_id
+            'name': name,
+            'appliance_id': image.id,
+            'hardware': {
+                'fixed_instance_size_id': ex_fixed_instance_size_id
             },
         }
 
         if location is not None:
             body['datacenter_id'] = location.id
         if ex_power_on is not None:
-            body["power_on"] = ex_power_on
+            body['power_on'] = ex_power_on
 
         if ex_description is not None:
-            body["description"] = ex_description
+            body['description'] = ex_description
 
         if ex_firewall_policy_id is not None:
-            body["firewall_policy_id"] = ex_firewall_policy_id
+            body['firewall_policy_id'] = ex_firewall_policy_id
 
         if ex_monitoring_policy_id is not None:
-            body["monitoring_policy_id"] = ex_monitoring_policy_id
+            body['monitoring_policy_id'] = ex_monitoring_policy_id
 
         if ex_loadbalancer_id is not None:
-            body["loadbalancer_id"] = ex_loadbalancer_id
+            body['loadbalancer_id'] = ex_loadbalancer_id
 
         if auth is not None:
             if isinstance(auth, NodeAuthPassword):
-                body["password"] = auth.password
+                body['password'] = auth.password
             elif isinstance(auth, NodeAuthSSHKey):
-                body["rsa_key"] = auth.pubkey
+                body['rsa_key'] = auth.pubkey
         if ex_ip is not None:
-            body["ip_id"] = ex_ip
+            body['ip_id'] = ex_ip
 
         response = self.connection.request(
-            action="servers",
+            action='servers',
             data=body,
             method='POST',
         )
@@ -398,7 +398,7 @@ class OneAndOneNodeDriver(NodeDriver):
 
     def ex_modify_server_hardware(self, server_id,
                                   fixed_instance_size_id=None, vcore=None,
-                                  cores_per_processor=None, ram=None, ):
+                                  cores_per_processor=None, ram=None):
         """
         Modifies server's hardware
 
@@ -415,7 +415,7 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``int``
 
         :param ram: Amount of ram for the server
-        :rtype: ``int```
+        :rtype: ``int``
 
         :return:    Instance of class ``Node``
         :rtype:     :class: `Node`
@@ -424,13 +424,13 @@ class OneAndOneNodeDriver(NodeDriver):
         body = {}
 
         if fixed_instance_size_id is not None:
-            body["firewall_policy_id"] = fixed_instance_size_id
+            body['firewall_policy_id'] = fixed_instance_size_id
         if vcore is not None:
-            body["vcore"] = vcore
+            body['vcore'] = vcore
         if cores_per_processor is not None:
-            body["cores_per_processor"] = cores_per_processor
+            body['cores_per_processor'] = cores_per_processor
         if ram is not None:
-            body["ram"] = ram
+            body['ram'] = ram
 
         response = self.connection.request(
             action='servers/%s/hardware' % server_id,
@@ -465,7 +465,7 @@ class OneAndOneNodeDriver(NodeDriver):
         body = {}
 
         if size is not None:
-            body[size] = size
+            body['size'] = size
 
             response = self.connection.request(
                 action='servers/%s/hardware/hdds/%s' % (server_id, hdd_id),
@@ -492,8 +492,8 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype:     :class: `Node`
         """
         body = {
-            "size": size,
-            "is_main": is_main
+            'size': size,
+            'is_main': is_main
         }
 
         response = self.connection.request(
@@ -574,8 +574,8 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         shutdown_body = {
-            "action": "POWER_OFF",
-            "method": method
+            'action': 'POWER_OFF',
+            'method': method
         }
         response = self.connection.request(
             action='servers/%s/status/action' % (server_id),
@@ -622,11 +622,11 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         body = {
-            "id": image_id,
+            'id': image_id,
         }
 
         if password is not None:
-            body["password"] = password
+            body['password'] = password
 
         response = self.connection.request(
             action='servers/%s/image' % server_id,
@@ -691,7 +691,7 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         body = {
-            "type": ip_type
+            'type': ip_type
         }
 
         response = self.connection.request(
@@ -789,7 +789,7 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``Node``
         """
         body = {
-            "id": firewall_id
+            'id': firewall_id
         }
         response = self.connection.request(
             action='/servers/%s/ips/%s/firewall_policy' % (server_id, ip_id),
@@ -811,17 +811,17 @@ class OneAndOneNodeDriver(NodeDriver):
         :param rules:
         :rtype 'dict':  [
                             {
-                            "protocol": "TCP",
-                            "port_from": 80,
-                            "port_to": 80,
-                            "source": "0.0.0.0"
+                            'protocol': 'TCP',
+                            'port_from': 80,
+                            'port_to': 80,
+                            'source': '0.0.0.0'
                             }
                         ]
 
         :return: 'dict' firewall policy
         """
         body = {
-            "name": name
+            'name': name
         }
 
         if description is not None:
@@ -832,7 +832,7 @@ class OneAndOneNodeDriver(NodeDriver):
                 'At least one firewall rule is required.'
             )
         else:
-            body["rules"] = rules
+            body['rules'] = rules
 
         response = self.connection.request(
             action='firewall_policies',
@@ -843,7 +843,7 @@ class OneAndOneNodeDriver(NodeDriver):
         return response.object
 
     def ex_list_firewall_policies(self):
-        """
+        '""
         List firewall policies
         :return: 'dict'
         """
@@ -900,9 +900,9 @@ class OneAndOneNodeDriver(NodeDriver):
 
     def ex_get_shared_storage(self, storage_id):
         """
-                Gets a shared storage
-                :return: 'dict'
-                """
+        Gets a shared storage
+        :return: 'dict'
+        """
         response = self.connection.request(
             action='shared_storages/%s' % (storage_id),
             method='GET'
@@ -922,9 +922,9 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         body = {
-            "name": name,
-            "size": size,
-            "datacenter_id": datacenter_id
+            'name': name,
+            'size': size,
+            'datacenter_id': datacenter_id
         }
 
         if description is not None:
@@ -967,10 +967,10 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: 'dict'
         """
         body = {
-            "severs": [
+            'severs': [
                 {
-                    "id": server_id,
-                    "rights": rights
+                    'id': server_id,
+                    'rights': rights
                 }
             ]
         }
@@ -1040,18 +1040,18 @@ class OneAndOneNodeDriver(NodeDriver):
 
         :param rules: Load balancer rules
         :rtype: ``list`` of ``dict``
-            "rules": [
+            'rules': [
                 {
-                    "protocol": "TCP",
-                    "port_balancer": 80,
-                    "port_server": 80,
-                    "source": "0.0.0.0"
+                    'protocol': 'TCP',
+                    'port_balancer': 80,
+                    'port_server': 80,
+                    'source': '0.0.0.0'
                 },
                 {
-                    "protocol": "TCP",
-                    "port_balancer": 9999,
-                    "port_server": 8888,
-                    "source": "0.0.0.0"
+                    'protocol': 'TCP',
+                    'port_balancer': 9999,
+                    'port_server': 8888,
+                    'source': '0.0.0.0'
                 }
             ]
         :param persistence: Indictes if persistance is set
@@ -1080,8 +1080,8 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         body = {
-            "name": name,
-            "method": method,
+            'name': name,
+            'method': method,
         }
 
         body['rules'] = []
@@ -1157,7 +1157,7 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``dict``
         """
         body = {
-            "server_ips": server_ips,
+            'server_ips': server_ips,
         }
 
         response = self.connection.request(
@@ -1214,7 +1214,7 @@ class OneAndOneNodeDriver(NodeDriver):
         """
 
         body = {
-            "rules": [
+            'rules': [
                 {
                     'protocol': protocol,
                     'port_balancer': port_balancer,
@@ -1713,54 +1713,54 @@ class OneAndOneNodeDriver(NodeDriver):
         :param thresholds: Thresholds for the monitoring policy
         :rtype: ``dict``
         {
-           "cpu":{
-              "warning":{
-                 "value":90,
-                 "alert":false
+           'cpu':{
+              'warning':{
+                 'value':90,
+                 'alert':false
               },
-              "critical":{
-                 "value":95,
-                 "alert":false
+              'critical':{
+                 'value':95,
+                 'alert':false
               }
            },
-           "ram":{
-              "warning":{
-                 "value":90,
-                 "alert":false
+           'ram':{
+              'warning':{
+                 'value':90,
+                 'alert':false
               },
-              "critical":{
-                 "value":95,
-                 "alert":false
+              'critical':{
+                 'value':95,
+                 'alert':false
               }
            },
-           "disk":{
-              "warning":{
-                 "value":80,
-                 "alert":false
+           'disk':{
+              'warning':{
+                 'value':80,
+                 'alert':false
               },
-              "critical":{
-                 "value":90,
-                 "alert":false
+              'critical':{
+                 'value':90,
+                 'alert':false
               }
            },
-           "transfer":{
-              "warning":{
-                 "value":1000,
-                 "alert":false
+           'transfer':{
+              'warning':{
+                 'value':1000,
+                 'alert':false
               },
-              "critical":{
-                 "value":2000,
-                 "alert":false
+              'critical':{
+                 'value':2000,
+                 'alert':false
               }
            },
-           "internal_ping":{
-              "warning":{
-                 "value":50,
-                 "alert":false
+           'internal_ping':{
+              'warning':{
+                 'value':50,
+                 'alert':false
               },
-              "critical":{
-                 "value":100,
-                 "alert":false
+              'critical':{
+                 'value':100,
+                 'alert':false
               }
            }
         }
@@ -1768,10 +1768,10 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``dict``
         [
            {
-              "protocol":"TCP",
-              "port":"22",
-              "alert_if":"RESPONDING",
-              "email_notification":true
+              'protocol':'TCP',
+              'port':'22',
+              'alert_if':'RESPONDING',
+              'email_notification':true
            }
         ]
 
@@ -1780,9 +1780,9 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``dict``
         [
            {
-              "process":"test",
-              "alert_if":"NOT_RUNNING",
-              "email_notification":true
+              'process':'test',
+              'alert_if':'NOT_RUNNING',
+              'email_notification':true
            }
         ]
 
@@ -1966,17 +1966,17 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``dict``
         [
            {
-              "protocol":"TCP",
-              "port":"80",
-              "alert_if":"RESPONDING",
-              "email_notification":true
+              'protocol':'TCP',
+              'port':'80',
+              'alert_if':'RESPONDING',
+              'email_notification':true
            }
         ]
         :return: Instance of a monitoring policy
         :rtype: ``dict``
         """
 
-        body = {"ports": ports}
+        body = {'ports': ports}
 
         response = self.connection.request(
             action='monitoring_policies/%s/ports' % policy_id,
@@ -2058,16 +2058,16 @@ class OneAndOneNodeDriver(NodeDriver):
         :rtype: ``list`` of ``dict``
         [
           {
-            "process": "taskmmgr",
-            "alert_if": "RUNNING",
-            "email_notification": true
+            'process': 'taskmmgr',
+            'alert_if': 'RUNNING',
+            'email_notification': true
           }
         ]
         :return: Instance of a monitoring policy
         :rtype: ``dict``
-        """
+        '""
 
-        body = {"processes": processes}
+        body = {'processes': processes}
 
         response = self.connection.request(
             action='monitoring_policies/%s/processes' % policy_id,
@@ -2141,8 +2141,8 @@ class OneAndOneNodeDriver(NodeDriver):
         return response.object
 
     """
-        Private Functions
-        """
+    Private Functions
+    """
 
     def _to_images(self, object, image_type=None):
         if image_type is not None:
@@ -2169,20 +2169,17 @@ class OneAndOneNodeDriver(NodeDriver):
                          extra=extra)
 
     def _to_node_size(self, data):
-        """
-        Convert into NodeSize
-        """
         return NodeSize(
-            id=data["id"],
-            name=data["name"],
-            ram=data["hardware"]["ram"],
-            disk=data["hardware"]["hdds"][0]["size"],
+            id=data['id'],
+            name=data['name'],
+            ram=data['hardware']['ram'],
+            disk=data['hardware']['hdds'][0]['size'],
             bandwidth=None,
             price=None,
             driver=self.connection.driver,
             extra={
-                'vcores': data['hardware']["vcore"],
-                "cores_per_processor": data['hardware']['cores_per_processor']}
+                'vcores': data['hardware']['vcore'],
+                'cores_per_processor': data['hardware']['cores_per_processor']}
 
         )
 
@@ -2200,28 +2197,28 @@ class OneAndOneNodeDriver(NodeDriver):
 
     def _to_node(self, server):
         extra = {}
-        extra["datacenter"] = server['datacenter']
+        extra['datacenter'] = server['datacenter']
 
         if 'description' in server:
             extra['description'] = server['description']
         if 'status' in server:
-            extra["status"] = server["status"]
+            extra['status'] = server['status']
         if 'image' in server:
-            extra["image"] = server["image"]
+            extra['image'] = server['image']
         if 'hardware' in server:
-            extra["hardware"] = server["hardware"]
+            extra['hardware'] = server['hardware']
         if 'dvd' in server:
-            extra["dvd"] = server["dvd"]
+            extra['dvd'] = server['dvd']
         if 'snapshot' in server:
-            extra["snapshot"] = server["snapshot"]
+            extra['snapshot'] = server['snapshot']
         if 'ips' in server:
-            extra["ips"] = server["ips"]
+            extra['ips'] = server['ips']
         if 'alerts' in server:
-            extra["alerts"] = server["alerts"]
+            extra['alerts'] = server['alerts']
         if 'monitoring_policy' in server:
-            extra["monitoring_policy"] = server["monitoring_policy"]
+            extra['monitoring_policy'] = server['monitoring_policy']
         if 'private_networks' in server:
-            extra["private_networks"] = server["private_networks"]
+            extra['private_networks'] = server['private_networks']
 
         ips = []
 


[09/11] libcloud git commit: Test fix

Posted by an...@apache.org.
Test fix


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/738a1d1f
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/738a1d1f
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/738a1d1f

Branch: refs/heads/trunk
Commit: 738a1d1f201cc04f98fd0f3781bd27060686d8ef
Parents: 38d40fe
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Apr 11 02:11:45 2017 +0200
Committer: jasminSPC <ja...@stackpointcloud.com>
Committed: Tue Apr 11 02:11:45 2017 +0200

----------------------------------------------------------------------
 libcloud/compute/drivers/oneandone.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/738a1d1f/libcloud/compute/drivers/oneandone.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/drivers/oneandone.py b/libcloud/compute/drivers/oneandone.py
index 2a5d1e4..2203a08 100644
--- a/libcloud/compute/drivers/oneandone.py
+++ b/libcloud/compute/drivers/oneandone.py
@@ -2065,7 +2065,7 @@ class OneAndOneNodeDriver(NodeDriver):
         ]
         :return: Instance of a monitoring policy
         :rtype: ``dict``
-        '""
+        """
 
         body = {'processes': processes}