--- /dev/null
+#!/usr/bin/env python
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 Nicira, 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 equired 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.
+#
+#
+# @author: Aaron Rosen, VMware
+
+import sys
+
+from oslo.config import cfg
+
+from quantum.common import config
+from quantum.plugins.nicira.nicira_nvp_plugin import NvpApiClient
+from quantum.plugins.nicira.nicira_nvp_plugin import nvplib
+from quantum.plugins.nicira.nicira_nvp_plugin import QuantumPlugin
+
+config.setup_logging(cfg.CONF)
+
+
+def help():
+ print "Usage ./check_nvp_config path/to/nvp.ini"
+ exit(1)
+
+
+def display_controller_info(controller):
+ print "\tCan login: %s" % controller.get('can_login')
+ print "\tuser: %s" % controller.get('user')
+ print "\tpassword: %s" % controller.get('password')
+ print "\tip: %s" % controller.get('ip')
+ print "\tport: %s" % controller.get('port')
+ print "\trequested_timeout: %s" % controller.get('requested_timeout')
+ print "\tretires: %s" % controller.get('retries')
+ print "\tredirects: %s" % controller.get('redirects')
+ print "\thttp_timeout: %s" % controller.get('http_timeout')
+
+
+def test_controller(cluster, controller):
+ api_providers = [(controller.get('ip'), controller.get('port'), True)]
+ api_client = NvpApiClient.NVPApiHelper(
+ api_providers, cluster.user, cluster.password,
+ controller.get('requested_timeout'),
+ controller.get('http_timeout'),
+ controller.get('retries'),
+ controller.get('redirects'))
+
+ controller['can_login'] = (api_client.login() and True or False)
+
+
+def get_gateway_services(cluster):
+ ret_gw_services = {"L2GatewayServiceConfig": [],
+ "L3GatewayServiceConfig": []}
+ gw_services = nvplib.get_gateway_services(cluster).get('results')
+ if gw_services:
+ for gw_service in gw_services:
+ ret_gw_services[gw_service['type']].append(gw_service['uuid'])
+
+ return ret_gw_services
+
+
+def get_transport_zones(cluster):
+ transport_zones = nvplib.get_transport_zones(cluster).get('results')
+ return [transport_zone['uuid'] for transport_zone in transport_zones]
+
+
+def main(argv):
+ if len(sys.argv) != 2:
+ help()
+ args = ['--config-file']
+ args.append(sys.argv[1])
+ config.parse(args)
+ errors = False
+ nvp_opts, clusters_opts = QuantumPlugin.parse_config()
+ print "-----------Database Options--------------------"
+ print "sql_connection: %s" % cfg.CONF.DATABASE.sql_connection
+ print "reconnect_interval: %d" % cfg.CONF.DATABASE.reconnect_interval
+ print "sql_max_retries: %d" % cfg.CONF.DATABASE.sql_max_retries
+ print "-----------NVP Options--------------------"
+ print ("Number of concurrents allow to each controller %d" %
+ nvp_opts.concurrent_connections)
+ print "NVP Generation Timeout %d" % nvp_opts.nvp_gen_timeout
+ print "NVP Default Cluster Name %s" % nvp_opts.default_cluster_name
+
+ print "-----------Cluster Options--------------------"
+ if not len(clusters_opts):
+ print "No NVP Clusters detected in nvp.ini!"
+ exit(1)
+ clusters, default_cluster = QuantumPlugin.parse_clusters_opts(
+ clusters_opts, nvp_opts.concurrent_connections,
+ nvp_opts.nvp_gen_timeout, nvp_opts.default_cluster_name)
+ for cluster in clusters.itervalues():
+ num_controllers = cluster.get_num_controllers()
+ print "\n%d controllers found in cluster [CLUSTER:%s]" % (
+ num_controllers, cluster.name)
+ if num_controllers == 0:
+ print ("Cluster %s has no nvp_controller_connection defined!" %
+ cluster.name)
+ exit(1)
+
+ for i in range(0, num_controllers):
+ controller = cluster.get_controller(i)
+ if i == 0:
+ gateway_services = get_gateway_services(cluster)
+ transport_zones = get_transport_zones(cluster)
+ controller.update(nvplib.check_cluster_connectivity(cluster))
+ default_tz_zone = controller.get('default_tz_uuid')
+ print ("\n\tdefault_tz_uuid: %s" % default_tz_zone)
+ if not default_tz_zone:
+ print "\t* ERROR: No default trasport zone specified!"
+ errors = True
+ elif default_tz_zone not in transport_zones:
+ print ("\t* ERROR: did not find default transport %s zone "
+ "on NVP!" % default_tz_zone)
+ errors = True
+ print ("\tapi_redirect_interval: %s" %
+ controller.get('api_redirect_interval'))
+ print "\tcluster uuid: %s" % controller.get('uuid')
+ print "\tapi_mode: %s" % controller.get('api_mode')
+ l2_gateway = controller.get('default_l2_gw_service_uuid')
+ print ("\tdefault_l2_gw_service_uuid: %s" % l2_gateway)
+ if (l2_gateway and l2_gateway not in
+ gateway_services['L2GatewayServiceConfig']):
+ print ("\t* ERROR: Did not find L2 gateway service uuid %s"
+ " in NVP!" % l2_gateway)
+ errors = True
+ l3_gateway = controller.get('default_l3_gw_service_uuid')
+ print ("\tdefault_l3_gw_service_uuid: %s" % l3_gateway)
+ if (l3_gateway and l3_gateway not in
+ gateway_services['L3GatewayServiceConfig']):
+ print ("\t* ERROR did not find L3 gateway service uuid %s"
+ " in NVP!" % l3_gateway)
+ errors = True
+ print ("\n-----controller %d------\n" % (i + 1))
+ test_controller(cluster, controller)
+ display_controller_info(controller)
+ print "\n"
+ if errors:
+ print ("**There were configuration errors found "
+ "please review output carefully!!**")
+ print "\n"
except Exception:
LOG.exception(_("Failed to delete logical queue"))
raise exception.QuantumException()
+
+
+# -----------------------------------------------------------------------------
+# NVP API Calls for check_nvp_config utility
+# -----------------------------------------------------------------------------
+def check_cluster_connectivity(cluster):
+ """Make sure that we can issue a request to each of the cluster nodes"""
+ try:
+ resp = do_single_request(HTTP_GET, "/ws.v1/control-cluster",
+ cluster=cluster)
+ except Exception as e:
+ msg = "Failed to connect to cluster %s: %s" % (cluster, str(e))
+ raise Exception(msg)
+ return json.loads(resp)
+
+
+def get_gateway_services(cluster):
+ try:
+ resp = do_single_request(HTTP_GET,
+ "/ws.v1/gateway-service?fields=uuid",
+ cluster=cluster)
+ except Exception as e:
+ msg = "Failed to connect to cluster %s: %s" % (cluster, str(e))
+ raise Exception(msg)
+ return json.loads(resp)
+
+
+def get_transport_zones(cluster):
+ try:
+ resp = do_single_request(HTTP_GET,
+ "/ws.v1/transport-zone?fields=uuid",
+ cluster=cluster)
+ except Exception as e:
+ msg = "Failed to connect to cluster %s: %s" % (cluster, str(e))
+ raise Exception(msg)
+ return json.loads(resp)