browbeat/rally/rally-plugins/netcreate-boot/provider_netcreate_nova_boot_ping.py
rajeshP524 36a2d685d8 made changes that are required for openstack-rally-2.2.0
Change-Id: I651f32f7264eda20dabd6022cbb47eac38492856
2022-07-08 13:59:50 +05:30

80 lines
3.5 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 logging
import os
import subprocess
from rally_openstack.common import consts
from rally_openstack.task.scenarios.neutron import utils as neutron_utils
from rally_openstack.task.scenarios.vm import utils as vm_utils
from rally.task import atomic
from rally.task import scenario
from rally.task import types
from rally.task import validation
LOG = logging.getLogger(__name__)
@types.convert(image={"type": "glance_image"}, flavor={"type": "nova_flavor"})
@validation.add("image_valid_on_flavor", flavor_param="flavor", image_param="image")
@validation.add("required_services", services=[consts.Service.NEUTRON, consts.Service.NOVA])
@validation.add("required_platform", platform="openstack", admin=True)
@scenario.configure(context={"cleanup@openstack": ["neutron", "nova"], "keypair@openstack": {},
"allow_ssh@openstack": None},
name="BrowbeatPlugin.create_provider_net_nova_boot_ping", platform="openstack")
class CreateProviderNetNovaBootPing(vm_utils.VMScenario,
neutron_utils.NeutronScenario):
def run(self, image, flavor, provider_phys_net, iface_name, iface_mac,
num_vms=1, router_create_args=None,
network_create_args=None, subnet_create_args=None, **kwargs):
network = self._create_network(provider_phys_net)
subnet = self._create_subnet(network, subnet_create_args or {})
kwargs["nics"] = [{'net-id': network['network']['id']}]
server = self._boot_server(image, flavor, **kwargs)
# ping server
internal_network = list(server.networks)[0]
server_ip = server.addresses[internal_network][0]["addr"]
server_mac = server.addresses[internal_network][0]["OS-EXT-IPS-MAC:mac_addr"]
gateway = subnet['subnet']['gateway_ip']
vlan = network['network']['provider:segmentation_id']
dir_path = os.path.dirname(os.path.realpath(__file__))
file_path = os.path.join(dir_path, "scapy_icmp.py")
cmd = ["sudo", file_path, server_ip, server_mac, gateway, iface_mac, iface_name, str(vlan)]
proc = subprocess.Popen(cmd)
proc.wait()
if proc.returncode == 0:
LOG.info("Ping to {} is succesful".format(server_ip))
else:
LOG.info("Ping to {} is failed".format(server_ip))
@atomic.action_timer("neutron.create_network")
def _create_network(self, provider_phys_net):
"""Create neutron provider network.
:param provider_phys_net: provider physical network
:returns: neutron network dict
"""
project_id = self.context["tenant"]["id"]
body = {
"name": self.generate_random_name(),
"tenant_id": project_id,
"provider:network_type": "vlan",
"provider:physical_network": provider_phys_net
}
# provider network can be created by admin client only
return self.admin_clients("neutron").create_network({"network": body})