def test_relation_default_service(self): self.get_config_services.return_value = { None: { "service_name": "service", }, "service": { "service_name": "service", }, } self.relations_of_type.return_value = [ {"port": 4242, "hostname": "backend.1", "private-address": "1.2.3.4", "__unit__": "foo/0"}, ] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [('foo-0-4242', '1.2.3.4', 4242, [])], }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_with_sitenames_no_match_but_unit_name(self): self.get_config_services.return_value = { None: { "service_name": "service", }, "foo": { "service_name": "foo", "server_options": ["maxconn 4"], }, } self.relations_of_type.return_value = [ {"port": 4242, "hostname": "backend.1", "sitenames": "bar_service baz_service", "private-address": "1.2.3.4", "__unit__": "foo/0"}, ] expected = { 'foo': { 'service_name': 'foo', 'service_host': '0.0.0.0', 'service_port': 10002, 'server_options': ["maxconn 4"], 'servers': [('foo-0-4242', '1.2.3.4', 4242, ["maxconn 4"])], }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_with_sitenames_no_match_but_unit_name(self): self.get_config_services.return_value = { None: { "service_name": "service", }, "foo": { "service_name": "foo", "server_options": ["maxconn 4"], }, } self.relations_of_type.return_value = [ { "port": 4242, "hostname": "backend.1", "sitenames": "bar_service baz_service", "private-address": "1.2.3.4", "__unit__": "foo/0" }, ] expected = { 'foo': { 'service_name': 'foo', 'service_host': '0.0.0.0', 'service_port': 10002, 'server_options': ["maxconn 4"], 'servers': [('foo-0-4242', '1.2.3.4', 4242, ["maxconn 4"])], }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_no_relation_but_has_servers_from_config(self): self.get_config_services.return_value = { None: { "service_name": "service", }, "service": { "service_name": "service", "servers": [ ("legacy-backend", "1.2.3.1", 4242, ["maxconn 42"]), ] }, } self.relations_of_type.return_value = [] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [ ("legacy-backend", "1.2.3.1", 4242, ["maxconn 42"]), ], }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_relation_default_service(self): self.get_config_services.return_value = { None: { "service_name": "service", }, "service": { "service_name": "service", }, } self.relations_of_type.return_value = [ { "port": 4242, "hostname": "backend.1", "private-address": "1.2.3.4", "__unit__": "foo/0" }, ] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [('foo-0-4242', '1.2.3.4', 4242, [])], }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_no_relation_but_has_servers_from_config(self): self.get_config_services.return_value = { None: { "service_name": "service", }, "service": { "service_name": "service", "servers": [ ("legacy-backend", "1.2.3.1", 4242, ["maxconn 42"]), ] }, } self.relations_of_type.return_value = [] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [ ("legacy-backend", "1.2.3.1", 4242, ["maxconn 42"]), ], }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_with_multiple_units_in_relation_scaleout(self): """ Test multiple units in scaleout mode. Ensure no indirection layer gets created. """ self.config_get.return_value["peering_mode"] = "active-active" self.get_config_services.return_value = { None: { "service_name": "service", }, } unit_get = self.patch_hook("unit_get") unit_get.return_value = "1.2.4.5" self.relations_of_type.return_value = [ { "port": 4242, "private-address": "1.2.4.4", "__unit__": "foo/0", "services": yaml.safe_dump([{ "service_name": "service", "servers": [('foo-0', '1.2.3.4', 4242, ["maxconn 4"])] }]) }, { "__unit__": "foo/1", "hostname": "foo-1", "private-address": "1.2.4.4", "all_services": yaml.dump([ { "service_name": "service", "service_host": "0.0.0.0", "service_options": ["balance leastconn"], "service_port": 4242 }, ]) }, ] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [ ['foo-0', '1.2.3.4', 4242, ["maxconn 4"]], ] }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_relation_data_returns_no_relations(self): self.get_config_services.return_value = { "service": { "service_name": "service", }, } self.relations_of_type.return_value = [] self.assertIs(None, hooks.create_services()) self.log.assert_called_once_with("No backend servers, exiting.") self.write_service_config.assert_not_called()
def test_relation_data_returns_no_relations(self): self.get_config_services.return_value = { "service": { "service_name": "service", }, } self.relations_of_type.return_value = [] self.assertIs(None, hooks.create_services()) self.log.assert_called_once_with("No backend servers, exiting.") self.write_service_config.assert_not_called()
def test_with_multiple_units_in_relation(self): """ Have multiple units specifying "services" in the relation. Make sure data is created correctly with create_services() """ self.get_config_services.return_value = { None: { "service_name": "service", }, } self.relations_of_type.return_value = [ { "port": 4242, "private-address": "1.2.3.4", "__unit__": "foo/0", "services": yaml.safe_dump([{ "service_name": "service", "servers": [('foo-0', '1.2.3.4', 4242, ["maxconn 4"])] }]) }, { "port": 4242, "private-address": "1.2.3.5", "__unit__": "foo/1", "services": yaml.safe_dump([{ "service_name": "service", "servers": [('foo-0', '1.2.3.5', 4242, ["maxconn 4"])] }]) }, ] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [['foo-0', '1.2.3.4', 4242, ["maxconn 4"]], ['foo-0', '1.2.3.5', 4242, ["maxconn 4"]]] }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_relation_no_services(self): self.get_config_services.return_value = {} self.relations_of_type.return_value = [ {"port": 4242, "__unit__": "foo/0", "hostname": "backend.1", "private-address": "1.2.3.4"}, ] self.assertIs(None, hooks.create_services()) self.log.assert_called_once_with("No services configured, exiting.") self.write_service_config.assert_not_called()
def test_relation_no_services(self): self.get_config_services.return_value = {} self.relations_of_type.return_value = [ { "port": 4242, "__unit__": "foo/0", "hostname": "backend.1", "private-address": "1.2.3.4" }, ] self.assertIs(None, hooks.create_services()) self.log.assert_called_once_with("No services configured, exiting.") self.write_service_config.assert_not_called()
def test_no_private_address_in_relation_data(self): self.get_config_services.return_value = { "service": { "service_name": "service", }, } self.relations_of_type.return_value = [ {"port": 4242, "__unit__": "foo/0"}, ] self.assertIs(None, hooks.create_services()) self.log.assert_has_calls([call.log( "No private-address in relation data for 'foo/0', skipping.")]) self.write_service_config.assert_not_called()
def test_with_multiple_units_in_relation_scaleout(self): """ Test multiple units in scaleout mode. Ensure no indirection layer gets created. """ self.config_get.return_value["peering_mode"] = "active-active" self.get_config_services.return_value = { None: { "service_name": "service", }, } unit_get = self.patch_hook("unit_get") unit_get.return_value = "1.2.4.5" self.relations_of_type.return_value = [ {"port": 4242, "private-address": "1.2.4.4", "__unit__": "foo/0", "services": yaml.safe_dump([{ "service_name": "service", "servers": [('foo-0', '1.2.3.4', 4242, ["maxconn 4"])] }]) }, {"__unit__": "foo/1", "hostname": "foo-1", "private-address": "1.2.4.4", "all_services": yaml.dump([ {"service_name": "service", "service_host": "0.0.0.0", "service_options": ["balance leastconn"], "service_port": 4242}, ]) }, ] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [ ['foo-0', '1.2.3.4', 4242, ["maxconn 4"]], ] }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_no_port_in_relation_data(self): self.get_config_services.return_value = { "service": { "service_name": "service", }, } self.relations_of_type.return_value = [ { "private-address": "1.2.3.4", "__unit__": "foo/0" }, ] self.assertIs(None, hooks.create_services()) self.log.assert_has_calls( [call.log("No port in relation data for 'foo/0', skipping.")]) self.write_service_config.assert_not_called()
def test_relation_unknown_service(self): self.get_config_services.return_value = { "service": { "service_name": "service", }, } self.relations_of_type.return_value = [ {"port": 4242, "hostname": "backend.1", "service_name": "invalid", "private-address": "1.2.3.4", "__unit__": "foo/0"}, ] self.assertIs(None, hooks.create_services()) self.log.assert_has_calls([call.log( "Service 'invalid' does not exist.")]) self.write_service_config.assert_not_called()
def test_with_multiple_units_in_relation(self): """ Have multiple units specifying "services" in the relation. Make sure data is created correctly with create_services() """ self.get_config_services.return_value = { None: { "service_name": "service", }, } self.relations_of_type.return_value = [ {"port": 4242, "private-address": "1.2.3.4", "__unit__": "foo/0", "services": yaml.safe_dump([{ "service_name": "service", "servers": [('foo-0', '1.2.3.4', 4242, ["maxconn 4"])] }]) }, {"port": 4242, "private-address": "1.2.3.5", "__unit__": "foo/1", "services": yaml.safe_dump([{ "service_name": "service", "servers": [('foo-0', '1.2.3.5', 4242, ["maxconn 4"])] }]) }, ] expected = { 'service': { 'service_name': 'service', 'service_host': '0.0.0.0', 'service_port': 10002, 'servers': [ ['foo-0', '1.2.3.4', 4242, ["maxconn 4"]], ['foo-0', '1.2.3.5', 4242, ["maxconn 4"]] ] }, } self.assertEqual(expected, hooks.create_services()) self.write_service_config.assert_called_with(expected)
def test_relation_unknown_service(self): self.get_config_services.return_value = { "service": { "service_name": "service", }, } self.relations_of_type.return_value = [ { "port": 4242, "hostname": "backend.1", "service_name": "invalid", "private-address": "1.2.3.4", "__unit__": "foo/0" }, ] self.assertIs(None, hooks.create_services()) self.log.assert_has_calls( [call.log("Service 'invalid' does not exist.")]) self.write_service_config.assert_not_called()