Merge "Add the server-group feature"
This commit is contained in:
commit
f4cd853efe
|
@ -147,6 +147,7 @@ class TemplateGenerator(object):
|
||||||
self.networks = self.build_data(self.neutron.network_list())
|
self.networks = self.build_data(self.neutron.network_list())
|
||||||
self.routers = self.neutron.router_list()
|
self.routers = self.neutron.router_list()
|
||||||
self.secgroups = self.build_data(self.neutron.secgroup_list())
|
self.secgroups = self.build_data(self.neutron.secgroup_list())
|
||||||
|
self.servergroups = self.build_data(self.nova.servergroup_list())
|
||||||
self.floatingips = self.neutron.floatingip_list()
|
self.floatingips = self.neutron.floatingip_list()
|
||||||
self.ports = self.build_data(self.neutron.port_list())
|
self.ports = self.build_data(self.neutron.port_list())
|
||||||
self.external_networks = []
|
self.external_networks = []
|
||||||
|
@ -327,6 +328,16 @@ class TemplateGenerator(object):
|
||||||
resources.append(resource)
|
resources.append(resource)
|
||||||
return resources
|
return resources
|
||||||
|
|
||||||
|
def _extract_servergroups(self):
|
||||||
|
resources = []
|
||||||
|
for n, servergroup in self.servergroups.values():
|
||||||
|
properties = {'name': servergroup.name,
|
||||||
|
'policies': servergroup.policies}
|
||||||
|
resource = Resource("servergroup_%d" % n, 'OS::Nova::ServerGroup',
|
||||||
|
servergroup.id, properties)
|
||||||
|
resources.append(resource)
|
||||||
|
return resources
|
||||||
|
|
||||||
def _extract_keys(self):
|
def _extract_keys(self):
|
||||||
resources = []
|
resources = []
|
||||||
for n, key in self.keys.values():
|
for n, key in self.keys.values():
|
||||||
|
@ -374,6 +385,9 @@ class TemplateGenerator(object):
|
||||||
networks.append({'network': {'get_resource': net}})
|
networks.append({'network': {'get_resource': net}})
|
||||||
return networks
|
return networks
|
||||||
|
|
||||||
|
def get_servergroup_resource_name(self, servergroup_id):
|
||||||
|
return "servergroup_%d" % self.servergroups[servergroup_id][0]
|
||||||
|
|
||||||
def _extract_servers(self):
|
def _extract_servers(self):
|
||||||
resources = []
|
resources = []
|
||||||
for n, server in self.servers.values():
|
for n, server in self.servers.values():
|
||||||
|
@ -457,6 +471,15 @@ class TemplateGenerator(object):
|
||||||
# block devices to an instance
|
# block devices to an instance
|
||||||
properties['block_device_mapping_v2'] = server_volumes
|
properties['block_device_mapping_v2'] = server_volumes
|
||||||
|
|
||||||
|
# server-group
|
||||||
|
for servergroup in self.servergroups.values():
|
||||||
|
if server.id in servergroup[1].members:
|
||||||
|
hint = {'group': {'get_resource':
|
||||||
|
self.get_servergroup_resource_name
|
||||||
|
(servergroup[1].id)}}
|
||||||
|
properties['scheduler_hints'] = \
|
||||||
|
hint
|
||||||
|
|
||||||
resources.append(resource)
|
resources.append(resource)
|
||||||
return resources
|
return resources
|
||||||
|
|
||||||
|
@ -551,6 +574,7 @@ class TemplateGenerator(object):
|
||||||
resources += self._extract_subnets()
|
resources += self._extract_subnets()
|
||||||
resources += self._extract_secgroups()
|
resources += self._extract_secgroups()
|
||||||
resources += self._extract_floating()
|
resources += self._extract_floating()
|
||||||
|
resources += self._extract_servergroups()
|
||||||
|
|
||||||
if not self.exclude_keypairs:
|
if not self.exclude_keypairs:
|
||||||
resources += self._extract_keys()
|
resources += self._extract_keys()
|
||||||
|
|
|
@ -176,6 +176,9 @@ class NovaManager(object):
|
||||||
def server_security_group_list(self, server):
|
def server_security_group_list(self, server):
|
||||||
return self.client().servers.list_security_group(server)
|
return self.client().servers.list_security_group(server)
|
||||||
|
|
||||||
|
def servergroup_list(self):
|
||||||
|
return self.client().server_groups.list(True)
|
||||||
|
|
||||||
|
|
||||||
class CinderManager(object):
|
class CinderManager(object):
|
||||||
"""Manage Cinder resources."""
|
"""Manage Cinder resources."""
|
||||||
|
|
|
@ -93,6 +93,13 @@ class FakeSecurityGroup(FakeBase):
|
||||||
name = 'name'
|
name = 'name'
|
||||||
|
|
||||||
|
|
||||||
|
class FakeServerGroup(FakeBase):
|
||||||
|
name = 'policy_group'
|
||||||
|
id = '1234'
|
||||||
|
policies = 'affinity'
|
||||||
|
members = ['12345']
|
||||||
|
|
||||||
|
|
||||||
class FakeNeutronManager(object):
|
class FakeNeutronManager(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -142,6 +149,7 @@ class FakeNovaManager(object):
|
||||||
self.groups = {}
|
self.groups = {}
|
||||||
self.keypairs = [FakeKeypair(name='testkey',
|
self.keypairs = [FakeKeypair(name='testkey',
|
||||||
public_key='ssh-rsa XXXX')]
|
public_key='ssh-rsa XXXX')]
|
||||||
|
self.servergroups = [FakeServerGroup()]
|
||||||
|
|
||||||
def keypair_list(self):
|
def keypair_list(self):
|
||||||
return self.keypairs
|
return self.keypairs
|
||||||
|
@ -155,6 +163,9 @@ class FakeNovaManager(object):
|
||||||
def server_security_group_list(self, server):
|
def server_security_group_list(self, server):
|
||||||
return self.groups.get(server.name, [])
|
return self.groups.get(server.name, [])
|
||||||
|
|
||||||
|
def servergroup_list(self):
|
||||||
|
return self.servergroups
|
||||||
|
|
||||||
|
|
||||||
class FakeCinderManager(object):
|
class FakeCinderManager(object):
|
||||||
|
|
||||||
|
@ -662,6 +673,23 @@ class StackDataTests(BaseTestCase):
|
||||||
}
|
}
|
||||||
self.check_stackdata(generator._extract_servers(), expected)
|
self.check_stackdata(generator._extract_servers(), expected)
|
||||||
|
|
||||||
|
def test_servergroup(self):
|
||||||
|
self.mock_nova.return_value = FakeNovaManager()
|
||||||
|
generator = self.get_generator(False, False, False, True)
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.check_stackdata(generator._extract_servergroups(), expected)
|
||||||
|
|
||||||
|
|
||||||
class NetworkTests(BaseTestCase):
|
class NetworkTests(BaseTestCase):
|
||||||
|
|
||||||
|
@ -1893,6 +1921,40 @@ class ServerTests(BaseTestCase):
|
||||||
self.check_template(generator._extract_servers(), expected_resources,
|
self.check_template(generator._extract_servers(), expected_resources,
|
||||||
expected_parameters)
|
expected_parameters)
|
||||||
|
|
||||||
|
def test_servergroup(self):
|
||||||
|
self.fake.servers = [FakeServer()]
|
||||||
|
self.fake.servers[0].id = '12345'
|
||||||
|
generator = self.get_generator(False, False, False, True)
|
||||||
|
|
||||||
|
expected_parameters = {
|
||||||
|
'server_0_flavor': {
|
||||||
|
'default': 'm1.small',
|
||||||
|
'description': 'Flavor to use for server server_0',
|
||||||
|
'type': 'string'
|
||||||
|
},
|
||||||
|
'server_0_image': {
|
||||||
|
'description': 'Image to use to boot server server_0',
|
||||||
|
'default': '3333',
|
||||||
|
'type': 'string'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expected_resources = {
|
||||||
|
'server_0': {
|
||||||
|
'type': 'OS::Nova::Server',
|
||||||
|
'properties': {
|
||||||
|
'name': 'server1',
|
||||||
|
'diskConfig': 'MANUAL',
|
||||||
|
'flavor': {'get_param': 'server_0_flavor'},
|
||||||
|
'image': {'get_param': 'server_0_image'},
|
||||||
|
'key_name': {'get_resource': 'key_0'},
|
||||||
|
'scheduler_hints': {'group':
|
||||||
|
{'get_resource': 'servergroup_0'}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.check_template(generator._extract_servers(), expected_resources,
|
||||||
|
expected_parameters)
|
||||||
|
|
||||||
|
|
||||||
class GenerationTests(BaseTestCase):
|
class GenerationTests(BaseTestCase):
|
||||||
|
|
||||||
|
@ -1956,6 +2018,12 @@ class GenerationTests(BaseTestCase):
|
||||||
},
|
},
|
||||||
'type': 'OS::Nova::Server'
|
'type': 'OS::Nova::Server'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'properties': {
|
||||||
|
'name': 'policy_group',
|
||||||
|
'policies': 'affinity'},
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
},
|
||||||
'volume_0': {
|
'volume_0': {
|
||||||
'properties': {
|
'properties': {
|
||||||
'description': 'Description',
|
'description': 'Description',
|
||||||
|
@ -2004,6 +2072,15 @@ class GenerationTests(BaseTestCase):
|
||||||
'status': 'COMPLETE',
|
'status': 'COMPLETE',
|
||||||
'type': 'OS::Nova::Server'
|
'type': 'OS::Nova::Server'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
},
|
||||||
'volume_0': {
|
'volume_0': {
|
||||||
'action': 'CREATE',
|
'action': 'CREATE',
|
||||||
'metadata': {},
|
'metadata': {},
|
||||||
|
@ -2054,6 +2131,13 @@ class GenerationTests(BaseTestCase):
|
||||||
},
|
},
|
||||||
'type': 'OS::Neutron::Router'
|
'type': 'OS::Neutron::Router'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'properties': {
|
||||||
|
'name': 'policy_group',
|
||||||
|
'policies': 'affinity'
|
||||||
|
},
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
},
|
||||||
'volume_0': {
|
'volume_0': {
|
||||||
'properties': {
|
'properties': {
|
||||||
'description': 'Description',
|
'description': 'Description',
|
||||||
|
@ -2093,6 +2177,15 @@ class GenerationTests(BaseTestCase):
|
||||||
'status': 'COMPLETE',
|
'status': 'COMPLETE',
|
||||||
'type': 'OS::Neutron::Router'
|
'type': 'OS::Neutron::Router'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
},
|
||||||
'volume_0': {
|
'volume_0': {
|
||||||
'action': 'CREATE',
|
'action': 'CREATE',
|
||||||
'metadata': {},
|
'metadata': {},
|
||||||
|
@ -2158,6 +2251,12 @@ class GenerationTests(BaseTestCase):
|
||||||
},
|
},
|
||||||
'type': 'OS::Nova::Server'
|
'type': 'OS::Nova::Server'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'properties': {
|
||||||
|
'name': 'policy_group',
|
||||||
|
'policies': 'affinity'},
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expected_data = {
|
expected_data = {
|
||||||
|
@ -2196,6 +2295,15 @@ class GenerationTests(BaseTestCase):
|
||||||
'resource_id': '1234',
|
'resource_id': '1234',
|
||||||
'status': 'COMPLETE',
|
'status': 'COMPLETE',
|
||||||
'type': 'OS::Nova::Server'
|
'type': 'OS::Nova::Server'
|
||||||
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2256,6 +2364,13 @@ class GenerationTests(BaseTestCase):
|
||||||
},
|
},
|
||||||
'type': 'OS::Nova::Server'
|
'type': 'OS::Nova::Server'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'properties': {
|
||||||
|
'name': 'policy_group',
|
||||||
|
'policies': 'affinity'
|
||||||
|
},
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
},
|
||||||
'volume_0': {
|
'volume_0': {
|
||||||
'properties': {
|
'properties': {
|
||||||
'description': 'Description',
|
'description': 'Description',
|
||||||
|
@ -2295,6 +2410,15 @@ class GenerationTests(BaseTestCase):
|
||||||
'status': 'COMPLETE',
|
'status': 'COMPLETE',
|
||||||
'type': 'OS::Nova::Server'
|
'type': 'OS::Nova::Server'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
},
|
||||||
'volume_0': {
|
'volume_0': {
|
||||||
'action': 'CREATE',
|
'action': 'CREATE',
|
||||||
'metadata': {},
|
'metadata': {},
|
||||||
|
@ -2339,6 +2463,13 @@ class GenerationTests(BaseTestCase):
|
||||||
},
|
},
|
||||||
'type': 'OS::Neutron::Router'
|
'type': 'OS::Neutron::Router'
|
||||||
},
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'properties': {
|
||||||
|
'name': 'policy_group',
|
||||||
|
'policies': 'affinity'
|
||||||
|
},
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expected_data = {
|
expected_data = {
|
||||||
|
@ -2368,6 +2499,15 @@ class GenerationTests(BaseTestCase):
|
||||||
'resource_id': '1234',
|
'resource_id': '1234',
|
||||||
'status': 'COMPLETE',
|
'status': 'COMPLETE',
|
||||||
'type': 'OS::Neutron::Router'
|
'type': 'OS::Neutron::Router'
|
||||||
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
generator.extract_data()
|
generator.extract_data()
|
||||||
|
@ -2395,8 +2535,16 @@ class GenerationTests(BaseTestCase):
|
||||||
'name': 'myrouter'
|
'name': 'myrouter'
|
||||||
},
|
},
|
||||||
'type': 'OS::Neutron::Router'
|
'type': 'OS::Neutron::Router'
|
||||||
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'properties': {
|
||||||
|
'name': 'policy_group',
|
||||||
|
'policies': 'affinity'
|
||||||
|
},
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expected_data = {
|
expected_data = {
|
||||||
'network_0': {
|
'network_0': {
|
||||||
'action': 'CREATE',
|
'action': 'CREATE',
|
||||||
|
@ -2415,6 +2563,15 @@ class GenerationTests(BaseTestCase):
|
||||||
'resource_id': '1234',
|
'resource_id': '1234',
|
||||||
'status': 'COMPLETE',
|
'status': 'COMPLETE',
|
||||||
'type': 'OS::Neutron::Router'
|
'type': 'OS::Neutron::Router'
|
||||||
|
},
|
||||||
|
'servergroup_0': {
|
||||||
|
'action': 'CREATE',
|
||||||
|
'metadata': {},
|
||||||
|
'name': 'servergroup_0',
|
||||||
|
'resource_data': {},
|
||||||
|
'resource_id': '1234',
|
||||||
|
'status': 'COMPLETE',
|
||||||
|
'type': 'OS::Nova::ServerGroup'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue