From a5f7647e2ae1aa4065e70b2ba9e65d57ddfbb6ab Mon Sep 17 00:00:00 2001
From: Tony Mack <tmack@paris.CS.Princeton.EDU>
Date: Sat, 9 Mar 2013 18:29:33 -0500
Subject: [PATCH] added refresh()

---
 PLC/Sites.py | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/PLC/Sites.py b/PLC/Sites.py
index a223b4b6..981a598a 100644
--- a/PLC/Sites.py
+++ b/PLC/Sites.py
@@ -56,6 +56,20 @@ class Site(AlchemyObj):
         last_updated = datetime.now()
         return last_updated
 
+    def validate_login_base(self, login_base):
+        if not len(login_base):
+            raise PLCInvalidArgument, "Login base must be specified"
+
+        if not set(login_base).issubset(string.lowercase + string.digits):
+            raise PLCInvalidArgument, "Login base must consist only of lowercase ASCII letters or numbers"
+
+        conflicts = Site().select(filter={'login_base': login_base})  
+        for site in conflicts:
+            if 'site_id' not in self or self['site_id'] != site.site_id:
+                raise PLCInvalidArgument, "login_base already in use"
+
+        return login_base
+
     def add_person(self, person_filter, role_name=None):
         assert 'site_id' in self
         assert 'tenant_id' in self
@@ -158,6 +172,7 @@ class Sites(list):
 
     def __init__(self, api, site_filter = None, columns = None):
         self.api = api 
+        self.refresh(api)
         if not site_filter:
             sites = Site().select() 
         elif isinstance(site_filter, int):
@@ -200,3 +215,29 @@ class Sites(list):
                 site['site_tag_ids'] = [rec.tag_id for rec in site_tags]
 
             self.append(site)
+
+    def refresh(self, api):
+        """
+        Import tenants from keystone.
+        """
+        # get current sites
+        sites = Site().select()
+        login_bases = [site['login_base'] for site in sites]
+
+        # get current tenants
+        tenants = api.client_shell.keystone.tenants.list()
+
+        # add tenants that dont already exist
+        for tenant in tenants:
+            # site tenants should not contain '_'
+            if '_' not in tenant.name and tenant.name not in login_bases:
+                description = tenant.description
+                if not description: description  = tenant.name  
+                site = Site(api, {'login_base': tenant.name,
+                                  'tenant_id': tenant.id,
+                                  'enabled': tenant.enabled,
+                                  'description': description
+                                  'name': tenant.name,
+                                  'abbreviated_name': tenant.name,
+                                  'is_public': True})
+                site.sync()
-- 
2.47.0