Extension AttrDict

Add implementation for some function in AttrDict
in order to avoid recourse to AttrDict._dict

In tests we use dict, but in fact should use _yaml.AttrDict

Change-Id: Ie99f3b05bd65f195f2f81191bff67cbacef1b816
This commit is contained in:
Mikhail 2017-01-24 12:52:03 +04:00
parent cbfd8bf89b
commit 2788592cb8
3 changed files with 37 additions and 28 deletions

View File

@ -74,6 +74,9 @@ class AttrDict(object):
def __str__(self):
return self._json(sort_keys=True)
def __len__(self):
return len(self._dict)
class JSONEncoder(json.JSONEncoder):
def default(self, obj):

View File

@ -11,6 +11,7 @@ from six.moves import zip_longest
from fuel_ccp.common import jinja_utils
from fuel_ccp.common import utils
from fuel_ccp import config
from fuel_ccp.config import _yaml
from fuel_ccp import kubernetes
from fuel_ccp import templates
from fuel_ccp.validation import deploy as deploy_validation
@ -98,7 +99,7 @@ def parse_role(component, topology, configmaps):
cm_version = 'dry-run'
else:
cm_version = _get_configmaps_version(
configmaps, service_dir, files, CONF.configs._dict)
configmaps, service_dir, files, CONF.configs)
for cont in service["containers"]:
daemon_cmd = cont["daemon"]
@ -386,7 +387,7 @@ def _make_topology(nodes, roles, replicas):
raise RuntimeError("Failed to create topology for services")
# Replicas are optional, 1 replica will deployed by default
replicas = replicas or dict()
replicas = replicas or _yaml.AttrDict()
# TODO(sreshetniak): add validation
k8s_nodes = kubernetes.list_k8s_nodes()
@ -416,7 +417,7 @@ def _make_topology(nodes, roles, replicas):
else:
LOG.warning("Role '%s' defined, but unused", role)
replicas = replicas.copy()
replicas = replicas._dict.copy()
for svc, svc_hosts in six.iteritems(service_to_node):
svc_replicas = replicas.pop(svc, None)
@ -570,7 +571,7 @@ def version_diff(from_image, to_image):
def deploy_components(components_map, components):
topology = _make_topology(CONF.nodes, CONF.roles, CONF.replicas._dict)
topology = _make_topology(CONF.nodes, CONF.roles, CONF.replicas)
if not components:
components = set(topology.keys()) & set(components_map.keys())
else:

View File

@ -5,6 +5,7 @@ import fixtures
import mock
import yaml
from fuel_ccp.config import _yaml
from fuel_ccp import deploy
from fuel_ccp.tests import base
@ -387,7 +388,7 @@ class TestDeployMakeTopology(base.TestCase):
self.useFixture(fixtures.MockPatch(
"fuel_ccp.kubernetes.get_object_names", return_value=node_list))
self._roles = {
self._roles = _yaml.AttrDict({
"controller": [
"mysql",
"keystone"
@ -396,25 +397,29 @@ class TestDeployMakeTopology(base.TestCase):
"nova-compute",
"libvirtd"
]
}
})
def test_make_empty_topology(self):
self.assertRaises(RuntimeError,
deploy._make_topology, None, None, None)
deploy._make_topology, _yaml.AttrDict(),
_yaml.AttrDict(), _yaml.AttrDict())
self.assertRaises(RuntimeError,
deploy._make_topology, None, {"spam": "eggs"}, None)
deploy._make_topology, _yaml.AttrDict(),
_yaml.AttrDict({"spam": "eggs"}), _yaml.AttrDict())
self.assertRaises(RuntimeError,
deploy._make_topology, {"spam": "eggs"}, None, None)
deploy._make_topology,
_yaml.AttrDict({"spam": "eggs"}),
_yaml.AttrDict(), _yaml.AttrDict())
def test_make_topology_without_replicas(self):
nodes = {
nodes = _yaml.AttrDict({
"node1": {
"roles": ["controller"]
},
"node[2-3]": {
"roles": ["compute"]
}
}
})
expected_topology = {
"mysql": ["node1"],
@ -423,33 +428,33 @@ class TestDeployMakeTopology(base.TestCase):
"libvirtd": ["node2", "node3"]
}
topology = deploy._make_topology(nodes, self._roles, None)
topology = deploy._make_topology(nodes, self._roles, _yaml.AttrDict())
self.assertDictEqual(expected_topology, topology)
def test_make_topology_without_replicas_unused_role(self):
nodes = {
nodes = _yaml.AttrDict({
"node1": {
"roles": ["controller"]
},
}
})
expected_topology = {
"mysql": ["node1"],
"keystone": ["node1"]
}
topology = deploy._make_topology(nodes, self._roles, None)
topology = deploy._make_topology(nodes, self._roles, _yaml.AttrDict())
self.assertDictEqual(expected_topology, topology)
def test_make_topology_without_replicas_twice_used_role(self):
nodes = {
nodes = _yaml.AttrDict({
"node1": {
"roles": ["controller", "compute"]
},
"node[2-3]": {
"roles": ["compute"]
}
}
})
expected_topology = {
"mysql": ["node1"],
@ -457,18 +462,18 @@ class TestDeployMakeTopology(base.TestCase):
"nova-compute": ["node1", "node2", "node3"],
"libvirtd": ["node1", "node2", "node3"]
}
topology = deploy._make_topology(nodes, self._roles, None)
topology = deploy._make_topology(nodes, self._roles, _yaml.AttrDict())
self.assertDictEqual(expected_topology, topology)
def test_make_topology_without_replicas_twice_used_node(self):
nodes = {
nodes = _yaml.AttrDict({
"node1": {
"roles": ["controller"]
},
"node[1-3]": {
"roles": ["compute"]
}
}
})
expected_topology = {
"mysql": ["node1"],
@ -477,29 +482,29 @@ class TestDeployMakeTopology(base.TestCase):
"libvirtd": ["node1", "node2", "node3"]
}
topology = deploy._make_topology(nodes, self._roles, None)
topology = deploy._make_topology(nodes, self._roles, _yaml.AttrDict())
self.assertDictEqual(expected_topology, topology)
def test_make_topology_replicas_bigger_than_nodes(self):
replicas = {
replicas = _yaml.AttrDict({
"keystone": 2
}
})
nodes = {
nodes = _yaml.AttrDict({
"node1": {
"roles": ["controller"]
}
}
})
self.assertRaises(RuntimeError,
deploy._make_topology, nodes, self._roles, replicas)
def test_make_topology_unspecified_service_replicas(self):
replicas = {
replicas = _yaml.AttrDict({
"foobar": 42
}
})
nodes = {}
nodes = _yaml.AttrDict()
self.assertRaises(RuntimeError,
deploy._make_topology, nodes, self._roles, replicas)