From 69f1bc37947077697a4e76a0edb2d67171c2a465 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Wed, 12 Mar 2014 13:20:34 -0400 Subject: [PATCH] fixing bugs --- planetstack/core/models/user.py | 2 +- .../observer/steps/sync_slice_deployments.py | 60 ++++++++++--------- .../observer/steps/sync_user_deployments.py | 22 ++++--- 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/planetstack/core/models/user.py b/planetstack/core/models/user.py index 62e5b91..9d0c2ec 100644 --- a/planetstack/core/models/user.py +++ b/planetstack/core/models/user.py @@ -156,7 +156,7 @@ class UserDeployments(PlCoreBase): deployment = models.ForeignKey(Deployment) kuser_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone user id") - def __unicode__(self): return u'%s %s %s' % (self.user, self.deployment.name) + def __unicode__(self): return u'%s %s' % (self.user, self.deployment.name) @staticmethod def select_by_user(user): diff --git a/planetstack/observer/steps/sync_slice_deployments.py b/planetstack/observer/steps/sync_slice_deployments.py index 0f92796..8c0374d 100644 --- a/planetstack/observer/steps/sync_slice_deployments.py +++ b/planetstack/observer/steps/sync_slice_deployments.py @@ -7,6 +7,7 @@ from planetstack.config import Config from observer.openstacksyncstep import OpenStackSyncStep from core.models.site import SiteDeployments from core.models.slice import Slice, SliceDeployments +from core.models.user import UserDeployments from util.logger import Logger, logging logger = Logger(level=logging.INFO) @@ -63,37 +64,42 @@ class SyncSliceDeployments(OpenStackSyncStep): slice_deployment.tenant_id = tenant.id # XXX give caller an admin role at the tenant they've created - driver.add_user_role(slice_deployment.slice.creator.kuser_id, tenant.id, 'admin') + deployment_users = UserDeployments.objects.filter(user=slice_deployment.slice.creator, + deployment=slice_deployment.deployment) + if not deployment_users or not deployment_users[0].kuser_id: + logger.info("slice createor %s has not accout at deployment %s" % (slice_deployment.slice.creator, slice_deployment.deployment.name) + else: + driver.add_user_role(slice_deployment.slice.creator.kuser_id, tenant.id, 'admin') - # refresh credentials using this tenant - client_driver = self.driver.client_driver(tenant=tenant.name, - deployment=slice_deployment.deployment.name) + # refresh credentials using this tenant + client_driver = self.driver.client_driver(tenant=tenant.name, + deployment=slice_deployment.deployment.name) - # create network - network = client_driver.create_network(slice.name) - slice_deployment.network_id = network['id'] + # create network + network = client_driver.create_network(slice.name) + slice_deployment.network_id = network['id'] - # create router - router = client_driver.create_router(slice.name) - slice_deployment.router_id = router['id'] + # create router + router = client_driver.create_router(slice.name) + slice_deployment.router_id = router['id'] - # create subnet for slice's private network - next_subnet = self.get_next_subnet(deployment=slice_deployment.deployment.name) - cidr = str(next_subnet.cidr) - ip_version = next_subnet.version - start = str(next_subnet[2]) - end = str(next_subnet[-2]) - subnet = client_driver.create_subnet(name=slice.name, - network_id = network['id'], - cidr_ip = cidr, - ip_version = ip_version, - start = start, - end = end) - slice_deployment.subnet_id = subnet['id'] - # add subnet as interface to slice's router - client_driver.add_router_interface(router['id'], subnet['id']) - # add external route - client_driver.add_external_route(subnet) + # create subnet for slice's private network + next_subnet = self.get_next_subnet(deployment=slice_deployment.deployment.name) + cidr = str(next_subnet.cidr) + ip_version = next_subnet.version + start = str(next_subnet[2]) + end = str(next_subnet[-2]) + subnet = client_driver.create_subnet(name=slice.name, + network_id = network['id'], + cidr_ip = cidr, + ip_version = ip_version, + start = start, + end = end) + slice_deployment.subnet_id = subnet['id'] + # add subnet as interface to slice's router + client_driver.add_router_interface(router['id'], subnet['id']) + # add external route + client_driver.add_external_route(subnet) if slice_deployment.id and slice_deployment.tenant_id: diff --git a/planetstack/observer/steps/sync_user_deployments.py b/planetstack/observer/steps/sync_user_deployments.py index e7454b8..25f5e02 100644 --- a/planetstack/observer/steps/sync_user_deployments.py +++ b/planetstack/observer/steps/sync_user_deployments.py @@ -1,10 +1,11 @@ import os import base64 +import hashlib from collections import defaultdict from django.db.models import F, Q from planetstack.config import Config from observer.openstacksyncstep import OpenStackSyncStep -from core.models.site import SiteDeployments +from core.models.site import SiteDeployments, Deployment from core.models.user import User, UserDeployments from util.logger import Logger, logging @@ -17,18 +18,25 @@ class SyncUserDeployments(OpenStackSyncStep): def fetch_pending(self): # user deployments are not visible to users. We must ensure # user are deployed at all deploymets available to their sites. - site_deployments = SiteDeployment.objects.all() + + deployments = Deployment.objects.all() + site_deployments = SiteDeployments.objects.all() site_deploy_lookup = defaultdict(list) for site_deployment in site_deployments: site_deploy_lookup[site_deployment.site].append(site_deployment.deployment) - user_deployments = UserDeployment.objects.all() + user_deployments = UserDeployments.objects.all() user_deploy_lookup = defaultdict(list) for user_deployment in user_deployments: user_deploy_lookup[user_deployment.user].append(user_deployment.deployment) for user in User.objects.all(): - expected_deployments = site_deploy_lookup[user.site] + if user.is_admin: + # admins should have an account at all deployments + expected_deployments = deployments + else: + # normal users should have an account at their site's deployments + expected_deployments = site_deploy_lookup[user.site] for expected_deployment in expected_deployments: if expected_deployment not in user_deploy_lookup[user]: ud = UserDeployments(user=user, deployment=expected_deployment) @@ -38,7 +46,7 @@ class SyncUserDeployments(OpenStackSyncStep): return UserDeployments.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None)) def sync_record(self, user_deployment): - logger.info("sync'ing user deployment %s" % user_deployment.name) + logger.info("sync'ing user %s at deployment %s" % (user_deployment.user, user_deployment.deployment.name)) name = user_deployment.user.email[:user_deployment.user.email.find('@')] user_fields = {'name': name, 'email': user_deployment.user.email, @@ -46,7 +54,7 @@ class SyncUserDeployments(OpenStackSyncStep): 'enabled': True} driver = self.driver.admin_driver(deployment=user_deployment.deployment.name) if not user_deployment.kuser_id: - keystone_user = self.driver.create_user(**user_fields) + keystone_user = driver.create_user(**user_fields) user_deployment.kuser_id = keystone_user.id else: driver.update_user(user_deployment.kuser_id, user_fields) @@ -67,7 +75,7 @@ class SyncUserDeployments(OpenStackSyncStep): driver.delete_user_role(user_deployment.kuser_id, tenant_id, 'admin') if user_deployment.user.public_key: - user_driver = self.driver.client_driver(caller=user, tenant=user.site.login_base, + user_driver = driver.client_driver(caller=user, tenant=user.site.login_base, deployment=user_deployment.deployment.name) key_fields = {'name': user_deployment.user.keyname, 'public_key': user_deployment.user.public_key} -- 2.43.0