Asma Syed Hameed 76bff93a95 Dynamic workloads: for Provider Network
This patch add support for dynamic workloads for
provider network.
1. provider_netcreate_nova_boot_ping: Creates a
   provider network and boot VM and ping
2. provider_net_nova_boot_ping:  Boot a VM on a
   existing provider network and ping
3. provider_net_nova_delete: Deletes All VM's on
   a provider network and then the network

It also install scapy on the undercloud

Change-Id: Id700c3bcde400398909c8ca9cfd2dd1451b8eb26
2021-08-18 12:45:33 +05:30

65 lines
2.2 KiB
Python
Executable File

#!/usr/bin/python3
# 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 sys
import time
from scapy.all import srp
from scapy.all import Ether
from scapy.all import ARP
from scapy.all import sendp
from scapy.all import Dot1Q
from scapy.all import IP
from scapy.all import ICMP
LOG = logging.getLogger(__name__)
def _send_icmp(dst_ip, dst_mac, src_ip, src_mac, iface, vlan):
# send 1 icmp packet so that dest VM can send ARP packet to resolve gateway
sendp(Ether(dst=dst_mac, src=src_mac)/Dot1Q(vlan=int(vlan))/IP(dst=dst_ip)/ICMP(),
iface=iface, verbose=0)
bcast = "ff:ff:ff:ff:ff:ff"
# Send GARP using ARP reply method
sendp(Ether(dst=bcast,src=src_mac)/Dot1Q(vlan=int(vlan))/ARP(
op=2,psrc=src_ip, hwsrc=src_mac, hwdst=src_mac, pdst=src_ip), iface=iface, verbose=0)
# send ICMP and validate reply
ans, unans = srp(Ether(dst=dst_mac, src=src_mac)/Dot1Q(vlan=int(vlan))/IP(dst=dst_ip)/ICMP(),
iface=iface, timeout=5, verbose=0)
if (str(ans).find('ICMP:0') == -1):
for snd, rcv in ans:
if (rcv.summary().find(dst_ip) != -1):
LOG.info("Ping to {} is succesful".format(dst_ip))
return True
return False
def main(args):
dst_ip, dst_mac, src_ip, src_mac, iface, vlan = args[1:]
attempts = 0
max_attempts = 120
while attempts < max_attempts:
if _send_icmp(dst_ip, dst_mac, src_ip, src_mac, iface, vlan):
LOG.info("Ping to {} is succesful".format(dst_ip))
return 0
LOG.info("Ping to {} is failed, attempt {}".format(dst_ip, attempts))
attempts += 1
time.sleep(5)
return 1
if __name__ == "__main__":
main(sys.argv)