beef0d8feb
Add a --ignore-errors CLI options to preserve the current behaviour where API replays completes all operations and then reports errors. When --ignore-errors is not set, API replay will fail and quit at the first error. Also fixes help string for enable_barbican option. Change-Id: Ic2f6f89060f26292b017b2b3defb488452ec1cb7
224 lines
8.7 KiB
Python
224 lines
8.7 KiB
Python
# 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.
|
|
|
|
import argparse
|
|
|
|
from vmware_nsx.api_replay import client
|
|
|
|
DEFAULT_DOMAIN_ID = 'default'
|
|
DEFAULT_LOGFILE = 'nsx_migration.log'
|
|
|
|
|
|
class ApiReplayCli(object):
|
|
|
|
def __init__(self):
|
|
args = self._setup_argparse()
|
|
|
|
# args validation
|
|
if not args.dest_os_endpoint_url:
|
|
# auth params are mandatory
|
|
if (not args.dest_os_project_name or
|
|
not args.dest_os_username or
|
|
not args.dest_os_password or
|
|
not args.dest_os_username or
|
|
not args.dest_os_auth_url):
|
|
print("missing destination mandatory auth parameters")
|
|
return
|
|
|
|
client.ApiReplayClient(
|
|
source_os_tenant_name=args.source_os_project_name,
|
|
source_os_tenant_domain_id=args.source_os_project_domain_id,
|
|
source_os_username=args.source_os_username,
|
|
source_os_user_domain_id=args.source_os_user_domain_id,
|
|
source_os_password=args.source_os_password,
|
|
source_os_auth_url=args.source_os_auth_url,
|
|
dest_os_tenant_name=args.dest_os_project_name,
|
|
dest_os_tenant_domain_id=args.dest_os_project_domain_id,
|
|
dest_os_username=args.dest_os_username,
|
|
dest_os_user_domain_id=args.dest_os_user_domain_id,
|
|
dest_os_password=args.dest_os_password,
|
|
dest_os_auth_url=args.dest_os_auth_url,
|
|
dest_os_endpoint_url=args.dest_os_endpoint_url,
|
|
dest_plugin=args.dest_plugin,
|
|
enable_barbican=args.enable_barbican,
|
|
use_old_keystone=args.use_old_keystone,
|
|
octavia_os_tenant_name=args.octavia_os_project_name,
|
|
octavia_os_tenant_domain_id=args.octavia_os_project_domain_id,
|
|
octavia_os_username=args.octavia_os_username,
|
|
octavia_os_user_domain_id=args.octavia_os_user_domain_id,
|
|
octavia_os_password=args.octavia_os_password,
|
|
octavia_os_auth_url=args.octavia_os_auth_url,
|
|
neutron_conf=args.neutron_conf,
|
|
ext_net_map=args.external_networks_map,
|
|
net_vni_map=args.networks_vni_map,
|
|
int_vni_map=args.internal_networks_vni_map,
|
|
vif_ids_map=args.vif_ids_map,
|
|
logfile=args.logfile,
|
|
max_retry=args.max_retry,
|
|
cert_file=args.cert_file,
|
|
ignore_errors=args.ignore_errors)
|
|
|
|
def _setup_argparse(self):
|
|
parser = argparse.ArgumentParser()
|
|
|
|
# Arguments required to connect to source
|
|
# neutron which we will fetch all of the data from.
|
|
parser.add_argument(
|
|
"--source-os-username",
|
|
required=True,
|
|
help="The source os-username to use to "
|
|
"gather neutron resources with.")
|
|
parser.add_argument(
|
|
"--source-os-user-domain-id",
|
|
default=DEFAULT_DOMAIN_ID,
|
|
help="The source os-user-domain-id to use to "
|
|
"gather neutron resources with.")
|
|
parser.add_argument(
|
|
"--source-os-project-name",
|
|
required=True,
|
|
help="The source os-project-name to use to "
|
|
"gather neutron resource with.")
|
|
parser.add_argument(
|
|
"--source-os-project-domain-id",
|
|
default=DEFAULT_DOMAIN_ID,
|
|
help="The source os-project-domain-id to use to "
|
|
"gather neutron resource with.")
|
|
parser.add_argument(
|
|
"--source-os-password",
|
|
required=True,
|
|
help="The password for this user.")
|
|
parser.add_argument(
|
|
"--source-os-auth-url",
|
|
required=True,
|
|
help="They keystone api endpoint for this user.")
|
|
|
|
# Arguments required to connect to the dest neutron which
|
|
# we will recreate all of these resources over.
|
|
parser.add_argument(
|
|
"--dest-os-username",
|
|
help="The dest os-username to use to"
|
|
"gather neutron resources with.")
|
|
parser.add_argument(
|
|
"--dest-os-user-domain-id",
|
|
default=DEFAULT_DOMAIN_ID,
|
|
help="The dest os-user-domain-id to use to"
|
|
"gather neutron resources with.")
|
|
parser.add_argument(
|
|
"--dest-os-project-name",
|
|
help="The dest os-project-name to use to "
|
|
"gather neutron resource with.")
|
|
parser.add_argument(
|
|
"--dest-os-project-domain-id",
|
|
default=DEFAULT_DOMAIN_ID,
|
|
help="The dest os-project-domain-id to use to "
|
|
"gather neutron resource with.")
|
|
parser.add_argument(
|
|
"--dest-os-password",
|
|
help="The password for this user.")
|
|
parser.add_argument(
|
|
"--dest-os-auth-url",
|
|
help="The keystone api endpoint for this user.")
|
|
parser.add_argument(
|
|
"--dest-os-endpoint-url",
|
|
help="The destination neutron api endpoint. If provided noauth "
|
|
"calls will be made")
|
|
parser.add_argument(
|
|
"--dest-plugin",
|
|
default='nsx-p',
|
|
help="The core plugin of the destination nsx-t/nsx-p.")
|
|
|
|
parser.add_argument(
|
|
"--use-old-keystone",
|
|
default=False,
|
|
action='store_true',
|
|
help="Use old keystone client for source authentication.")
|
|
parser.add_argument(
|
|
"--cert-file",
|
|
default="",
|
|
help="certificate file for the authentication.")
|
|
|
|
# Arguments required to connect to the octavia client (read only)
|
|
parser.add_argument(
|
|
"--octavia-os-username",
|
|
help="The octavia os-username to use to "
|
|
"gather loadbalancers resources with.")
|
|
parser.add_argument(
|
|
"--octavia-os-user-domain-id",
|
|
default=DEFAULT_DOMAIN_ID,
|
|
help="The octavia os-user-domain-id to use to "
|
|
"gather loadbalancers resources with.")
|
|
parser.add_argument(
|
|
"--octavia-os-project-name",
|
|
help="The octavia os-project-name to use to "
|
|
"gather loadbalancers resource with.")
|
|
parser.add_argument(
|
|
"--octavia-os-project-domain-id",
|
|
default=DEFAULT_DOMAIN_ID,
|
|
help="The octavia os-project-domain-id to use to "
|
|
"gather loadbalancers resource with.")
|
|
parser.add_argument(
|
|
"--octavia-os-password",
|
|
help="The password for this octavia user.")
|
|
parser.add_argument(
|
|
"--octavia-os-auth-url",
|
|
help="They keystone api endpoint for this octavia user.")
|
|
|
|
parser.add_argument(
|
|
"--logfile",
|
|
default=DEFAULT_LOGFILE,
|
|
help="Output logfile.")
|
|
|
|
parser.add_argument(
|
|
"--neutron_conf",
|
|
default='/etc/neutron/neutron.conf',
|
|
help="neutron config file path.")
|
|
|
|
parser.add_argument(
|
|
"--external-networks-map",
|
|
help="Path to a json file mapping external network neutron ID "
|
|
"to tier0 ID.")
|
|
parser.add_argument(
|
|
"--networks-vni-map",
|
|
help="Path to a json file mapping neutron network ID to its "
|
|
"backend vni.")
|
|
parser.add_argument(
|
|
"--internal-networks-vni-map",
|
|
help="Path to a json file mapping internal network ID "
|
|
"to its backend vni.")
|
|
parser.add_argument(
|
|
"--vif-ids-map",
|
|
help="Path to a json file mapping compute ports ids to the "
|
|
"expected vif ids.")
|
|
|
|
parser.add_argument(
|
|
"--max-retry",
|
|
default=10,
|
|
help="Maximum number of retrying different operations.")
|
|
parser.add_argument(
|
|
"--enable-barbican",
|
|
default=False,
|
|
action='store_true',
|
|
help="Enable barbican connection for Octavia certificates")
|
|
parser.add_argument(
|
|
"--ignore-errors",
|
|
action='store_true',
|
|
default=False,
|
|
help="Continuing executing API replay even upon errors")
|
|
|
|
# NOTE: this will return an error message if any of the
|
|
# require options are missing.
|
|
return parser.parse_args()
|
|
|
|
|
|
def main():
|
|
ApiReplayCli()
|