From d3c9be2f840a9c0cf9a9a85150b7d9b435d35684 Mon Sep 17 00:00:00 2001 From: Bas de Bruijne Date: Mon, 9 Jan 2023 18:56:09 +0000 Subject: [PATCH 1/4] make network and image names variable --- .../charm_tests/dragent/configure.py | 4 ++-- zaza/openstack/charm_tests/magnum/tests.py | 2 +- zaza/openstack/charm_tests/neutron/setup.py | 8 +++---- zaza/openstack/charm_tests/nova/utils.py | 4 +++- zaza/openstack/charm_tests/octavia/tests.py | 8 ++++--- zaza/openstack/configure/bgp_speaker.py | 12 +++++----- zaza/openstack/configure/guest.py | 12 +++++----- zaza/openstack/utilities/openstack.py | 22 +++++++++++++++---- 8 files changed, 45 insertions(+), 27 deletions(-) diff --git a/zaza/openstack/charm_tests/dragent/configure.py b/zaza/openstack/charm_tests/dragent/configure.py index f509609..e7edbbf 100644 --- a/zaza/openstack/charm_tests/dragent/configure.py +++ b/zaza/openstack/charm_tests/dragent/configure.py @@ -37,8 +37,8 @@ OVERCLOUD_NETWORK_CONFIG = { "router_name": "provider-router", "ip_version": "4", "address_scope": "public", - "external_net_name": "ext_net", - "external_subnet_name": "ext_net_subnet", + "external_net_name": openstack_utils.EXT_NET, + "external_subnet_name": openstack_utils.EXT_NET_SUBNET, "prefix_len": "24", "subnetpool_name": "pooled_subnets", "subnetpool_prefix": "192.168.0.0/16", diff --git a/zaza/openstack/charm_tests/magnum/tests.py b/zaza/openstack/charm_tests/magnum/tests.py index e2d77e8..da43a53 100644 --- a/zaza/openstack/charm_tests/magnum/tests.py +++ b/zaza/openstack/charm_tests/magnum/tests.py @@ -65,7 +65,7 @@ class MagnumBasicDeployment(test_utils.OpenStackBaseTest): template_fields = { 'name': TEMPLATE_NAME, 'image_id': IMAGE_NAME, - 'external_network_id': 'ext_net', + 'external_network_id': openstack_utils.EXT_NET, 'dns_nameserver': '1.1.1.1', 'master_flavor_id': FLAVOR_NAME, 'flavor_id': FLAVOR_NAME, diff --git a/zaza/openstack/charm_tests/neutron/setup.py b/zaza/openstack/charm_tests/neutron/setup.py index 1402c8f..6aa9b90 100644 --- a/zaza/openstack/charm_tests/neutron/setup.py +++ b/zaza/openstack/charm_tests/neutron/setup.py @@ -38,13 +38,13 @@ OVERCLOUD_NETWORK_CONFIG = { "router_name": "provider-router", "ip_version": "4", "address_scope": "public", - "external_net_name": "ext_net", - "external_subnet_name": "ext_net_subnet", + "external_net_name": openstack_utils.EXT_NET, + "external_subnet_name": openstack_utils.EXT_NET_SUBNET, "prefix_len": "24", "subnetpool_name": "pooled_subnets", "subnetpool_prefix": "192.168.0.0/16", - "project_net_name": "private", - "project_subnet_name": "private_subnet", + "project_net_name": openstack_utils.PRIVATE_NET, + "project_subnet_name": openstack_utils.PRIVATE_NET_SUBNET, } OVERCLOUD_PROVIDER_VLAN_NETWORK_CONFIG = { diff --git a/zaza/openstack/charm_tests/nova/utils.py b/zaza/openstack/charm_tests/nova/utils.py index 87af7d5..c5732b7 100644 --- a/zaza/openstack/charm_tests/nova/utils.py +++ b/zaza/openstack/charm_tests/nova/utils.py @@ -14,6 +14,8 @@ """Data for nova tests.""" +import os + FLAVORS = { 'm1.tiny': { 'flavorid': 1, @@ -75,4 +77,4 @@ FLAVORS = { }, }, } -KEYPAIR_NAME = 'zaza' +KEYPAIR_NAME = os.environ.get('TEST_KEYPAIR_NAME', 'zaza') diff --git a/zaza/openstack/charm_tests/octavia/tests.py b/zaza/openstack/charm_tests/octavia/tests.py index 086932b..789c2af 100644 --- a/zaza/openstack/charm_tests/octavia/tests.py +++ b/zaza/openstack/charm_tests/octavia/tests.py @@ -473,10 +473,11 @@ class LBAASv2Test(test_utils.OpenStackBaseTest): # Get IP of the prepared payload instances payload_ips = [] for server in (instance_1, instance_2): - payload_ips.append(server.networks['private'][0]) + payload_ips.append(server.networks[openstack_utils.PRIVATE_NET][0]) self.assertTrue(len(payload_ips) > 0) - resp = self.neutron_client.list_networks(name='private') + resp = self.neutron_client.list_networks( + name=openstack_utils.PRIVATE_NET) subnet_id = resp['networks'][0]['subnets'][0] if openstack_utils.dvr_enabled(): resp = self.neutron_client.list_networks( @@ -508,7 +509,8 @@ class LBAASv2Test(test_utils.OpenStackBaseTest): raise final_exc lb_fp = openstack_utils.create_floating_ip( - self.neutron_client, 'ext_net', port={'id': lb['vip_port_id']}) + self.neutron_client, + openstack_utils.EXT_NET, port={'id': lb['vip_port_id']}) snippet = 'This is the default welcome page' assert snippet in self._get_payload(lb_fp['floating_ip_address']) diff --git a/zaza/openstack/configure/bgp_speaker.py b/zaza/openstack/configure/bgp_speaker.py index 4fd9587..03e3ed4 100755 --- a/zaza/openstack/configure/bgp_speaker.py +++ b/zaza/openstack/configure/bgp_speaker.py @@ -26,8 +26,6 @@ from zaza.openstack.utilities import ( ) -EXT_NET = "ext_net" -PRIVATE_NET = "private" FIP_TEST = "FIP TEST" @@ -71,9 +69,9 @@ def setup_bgp_speaker(peer_application_name, keystone_session=None): # Add networks to bgp speaker logging.info("Advertising BGP routes") openstack_utils.add_network_to_bgp_speaker( - neutron_client, bgp_speaker, EXT_NET) + neutron_client, bgp_speaker, openstack_utils.EXT_NET) openstack_utils.add_network_to_bgp_speaker( - neutron_client, bgp_speaker, PRIVATE_NET) + neutron_client, bgp_speaker, openstack_utils.PRIVATE_NET) logging.debug("Advertised routes: {}" .format( neutron_client.list_route_advertised_from_bgp_speaker( @@ -91,8 +89,10 @@ def setup_bgp_speaker(peer_application_name, keystone_session=None): # Create Floating IP to advertise logging.info("Creating floating IP to advertise") - port = openstack_utils.create_port(neutron_client, FIP_TEST, PRIVATE_NET) - floating_ip = openstack_utils.create_floating_ip(neutron_client, EXT_NET, + port = openstack_utils.create_port(neutron_client, + FIP_TEST, openstack_utils.PRIVATE_NET) + floating_ip = openstack_utils.create_floating_ip(neutron_client, + openstack_utils.EXT_NET, port=port) logging.info( "Advertised floating IP: {}".format( diff --git a/zaza/openstack/configure/guest.py b/zaza/openstack/configure/guest.py index 1b09dfd..059a17d 100644 --- a/zaza/openstack/configure/guest.py +++ b/zaza/openstack/configure/guest.py @@ -33,23 +33,23 @@ from tenacity import ( boot_tests = { 'cirros': { - 'image_name': 'cirros', + 'image_name': openstack_utils.CIRROS_IMAGE_NAME, 'flavor_name': 'm1.tiny', 'username': 'cirros', 'bootstring': 'gocubsgo', 'password': 'gocubsgo'}, 'bionic': { - 'image_name': 'bionic', + 'image_name': openstack_utils.BIONIC_IMAGE_NAME, 'flavor_name': 'm1.small', 'username': 'ubuntu', 'bootstring': 'finished at'}, 'focal': { - 'image_name': 'focal', + 'image_name': openstack_utils.FOCAL_IMAGE_NAME, 'flavor_name': 'm1.small', 'username': 'ubuntu', 'bootstring': 'finished at'}, 'jammy': { - 'image_name': 'jammy', + 'image_name': openstack_utils.JAMMY_IMAGE_NAME, 'flavor_name': 'm1.small', 'username': 'ubuntu', 'bootstring': 'finished at'} @@ -142,10 +142,10 @@ def launch_instance(instance_key, use_boot_volume=False, vm_name=None, flavor_name = flavor_name or boot_tests[instance_key]['flavor_name'] flavor = nova_client.flavors.find(name=flavor_name) - private_network_name = private_network_name or "private" + private_network_name = private_network_name or openstack_utils.PRIVATE_NET meta = meta or {} - external_network_name = external_network_name or "ext_net" + external_network_name = external_network_name or openstack_utils.EXT_NET if attach_to_external_network: instance_network_name = external_network_name diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index 4cd403a..c5c5ee7 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -194,6 +194,16 @@ KEYSTONE_CACERT = "keystone_juju_ca_cert.crt" KEYSTONE_REMOTE_CACERT = ( "/usr/local/share/ca-certificates/{}".format(KEYSTONE_CACERT)) +EXT_NET = os.environ.get('TEST_EXT_NET', 'ext_net') +EXT_NET_SUBNET = os.environ.get('TEST_EXT_NET_SUBNET', 'ext_net_subnet') +PRIVATE_NET = os.environ.get('TEST_PRIVATE_NET', 'private') +PRIVATE_NET_SUBNET = os.environ.get('TEST_PRIVATE_NET_SUBNET', + 'private_subnet') +CIRROS_IMAGE_NAME = os.environ.get('TEST_CIRROS_IMAGE_NAME', 'cirros') +BIONIC_IMAGE_NAME = os.environ.get('TEST_BIONIC_IMAGE_NAME', 'bionic') +FOCAL_IMAGE_NAME = os.environ.get('TEST_FOCAL_IMAGE_NAME', 'focal') +JAMMY_IMAGE_NAME = os.environ.get('TEST_JAMMY_IMAGE_NAME', 'jammy') + async def async_block_until_ca_exists(application_name, ca_cert, model_name=None, timeout=2700): @@ -1142,7 +1152,7 @@ def get_mac_from_port(port, neutronclient): return refresh_port['port']['mac_address'] -def create_project_network(neutron_client, project_id, net_name='private', +def create_project_network(neutron_client, project_id, net_name=PRIVATE_NET, shared=False, network_type='gre', domain=None): """Create the project network. @@ -1182,7 +1192,7 @@ def create_project_network(neutron_client, project_id, net_name='private', return network -def create_provider_network(neutron_client, project_id, net_name='ext_net', +def create_provider_network(neutron_client, project_id, net_name=EXT_NET, external=True, shared=False, network_type='flat', vlan_id=None): """Create a provider network. @@ -1229,7 +1239,7 @@ def create_provider_network(neutron_client, project_id, net_name='ext_net', def create_project_subnet(neutron_client, project_id, network, cidr, dhcp=True, - subnet_name='private_subnet', domain=None, + subnet_name=PRIVATE_NET_SUBNET, domain=None, subnetpool=None, ip_version=4, prefix_len=24): """Create the project subnet. @@ -1282,7 +1292,7 @@ def create_project_subnet(neutron_client, project_id, network, cidr, dhcp=True, def create_provider_subnet(neutron_client, project_id, network, - subnet_name='ext_net_subnet', + subnet_name=EXT_NET_SUBNET, default_gateway=None, cidr=None, start_floating_ip=None, end_floating_ip=None, dhcp=False): @@ -2860,6 +2870,10 @@ def get_private_key_file(keypair_name): :returns: Path to file containing key :rtype: str """ + key = os.environ.get("TEST_PRIVKEY") + if key: + return key + tmp_dir = deployment_env.get_tmpdir() return '{}/id_rsa_{}'.format(tmp_dir, keypair_name) From feb667206bf7278ee742e110cdbd4507734bae30 Mon Sep 17 00:00:00 2001 From: Bas de Bruijne Date: Wed, 11 Jan 2023 12:53:39 +0000 Subject: [PATCH 2/4] make provider-router name variable --- zaza/openstack/charm_tests/dragent/configure.py | 2 +- zaza/openstack/charm_tests/neutron/setup.py | 2 +- zaza/openstack/charm_tests/neutron/tests.py | 2 +- zaza/openstack/charm_tests/octavia/tests.py | 3 ++- zaza/openstack/charm_tests/tempest/utils.py | 3 ++- zaza/openstack/utilities/openstack.py | 10 +++++++--- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/zaza/openstack/charm_tests/dragent/configure.py b/zaza/openstack/charm_tests/dragent/configure.py index e7edbbf..4efe16a 100644 --- a/zaza/openstack/charm_tests/dragent/configure.py +++ b/zaza/openstack/charm_tests/dragent/configure.py @@ -34,7 +34,7 @@ DEFAULT_PEER_APPLICATION_NAME = "quagga" # These are the network configuration settings under test. OVERCLOUD_NETWORK_CONFIG = { "network_type": "gre", - "router_name": "provider-router", + "router_name": openstack_utils.PROVIDER_ROUTER, "ip_version": "4", "address_scope": "public", "external_net_name": openstack_utils.EXT_NET, diff --git a/zaza/openstack/charm_tests/neutron/setup.py b/zaza/openstack/charm_tests/neutron/setup.py index 6aa9b90..d6a1ab2 100644 --- a/zaza/openstack/charm_tests/neutron/setup.py +++ b/zaza/openstack/charm_tests/neutron/setup.py @@ -35,7 +35,7 @@ import zaza.charm_lifecycle.utils as lifecycle_utils # These are the network configuration settings under test. OVERCLOUD_NETWORK_CONFIG = { "network_type": "gre", - "router_name": "provider-router", + "router_name": openstack_utils.PROVIDER_ROUTER, "ip_version": "4", "address_scope": "public", "external_net_name": openstack_utils.EXT_NET, diff --git a/zaza/openstack/charm_tests/neutron/tests.py b/zaza/openstack/charm_tests/neutron/tests.py index cf925b0..4777456 100644 --- a/zaza/openstack/charm_tests/neutron/tests.py +++ b/zaza/openstack/charm_tests/neutron/tests.py @@ -1199,7 +1199,7 @@ class NeutronNetworkingVRRPTests(NeutronNetworkingBase): self.check_connectivity(instance_1, instance_2) routers = self.neutron_client.list_routers( - name='provider-router')['routers'] + name=openstack_utils.PROVIDER_ROUTER)['routers'] assert len(routers) == 1, "Unexpected router count {}".format( len(routers)) provider_router = routers[0] diff --git a/zaza/openstack/charm_tests/octavia/tests.py b/zaza/openstack/charm_tests/octavia/tests.py index 789c2af..925f886 100644 --- a/zaza/openstack/charm_tests/octavia/tests.py +++ b/zaza/openstack/charm_tests/octavia/tests.py @@ -510,7 +510,8 @@ class LBAASv2Test(test_utils.OpenStackBaseTest): lb_fp = openstack_utils.create_floating_ip( self.neutron_client, - openstack_utils.EXT_NET, port={'id': lb['vip_port_id']}) + openstack_utils.EXT_NET, + port={'id': lb['vip_port_id']}) snippet = 'This is the default welcome page' assert snippet in self._get_payload(lb_fp['floating_ip_address']) diff --git a/zaza/openstack/charm_tests/tempest/utils.py b/zaza/openstack/charm_tests/tempest/utils.py index 7463e11..d1ef96c 100644 --- a/zaza/openstack/charm_tests/tempest/utils.py +++ b/zaza/openstack/charm_tests/tempest/utils.py @@ -251,7 +251,8 @@ def _add_neutron_config(ctxt, keystone_session, missing_fatal=True): try: net = neutron_client.find_resource("network", "ext_net") ctxt['ext_net'] = net['id'] - router = neutron_client.find_resource("router", "provider-router") + router = neutron_client.find_resource("router", + openstack_utils.PROVIDER_ROUTER) ctxt['provider_router_id'] = router['id'] except neutronexceptions.NotFound: if missing_fatal: diff --git a/zaza/openstack/utilities/openstack.py b/zaza/openstack/utilities/openstack.py index c5c5ee7..1f5125b 100644 --- a/zaza/openstack/utilities/openstack.py +++ b/zaza/openstack/utilities/openstack.py @@ -194,11 +194,15 @@ KEYSTONE_CACERT = "keystone_juju_ca_cert.crt" KEYSTONE_REMOTE_CACERT = ( "/usr/local/share/ca-certificates/{}".format(KEYSTONE_CACERT)) +# Network/router names EXT_NET = os.environ.get('TEST_EXT_NET', 'ext_net') EXT_NET_SUBNET = os.environ.get('TEST_EXT_NET_SUBNET', 'ext_net_subnet') PRIVATE_NET = os.environ.get('TEST_PRIVATE_NET', 'private') PRIVATE_NET_SUBNET = os.environ.get('TEST_PRIVATE_NET_SUBNET', 'private_subnet') +PROVIDER_ROUTER = os.environ.get('TEST_PROVIDER_ROUTER', 'provider-router') + +# Image names CIRROS_IMAGE_NAME = os.environ.get('TEST_CIRROS_IMAGE_NAME', 'cirros') BIONIC_IMAGE_NAME = os.environ.get('TEST_BIONIC_IMAGE_NAME', 'bionic') FOCAL_IMAGE_NAME = os.environ.get('TEST_FOCAL_IMAGE_NAME', 'focal') @@ -1397,19 +1401,19 @@ def create_provider_router(neutron_client, project_id): :returns: Router object :rtype: dict """ - routers = neutron_client.list_routers(name='provider-router') + routers = neutron_client.list_routers(name=PROVIDER_ROUTER) if len(routers['routers']) == 0: logging.info('Creating provider router for external network access') router_info = { 'router': { - 'name': 'provider-router', + 'name': PROVIDER_ROUTER, 'tenant_id': project_id } } router = neutron_client.create_router(router_info)['router'] logging.info('New router created: %s', (router['id'])) else: - logging.warning('Router provider-router already exists.') + logging.warning('Router %s already exists.', (PROVIDER_ROUTER)) router = routers['routers'][0] return router From a9006dc5d7d0bcef4c73b56e2c72abef53763026 Mon Sep 17 00:00:00 2001 From: Bas de Bruijne Date: Mon, 16 Jan 2023 14:42:50 +0000 Subject: [PATCH 3/4] document added envvars in the REAME --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 78cc9cb..eb802b8 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,21 @@ test-requirements.txt: git+https://github.com/openstack-charmers/zaza.git#egg=zaza git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.openstack ``` + +## Configuration + +Zaza-openstack-test uses environment variables to configure the tests: + +| Env var | Description | Default Value | +|------------------------------|-----------------------------------------------------------|----------------------| +| `TEST_EXT_NET` | Name of external network | `ext_net` | +| `TEST_EXT_NET_SUBNET` | Name of external subnet | `ext_net_subnet` | +| `TEST_PRIVATE_NET` | Name of private network | `private` | +| `TEST_PRIVATE_NET_SUBNET` | Name of private subnet | `private_subnet` | +| `TEST_PROVIDER_ROUTER` | Name of private-external router | `provider-router` | +| `TEST_CIRROS_IMAGE_NAME` | Name of cirros image | `cirros` | +| `TEST_BIONIC_IMAGE_NAME` | Name of bionic image | `bionic` | +| `TEST_FOCAL_IMAGE_NAME` | Name of focal image | `focal` | +| `TEST_JAMMY_IMAGE_NAME` | Name of jammy image | `jammy` | +| `TEST_PRIVKEY` | Path to private key corresponding to `TEST_KEYPAIR_NAME` | | +| `TEST_KEYPAIR_NAME` | Name of keypair | `zaza` | From 817500a39df9b086f98d3f06cdb9c99053b45e53 Mon Sep 17 00:00:00 2001 From: Bas de Bruijne Date: Mon, 16 Jan 2023 15:06:03 +0000 Subject: [PATCH 4/4] add all envvars --- README.md | 52 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index eb802b8..0231bfb 100644 --- a/README.md +++ b/README.md @@ -29,16 +29,42 @@ git+https://github.com/openstack-charmers/zaza-openstack-tests.git#egg=zaza.open Zaza-openstack-test uses environment variables to configure the tests: -| Env var | Description | Default Value | -|------------------------------|-----------------------------------------------------------|----------------------| -| `TEST_EXT_NET` | Name of external network | `ext_net` | -| `TEST_EXT_NET_SUBNET` | Name of external subnet | `ext_net_subnet` | -| `TEST_PRIVATE_NET` | Name of private network | `private` | -| `TEST_PRIVATE_NET_SUBNET` | Name of private subnet | `private_subnet` | -| `TEST_PROVIDER_ROUTER` | Name of private-external router | `provider-router` | -| `TEST_CIRROS_IMAGE_NAME` | Name of cirros image | `cirros` | -| `TEST_BIONIC_IMAGE_NAME` | Name of bionic image | `bionic` | -| `TEST_FOCAL_IMAGE_NAME` | Name of focal image | `focal` | -| `TEST_JAMMY_IMAGE_NAME` | Name of jammy image | `jammy` | -| `TEST_PRIVKEY` | Path to private key corresponding to `TEST_KEYPAIR_NAME` | | -| `TEST_KEYPAIR_NAME` | Name of keypair | `zaza` | +| Env var | Description | Default Value | +|------------------------------|-----------------------------------------------------------|-------------------------------------------------------------------------------------------------------| +| `FUNCTEST_AMPHORA_LOCATION` | | `http://tarballs.openstack.org/octavia/test-images/test-only-amphora-x64-haproxy-ubuntu-xenial.qcow2` | +| `MOJO_LOCAL_DIR` | | | +| `OS_AUTH_URL` | Undercloud authentication url | | +| `OS_PASSWORD` | Undercloud password | | +| `OS_REGION_NAME` | Undercloud region name | | +| `OS_TENANT_NAME` | Undercloud tenant name | | +| `OS_USERNAME` | Undercloud username | | +| `TEST_ARISTA_IMAGE_LOCAL` | | `/tmp/arista-cvx-virt-test.qcow2` | +| `TEST_ARISTA_IMAGE_REMOTE` | | | +| `TEST_BIONIC_IMAGE_NAME` | Name of bionic image | `bionic` | +| `TEST_CACERT` | | | +| `TEST_CAKEY` | | | +| `TEST_CERT` | | | +| `TEST_CIDR_EXT` | | | +| `TEST_CIDR_EXT` | | | +| `TEST_CIRROS_IMAGE_NAME` | Name of cirros image | `cirros` | +| `TEST_EXT_NET_SUBNET` | Name of external subnet | `ext_net_subnet` | +| `TEST_EXT_NET` | Name of external network | `ext_net` | +| `TEST_FIP_RANGE` | Undercloud fip range | | +| `TEST_FOCAL_IMAGE_NAME` | Name of focal image | `focal` | +| `TEST_GATEWAY` | Undercloud gateway | | +| `TEST_IRONIC_DEPLOY_INITRD` | | | +| `TEST_IRONIC_DEPLOY_VMLINUZ` | | | +| `TEST_IRONIC_RAW_BM_IMAGE` | | | +| `TEST_JAMMY_IMAGE_NAME` | Name of jammy image | `jammy` | +| `TEST_KEYPAIR_NAME` | Name of keypair | `zaza` | +| `TEST_KEY` | | | +| `TEST_MAGNUM_QCOW2_IMAGE_URL`| | | +| `TEST_NAME_SERVER` | Undercloud name server | | +| `TEST_NET_ID` | Undercloud net id | | +| `TEST_NVIDIA_VGPU_HOST_SW` | | | +| `TEST_PRIVATE_NET_SUBNET` | Name of private subnet | `private_subnet` | +| `TEST_PRIVATE_NET` | Name of private network | `private` | +| `TEST_PRIVKEY` | Path to private key corresponding to `TEST_KEYPAIR_NAME` | | +| `TEST_PROVIDER_ROUTER` | Name of private-external router | `provider-router` | +| `TEST_TRILIO_LICENSE` | | | +| `TEST_VIP00` | | |