def test_config_to_get_to(self): running_config_hier = HConfig(self.host_a, self.os, self.options) running_config_hier.add_child('interface Vlan2') compiled_config_hier = HConfig(self.host_a, self.os, self.options) compiled_config_hier.add_child('interface Vlan3') remediation_config_hier = running_config_hier.config_to_get_to( compiled_config_hier) self.assertEqual(2, len(list(remediation_config_hier.all_children())))
def test_config_to_get_to(self): running_config_hier = HConfig(host=self.host_a) interface = running_config_hier.add_child('interface Vlan2') interface.add_child('ip address 192.168.1.1/24') compiled_config_hier = HConfig(host=self.host_a) compiled_config_hier.add_child('interface Vlan3') remediation_config_hier = running_config_hier.config_to_get_to( compiled_config_hier) self.assertEqual(2, len(list(remediation_config_hier.all_children())))
def test_config_to_get_to(self): running_config_hier = HConfig(host=self.host_a) interface = running_config_hier.add_child("interface Vlan2") interface.add_child("ip address 192.168.1.1/24") generated_config_hier = HConfig(host=self.host_a) generated_config_hier.add_child("interface Vlan3") remediation_config_hier = running_config_hier.config_to_get_to( generated_config_hier ) assert len(list(remediation_config_hier.all_children())) == 2
def test_issue104() -> None: running_config_raw = ("tacacs-server deadtime 3\n" "tacacs-server host 192.168.1.99 key 7 Test12345\n") generated_config_raw = ( "tacacs-server host 192.168.1.98 key 0 Test135 timeout 3\n" "tacacs-server host 192.168.100.98 key 0 test135 timeout 3\n") host = Host(hostname="test", os="nxos") running_config = HConfig(host=host) running_config.load_from_string(running_config_raw) generated_config = HConfig(host=host) generated_config.load_from_string(generated_config_raw) rem = running_config.config_to_get_to(generated_config) expected_rem_lines = { "no tacacs-server deadtime 3", "no tacacs-server host 192.168.1.99 key 7 Test12345", "tacacs-server host 192.168.1.98 key 0 Test135 timeout 3", "tacacs-server host 192.168.100.98 key 0 test135 timeout 3", } rem_lines = {line.cisco_style_text() for line in rem.all_children()} assert expected_rem_lines == rem_lines
def main(): module = AnsibleModule( argument_spec=dict( hostname=dict(required=True), compiled_config=dict(required=True), running_config=dict(required=True), remediation_config=dict(required=True), os_role=dict(required=True), config_tags=dict(required=False) ), required_together=( ['hostname', 'compiled_config', 'running_config', 'remediation_config', 'os_role'] ), supports_check_mode=False ) hostname = str(module.params['hostname']) compiled_config = str(module.params['compiled_config']) running_config = str(module.params['running_config']) remediation_config = str(module.params['remediation_config']) os_role = str(module.params['os_role']) operating_system = os_role.strip('os_') if module.params['config_tags']: config_tags = list(module.params['config_tags']) else: config_tags = False hier_files = ['hierarchical_configuration_options.yml', 'hierarchical_configuration_tags.yml'] for item in hier_files: if not os.path.isfile('roles/{}/vars/{}'.format( os_role, item)): module.fail_json(msg="Error opening {}.".format(item)) hier_options = yaml.load(open('roles/{}/vars/{}'.format( os_role, 'hierarchical_configuration_options.yml'))) hier_tags = yaml.load(open('roles/{}/vars/{}'.format( os_role, 'hierarchical_configuration_tags.yml'))) if os.path.isfile(running_config): running_hier = HConfig(hostname=hostame, os=operating_system, options=hier_options ) running_hier.load_from_file(running_config) else: module.fail_json(msg="Error opening {}.".format(running_config)) if os.path.isfile(compiled_config): compiled_hier = HConfig(hostname=hostame, os=operating_system, options=hier_options ) compiled_hier.load_from_file(compiled_config) else: module.fail_json(msg="Error opening {}.".format(compiled_config)) remediation_hier = compiled_hier.deep_diff_tree_with(running_hier) remediation_hier = running_hier.config_to_get_to(compiled_hier) remediation_hier.set_order_weight() remediation_hier.add_sectional_exiting() remediation_hier.add_tags(hier_tags) with open(remediation_config, 'w') as f: if config_tags: for line in remediation_hier.dump(): if line['tags'] in config_tags: f.write('{}\n'.format(line['text'])) else: for line in remediation_hier.all_children(): f.write('{}\n'.format(line.cisco_style_text())) with open(remediation_config) as f: remediation_config = f.read() results = dict() results['response'] = remediation_config if len(remediation_config) > 0: module.exit_json(changed=True, **results) else: module.exit_json(changed=False)