Skip to content

Commit 39b00b3

Browse files
author
Elias Nygren
committed
Merge pull request #11 from UpCloudLtd/0.3.1-devel
0.3.1 devel
2 parents 7120dc2 + 589ada0 commit 39b00b3

15 files changed

+490
-51
lines changed

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
setup(
66
name='upcloud-api',
7-
version='0.3.0',
7+
version='0.3.1',
88
description='UpCloud API Client',
99
author='Elias Nygren',
1010
author_email='elias.nygren@upcloud.com',
1111
maintainer='Elias Nygren',
1212
maintainer_email='elias.nygren@upcloud.com',
1313
url='https://github.com/UpCloudLtd/upcloud-python-api',
1414
packages=['upcloud_api', 'upcloud_api.cloud_manager'],
15-
download='https://github.com/UpCloudLtd/upcloud-python-api/tarball/v0.3.0',
15+
download='https://github.com/UpCloudLtd/upcloud-python-api/tarball/v0.3.1',
1616
license='MIT',
1717
install_requires=[
1818
'future==0.14.3',

test/json_data/server_00798b85-efdc-41ca-8021-f6ef457b8531.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
},
3434
"tags": {
3535
"tag": [
36-
"web1"
36+
"web1",
37+
"web2"
3738
]
3839
},
3940
"timezone" : "UTC",

test/json_data/tag.json

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"tags" : {
3+
"tag" : [
4+
{
5+
"description" : "Description of TheTestTag1",
6+
"name" : "TheTestTag1",
7+
"servers" : {
8+
"server" : [
9+
"0057e20a-6878-43a7-b2b3-530c4a4bdc55",
10+
"00cc17bd-fe22-4305-a0d3-1b81da14de8a"
11+
]
12+
}
13+
},
14+
{
15+
"description" : "Description of TheTestTag2",
16+
"name" : "TheTestTag2",
17+
"servers" : {
18+
"server" : [
19+
"0057e20a-6878-43a7-b2b3-530c4a4bdc55",
20+
"00cc17bd-fe22-4305-a0d3-1b81da14de8a"
21+
]
22+
}
23+
}
24+
]
25+
}
26+
}

test/json_data/tag_TheTestTag.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"tag" : {
3+
"description" : "Description of TheTestTag",
4+
"name" : "TheTestTag",
5+
"servers" : {
6+
"server" : [
7+
"0057e20a-6878-43a7-b2b3-530c4a4bdc55",
8+
"00cc17bd-fe22-4305-a0d3-1b81da14de8a"
9+
]
10+
}
11+
}
12+
}

test/test_server_creation.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,43 @@ def test_create_server(self, manager):
119119
assert server1.core_number == "2"
120120
assert server1.memory_amount == "1024"
121121

122+
# assert ips and storages have correct types
123+
assert type(server1.storage_devices[0]).__name__ == "Storage"
124+
assert type(server1.ip_addresses[0]).__name__ == "IP_address"
125+
126+
# assert new data was populated
127+
assert server1.video_model == "cirrus"
128+
assert server1.vnc == "off"
129+
assert server1.vnc_password == "aabbccdd"
130+
131+
@responses.activate
132+
def test_create_server_with_dict(self, manager):
133+
responses.add(
134+
responses.POST,
135+
Mock.base_url + "/server",
136+
body = Mock.read_from_file("server_create.json"),
137+
status = 202,
138+
content_type='application/json'
139+
)
140+
141+
server1 = {
142+
'core_number': 2, 'memory_amount': 1024, 'hostname': "my.example.com", 'zone': ZONE.Chicago,
143+
'storage_devices': [
144+
{ 'os': "Ubuntu 14.04", 'size': 10 },
145+
{ 'size': 100, 'title': "storage disk 1" },
146+
]}
147+
148+
server1 = manager.create_server(server1)
149+
150+
# assert correct values in response
151+
assert type(server1).__name__ == "Server"
152+
assert server1.core_number == "2"
153+
assert server1.memory_amount == "1024"
154+
155+
# assert ips and storages have correct types
156+
assert type(server1.storage_devices[0]).__name__ == "Storage"
157+
assert type(server1.ip_addresses[0]).__name__ == "IP_address"
158+
122159
# assert new data was populated
123160
assert server1.video_model == "cirrus"
124161
assert server1.vnc == "off"

test/test_tags.py

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
from __future__ import unicode_literals
2+
from __future__ import print_function
3+
from __future__ import division
4+
from __future__ import absolute_import
5+
from builtins import list, object, str
6+
from future import standard_library
7+
standard_library.install_aliases()
8+
9+
from upcloud_api import FirewallRule, Tag
10+
11+
from conftest import Mock
12+
import json, pytest, responses
13+
14+
15+
def tag_post_callback(request):
16+
print(request.body)
17+
request_body = json.loads(request.body)
18+
19+
if "name" not in request_body["tag"]:
20+
raise Exception("required field missing")
21+
22+
if "servers" in request_body["tag"]:
23+
assert isinstance(request_body["tag"]["servers"], dict)
24+
assert isinstance(request_body["tag"]["servers"]["server"], list)
25+
assert isinstance(request_body["tag"]["servers"]["server"][0], str)
26+
27+
if "description" in request_body["tag"]:
28+
assert isinstance(request_body["tag"]["description"], str)
29+
30+
return(201, {}, json.dumps(request_body))
31+
32+
33+
class TestTags(object):
34+
35+
@responses.activate
36+
def test_get_tag(self, manager):
37+
Mock.mock_get("tag/TheTestTag")
38+
tag = manager.get_tag("TheTestTag")
39+
40+
assert tag.name == "TheTestTag"
41+
assert tag.description == "Description of TheTestTag"
42+
assert len(tag.servers) == 2
43+
assert tag.servers[0].uuid == "0057e20a-6878-43a7-b2b3-530c4a4bdc55"
44+
45+
@responses.activate
46+
def test_get_tags(self, manager):
47+
Mock.mock_get("tag")
48+
tags = manager.get_tags()
49+
50+
assert len(tags) == 2
51+
assert tags[0].name == "TheTestTag1"
52+
assert tags[1].name == "TheTestTag2"
53+
assert tags[0].servers[0].uuid == "0057e20a-6878-43a7-b2b3-530c4a4bdc55"
54+
55+
@responses.activate
56+
def test_create_new_tag(self, manager):
57+
58+
for i in range(1,4):
59+
responses.add_callback(
60+
responses.POST,
61+
Mock.base_url + "/tag",
62+
content_type="application/json",
63+
callback=tag_post_callback
64+
)
65+
66+
tag1 = manager.create_tag("Tag1")
67+
tag2 = manager.create_tag("Tag2", "a nice tag")
68+
tag3 = manager.create_tag("Tag3", "a nicer tag", ["00798b85-efdc-41ca-8021-f6ef457b8531"])
69+
70+
assert tag1.name == "Tag1"
71+
assert tag2.name == "Tag2"
72+
assert tag3.name == "Tag3"
73+
assert isinstance(tag3.servers, list)
74+
assert tag3.servers[0].uuid == "00798b85-efdc-41ca-8021-f6ef457b8531"
75+
76+
@responses.activate
77+
def test_edit_tag(self, manager):
78+
79+
Mock.mock_get("tag/TheTestTag")
80+
tag = manager.get_tag("TheTestTag")
81+
82+
responses.add_callback(
83+
responses.PUT,
84+
Mock.base_url + "/tag/TheTestTag",
85+
content_type="application/json",
86+
callback=tag_post_callback
87+
)
88+
89+
tag.name = 'AnotherTestTag'
90+
assert tag._api_name == 'TheTestTag'
91+
92+
tag.save()
93+
94+
assert tag.name == 'AnotherTestTag'
95+
assert tag._api_name == 'AnotherTestTag'
96+
97+
@responses.activate
98+
def test_assign_tags_to_server(self, manager):
99+
data = Mock.mock_get("server/00798b85-efdc-41ca-8021-f6ef457b8531")
100+
server = manager.get_server("00798b85-efdc-41ca-8021-f6ef457b8531")
101+
102+
responses.add(
103+
responses.POST,
104+
Mock.base_url + "/server/00798b85-efdc-41ca-8021-f6ef457b8531/tag/tag1,tag2",
105+
body = json.dumps({ 'foo': 'bar' }),
106+
content_type="application/json",
107+
status=200
108+
)
109+
server.add_tags(["tag1", Tag("tag2")])
110+
111+
for tag in ["web1", "tag1", "tag2"]:
112+
assert tag in server.tags
113+
114+
@responses.activate
115+
def test_remove_tags_from_server(self, manager):
116+
data = Mock.mock_get("server/00798b85-efdc-41ca-8021-f6ef457b8531")
117+
server = manager.get_server("00798b85-efdc-41ca-8021-f6ef457b8531")
118+
119+
responses.add(
120+
responses.POST,
121+
Mock.base_url + "/server/00798b85-efdc-41ca-8021-f6ef457b8531/untag/tag1,tag2",
122+
body = json.dumps({ 'foo': 'bar' }),
123+
content_type="application/json",
124+
status=200
125+
)
126+
server.remove_tags(["tag1", Tag("tag2")])
127+
128+
for tag in ["tag1", "tag2"]:
129+
assert tag not in server.tags
130+
assert "web1" in server.tags
131+

