diff --git a/novajoin/ipa.py b/novajoin/ipa.py index dceb4d8..9855a8d 100644 --- a/novajoin/ipa.py +++ b/novajoin/ipa.py @@ -482,13 +482,17 @@ class IPAClient(IPANovaJoinBase): return True return False + def host_get_services(self, service_host): + """Return list of services this host manages""" + LOG.debug('Checking host ' + service_host + ' services') + params = [] + service_args = {'man_by_host': six.text_type(service_host)} + result = self._call_ipa('service_find', *params, **service_args) + return [service['krbprincipalname'][0] for service in result['result']] + def host_has_services(self, service_host): """Return True if this host manages any services""" - LOG.debug('Checking if host ' + service_host + ' has services') - params = [] - service_args = {'man_by_host': service_host} - result = self._call_ipa('service_find', *params, **service_args) - return result['count'] > 0 + return len(self.host_get_services(service_host)) > 0 def find_host(self, hostname): """Return True if this host exists""" diff --git a/novajoin/tests/functional/test_enrollment.py b/novajoin/tests/functional/test_enrollment.py index 8a4999c..e8ef0c3 100644 --- a/novajoin/tests/functional/test_enrollment.py +++ b/novajoin/tests/functional/test_enrollment.py @@ -99,11 +99,33 @@ class TestEnrollment(testtools.TestCase): self._server = self.conn.compute.create_server( name=TEST_INSTANCE, image_id=image.id, flavor_id=flavor.id, networks=[{"uuid": network.id}], key_name=self._key.name, - metadata = {"ipa_enroll": "True"}) + metadata = { + "ipa_enroll": "True", + 'compact_service_http': json.dumps(['test1', 'test2']), + }) server = self.conn.compute.wait_for_server(self._server) return server + def _update_server_compact_service_new(self): + self.conn.compute.set_server_metadata( + self._server, + compact_service_rabbitmq=json.dumps(['test3', 'test4'])) + + def _update_server_compact_service_old(self): + self.conn.compute.delete_server_metadata(self._server, [ + 'compact_service_http', 'compact_service_rabbitmq']) + self.conn.compute.set_server_metadata( + self._server, + compact_services=json.dumps({'http': ['test5', 'test6']})) + + @loopingcall.RetryDecorator(50, 5, 5, (AssertionError,)) + def _check_server_compact_services(self, service_list): + services = ['\\'.join([s.split('/', 1)[0].lower(), s.split('.', 2)[1]]) + for s in self.ipaclient.host_get_services( + TEST_INSTANCE + EXAMPLE_DOMAIN)] + self.assertSetEqual(set(services), set(service_list)) + def _associate_floating_ip(self): self.conn.compute.add_floating_ip_to_server( self._server, self._ip.floating_ip_address) @@ -182,6 +204,19 @@ class TestEnrollment(testtools.TestCase): self._check_ipa_client_install() + self._check_server_compact_services(['http\\test1', 'http\\test2']) + + self._update_server_compact_service_new() + self._check_server_compact_services([ + 'http\\test1', 'http\\test2', + 'rabbitmq\\test3', 'rabbitmq\\test4']) + + self._update_server_compact_service_old() + # NOTE(xek), novajoin doesn't support removing of services via update + self._check_server_compact_services([ + 'http\\test1', 'http\\test2', 'http\\test5', 'http\\test6', + 'rabbitmq\\test3', 'rabbitmq\\test4']) + self._delete_server() self._check_ipa_client_deleted() self._check_ip_record_removed()