class PortChannelTestCase(BaseFeatureCase): @mock.patch('pyhpecw7.comware.HPCOM7') def setUp(self, mock_device): self.device = mock_device self.rpc = Portchannel(self.device, R_GROUP_ID, 'routed') self.bpc = Portchannel(self.device, B_GROUP_ID, 'bridged') def test_init(self): self.assertEqual(self.rpc.pc_type, 'routed') self.assertEqual(self.bpc.pc_type, 'bridged') def test_get_portchannels(self): expected_get, get_reply = self.xml_get_and_reply('portchannel_list') self.device.get.return_value = get_reply expected = ['3', '100'] result = self.bpc.get_portchannels() self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') @mock.patch.object(Portchannel, 'get_lacp_mode_by_name') def test_get_config(self, mock_lacp_mode, mock_iface_from_index): mock_lacp_mode.return_value = 'active' iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel') self.device.get.return_value = get_reply expected = { 'min_ports': None, 'max_ports': None, 'lacp_modes_by_interface': [ { 'interface': 'FortyGigE1/0/1', 'lacp_mode': 'active' }, { 'interface': 'FortyGigE1/0/2', 'lacp_mode': 'active' } ], 'nc_groupid': '100', 'mode': 'static', 'members': [ 'FortyGigE1/0/1', 'FortyGigE1/0/2' ], 'lacp_edge': 'disabled', 'pc_index': '33736', 'groupid': '100' } result = self.bpc.get_config() self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') def test_all_members(self, mock_iface_from_index): iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel_all_members') self.device.get.return_value = get_reply expected = ['FortyGigE1/0/1', 'FortyGigE1/0/2'] result = self.bpc.get_all_members() self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') def test_all_members_ifindex(self, mock_iface_from_index): iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel_all_members') self.device.get.return_value = get_reply expected = ['1', '5'] result = self.bpc.get_all_members(list_type='ifindex') self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') def test_all_members_asdict(self, mock_iface_from_index): iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel_all_members') self.device.get.return_value = get_reply expected = {'FortyGigE1/0/2': '100', 'FortyGigE1/0/1': '100'} result = self.bpc.get_all_members(asdict=True) self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_lacp_mode_by_name_passive(self, mock_index_from_iface): mock_index_from_iface.return_value = '41' expected_get, get_reply = self.xml_get_and_reply('portchannel_lacp_mode_by_name_passive') self.device.get.return_value = get_reply expected = 'passive' result = self.bpc.get_lacp_mode_by_name('FortyGigE1/0/11') self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_lacp_mode_by_name_active(self, mock_index_from_iface): mock_index_from_iface.return_value = '1' expected_get, get_reply = self.xml_get_and_reply('portchannel_lacp_mode_by_name_active') self.device.get.return_value = get_reply expected = 'active' result = self.bpc.get_lacp_mode_by_name('FortyGigE1/0/1') self.assertEqual(result, expected) self.assert_get_request(expected_get) def test_interface_from_index(self): expected_get, get_reply = self.xml_get_and_reply('portchannel_interface_from_index') self.device.get.return_value = get_reply expected = 'FortyGigE1/0/11' result = self.bpc.get_interface_from_index('41') self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch('pyhpecw7.features.portchannel.Interface') def test_index_from_Interface(self, mock_iface): mock_iface.return_value.iface_index = '96' result = self.bpc.get_index_from_interface('FortyGigE1/0/1') self.assertEqual(result, '96') # check local caching mock_iface.return_value.iface_index = '1111' result = self.bpc.get_index_from_interface('FortyGigE1/0/1') self.assertEqual(result, '96') @mock.patch.object(Portchannel, 'get_index_from_interface') def test_add_lagg_member(self, mock_index_from_iface): mock_index_from_iface.return_value = '1' expected = self.read_config_xml('portchannel_lagg_member') result = self.bpc._add_lagg_member('FortyGigE1/0/1', lacp='active') self.assert_elements_equal(result, expected) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config(self, mock_index_from_iface): index_list = ['1', '5'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen expected_call = self.read_config_xml('portchannel_basic') self.bpc._build_config('present', members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.assert_config_request(expected_call) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config_stage(self, mock_index_from_iface): index_list = ['1', '5'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen expected_call = self.read_config_xml('portchannel_basic') self.bpc._build_config('present', stage=True, members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.assert_stage_request(expected_call, 'edit_config') @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config_remove_members(self, mock_index_from_iface): index_list = ['1', '5', '9'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen self.bpc.members_to_remove = ['FortyGigE1/0/3'] expected_call = self.read_config_xml('portchannel_basic_remove_members') self.bpc._build_config('present', members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.assert_config_request(expected_call) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config_change_lacp(self, mock_index_from_iface): index_list = ['1', '5', '9'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen self.bpc.desired_lacp_mode = 'bridged' expected_call = self.read_config_xml('portchannel_change_lacp') self.bpc._build_config('present', members=['FortyGigE1/0/1', 'FortyGigE1/0/2'], lacp_to_change=['FortyGigE1/0/1']) self.assert_config_request(expected_call) def test_build_config_no_members(self): expected_call = self.read_config_xml('portchannel_no_members') self.bpc._build_config('present') self.assert_config_request(expected_call) def test_build_config_remove(self): expected_call = self.read_config_xml('portchannel_remove') self.bpc._build_config('absent') self.assert_config_request(expected_call) def test_build_config_min_max(self): expected_xml_call = self.read_config_xml('portchannel_no_members') expected_cli_call = ['interface Bridge-Aggregation 100', 'link-aggregation selected-port minimum 2', 'link-aggregation selected-port maximum 8'] self.bpc._build_config('present', min_ports='2', max_ports='8') self.assert_config_request(expected_xml_call) self.bpc.device.cli_config.assert_called_with(expected_cli_call) @mock.patch.object(Portchannel, '_build_config') def test_build(self, mock_build_config): kwargs = dict(members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.bpc.build(**kwargs) mock_build_config.assert_called_with(state='present', stage=False, **kwargs) @mock.patch.object(Portchannel, '_build_config') def test_remove(self, mock_build_config): self.bpc.remove() mock_build_config.assert_called_with(state='absent', stage=False) @mock.patch('pyhpecw7.features.portchannel.Interface') @mock.patch.object(Portchannel, 'get_all_members') def test_param_check(self, mock_get_all_members, mock_iface): mock_iface.return_value.get_config.return_value = {'type': 'bridged'} mock_get_all_members.return_value = {'FortyGigE1/0/1': B_GROUP_ID} self.bpc.param_check(members=['FortyGigE1/0/1']) mock_iface.return_value.get_config.return_value = {'type': 'routed'} with self.assertRaises(InvalidPortType): self.bpc.param_check(members=['FortyGigE1/0/1']) mock_iface.return_value.get_config.return_value = {'type': 'bridged'} mock_get_all_members.return_value = {'FortyGigE1/0/1': '300'} with self.assertRaises(AggregationGroupError): self.bpc.param_check(members=['FortyGigE1/0/1'])
def main(): module = AnsibleModule( argument_spec=dict( name=dict(required=True), link_type=dict(required=True, choices=['access', 'trunk']), pvid=dict(type='str'), permitted_vlans=dict(type='str'), state=dict(choices=['present', 'default'], default='present'), hostname=dict(required=True), username=dict(required=True), password=dict(required=True), port=dict(type='int', default=830) ), supports_check_mode=True ) if not HAS_PYHP: safe_fail(module, msg='There was a problem loading from the pyhpecw7 module') filtered_keys = ('state', 'hostname', 'username', 'password', 'port', 'CHECKMODE', 'name') hostname = socket.gethostbyname(module.params['hostname']) username = module.params['username'] password = module.params['password'] port = module.params['port'] device = HPCOM7(host=hostname, username=username, password=password, port=port) name = module.params['name'] state = module.params['state'] changed = False if state == 'present': if module.params.get('link_type') == 'access': if module.params.get('permitted_vlans'): safe_fail(module, msg='Access interfaces don\'t take' + ' permitted vlan lists.') try: device.open() except ConnectionError as e: safe_fail(module, device, msg=str(e), descr='Error opening connection to device.') # Make sure vlan exists pvid = module.params.get('pvid') if pvid and state != 'default': try: vlan = Vlan(device, pvid) if not vlan.get_config(): safe_fail(module, device, msg='Vlan {0} does not exist,'.format(pvid) + ' Use vlan module to create it.') except PYHPError as e: module.fail_json(msg=str(e), descr='Error initializing Vlan object' + ' or getting current vlan config.') # Make sure port is not part of port channel try: portchannel = Portchannel(device, '99', 'bridged') pc_list = portchannel.get_all_members() except PYHPError as e: module.fail_json(msg=str(e), descr='Error getting port channel information.') if name in pc_list: safe_fail(module, device, msg='{0} is currently part of a port channel.'.format(name) + ' Changes should be made to the port channel interface.') try: switchport = Switchport(device, name) except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error initialzing Switchport object.') # Make sure interface exists and is ethernet if not switchport.interface.iface_exists: safe_fail(module, device, msg='{0} doesn\'t exist on the device.'.format(name)) # Make sure interface is in bridged mode try: if_info = switchport.interface.get_config() except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error getting current interface config.') if if_info.get('type') != 'bridged': safe_fail(module, device, msg='{0} is not in bridged mode.'.format(name) + ' Please use the interface module to change that.') try: existing = switchport.get_config() except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error getting switchpot config.') proposed = dict((k, v) for k, v in module.params.items() if v is not None and k not in filtered_keys) if state == 'present': delta = dict(set(proposed.items()) - set(existing.items())) if delta: delta['link_type'] = proposed.get('link_type') pvid = proposed.get('pvid') if pvid: delta['pvid'] = pvid switchport.build(stage=True, **delta) elif state == 'default': defaults = switchport.get_default() delta = dict(set(existing.items()) - set(defaults.items())) if delta: switchport.default(stage=True) commands = None end_state = existing if device.staged: commands = device.staged_to_string() if module.check_mode: safe_exit(module, device, changed=True, commands=commands) else: try: device.execute_staged() end_state = switchport.get_config() except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error during command execution.') changed = True results = {} results['proposed'] = proposed results['existing'] = existing results['state'] = state results['commands'] = commands results['changed'] = changed results['end_state'] = end_state safe_exit(module, device, **results)
class PortChannelTestCase(BaseFeatureCase): @mock.patch('pyhpecw7.comware.HPCOM7') def setUp(self, mock_device): self.device = mock_device self.rpc = Portchannel(self.device, R_GROUP_ID, 'routed') self.bpc = Portchannel(self.device, B_GROUP_ID, 'bridged') def test_init(self): self.assertEqual(self.rpc.pc_type, 'routed') self.assertEqual(self.bpc.pc_type, 'bridged') def test_get_portchannels(self): expected_get, get_reply = self.xml_get_and_reply('portchannel_list') self.device.get.return_value = get_reply expected = ['3', '100'] result = self.bpc.get_portchannels() self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') @mock.patch.object(Portchannel, 'get_lacp_mode_by_name') def test_get_config(self, mock_lacp_mode, mock_iface_from_index): mock_lacp_mode.return_value = 'active' iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel') self.device.get.return_value = get_reply expected = { 'min_ports': None, 'max_ports': None, 'lacp_modes_by_interface': [ { 'interface': 'FortyGigE1/0/1', 'lacp_mode': 'active' }, { 'interface': 'FortyGigE1/0/2', 'lacp_mode': 'active' } ], 'nc_groupid': '100', 'mode': 'static', 'members': [ 'FortyGigE1/0/1', 'FortyGigE1/0/2' ], 'lacp_edge': 'disabled', 'pc_index': '33736', 'groupid': '100' } result = self.bpc.get_config() self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') def test_all_members(self, mock_iface_from_index): iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel_all_members') self.device.get.return_value = get_reply expected = ['FortyGigE1/0/1', 'FortyGigE1/0/2'] result = self.bpc.get_all_members() self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') def test_all_members_ifindex(self, mock_iface_from_index): iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel_all_members') self.device.get.return_value = get_reply expected = ['1', '5'] result = self.bpc.get_all_members(list_type='ifindex') self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_interface_from_index') def test_all_members_asdict(self, mock_iface_from_index): iface_list = ['FortyGigE1/0/2', 'FortyGigE1/0/1'] def mock_iface_gen(self): return iface_list.pop() mock_iface_from_index.side_effect = mock_iface_gen expected_get, get_reply = self.xml_get_and_reply('portchannel_all_members') self.device.get.return_value = get_reply expected = {'FortyGigE1/0/2': '100', 'FortyGigE1/0/1': '100'} result = self.bpc.get_all_members(asdict=True) self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_lacp_mode_by_name_passive(self, mock_index_from_iface): mock_index_from_iface.return_value = '41' expected_get, get_reply = self.xml_get_and_reply('portchannel_lacp_mode_by_name_passive') self.device.get.return_value = get_reply expected = 'passive' result = self.bpc.get_lacp_mode_by_name('FortyGigE1/0/11') self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_lacp_mode_by_name_active(self, mock_index_from_iface): mock_index_from_iface.return_value = '1' expected_get, get_reply = self.xml_get_and_reply('portchannel_lacp_mode_by_name_active') self.device.get.return_value = get_reply expected = 'active' result = self.bpc.get_lacp_mode_by_name('FortyGigE1/0/1') self.assertEqual(result, expected) self.assert_get_request(expected_get) def test_interface_from_index(self): expected_get, get_reply = self.xml_get_and_reply('portchannel_interface_from_index') self.device.get.return_value = get_reply expected = 'FortyGigE1/0/11' result = self.bpc.get_interface_from_index('41') self.assertEqual(result, expected) self.assert_get_request(expected_get) @mock.patch('pyhpecw7.features.portchannel.Interface') def test_index_from_Interface(self, mock_iface): mock_iface.return_value.iface_index = '96' result = self.bpc.get_index_from_interface('FortyGigE1/0/1') self.assertEqual(result, '96') # check local caching mock_iface.return_value.iface_index = '1111' result = self.bpc.get_index_from_interface('FortyGigE1/0/1') self.assertEqual(result, '96') @mock.patch.object(Portchannel, 'get_index_from_interface') def test_add_lagg_member(self, mock_index_from_iface): mock_index_from_iface.return_value = '1' expected = self.read_config_xml('portchannel_lagg_member') result = self.bpc._add_lagg_member('FortyGigE1/0/1', lacp='active') self.assert_elements_equal(result, expected) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config(self, mock_index_from_iface): index_list = ['1', '5'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen expected_call = self.read_config_xml('portchannel_basic') self.bpc._build_config('present', members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.assert_config_request(expected_call) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config_stage(self, mock_index_from_iface): index_list = ['1', '5'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen expected_call = self.read_config_xml('portchannel_basic') self.bpc._build_config('present', stage=True, members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.assert_stage_request(expected_call, 'edit_config') @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config_remove_members(self, mock_index_from_iface): index_list = ['1', '5', '9'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen self.bpc.members_to_remove = ['FortyGigE1/0/3'] expected_call = self.read_config_xml('portchannel_basic_remove_members') self.bpc._build_config('present', members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.assert_config_request(expected_call) @mock.patch.object(Portchannel, 'get_index_from_interface') def test_build_config_change_lacp(self, mock_index_from_iface): index_list = ['1', '5', '9'] def mock_index_gen(interface): return index_list.pop(0) mock_index_from_iface.side_effect = mock_index_gen self.bpc.desired_lacp_mode = 'bridged' expected_call = self.read_config_xml('portchannel_change_lacp') self.bpc._build_config('present', members=['FortyGigE1/0/1', 'FortyGigE1/0/2'], lacp_to_change=['FortyGigE1/0/1']) self.assert_config_request(expected_call) def test_build_config_no_members(self): expected_call = self.read_config_xml('portchannel_no_members') self.bpc._build_config('present') self.assert_config_request(expected_call) def test_build_config_remove(self): expected_call = self.read_config_xml('portchannel_remove') self.bpc._build_config('absent') self.assert_config_request(expected_call) def test_build_config_min_max(self): expected_xml_call = self.read_config_xml('portchannel_no_members') expected_cli_call = ['interface Bridge-Aggregation 100', 'link-aggregation selected-port minimum 2', 'link-aggregation selected-port maximum 8'] self.bpc._build_config('present', min_ports='2', max_ports='8') self.assert_config_request(expected_xml_call) self.bpc.device.cli_config.assert_called_with(expected_cli_call) @mock.patch.object(Portchannel, '_build_config') def test_build(self, mock_build_config): kwargs = dict(members=['FortyGigE1/0/1', 'FortyGigE1/0/2']) self.bpc.build(**kwargs) mock_build_config.assert_called_with(state='present', stage=False, **kwargs) @mock.patch.object(Portchannel, '_build_config') def test_remove(self, mock_build_config): self.bpc.remove() mock_build_config.assert_called_with(state='absent', stage=False) @mock.patch('pyhpecw7.features.portchannel.Interface') @mock.patch.object(Portchannel, 'get_all_members') def test_param_check(self, mock_get_all_members, mock_iface): mock_iface.return_value.get_config.return_value = {'type': 'bridged'} mock_get_all_members.return_value = {'FortyGigE1/0/1': B_GROUP_ID} self.bpc.param_check(members=['FortyGigE1/0/1']) mock_iface.return_value.get_config.return_value = {'type': 'routed'} with self.assertRaises(InvalidPortType): self.bpc.param_check(members=['FortyGigE1/0/1']) mock_iface.return_value.get_config.return_value = {'type': 'bridged'} mock_get_all_members.return_value = {'FortyGigE1/0/1': '300'} with self.assertRaises(AggregationGroupError): self.bpc.param_check(members=['FortyGigE1/0/1'])
def main(): module = AnsibleModule( argument_spec=dict( name=dict(required=True), link_type=dict(required=True, choices=['access', 'trunk']), pvid=dict(type='str'), permitted_vlans=dict(type='str'), state=dict(choices=['present', 'default'], default='present'), hostname=dict(required=True), username=dict(required=True), password=dict(required=True), port=dict(type='int', default=830) ), supports_check_mode=True ) if not HAS_PYHP: safe_fail(module, msg='There was a problem loading from the pyhpecw7 module') filtered_keys = ('state', 'hostname', 'username', 'password', 'port', 'CHECKMODE', 'name') hostname = socket.gethostbyname(module.params['hostname']) username = module.params['username'] password = module.params['password'] port = module.params['port'] device = HPCOM7(host=hostname, username=username, password=password, port=port) name = module.params['name'] state = module.params['state'] changed = False if state == 'present': if module.params.get('link_type') == 'access': if module.params.get('permitted_vlans'): safe_fail(module, msg='Access interfaces don\'t take' + ' permitted vlan lists.') try: device.open() except ConnectionError as e: safe_fail(module, device, msg=str(e), descr='Error opening connection to device.') # Make sure vlan exists pvid = module.params.get('pvid') if pvid and state != 'default': try: vlan = Vlan(device, pvid) if not vlan.get_config(): safe_fail(module, device, msg='Vlan {0} does not exist,'.format(pvid) + ' Use vlan module to create it.') except PYHPError as e: module.fail_json(msg=str(e), descr='Error initializing Vlan object' + ' or getting current vlan config.') # Make sure port is not part of port channel try: portchannel = Portchannel(device, '99', 'bridged') pc_list = portchannel.get_all_members() except PYHPError as e: module.fail_json(msg=str(e), descr='Error getting port channel information.') if name in pc_list: safe_fail(module, device, msg='{0} is currently part of a port channel.'.format(name) + ' Changes should be made to the port channel interface.') try: switchport = Switchport(device, name) except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error initialzing Switchport object.') # Make sure interface exists and is ethernet if not switchport.interface.iface_exists: safe_fail(module, device, msg='{0} doesn\'t exist on the device.'.format(name)) # Make sure interface is in bridged mode try: if_info = switchport.interface.get_config() except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error getting current interface config.') if if_info.get('type') != 'bridged': safe_fail(module, device, msg='{0} is not in bridged mode.'.format(name) + ' Please use the interface module to change that.') try: existing = switchport.get_config() except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error getting switchpot config.') proposed = dict((k, v) for k, v in module.params.iteritems() if v is not None and k not in filtered_keys) if state == 'present': delta = dict(set(proposed.iteritems()).difference( existing.iteritems())) if delta: delta['link_type'] = proposed.get('link_type') pvid = proposed.get('pvid') if pvid: delta['pvid'] = pvid switchport.build(stage=True, **delta) elif state == 'default': defaults = switchport.get_default() delta = dict(set(existing.iteritems()).difference( defaults.iteritems())) if delta: switchport.default(stage=True) commands = None end_state = existing if device.staged: commands = device.staged_to_string() if module.check_mode: safe_exit(module, device, changed=True, commands=commands) else: try: device.execute_staged() end_state = switchport.get_config() except PYHPError as e: safe_fail(module, device, msg=str(e), descr='Error during command execution.') changed = True results = {} results['proposed'] = proposed results['existing'] = existing results['state'] = state results['commands'] = commands results['changed'] = changed results['end_state'] = end_state safe_exit(module, device, **results)