upcloud-python-api.sublime-project

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"translate_tabs_to_spaces": true,
2626
"trim_trailing_white_space_on_save": true,
2727
"ensure_newline_at_eof_on_save": true,
28-
"rulers": [ 79, 99 ],
28+
"rulers": [ 99, 119 ],
2929
"line_numbers": true
3030
}
3131
}

upcloud_api/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
from future import standard_library
1010
standard_library.install_aliases()
1111

12-
__version__ = "0.3.0"
12+
__version__ = "0.3.1"
1313
__author__ = "Elias Nygren"
1414
__author_email__ = "elias.nygren@upcloud.com"
1515
__license__ = "MIT"
1616
__copyright__ = "Copyright (c) 2015 Elias Nygren"
1717

18-
19-
from upcloud_api.server import Server
2018
from upcloud_api.storage import Storage
2119
from upcloud_api.ip_address import IP_address
20+
from upcloud_api.server import Server
2221
from upcloud_api.firewall import FirewallRule
2322
from upcloud_api.tools import OperatingSystems, ZONE
23+
from upcloud_api.tag import Tag
2424
from upcloud_api.cloud_manager.cloud_manager import CloudManager

upcloud_api/cloud_manager/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
from upcloud_api.cloud_manager.ip_address_mixin import IPManager
1010
from upcloud_api.cloud_manager.storage_mixin import StorageManager
1111
from upcloud_api.cloud_manager.firewall_mixin import FirewallManager
12+
from upcloud_api.cloud_manager.tag_mixin import TagManager

upcloud_api/cloud_manager/cloud_manager.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
standard_library.install_aliases()
77

88
from upcloud_api.base import BaseAPI
9-
from upcloud_api.cloud_manager import ServerManager
10-
from upcloud_api.cloud_manager import IPManager
11-
from upcloud_api.cloud_manager import StorageManager
12-
from upcloud_api.cloud_manager import FirewallManager
9+
from upcloud_api.cloud_manager import (
10+
ServerManager, IPManager, StorageManager, FirewallManager, TagManager
11+
)
1312

1413
import base64
1514

1615

17-
class CloudManager(BaseAPI, ServerManager, IPManager, StorageManager, FirewallManager):
16+
class CloudManager(BaseAPI, ServerManager, IPManager, StorageManager, FirewallManager, TagManager):
1817
"""
1918
CloudManager contains the core functionality of the upcloud API library.
2019
All other managers are mixed in so code can be organized in corresponding submanager classes.

0 commit comments

Comments
 (0)