88 lines
3.5 KiB
Python
88 lines
3.5 KiB
Python
# Copyright 2018 VMware, Inc.
|
|
# All Rights Reserved
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
from oslo_log import log
|
|
|
|
from vmware_nsx.extensions import projectpluginmap
|
|
from vmware_nsx.plugins.common.housekeeper import base_job
|
|
from vmware_nsx.plugins.nsx_v3 import utils as v3_utils
|
|
|
|
LOG = log.getLogger(__name__)
|
|
|
|
|
|
class MismatchLogicalportJob(base_job.BaseJob):
|
|
|
|
def __init__(self, global_readonly, readonly_jobs):
|
|
super(MismatchLogicalportJob, self).__init__(
|
|
global_readonly, readonly_jobs)
|
|
|
|
def get_project_plugin(self, plugin):
|
|
return plugin.get_plugin_by_type(projectpluginmap.NsxPlugins.NSX_T)
|
|
|
|
def get_name(self):
|
|
return 'mismatch_logical_port'
|
|
|
|
def get_description(self):
|
|
return 'Detect mismatched configuration on NSX logical ports'
|
|
|
|
def run(self, context, readonly=False):
|
|
super(MismatchLogicalportJob, self).run(context)
|
|
|
|
# get all orphaned DHCP servers
|
|
mismatch_ports = v3_utils.get_mismatch_logical_ports(
|
|
context, self.plugin.nsxlib, self.plugin)
|
|
info = ""
|
|
if not mismatch_ports:
|
|
msg = 'No mismatched logical ports detected.'
|
|
info = base_job.housekeeper_info(info, msg)
|
|
return {'error_count': 0, 'fixed_count': 0, 'error_info': info}
|
|
|
|
msg = ("Found %(len)s mismatched logical port%(plural)s:" %
|
|
{'len': len(mismatch_ports),
|
|
'plural': 's' if len(mismatch_ports) > 1 else ''})
|
|
info = base_job.housekeeper_warning(info, msg)
|
|
|
|
fixed_count = 0
|
|
for port_problem in mismatch_ports:
|
|
msg = ("Logical port %(nsx_id)s "
|
|
"[neutron id: %(id)s] error: %(err)s" %
|
|
{'nsx_id': port_problem['nsx_id'],
|
|
'id': port_problem['neutron_id'],
|
|
'err': port_problem['error']})
|
|
if not readonly:
|
|
# currently we mitigate only address bindings mismatches
|
|
err_type = port_problem['error_type']
|
|
if err_type == v3_utils.PORT_ERROR_TYPE_BINDINGS:
|
|
# Create missing address bindings on backend
|
|
port = port_problem['port']
|
|
try:
|
|
address_bindings = self.plugin._build_address_bindings(
|
|
port)
|
|
self.plugin.nsxlib.logical_port.update(
|
|
port_problem['nsx_id'], port_problem['neutron_id'],
|
|
address_bindings=address_bindings)
|
|
except Exception as e:
|
|
msg = "%s failed to be fixed: %s" % (msg, e)
|
|
else:
|
|
fixed_count = fixed_count + 1
|
|
msg = "%s was fixed." % msg
|
|
else:
|
|
msg = "%s cannot be fixed automatically." % msg
|
|
info = base_job.housekeeper_warning(info, msg)
|
|
|
|
return {'error_count': len(mismatch_ports),
|
|
'error_info': info,
|
|
'fixed_count': fixed_count}
|