python3 - 2to3 + miscell obvious tweaks
[sfa.git] / sfa / rspecs / elements / versions / pgv2Services.py
index fe946b3..f2b1573 100644 (file)
@@ -1,65 +1,66 @@
-from lxml import etree
-from sfa.util.plxrn import PlXrn
-from sfa.util.xrn import Xrn
-from sfa.rspecs.elements.execute import Execute  
-from sfa.rspecs.elements.install import Install  
+from sfa.rspecs.elements.element import Element
+from sfa.rspecs.elements.execute import Execute
+from sfa.rspecs.elements.install import Install
+from sfa.rspecs.elements.services import ServicesElement
 from sfa.rspecs.elements.login import Login
-from sfa.rspecs.rspec_elements import RSpecElement, RSpecElements
+
 
 class PGv2Services:
-    elements = {
-        'services': RSpecElement(RSpecElements.SERVICES, '//default:services | //services'),
-        'install': RSpecElement(RSpecElements.INSTALL, './default:install | ./install'),
-        'execute': RSpecElement(RSpecElements.EXECUTE, './default:execute | ./execute'),
-        'login': RSpecElement(RSpecElements.LOGIN, './default:login | ./login'),
-    }  
-    
+
     @staticmethod
     def add_services(xml, services):
+        if not services:
+            return
         for service in services:
-            service_elem = etree.SubElement(xml, 'service')
-            for install in service.get('install', []):
-                install_elem = etree.SubElement(service_elem, 'install')
-                for field in Install.fields:
-                    if field in install:
-                        install_elem.set(field, install[field])
-            for execute in service.get('execute', []):
-                execute_elem = etree.SubElement(service_elem, 'execute')
-                for field in Execute.fields:
-                    if field in execute:
-                        execute_elem.set(field, execute[field])
-            for login in service.get('login', []):
-                login_elem = etree.SubElement(service_elem, 'login')
-                for field in Login.fields:
-                    if field in login:
-                        login_elem.set(field, login[field]) 
+            service_elem = xml.add_element('services')
+            child_elements = {'install': Install.fields,
+                              'execute': Execute.fields,
+                              'login': Login.fields}
+            for (name, fields) in list(child_elements.items()):
+                child = service.get(name)
+                if not child:
+                    continue
+                if isinstance(child, dict):
+                    service_elem.add_instance(name, child, fields)
+                elif isinstance(child, list):
+                    for obj in child:
+                        service_elem.add_instance(name, obj, fields)
+
+#            # add ssh_users
+#            if service['services_user']:
+#                for ssh_user in service['services_user']:
+#                    ssh_user_elem = service_elem.add_element('{%s}services_user' % xml.namespaces['ssh-user'],
+#                                                             login=ssh_user['login'],
+#                                                             user_urn=ssh_user['user_urn'])
+#                    for key in ssh_user['keys']:
+#                        pkey_elem = ssh_user_elem.add_element('{%s}public_key' % xml.namespaces['ssh-user'])
+#                        pkey_elem.element.text=key
 
-              
     @staticmethod
     def get_services(xml):
         services = []
-        for services_elem in xml.xpath(PGv2Services.elements['services'].path):
-            service = Services(services_elem.attrib, services_elem)
-            
-            # get install elements
-            service['install'] = []
-            for install_elem in xml.xpath(PGv2Services.elements['install'].path):
-                install = Install(install_elem.attrib, install_elem)
-                service['install'].append(install)
-            
-            # get execute elements
-            service['execute'] = []
-            for execute_elem in xml.xpath(PGv2Services.elements['execute'].path):
-                execute = Execute(execute_elem.attrib, execute_elem)
-                service['execute'].append(execute)
+        for services_elem in xml.xpath('./default:services | ./services'):
+            service = ServicesElement(services_elem.attrib, services_elem)
+            # get install
+            install_elems = services_elem.xpath(
+                './default:install | ./install')
+            service['install'] = [install_elem.get_instance(
+                Install) for install_elem in install_elems]
+            # get execute
+            execute_elems = services_elem.xpath(
+                './default:execute | ./execute')
+            service['execute'] = [execute_elem.get_instance(
+                Execute) for execute_elem in execute_elems]
+            # get login
+            login_elems = services_elem.xpath('./default:login | ./login')
+            service['login'] = [login_elem.get_instance(
+                Login) for login_elem in login_elems]
 
-            # get login elements
-            service['login'] = []
-            for login_elem in xml.xpath(PGv2Services.elements['login'].path):
-                login = Login(login_elem.attrib, login_elem)
-                service['login'].append(login)             
+#            ssh_user_elems = services_elem.xpath('./ssh-user:service_user | ./service_user')
+#            services_user = []
+#            for ssh_user_elem in ssh_user_elems:
+#                services_user = ssh_user_elem.get_instance(None, fields=['login', 'user_urn'])
+#            service['services_user'] = services_user
 
-            services.append(service)  
+            services.append(service)
         return services
-