vmware-nsx/vmware_nsx/api_replay/cli.py
Salvatore Orlando beef0d8feb [API Replay] Fail fast by default
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
2021-10-27 13:24:58 -07:00

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()