Skip to content

Commit c22f38b

Browse files
authored
Merge pull request #143 from goodcode/create-multiple-droplets
Create multiple droplets
2 parents e4801db + 67f4044 commit c22f38b

3 files changed

Lines changed: 159 additions & 5 deletions

File tree

digitalocean/Droplet.py

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,42 @@ def get_object(cls, api_token, droplet_id):
102102
droplet.load()
103103
return droplet
104104

105+
@classmethod
106+
def create_multiple(*args, **kwargs):
107+
api = BaseAPI(token=kwargs.get("token"))
108+
109+
data = {
110+
"names": kwargs.get("names"),
111+
"size": kwargs.get("size_slug") or kwargs.get("size"),
112+
"image": kwargs.get("image"),
113+
"region": kwargs.get("region"),
114+
"backups": bool(kwargs.get("backups")),
115+
"ipv6": bool(kwargs.get("ipv6")),
116+
"private_networking": bool(kwargs.get("private_networking")),
117+
}
118+
119+
if kwargs.get("ssh_keys"):
120+
data["ssh_keys"] = Droplet.__get_ssh_keys_id_or_fingerprint(
121+
kwargs["ssh_keys"], kwargs.get("token"),
122+
kwargs["names"][0])
123+
124+
if kwargs.get("user_data"):
125+
data["user_data"] = kwargs["user_data"]
126+
127+
droplets = []
128+
129+
data = api.get_data("droplets", type=POST, params=data)
130+
131+
if data:
132+
action_ids = [data["links"]["actions"][0]["id"]]
133+
for droplet_json in data["droplets"]:
134+
droplet_json["token"] = kwargs["token"]
135+
droplet = Droplet(**droplet_json)
136+
droplet.action_ids = action_ids
137+
droplets.append(droplet)
138+
139+
return droplets
140+
105141
def __check_actions_in_data(self, data):
106142
# reloading actions if actions is provided.
107143
if u"actions" in data:
@@ -429,14 +465,15 @@ def change_kernel(self, kernel, return_dict=True):
429465
return_dict
430466
)
431467

432-
def __get_ssh_keys_id_or_fingerprint(self):
468+
@staticmethod
469+
def __get_ssh_keys_id_or_fingerprint(ssh_keys, token, name):
433470
"""
434471
Check and return a list of SSH key IDs or fingerprints according
435472
to DigitalOcean's API. This method is used to check and create a
436473
droplet with the correct SSH keys.
437474
"""
438475
ssh_keys_id = list()
439-
for ssh_key in self.ssh_keys:
476+
for ssh_key in ssh_keys:
440477
if type(ssh_key) in [int, type(2 ** 64)]:
441478
ssh_keys_id.append(int(ssh_key))
442479

@@ -457,12 +494,12 @@ def __get_ssh_keys_id_or_fingerprint(self):
457494

458495
else:
459496
key = SSHKey()
460-
key.token = self.token
497+
key.token = token
461498
results = key.load_by_pub_key(ssh_key)
462499

463500
if results is None:
464501
key.public_key = ssh_key
465-
key.name = "SSH Key %s" % self.name
502+
key.name = "SSH Key %s" % name
466503
key.create()
467504
else:
468505
key = results
@@ -490,12 +527,16 @@ def create(self, *args, **kwargs):
490527
if not self.size_slug and self.size:
491528
self.size_slug = self.size
492529

530+
ssh_keys_id = Droplet.__get_ssh_keys_id_or_fingerprint(self.ssh_keys,
531+
self.token,
532+
self.name)
533+
493534
data = {
494535
"name": self.name,
495536
"size": self.size_slug,
496537
"image": self.image,
497538
"region": self.region,
498-
"ssh_keys": self.__get_ssh_keys_id_or_fingerprint(),
539+
"ssh_keys": ssh_keys_id,
499540
"backups": bool(self.backups),
500541
"ipv6": bool(self.ipv6),
501542
"private_networking": bool(self.private_networking),
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
{
2+
"droplets": [{
3+
"id": 3164494,
4+
"name": "example.com",
5+
"memory": 512,
6+
"vcpus": 1,
7+
"disk": 20,
8+
"locked": true,
9+
"status": "new",
10+
"kernel": {
11+
"id": 2233,
12+
"name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic",
13+
"version": "3.13.0-37-generic"
14+
},
15+
"created_at": "2014-11-14T16:36:31Z",
16+
"features": [
17+
"virtio",
18+
"backups",
19+
"ipv6"
20+
],
21+
"backup_ids": [
22+
23+
],
24+
"snapshot_ids": [
25+
26+
],
27+
"image": {
28+
},
29+
"size_slug": "512mb",
30+
"networks": {
31+
},
32+
"region": {
33+
}
34+
}, {
35+
"id": 3164495,
36+
"name": "example2.com",
37+
"memory": 512,
38+
"vcpus": 1,
39+
"disk": 20,
40+
"locked": true,
41+
"status": "new",
42+
"kernel": {
43+
"id": 2233,
44+
"name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic",
45+
"version": "3.13.0-37-generic"
46+
},
47+
"created_at": "2014-11-14T16:36:31Z",
48+
"features": [
49+
"virtio",
50+
"backups",
51+
"ipv6"
52+
],
53+
"backup_ids": [
54+
55+
],
56+
"snapshot_ids": [
57+
58+
],
59+
"image": {
60+
},
61+
"size_slug": "512mb",
62+
"networks": {
63+
},
64+
"region": {
65+
}
66+
}],
67+
"links": {
68+
"actions": [
69+
{
70+
"id": 36805096,
71+
"rel": "create",
72+
"href": "https://api.digitalocean.com/v2/actions/36805096"
73+
}
74+
]
75+
}
76+
}

digitalocean/tests/test_droplet.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,43 @@ def test_create_no_keys(self):
812812
self.assertEqual(droplet.id, 3164494)
813813
self.assertEqual(droplet.action_ids, [36805096])
814814

815+
@responses.activate
816+
def test_create_multiple_no_keys(self):
817+
data = self.load_from_file('droplet_actions/create_multiple.json')
818+
819+
responses.add(responses.POST, self.base_url + "droplets",
820+
body=data,
821+
status=202,
822+
content_type='application/json')
823+
824+
825+
droplets = digitalocean.Droplet.create_multiple(names=["example.com",
826+
"example2.com"],
827+
size_slug="512mb",
828+
image="ubuntu-14-04-x64",
829+
region="nyc3",
830+
backups=True,
831+
ipv6=True,
832+
private_networking=True,
833+
user_data="Some user data.",
834+
token=self.token)
835+
self.assert_url_query_equal(responses.calls[0].request.url,
836+
self.base_url + "droplets")
837+
self.assertEqual(len(droplets), 2)
838+
self.assertEqual(droplets[0].id, 3164494)
839+
self.assertEqual(droplets[1].id, 3164495)
840+
self.assertEqual(droplets[0].action_ids, [36805096])
841+
self.assertEqual(droplets[1].action_ids, [36805096])
842+
843+
self.maxDiff = None
844+
self.assertEqual(
845+
json.loads(responses.calls[0].request.body),
846+
{u"names": [u"example.com", u"example2.com"], u"region": u"nyc3",
847+
u"user_data": u"Some user data.", u"ipv6": True,
848+
u"private_networking": True, u"backups": True,
849+
u"image": u"ubuntu-14-04-x64", u"size": u"512mb"})
850+
851+
815852
@responses.activate
816853
def test_get_actions(self):
817854
data = self.load_from_file('actions/multi.json')

0 commit comments

Comments
 (0)