def delete_subnet(self, ib_network=None): """Frees up resources taken by the subnet and removes the subnet. Resources to be released are - DHCP/DNS members are freed if not shared by other subnet(s). - Network view mapping is removed. - Authority member is not freed up for GM but taken care by the agent since it is hard to determine at the subnet scope. """ session = self.ib_cxt.context.session subnet = self.ib_cxt.subnet network = self.ib_cxt.network network_view = self.ib_cxt.mapping.network_view network_id = network.get('id') subnet_id = subnet.get('id') cidr = subnet.get('cidr') # subnet id is already gone since community plugin already called # subnet delete in db level by the time ipam driver reaches here. dbi.dissociate_network_view(session, network_id, subnet_id) subnet_deletable = (not self.ib_cxt.network_is_shared_or_external or self.grid_config.admin_network_deletion) if subnet_deletable: ib_ipv4_networks = ib_objects.NetworkV4.search_all( self.ib_cxt.connector, network_view=network_view) ib_ipv6_networks = ib_objects.NetworkV6.search_all( self.ib_cxt.connector, network_view=network_view) is_last_subnet_in_netview = (len(ib_ipv4_networks) + len(ib_ipv6_networks)) == 1 self._release_service_members(is_last_subnet_in_netview) # delete ib network self.ib_cxt.ibom.delete_network(network_view, cidr) # if no more network exists, remove network view if is_last_subnet_in_netview: self._remove_network_view() self._restart_services() else: eam.reset_ea_for_network(ib_network) ib_network.update() ib_ranges = ib_objects.IPRange.search_all( self.ib_cxt.connector, network_view=network_view, network=cidr) for ib_range in ib_ranges: eam.reset_ea_for_range(ib_range) ib_range.update()
def delete_subnet(self, ib_network=None): """Frees up resources taken by the subnet and removes the subnet. Resources to be released are - DHCP/DNS members are freed if not shared by other subnet(s). - Network view mapping is removed. - Authority member is not freed up for GM but taken care by the agent since it is hard to determine at the subnet scope. """ session = self.ib_cxt.context.session subnet = self.ib_cxt.subnet network = self.ib_cxt.network network_view = self.ib_cxt.mapping.network_view network_id = network.get('id') subnet_id = subnet.get('id') cidr = subnet.get('cidr') # subnet id is already gone since community plugin already called # subnet delete in db level by the time ipam driver reaches here. dbi.dissociate_network_view(session, network_id, subnet_id) subnet_deletable = (not self.ib_cxt.network_is_shared_or_external or self.grid_config.admin_network_deletion) if subnet_deletable: ib_ipv4_networks = ib_objects.NetworkV4.search_all( self.ib_cxt.connector, network_view=network_view) ib_ipv6_networks = ib_objects.NetworkV6.search_all( self.ib_cxt.connector, network_view=network_view) is_last_subnet_in_netview = (len(ib_ipv4_networks) + len(ib_ipv6_networks)) == 1 self._release_service_members(is_last_subnet_in_netview) # delete ib network self.ib_cxt.ibom.delete_network(network_view, cidr) # if no more network exists, remove network view if is_last_subnet_in_netview: self._remove_network_view() self._restart_services() else: eam.reset_ea_for_network(ib_network) ib_network.update() ib_ranges = ib_objects.IPRange.search_all( self.ib_cxt.connector, network_view=network_view, network=cidr) for ib_range in ib_ranges: eam.reset_ea_for_range(ib_range) ib_range.update()
def test_reset_ea_for_network(self): network_ea = {'CMP Type': {'value': 'OpenStack'}, 'Cloud API Owned': {'value': 'True'}, 'Tenant ID': {'value': 'test-id'}, 'Tenant Name': {'value': 'tenant-name'}, 'Account': {'value': 'admin'}, 'Is External': {'value': 'False'}, 'Is Shared': {'value': 'True'}, 'Network ID': {'value': 'True'}, 'Network Name': {'value': 'True'}, 'Subnet ID': {'value': 'True'}, 'Subnet Name': {'value': 'True'}, 'Network Encap': {'value': 'gre'}, 'Segmentation ID': {'value': 'segmentation-id'}, 'Physical Network Name': {'value': 'physical-network'}} ib_network_ea = ib_objects.EA.from_dict(network_ea) ib_network_mock = mock.Mock(extattrs=ib_network_ea) ea_manager.reset_ea_for_network(ib_network_mock) expected_ea = {'Cloud API Owned': {'value': 'N/A'}, 'CMP Type': {'value': 'N/A'}, 'Tenant ID': {'value': 'N/A'}} ib_network_mock.extattrs.ea_dict == expected_ea
def test_reset_ea_for_network(self): network_ea = { 'CMP Type': { 'value': 'OpenStack' }, 'Cloud API Owned': { 'value': 'True' }, 'Tenant ID': { 'value': 'test-id' }, 'Tenant Name': { 'value': 'tenant-name' }, 'Account': { 'value': 'admin' }, 'Is External': { 'value': 'False' }, 'Is Shared': { 'value': 'True' }, 'Network ID': { 'value': 'True' }, 'Network Name': { 'value': 'True' }, 'Subnet ID': { 'value': 'True' }, 'Subnet Name': { 'value': 'True' }, 'Network Encap': { 'value': 'gre' }, 'Segmentation ID': { 'value': 'segmentation-id' }, 'Physical Network Name': { 'value': 'physical-network' } } ib_network_ea = ib_objects.EA.from_dict(network_ea) ib_network_mock = mock.Mock(extattrs=ib_network_ea) ea_manager.reset_ea_for_network(ib_network_mock) expected_ea = { 'Cloud API Owned': { 'value': 'N/A' }, 'CMP Type': { 'value': 'N/A' }, 'Tenant ID': { 'value': 'N/A' } } ib_network_mock.extattrs.ea_dict == expected_ea