Break Fx Nat Kavya.py
Break Fx Nat Kavya.py
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# creating a handler
screen_handler = ScreenHandler()
tasklog_handler = TaskLogHandler('/tmp/Breakfix-nat.log')
# attach to your logger
logger.addHandler(screen_handler)
logger.addHandler(tasklog_handler)
# set log level to show everything
cfg = {}
DATA_PATH = "data/breakfix_nat_data.yaml"
def get_from_store(name):
""" Get model from data file config using store.get """
base_dir = os.path.dirname(os.path.abspath(__file__))
DATA_FILE_PATH = base_dir + "/" + DATA_PATH
return store.get('file:' + DATA_FILE_PATH, root_object=name)
query_param_response =
manual_nat_obj.deserializer.deserialize_create_response(manual_nat_obj,
response_data)
print(str(query_param_response))
return query_param_response
class ScriptCommonSetup(ftltest.CommonSetup):
@aetest.subsection
def initialise_easypy(self, api_service_fmc1:APIService):
import argparse, os
base_dir = os.path.dirname(__file__)
DATA_FILE = "data/breakfix_nat_data.yaml"
DATA_FILE_PATH = os.path.join(base_dir, DATA_FILE)
parser = argparse.ArgumentParser(description="Break fix NAT feature
AUTOMATION")
parser.add_argument('--datayaml', type=str, default=DATA_FILE_PATH)
# parser.add_argument('--nameIfNames', action='append', default=['inside',
'outside'])
parser.add_argument('--hasetup', action="store_true", default=True)
parser.add_argument('--haname', type=str, default='Breakfix-HA')
parser.add_argument('--failoverLinkName', action='append',
default=['failover'])
parser.add_argument('--seczone', action='append', default=['outside',
'inside'])
# parser.add_argument('--clustersetup', action="store_true", default=False)
# parser.add_argument('--clustername', type=str, default='vFTD_Cluster')
# parser.add_argument('--ccl_interface', dest='ccl_interface',
default='GigabitEthernet0/5')
args = parser.parse_known_args()[0]
self.parameters.update(args=args)
self.parent.parameters.update({
'datayaml': args.datayaml,
# 'nameIfNames': args.nameIfNames,
'hasetup': args.hasetup,
'haname': args.haname,
'failoverLinkName': args.failoverLinkName,
'seczone':args.seczone
})
cfg.update({"api_service_fmc1":api_service_fmc1,
'fmc1': self.parent.parameters.get('fmc1'),
# 'ccl_interface': args.ccl_interface,
# 'clustername': args.clustername,
# 'clustersetup': args.clustersetup,
'network_obj_host':network_obj_host,
'network_obj_range':network_obj_range,
'network_obj_subnet':network_obj_subnet,
'network_obj_grp':network_obj_grp,
'nat_detail_dict':nat_detail_dict,
'show_commands':show_commands
})
#@aetest.subsection
def register_smart_license(self, steps, api_service_fmc1, datayaml):
try:
with steps.start("Registering smart license"):
register_with_token_config = store.get('file:{}'.format(datayaml),
root_object='smart_license.register_token_breakfix')
register_with_token_config_find =
api_service_fmc1.find_one_by_record(register_with_token_config)
if register_with_token_config_find.license_status != '(null)':
api_service_fmc1.delete(register_with_token_config)
api_service_fmc1.create(register_with_token_config)
registered_license =
api_service_fmc1.find_one_by_record(register_with_token_config)
if not registered_license:
self.failed("Unable to register smart license",
goto=["common_cleanup"])
except Exception as e:
self.failed('Registering smart license failed due to {}'.format(e),
goto=["common_cleanup"])
#@aetest.subsection
def create_ac_policy_for_registration(self, api_service_fmc1: APIService):
try:
name = "registration_policy"
ac_policy = api_service_fmc1.find_one(AccessPolicy,
condition=lambda obj: obj.name ==
name)
if ac_policy:
log.warning("{} already exists".format(name))
else:
ac_policy_cfg = AccessPolicy(name=name,
defaultAction=AccessPolicyDefaultAction(action="BLOCK"))
ac_policy = api_service_fmc1.create(ac_policy_cfg)
assert ac_policy
assert ac_policy.id
assert ac_policy.name == ac_policy_cfg.name
cfg.update({'ac_policy': ac_policy})
except Exception as e:
self.failed('Failed due to {}'.format(e), goto=["common_cleanup"])
# @aetest.subsection
def device_registration(self,testbed, api_service_fmc1):
steps = Steps()
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
ssh_conn = []
fmc_ip = testbed.devices['fmc1'].custom.fmc_ip
regkey = testbed.devices['sensor2'].custom.reg_key
nat_id = testbed.devices['sensor2'].custom.nat_id
ftd1 = ConfigProvider(testbed, TestBedConstants.sensor1.value)
ftd1_ssh = ftd1.get_ssh_connection()
ssh_conn.append(ftd1_ssh)
ftd2 = ConfigProvider(testbed, TestBedConstants.sensor2.value)
ftd2_ssh = ftd2.get_ssh_connection()
ssh_conn.append(ftd2_ssh)
ac_policy = cfg.get('ac_policy')
sensors = ['sensor1', 'sensor2']
try:
with steps.start("Validating any other FMC is registered to the
devices"):
breakfix_lib.manager_validation_in_fmc(ssh_conn[0], log)
breakfix_lib.manager_validation_in_fmc(ssh_conn[1], log)
@aetest.subsection
def create_ha_setup(self, testbed, api_service_fmc1, haname, failoverLinkName,
hasetup, datayaml):
steps = Steps()
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
try:
# with steps.start(f"Configuring physical interface for both the
sensors") as substep:
# devices = api_service_fmc1.find_all(Device)
# deviceObjDict = {}
# for device in range(len(devices)):
# deviceObjDict[devices[device].name] = devices[device]
# for sensor in ['sensor1', 'sensor2']:
# device_ip = testbed.devices[sensor].custom.device_ip
# data_interface =
testbed.devices[sensor].custom.data_interface
# data_interface_name =
testbed.devices[sensor].custom.data_interface_name
# data_interface_ipv4 =
testbed.devices[sensor].custom.data_interface_ipv4_address
# data_interface_netmask =
testbed.devices[sensor].custom.data_interface_netmask
# with substep.start(f"Configuring {data_interface} in
{sensor}"):
#
breakfix_lib.delete_physical_interface_ipv4(primary_device=deviceObjDict[device_ip]
,
#
interfacename=data_interface,
#
nameif=data_interface_name,
#
description=data_interface_name, enabled=True,
#
api_service_fmc1=api_service_fmc1,
#
ipv4addr=data_interface_ipv4,
#
ipv4mask=data_interface_netmask
# )
# log.info(f"Deploying the changes in {device_ip}")
# breakfix_lib.deploy_on_ftd(api_service_fmc1,
ftd=deviceObjDict[device_ip])
# time.sleep(15)
# log.info("Physcial interface configured successfully")
failoverLinkName=failoverLinkName)
self.parent.parameters.update({
'parentDevice': returnDict.get('parentDevice'),
'primaryDevice': returnDict.get('primaryDevice'),
'secondaryDevice': returnDict.get('secondaryDevice'),
'returnDict': returnDict,
})
cfg.update({
'parentDevice': returnDict.get('parentDevice'),
'primaryDevice': returnDict.get('primaryDevice'),
'secondaryDevice': returnDict.get('secondaryDevice'),
'returnDict': returnDict,
})
else:
log.info('hasetup flag is not true, hence detect the first
ftd as primary device in '
'sensorlist')
sensorList = self.parent.parameters.get('sensorList')
parentDevice = api_service_fmc1.find_one(Device,
condition=lambda
device_obj: device_obj.name ==
sensorList[
0])
primaryDevice = parentDevice
secondaryDevice = parentDevice
self.parent.parameters.update({
'parentDevice': parentDevice,
'primaryDevice': primaryDevice,
'secondaryDevice': secondaryDevice,
})
log.info(banner("HA Formed Successfully"))
else:
returnDict = createHaSetup(testbed=testbed,
api_service_fmc1=api_service_fmc1,
haname=haname,
sensorList=deviceList,
datayaml=datayaml,
failoverLinkName=failoverLinkName)
self.parent.parameters.update({
'parentDevice': returnDict.get('parentDevice'),
'primaryDevice': returnDict.get('primaryDevice'),
'secondaryDevice': returnDict.get('secondaryDevice'),
'returnDict': returnDict,
})
cfg.update({
'parentDevice': returnDict.get('parentDevice'),
'primaryDevice': returnDict.get('primaryDevice'),
'secondaryDevice': returnDict.get('secondaryDevice'),
'returnDict': returnDict,
})
log.info(banner(f"Already HA setup is found with name
{haname}"))
time.sleep(10)
log.info(banner("HA formed successfully"))
except Exception as e:
self.failed('Failed due to {}'.format(e), goto=["common_cleanup"])
# @aetest.subsection
def configure_interface_and_nat_fmc(self,testbed,api_service_fmc1,datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primary_ip = cfg.get('primaryDevice').name
primary_sensor =
brkfx_nat_lib.get_primary_ip_sensor(primary_ip=primary_ip,testbed=testbed)
data_interface_netmask =
testbed.devices[primary_sensor].custom.data_interface_netmask
try:
with steps.start("Configuring interfaces and zones") as substep:
breakfix_lib.update_physical_interface_ipv4(primary_device=deviceObjDict[primary_ip
],
interfacename=data_interface1,
nameif=data_interface_name1,
description=data_interface_name1, enabled=True,
api_service_fmc1=api_service_fmc1,
ipv4addr=data_interface_ipv4_address1,
ipv4mask=data_interface_netmask,
)
breakfix_lib.update_physical_interface_ipv4(primary_device=deviceObjDict[primary_ip
],
interfacename=data_interface2,
nameif=data_interface_name2,
description=data_interface_name2, enabled=True,
api_service_fmc1=api_service_fmc1,
ipv4addr=data_interface_ipv4_address2,
ipv4mask=data_interface_netmask,
)
container_id=deviceObjDict[primary_ip].id)
outzone.interfaces = [phyIntf1]
api_service_fmc1.create(outzone)
container_id=deviceObjDict[primary_ip].id)
inzone.interfaces = [phyIntf2]
api_service_fmc1.create(inzone)
except Exception as e:
self.failed('Failed due to {}'.format(e), goto=["common_cleanup"])
class TC_StaticNatCombinations():
"""
TC 1: [STATIC_source addrs_translation_manual_NAT] To configure static nat with
real and mapped interfaces as any & real and mapped src_addresses as any
TC 2: [STATIC_source addrs_translation_manual_NAT] To configure static nat with
real and mapped interfaces as any & real and mapped src_addresses as objects
TC 3: [STATIC_source _dst addrs_translation_manual_NAT] To configure static nat
with real and mapped interfaces as any . Real and mapped src_addresses as any .
Mapped and real destination as objects.
TC 4: [STATIC_source _dst addrs_translation_manual_NAT] To configure static nat
with real and mapped interfaces as any & real and mapped src_addresses as any and
objects respectively. Mapped and real destinations as objects and any respectively.
TC 5: [STATIC_source _dst addrs_translation_manual_NAT] To configure static nat
with real and mapped interfaces as any & real and mapped src_addresses as objects
and any respectively.
"""
#@aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def static_nat(self,testbed, api_service_fmc1,datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh':primary_ssh})
network_obj_host = cfg.get('network_obj_host')
cli_regex_dict = {'nat source static any any':
r"source\s+static\s+any\s+any",
f'nat source static {network_obj_host[0][0]}
{network_obj_host[0][0]}':
rf"source\s+static\s+{network_obj_host[0][0]}\s+
{network_obj_host[0][0]}",
f'nat source static any any destination static
{network_obj_host[1][0]} {network_obj_host[1][0]}':
rf"source\s+static\s+any\s+any\s+destination\s+static\
s+{network_obj_host[1][0]}\s+{network_obj_host[1][0]}",
f'nat source static any {network_obj_host[2][0]}
destination static {network_obj_host[2][0]} any':
rf"source\s+static\s+any\s+{network_obj_host[2][0]}\
s+destination\s+static\s+{network_obj_host[2][0]}\s+any",
f'nat source static {network_obj_host[3][0]}
{network_obj_host[3][0]} destination static {network_obj_host[3][0]} any':
rf"source\s+static\s+{network_obj_host[3][0]}\s+
{network_obj_host[3][0]}\s+destination\s+static\s+{network_obj_host[3][0]}\s+any"
}
nat_detail_dict = cfg.get('nat_detail_dict')
breakfix_cli_args = [cli for cli in cli_regex_dict.keys()]
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_DynamicNatCombinations():
"""
TC 6: [DYNAMIC_source_dst_addrs_translation_manual_NAT] To configure
dynamic nat with real and mapped interfaces as any. Real src & mapped src addresses
as any and objects respectively. Destination mapped and real addresses as objects /
object-groups and any respectively.
TC 7: [DYNAMIC_source addrs_translation_manual_NAT] To configure dynamic
nat with real and mapped interfaces as any & real src & mapped src addresses as
object / object-group respectively
TC 8: [DYNAMIC_source addrs_translation_manual_NAT] To configure dynamic
nat with real and mapped interfaces as any & real src & mapped src addresses as pat
pool and objects respectively
"""
#@aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def dynamic_nat(self, testbed, api_service_fmc1, datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
network_obj_host = cfg.get('network_obj_host')
network_obj_range = cfg.get('network_obj_range')
network_obj_subnet = cfg.get('network_obj_subnet')
nat_detail_dict = cfg.get('nat_detail_dict')
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
originalDestination = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_2')
translatedDestination =
api_service_fmc1.find_one(NetworkObject,
lambda
network: network.name == 'any-ipv4')
nat_rule1 = ManualNatRule()
nat_rule1.enabled = 'True'
nat_rule1.natType = 'DYNAMIC'
nat_rule1.unidirectional = True
nat_rule1.originalSource = originalSource
nat_rule1.translatedSource = translatedSource
nat_rule1.originalDestination = originalDestination
nat_rule1.translatedDestination = translatedDestination
api_service_fmc1.create(copy.deepcopy(nat_rule1),
container_id=breakfix_nat_policy.id)
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_2')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_3')
nat_rule2 = ManualNatRule()
nat_rule2.enabled = 'True'
nat_rule2.natType = 'DYNAMIC'
nat_rule2.unidirectional = True
nat_rule2.originalSource = originalSource
nat_rule2.translatedSource = translatedSource
api_service_fmc1.create(copy.deepcopy(nat_rule2),
container_id=breakfix_nat_policy.id)
root_object='manual_nat_rules.dynamic_rule_any_with_pat')
api_service_fmc1.create(copy.deepcopy(nat_rul3),
container_id=breakfix_nat_policy.id)
log.info(banner("Deploying the changes in FMC"))
breakfix_lib.deploy_on_ftd(api_service_fmc1, ftd=parentDevice)
log.info(banner("Deployment completed"))
time.sleep(3)
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_AfterNatCombinations():
"""
TC:9 [STATIC_source addrs_translation_after_auto] To configure static nat
with real and mapped interfaces as any & real and mapped src_addresses as any
TC:10 [STATIC_source addrs_translation_after_auto] To configure static nat
with real and mapped interfaces as any & real and mapped src_addresses as objects
TC:11 [STATIC_source _dst addrs_translation_after_auto] To configure static
nat with real and mapped interfaces as any . Real and mapped src_addresses as
any . Mapped and real destination as objects.
TC:12 [STATIC_source _dst addrs_translation_manual_NAT_after_auto] To
configure static nat with real and mapped interfaces as any & real and mapped
src_addresses as any and objects respectively. Mapped and real destinations as
objects and any respectively.
TC:13 [STATIC_source_dst_addrs_translation_after_auto] To configure static
nat with real and mapped interfaces as any & real and mapped src_addresses as
objects and any respectively.
TC:14 [DYNAMIC_source_dst_addrs_translation_manual_NAT] To configure
dynamic nat with real and mapped interfaces as any. Real src & mapped src addresses
as any and objects respectively. Destination mapped and real addresses as objects /
object-groups and any respectively.
"""
#@aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def after_auto_nat(self, testbed, api_service_fmc1, datayaml,fmc1):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
network_obj_host = cfg.get('network_obj_host')
network_obj_range = cfg.get('network_obj_range')
network_obj_subnet = cfg.get('network_obj_subnet')
network_obj_grp = cfg.get('network_obj_grp')
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
cli_regex_dict = {
f'nat after-auto source static any {network_obj_subnet[0][0]}':
rf'source\s+static\s+any\s+{network_obj_subnet[0][0]}',
f'nat after-auto source static {network_obj_subnet[1][0]}
{network_obj_subnet[2][0]} ':
rf'source\s+static\s+{network_obj_subnet[1][0]}\s+
{network_obj_subnet[2][0]}',
f'nat after-auto source static any any destination static
{network_obj_subnet[3][0]} {network_obj_subnet[0][0]}':
rf'source\s+static\s+any\s+any\s+destination\s+static\s+
{network_obj_subnet[3][0]}\s+{network_obj_subnet[0][0]}',
f'nat after-auto source static any {network_obj_grp[0][0]} destination
static {network_obj_grp[1][0]} any':
rf"source\s+static\s+any\s+{network_obj_grp[0][0]}\s+destination\
s+static\s+{network_obj_grp[1][0]}\s+any",
f'nat after-auto source static {network_obj_subnet[3][0]}
{network_obj_grp[2][0]} destination static {network_obj_subnet[3][0]} any':
rf"source\s+static\s+{network_obj_subnet[3][0]}\s+
{network_obj_grp[2][0]}\s+destination\s+static\s+{network_obj_subnet[3][0]}\s+any",
f'nat after-auto source dynamic any {network_obj_grp[0][0]} destination
static {network_obj_grp[2][0]} any':
rf"source\s+dynamic\s+any\s+{network_obj_grp[0][0]}\s+destination\
s+static\s+{network_obj_grp[2][0]}\s+any"
}
for obj_range in [
['obj_range_5', '15.15.15.2', '15.15.15.50'],
['obj_range_6', '16.16.16.2', '16.16.16.50'],
['obj_range_7', '17.17.17.2', '17.17.17.50']]:
primary_ssh.conn.execute(f'object network {obj_range[0]}',
prompt='>|#', timeout=120)
primary_ssh.conn.execute(f'range {obj_range[1]}
{obj_range[2]}', prompt='>|#', timeout=120)
primary_ssh.conn.execute(f'exit', prompt='>|#', timeout=120)
cfg['network_obj_range'].append(obj_range)
time.sleep(2)
log.info("Network objects range created successfully")
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='after_nat',
nat_detail=nat_detail_dict['after_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
any_ipv4 = store.get('file:{}'.format(datayaml),
root_object='networks.any_ipv4')
cfg.update({'any_ipv4':any_ipv4})
api_service_fmc1.create(any_ipv4)
after_nat_rule1 =
create_manual_nat_with_query_params(fmc1=fmc1, nat_policy=breakfix_nat_policy,
object_name_in_data_yaml=
"manual_nat_rules.tc9_rule",
section_value="after_auto")
assert after_nat_rule1
after_nat_rule2 =
create_manual_nat_with_query_params(fmc1=fmc1, nat_policy=breakfix_nat_policy,
object_name_in_data_yaml=
"manual_nat_rules.tc10_rule",
section_value="after_auto")
assert after_nat_rule2
after_nat_rule3 =
create_manual_nat_with_query_params(fmc1=fmc1, nat_policy=breakfix_nat_policy,
object_name_in_data_yaml=
"manual_nat_rules.tc11_rule",
section_value="after_auto")
assert after_nat_rule3
after_nat_rule4 =
create_manual_nat_with_query_params(fmc1=fmc1, nat_policy=breakfix_nat_policy,
object_name_in_data_yaml=
"manual_nat_rules.tc12_rule",
section_value="after_auto")
assert after_nat_rule4
after_nat_rule5 =
create_manual_nat_with_query_params(fmc1=fmc1, nat_policy=breakfix_nat_policy,
object_name_in_data_yaml=
"manual_nat_rules.tc13_rule",
section_value="after_auto")
assert after_nat_rule5
with substep.start(f"Configuring the NAT rule in FMC for
'{breakfix_cli_args[5]}' "):
after_nat_rule6 =
create_manual_nat_with_query_params(fmc1=fmc1, nat_policy=breakfix_nat_policy,
object_name_in_data_yaml=
"manual_nat_rules.tc14_rule",
section_value="after_auto")
assert after_nat_rule6
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='after_nat',
nat_detail=nat_detail_dict['after_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_AutoNatStaticDynamicCombinations():
"""
TC:15 [static_pat_auto_nat] To create auto NAT rule with the mapped IP address
TC:16 [static_auto_nat] To create auto NAT rule with the mapped network
object/object-group name (subnet,host,range)
TC:17 [dynamic_pat_auto_nat] To create auto NAT rule with the mapped IP address
TC:18 [dynamic_auto_nat] To create auto NAT rule with the mapped network
object/object-group name (subnet,host,range)
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def auto_nat_static_dynamic(self, testbed, api_service_fmc1, datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
cfg.update({'primary_ssh': primary_ssh})
cli_regex_dict = {
f'nat static {network_obj[1][0]}':
rf"source\s+static\s+{network_obj[0][0]}\s+{network_obj[1][0]}"
rf"| object\s+network\s+{network_obj[0][0]}\s*nat\s*\(any,any\)\
s*static\s*{network_obj[1][0]}"
rf"| nat\s+\(any,any\)\s+static\s+{network_obj[1][0]}",
f'nat static {network_obj[2][0]}':
rf"source\s+static\s+{network_obj[5][0]}\s+{network_obj[2][0]}"
rf"| object\s+network\s+{network_obj[5][0]}\s*nat\s*\(any,any\)\
s*static\s*{network_obj[2][0]}"
rf"| nat\s+\(any,any\)\s+static\s+{network_obj[2][0]}",
f'nat dynamic {network_obj[3][0]}':
rf"source\s+dynamic\s+{network_obj[6][0]}\s+{network_obj[3][0]}"
rf"| object\s+network\s+{network_obj[6][0]}\s*nat\s*\(any,any\)\
s*dynamcic\s*{network_obj[3][0]}"
rf"| nat\s+\(any,any\)\s+dynamic\s+{network_obj[3][0]}",
f'nat dynamic {network_obj[9][0]}':
rf"source\s+dynamic\s+{network_obj[8][0]}\s+{network_obj[9][0]}"
rf"| object\s+network\s+{network_obj[8][0]}\s*nat\s*\(any,any\)\
s*dynamcic\s*{network_obj[9][0]}"
rf"| nat\s+\(any,any\)\s+dynamic\s+{network_obj[9][0]}",
}
auto_nat_objs =
[network_obj[0],network_obj[5],network_obj[6],network_obj[8]]
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='auto_nat',
nat_detail=nat_detail_dict['auto_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
originalNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_8')
translatedNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_9')
auto_nat_1 = AutoNatRule()
auto_nat_1.natType = 'STATIC'
auto_nat_1.originalNetwork = originalNetwork
auto_nat_1.translatedNetwork = translatedNetwork
api_service_fmc1.create(copy.deepcopy(auto_nat_1),
container_id=breakfix_nat_policy.id)
originalNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_8')
translatedNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_10')
auto_nat_2 = AutoNatRule()
auto_nat_2.natType = 'STATIC'
auto_nat_2.originalNetwork = originalNetwork
auto_nat_2.translatedNetwork = translatedNetwork
api_service_fmc1.create(copy.deepcopy(auto_nat_2),
container_id=breakfix_nat_policy.id)
originalNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_9')
translatedNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_11')
auto_nat_3 = AutoNatRule()
auto_nat_3.natType = 'DYNAMIC'
auto_nat_3.originalNetwork = originalNetwork
auto_nat_3.translatedNetwork = translatedNetwork
api_service_fmc1.create(copy.deepcopy(auto_nat_3),
container_id=breakfix_nat_policy.id)
originalNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_subnet_5')
translatedNetwork = api_service_fmc1.find_one(NetworkGroup,
lambda network:
network.name == 'obj_grp_4')
auto_nat_4 = AutoNatRule()
auto_nat_4.natType = 'DYNAMIC'
auto_nat_4.originalNetwork = originalNetwork
auto_nat_4.translatedNetwork = translatedNetwork
api_service_fmc1.create(copy.deepcopy(auto_nat_4),
container_id=breakfix_nat_policy.id)
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name = 'auto_nat',
nat_detail=nat_detail_dict['auto_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_RenameNetworkObjectValidation():
"""
TC :19 To rename the object / service-objects names and check if the
used/mapped objects are preserved in the NAT rule.
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def rename_network_object_validate(self, testbed, api_service_fmc1, datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
network_obj_host = cfg.get('network_obj_host')
host_obj = network_obj_host[0][0]
obj_rename= 'obj_rename'
breakfix_lib.breakfix_mode(ftd_ssh=primary_ssh)
primary_ssh.conn.execute(f"object network {host_obj} rename
{obj_rename}", prompt='>|#', timeout=120)
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
else:
self.failed("Object details not showing properly")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_DeploymentFailureInBreakfixCLI():
"""
TC 20: To check OOB and health alert when deployment fails from FMC due to
CLI-EDIT Inprogress in FTD
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def deployment_failure_breakfix_cli(self, testbed, api_service_fmc1, datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
fmc = ConfigProvider(testbed, TestBedConstants.fmc1.value)
primary_ssh = primaryconf.get_ssh_connection()
fmc_ssh = fmc.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh,'fmc_ssh':fmc_ssh})
data_interface_name =
testbed.devices['sensor1'].custom.data_interface_name
data_interface = testbed.devices['sensor1'].custom.data_interface
phyIntf = api_service_fmc1.find_one(PhysicalInterface,
condition=lambda intfname:
intfname.name == data_interface,
container_id=deviceObjDict[primary_ip].id)
if phyIntf:
phyIntf.description = data_interface_name
api_service_fmc1.update(copy.deepcopy(phyIntf),
container_id=deviceObjDict[primary_ip].id)
try:
log.info(banner("Deploying the changes in FMC"))
breakfix_lib.deploy_on_ftd(api_service_fmc1, ftd=parentDevice)
except Exception as err:
log.info(banner("Deployment getting failed."))
log.info(err)
time.sleep(3)
get_transcript_log_cmd = f"cat
/var/opt/CSCOpx/MDC/temp/{transaction_id}*transcript.txt"
transcript_log =
fmc_ssh.conn.execute(get_transcript_log_cmd,timeout=120)
if transcript_log:
if re.search('CLI-edit is in
progress',transcript_log,re.IGNORECASE):
log.info(banner("Deployment blocking with correct behaviour
i.e, breakix cli edit is inprogress...So passing the testcase"))
log.info("Exiting from the breakfix CLI and do the pending
deployment")
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
time.sleep(2)
log.info("Exited from the breakfix CLI")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
fmc_ssh = cfg.get('fmc_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
fmc_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_ChangeNATRulePosition():
"""
TC :21 To change the position of nat rules , static and dynamic - FMC and FTD
TC: 22 To check the no form of NAT rule
TC: 23 To modify NAT rules configured , deployed from FMC and check for OOB
changes.
TC :24 To create a NAT , modify it twice and check for latest OOB changes
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def change_nat_rule_position(self, testbed, api_service_fmc1, datayaml,fmc1):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
rule_to_change = 'nat (any,any) source static obj_rename obj_rename'
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
else:
self.failed("Nat rule is not present")
except Exception as err:
self.failed(err)
container_id=nat_rule_created_above.id)
api_service_fmc1.delete(moved_nat_rule,
container_id=breakfix_nat_policy.id)
log.info("Nat Rule Deleted successfully")
object_name_in_data_yaml=
"manual_nat_rules.tc21_rule",
targetIndex_value="1")
assert data
log.info("Nat Rule Created successfully")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_MappedInterfaceStaticNatCombinations():
"""
TC :25 [static_manual_Nat_src_] To create a NAT rule with
~ real , mapped interfaces.
~ real, mapped source address as object, any, interface options.
~ port translations need to be used using service objects.
Tc :26 [static_manual_Nat_src_dst] To create a NAT rule with
~ real , mapped interfaces.
~ real, mapped destination addresses as object and any respectively.
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def mapped_interface_static_nat(self, testbed, api_service_fmc1, datayaml,
seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
['obj_serv_1', '9091']
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_14')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_11')
translatedSourcePort =
api_service_fmc1.find_one(ProtocolPortObject,
lambda
protocol_port_object: protocol_port_object.name == 'obj_serv_1')
mapped_interface_nat_rule_1 = ManualNatRule()
mapped_interface_nat_rule_1.enabled = True
mapped_interface_nat_rule_1.natType = 'STATIC'
mapped_interface_nat_rule_1.sourceInterface = sourceInterface
mapped_interface_nat_rule_1.destinationInterface =
destinationInterface
mapped_interface_nat_rule_1.originalSource = originalSource
mapped_interface_nat_rule_1.translatedSource = translatedSource
mapped_interface_nat_rule_1.translatedSourcePort =
translatedSourcePort
api_service_fmc1.create(copy.deepcopy(mapped_interface_nat_rule_1),
container_id=breakfix_nat_policy.id)
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_12')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_15')
originalDestination = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_subnet_6')
translatedDestination =
api_service_fmc1.find_one(NetworkObject,
lambda
network: network.name == 'any-ipv4')
mapped_interface_nat_rule_2 = ManualNatRule()
mapped_interface_nat_rule_2.enabled = True
mapped_interface_nat_rule_2.natType = 'STATIC'
mapped_interface_nat_rule_2.sourceInterface = sourceInterface
mapped_interface_nat_rule_2.destinationInterface =
destinationInterface
mapped_interface_nat_rule_2.originalSource = originalSource
mapped_interface_nat_rule_2.translatedSource = translatedSource
mapped_interface_nat_rule_2.originalDestination =
originalDestination
mapped_interface_nat_rule_2.translatedDestination =
translatedDestination
api_service_fmc1.create(copy.deepcopy(mapped_interface_nat_rule_2),
container_id=breakfix_nat_policy.id)
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_MappedInterfaceDnsNatCombinations():
"""
TC :27 [static_manual_nat] To use the created xlate to rewrite DNS record
by creating a new rule.
Tc :28 [static_dynamic_manual_nat] To create manual NAT rule with the
mapped network obj/ obj-name for pat-pool along with dns to rewrite the DNS record.
/
Please cover dynamic manual nat nat (eth12_subintf_one,eth12_subintf_two)
source dynamic any object_one_nat_any dns
Also check if dns is not supported in pat-pool
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def mapped_interface_dns_nat(self,testbed, api_service_fmc1, datayaml,
seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
['obj_grp_5','obj_16', 'obj_range_13']
cli_regex_dict = {
f'nat ({seczone[0]},{seczone[1]}) source static {network_obj[-1][0]}
{network_obj[3][0]} dns':
rf"source\s+static\s+{network_obj[-1][0]}\s+{network_obj[3][0]}\
s+dns"
rf"| nat\s+\(\s*{seczone[0]}\s*,\s*{seczone[1]}\s*\)\s+source\
s+static\s+{network_obj[-1][0]}\s+{network_obj[3][0]}\s+dns",
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkGroup,
lambda network:
network.name == 'obj_grp_5')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_subnet_7')
mapped_interface_dns_rule_1 = ManualNatRule()
mapped_interface_dns_rule_1.enabled = True
mapped_interface_dns_rule_1.natType = 'STATIC'
mapped_interface_dns_rule_1.dns = True
mapped_interface_dns_rule_1.sourceInterface = sourceInterface
mapped_interface_dns_rule_1.destinationInterface =
destinationInterface
mapped_interface_dns_rule_1.originalSource = originalSource
mapped_interface_dns_rule_1.translatedSource = translatedSource
api_service_fmc1.create(copy.deepcopy(mapped_interface_dns_rule_1),
container_id=breakfix_nat_policy.id)
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'any-ipv4')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_subnet_8')
mapped_interface_dns_rule_2 = ManualNatRule()
mapped_interface_dns_rule_2.enabled = True
mapped_interface_dns_rule_2.natType = 'STATIC'
mapped_interface_dns_rule_2.dns = True
mapped_interface_dns_rule_2.sourceInterface = sourceInterface
mapped_interface_dns_rule_2.destinationInterface =
destinationInterface
mapped_interface_dns_rule_2.originalSource = originalSource
mapped_interface_dns_rule_2.translatedSource = translatedSource
api_service_fmc1.create(copy.deepcopy(mapped_interface_dns_rule_2),
container_id=breakfix_nat_policy.id)
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'any-ipv4')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_14')
mapped_interface_dns_rule_3 = ManualNatRule()
mapped_interface_dns_rule_3.enabled = True
mapped_interface_dns_rule_3.natType = 'DYNAMIC'
mapped_interface_dns_rule_3.dns = True
mapped_interface_dns_rule_3.unidirectional = True
mapped_interface_dns_rule_3.sourceInterface = sourceInterface
mapped_interface_dns_rule_3.destinationInterface =
destinationInterface
mapped_interface_dns_rule_3.originalSource = originalSource
mapped_interface_dns_rule_3.translatedSource = translatedSource
api_service_fmc1.create(copy.deepcopy(mapped_interface_dns_rule_3),container_id=bre
akfix_nat_policy.id)
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_MappedInterfaceDnsAutoNat():
"""
TC :29 [dynamic_auto_nat] To create auto NAT rule with the mapped IP
address along with dns to rewrite the DNS record.
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def mapped_interface_dns_auto_nat(self, testbed, api_service_fmc1, datayaml,
seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
cli_regex_dict = {
f'nat ({seczone[0]},{seczone[1]}) dynamic {network_obj[1][0]} dns':
rf"nat\s+\({seczone[0]},{seczone[1]}\)\s+dynamic\s+{network_obj[1]
[0]}\s+dns"
rf"| object\s+network\s+{network_obj[0][0]}\s*nat\s*\({seczone[0]},
{seczone[1]}\)\s*dynamic\s*{network_obj[1][0]}\s+dns"
rf"| \({seczone[0]}\)\s+to\s+\({seczone[1]}\)\s+source\s+dynamic\s+
{network_obj[0][0]}\s+{network_obj[1][0]}\s+dns"
}
auto_nat_objs =[network_obj[0]]
breakfix_cli_args = [cli for cli in cli_regex_dict.keys()]
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='auto_nat',
nat_detail=nat_detail_dict['auto_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_17')
translatedNetwork = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'obj_range_15')
mapped_int_auto_nat_rule = AutoNatRule()
mapped_int_auto_nat_rule.natType = 'DYNAMIC'
mapped_int_auto_nat_rule.dns = True
mapped_int_auto_nat_rule.sourceInterface = sourceInterface
mapped_int_auto_nat_rule.destinationInterface =
destinationInterface
mapped_int_auto_nat_rule.originalNetwork = originalNetwork
mapped_int_auto_nat_rule.translatedNetwork = translatedNetwork
api_service_fmc1.create(copy.deepcopy(mapped_int_auto_nat_rule),
container_id=breakfix_nat_policy.id)
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='auto_nat',
nat_detail=nat_detail_dict['auto_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_NetworkGroupNatCombination():
"""
TC :30 [static_PAT_manual_NAT_src_only] To configure a static PAT rule with
~ real, mapped interfaces.
~ real and mapped source addressess as a single host in the form of
objects.
~ group of IPs to mapped group of Ips
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def network_group_nat_rule(self, testbed, api_service_fmc1, datayaml, seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
['obj_subnet_9', '9.9.3.0','255.255.255.0'],
['obj_subnet_10', '10.10.3.0','255.255.255.0'],
['obj_grp_6','obj_subnet_9', 'obj_range_16'],
['obj_grp_7', 'obj_subnet_10', 'obj_range_17'],
cli_regex_dict = {
f'nat ({seczone[0]},{seczone[1]}) source static {network_obj[4][0]}
{network_obj[5][0]}':
rf"nat\s*\(\s*{seczone[0]}\s*,\s*{seczone[1]}\s*\)\s*source\
s+static\s+{network_obj[4][0]}\s+{network_obj[5][0]}"
rf"| \(\s*{seczone[0]}\s*\)\s+to\s+\(\s*{seczone[1]}\s*\)\s+source\
s+static\s+{network_obj[4][0]}\s+{network_obj[5][0]}"
rf"| source\s+static\s+{network_obj[4][0]}\s+{network_obj[5][0]}"
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkGroup,
lambda network:
network.name == 'obj_grp_6')
translatedSource = api_service_fmc1.find_one(NetworkGroup,
lambda network:
network.name == 'obj_grp_7')
nat_rule_grp = ManualNatRule()
nat_rule_grp.enabled = 'True'
nat_rule_grp.natType = 'STATIC'
nat_rule_grp.sourceInterface = sourceInterface
nat_rule_grp.destinationInterface = destinationInterface
nat_rule_grp.originalSource = originalSource
nat_rule_grp.translatedSource = translatedSource
api_service_fmc1.create(copy.deepcopy(nat_rule_grp),
container_id=breakfix_nat_policy.id)
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_NegativeTestcases():
"""
TC :31 To map a non-existant object to the NAT rule
TC :32 To map an empty obj to an object-group
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def map_non_existant_object(self, testbed, api_service_fmc1,datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_RoundRobinNatRule():
"""
TC :33 To configure NAT using round robin
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def round_robin_rule(self, testbed, api_service_fmc1, datayaml,seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'any-ipv4')
round_robin_rule = ManualNatRule()
patOptions = FtdPatFragment(patPoolAddress=obj_grp_8,
roundRobin=True)
round_robin_rule.enabled = True
round_robin_rule.natType = 'DYNAMIC'
round_robin_rule.sourceInterface = sourceInterface
round_robin_rule.destinationInterface = destinationInterface
round_robin_rule.originalSource = originalSource
round_robin_rule.patOptions = patOptions
round_robin_rule.unidirectional = True
api_service_fmc1.create(copy.deepcopy(round_robin_rule),container_id=breakfix_nat_p
olicy.id)
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
class TC_UnidirectionalNatRule():
"""
TC :34 To create a NAT rule with unidirectional
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def unidirectional_nat_rule(self, testbed, api_service_fmc1, datayaml,
seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
cli_regex_dict = {
f'nat ({seczone[0]},{seczone[1]}) source static any any
unidirectional':
rf"nat\s+\(({seczone[0]},{seczone[1]})\)\s+source\s+static\s+any\
s+any\s+unidirectional"
rf"| source\s+static\s+any\s+any\s+\s+unidirectional"
rf"| \({seczone[0]}\)\s+to\s+\({seczone[1]}\)\s+source\s+static\
s+any\s+any\s+unidirectional"}
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
sourceInterface = api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[0])
destinationInterface =
api_service_fmc1.find_one(SecurityZoneObject,
lambda zone:
zone.name == seczone[1])
originalSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == 'any-ipv4')
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda
network: network.name == 'any-ipv4')
unidirectional_rule = ManualNatRule()
unidirectional_rule.enabled = True
unidirectional_rule.natType = 'STATIC'
unidirectional_rule.sourceInterface = sourceInterface
unidirectional_rule.destinationInterface = destinationInterface
unidirectional_rule.originalSource = originalSource
unidirectional_rule.translatedSource =translatedSource
unidirectional_rule.unidirectional = True
api_service_fmc1.create(copy.deepcopy(unidirectional_rule),
container_id=breakfix_nat_policy.id)
cli_regex_dict=cli_regex_dict,
breakfix_cli_args=breakfix_cli_args,
steps=substep,
show_commands=show_commands,
key_name='before_nat',
nat_detail=nat_detail_dict['before_nat'])
if result:
log.info("All values properly configured in show command..")
else:
log.error("Values not properly showing in show commands..")
self.failed("Values not properly showing in show commands..")
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_WriteMemValidation():
"""
TC :35 To check the running, startup config after performing wr mem and exit
from breakfix mode
"""
#@aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def write_mem_validation(self, testbed, api_service_fmc1, datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
network_obj = ['obj_11','obj_subnet_10']
with steps.start("Creating one NAT rule in Breakfix mode and give 'N'
option for write mem"):
breakfix_lib.breakfix_mode(ftd_ssh=primary_ssh)
pattern = rf"source\s+static\s+{network_obj[0]}\s+{network_obj[1]}"
if re.search(pattern,running_config_op,re.IGNORECASE) and \
not re.search(pattern,startup_config_op,re.IGNORECASE):
log.info(banner(f"After giving write mem 'N' '{nat_cli}''
output showing in running-config and not shwoing in startup-config in FTD"))
else:
self.failed("Not expected behaviour")
translatedSource = api_service_fmc1.find_one(NetworkObject,
lambda network:
network.name == network_obj[1])
nat_rule = ManualNatRule()
nat_rule.enabled = True
nat_rule.natType = 'STATIC'
nat_rule.originalSource = originalSource
nat_rule.translatedSource = translatedSource
nat_rule.unidirectional = True
api_service_fmc1.create(copy.deepcopy(nat_rule),
container_id=breakfix_nat_policy.id)
assert nat_rule is not None
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_InterfaceNameModifyValidation():
"""
TC :36 To modify the security zone names(FMC) / nameif (device ) used by NAT
and ACL
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def interface_change(self, testbed, api_service_fmc1, datayaml,seczone):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
breakfix_cli_args = ['outside_modified']
if re.search(seczone[0],before_op,re.IGNORECASE):
log.info(banner(f"GigabitEthernet0/0 interface name is
{seczone[0]}"))
except Exception as err:
self.failed(err)
container_id=primaryDevice.id)
data_interface1 = phyIntf.name
breakfix_lib.breakfix_mode(ftd_ssh=primary_ssh)
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
outof_change = store.get("file:{}".format(datayaml),
root_object='outofband.change15')
api_service_fmc1.create(outof_change,
container_id=deviceObjDict[primary_ip].id)
log.info(banner("OOB is Detected"))
outof_change.oobaction = 'ACKNOWLEDGE_OUT_OF_BAND_CHANGES'
api_service_fmc1.create(outof_change,
container_id=deviceObjDict[primary_ip].id)
log.info(banner("OOB is acknowledged"))
container_id=primaryDevice.id)
phyIntf.ifname = seczone[0]
api_service_fmc1.update(copy.deepcopy(phyIntf),
container_id=primaryDevice.id)
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class TC_ExistingObjectChange(aetest.Testcase):
"""
TC :37 To modify the existing object / object groups being mapped to the NAT
rule.
"""
# @aetest.setup
def setup(self):
set_testcase_feature([Features77.feature4.value])
set_tims_testcase("Txw16474602r,Txw16474626r,Txw16474604r")
@aetest.test
def exisiting_object_change(self, testbed, api_service_fmc1,datayaml):
steps = Steps()
deviceList = api_service_fmc1.find_all(Device)
deviceObjDict = {}
for device in range(len(deviceList)):
deviceObjDict[deviceList[device].name] = deviceList[device]
breakfix_lib = BreakfixUtils()
brkfx_nat_lib = BreakfixNatUtils()
parentDevice = cfg.get('parentDevice')
primaryDevice = cfg.get('primaryDevice')
primary_ip = cfg.get('primaryDevice').name
primaryconf = ConfigProvider(testbed, primaryDevice.name)
primary_ssh = primaryconf.get_ssh_connection()
cfg.update({'primary_ssh': primary_ssh})
nat_detail_dict = cfg.get('nat_detail_dict')
show_commands = cfg.get('show_commands')
breakfix_cli_args = ['obj_8','8.8.13.1']
primary_ssh.conn.execute('end', prompt='>|#|:')
primary_ssh.conn.execute("Y", prompt='#')
primary_ssh.conn.execute('exit', prompt='>|#')
primary_ssh.conn.execute('exit', prompt='>|#')
outof_change = store.get("file:{}".format(datayaml),
root_object='outofband.change16')
api_service_fmc1.create(outof_change,
container_id=deviceObjDict[primary_ip].id)
log.info(banner("OOB is Detected"))
@aetest.cleanup
def cleanup(self):
primary_ssh = cfg.get('primary_ssh')
try:
log.info("Disconnecting the SSH handle")
primary_ssh.conn.disconnect()
except Exception as err:
self.failed(err)
class CommonCleanup(aetest.CommonCleanup):
#@aetest.subsection
def common_cleanup(self, api_service_fmc1):
steps = Steps()
try:
with steps.start("Delete all Network object"):
api_service_fmc1.delete_all(NetworkObject)
if __name__ == '__main__':
aetest.main()