Skip to content

Commit f2d77ce

Browse files
authored
Merge pull request #215 from Syncano/LIB-800
[LIB-800] - Add possibility to define global config
2 parents a0997f4 + 8624d23 commit f2d77ce

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

syncano/models/instances.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
import json
12

3+
import six
4+
from syncano.exceptions import SyncanoValueError
25

36
from . import fields
47
from .base import Model
@@ -74,9 +77,37 @@ class Meta:
7477
'list': {
7578
'methods': ['post', 'get'],
7679
'path': '/v1.1/instances/',
80+
},
81+
'config': {
82+
'methods': ['put', 'get'],
83+
'path': '/v1.1/instances/{name}/snippets/config/',
7784
}
7885
}
7986

87+
def get_config(self):
88+
properties = self.get_endpoint_data()
89+
http_method = 'GET'
90+
endpoint = self._meta.resolve_endpoint('config', properties, http_method)
91+
connection = self._get_connection()
92+
return connection.request(http_method, endpoint)['config']
93+
94+
def set_config(self, config):
95+
if isinstance(config, six.string_types):
96+
try:
97+
config = json.loads(config)
98+
except (ValueError, TypeError):
99+
raise SyncanoValueError('Config string is not a parsable JSON.')
100+
101+
if not isinstance(config, dict):
102+
raise SyncanoValueError('Retrieved Config is not a valid dict object.')
103+
104+
properties = self.get_endpoint_data()
105+
http_method = 'PUT'
106+
endpoint = self._meta.resolve_endpoint('config', properties, http_method)
107+
data = {'config': config}
108+
connection = self._get_connection()
109+
connection.request(http_method, endpoint, data=data)
110+
80111

81112
class ApiKey(Model):
82113
"""
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from syncano.exceptions import SyncanoValueError
4+
from tests.integration_test import InstanceMixin, IntegrationTest
5+
6+
7+
class SnippetConfigTest(InstanceMixin, IntegrationTest):
8+
9+
def test_update_config(self):
10+
config = {
11+
'num': 123,
12+
'foo': 'bar',
13+
'arr': [1, 2, 3, 4],
14+
'another': {
15+
'num': 123,
16+
'foo': 'bar',
17+
'arr': [1, 2, 3, 4]
18+
}
19+
}
20+
self.instance.set_config(config)
21+
saved_config = self.instance.get_config()
22+
self.assertDictContainsSubset(config, saved_config, 'Retrieved config should be equal to saved config.')
23+
24+
def test_update_invalid_config(self):
25+
with self.assertRaises(SyncanoValueError):
26+
self.instance.set_config('invalid config')
27+
with self.assertRaises(SyncanoValueError):
28+
self.instance.set_config([1, 2, 3])
29+
30+
def test_update_existing_config(self):
31+
config = {
32+
'foo': 'bar'
33+
}
34+
self.instance.set_config(config)
35+
saved_config = self.instance.get_config()
36+
self.assertIn('foo', saved_config, 'Retrieved config should contain saved key.')
37+
new_config = {
38+
'new_foo': 'new_bar'
39+
}
40+
self.instance.set_config(new_config)
41+
saved_config = self.instance.get_config()
42+
self.assertDictContainsSubset(new_config, saved_config, 'Retrieved config should be equal to saved config.')
43+
self.assertNotIn('foo', saved_config, 'Retrieved config should not contain old keys.')

0 commit comments

Comments
 (0)