Allow VIM to manage services independently

Refactor the VIM to allow it to manage openstack and platform
services independently.  The disable/enable/create/delete/
notify/query_host_services methods in nfvi_infrastrcture_api.py
are separated into the corresponding applicable plugin api to which
the constituent parts belong.  Multiple tasks are created (where
applicable) to do the individual pieces of work corresponding to each
plugin.

Story: 2003910
Task: 27851

Change-Id: Ie86d293aa6a06dd3402fd75100fe7adf659af035
Signed-off-by: Kevin Smith <kevin.smith@windriver.com>
This commit is contained in:
Kevin Smith 2018-11-27 14:23:05 -05:00
parent 8e91fba5c8
commit b6f7a85059
21 changed files with 2318 additions and 1124 deletions

View File

@ -24,6 +24,7 @@ from nfv_plugins.nfvi_plugins.openstack import exceptions
from nfv_plugins.nfvi_plugins.openstack import openstack from nfv_plugins.nfvi_plugins.openstack import openstack
from nfv_plugins.nfvi_plugins.openstack import nova from nfv_plugins.nfvi_plugins.openstack import nova
from nfv_plugins.nfvi_plugins.openstack import rest_api from nfv_plugins.nfvi_plugins.openstack import rest_api
from nfv_plugins.nfvi_plugins.openstack.objects import OPENSTACK_SERVICE
DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.compute_api') DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.compute_api')
@ -383,6 +384,513 @@ class NFVIComputeAPI(nfvi.api.v1.NFVIComputeAPI):
self._max_action_request_wait_in_secs = 45 self._max_action_request_wait_in_secs = 45
self._auto_accept_action_requests = False self._auto_accept_action_requests = False
def _host_supports_nova_compute(self, personality):
return (('compute' in personality) and
(self._directory.get_service_info(
OPENSTACK_SERVICE.NOVA) is not None))
def notify_host_enabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host enabled
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
# Only applies to compute hosts
if not self._host_supports_nova_compute(host_personality):
response['completed'] = True
response['reason'] = ''
return
response['reason'] = 'failed to get token from keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s." % host_uuid)
return
self._token = future.result.data
response['reason'] = 'failed to notify nova that host is enabled'
future.work(nova.notify_host_enabled, self._token,
host_name)
future.result = (yield)
if not future.result.is_complete():
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to notify "
"nova host services enabled, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to notify "
"nova host services enabled, error=%s." % e)
finally:
callback.send(response)
callback.close()
def notify_host_disabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host disabled
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get token from keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s." % host_uuid)
return
self._token = future.result.data
response['reason'] = 'failed to notify nova that ' \
'host is disabled'
future.work(nova.notify_host_disabled, self._token,
host_name)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova notify-host-disabled.")
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to notify "
"nova host services disabled, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to notify "
"nova host services disabled, error=%s." % e)
finally:
callback.send(response)
callback.close()
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create Host Services, notify Nova to create services for a host
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to create nova services'
# Send the create request to Nova.
future.work(nova.create_host_services, self._token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova create-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('created' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova create-host-services failed, invalid "
"response, host_uuid=%s, host_name=%s, "
"response=%s."
% (host_uuid, host_name, response))
return
response['reason'] = 'failed to disable nova services'
# Send the disable request to Nova.
future.work(nova.disable_host_services, self._token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova disable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('disabled' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova disable-host-services failed, invalid "
"response, host_uuid=%s, host_name=%s, "
"response=%s."
% (host_uuid, host_name, response))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to create "
"nova services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to create %s nova "
"services, error=%s." % (host_name, e))
finally:
callback.send(response)
callback.close()
def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Delete Host Services, Notify Nova to delete services for a host.
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to delete nova services'
# Send the delete request to Nova.
future.work(nova.delete_host_services, self._token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova delete-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to delete "
"nova services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to delete %s "
"nova services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Enable Host Services, Notify Nova to enable services for a host.
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to enable nova services'
# Send the Enable request to Nova.
future.work(nova.enable_host_services, self._token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova enable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('enabled' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova enable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to enable "
"nova services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to enable %s "
"nova services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def disable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Disable Host Services, notify nova to disable services for a host
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
# The following only applies to compute hosts
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to disable nova services'
# Send the Disable request to Nova.
future.work(nova.disable_host_services, self._token,
host_name)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('disabled' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to disable "
"nova services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to disable %s "
"nova services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query Host Services, return state of Nova Services for a host
"""
response = dict()
response['completed'] = False
response['result-data'] = 'enabled'
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
# Send Query request to Nova.
future.work(nova.query_host_services, self._token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova query-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
if future.result.data != 'enabled':
response['result-data'] = 'disabled'
response['completed'] = True
return
response['completed'] = True
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to query "
"nova services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to query %s "
"nova services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def _action_request_complete(self, request_uuid, http_status_code, def _action_request_complete(self, request_uuid, http_status_code,
http_headers=None, http_body=None): http_headers=None, http_body=None):
""" """

View File

@ -15,6 +15,7 @@ from nfv_plugins.nfvi_plugins.openstack import rest_api
from nfv_plugins.nfvi_plugins.openstack import exceptions from nfv_plugins.nfvi_plugins.openstack import exceptions
from nfv_plugins.nfvi_plugins.openstack import openstack from nfv_plugins.nfvi_plugins.openstack import openstack
from nfv_plugins.nfvi_plugins.openstack import guest from nfv_plugins.nfvi_plugins.openstack import guest
from nfv_plugins.nfvi_plugins.openstack.objects import OPENSTACK_SERVICE
DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.guest_api') DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.guest_api')
@ -205,6 +206,7 @@ class NFVIGuestAPI(nfvi.api.v1.NFVIGuestAPI):
super(NFVIGuestAPI, self).__init__() super(NFVIGuestAPI, self).__init__()
self._token = None self._token = None
self._directory = None self._directory = None
self._openstack_directory = None
self._rest_api_server = None self._rest_api_server = None
self._host_services_query_callback = None self._host_services_query_callback = None
self._guest_services_query_callback = None self._guest_services_query_callback = None
@ -212,6 +214,11 @@ class NFVIGuestAPI(nfvi.api.v1.NFVIGuestAPI):
self._guest_services_alarm_notify_callbacks = list() self._guest_services_alarm_notify_callbacks = list()
self._guest_services_action_notify_callbacks = list() self._guest_services_action_notify_callbacks = list()
def _host_supports_nova_compute(self, personality):
return (('compute' in personality) and
(self._openstack_directory.get_service_info(
OPENSTACK_SERVICE.NOVA) is not None))
def guest_services_create(self, future, instance_uuid, host_name, def guest_services_create(self, future, instance_uuid, host_name,
services, callback): services, callback):
""" """
@ -589,6 +596,361 @@ class NFVIGuestAPI(nfvi.api.v1.NFVIGuestAPI):
callback.send(response) callback.send(response)
callback.close() callback.close()
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create Host Services, notify Guest to create services for a host
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to create guest services'
try:
# Send the create request to Guest.
future.work(guest.host_services_create,
self._token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest host-services-create failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
return
response['reason'] = 'failed to disable guest services'
# Send the disable request to Guest
future.work(guest.host_services_disable,
self._token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
# do not return since the disable will be retried
# by audit
DLOG.error("Guest host-services-disable failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
except exceptions.OpenStackRestAPIException as e:
# Guest can send a 404 if it hasn't got the host
# inventory yet.
# Guest will catch up later, no need to fail here.
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to create "
"guest services on host, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to create %s "
"guest services, error=%s." % (host_name, e))
finally:
callback.send(response)
callback.close()
def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Delete Host Services, notify Guest to delete services for a host
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to delete guest services'
# Send the delete request to Guest.
future.work(guest.host_services_delete, self._token,
host_uuid)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest host-services-delete for host "
"failed, operation did not complete, "
"host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to delete "
"host services on host, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to delete %s "
"guest services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Enable Host Services, notify Guest to enable services for a host.
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to enable guest services'
# Send the Enable request to Guest
future.work(guest.host_services_enable, self._token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest host-services-enable failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to enable "
"guest services on host, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to enable %s "
"guest services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def disable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notifies Guest to disable their services for the specified
host (as applicable)
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
# The following only applies to compute hosts
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to disable guest services'
# Send the Disable request to Guest.
future.work(guest.host_services_disable, self._token,
host_uuid, host_name)
try:
future.result = (yield)
if not future.result.is_complete():
# Do not return since the disable will be retried
# by audit
DLOG.error("Guest host-services-disable failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to disable "
"guest services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to disable %s "
"guest services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query Host Services, return state of Guest services for a host.
"""
response = dict()
response['completed'] = False
response['result-data'] = 'enabled'
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_nova_compute(host_personality):
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
# Send Query request to Guest
future.work(guest.host_services_query, self._token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest query-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
else:
result_data = future.result.data
response['result-data'] = result_data['state']
response['completed'] = True
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to query "
"host services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to query %s "
"nova or neutron openstack services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def host_services_rest_api_get_handler(self, request_dispatch): def host_services_rest_api_get_handler(self, request_dispatch):
""" """
Host-Services Rest-API GET handler Host-Services Rest-API GET handler
@ -852,6 +1214,8 @@ class NFVIGuestAPI(nfvi.api.v1.NFVIGuestAPI):
config.load(config_file) config.load(config_file)
self._directory = openstack.get_directory( self._directory = openstack.get_directory(
config, openstack.SERVICE_CATEGORY.PLATFORM) config, openstack.SERVICE_CATEGORY.PLATFORM)
self._openstack_directory = openstack.get_directory(
config, openstack.SERVICE_CATEGORY.OPENSTACK)
self._rest_api_server = rest_api.rest_api_get_server( self._rest_api_server = rest_api.rest_api_get_server(
config.CONF['guest-rest-api']['host'], config.CONF['guest-rest-api']['host'],

View File

@ -20,9 +20,6 @@ from nfv_plugins.nfvi_plugins.openstack import openstack
from nfv_plugins.nfvi_plugins.openstack import sysinv from nfv_plugins.nfvi_plugins.openstack import sysinv
from nfv_plugins.nfvi_plugins.openstack import fm from nfv_plugins.nfvi_plugins.openstack import fm
from nfv_plugins.nfvi_plugins.openstack import mtc from nfv_plugins.nfvi_plugins.openstack import mtc
from nfv_plugins.nfvi_plugins.openstack import nova
from nfv_plugins.nfvi_plugins.openstack import neutron
from nfv_plugins.nfvi_plugins.openstack import guest
from nfv_plugins.nfvi_plugins.openstack.objects import OPENSTACK_SERVICE from nfv_plugins.nfvi_plugins.openstack.objects import OPENSTACK_SERVICE
DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.infrastructure_api') DLOG = debug.debug_get_logger('nfv_plugins.nfvi_plugins.infrastructure_api')
@ -122,7 +119,8 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
@staticmethod @staticmethod
def _host_supports_kubernetes(personality): def _host_supports_kubernetes(personality):
# TODO(bwensley): This check will disappear once kubernetes is the default # TODO(bwensley): This check will disappear once kubernetes is the
# default
if os.path.isfile('/etc/kubernetes/admin.conf'): if os.path.isfile('/etc/kubernetes/admin.conf'):
return ('compute' in personality or 'controller' in personality) return ('compute' in personality or 'controller' in personality)
else: else:
@ -167,15 +165,10 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
self._data_port_fault_handling_enabled = False self._data_port_fault_handling_enabled = False
self._host_listener = None self._host_listener = None
def _host_supports_neutron(self, personality):
return (('compute' in personality or 'controller' in personality) and
(self._openstack_directory.get_service_info(
OPENSTACK_SERVICE.NEUTRON) is not None))
def _host_supports_nova_compute(self, personality): def _host_supports_nova_compute(self, personality):
return (('compute' in personality) and return (('compute' in personality) and
(self._openstack_directory.get_service_info( (self._openstack_directory.get_service_info(
OPENSTACK_SERVICE.NOVA) is not None)) OPENSTACK_SERVICE.NOVA) is not None))
def get_system_info(self, future, callback): def get_system_info(self, future, callback):
""" """
@ -787,239 +780,11 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
callback.send(response) callback.send(response)
callback.close() callback.close()
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create Host Services, notifies Nova, Neutron and Guest to create their
services for the specified host
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if (self._host_supports_neutron(host_personality) or
self._host_supports_nova_compute(host_personality)):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._openstack_token = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._platform_token is None or \
self._platform_token.is_expired():
future.work(openstack.get_token, self._platform_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._platform_token = future.result.data
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._openstack_token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to create nova services'
# Send the create request to Nova.
future.work(nova.create_host_services, self._openstack_token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova create-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('created' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova create-host-services failed, invalid "
"response, host_uuid=%s, host_name=%s, response=%s."
% (host_uuid, host_name, response))
return
response['reason'] = 'failed to disable nova services'
# Send the disable request to Nova.
future.work(nova.disable_host_services, self._openstack_token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova disable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('disabled' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova disable-host-services failed, invalid "
"response, host_uuid=%s, host_name=%s, response=%s."
% (host_uuid, host_name, response))
return
if self._host_supports_neutron(host_personality):
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
# Send Delete request to Neutron
response['reason'] = \
'failed to delete existing neutron services'
future.work(neutron.delete_host_services_by_name,
self._openstack_token,
host_name, host_uuid, only_if_changed=True)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron delete-host-services-by-name failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
response['reason'] = 'failed to create neutron services'
# Send the create request to Neutron.
future.work(neutron.create_host_services,
self._openstack_token,
host_name, host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron create-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('down' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron create-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
response['reason'] = 'failed to disable neutron services'
# Send the disable request to Neutron
future.work(neutron.disable_host_services,
self._openstack_token,
host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('down' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to create guest services'
try:
# Send the create request to Guest.
future.work(guest.host_services_create,
self._platform_token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest host-services-create failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
response['reason'] = 'failed to disable guest services'
# Send the disable request to Guest
future.work(guest.host_services_disable,
self._platform_token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
# do not return since the disable will be retried by audit
DLOG.error("Guest host-services-disable failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
except exceptions.OpenStackRestAPIException as e:
# Guest can send a 404 if it hasn't got the host inventory yet.
# Guest will catch up later, no need to fail here.
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._platform_token is not None:
self._platform_token.set_expired()
if self._openstack_token is not None:
self._openstack_token.set_expired()
else:
DLOG.exception("Caught exception while trying to create "
"host services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to create %s nova "
"or neutron services, error=%s." % (host_name, e))
finally:
callback.send(response)
callback.close()
def delete_host_services(self, future, host_uuid, host_name, def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback): host_personality, callback):
""" """
Delete Host Services, notifies Nova, Neutron and Guest to delete their Delete Host Services, notifies kubernetes client to delete services
services for the specified host for a host.
""" """
response = dict() response = dict()
response['completed'] = False response['completed'] = False
@ -1028,107 +793,6 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
try: try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None)) future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if (self._host_supports_neutron(host_personality) or
self._host_supports_nova_compute(host_personality)):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._openstack_token = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._platform_token is None or \
self._platform_token.is_expired():
future.work(openstack.get_token, self._platform_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._platform_token = future.result.data
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._openstack_token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to delete nova services'
# Send the delete request to Nova.
future.work(nova.delete_host_services, self._openstack_token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova delete-host-services failed, operation did "
"not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
if self._host_supports_neutron(host_personality):
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
response['reason'] = 'failed to delete neutron services'
# Send the delete request to Neutron.
future.work(neutron.delete_host_services,
self._openstack_token, host_uuid)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron delete-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to delete guest services'
# Send the delete request to Guest.
future.work(guest.host_services_delete, self._platform_token,
host_uuid)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest host-services-delete failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
if self._host_supports_kubernetes(host_personality): if self._host_supports_kubernetes(host_personality):
response['reason'] = 'failed to delete kubernetes services' response['reason'] = 'failed to delete kubernetes services'
@ -1145,21 +809,9 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
response['completed'] = True response['completed'] = True
response['reason'] = '' response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._openstack_token is not None:
self._openstack_token.set_expired()
if self._platform_token is not None:
self._platform_token.set_expired()
else:
DLOG.exception("Caught exception while trying to delete "
"host services, error=%s." % e)
except Exception as e: except Exception as e:
DLOG.exception("Caught exception while trying to delete %s " DLOG.exception("Caught exception while trying to delete %s "
"nova or neutron openstack services, error=%s." "kubernetes host services, error=%s."
% (host_name, e)) % (host_name, e))
finally: finally:
@ -1169,8 +821,8 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
def enable_host_services(self, future, host_uuid, host_name, def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback): host_personality, callback):
""" """
Enable Host Services, notifies Nova, Neutron, Guest and Kubernetes to Enable Host Services, notify kubernetes client to enable services
enable their services for the specified host for a host.
""" """
response = dict() response = dict()
response['completed'] = False response['completed'] = False
@ -1179,39 +831,6 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
try: try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None)) future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if (self._host_supports_neutron(host_personality) or
self._host_supports_nova_compute(host_personality)):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._openstack_token = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._platform_token is None or \
self._platform_token.is_expired():
future.work(openstack.get_token, self._platform_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._platform_token = future.result.data
if self._host_supports_kubernetes(host_personality): if self._host_supports_kubernetes(host_personality):
response['reason'] = 'failed to enable kubernetes services' response['reason'] = 'failed to enable kubernetes services'
@ -1227,110 +846,24 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
% (host_uuid, host_name)) % (host_uuid, host_name))
return return
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._openstack_token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to enable nova services'
# Send the Enable request to Nova.
future.work(nova.enable_host_services, self._openstack_token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova enable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('enabled' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova enable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
if self._host_supports_neutron(host_personality):
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
response['reason'] = 'failed to enable neutron services'
# Send the Enable request to Neutron
future.work(neutron.enable_host_services,
self._openstack_token, host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron enable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('up' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron enable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to enable guest services'
# Send the Enable request to Guest
future.work(guest.host_services_enable, self._platform_token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
# do not return since the enable will be retried by audit
DLOG.error("Guest host-services-enable failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
response['completed'] = True response['completed'] = True
response['reason'] = '' response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._openstack_token is not None:
self._openstack_token.set_expired()
if self._platform_token is not None:
self._platform_token.set_expired()
else:
DLOG.exception("Caught exception while trying to enable "
"host services, error=%s." % e)
except Exception as e: except Exception as e:
DLOG.exception("Caught exception while trying to enable %s " DLOG.exception("Caught exception while trying to enable %s "
"host services, error=%s." "kubernetes host services, error=%s."
% (host_name, e)) % (host_name, e))
finally: finally:
callback.send(response) callback.send(response)
callback.close() callback.close()
def disable_host_services(self, future, host_uuid, host_name, def disable_host_services(self, future, host_uuid,
host_personality, callback): host_name, host_personality,
callback):
""" """
Disable Host Services, notifies Nova, Guest and Kubernetes to disable Disable Host Services, notifies kubernetes client to disable services
their services for the specified host (as applicable) for a host.
""" """
response = dict() response = dict()
response['completed'] = False response['completed'] = False
@ -1339,85 +872,6 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
try: try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None)) future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
# The following only applies to compute hosts
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._openstack_token = future.result.data
response['reason'] = 'failed to get platform token from ' \
'keystone'
if self._platform_token is None or \
self._platform_token.is_expired():
future.work(openstack.get_token, self._platform_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._platform_token = future.result.data
response['reason'] = 'failed to disable nova services'
# Send the Disable request to Nova.
future.work(nova.disable_host_services, self._openstack_token,
host_name)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova disable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['service']
if not ('disabled' == result_data['status'] and
host_name == result_data['host'] and
'nova-compute' == result_data['binary']):
DLOG.error("Nova disable-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
response['reason'] = 'failed to disable guest services'
# Send the Disable request to Guest.
future.work(guest.host_services_disable, self._platform_token,
host_uuid, host_name)
try:
future.result = (yield)
if not future.result.is_complete():
# Do not return since the disable will be retried by audit
DLOG.error("Guest host-services-disable failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
if self._host_supports_kubernetes(host_personality): if self._host_supports_kubernetes(host_personality):
if True: if True:
# For now, we do not want to apply the NoExecute taint. # For now, we do not want to apply the NoExecute taint.
@ -1451,157 +905,9 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
response['completed'] = True response['completed'] = True
response['reason'] = '' response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._openstack_token is not None:
self._openstack_token.set_expired()
if self._platform_token is not None:
self._platform_token.set_expired()
else:
DLOG.exception("Caught exception while trying to disable "
"host services, error=%s." % e)
except Exception as e: except Exception as e:
DLOG.exception("Caught exception while trying to disable %s " DLOG.exception("Caught exception while trying to disable %s "
"host services, error=%s." "kubernetes host services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query Host Services, returns the aggregate administrative state
of the Nova and Neutron services for the specified host.
"""
response = dict()
response['completed'] = False
response['result-data'] = 'enabled'
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if (self._host_supports_neutron(host_personality) or
self._host_supports_nova_compute(host_personality)):
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._openstack_token = future.result.data
if self._platform_token is None or \
self._platform_token.is_expired():
future.work(openstack.get_token, self._platform_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._platform_token = future.result.data
if self._host_supports_neutron(host_personality):
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._openstack_token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if self._host_supports_nova_compute(host_personality):
# Send Query request to Nova.
future.work(nova.query_host_services, self._openstack_token,
host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova query-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
if future.result.data != 'enabled':
response['result-data'] = 'disabled'
response['completed'] = True
return
if self._host_supports_neutron(host_personality):
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
# Send Query request to Neutron
future.work(neutron.query_host_services,
self._openstack_token, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron query-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
if future.result.data is None or future.result.data != 'up':
response['result-data'] = 'disabled'
response['completed'] = True
return
if self._host_supports_nova_compute(host_personality):
# Send Query request to Guest
future.work(guest.host_services_query, self._platform_token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest query-host-services failed, operation "
"did not complete, host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
else:
result_data = future.result.data
if 'disabled' == result_data['state']:
future.work(guest.host_services_enable,
self._platform_token,
host_uuid, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Guest host-services-enable failed,"
" operation did not complete, host_uuid=%s,"
"host_name=%s."
% (host_uuid, host_name))
response['completed'] = True
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._openstack_token is not None:
self._openstack_token.set_expired()
if self._platform_token is not None:
self._platform_token.set_expired()
else:
DLOG.exception("Caught exception while trying to query "
"host services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to query %s "
"nova or neutron openstack services, error=%s."
% (host_name, e)) % (host_name, e))
finally: finally:
@ -2230,172 +1536,6 @@ class NFVIInfrastructureAPI(nfvi.api.v1.NFVIInfrastructureAPI):
callback.send(response) callback.send(response)
callback.close() callback.close()
def notify_host_enabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host enabled
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
# Only applies to compute hosts
if not self._host_supports_nova_compute(host_personality):
response['completed'] = True
response['reason'] = ''
return
response['reason'] = 'failed to get token from keystone'
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s." % host_uuid)
return
self._openstack_token = future.result.data
response['reason'] = 'failed to notify nova that host is enabled'
future.work(nova.notify_host_enabled, self._openstack_token,
host_name)
future.result = (yield)
if not future.result.is_complete():
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._openstack_token is not None:
self._openstack_token.set_expired()
else:
DLOG.exception("Caught exception while trying to notify "
"host services enabled, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to notify "
"host that a host is enabled, error=%s." % e)
finally:
callback.send(response)
callback.close()
def notify_host_disabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host disabled
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if (self._host_supports_neutron(host_personality) or
self._host_supports_nova_compute(host_personality)):
response['reason'] = 'failed to get token from keystone'
if self._openstack_token is None or \
self._openstack_token.is_expired():
future.work(openstack.get_token, self._openstack_directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s." % host_uuid)
return
self._openstack_token = future.result.data
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._openstack_token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if self._host_supports_nova_compute(host_personality):
response['reason'] = 'failed to notify nova that host is disabled'
future.work(nova.notify_host_disabled, self._openstack_token,
host_name)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Nova notify-host-disabled.")
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
if self._host_supports_neutron(host_personality):
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
response['reason'] = 'failed to disable neutron services'
# Send the Disable request to Neutron
future.work(neutron.disable_host_services,
self._openstack_token,
host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('down' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._openstack_token is not None:
self._openstack_token.set_expired()
else:
DLOG.exception("Caught exception while trying to notify "
"host services disabled, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to notify "
"host that a host is disabled, error=%s." % e)
finally:
callback.send(response)
callback.close()
def notify_host_failed(self, future, host_uuid, host_name, def notify_host_failed(self, future, host_uuid, host_name,
host_personality, callback): host_personality, callback):
""" """

View File

@ -67,6 +67,7 @@ class NFVINetworkAPI(nfvi.api.v1.NFVINetworkAPI):
super(NFVINetworkAPI, self).__init__() super(NFVINetworkAPI, self).__init__()
self._token = None self._token = None
self._directory = None self._directory = None
self._neutron_extensions = None
@property @property
def name(self): def name(self):
@ -84,6 +85,11 @@ class NFVINetworkAPI(nfvi.api.v1.NFVINetworkAPI):
def signature(self): def signature(self):
return self._signature return self._signature
def _host_supports_neutron(self, personality):
return (('compute' in personality or 'controller' in personality) and
(self._directory.get_service_info(
OPENSTACK_SERVICE.NEUTRON) is not None))
def get_networks(self, future, paging, callback): def get_networks(self, future, paging, callback):
""" """
Get a list of networks Get a list of networks
@ -754,6 +760,465 @@ class NFVINetworkAPI(nfvi.api.v1.NFVINetworkAPI):
callback.send(response) callback.send(response)
callback.close() callback.close()
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create Host Services, notify neutron to create services for a host.
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
# Send Delete request to Neutron
response['reason'] = \
'failed to delete existing neutron services'
future.work(neutron.delete_host_services_by_name,
self._token,
host_name, host_uuid, only_if_changed=True)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron delete-host-services-by-name "
"failed, operation did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
response['reason'] = 'failed to create neutron services'
# Send the create request to Neutron.
future.work(neutron.create_host_services,
self._token,
host_name, host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron create-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('down' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron create-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
return
response['reason'] = 'failed to disable neutron services'
# Send the disable request to Neutron
future.work(neutron.disable_host_services,
self._token,
host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('down' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to create "
"neutron services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to create %s "
"neutron services, error=%s." % (host_name, e))
finally:
callback.send(response)
callback.close()
def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Delete Host Services, notify neutron to delete services for a host.
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
response['reason'] = 'failed to delete neutron services'
# Send the delete request to Neutron.
future.work(neutron.delete_host_services,
self._token, host_uuid)
try:
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron delete-host-services failed, "
"operation did not complete, "
"host_uuid=%s, host_name=%s."
% (host_uuid, host_name))
return
except exceptions.OpenStackRestAPIException as e:
if httplib.NOT_FOUND != e.http_status_code:
raise
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to delete "
"neutron services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to delete %s "
"neutron openstack services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Enable Host Services, notify neutron to enable services for a host.
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get openstack token from ' \
'keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
response['reason'] = 'failed to enable neutron services'
# Send the Enable request to Neutron
future.work(neutron.enable_host_services,
self._token, host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron enable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s."
% (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('up' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron enable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to enable "
"neutron services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to enable %s "
"neutron services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query Neutron Services for a host.
"""
response = dict()
response['completed'] = False
response['result-data'] = 'enabled'
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_neutron(host_personality):
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s, host_name=%s." % (host_uuid,
host_name))
return
self._token = future.result.data
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
# Send Query request to Neutron
future.work(neutron.query_host_services,
self._token, host_name)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron query-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
if future.result.data is None or \
future.result.data != 'up':
response['result-data'] = 'disabled'
response['completed'] = True
return
response['completed'] = True
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to query "
"neutron host services, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to query %s "
"neutron openstack services, error=%s."
% (host_name, e))
finally:
callback.send(response)
callback.close()
def notify_host_disabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host disabled
"""
response = dict()
response['completed'] = False
response['reason'] = ''
try:
future.set_timeouts(config.CONF.get('nfvi-timeouts', None))
if self._host_supports_neutron(host_personality):
response['reason'] = 'failed to get token from keystone'
if self._token is None or \
self._token.is_expired():
future.work(openstack.get_token, self._directory)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("OpenStack get-token did not complete, "
"host_uuid=%s." % host_uuid)
return
self._token = future.result.data
response['reason'] = 'failed to get neutron extensions'
if self._neutron_extensions is None:
future.work(neutron.get_extensions, self._token)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron get-extensions did not complete.")
return
self._neutron_extensions = future.result.data
if neutron.lookup_extension(neutron.EXTENSION_NAMES.HOST,
self._neutron_extensions):
response['reason'] = 'failed to disable neutron services'
# Send the Disable request to Neutron
future.work(neutron.disable_host_services,
self._token,
host_uuid)
future.result = (yield)
if not future.result.is_complete():
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
result_data = future.result.data['host']
if not ('down' == result_data['availability'] and
host_name == result_data['name'] and
host_uuid == result_data['id']):
DLOG.error("Neutron disable-host-services failed, "
"operation did not complete, host_uuid=%s, "
"host_name=%s." % (host_uuid, host_name))
return
response['completed'] = True
response['reason'] = ''
except exceptions.OpenStackRestAPIException as e:
if httplib.UNAUTHORIZED == e.http_status_code:
response['error-code'] = nfvi.NFVI_ERROR_CODE.TOKEN_EXPIRED
if self._token is not None:
self._token.set_expired()
else:
DLOG.exception("Caught exception while trying to notify "
"neutron host services disabled, error=%s." % e)
except Exception as e:
DLOG.exception("Caught exception while trying to notify "
"neutron host services disabled, error=%s." % e)
finally:
callback.send(response)
callback.close()
def initialize(self, config_file): def initialize(self, config_file):
""" """
Initialize the plugin Initialize the plugin

View File

@ -68,18 +68,19 @@ class HostDirector(object):
nfvi.nfvi_lock_host(host_uuid, host_name, self._nfvi_lock_host_callback()) nfvi.nfvi_lock_host(host_uuid, host_name, self._nfvi_lock_host_callback())
@coroutine @coroutine
def _nfvi_disable_host_services_callback(self): def _nfvi_disable_host_services_callback(self, service):
""" """
NFVI Disable Host Services Callback NFVI Disable Host Services Callback
""" """
from nfv_vim import directors from nfv_vim import directors
response = (yield) response = (yield)
DLOG.verbose("NFVI Disable Host Services callback response=%s." % DLOG.verbose("NFVI Disable Host %s Services callback "
response) "response=%s." % (service, response))
if not response['completed']: if not response['completed']:
DLOG.info("Disable of host services on host %s failed, reason=%s." DLOG.info("Disable of %s services on host %s failed"
% (response['host_name'], response['reason'])) ", reason=%s."
% (service, response['host_name'], response['reason']))
host_table = tables.tables_get_host_table() host_table = tables.tables_get_host_table()
host = host_table.get(response['host_name'], None) host = host_table.get(response['host_name'], None)
@ -101,27 +102,41 @@ class HostDirector(object):
sw_mgmt_director.disable_host_services_failed(host) sw_mgmt_director.disable_host_services_failed(host)
def _nfvi_disable_host_services(self, host_uuid, host_name, def _nfvi_disable_host_services(self, host_uuid, host_name,
host_personality): host_personality, service):
""" """
NFVI Disable Host Services NFVI Disable Host Services
""" """
nfvi.nfvi_disable_host_services( if service == objects.HOST_SERVICES.COMPUTE:
host_uuid, host_name, host_personality, nfvi.nfvi_disable_compute_host_services(
self._nfvi_disable_host_services_callback()) host_uuid, host_name, host_personality,
self._nfvi_disable_host_services_callback(
objects.HOST_SERVICES.COMPUTE))
elif service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_disable_guest_host_services(
host_uuid, host_name, host_personality,
self._nfvi_disable_host_services_callback(
objects.HOST_SERVICES.GUEST))
elif service == objects.HOST_SERVICES.CONTAINER:
nfvi.nfvi_disable_container_host_services(
host_uuid, host_name, host_personality,
self._nfvi_disable_host_services_callback(
objects.HOST_SERVICES.CONTAINER))
else:
DLOG.error("Trying to disable unknown service: %s" % service)
@coroutine @coroutine
def _nfvi_enable_host_services_callback(self): def _nfvi_enable_host_services_callback(self, service):
""" """
NFVI Enable Host Services Callback NFVI Enable Host Services Callback
""" """
from nfv_vim import directors from nfv_vim import directors
response = (yield) response = (yield)
DLOG.verbose("NFVI Enable Host Services callback response=%s." % DLOG.verbose("NFVI Enable Host %s Services callback "
response) "response=%s." % (service, response))
if not response['completed']: if not response['completed']:
DLOG.info("Enable of host services on host %s failed, reason=%s." DLOG.info("Enable of %s services on host %s failed, reason=%s."
% (response['host_name'], response['reason'])) % (service, response['host_name'], response['reason']))
host_table = tables.tables_get_host_table() host_table = tables.tables_get_host_table()
host = host_table.get(response['host_name'], None) host = host_table.get(response['host_name'], None)
@ -136,20 +151,40 @@ class HostDirector(object):
if OPERATION_TYPE.ENABLE_HOST_SERVICES != \ if OPERATION_TYPE.ENABLE_HOST_SERVICES != \
self._host_operation.operation_type: self._host_operation.operation_type:
DLOG.verbose("Unexpected host %s operation %s, ignoring." DLOG.verbose("Unexpected host %s operation %s, ignoring."
% (host.name, self._host_operation.operation_type)) % (host.name,
self._host_operation.operation_type))
return return
sw_mgmt_director = directors.get_sw_mgmt_director() sw_mgmt_director = directors.get_sw_mgmt_director()
sw_mgmt_director.enable_host_services_failed(host) sw_mgmt_director.enable_host_services_failed(host)
def _nfvi_enable_host_services(self, host_uuid, host_name, def _nfvi_enable_host_services(self, host_uuid, host_name,
host_personality): host_personality, service):
""" """
NFVI Enable Host Services NFVI Enable Host Services
""" """
nfvi.nfvi_enable_host_services( if service == objects.HOST_SERVICES.COMPUTE:
host_uuid, host_name, host_personality, nfvi.nfvi_enable_compute_host_services(
self._nfvi_enable_host_services_callback()) host_uuid, host_name, host_personality,
self._nfvi_enable_host_services_callback(
objects.HOST_SERVICES.COMPUTE))
elif service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_enable_guest_host_services(
host_uuid, host_name, host_personality,
self._nfvi_enable_host_services_callback(
objects.HOST_SERVICES.GUEST))
elif service == objects.HOST_SERVICES.CONTAINER:
nfvi.nfvi_enable_container_host_services(
host_uuid, host_name, host_personality,
self._nfvi_enable_host_services_callback(
objects.HOST_SERVICES.CONTAINER))
elif service == objects.HOST_SERVICES.NETWORK:
nfvi.nfvi_enable_network_host_services(
host_uuid, host_name, host_personality,
self._nfvi_enable_host_services_callback(
objects.HOST_SERVICES.NETWORK))
else:
DLOG.error("Trying to enable unknown service: %s" % service)
@coroutine @coroutine
def _nfvi_unlock_host_callback(self): def _nfvi_unlock_host_callback(self):
@ -630,11 +665,12 @@ class HostDirector(object):
return host_operation return host_operation
def disable_host_services(self, host_names): def disable_host_services(self, host_names, service):
""" """
Disable host services on a list of hosts Disable a host service on a list of hosts
""" """
DLOG.info("Disable host services: %s" % host_names) DLOG.info("Disable host services: %s service: %s" %
(host_names, service))
host_operation = Operation(OPERATION_TYPE.DISABLE_HOST_SERVICES) host_operation = Operation(OPERATION_TYPE.DISABLE_HOST_SERVICES)
@ -646,6 +682,7 @@ class HostDirector(object):
self._host_operation = None self._host_operation = None
host_table = tables.tables_get_host_table() host_table = tables.tables_get_host_table()
host_list = list()
for host_name in host_names: for host_name in host_names:
host = host_table.get(host_name, None) host = host_table.get(host_name, None)
if host is None: if host is None:
@ -655,23 +692,28 @@ class HostDirector(object):
return host_operation return host_operation
host.host_services_locked = True host.host_services_locked = True
if objects.HOST_SERVICE_STATE.DISABLED == host.host_service_state: if (objects.HOST_SERVICE_STATE.DISABLED ==
host.host_service_state(service)):
host_operation.add_host(host.name, OPERATION_STATE.COMPLETED) host_operation.add_host(host.name, OPERATION_STATE.COMPLETED)
else: else:
host_operation.add_host(host.name, OPERATION_STATE.INPROGRESS) host_operation.add_host(host.name, OPERATION_STATE.INPROGRESS)
self._nfvi_disable_host_services(host.uuid, host.name, host_list.append(host)
host.personality)
for host in host_list:
self._nfvi_disable_host_services(
host.uuid, host.name, host.personality, service)
if host_operation.is_inprogress(): if host_operation.is_inprogress():
self._host_operation = host_operation self._host_operation = host_operation
return host_operation return host_operation
def enable_host_services(self, host_names): def enable_host_services(self, host_names, service):
""" """
Enable host services on a list of hosts Enable a host service on a list of hosts
""" """
DLOG.info("Enable host services: %s" % host_names) DLOG.info("Enable host services: %s service: %s" %
(host_names, service))
host_operation = Operation(OPERATION_TYPE.ENABLE_HOST_SERVICES) host_operation = Operation(OPERATION_TYPE.ENABLE_HOST_SERVICES)
@ -683,6 +725,7 @@ class HostDirector(object):
self._host_operation = None self._host_operation = None
host_table = tables.tables_get_host_table() host_table = tables.tables_get_host_table()
host_list = list()
for host_name in host_names: for host_name in host_names:
host = host_table.get(host_name, None) host = host_table.get(host_name, None)
if host is None: if host is None:
@ -692,12 +735,16 @@ class HostDirector(object):
return host_operation return host_operation
host.host_services_locked = False host.host_services_locked = False
if objects.HOST_SERVICE_STATE.ENABLED == host.host_service_state: if (objects.HOST_SERVICE_STATE.ENABLED ==
host.host_service_state(service)):
host_operation.add_host(host.name, OPERATION_STATE.COMPLETED) host_operation.add_host(host.name, OPERATION_STATE.COMPLETED)
else: else:
host_operation.add_host(host.name, OPERATION_STATE.INPROGRESS) host_operation.add_host(host.name, OPERATION_STATE.INPROGRESS)
self._nfvi_enable_host_services(host.uuid, host.name, host_list.append(host)
host.personality)
for host in host_list:
self._nfvi_enable_host_services(
host.uuid, host.name, host.personality, service)
if host_operation.is_inprogress(): if host_operation.is_inprogress():
self._host_operation = host_operation self._host_operation = host_operation

View File

@ -53,7 +53,8 @@ class EnabledState(state_machine.State):
return HOST_STATE.DISABLING return HOST_STATE.DISABLING
elif HOST_EVENT.TASK_COMPLETED == event: elif HOST_EVENT.TASK_COMPLETED == event:
if objects.HOST_SERVICE_STATE.ENABLED != host.host_service_state: if objects.HOST_SERVICE_STATE.ENABLED != \
host.host_service_state_aggregate():
if not host.host_services_locked: if not host.host_services_locked:
DLOG.info("Host services are not enabled on %s. " DLOG.info("Host services are not enabled on %s. "
"Disabling host." % host.name) "Disabling host." % host.name)

View File

@ -90,11 +90,12 @@ class NotifyHostEnabledTaskWork(state_machine.StateTaskWork):
""" """
Notify Host Enabled Task Work Notify Host Enabled Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(NotifyHostEnabledTaskWork, self).__init__( super(NotifyHostEnabledTaskWork, self).__init__(
'notify-host-enabled_%s' % host.name, task, 'notify-host-enabled_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -133,10 +134,22 @@ class NotifyHostEnabledTaskWork(state_machine.StateTaskWork):
""" """
Run notify host enabled Run notify host enabled
""" """
DLOG.verbose("Notify-Host-Enabled for %s." % self._host.name) from nfv_vim import objects
nfvi.nfvi_notify_host_enabled(self._host.uuid, self._host.name,
self._host.personality, DLOG.verbose("Notify-Host-Enabled for %s %s." % (self._host.name,
self._callback()) self._service))
if self._service == objects.HOST_SERVICES.COMPUTE:
nfvi.nfvi_notify_compute_host_enabled(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to notify host enabled for unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
@ -144,11 +157,12 @@ class NotifyHostDisabledTaskWork(state_machine.StateTaskWork):
""" """
Notify Host Disabled Task Work Notify Host Disabled Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(NotifyHostDisabledTaskWork, self).__init__( super(NotifyHostDisabledTaskWork, self).__init__(
'notify-host-disabled_%s' % host.name, task, 'notify-host-disabled_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -187,10 +201,26 @@ class NotifyHostDisabledTaskWork(state_machine.StateTaskWork):
""" """
Run notify host disabled Run notify host disabled
""" """
DLOG.verbose("Notify-Host-Disabled for %s." % self._host.name) from nfv_vim import objects
nfvi.nfvi_notify_host_disabled(self._host.uuid, self._host.name,
self._host.personality, DLOG.verbose("Notify-Host-Disabled for %s %s." % (self._host.name,
self._callback()) self._service))
if self._service == objects.HOST_SERVICES.COMPUTE:
nfvi.nfvi_notify_compute_host_disabled(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.NETWORK:
nfvi.nfvi_notify_network_host_disabled(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to notify host disabled for unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
@ -478,11 +508,12 @@ class CreateHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Create Host Services Task Work Create Host Services Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(CreateHostServicesTaskWork, self).__init__( super(CreateHostServicesTaskWork, self).__init__(
'create-host-services_%s' % host.name, task, 'create-host-services_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -501,8 +532,10 @@ class CreateHostServicesTaskWork(state_machine.StateTaskWork):
response = (yield) response = (yield)
if self.task is not None: if self.task is not None:
DLOG.verbose("Create-Host-Services callback for %s, response=%s." DLOG.verbose("Create-Host-Services callback for %s %s, "
% (self._host.name, response)) "response=%s." % (self._host.name,
self._service,
response))
if response['completed']: if response['completed']:
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
@ -516,6 +549,7 @@ class CreateHostServicesTaskWork(state_machine.StateTaskWork):
empty_reason) empty_reason)
else: else:
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.FAILED, objects.HOST_SERVICE_STATE.FAILED,
response.get('reason', None)) response.get('reason', None))
@ -527,10 +561,29 @@ class CreateHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Run create host services Run create host services
""" """
DLOG.verbose("Create-Host-Services for %s." % self._host.name) from nfv_vim import objects
nfvi.nfvi_create_host_services(self._host.uuid, self._host.name, DLOG.verbose("Create-Host-Services for %s %s."
self._host.personality, % (self._host.name, self._service))
self._callback())
if self._service == objects.HOST_SERVICES.COMPUTE:
nfvi.nfvi_create_compute_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_create_guest_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.NETWORK:
nfvi.nfvi_create_network_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to create unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
@ -538,11 +591,12 @@ class DeleteHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Delete Host Services Task Work Delete Host Services Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(DeleteHostServicesTaskWork, self).__init__( super(DeleteHostServicesTaskWork, self).__init__(
'delete-host-services_%s' % host.name, task, 'delete-host-services_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -561,8 +615,9 @@ class DeleteHostServicesTaskWork(state_machine.StateTaskWork):
response = (yield) response = (yield)
if self.task is not None: if self.task is not None:
DLOG.verbose("Delete-Host-Services callback for %s, response=%s." DLOG.verbose("Delete-Host-Services callback for %s %s, "
% (self._host.name, response)) "response=%s."
% (self._host.name, self._service, response))
if response['completed']: if response['completed']:
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
@ -580,6 +635,7 @@ class DeleteHostServicesTaskWork(state_machine.StateTaskWork):
self._host.update_failure_reason(reason) self._host.update_failure_reason(reason)
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.FAILED, reason) objects.HOST_SERVICE_STATE.FAILED, reason)
self.task.task_work_complete( self.task.task_work_complete(
@ -590,6 +646,7 @@ class DeleteHostServicesTaskWork(state_machine.StateTaskWork):
Run delete host services Run delete host services
""" """
from nfv_vim import directors from nfv_vim import directors
from nfv_vim import objects
DLOG.verbose("Delete-Host-Services for %s." % self._host.name) DLOG.verbose("Delete-Host-Services for %s." % self._host.name)
@ -601,9 +658,29 @@ class DeleteHostServicesTaskWork(state_machine.StateTaskWork):
self._host.update_failure_reason(reason) self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
nfvi.nfvi_delete_host_services(self._host.uuid, self._host.name, if self._service == objects.HOST_SERVICES.COMPUTE:
self._host.personality, nfvi.nfvi_delete_compute_host_services(
self._callback()) self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_delete_guest_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.NETWORK:
nfvi.nfvi_delete_network_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.CONTAINER:
nfvi.nfvi_delete_container_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to delete unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
@ -611,11 +688,12 @@ class EnableHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Enable Host Services Task Work Enable Host Services Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(EnableHostServicesTaskWork, self).__init__( super(EnableHostServicesTaskWork, self).__init__(
'enable-host-services_%s' % host.name, task, 'enable-host-services_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -634,8 +712,9 @@ class EnableHostServicesTaskWork(state_machine.StateTaskWork):
response = (yield) response = (yield)
if self.task is not None: if self.task is not None:
DLOG.verbose("Enable-Host-Services callback for %s, response=%s." DLOG.verbose("Enable-Host-Services callback for service: %s %s %s, "
% (self._host.name, response)) "response=%s." % (self._service, self._host.name,
self._service, response))
if response['completed']: if response['completed']:
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
@ -649,6 +728,7 @@ class EnableHostServicesTaskWork(state_machine.StateTaskWork):
empty_reason) empty_reason)
else: else:
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.FAILED, objects.HOST_SERVICE_STATE.FAILED,
response.get('reason', None)) response.get('reason', None))
@ -660,11 +740,35 @@ class EnableHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Run enable host services Run enable host services
""" """
DLOG.verbose("Enable-Host-Services for %s." % self._host.name) from nfv_vim import objects
DLOG.verbose("Enable-Host-Services for %s for service %s."
% (self._host.name, self._service))
self._host.host_services_locked = False self._host.host_services_locked = False
nfvi.nfvi_enable_host_services(self._host.uuid, self._host.name,
self._host.personality, if self._service == objects.HOST_SERVICES.COMPUTE:
self._callback()) nfvi.nfvi_enable_compute_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_enable_guest_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.NETWORK:
nfvi.nfvi_enable_network_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.CONTAINER:
nfvi.nfvi_enable_container_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to enable unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
@ -672,11 +776,12 @@ class DisableHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Disable Host Services Task Work Disable Host Services Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(DisableHostServicesTaskWork, self).__init__( super(DisableHostServicesTaskWork, self).__init__(
'disable-host-services_%s' % host.name, task, 'disable-host-services_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -695,8 +800,9 @@ class DisableHostServicesTaskWork(state_machine.StateTaskWork):
response = (yield) response = (yield)
if self.task is not None: if self.task is not None:
DLOG.verbose("Disable-Host-Services callback for %s, response=%s." DLOG.verbose("Disable-Host-Services callback for service: %s, %s %s, "
% (self._host.name, response)) "response=%s." % (self._service, self._host.name,
self._service, response))
if response['completed']: if response['completed']:
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
@ -710,6 +816,7 @@ class DisableHostServicesTaskWork(state_machine.StateTaskWork):
empty_reason) empty_reason)
else: else:
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.FAILED, objects.HOST_SERVICE_STATE.FAILED,
response.get('reason', None)) response.get('reason', None))
@ -721,10 +828,30 @@ class DisableHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Run disable host services Run disable host services
""" """
DLOG.verbose("Disable-Host-Services for %s." % self._host.name) from nfv_vim import objects
nfvi.nfvi_disable_host_services(self._host.uuid, self._host.name,
self._host.personality, DLOG.verbose("Disable-Host-Services for %s service %s."
self._callback()) % (self._host.name, self._service))
if self._service == objects.HOST_SERVICES.COMPUTE:
nfvi.nfvi_disable_compute_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_disable_guest_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.CONTAINER:
nfvi.nfvi_disable_container_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to disable unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
@ -769,7 +896,7 @@ class NotifyHostServicesEnabledTaskWork(state_machine.StateTaskWork):
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
empty_reason) empty_reason)
else: else:
self._host.host_services_update( self._host.host_services_update_all(
objects.HOST_SERVICE_STATE.FAILED, objects.HOST_SERVICE_STATE.FAILED,
response.get('reason', None)) response.get('reason', None))
@ -829,7 +956,7 @@ class NotifyHostServicesDisabledTaskWork(state_machine.StateTaskWork):
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
empty_reason) empty_reason)
else: else:
self._host.host_services_update( self._host.host_services_update_all(
objects.HOST_SERVICE_STATE.FAILED, objects.HOST_SERVICE_STATE.FAILED,
response.get('reason', None)) response.get('reason', None))
@ -842,6 +969,7 @@ class NotifyHostServicesDisabledTaskWork(state_machine.StateTaskWork):
Run notify host services disabled Run notify host services disabled
""" """
DLOG.verbose("Notify-Host-Services-Disabled for %s." % self._host.name) DLOG.verbose("Notify-Host-Services-Disabled for %s." % self._host.name)
nfvi.nfvi_notify_host_services_disabled(self._host.uuid, nfvi.nfvi_notify_host_services_disabled(self._host.uuid,
self._host.name, self._host.name,
self._callback()) self._callback())
@ -906,11 +1034,12 @@ class AuditHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Audit Host Services Task Work Audit Host Services Task Work
""" """
def __init__(self, task, host, force_pass=False): def __init__(self, task, host, service, force_pass=False):
super(AuditHostServicesTaskWork, self).__init__( super(AuditHostServicesTaskWork, self).__init__(
'audit-host-services_%s' % host.name, task, 'audit-host-services_%s_%s' % (host.name, service), task,
force_pass=force_pass, timeout_in_secs=120) force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
self._service = service
@property @property
def _host(self): def _host(self):
@ -925,22 +1054,24 @@ class AuditHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Callback for audit host services Callback for audit host services
""" """
from nfv_vim import directors
from nfv_vim import objects from nfv_vim import objects
DLOG.verbose("query callback for service: %s" % self._service)
response = (yield) response = (yield)
if self.task is not None: if self.task is not None:
DLOG.verbose("query callback for service %s %s"
% (self._service, response['result-data']))
if response['completed']: if response['completed']:
if 'enabled' == response['result-data']: if 'enabled' == response['result-data']:
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.ENABLED) objects.HOST_SERVICE_STATE.ENABLED)
else: else:
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.DISABLED) objects.HOST_SERVICE_STATE.DISABLED)
host_director = directors.get_host_director()
host_director.host_audit(self._host)
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
empty_reason) empty_reason)
@ -948,24 +1079,26 @@ class AuditHostServicesTaskWork(state_machine.StateTaskWork):
if self.force_pass: if self.force_pass:
if self._host.is_enabled(): if self._host.is_enabled():
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.ENABLED) objects.HOST_SERVICE_STATE.ENABLED)
else: else:
self._host.host_services_update( self._host.host_services_update(
self._service,
objects.HOST_SERVICE_STATE.DISABLED) objects.HOST_SERVICE_STATE.DISABLED)
DLOG.info("Audit-Host-Services callback for %s, failed, " DLOG.info("Audit-Host-Services callback for %s, "
"force-passing, defaulting state to %s." "failed, force-passing, "
% (self._host.name, self._host.host_service_state)) "defaulting state to %s."
% (self._host.name,
host_director = directors.get_host_director() self._host.host_service_state(self._service)))
host_director.host_audit(self._host)
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.SUCCESS, state_machine.STATE_TASK_WORK_RESULT.SUCCESS,
empty_reason) empty_reason)
else: else:
DLOG.error("Audit-Host-Services callback for %s, " DLOG.error("Audit-Host-Services callback for %s, %s"
"response=%s." % (self._host.name, response)) "response=%s." % (self._host.name,
self._service, response))
self.task.task_work_complete( self.task.task_work_complete(
state_machine.STATE_TASK_WORK_RESULT.FAILED, state_machine.STATE_TASK_WORK_RESULT.FAILED,
response['reason']) response['reason'])
@ -974,11 +1107,63 @@ class AuditHostServicesTaskWork(state_machine.StateTaskWork):
""" """
Run audit host services Run audit host services
""" """
nfvi.nfvi_query_host_services(self._host.uuid, self._host.name, from nfv_vim import objects
self._host.personality, self._callback())
DLOG.verbose("Query-Host-Services for %s %s" % (self._host.name,
self._service))
if self._service == objects.HOST_SERVICES.COMPUTE:
nfvi.nfvi_query_compute_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.GUEST:
nfvi.nfvi_query_guest_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
elif self._service == objects.HOST_SERVICES.NETWORK:
nfvi.nfvi_query_network_host_services(
self._host.uuid, self._host.name, self._host.personality,
self._callback())
else:
reason = ("Trying to query unknown "
"host service %s" % self._service)
DLOG.error(reason)
self._host.update_failure_reason(reason)
return state_machine.STATE_TASK_WORK_RESULT.FAILED, reason
return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason return state_machine.STATE_TASK_WORK_RESULT.WAIT, empty_reason
class AuditHostServicesCompleteTaskWork(state_machine.StateTaskWork):
"""
Audit Host Services Complete Task Work
"""
def __init__(self, task, host, force_pass=False):
super(AuditHostServicesCompleteTaskWork, self).__init__(
'audit-host-services_%s' % host.name, task,
force_pass=force_pass, timeout_in_secs=120)
self._host_reference = weakref.ref(host)
@property
def _host(self):
"""
Returns the host
"""
host = self._host_reference()
return host
def run(self):
"""
Run audit instances
"""
from nfv_vim import directors
host_director = directors.get_host_director()
host_director.host_audit(self._host)
return state_machine.STATE_TASK_WORK_RESULT.SUCCESS, empty_reason
class AuditInstancesTaskWork(state_machine.StateTaskWork): class AuditInstancesTaskWork(state_machine.StateTaskWork):
""" """
Audit Instances Task Work Audit Instances Task Work

View File

@ -25,6 +25,7 @@ from nfv_vim.host_fsm._host_task_work import NotifyHostServicesDeleteFailedTaskW
from nfv_vim.host_fsm._host_task_work import NotifyInstancesHostDisablingTaskWork from nfv_vim.host_fsm._host_task_work import NotifyInstancesHostDisablingTaskWork
from nfv_vim.host_fsm._host_task_work import NotifyInstancesHostDisabledTaskWork from nfv_vim.host_fsm._host_task_work import NotifyInstancesHostDisabledTaskWork
from nfv_vim.host_fsm._host_task_work import AuditHostServicesTaskWork from nfv_vim.host_fsm._host_task_work import AuditHostServicesTaskWork
from nfv_vim.host_fsm._host_task_work import AuditHostServicesCompleteTaskWork
from nfv_vim.host_fsm._host_task_work import AuditInstancesTaskWork from nfv_vim.host_fsm._host_task_work import AuditInstancesTaskWork
DLOG = debug.debug_get_logger('nfv_vim.state_machine.host_task') DLOG = debug.debug_get_logger('nfv_vim.state_machine.host_task')
@ -34,10 +35,21 @@ class AddHostTask(state_machine.StateTask):
""" """
Add Host Task Add Host Task
""" """
def __init__(self, host): def __init__(self, host):
from nfv_vim import objects
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
task_work_list = list() task_work_list = list()
task_work_list.append(CreateHostServicesTaskWork(self, host)) if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
task_work_list.append(CreateHostServicesTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE))
if host.host_service_configured(objects.HOST_SERVICES.NETWORK):
task_work_list.append(CreateHostServicesTaskWork(
self, host, objects.HOST_SERVICES.NETWORK))
if host.host_service_configured(objects.HOST_SERVICES.GUEST):
task_work_list.append(CreateHostServicesTaskWork(
self, host, objects.HOST_SERVICES.GUEST))
super(AddHostTask, self).__init__( super(AddHostTask, self).__init__(
'add-host_%s' % host.name, task_work_list) 'add-host_%s' % host.name, task_work_list)
@ -71,10 +83,24 @@ class DeleteHostTask(state_machine.StateTask):
""" """
Delete Host Task Delete Host Task
""" """
def __init__(self, host): def __init__(self, host):
from nfv_vim import objects
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
task_work_list = list() task_work_list = list()
task_work_list.append(DeleteHostServicesTaskWork(self, host)) if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
task_work_list.append(DeleteHostServicesTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE))
if host.host_service_configured(objects.HOST_SERVICES.NETWORK):
task_work_list.append(DeleteHostServicesTaskWork(
self, host, objects.HOST_SERVICES.NETWORK))
if host.host_service_configured(objects.HOST_SERVICES.GUEST):
task_work_list.append(DeleteHostServicesTaskWork(
self, host, objects.HOST_SERVICES.GUEST))
if host.host_service_configured(objects.HOST_SERVICES.CONTAINER):
task_work_list.append(DeleteHostServicesTaskWork(
self, host, objects.HOST_SERVICES.CONTAINER))
task_work_list.append(NotifyHostServicesDeletedTaskWork( task_work_list.append(NotifyHostServicesDeletedTaskWork(
self, host, force_pass=True)) self, host, force_pass=True))
super(DeleteHostTask, self).__init__( super(DeleteHostTask, self).__init__(
@ -110,11 +136,27 @@ class EnableHostTask(state_machine.StateTask):
""" """
Enable Host Task Enable Host Task
""" """
def __init__(self, host): def __init__(self, host):
from nfv_vim import objects
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
task_work_list = list() task_work_list = list()
task_work_list.append(NotifyHostEnabledTaskWork(self, host)) if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
task_work_list.append(EnableHostServicesTaskWork(self, host)) task_work_list.append(NotifyHostEnabledTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE))
if host.host_service_configured(objects.HOST_SERVICES.CONTAINER):
task_work_list.append(EnableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.CONTAINER))
if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
task_work_list.append(EnableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE))
if host.host_service_configured(objects.HOST_SERVICES.NETWORK):
task_work_list.append(EnableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.NETWORK))
if host.host_service_configured(objects.HOST_SERVICES.GUEST):
task_work_list.append(EnableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.GUEST))
task_work_list.append(NotifyHostServicesEnabledTaskWork( task_work_list.append(NotifyHostServicesEnabledTaskWork(
self, host, force_pass=True)) self, host, force_pass=True))
task_work_list.append(QueryHypervisorTaskWork( task_work_list.append(QueryHypervisorTaskWork(
@ -172,11 +214,24 @@ class DisableHostTask(state_machine.StateTask):
notify_host_services_task = NotifyHostServicesDisabledTaskWork notify_host_services_task = NotifyHostServicesDisabledTaskWork
task_work_list = list() task_work_list = list()
task_work_list.append(DisableHostServicesTaskWork(self, host)) if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
task_work_list.append(DisableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE))
if host.host_service_configured(objects.HOST_SERVICES.GUEST):
task_work_list.append(DisableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.GUEST))
if host.host_service_configured(objects.HOST_SERVICES.CONTAINER):
task_work_list.append(DisableHostServicesTaskWork(
self, host, objects.HOST_SERVICES.CONTAINER))
task_work_list.append(QueryHypervisorTaskWork( task_work_list.append(QueryHypervisorTaskWork(
self, host, force_pass=True)) self, host, force_pass=True))
task_work_list.append(NotifyInstancesHostDisablingTaskWork(self, host)) task_work_list.append(NotifyInstancesHostDisablingTaskWork(self, host))
task_work_list.append(NotifyHostDisabledTaskWork(self, host)) if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
task_work_list.append(NotifyHostDisabledTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE))
if host.host_service_configured(objects.HOST_SERVICES.NETWORK):
task_work_list.append(NotifyHostDisabledTaskWork(
self, host, objects.HOST_SERVICES.NETWORK))
task_work_list.append(NotifyInstancesHostDisabledTaskWork(self, host)) task_work_list.append(NotifyInstancesHostDisabledTaskWork(self, host))
task_work_list.append(notify_host_services_task( task_work_list.append(notify_host_services_task(
self, host, force_pass=True)) self, host, force_pass=True))
@ -409,11 +464,23 @@ class AuditEnabledHostTask(state_machine.StateTask):
""" """
Audit Enabled Host Task Audit Enabled Host Task
""" """
def __init__(self, host): def __init__(self, host):
from nfv_vim import objects
self._host_reference = weakref.ref(host) self._host_reference = weakref.ref(host)
task_work_list = list() task_work_list = list()
task_work_list.append(AuditHostServicesTaskWork( if host.host_service_configured(objects.HOST_SERVICES.COMPUTE):
self, host, force_pass=True)) task_work_list.append(AuditHostServicesTaskWork(
self, host, objects.HOST_SERVICES.COMPUTE, force_pass=True))
if host.host_service_configured(objects.HOST_SERVICES.NETWORK):
task_work_list.append(AuditHostServicesTaskWork(
self, host, objects.HOST_SERVICES.NETWORK, force_pass=True))
if host.host_service_configured(objects.HOST_SERVICES.GUEST):
task_work_list.append(AuditHostServicesTaskWork(
self, host, objects.HOST_SERVICES.GUEST, force_pass=True))
task_work_list.append(AuditHostServicesCompleteTaskWork(
self, host))
super(AuditEnabledHostTask, self).__init__( super(AuditEnabledHostTask, self).__init__(
'audit-enabled-host_%s' % host.name, task_work_list) 'audit-enabled-host_%s' % host.name, task_work_list)

View File

@ -15,6 +15,11 @@ from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_delete # noqa:
from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_query # noqa: F401 from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_query # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_vote # noqa: F401 from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_vote # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_notify # noqa: F401 from nfv_vim.nfvi._nfvi_guest_module import nfvi_guest_services_notify # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_disable_guest_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_enable_guest_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_create_guest_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_delete_guest_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_query_guest_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_register_host_services_query_callback # noqa: F401 from nfv_vim.nfvi._nfvi_guest_module import nfvi_register_host_services_query_callback # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_register_guest_services_query_callback # noqa: F401 from nfv_vim.nfvi._nfvi_guest_module import nfvi_register_guest_services_query_callback # noqa: F401
from nfv_vim.nfvi._nfvi_guest_module import nfvi_register_guest_services_state_notify_callback # noqa: F401 from nfv_vim.nfvi._nfvi_guest_module import nfvi_register_guest_services_state_notify_callback # noqa: F401
@ -28,19 +33,15 @@ from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_get_upgrade # noqa: F
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_upgrade_start # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_upgrade_start # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_upgrade_activate # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_upgrade_activate # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_upgrade_complete # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_upgrade_complete # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_create_host_services # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_disable_container_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_delete_host_services # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_enable_container_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_enable_host_services # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_delete_container_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_disable_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_query_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_enabled # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_enabled # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_disabled # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_disabled # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_disable_extend # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_disable_extend # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_disable_failed # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_disable_failed # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_deleted # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_deleted # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_delete_failed # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_services_delete_failed # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_enabled # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_disabled # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_failed # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_notify_host_failed # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_lock_host # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_lock_host # noqa: F401
from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_unlock_host # noqa: F401 from nfv_vim.nfvi._nfvi_infrastructure_module import nfvi_unlock_host # noqa: F401
@ -70,6 +71,11 @@ from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_delete_volume # noqa:
from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_update_volume # noqa: F401 from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_update_volume # noqa: F401
from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_get_volume # noqa: F401 from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_get_volume # noqa: F401
from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_get_volume_snapshots # noqa: F401 from nfv_vim.nfvi._nfvi_block_storage_module import nfvi_get_volume_snapshots # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_notify_network_host_disabled # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_enable_network_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_delete_network_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_create_network_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_query_network_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_network_plugin_disabled # noqa: F401 from nfv_vim.nfvi._nfvi_network_module import nfvi_network_plugin_disabled # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_get_networks # noqa: F401 from nfv_vim.nfvi._nfvi_network_module import nfvi_get_networks # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_create_network # noqa: F401 from nfv_vim.nfvi._nfvi_network_module import nfvi_create_network # noqa: F401
@ -81,6 +87,13 @@ from nfv_vim.nfvi._nfvi_network_module import nfvi_update_subnet # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_delete_subnet # noqa: F401 from nfv_vim.nfvi._nfvi_network_module import nfvi_delete_subnet # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_get_subnet # noqa: F401 from nfv_vim.nfvi._nfvi_network_module import nfvi_get_subnet # noqa: F401
from nfv_vim.nfvi._nfvi_network_module import nfvi_get_subnets # noqa: F401 from nfv_vim.nfvi._nfvi_network_module import nfvi_get_subnets # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_notify_compute_host_enabled # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_notify_compute_host_disabled # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_disable_compute_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_enable_compute_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_delete_compute_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_create_compute_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_query_compute_host_services # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_compute_plugin_disabled # noqa: F401 from nfv_vim.nfvi._nfvi_compute_module import nfvi_compute_plugin_disabled # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_get_host_aggregates # noqa: F401 from nfv_vim.nfvi._nfvi_compute_module import nfvi_get_host_aggregates # noqa: F401
from nfv_vim.nfvi._nfvi_compute_module import nfvi_get_hypervisors # noqa: F401 from nfv_vim.nfvi._nfvi_compute_module import nfvi_get_hypervisors # noqa: F401

View File

@ -380,6 +380,90 @@ def nfvi_register_instance_delete_callback(callback):
callback=callback) callback=callback)
def nfvi_notify_compute_host_enabled(host_uuid, host_name, host_personality,
callback):
"""
Notify compute host is enabled
"""
cmd_id = _compute_plugin.invoke_plugin('notify_host_enabled',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_notify_compute_host_disabled(host_uuid, host_name, host_personality,
callback):
"""
Notify compute host is disabled
"""
cmd_id = _compute_plugin.invoke_plugin('notify_host_disabled',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_disable_compute_host_services(host_uuid, host_name, host_personality,
callback):
"""
Disable compute host services
"""
cmd_id = _compute_plugin.invoke_plugin('disable_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_enable_compute_host_services(host_uuid, host_name, host_personality,
callback):
"""
Enable compute host services
"""
cmd_id = _compute_plugin.invoke_plugin('enable_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_delete_compute_host_services(host_uuid, host_name, host_personality,
callback):
"""
Delete compute services
"""
cmd_id = _compute_plugin.invoke_plugin('delete_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_create_compute_host_services(host_uuid, host_name, host_personality,
callback):
"""
Create compute services
"""
cmd_id = _compute_plugin.invoke_plugin('create_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_query_compute_host_services(host_uuid, host_name, host_personality,
callback):
"""
Query compute services
"""
cmd_id = _compute_plugin.invoke_plugin('query_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_compute_initialize(config, pool): def nfvi_compute_initialize(config, pool):
""" """
Initialize the NFVI compute package Initialize the NFVI compute package

View File

@ -80,6 +80,66 @@ def nfvi_guest_services_notify(instance_uuid, host_name, action_type,
return cmd_id return cmd_id
def nfvi_disable_guest_host_services(host_uuid, host_name,
host_personality, callback):
"""
Disable guest services
"""
cmd_id = _guest_plugin.invoke_plugin('disable_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_enable_guest_host_services(host_uuid, host_name, host_personality,
callback):
"""
Enable guest services
"""
cmd_id = _guest_plugin.invoke_plugin('enable_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_delete_guest_host_services(host_uuid, host_name, host_personality,
callback):
"""
Delete guest services
"""
cmd_id = _guest_plugin.invoke_plugin('delete_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_create_guest_host_services(host_uuid, host_name, host_personality,
callback):
"""
Create guest services
"""
cmd_id = _guest_plugin.invoke_plugin('create_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_query_guest_host_services(host_uuid, host_name, host_personality,
callback):
"""
Query guest services
"""
cmd_id = _guest_plugin.invoke_plugin('query_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_register_host_services_query_callback(callback): def nfvi_register_host_services_query_callback(callback):
""" """
Register for host services query Register for host services query

View File

@ -85,63 +85,42 @@ def nfvi_upgrade_complete(callback):
return cmd_id return cmd_id
def nfvi_create_host_services(host_uuid, host_name, host_personality, def nfvi_disable_container_host_services(host_uuid, host_name,
callback): host_personality,
callback):
""" """
Create host services on a host Disable container services on a host
""" """
cmd_id = _infrastructure_plugin.invoke_plugin('create_host_services', cmd_id = _infrastructure_plugin.invoke_plugin(
host_uuid, host_name, 'disable_host_services',
host_personality, host_uuid, host_name, host_personality,
callback=callback) callback=callback)
return cmd_id return cmd_id
def nfvi_delete_host_services(host_uuid, host_name, host_personality, def nfvi_enable_container_host_services(host_uuid, host_name,
callback): host_personality,
callback):
""" """
Delete host services from a host Enable container services on a host
""" """
cmd_id = _infrastructure_plugin.invoke_plugin('delete_host_services', cmd_id = _infrastructure_plugin.invoke_plugin(
host_uuid, host_name, 'enable_host_services',
host_personality, host_uuid, host_name, host_personality,
callback=callback) callback=callback)
return cmd_id return cmd_id
def nfvi_enable_host_services(host_uuid, host_name, host_personality, def nfvi_delete_container_host_services(host_uuid, host_name,
callback): host_personality,
callback):
""" """
Enable host services on a host Delete container services on a host
""" """
cmd_id = _infrastructure_plugin.invoke_plugin('enable_host_services', cmd_id = _infrastructure_plugin.invoke_plugin(
host_uuid, host_name, 'delete_host_services',
host_personality, host_uuid, host_name, host_personality,
callback=callback) callback=callback)
return cmd_id
def nfvi_disable_host_services(host_uuid, host_name, host_personality,
callback):
"""
Disable host services on a host
"""
cmd_id = _infrastructure_plugin.invoke_plugin('disable_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_query_host_services(host_uuid, host_name, host_personality,
callback):
"""
Query the administrative state of host services on a host
"""
cmd_id = _infrastructure_plugin.invoke_plugin('query_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id return cmd_id
@ -207,29 +186,6 @@ def nfvi_notify_host_services_delete_failed(host_uuid, host_name,
return cmd_id return cmd_id
def nfvi_notify_host_enabled(host_uuid, host_name, host_personality, callback):
"""
Notify host is enabled
"""
cmd_id = _infrastructure_plugin.invoke_plugin('notify_host_enabled',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_notify_host_disabled(host_uuid, host_name, host_personality,
callback):
"""
Notify host is disabled
"""
cmd_id = _infrastructure_plugin.invoke_plugin('notify_host_disabled',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_notify_host_failed(host_uuid, host_name, host_personality, callback): def nfvi_notify_host_failed(host_uuid, host_name, host_personality, callback):
""" """
Notify host is failed Notify host is failed

View File

@ -117,6 +117,66 @@ def nfvi_get_subnet(subnet_id, callback):
return cmd_id return cmd_id
def nfvi_notify_network_host_disabled(host_uuid, host_name, host_personality,
callback):
"""
Notify network host is disabled
"""
cmd_id = _network_plugin.invoke_plugin('notify_host_disabled',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_enable_network_host_services(host_uuid, host_name, host_personality,
callback):
"""
Enable network services
"""
cmd_id = _network_plugin.invoke_plugin('enable_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_delete_network_host_services(host_uuid, host_name, host_personality,
callback):
"""
Delete network services
"""
cmd_id = _network_plugin.invoke_plugin('delete_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_create_network_host_services(host_uuid, host_name, host_personality,
callback):
"""
Create network services
"""
cmd_id = _network_plugin.invoke_plugin('create_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_query_network_host_services(host_uuid, host_name, host_personality,
callback):
"""
Query network services
"""
cmd_id = _network_plugin.invoke_plugin('query_host_services',
host_uuid, host_name,
host_personality,
callback=callback)
return cmd_id
def nfvi_network_initialize(config, pool): def nfvi_network_initialize(config, pool):
""" """
Initialize the NFVI network package Initialize the NFVI network package

View File

@ -276,6 +276,62 @@ class NFVIComputeAPI(object):
""" """
pass pass
@abc.abstractmethod
def notify_host_enabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify compute host enabled using the plugin
"""
pass
@abc.abstractmethod
def notify_host_disabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify compute host disabled using the plugin
"""
pass
@abc.abstractmethod
def disable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Disable compute services on a host using the plugin
"""
pass
@abc.abstractmethod
def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Enable compute services on a host using the plugin
"""
pass
@abc.abstractmethod
def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Delete compute services on a host using the plugin
"""
pass
@abc.abstractmethod
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create compute services on a host using the plugin
"""
pass
@abc.abstractmethod
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query compute services on a host using the plugin
"""
pass
@abc.abstractmethod @abc.abstractmethod
def initialize(self, config_file): def initialize(self, config_file):
""" """

View File

@ -86,6 +86,46 @@ class NFVIGuestAPI(object):
""" """
pass pass
@abc.abstractmethod
def disable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Disable guest services on a host using the plugin
"""
pass
@abc.abstractmethod
def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Enable guest services on a host using the plugin
"""
pass
@abc.abstractmethod
def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Delete guest services on a host using the plugin
"""
pass
@abc.abstractmethod
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create guest services on a host using the plugin
"""
pass
@abc.abstractmethod
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query guest services on a host using the plugin
"""
pass
@abc.abstractmethod @abc.abstractmethod
def register_host_services_query_callback(self, callback): def register_host_services_query_callback(self, callback):
""" """

View File

@ -68,43 +68,29 @@ class NFVIInfrastructureAPI(object):
""" """
pass pass
@abc.abstractmethod
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create host services on a host using the plugin
"""
pass
@abc.abstractmethod @abc.abstractmethod
def delete_host_services(self, future, host_uuid, host_name, def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback): host_personality, callback):
""" """
Delete host services on a host using the plugin Delete infrastructure host services using the plugin
""" """
pass pass
@abc.abstractmethod @abc.abstractmethod
def enable_host_services(self, future, host_uuid, host_name, def enable_host_services(self, future, host_uuid,
host_personality, callback): host_name, host_personality,
callback):
""" """
Enable host services on a host using the plugin Enable infrastructure host services using the plugin
""" """
pass pass
@abc.abstractmethod @abc.abstractmethod
def disable_host_services(self, future, host_uuid, host_name, def disable_host_services(self, future, host_uuid,
host_personality, callback): host_name, host_personality,
callback):
""" """
Disable host services on a host using the plugin Disable infrastructure host services using the plugin
"""
pass
@abc.abstractmethod
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query host services on a host using the plugin
""" """
pass pass
@ -114,6 +100,7 @@ class NFVIInfrastructureAPI(object):
""" """
Notify host services are now enabled using the plugin Notify host services are now enabled using the plugin
""" """
pass
@abc.abstractmethod @abc.abstractmethod
def notify_host_services_disabled(self, future, host_uuid, host_name, def notify_host_services_disabled(self, future, host_uuid, host_name,
@ -155,22 +142,6 @@ class NFVIInfrastructureAPI(object):
""" """
pass pass
@abc.abstractmethod
def notify_host_enabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host enabled using the plugin
"""
pass
@abc.abstractmethod
def notify_host_disabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify host disabled using the plugin
"""
pass
@abc.abstractmethod @abc.abstractmethod
def notify_host_failed(self, future, host_uuid, host_name, host_personality, def notify_host_failed(self, future, host_uuid, host_name, host_personality,
callback): callback):

View File

@ -114,6 +114,46 @@ class NFVINetworkAPI(object):
""" """
pass pass
@abc.abstractmethod
def notify_host_disabled(self, future, host_uuid, host_name,
host_personality, callback):
"""
Notify network host disabled using the plugin
"""
pass
@abc.abstractmethod
def enable_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Enable network services on a host using the plugin
"""
pass
@abc.abstractmethod
def delete_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Delete network services on a host using the plugin
"""
pass
@abc.abstractmethod
def create_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Create network services on a host using the plugin
"""
pass
@abc.abstractmethod
def query_host_services(self, future, host_uuid, host_name,
host_personality, callback):
"""
Query network services on a host using the plugin
"""
pass
@abc.abstractmethod @abc.abstractmethod
def initialize(self, config_file): def initialize(self, config_file):
""" """

View File

@ -8,6 +8,7 @@ from nfv_vim.objects._system import System # noqa: F401
from nfv_vim.objects._host import HOST_PERSONALITY # noqa: F401 from nfv_vim.objects._host import HOST_PERSONALITY # noqa: F401
from nfv_vim.objects._host import HOST_NAME # noqa: F401 from nfv_vim.objects._host import HOST_NAME # noqa: F401
from nfv_vim.objects._host import HOST_SERVICE_STATE # noqa: F401 from nfv_vim.objects._host import HOST_SERVICE_STATE # noqa: F401
from nfv_vim.objects._host import HOST_SERVICES # noqa: F401
from nfv_vim.objects._host import Host # noqa: F401 from nfv_vim.objects._host import Host # noqa: F401
from nfv_vim.objects._host_group import HOST_GROUP_POLICY # noqa: F401 from nfv_vim.objects._host_group import HOST_GROUP_POLICY # noqa: F401
from nfv_vim.objects._host_group import HostGroup # noqa: F401 from nfv_vim.objects._host_group import HostGroup # noqa: F401

View File

@ -4,6 +4,7 @@
# SPDX-License-Identifier: Apache-2.0 # SPDX-License-Identifier: Apache-2.0
# #
import six import six
import os
from nfv_common import debug from nfv_common import debug
from nfv_common import state_machine from nfv_common import state_machine
@ -53,10 +54,22 @@ class HostServicesState(object):
FAILED = Constant('failed') FAILED = Constant('failed')
@six.add_metaclass(Singleton)
class HostServices(object):
"""
Host-Services Constants
"""
GUEST = Constant('guest')
NETWORK = Constant('network')
COMPUTE = Constant('compute')
CONTAINER = Constant('container')
# Host-Services Constant Instantiation # Host-Services Constant Instantiation
HOST_SERVICE_STATE = HostServicesState() HOST_SERVICE_STATE = HostServicesState()
HOST_PERSONALITY = HostPersonality() HOST_PERSONALITY = HostPersonality()
HOST_NAME = HostNames() HOST_NAME = HostNames()
HOST_SERVICES = HostServices()
class Host(ObjectData): class Host(ObjectData):
@ -92,10 +105,24 @@ class Host(ObjectData):
self._last_state_timestamp = timers.get_monotonic_timestamp_in_ms() self._last_state_timestamp = timers.get_monotonic_timestamp_in_ms()
self._fail_notification_required = False self._fail_notification_required = False
self._fsm_start_time = None self._fsm_start_time = None
if self.is_enabled(): self._host_service_state = dict()
self._host_service_state = HOST_SERVICE_STATE.ENABLED
else: if self.host_service_configured(HOST_SERVICES.COMPUTE):
self._host_service_state = HOST_SERVICE_STATE.DISABLED self._host_service_state[HOST_SERVICES.COMPUTE] = \
HOST_SERVICE_STATE.ENABLED if self.is_enabled() else \
HOST_SERVICE_STATE.DISABLED
if self.host_service_configured(HOST_SERVICES.NETWORK):
self._host_service_state[HOST_SERVICES.NETWORK] = \
HOST_SERVICE_STATE.ENABLED if self.is_enabled() else \
HOST_SERVICE_STATE.DISABLED
if self.host_service_configured(HOST_SERVICES.GUEST):
self._host_service_state[HOST_SERVICES.GUEST] = \
HOST_SERVICE_STATE.ENABLED if self.is_enabled() else \
HOST_SERVICE_STATE.DISABLED
if self.host_service_configured(HOST_SERVICES.CONTAINER):
self._host_service_state[HOST_SERVICES.CONTAINER] = \
HOST_SERVICE_STATE.ENABLED if self.is_enabled() else \
HOST_SERVICE_STATE.DISABLED
self._alarms = list() self._alarms = list()
self._events = list() self._events = list()
@ -128,12 +155,70 @@ class Host(ObjectData):
""" """
return self._fsm.current_state.name return self._fsm.current_state.name
@property def host_service_configured(self, service):
def host_service_state(self):
""" """
Returns the current state of the host services Returns whether a host service is configured or not
""" """
return self._host_service_state kubernetes_config = True
if not os.path.isfile('/etc/kubernetes/admin.conf'):
kubernetes_config = False
configured = True
if kubernetes_config:
if service == HOST_SERVICES.COMPUTE:
configured = (not nfvi.nfvi_compute_plugin_disabled() and
self._nfvi_host.openstack_compute)
elif service == HOST_SERVICES.NETWORK:
configured = (not nfvi.nfvi_network_plugin_disabled() and
(self._nfvi_host.openstack_compute or
self._nfvi_host.openstack_control))
elif service == HOST_SERVICES.GUEST:
configured = (not nfvi.nfvi_guest_plugin_disabled() and
self._nfvi_host.openstack_compute)
elif service != HOST_SERVICES.CONTAINER:
DLOG.error("unknown service %s" % service)
configured = False
else:
if service == HOST_SERVICES.CONTAINER:
configured = False
DLOG.verbose("Host configure check for service %s, result %s" %
(service, configured))
return configured
def host_service_state(self, service):
"""
Returns the state for a host service
"""
return self._host_service_state[service]
def host_service_state_aggregate(self):
"""
Returns the overall state of the host services
"""
all_enabled = True
at_least_one_failed = False
for service, service_state in self._host_service_state.items():
# Ignore state of kubernetes, plugin as
# there is no query function for that sevice.
if service == HOST_SERVICES.CONTAINER:
continue
all_enabled = all_enabled and \
(service_state == HOST_SERVICE_STATE.ENABLED)
at_least_one_failed = at_least_one_failed or \
(service_state == HOST_SERVICE_STATE.FAILED)
DLOG.verbose("service_state: %s, all_enabled: %s" %
(service_state, all_enabled))
if all_enabled:
return HOST_SERVICE_STATE.ENABLED
elif at_least_one_failed:
return HOST_SERVICE_STATE.FAILED
else:
return HOST_SERVICE_STATE.DISABLED
@property @property
def host_services_locked(self): def host_services_locked(self):
@ -645,28 +730,54 @@ class Host(ObjectData):
alarm.host_clear_alarm(self._alarms) alarm.host_clear_alarm(self._alarms)
self._fsm.handle_event(host_fsm.HOST_EVENT.DELETE) self._fsm.handle_event(host_fsm.HOST_EVENT.DELETE)
def host_services_update(self, host_service_state, reason=None): def host_services_update_all(self, host_service_state, reason=None):
""" """
Host services update Host services update all
""" """
if host_service_state == self._host_service_state: at_least_one_change = False
return
for service, state in self._host_service_state.items():
if state != host_service_state:
at_least_one_change = True
self._host_service_state[service] = host_service_state
if at_least_one_change:
self.host_services_update(None, host_service_state, reason)
def host_services_update(self, service,
host_service_state, reason=None):
"""
Host services update. None input service parameter indicates
that the _host_service_state has already been updated through
host_services_update_all.
"""
if service is not None:
if host_service_state == self._host_service_state[service]:
return
self._host_service_state[service] = host_service_state
# Host services logs and alarms only apply to compute hosts # Host services logs and alarms only apply to compute hosts
if 'compute' in self.personality: if 'compute' in self.personality:
if HOST_SERVICE_STATE.ENABLED == host_service_state: host_service_state_overall = \
self.host_service_state_aggregate()
if (HOST_SERVICE_STATE.ENABLED ==
host_service_state_overall):
self._events = event_log.host_issue_log( self._events = event_log.host_issue_log(
self, event_log.EVENT_ID.HOST_SERVICES_ENABLED) self, event_log.EVENT_ID.HOST_SERVICES_ENABLED)
alarm.host_clear_alarm(self._alarms) alarm.host_clear_alarm(self._alarms)
self._alarms[:] = list() self._alarms[:] = list()
elif HOST_SERVICE_STATE.DISABLED == host_service_state: elif (HOST_SERVICE_STATE.DISABLED ==
host_service_state_overall):
self._events = event_log.host_issue_log( self._events = event_log.host_issue_log(
self, event_log.EVENT_ID.HOST_SERVICES_DISABLED) self, event_log.EVENT_ID.HOST_SERVICES_DISABLED)
alarm.host_clear_alarm(self._alarms) alarm.host_clear_alarm(self._alarms)
self._alarms[:] = list() self._alarms[:] = list()
elif HOST_SERVICE_STATE.FAILED == host_service_state: elif (HOST_SERVICE_STATE.FAILED ==
host_service_state_overall):
if reason is None: if reason is None:
additional_text = '' additional_text = ''
else: else:
@ -679,8 +790,6 @@ class Host(ObjectData):
self, alarm.ALARM_TYPE.HOST_SERVICES_FAILED, self, alarm.ALARM_TYPE.HOST_SERVICES_FAILED,
additional_text=additional_text) additional_text=additional_text)
self._host_service_state = host_service_state
def nfvi_host_upgrade_status(self, upgrade_inprogress, recover_instances): def nfvi_host_upgrade_status(self, upgrade_inprogress, recover_instances):
""" """
NFVI Host Upgrade NFVI Host Upgrade

View File

@ -19,6 +19,7 @@ from nfv_vim.objects import HOST_PERSONALITY
from nfv_vim.objects import HOST_GROUP_POLICY from nfv_vim.objects import HOST_GROUP_POLICY
from nfv_vim.objects import HOST_NAME from nfv_vim.objects import HOST_NAME
from nfv_vim.objects import INSTANCE_GROUP_POLICY from nfv_vim.objects import INSTANCE_GROUP_POLICY
from nfv_vim.objects import HOST_SERVICES
from nfv_vim.nfvi.objects.v1 import UPGRADE_STATE from nfv_vim.nfvi.objects.v1 import UPGRADE_STATE
@ -777,8 +778,14 @@ class SwPatchStrategy(SwUpdateStrategy):
# Disable host services before migrating to ensure # Disable host services before migrating to ensure
# instances do not migrate to compute hosts in the # instances do not migrate to compute hosts in the
# same set of hosts. # same set of hosts.
stage.add_step(strategy.DisableHostServicesStep( if host_list[0].host_service_configured(
host_list)) HOST_SERVICES.COMPUTE):
stage.add_step(strategy.DisableHostServicesStep(
host_list, HOST_SERVICES.COMPUTE))
# TODO(ksmith)
# When support is added for orchestration on
# non-OpenStack worker nodes, support for disabling
# kubernetes services will have to be added.
stage.add_step(strategy.MigrateInstancesStep( stage.add_step(strategy.MigrateInstancesStep(
instance_list)) instance_list))
else: else:
@ -1375,7 +1382,15 @@ class SwUpgradeStrategy(SwUpdateStrategy):
# Disable host services before migrating to ensure # Disable host services before migrating to ensure
# instances do not migrate to compute hosts in the # instances do not migrate to compute hosts in the
# same set of hosts. # same set of hosts.
stage.add_step(strategy.DisableHostServicesStep(host_list)) if host_list[0].host_service_configured(
HOST_SERVICES.COMPUTE):
stage.add_step(strategy.DisableHostServicesStep(
host_list, HOST_SERVICES.COMPUTE))
# TODO(ksmith)
# When support is added for orchestration on
# non-OpenStack worker nodes, support for disabling
# kubernetes services will have to be added.
stage.add_step(strategy.MigrateInstancesStep(instance_list)) stage.add_step(strategy.MigrateInstancesStep(instance_list))
stage.add_step(strategy.LockHostsStep(host_list)) stage.add_step(strategy.LockHostsStep(host_list))
stage.add_step(strategy.UpgradeHostsStep(host_list)) stage.add_step(strategy.UpgradeHostsStep(host_list))

View File

@ -1793,12 +1793,14 @@ class DisableHostServicesStep(strategy.StrategyStep):
""" """
Disable Host Services - Strategy Step Disable Host Services - Strategy Step
""" """
def __init__(self, hosts): def __init__(self, hosts, service):
super(DisableHostServicesStep, self).__init__( super(DisableHostServicesStep, self).__init__(
STRATEGY_STEP_NAME.DISABLE_HOST_SERVICES, timeout_in_secs=180) "%s" % STRATEGY_STEP_NAME.DISABLE_HOST_SERVICES,
timeout_in_secs=180)
self._hosts = hosts self._hosts = hosts
self._host_names = list() self._host_names = list()
self._host_uuids = list() self._host_uuids = list()
self._service = service
for host in hosts: for host in hosts:
self._host_names.append(host.name) self._host_names.append(host.name)
self._host_uuids.append(host.uuid) self._host_uuids.append(host.uuid)
@ -1807,7 +1809,7 @@ class DisableHostServicesStep(strategy.StrategyStep):
""" """
Returns the abort step related to this step Returns the abort step related to this step
""" """
return [EnableHostServicesStep(self._hosts)] return [EnableHostServicesStep(self._hosts, self._service)]
def _total_hosts_services_disabled(self): def _total_hosts_services_disabled(self):
""" """
@ -1820,7 +1822,8 @@ class DisableHostServicesStep(strategy.StrategyStep):
if host is None: if host is None:
return -1 return -1
if objects.HOST_SERVICE_STATE.DISABLED == host.host_service_state: if (objects.HOST_SERVICE_STATE.DISABLED ==
host.host_service_state(self._service)):
total_hosts_services_disabled += 1 total_hosts_services_disabled += 1
return total_hosts_services_disabled return total_hosts_services_disabled
@ -1831,10 +1834,11 @@ class DisableHostServicesStep(strategy.StrategyStep):
""" """
from nfv_vim import directors from nfv_vim import directors
DLOG.info("Step (%s) apply for hosts %s." % (self._name, DLOG.info("Step (%s) apply for hosts %s service %s." %
self._host_names)) (self._name, self._host_names, self._service))
host_director = directors.get_host_director() host_director = directors.get_host_director()
operation = host_director.disable_host_services(self._host_names) operation = host_director.disable_host_services(self._host_names,
self._service)
if operation.is_inprogress(): if operation.is_inprogress():
return strategy.STRATEGY_STEP_RESULT.WAIT, "" return strategy.STRATEGY_STEP_RESULT.WAIT, ""
elif operation.is_failed(): elif operation.is_failed():
@ -1880,6 +1884,7 @@ class DisableHostServicesStep(strategy.StrategyStep):
self._hosts = list() self._hosts = list()
self._host_uuids = list() self._host_uuids = list()
self._host_names = data['entity_names'] self._host_names = data['entity_names']
self._service = data['entity_service']
host_table = tables.tables_get_host_table() host_table = tables.tables_get_host_table()
for host_name in self._host_names: for host_name in self._host_names:
host = host_table.get(host_name, None) host = host_table.get(host_name, None)
@ -1896,6 +1901,7 @@ class DisableHostServicesStep(strategy.StrategyStep):
data['entity_type'] = 'hosts' data['entity_type'] = 'hosts'
data['entity_names'] = self._host_names data['entity_names'] = self._host_names
data['entity_uuids'] = self._host_uuids data['entity_uuids'] = self._host_uuids
data['entity_service'] = self._service
return data return data
@ -1903,12 +1909,14 @@ class EnableHostServicesStep(strategy.StrategyStep):
""" """
Enable Host Services - Strategy Step Enable Host Services - Strategy Step
""" """
def __init__(self, hosts): def __init__(self, hosts, service):
super(EnableHostServicesStep, self).__init__( super(EnableHostServicesStep, self).__init__(
STRATEGY_STEP_NAME.ENABLE_HOST_SERVICES, timeout_in_secs=180) "%s" % STRATEGY_STEP_NAME.ENABLE_HOST_SERVICES,
timeout_in_secs=180)
self._hosts = hosts self._hosts = hosts
self._host_names = list() self._host_names = list()
self._host_uuids = list() self._host_uuids = list()
self._service = service
for host in hosts: for host in hosts:
self._host_names.append(host.name) self._host_names.append(host.name)
self._host_uuids.append(host.uuid) self._host_uuids.append(host.uuid)
@ -1924,7 +1932,8 @@ class EnableHostServicesStep(strategy.StrategyStep):
if host is None: if host is None:
return -1 return -1
if objects.HOST_SERVICE_STATE.ENABLED == host.host_service_state: if (objects.HOST_SERVICE_STATE.ENABLED ==
host.host_service_state(self._service)):
total_hosts_services_enabled += 1 total_hosts_services_enabled += 1
return total_hosts_services_enabled return total_hosts_services_enabled
@ -1935,10 +1944,11 @@ class EnableHostServicesStep(strategy.StrategyStep):
""" """
from nfv_vim import directors from nfv_vim import directors
DLOG.info("Step (%s) apply for hosts %s." % (self._name, DLOG.info("Step (%s) apply for hosts %s service %s." %
self._host_names)) (self._name, self._host_names, self._service))
host_director = directors.get_host_director() host_director = directors.get_host_director()
operation = host_director.enable_host_services(self._host_names) operation = host_director.enable_host_services(self._host_names,
self._service)
if operation.is_inprogress(): if operation.is_inprogress():
return strategy.STRATEGY_STEP_RESULT.WAIT, "" return strategy.STRATEGY_STEP_RESULT.WAIT, ""
elif operation.is_failed(): elif operation.is_failed():
@ -1984,6 +1994,7 @@ class EnableHostServicesStep(strategy.StrategyStep):
self._hosts = list() self._hosts = list()
self._host_uuids = list() self._host_uuids = list()
self._host_names = data['entity_names'] self._host_names = data['entity_names']
self._service = data['entity_service']
host_table = tables.tables_get_host_table() host_table = tables.tables_get_host_table()
for host_name in self._host_names: for host_name in self._host_names:
host = host_table.get(host_name, None) host = host_table.get(host_name, None)
@ -2000,6 +2011,7 @@ class EnableHostServicesStep(strategy.StrategyStep):
data['entity_type'] = 'hosts' data['entity_type'] = 'hosts'
data['entity_names'] = self._host_names data['entity_names'] = self._host_names
data['entity_uuids'] = self._host_uuids data['entity_uuids'] = self._host_uuids
data['entity_service'] = self._service
return data return data