def update_network_state(network): """Update the state of a Network based on BackendNetwork states. Update the state of a Network based on the operstate of the networks in the backends that network exists. The state of the network is: * ACTIVE: If it is 'ACTIVE' in at least one backend. * DELETED: If it is is 'DELETED' in all backends that have been created. This function also releases the resources (MAC prefix or Bridge) and the quotas for the network. """ if network.deleted: # Network has already been deleted. Just assert that state is also # DELETED if not network.state == "DELETED": network.state = "DELETED" network.save() return backend_states = [s.operstate for s in network.backend_networks.all()] if not backend_states and network.action != "DESTROY": if network.state != "ACTIVE": network.state = "ACTIVE" network.save() return # Network is deleted when all BackendNetworks go to "DELETED" operstate deleted = reduce(lambda x, y: x == y and "DELETED", backend_states, "DELETED") # Release the resources on the deletion of the Network if deleted: log.info("Network %r deleted. Releasing link %r mac_prefix %r", network.id, network.mac_prefix, network.link) network.deleted = True network.state = "DELETED" if network.mac_prefix: if network.FLAVORS[network.flavor]["mac_prefix"] == "pool": release_resource(res_type="mac_prefix", value=network.mac_prefix) if network.link: if network.FLAVORS[network.flavor]["link"] == "pool": release_resource(res_type="bridge", value=network.link) # Issue commission if network.userid: quotas.issue_and_accept_commission(network, delete=True) # the above has already saved the object and committed; # a second save would override others' changes, since the # object is now unlocked return elif not network.public: log.warning("Network %s does not have an owner!", network.id) network.save()
def update_network_state(network): """Update the state of a Network based on BackendNetwork states. Update the state of a Network based on the operstate of the networks in the backends that network exists. The state of the network is: * ACTIVE: If it is 'ACTIVE' in at least one backend. * DELETED: If it is is 'DELETED' in all backends that have been created. This function also releases the resources (MAC prefix or Bridge) and the quotas for the network. """ if network.deleted: # Network has already been deleted. Just assert that state is also # DELETED if not network.state == "DELETED": network.state = "DELETED" network.save() return backend_states = [s.operstate for s in network.backend_networks.all()] if not backend_states and network.action != "DESTROY": if network.state != "ACTIVE": network.state = "ACTIVE" network.save() return # Network is deleted when all BackendNetworks go to "DELETED" operstate deleted = reduce(lambda x, y: x == y and "DELETED", backend_states, "DELETED") # Release the resources on the deletion of the Network if deleted: log.info("Network %r deleted. Releasing link %r mac_prefix %r", network.id, network.mac_prefix, network.link) network.deleted = True network.state = "DELETED" if network.mac_prefix: if network.FLAVORS[network.flavor]["mac_prefix"] == "pool": release_resource(res_type="mac_prefix", value=network.mac_prefix) if network.link: if network.FLAVORS[network.flavor]["link"] == "pool": release_resource(res_type="bridge", value=network.link) # Issue commission if network.userid: quotas.issue_and_accept_commission(network, delete=True) elif not network.public: log.warning("Network %s does not have an owner!", network.id) network.save()
def update_network_state(network): """Update the state of a Network based on BackendNetwork states. Update the state of a Network based on the operstate of the networks in the backends that network exists. The state of the network is: * ACTIVE: If it is 'ACTIVE' in at least one backend. * DELETED: If it is is 'DELETED' in all backends that have been created. This function also releases the resources (MAC prefix or Bridge) and the quotas for the network. """ if network.deleted: # Network has already been deleted. Just assert that state is also # DELETED if not network.state == "DELETED": network.state = "DELETED" network.save() return backend_states = [s.operstate for s in network.backend_networks.all()] if not backend_states and network.action != "DESTROY": if network.state != "ACTIVE": network.state = "ACTIVE" network.save() return # Network is deleted when all BackendNetworks go to "DELETED" operstate deleted = reduce(lambda x, y: x == y and "DELETED", backend_states, "DELETED") # Release the resources on the deletion of the Network if deleted: if network.ips.filter(deleted=False, floating_ip=True).exists(): msg = "Cannot delete network %s! Floating IPs still in use!" log.error(msg % network) raise Exception(msg % network) log.info("Network %r deleted. Releasing link %r mac_prefix %r", network.id, network.mac_prefix, network.link) network.deleted = True network.state = "DELETED" # Undrain the network, otherwise the network state will remain # as 'SNF:DRAINED' network.drained = False if network.mac_prefix: if network.FLAVORS[network.flavor]["mac_prefix"] == "pool": release_resource(res_type="mac_prefix", value=network.mac_prefix) if network.link: if network.FLAVORS[network.flavor]["link"] == "pool": release_resource(res_type="bridge", value=network.link) # Set all subnets as deleted network.subnets.update(deleted=True) # And delete the IP pools for subnet in network.subnets.all(): if subnet.ipversion == 4: subnet.ip_pools.all().delete() # And all the backend networks since there are useless network.backend_networks.all().delete() # Issue commission if network.userid: quotas.issue_and_accept_commission(network, action="DESTROY") # the above has already saved the object and committed; # a second save would override others' changes, since the # object is now unlocked return elif not network.public: log.warning("Network %s does not have an owner!", network.id) network.save()