qvlans: Fix creating qvlans

Make it look more like macvlans, including logic to set IP addresses,
and to verify qvlans were created properly.

Signed-off-by: Ben Greear <greearb@candelatech.com>
This commit is contained in:
Ben Greear
2022-01-31 20:40:07 -08:00
committed by shivam
parent 6a441884c3
commit 531cf440af
3 changed files with 58 additions and 10 deletions

View File

@@ -729,9 +729,11 @@ def wait_until_ports_appear(base_url="http://localhost:8080", port_list=(), debu
resource_id = eid[1] resource_id = eid[1]
port_name = eid[2] port_name = eid[2]
uri = "%s/%s/%s" % (port_url, resource_id, port_name) uri = "%s/%s/%s" % (port_url, resource_id, port_name)
#print("port-eid: %s uri: %s" % (port_eid, uri))
lf_r = LFRequest.LFRequest(base_url, uri, debug_=debug) lf_r = LFRequest.LFRequest(base_url, uri, debug_=debug)
json_response = lf_r.get_as_json() json_response = lf_r.get_as_json()
if json_response is not None: if json_response is not None:
#pprint.pprint(json_response)
if not json_response['interface']['phantom']: if not json_response['interface']['phantom']:
found_stations.add("%s.%s.%s" % (shelf, resource_id, port_name)) found_stations.add("%s.%s.%s" % (shelf, resource_id, port_name))
else: else:

View File

@@ -115,8 +115,8 @@ class QVLANProfile(LFCliBase):
else: else:
raise ValueError("Unknown param name: " + param_name) raise ValueError("Unknown param name: " + param_name)
def create(self, sleep_time=1): def create(self, debug=False, sleep_time=1):
print("Creating qvlans...") print("Creating 802.1q Vlans...")
req_url = "/cli-json/add_vlan" req_url = "/cli-json/add_vlan"
if not self.dhcp and self.first_ip_addr and self.netmask and self.gateway: if not self.dhcp and self.first_ip_addr and self.netmask and self.gateway:
@@ -137,20 +137,38 @@ class QVLANProfile(LFCliBase):
set_port.set_port_interest_flags) set_port.set_port_interest_flags)
set_port_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_port") set_port_r = LFRequest.LFRequest(self.lfclient_url + "/cli-json/set_port")
qv_parent_bare = self.local_realm.name_to_eid(self.qvlan_parent)[2];
for i in range(len(self.desired_qvlans)): for i in range(len(self.desired_qvlans)):
data = { data = {
"shelf": self.shelf, "shelf": self.shelf,
"resource": self.resource, "resource": self.resource,
"port": self.local_realm.name_to_eid(self.qvlan_parent)[2], "port": qv_parent_bare,
"vid": i + 1 "vid": i + 1
} }
self.created_qvlans.append("%s.%s.%s#%d" % (self.shelf, self.resource, self.created_qvlans.append("%s.%s.%s.%d" % (self.shelf, self.resource,
self.qvlan_parent, int(self.desired_qvlans[i][self.desired_qvlans[i].index('#') + 1:]))) qv_parent_bare, i + 1))
self.local_realm.json_post(req_url, data) self.local_realm.json_post(req_url, data)
time.sleep(sleep_time) time.sleep(sleep_time)
if not LFUtils.wait_until_ports_appear(base_url=self.lfclient_url, port_list=self.created_qvlans, debug=debug):
return False
print(self.created_qvlans) print(self.created_qvlans)
for i in range(len(self.created_qvlans)):
eid = self.local_realm.name_to_eid(self.created_qvlans[i])
name = eid[2]
self.set_port_data["port"] = name # for set_port calls.
if not self.dhcp and self.first_ip_addr and self.netmask and self.gateway:
self.set_port_data["ip_addr"] = self.ip_list[i]
self.set_port_data["netmask"] = self.netmask
self.set_port_data["gateway"] = self.gateway
set_port_r.addPostData(self.set_port_data)
set_port_r.jsonPost(debug)
time.sleep(sleep_time)
return True
def cleanup(self): def cleanup(self):
print("Cleaning up qvlans...") print("Cleaning up qvlans...")
print(self.created_qvlans) print(self.created_qvlans)

View File

@@ -3,9 +3,12 @@ import sys
import os import os
import importlib import importlib
import argparse import argparse
import logging
logger = logging.getLogger(__name__)
if sys.version_info[0] != 3: if sys.version_info[0] != 3:
print("This script requires Python 3") logger.critical("This script requires Python 3")
exit(1) exit(1)
@@ -17,6 +20,7 @@ LFUtils = importlib.import_module("py-json.LANforge.LFUtils")
add_file_endp = importlib.import_module("py-json.LANforge.add_file_endp") add_file_endp = importlib.import_module("py-json.LANforge.add_file_endp")
realm = importlib.import_module("py-json.realm") realm = importlib.import_module("py-json.realm")
Realm = realm.Realm Realm = realm.Realm
lf_logger_config = importlib.import_module("py-scripts.lf_logger_config")
class CreateQVlan(Realm): class CreateQVlan(Realm):
@@ -57,9 +61,14 @@ class CreateQVlan(Realm):
self.qvlan_profile.dhcp = dhcp self.qvlan_profile.dhcp = dhcp
def build(self): def build(self):
print("Creating QVLAN stations") logger.info("Creating QVLAN stations")
self.qvlan_profile.create( if self.qvlan_profile.create(
sleep_time=.5) debug=self.debug,
sleep_time=0,
):
self._pass("802.1q VLAN creation successful.")
else:
self._fail("802.1q VLAN creation failed.")
def main(): def main():
@@ -118,8 +127,20 @@ def main():
action='store_true', action='store_true',
default=False) default=False)
# TODO: Use lfcli_base for common arguments.
parser.add_argument('--log_level',
default=None,
help='Set logging level: debug | info | warning | error | critical')
parser.add_argument('--lf_logger_config_json',
help="--lf_logger_config_json <json file> , json configuration of logger")
args = parser.parse_args() args = parser.parse_args()
logger_config = lf_logger_config.lf_logger_config()
# set the logger level to requested value
logger_config.set_level(level=args.log_level)
logger_config.set_json(json_file=args.lf_logger_config_json)
update_group_args = { update_group_args = {
"name": None, "name": None,
"action": None, "action": None,
@@ -200,7 +221,14 @@ def main():
ip_list=ip_list, ip_list=ip_list,
debug=args.debug) debug=args.debug)
create_qvlan.build() create_qvlan.build()
print('Created %s QVLAN stations' % args.num_ports)
# TODO: Add code to clean up the stations built, unless --noclean is specified.
if create_qvlan.passes():
logging.info('Created %s QVLAN stations' % args.num_ports)
create_qvlan.exit_success()
else:
create_vlan.exit_fail()
if __name__ == "__main__": if __name__ == "__main__":