From 57834ead2e567be3ef95e71cd60904667ae1d403 Mon Sep 17 00:00:00 2001 From: Ignatious Johnson Christopher Date: Wed, 27 Jul 2016 11:17:16 -0700 Subject: [PATCH] Decouple neutron-server and api-server services. plugin specified in neutron.conf should not try to connect to api-server, until it is used/plugged-in when creating Loadbalancer pool/vip/member/health monitors etc, thus allowing neutron-server to start independently without depending on api-server to be up and running. Closes-Bug: 1586023 (cherry picked from commit bbde8790a437d0cc35d1e89753e59d68fb7a54ec) Change-Id: I377a7459811c96cb725449e08d5ace0565738c1d --- .../loadbalancer/loadbalancer_db.py | 155 +++++++++++------- .../loadbalancer/v2/loadbalancer_db.py | 153 +++++++++++------ 2 files changed, 197 insertions(+), 111 deletions(-) diff --git a/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/loadbalancer_db.py b/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/loadbalancer_db.py index 614163b..a928ca8 100644 --- a/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/loadbalancer_db.py +++ b/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/loadbalancer_db.py @@ -39,103 +39,142 @@ class LoadBalancerPluginDb(LoadBalancerPluginBase): def __init__(self): - admin_user = cfg.CONF.keystone_authtoken.admin_user - admin_password = cfg.CONF.keystone_authtoken.admin_password - admin_tenant_name = cfg.CONF.keystone_authtoken.admin_tenant_name - api_srvr_ip = cfg.CONF.APISERVER.api_server_ip - api_srvr_port = cfg.CONF.APISERVER.api_server_port - api_srvr_use_ssl= cfg.CONF.APISERVER.use_ssl + self.admin_user = cfg.CONF.keystone_authtoken.admin_user + self.admin_password = cfg.CONF.keystone_authtoken.admin_password + self.admin_tenant_name = cfg.CONF.keystone_authtoken.admin_tenant_name + self.api_srvr_ip = cfg.CONF.APISERVER.api_server_ip + self.api_srvr_port = cfg.CONF.APISERVER.api_server_port + self.api_srvr_use_ssl= cfg.CONF.APISERVER.use_ssl try: - auth_host = cfg.CONF.keystone_authtoken.auth_host + self.auth_host = cfg.CONF.keystone_authtoken.auth_host except cfg.NoSuchOptError: - auth_host = "127.0.0.1" + self.auth_host = "127.0.0.1" try: - auth_protocol = cfg.CONF.keystone_authtoken.auth_protocol + self.auth_protocol = cfg.CONF.keystone_authtoken.auth_protocol except cfg.NoSuchOptError: - auth_protocol = "http" + self.auth_protocol = "http" try: - auth_port = cfg.CONF.keystone_authtoken.auth_port + self.auth_port = cfg.CONF.keystone_authtoken.auth_port except cfg.NoSuchOptError: - auth_port = "35357" + self.auth_port = "35357" try: - auth_url = cfg.CONF.keystone_authtoken.auth_url + self.auth_url = cfg.CONF.keystone_authtoken.auth_url except cfg.NoSuchOptError: - auth_url = "/v2.0/tokens" + self.auth_url = "/v2.0/tokens" try: - auth_type = cfg.CONF.keystone_authtoken.auth_type + self.auth_type = cfg.CONF.keystone_authtoken.auth_type except cfg.NoSuchOptError: - auth_type = "keystone" + self.auth_type = "keystone" try: - api_server_url = cfg.CONF.APISERVER.api_server_url + self.api_server_url = cfg.CONF.APISERVER.api_server_url except cfg.NoSuchOptError: - api_server_url = "/" + self.api_server_url = "/" + + @property + def api(self): + if hasattr(self, '_api'): + return self._api # Retry till a api-server is up connected = False while not connected: try: - self._api = VncApi(admin_user, admin_password, admin_tenant_name, - api_srvr_ip, api_srvr_port, api_server_url, - auth_host=auth_host, auth_port=auth_port, - auth_protocol=auth_protocol, auth_url=auth_url, - auth_type=auth_type, wait_for_connect=True, - api_server_use_ssl=api_srvr_use_ssl) + self._api = VncApi(self.admin_user, self.admin_password, + self.admin_tenant_name, self.api_srvr_ip, + self.api_srvr_port, self.api_server_url, + auth_host=self.auth_host, auth_port=self.auth_port, + auth_protocol=self.auth_protocol, + auth_url=self.auth_url, auth_type=self.auth_type, + wait_for_connect=True, + api_server_use_ssl=self.api_srvr_use_ssl) connected = True except requests.exceptions.RequestException: time.sleep(3) + return self._api + + @property + def pool_manager(self): + if hasattr(self, '_pool_manager'): + return self._pool_manager self._pool_manager = \ - loadbalancer_pool.LoadbalancerPoolManager(self._api) - self._vip_manager = virtual_ip.VirtualIpManager(self._api) + loadbalancer_pool.LoadbalancerPoolManager(self.api) + + return self._pool_manager + + @property + def vip_manager(self): + if hasattr(self, '_vip_manager'): + return self._vip_manager + + self._vip_manager = virtual_ip.VirtualIpManager(self.api) + + return self._vip_manager + + @property + def member_manager(self): + if hasattr(self, '_member_manager'): + return self._member_manager + self._member_manager = \ - loadbalancer_member.LoadbalancerMemberManager(self._api) + loadbalancer_member.LoadbalancerMemberManager(self.api) + + return self._member_manager + + @property + def monitor_manager(self): + if hasattr(self, '_monitor_manager'): + return self._monitor_manager + self._monitor_manager = \ loadbalancer_healthmonitor.LoadbalancerHealthmonitorManager( - self._api) + self.api) + + return self._monitor_manager def get_api_client(self): - return self._api + return self.api def get_vips(self, context, filters=None, fields=None): - return self._vip_manager.get_collection(context, filters, fields) + return self.vip_manager.get_collection(context, filters, fields) def get_vip(self, context, id, fields=None): - return self._vip_manager.get_resource(context, id, fields) + return self.vip_manager.get_resource(context, id, fields) def create_vip(self, context, vip): try: - return self._vip_manager.create(context, vip) + return self.vip_manager.create(context, vip) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='vip', msg=str(ex)) def update_vip(self, context, id, vip): - return self._vip_manager.update(context, id, vip) + return self.vip_manager.update(context, id, vip) def delete_vip(self, context, id): - return self._vip_manager.delete(context, id) + return self.vip_manager.delete(context, id) def get_pools(self, context, filters=None, fields=None): - return self._pool_manager.get_collection(context, filters, fields) + return self.pool_manager.get_collection(context, filters, fields) def get_pool(self, context, id, fields=None): - return self._pool_manager.get_resource(context, id, fields) + return self.pool_manager.get_resource(context, id, fields) def create_pool(self, context, pool): try: - return self._pool_manager.create(context, pool) + return self.pool_manager.create(context, pool) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='pool', msg=str(ex)) def update_pool(self, context, id, pool): - return self._pool_manager.update(context, id, pool) + return self.pool_manager.update(context, id, pool) def delete_pool(self, context, id): - return self._pool_manager.delete(context, id) + return self.pool_manager.delete(context, id) def stats(self, context, pool_id): stats = { @@ -168,12 +207,12 @@ def create_pool_health_monitor(self, context, health_monitor, pool_id): """ m = health_monitor['health_monitor'] try: - pool = self._api.loadbalancer_pool_read(id=pool_id) + pool = self.api.loadbalancer_pool_read(id=pool_id) except vnc_exc.NoIdError: raise loadbalancer.PoolNotFound(pool_id=pool_id) try: - monitor = self._api.loadbalancer_healthmonitor_read(id=m['id']) + monitor = self.api.loadbalancer_healthmonitor_read(id=m['id']) except vnc_exc.NoIdError: raise loadbalancer.HealthMonitorNotFound(monitor_id=m['id']) @@ -191,7 +230,7 @@ def create_pool_health_monitor(self, context, health_monitor, pool_id): monitor_id=m['id'], pool_id=pool_id) pool.add_loadbalancer_healthmonitor(monitor) - self._api.loadbalancer_pool_update(pool) + self.api.loadbalancer_pool_update(pool) res = { 'id': monitor.uuid, @@ -203,7 +242,7 @@ def get_pool_health_monitor(self, context, id, pool_id, fields=None): """ Query a specific pool, health_monitor association. """ try: - pool = self._api.loadbalancer_pool_read(id=pool_id) + pool = self.api.loadbalancer_pool_read(id=pool_id) except vnc_exc.NoIdError: raise loadbalancer.PoolNotFound(pool_id=id) tenant_id = str(uuid.UUID(context.tenant_id)) @@ -223,14 +262,14 @@ def get_pool_health_monitor(self, context, id, pool_id, fields=None): res = { 'pool_id': pool_id, 'monitor_id': id, - 'status': self._pool_manager._get_object_status(pool), + 'status': self.pool_manager._get_object_status(pool), 'tenant_id': pool.parent_uuid.replace('-', '') } - return self._pool_manager._fields(res, fields) + return self.pool_manager._fields(res, fields) def delete_pool_health_monitor(self, context, id, pool_id): try: - pool = self._api.loadbalancer_pool_read(id=pool_id) + pool = self.api.loadbalancer_pool_read(id=pool_id) except vnc_exc.NoIdError: raise loadbalancer.PoolNotFound(pool_id=id) tenant_id = str(uuid.UUID(context.tenant_id)) @@ -238,7 +277,7 @@ def delete_pool_health_monitor(self, context, id, pool_id): raise loadbalancer.PoolNotFound(pool_id=id) try: - monitor = self._api.loadbalancer_healthmonitor_read(id=id) + monitor = self.api.loadbalancer_healthmonitor_read(id=id) except vnc_exc.NoIdError: raise loadbalancer.HealthMonitorNotFound(monitor_id=id) @@ -253,40 +292,40 @@ def delete_pool_health_monitor(self, context, id, pool_id): monitor_id=id, pool_id=pool_id) pool.del_loadbalancer_healthmonitor(monitor) - self._api.loadbalancer_pool_update(pool) + self.api.loadbalancer_pool_update(pool) def get_members(self, context, filters=None, fields=None): - return self._member_manager.get_collection(context, filters, fields) + return self.member_manager.get_collection(context, filters, fields) def get_member(self, context, id, fields=None): - return self._member_manager.get_resource(context, id, fields) + return self.member_manager.get_resource(context, id, fields) def create_member(self, context, member): try: - return self._member_manager.create(context, member) + return self.member_manager.create(context, member) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='member', msg=str(ex)) def update_member(self, context, id, member): - return self._member_manager.update(context, id, member) + return self.member_manager.update(context, id, member) def delete_member(self, context, id): - return self._member_manager.delete(context, id) + return self.member_manager.delete(context, id) def get_health_monitors(self, context, filters=None, fields=None): - return self._monitor_manager.get_collection(context, filters, fields) + return self.monitor_manager.get_collection(context, filters, fields) def get_health_monitor(self, context, id, fields=None): - return self._monitor_manager.get_resource(context, id, fields) + return self.monitor_manager.get_resource(context, id, fields) def create_health_monitor(self, context, health_monitor): try: - return self._monitor_manager.create(context, health_monitor) + return self.monitor_manager.create(context, health_monitor) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='health_monitor', msg=str(ex)) def update_health_monitor(self, context, id, health_monitor): - return self._monitor_manager.update(context, id, health_monitor) + return self.monitor_manager.update(context, id, health_monitor) def delete_health_monitor(self, context, id): - return self._monitor_manager.delete(context, id) + return self.monitor_manager.delete(context, id) diff --git a/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/v2/loadbalancer_db.py b/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/v2/loadbalancer_db.py index 5dc5c9f..a381d9d 100644 --- a/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/v2/loadbalancer_db.py +++ b/neutron_plugin_contrail/plugins/opencontrail/loadbalancer/v2/loadbalancer_db.py @@ -30,138 +30,185 @@ class LoadBalancerPluginDbV2(LoadBalancerPluginBaseV2): def __init__(self): - admin_user = cfg.CONF.keystone_authtoken.admin_user - admin_password = cfg.CONF.keystone_authtoken.admin_password - admin_tenant_name = cfg.CONF.keystone_authtoken.admin_tenant_name - api_srvr_ip = cfg.CONF.APISERVER.api_server_ip - api_srvr_port = cfg.CONF.APISERVER.api_server_port + self.admin_user = cfg.CONF.keystone_authtoken.admin_user + self.admin_password = cfg.CONF.keystone_authtoken.admin_password + self.admin_tenant_name = cfg.CONF.keystone_authtoken.admin_tenant_name + self.api_srvr_ip = cfg.CONF.APISERVER.api_server_ip + self.api_srvr_port = cfg.CONF.APISERVER.api_server_port + self.api_srvr_use_ssl= cfg.CONF.APISERVER.use_ssl try: - auth_host = cfg.CONF.keystone_authtoken.auth_host + self.auth_host = cfg.CONF.keystone_authtoken.auth_host except cfg.NoSuchOptError: - auth_host = "127.0.0.1" + self.auth_host = "127.0.0.1" try: - auth_protocol = cfg.CONF.keystone_authtoken.auth_protocol + self.auth_protocol = cfg.CONF.keystone_authtoken.auth_protocol except cfg.NoSuchOptError: - auth_protocol = "http" + self.auth_protocol = "http" try: - auth_port = cfg.CONF.keystone_authtoken.auth_port + self.auth_port = cfg.CONF.keystone_authtoken.auth_port except cfg.NoSuchOptError: - auth_port = "35357" + self.auth_port = "35357" try: - auth_url = cfg.CONF.keystone_authtoken.auth_url + self.auth_url = cfg.CONF.keystone_authtoken.auth_url except cfg.NoSuchOptError: - auth_url = "/v2.0/tokens" + self.auth_url = "/v2.0/tokens" try: - auth_type = cfg.CONF.keystone_authtoken.auth_type + self.auth_type = cfg.CONF.keystone_authtoken.auth_type except cfg.NoSuchOptError: - auth_type = "keystone" + self.auth_type = "keystone" try: - api_server_url = cfg.CONF.APISERVER.api_server_url + self.api_server_url = cfg.CONF.APISERVER.api_server_url except cfg.NoSuchOptError: - api_server_url = "/" + self.api_server_url = "/" + + @property + def api(self): + if hasattr(self, '_api'): + return self._api # Retry till a api-server is up connected = False while not connected: try: - self._api = VncApi(admin_user, admin_password, admin_tenant_name, - api_srvr_ip, api_srvr_port, api_server_url, - auth_host=auth_host, auth_port=auth_port, - auth_protocol=auth_protocol, auth_url=auth_url, - auth_type=auth_type, wait_for_connect=True) + self._api = VncApi(self.admin_user, self.admin_password, + self.admin_tenant_name, self.api_srvr_ip, + self.api_srvr_port, self.api_server_url, + auth_host=self.auth_host, auth_port=self.auth_port, + auth_protocol=self.auth_protocol, + auth_url=self.auth_url, auth_type=self.auth_type, + wait_for_connect=True, + api_server_use_ssl=self.api_srvr_use_ssl) connected = True except requests.exceptions.RequestException: time.sleep(3) + return self._api + + @property + def pool_manager(self): + if hasattr(self, '_pool_manager'): + return self._pool_manager self._pool_manager = \ - loadbalancer_pool.LoadbalancerPoolManager(self._api) - self._loadbalancer_manager = loadbalancer.LoadbalancerManager(self._api) - self._listener_manager = listener.ListenerManager(self._api) + loadbalancer_pool.LoadbalancerPoolManager(self.api) + + return self._pool_manager + + @property + def loadbalancer_manager(self): + if hasattr(self, '_loadbalancer_manager'): + return self._loadbalancer_manager + + self._loadbalancer_manager = loadbalancer.LoadbalancerManager(self.api) + + return self._loadbalancer_manager + + @property + def listener_manager(self): + if hasattr(self, '_listener_manager'): + return self._listener_manager + self._listener_manager = listener.ListenerManager(self.api) + + return self._listener_manager + + @property + def member_manager(self): + if hasattr(self, '_member_manager'): + return self._member_manager + self._member_manager = \ - loadbalancer_member.LoadbalancerMemberManager(self._api) + loadbalancer_member.LoadbalancerMemberManager(self.api) + + return self._member_manager + + @property + def monitor_manager(self): + if hasattr(self, '_monitor_manager'): + return self._monitor_manager self._monitor_manager = \ loadbalancer_healthmonitor.LoadbalancerHealthmonitorManager( - self._api) + self.api) + + return self._monitor_manager def get_api_client(self): - return self._api + return self.api def get_loadbalancers(self, context, filters=None, fields=None): - return self._loadbalancer_manager.get_collection(context, filters, fields) + return self.loadbalancer_manager.get_collection(context, filters, fields) def get_loadbalancer(self, context, id, fields=None): - return self._loadbalancer_manager.get_resource(context, id, fields) + return self.loadbalancer_manager.get_resource(context, id, fields) def create_loadbalancer(self, context, loadbalancer): try: - return self._loadbalancer_manager.create(context, loadbalancer) + return self.loadbalancer_manager.create(context, loadbalancer) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='loadbalancer', msg=str(ex)) def update_loadbalancer(self, context, id, loadbalancer): - return self._loadbalancer_manager.update(context, id, loadbalancer) + return self.loadbalancer_manager.update(context, id, loadbalancer) def delete_loadbalancer(self, context, id): - return self._loadbalancer_manager.delete(context, id) + return self.loadbalancer_manager.delete(context, id) def create_listener(self, context, listener): try: - return self._listener_manager.create(context, listener) + return self.listener_manager.create(context, listener) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='listener', msg=str(ex)) def get_listener(self, context, id, fields=None): - return self._listener_manager.get_resource(context, id, fields) + return self.listener_manager.get_resource(context, id, fields) def get_listeners(self, context, filters=None, fields=None): - return self._listener_manager.get_collection(context, filters, fields) + return self.listener_manager.get_collection(context, filters, fields) def update_listener(self, context, id, listener): - return self._listener_manager.update(context, id, listener) + return self.listener_manager.update(context, id, listener) def delete_listener(self, context, id): - return self._listener_manager.delete(context, id) + return self.listener_manager.delete(context, id) def get_pools(self, context, filters=None, fields=None): - return self._pool_manager.get_collection(context, filters, fields) + return self.pool_manager.get_collection(context, filters, fields) def get_pool(self, context, id, fields=None): - return self._pool_manager.get_resource(context, id, fields) + return self.pool_manager.get_resource(context, id, fields) def create_pool(self, context, pool): try: - return self._pool_manager.create(context, pool) + return self.pool_manager.create(context, pool) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='pool', msg=str(ex)) def update_pool(self, context, id, pool): - return self._pool_manager.update(context, id, pool) + return self.pool_manager.update(context, id, pool) def delete_pool(self, context, id): - return self._pool_manager.delete(context, id) + return self.pool_manager.delete(context, id) def get_pool_members(self, context, pool_id, filters=None, fields=None): - return self._member_manager.get_collection(context, pool_id, filters, fields) + return self.member_manager.get_collection(context, pool_id, filters, fields) def get_pool_member(self, context, id, pool_id, fields=None): - return self._member_manager.get_resource(context, id, pool_id, fields) + return self.member_manager.get_resource(context, id, pool_id, fields) def create_pool_member(self, context, pool_id, member): try: - return self._member_manager.create(context, pool_id, member) + return self.member_manager.create(context, pool_id, member) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='member', msg=str(ex)) def update_pool_member(self, context, id, pool_id, member): - return self._member_manager.update(context, id, member) + return self.member_manager.update(context, id, member) def delete_pool_member(self, context, id, pool_id): - return self._member_manager.delete(context, id, pool_id) + return self.member_manager.delete(context, id, pool_id) def get_members(self, context, filters=None, fields=None): pass @@ -170,22 +217,22 @@ def get_member(self, context, id, fields=None): pass def get_healthmonitors(self, context, filters=None, fields=None): - return self._monitor_manager.get_collection(context, filters, fields) + return self.monitor_manager.get_collection(context, filters, fields) def get_healthmonitor(self, context, id, fields=None): - return self._monitor_manager.get_resource(context, id, fields) + return self.monitor_manager.get_resource(context, id, fields) def create_healthmonitor(self, context, healthmonitor): try: - return self._monitor_manager.create(context, healthmonitor) + return self.monitor_manager.create(context, healthmonitor) except vnc_exc.PermissionDenied as ex: raise n_exc.BadRequest(resource='healthmonitor', msg=str(ex)) def update_healthmonitor(self, context, id, healthmonitor): - return self._monitor_manager.update(context, id, healthmonitor) + return self.monitor_manager.update(context, id, healthmonitor) def delete_healthmonitor(self, context, id): - return self._monitor_manager.delete(context, id) + return self.monitor_manager.delete(context, id) def stats(self, context, loadbalancer_id): pass