X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fopenstack_observer%2Fsteps%2Fsync_network_deployments.py;h=0312f3ac29dee29299a276f51344c918ec17f7d7;hb=10a9cef6e86ca9b8e516fa89364e96f232c28c91;hp=c776ff149e2ec3697b8c3321140ffd47ed6575be;hpb=881f62e9595dbeda783f46ac52916a22ad6f821c;p=plstackapi.git diff --git a/planetstack/openstack_observer/steps/sync_network_deployments.py b/planetstack/openstack_observer/steps/sync_network_deployments.py index c776ff1..0312f3a 100644 --- a/planetstack/openstack_observer/steps/sync_network_deployments.py +++ b/planetstack/openstack_observer/steps/sync_network_deployments.py @@ -13,42 +13,20 @@ from util.logger import Logger, logging logger = Logger(level=logging.INFO) class SyncNetworkDeployments(OpenStackSyncStep): - requested_interval = 0 + requested_interval = 0 provides=[Network, NetworkDeployments, Sliver] - + def fetch_pending(self, deleted): if (deleted): return NetworkDeployments.deleted_objects.all() else: - # network deployments are not visible to users. We must ensure - # networks are deployed at all deploymets available to their slices. - slice_deployments = SliceDeployments.objects.all() - slice_deploy_lookup = defaultdict(list) - for slice_deployment in slice_deployments: - slice_deploy_lookup[slice_deployment.slice].append(slice_deployment.deployment) - - network_deployments = NetworkDeployments.objects.all() - network_deploy_lookup = defaultdict(list) - for network_deployment in network_deployments: - network_deploy_lookup[network_deployment.network].append(network_deployment.deployment) - - for network in Network.objects.filter(): - # ignore networks that have - # template.visibility = private and translation = none - if network.template.visibility == 'private' and not network.template.translation == 'none': - continue - expected_deployments = slice_deploy_lookup[network.owner] - for expected_deployment in expected_deployments: - if network not in network_deploy_lookup or \ - expected_deployment not in network_deploy_lookup[network]: - nd = NetworkDeployments(network=network, deployment=expected_deployment) - nd.save() return NetworkDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) def get_next_subnet(self, deployment=None): # limit ourself to 10.0.x.x for now valid_subnet = lambda net: net.startswith('10.0') - driver = self.driver.admin_driver(deployment=deployment) + + driver = self.driver.admin_driver(deployment=deployment,tenant='admin') subnets = driver.shell.quantum.list_subnets()['subnets'] ints = [int(IPNetwork(subnet['cidr']).ip) for subnet in subnets \ if valid_subnet(subnet['cidr'])] @@ -62,8 +40,19 @@ class SyncNetworkDeployments(OpenStackSyncStep): return next_network def save_network_deployment(self, network_deployment): - if not network_deployment.network_id and network_deployment.network.template.sharedNetworkName: - network_deployment.network_id = network_deployment.network.template.sharedNetworkId + if (not network_deployment.net_id) and network_deployment.network.template.sharedNetworkName: + # It's a shared network, try to find the shared network id + + quantum_networks = self.driver.shell.quantum.list_networks(name=network_deployment.network.template.sharedNetworkName)["networks"] + if quantum_networks: + logger.info("set shared network id %s" % quantum_networks[0]["id"]) + network_deployment.net_id = quantum_networks[0]["id"] + else: + logger.info("failed to find shared network id for deployment") + return + + # At this point, it must be a private network, so create it if it does + # not exist. if not network_deployment.net_id: network_name = network_deployment.network.name @@ -95,29 +84,43 @@ class SyncNetworkDeployments(OpenStackSyncStep): # add external route #self.driver.add_external_route(subnet) logger.info("created private subnet (%s) for network: %s" % (cidr, network_deployment.network)) - else: + + # Now, figure out the subnet and subnet_id for the network. This works + # for both private and shared networks. + + if (not network_deployment.subnet_id) or (not network_deployment.subnet): (network_deployment.subnet_id, network_deployment.subnet) = self.driver.get_network_subnet(network_deployment.net_id) logger.info("sync'ed subnet (%s) for network: %s" % (network_deployment.subnet, network_deployment.network)) + if (not network_deployment.subnet): + # this will generate a non-null database constraint error + # ... which in turn leads to transaction errors + # it's probably caused by networks that no longer exist at the + # quantum level. + + logger.info("null subnet for network %s, skipping save" % network_deployment.network) + return + network_deployment.save() def sync_record(self, network_deployment): + if not network_deployment.deployment.admin_user: + logger.info("deployment %r has no admin_user, skipping" % network_deployment.deployment) + return + + self.driver = self.driver.admin_driver(deployment=network_deployment.deployment,tenant='admin') if network_deployment.network.owner and network_deployment.network.owner.creator: try: # update manager context - real_driver = self.driver - self.driver = self.driver.client_driver(caller=network_deployment.network.owner.creator, - tenant=network_deployment.network.owner.name, - deployment=network_deployment.deployment.name) + # Bring back self.save_network_deployment(network_deployment) - self.driver = real_driver logger.info("saved network deployment: %s" % (network_deployment)) except Exception,e: logger.log_exc("save network deployment failed: %s" % network_deployment) - raise e - - - def delete_record(self, network_deployment): + raise e + + + def delete_record(self, network_deployment): driver = OpenStackDriver().client_driver(caller=network_deployment.network.owner.creator, tenant=network_deployment.network.owner.name, deployment=network_deployment.deployment.name)