diff options
author | 2016-07-03 22:26:27 +0000 | |
---|---|---|
committer | 2016-07-03 22:26:27 +0000 | |
commit | 7388d059ff9f4efed594582ded843f795e56c9fa (patch) | |
tree | 4932c5a59be98bfc4e5fb0f023151b81a214160a | |
parent | e66294697125184c16b37a8884ad4673724ea27d (diff) | |
parent | 2df23034b2b8da421ba028e8ee477b58ff1ef8ca (diff) |
Merge "ONOS sfc scripts"
-rw-r--r-- | testcases/Controllers/ONOS/Sfc/README.md | 21 | ||||
-rw-r--r-- | testcases/Controllers/ONOS/Sfc/Sfc.py | 210 | ||||
-rw-r--r-- | testcases/Controllers/ONOS/Sfc/Sfc_fun.py | 812 |
3 files changed, 1043 insertions, 0 deletions
diff --git a/testcases/Controllers/ONOS/Sfc/README.md b/testcases/Controllers/ONOS/Sfc/README.md new file mode 100644 index 00000000..ae63ee21 --- /dev/null +++ b/testcases/Controllers/ONOS/Sfc/README.md @@ -0,0 +1,21 @@ +SFC Script ReadMe File +********************** + +Topology +--------- + +Validated with the Fuel Enviroment. + + +Things to Remember : +-------------------- + +1] This Script basically Tests the SFC functionality with ONOS controller. +2] Ip address of Openstack and ONOS are got dynamically. +3] Initally this sfc script can be used for ONOS and on Request , if need will modify for other controllers. + + +Contact Details : +----------------- + +email-id : antonysilvester@gmail.com diff --git a/testcases/Controllers/ONOS/Sfc/Sfc.py b/testcases/Controllers/ONOS/Sfc/Sfc.py new file mode 100644 index 00000000..94b24e68 --- /dev/null +++ b/testcases/Controllers/ONOS/Sfc/Sfc.py @@ -0,0 +1,210 @@ +"""Script to Test the SFC scenarios in ONOS.""" +# !/usr/bin/python +# +# Copyright (c) 2015 All rights reserved +# This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# ########################################################################### +# OPNFV SFC Script +# **** Scripted by Antony Silvester - antony.silvester@huawei.com ****** +# ########################################################################### + +# Testcase 1 : Prerequisites configuration for SFC +# Testcase 2 : Creation of 3 VNF Nodes and Attaching Ports +# TestCase 3 : Configure SFC [Port pair,Port Group ,Flow classifer +# TestCase 4 : Configure Port Chain and verify the flows are added. +# TestCase 5 : Verify traffic with VNF node. +# TestCase 6 : Verify the Service Chain Statistics +# TestCase 7 : Remove the Port Chain and Verify the traffic. +# Testcase 8 : Cleanup +# ########################################################################### +# +import functest.utils.functest_logger as ft_logger +from Sfc_fun import Sfc_fun + + +class Sfc: + """Script to Test the SFC scenarios in ONOS.""" + logger = ft_logger.Logger("sfc").getLogger() + Sfc_obj = Sfc_fun() + print("################################################################") + print(" OPNFV SFC Script ") + print("################################################################") + logger.info("Testcase 1 : Prerequisites configuration for SFC") + ######################################################################### + logger.info("\t1.1 Creation of Auth-Token") + if (Sfc_obj.getToken() == 200): + logger.info("\t\tCreation of Token is successfull") + else: + logger.error("\t\t : Creation of Token is NOT successfull") + ######################################################################### + logger.info("\t1.2 Creation of Network") + if (Sfc_obj.createNetworks() == 201): + logger.info("\t\tCreation of network is successfull") + else: + logger.error("\t\t : Creation of network is NOT successfull") + ######################################################################### + logger.info("\t1.3 Creation of Subnetwork") + if (Sfc_obj.createSubnets() == 201): + logger.info("\t\tCreation of Subnetwork is successfull") + else: + logger.error("\t\t : Creation of Subnetwork is NOT successfull") + print ("\n###########################################################\n") + ######################################################################## + logger.info("Testcase 2 : Creation of 3 VNF Nodes and Attaching Ports") + ######################################################################### + logger.info("\t2.1 Creation of Ports") + if (Sfc_obj.createPorts() == 201): + logger.info("\t\tCreation of Port is successfull") + else: + logger.error("\t\t : Creation of Port is NOT successfull") + ######################################################################### + logger.info("\t2.2 Creation of VM-Compute-Node") + if (Sfc_obj.createVm() == 202): + logger.info("\t\tCreation of VM is successfull") + else: + logger.error("\t\t : Creation of VM is NOT successfull") + ######################################################################### + logger.info("\t2.3 Check VM Status") + if (Sfc_obj.checkVmState() == 200): + logger.info("\t\tVM are in active state") + else: + logger.error("\t\t : VM is NOT Active") + ######################################################################### + logger.info("\t\t2.4 Router Creation") + if (Sfc_obj.createRouter() == 201): + logger.info("\t\t Router Creation is Successful") + else: + logger.error("\t\t : Router Creation is NOT Successful") + ######################################################################### + logger.info("\t\t2.5 Attachement of Interface to VM") + if (Sfc_obj.attachInterface() == 200): + logger.info("\t\t Interface attached to VM") + else: + logger.error("\t\t : Interface NOT attached to VM") + ######################################################################### + logger.info("\t\t2.6 Attachement of FLoating Ip to VM") + if (Sfc_obj.addFloatingIp() == 202): + logger.info("\t\t Floating Ip attached to VM SUccessful") + else: + logger.error("\t\t : Floating Ip NOT attached to VM ") + print ("\n###########################################################\n") + ######################################################################## + logger.info("TestCase 3 : Configure SFC [Portair,PortGroup,\ + Flow classifer") + ######################################################################### + logger.info("\t3.1 Creation of Port Pair") + if (Sfc_obj.createPortPair() == 201): + logger.info("\t\tCreation of Port pair is successful") + else: + logger.error("\t\t : Creation of Port pair is NOT successful") + + ######################################################################### + logger.info("\t3.2 Getting the Port Pair ID") + if (Sfc_obj.getPortPair() == 200): + logger.info("\t\tSuccessfully got Port Pair ID") + else: + logger.error("\t\t : UnSuccessfully got Port Pair ID") + + ######################################################################### + logger.info("\t3.3 Creation of Port Pair Group") + if (Sfc_obj.createPortGroup() == 201): + logger.info("\t\tPort Pair Group successfully Created") + else: + logger.error("\t\t : Port Pair Group NOT successfully Created") + + ######################################################################### + logger.info("\t3.4 Getting Port Pair Group ID ") + + if (Sfc_obj.getPortGroup() == 200): + logger.info("\t\tPort Pair Group ID successfully received") + else: + logger.error("\t\t : Port Pair Group ID NOT successfully received") + + ######################################################################### + logger.info("\t3.5 Creation of Flow Classifier") + if (Sfc_obj.createFlowClassifier() == 201): + logger.info("\t\tFlow Classifier successfully Created") + else: + logger.error("\t\t : Flow Classifier NOT successfully Created") + print ("\n###########################################################\n") + ######################################################################## + logger.info("TestCase 4 : Configure Port Chain and verify the flows are\ + added.") + ######################################################################### + logger.info("\t4.1 Creation of PortChain") + if (Sfc_obj.createPortChain() == 201): + logger.info("\t\tPortChain successfully Created") + else: + logger.error("\t\tPortChain NOT successfully Created") + ######################################################################### + logger.info("\t4.2 Verification of Flows Installed in OVS") + if (Sfc_obj.checkFlowAdded() == 200): + logger.info("\t\tFlows Installed successfully ") + else: + logger.error("\t\t : Flows NOT Installed successfully") + + if (Sfc_obj.portChainDeviceMap() == 200): + logger.info("\t\t portChainDeviceMap successfully ") + else: + logger.error("\t\t:portChainDeviceMap NOT Installed successfully") + + if (Sfc_obj.portChainSfMap() == 200): + logger.info("\t\tportChainSfMap successfully ") + else: + logger.error("\t\t : portChainSfMap NOT Installed successfully") + print ("\n############################################################n") + ######################################################################## + logger.info("\tTestCase 5 : Verify traffic with VNF node.") + if (Sfc_obj.loginToVM() == "1"): + logger.info("\t\tSFC function Working") + else: + logger.error("\t\t : SFC function not working") + print ("\n###########################################################\n") + logger.info("TestCase 6 : Verify the Service Chain Statistics") + if (Sfc_obj.portChainDeviceMap() == 200): + logger.info("\t\tportChainDeviceMap successfully ") + else: + logger.error("\t\t:portChainDeviceMap NOT Installed successfully") + + if (Sfc_obj.portChainSfMap() == 200): + logger.info("\t\tportChainSfMap successfully ") + else: + logger.error("\t\t : portChainSfMap NOT Installed successfully") + print ("\n##########################################################\n") + logger.info("TestCase 7 : Remove the Port Chain and Verify the traffic") + if (Sfc_obj.deletePortChain() == 204): + if (Sfc_obj.loginToVM() == "0"): + logger.info("\t\tSFC function is removed Successfully") + else: + logger.error("\t\t:SFC function not Removed.Have some problem") + if (Sfc_obj.deleteFlowClassifier() == 204): + if (Sfc_obj.deletePortGroup() == 204): + if (Sfc_obj.deletePortPair() == 204): + logger.info("\t\tSFC configuration is deleted \ + successfully") + else: + logger.error("\t\t : Port pair configuration is NOT\ + deleted successfully") + else: + logger.error("\t\t : Port Group configuration is NOT \ + deleted successfully") + else: + logger.error("\t\t : Flow classifier configuration is NOT \ + deleted successfully") + else: + logger.error("\t\t:PortChain configuration is NOT deleted \ + successfully") + print ("\n###########################################################n") + ####################################################################### + logger.info("Testcase 8 : Cleanup") + if (Sfc_obj.cleanup() == 204): + logger.info("\t\tCleanUp is successfull") + else: + logger.error("\t\t : CleanUp is NOT successfull") + print ("###############################################################") + print("############################END OF SCRIPT ######################") diff --git a/testcases/Controllers/ONOS/Sfc/Sfc_fun.py b/testcases/Controllers/ONOS/Sfc/Sfc_fun.py new file mode 100644 index 00000000..6090e886 --- /dev/null +++ b/testcases/Controllers/ONOS/Sfc/Sfc_fun.py @@ -0,0 +1,812 @@ +"""SFC functions.""" +import functest.utils.functest_logger as ft_logger +import json +from multiprocessing import Process +from multiprocessing import Queue +from pexpect import pxssh +import re +import requests +import time + + +class Sfc_fun: + """Defines all the def function of SFC.""" + + def __init__(self): + """Initialization of variables.""" + self.logger = ft_logger.Logger("sfc_fun_log").getLogger() + self.osver = "v2.0" + self.token_id = 0 + self.net_id = 0 + self.image_id = 0 + self.os_hostname = 'openstack_ip' + self.onos_hostname = 'onos_ip' + # Network variables ####### + self.netname = "test_nw" + self.admin_state_up = True + self.tenant_id = 0 + self.subnetId = 0 + # ######################### + # SubNet variables######### + self.ip_version = 4 + self.cidr = "20.20.20.0/24" + self.subnetname = "test_nw_subnets" + # ############################### + # Port variable + self.port = "port" + self.port_num = [] + self.vm_id = 0 + self.port_ip = [] + self.count = 0 + self.i = 0 + self.numTerms = 3 + self.security_groups = [] + self.port_security_enabled = False + # ############################### + # VM creation variable + self.container_format = "bare" + self.disk_format = "qcow2" + self.imagename = "TestSfcVm" + self.createImage = "/home/root1/devstack/files/images/\ + firewall_block_image.img" + + self.vm_name = "vm" + self.imageRef = "test" + self.flavorRef = "1" + self.max_count = "1" + self.min_count = "1" + self.org_nw_port = [] + self.image_id = 0 + self.routername = "router1" + self.router_id = 0 + # ##################################### + # Port pair + self.port_pair_ingress = 0 + self.port_pair_egress = 0 + self.port_pair_name = "PP" + self.port_pair_id = [] + # #################################### + # Port Group + self.port_group_name = "PG" + self.port_grp_id = [] + # #################################### + # FlowClassifier + self.source_ip_prefix = "20.20.20.0/24" + self.destination_ip_prefix = "20.20.20.0/24" + self.logical_source_port = 0 + self.fcname = "FC" + self.ethertype = "IPv4" + # ##################################### + self.flow_class_if = 0 + # ##################################### + # Port Chain variables + self.pcname = 'PC' + self.PC_id = 0 + # ##################################### + # Port Chain variables + self.flowadd = '' + # ##################################### + self.ip_pool = 0 + self.vm_public_ip = [] + self.vm_public_id = [] + self.net_id1 = 0 + self.vm = [] + self.address = 0 + self.value = 0 + self.pub_net_id = 0 + + def getToken(self): + """Get the keystone token value from Openstack .""" + url = 'http://'+self.os_hostname+':5000/'+self.osver+'/tokens' + data = '{"auth": {"tenantName": "admin", "passwordCredentials":\ + { "username": "admin", "password": "admin"}}}' + headers = {"Accept": "application/json"} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 200): + json1_data = json.loads(response.content) + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.debug(json1_data) + self.token_id = json1_data['access']['token']['id'] + self.tenant_id = json1_data['access']['token']['tenant']['id'] + return(response.status_code) + else: + return(response.status_code) + + def createNetworks(self): + """Creation of networks.""" + Dicdata = {} + if self.netname != '': + Dicdata['name'] = self.netname + if self.admin_state_up != '': + Dicdata['admin_state_up'] = self.admin_state_up + Dicdata = {'network': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver+'/networks' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 201): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.net_id = json1_data['network']['id'] + return(response.status_code) + else: + return(response.status_code) + + def createSubnets(self): + """Creation of SubNets.""" + Dicdata = {} + if self.net_id != 0: + Dicdata['network_id'] = self.net_id + if self.ip_version != '': + Dicdata['ip_version'] = self.ip_version + if self.cidr != '': + Dicdata['cidr'] = self.cidr + if self.subnetname != '': + Dicdata['name'] = self.subnetname + + Dicdata = {'subnet': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver+'/subnets' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + + if (response.status_code == 201): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.subnetId = json1_data['subnet']['id'] + return(response.status_code) + else: + return(response.status_code) + + def createPorts(self): + """Creation of Ports.""" + for x in range(self.i, self.numTerms): + Dicdata = {} + if self.net_id != '': + Dicdata['network_id'] = self.net_id + if self.port != '': + Dicdata['name'] = "port"+str(x) + if self.admin_state_up != '': + Dicdata['admin_state_up'] = self.admin_state_up + if self.security_groups != '': + Dicdata['security_groups'] = self.security_groups + if self.port_security_enabled != '': + Dicdata['port_security_enabled'] = self.port_security_enabled + + Dicdata = {'port': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver+'/ports' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + + if (response.status_code == 201): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.port_num.append(json1_data['port']['id']) + self.port_ip.append(json1_data['port']['fixed_ips'][0] + ['ip_address']) + else: + return(response.status_code) + return(response.status_code) + + def createVm(self): + """Creation of Instance, using firewall image.""" + url = 'http://'+self.os_hostname+':9292/v2/images?name=TestSfcVm' + headers = {"Accept": "application/json", "Content-Type": "application/\ + octet-stream", "X-Auth-Token": self.token_id} + response = requests.get(url, headers=headers) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tFireWall Image is available") + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.image_id = json1_data['images'][0]['id'] + else: + return(response.status_code) + + for y in range(0, 3): + Dicdata = {} + org_nw_port = [] + org_nw_port.append({'port': self.port_num[y]}) + if self.vm_name != '': + Dicdata['name'] = "vm"+str(y) + if self.imageRef != '': + Dicdata['imageRef'] = self.image_id + if self.flavorRef != '': + Dicdata['flavorRef'] = self.flavorRef + if self.max_count != '': + Dicdata['max_count'] = self.max_count + if self.min_count != '': + Dicdata['min_count'] = self.min_count + if self.org_nw_port != '': + Dicdata['networks'] = org_nw_port + Dicdata = {'server': Dicdata} + data = json.dumps(Dicdata, indent=4) + + url = 'http://'+self.os_hostname+':8774/v2.1/'+self.tenant_id + \ + '/servers' + headers = {"Accept": "application/json", "Content-Type": + "application/json", "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 202): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tCreation of VM is successfull") + + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.vm_id = json1_data['server']['id'] + self.vm.append(json1_data['server']['id']) + else: + return(response.status_code) + + return(response.status_code) + + def checkVmState(self): + """Checking the Status of the Instance.""" + time.sleep(10) + for y in range(0, 3): + url = 'http://'+self.os_hostname + \ + ':8774/v2.1/servers/detail?name=vm'+str(y) + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.get(url, headers=headers) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.vm_active = json1_data['servers'][0]['status'] + if (self.vm_active == "ACTIVE"): + print ("\t\t\t\t\t\tVM"+str(y)+" is Active : " + + self.vm_active) + else: + print ("\t\t\t\t\t\tVM"+str(y)+" is NOT Active : " + + self.vm_active) + else: + return(response.status_code) + return(response.status_code) + time.sleep(10) + + def createPortPair(self): + """Creation of Port Pair.""" + for p in range(1, 2): + Dicdata = {} + if self.port_pair_ingress != '': + Dicdata['ingress'] = self.port_num[p] + if self.port_pair_egress != '': + egress = p + Dicdata['egress'] = self.port_num[egress] + if self.port_pair_name != '': + Dicdata['name'] = "PP"+str(p) + + Dicdata = {'port_pair': Dicdata} + data = json.dumps(Dicdata, indent=4) + + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_pairs' + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 201): + print ("\t\t\t\tCreation of Port Pair PP"+str(p) + + "is successful") + else: + return(response.status_code) + + return(response.status_code) + + def getPortPair(self): + """Query the Portpair id value.""" + for p in range(0, 1): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_pairs?name=PP1' + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.get(url, headers=headers) + + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.port_pair_id.append(json1_data['port_pairs'][0]['id']) + else: + return(response.status_code) + return(response.status_code) + + def createPortGroup(self): + """Creation of PortGroup.""" + for p in range(0, 1): + Dicdata = {} + port_pair_list = [] + port_pair_list.append(self.port_pair_id[p]) + if self.port_group_name != '': + Dicdata['name'] = "PG"+str(p) + if self.port_pair_id != '': + Dicdata['port_pairs'] = port_pair_list + + Dicdata = {'port_pair_group': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_pair_groups' + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 201): + print ("\t\t\t\tCreation of Port Group PG"+str(p) + + "is successful") + else: + return(response.status_code) + + return(response.status_code) + + def getPortGroup(self): + """Query the PortGroup id.""" + for p in range(0, 1): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_pair_groups?name=PG'+str(p) + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.get(url, headers=headers) + + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + json1_data = json.loads(response.content) + self.port_grp_id.append(json1_data['port_pair_groups'] + [0]['id']) + else: + return(response.status_code) + return(response.status_code) + + def createFlowClassifier(self): + """Creation of Flow Classifier.""" + Dicdata = {} + if self.source_ip_prefix != '': + Dicdata['source_ip_prefix'] = self.source_ip_prefix + if self.destination_ip_prefix != '': + Dicdata['destination_ip_prefix'] = self.destination_ip_prefix + if self.logical_source_port != '': + Dicdata['logical_source_port'] = self.port_num[0] + if self.fcname != '': + Dicdata['name'] = "FC1" + if self.ethertype != '': + Dicdata['ethertype'] = self.ethertype + + Dicdata = {'flow_classifier': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/flow_classifiers' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 201): + json1_data = json.loads(response.content) + self.flow_class_if = json1_data['flow_classifier']['id'] + self.logger.info("\tCreation of Flow Classifier is successful") + return(response.status_code) + else: + return(response.status_code) + + def createPortChain(self): + """Creation of PortChain.""" + Dicdata = {} + flow_class_list = [] + flow_class_list.append(self.flow_class_if) + port_pair_groups_list = [] + port_pair_groups_list.append(self.port_grp_id[0]) + + if flow_class_list != '': + Dicdata['flow_classifiers'] = flow_class_list + if self.pcname != '': + Dicdata['name'] = "PC1" + if port_pair_groups_list != '': + Dicdata['port_pair_groups'] = port_pair_groups_list + + Dicdata = {'port_chain': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_chains' + headers = {"Accept": "application/json", + "Content-Type": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 201): + self.logger.info("\tCreation of PORT CHAIN is successful") + json1_data = json.loads(response.content) + self.PC_id = json1_data['port_chain']['id'] + return(response.status_code) + else: + return(response.status_code) + + def checkFlowAdded(self): + """Check whether the Flows are downloaded successfully.""" + time.sleep(5) + response = requests.get('http://' + self.onos_hostname + + ':8181/onos/v1/flows', + auth=("karaf", "karaf")) + if (response.status_code == 200): + self.logger.info("\tFlow is successfully Queries") + json1_data = json.loads(response.content) + self.flowadd = json1_data['flows'][0]['state'] + + if (self.flowadd == "ADDED"): + self.logger.info("\tFlow is successfully added to OVS") + return(response.status_code) + else: + return(404) + else: + return(response.status_code) +#################################################################### + + def createRouter(self): + """Creation of Router.""" + Dicdata = {} + if self.routername != '': + Dicdata['name'] = "router1" + if self.admin_state_up != '': + Dicdata['admin_state_up'] = self.admin_state_up + + Dicdata = {'router': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver+'/routers.json' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 201): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tCreation of Router is successfull") + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.router_id = json1_data['router']['id'] + return(response.status_code) + else: + return(response.status_code) + + def attachInterface(self): + """Attachment of instance ports to the Router.""" + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/networks?name=admin_floating_net' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.get(url, headers=headers) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.net_name = json1_data['networks'][0]['name'] + if (self.net_name == "admin_floating_net"): + self.pub_net_id = json1_data['networks'][0]['id'] + else: + return(response.status_code) + ############################################################ + + self.logger.info("\tAttachment of Instance interface to Router") + Dicdata = {} + if self.subnetId != '': + Dicdata['subnet_id'] = self.subnetId + + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/routers/'+self.router_id+'/add_router_interface' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.put(url, headers=headers, data=data) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tInterface attached successfull") + else: + return(response.status_code) + ############################################################ + self.logger.info("\tAttachment of Gateway to Router") + + Dicdata1 = {} + if self.pub_net_id != 0: + Dicdata1['network_id'] = self.pub_net_id + + Dicdata1 = {'external_gateway_info': Dicdata1} + Dicdata1 = {'router': Dicdata1} + data = json.dumps(Dicdata1, indent=4) + url = 'http://' + self.os_hostname+':9696/'+self.osver + \ + '/routers/' + self.router_id + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.put(url, headers=headers, data=data) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tGateway Interface attached successfull") + return(response.status_code) + else: + return(response.status_code) + + def addFloatingIp(self): + """Attachment of Floating Ip to the Router.""" + for ip_num in range(0, 2): + Dicdata = {} + if self.ip_pool != '': + Dicdata['pool'] = "" + + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':8774/v2.1/os-floating-ips' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tFloating ip created successfully") + json1_data = json.loads(response.content) + self.logger.debug(json1_data) + self.vm_public_ip.append(json1_data['floating_ip']['ip']) + self.vm_public_id.append(json1_data['floating_ip']['id']) + else: + self.logger.error("\tFloating ip NOT created successfully") + + Dicdata1 = {} + if self.address != '': + Dicdata1['address'] = self.vm_public_ip[ip_num] + + Dicdata1 = {'addFloatingIp': Dicdata1} + data = json.dumps(Dicdata1, indent=4) + url = 'http://'+self.os_hostname + \ + ':8774/v2.1/servers/'+self.vm[ip_num]+'/action' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.post(url, headers=headers, data=data) + if(response.status_code == 202): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + self.logger.info("\tPublic Ip successfully added to VM") + else: + return(response.status_code) + return(response.status_code) + + def loginToVM(self): + """Login to the VM to check NSH packets are received.""" + queue1 = "0" + + def vm0(): + + s = pxssh.pxssh() + hostname = self.vm_public_ip[0] + username = "cirros" + password = "cubswin:)" + s.login(hostname, username, password) + s.sendline("ping -c 5 "+str(self.port_ip[2])) + s.prompt() # match the prompt + + ping_re = re.search("transmitted.*received", s.before).group() + x = re.split('\s+', ping_re) + if (x[1] >= "1"): + self.logger.info("\tPing is Successfull") + else: + self.logger.info("\tPing is NOT Successfull") + + def vm1(queue1): + s = pxssh.pxssh() + hostname = self.vm_public_ip[1] + username = "cirros" + password = "cubswin:)" + s.login(hostname, username, password) + s.sendline('sudo ./firewall') + s.prompt() + output_pack = s.before + + if(output_pack.find("nshc") != -1): + self.logger.info("\tThe packet has reached VM2 Instance") + queue1.put("1") + else: + self.logger.info("\tPacket not received in Instance") + queue1.put("0") + + if (self.value == 0): + time.sleep(10) + queue1 = Queue() + p1 = Process(target=vm1, args=(queue1, )) + p1.start() + p2 = Process(target=vm0) + p2.start() + p1.join(10) + return (queue1.get()) + else: + print("Thread didnt run") + + """##################################################################""" + """ ######################## Stats Functions ################# #####""" + def portChainDeviceMap(self): + """Check the PC Device Stats in the ONOS.""" + response = requests.get('http://' + self.onos_hostname + + ':8181/onos/vtn/portChainDeviceMap/' + + self.PC_id, auth=("karaf", "karaf")) + if (response.status_code == 200): + self.logger.info("\tPortChainDeviceMap is successfully Queries") + return(response.status_code) + else: + return(response.status_code) + + def portChainSfMap(self): + """Check the PC SF Map Stats in the ONOS.""" + response = requests.get('http://'+self.onos_hostname + + ':8181/onos/vtn/portChainSfMap/' + + self.PC_id, auth=("karaf", "karaf")) + if (response.status_code == 200): + self.logger.info("\tportChainSfMap is successfully Queries") + return(response.status_code) + else: + return(response.status_code) + + """###################################################################""" + + def deletePortChain(self): + """Deletion of PortChain.""" + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_chains/'+self.PC_id + headers = {"Accept": "application/json", "Content-Type": + "application/json", "X-Auth-Token": self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + return(response.status_code) + else: + return(response.status_code) + + def deleteFlowClassifier(self): + """Deletion of Flow Classifier.""" + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/flow_classifiers/'+self.flow_class_if + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + return(response.status_code) + else: + return(response.status_code) + + def deletePortGroup(self): + """Deletion of PortGroup.""" + for p in range(0, 1): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_pair_groups/'+self.port_grp_id[p] + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + print ("\n\t\tPort " + self.port_grp_id[p] + "Deleted") + else: + return(response.status_code) + return(response.status_code) + + def deletePortPair(self): + """Deletion of Portpair.""" + for p in range(1, 2): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/sfc/port_pairs/'+self.port_pair_id[0] + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + else: + return(response.status_code) + return(response.status_code) + + def cleanup(self): + """Cleanup.""" + print ("\n\t\tDeleting the VMs") + for y in range(0, 3): + url = 'http://'+self.os_hostname+':8774/v2.1/servers/'+self.vm[y] + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + print ("\n\t\tVM"+str(y)+" is Deleted : ") + time.sleep(10) + else: + return(response.status_code) + print ("\n\t\tDeletion of Ports") + for x in range(self.i, self.numTerms): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/ports/'+self.port_num[x] + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.delete(url, headers=headers) + + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + print ("\n\t\tPort" + str(x) + " Deleted") + else: + return(response.status_code) + print ("\n\t\tDeleting Router") + + Dicdata = {} + Dicdata['external_gateway_info'] = {} + Dicdata = {'router': Dicdata} + data = json.dumps(Dicdata, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/routers/'+self.router_id + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.put(url, headers=headers, data=data) + if (response.status_code == 200): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + Dicdata1 = {} + if self.subnetId != '': + Dicdata1['subnet_id'] = self.subnetId + data = json.dumps(Dicdata1, indent=4) + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/routers/'+self.router_id + \ + '/remove_router_interface.json' + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.put(url, headers=headers, data=data) + if (response.status_code == 200): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/routers/'+self.router_id + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + print ("\n\t\tDeletion of Router is successfull") + else: + return(response.status_code) + else: + return(response.status_code) + else: + return(response.status_code) + + print ("\n\t\tDeletion of Network") + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/networks/'+self.net_id + headers = {"Accept": "application/json", + "X-Auth-Token": self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + print ("\n\t\tNetwork deleted Successfully") + else: + return(response.status_code) + + print ("\n\t\t Deletion of Floating ip") + for ip_num in range(0, 2): + url = 'http://'+self.os_hostname+':9696/'+self.osver + \ + '/floatingips/'+self.vm_public_id[ip_num] + headers = {"Accept": "application/json", "X-Auth-Token": + self.token_id} + response = requests.delete(url, headers=headers) + if (response.status_code == 204): + self.logger.debug(response.status_code) + self.logger.debug(response.content) + else: + return(response.status_code) + return(response.status_code) |