Merge Master in geni-v3 conflict resolution
[sfa.git] / sfa / rspecs / elements / v3 / services.py
1 from sfa.rspecs.elements.element import Element  
2 from sfa.rspecs.elements.execute import Execute  
3 from sfa.rspecs.elements.install import Install  
4 from sfa.rspecs.elements.services import ServicesElement  
5 from sfa.rspecs.elements.login import Login
6
7 class Services:
8     @staticmethod
9     def add_services(xml, services):
10         if not services:
11             return 
12         for service in services:
13             service_elem = xml.add_element('services')
14             child_elements = {'install': Install.fields,
15                               'execute': Execute.fields,
16                               'login': Login.fields}
17             for (name, fields) in child_elements.items():
18                 child = service.get(name)
19                 if not child: 
20                     continue
21                 if isinstance(child, dict):
22                     service_elem.add_instance(name, child, fields)
23                 elif isinstance(child, list):
24                     for obj in child:
25                         service_elem.add_instance(name, obj, fields)
26
27             # add ssh_users
28             if service['services_user']:
29                 for ssh_user in service['services_user']: 
30                     ssh_user_elem = service_elem.add_element('{%s}services_user' % xml.namespaces['ssh-user'],
31                                                              login=ssh_user['login'],
32                                                              user_urn=ssh_user['user_urn'])
33                     for key in ssh_user['keys']:
34                         pkey_elem = ssh_user_elem.add_element('{%s}public_key' % xml.namespaces['ssh-user'])
35                         pkey_elem.element.text=key
36                           
37               
38     @staticmethod
39     def get_services(xml):
40         services = []
41         for services_elem in xml.xpath('./default:services | ./services'):
42             service = ServicesElement(services_elem.attrib, services_elem)
43             # get install 
44             install_elems = xml.xpath('./default:install | ./install')
45             service['install'] = [install_elem.get_instance(Install) for install_elem in install_elems]
46             # get execute
47             execute_elems = xml.xpath('./default:execute | ./execute')
48             service['execute'] = [execute_elem.get_instance(Execute) for execute_elem in execute_elems]
49             # get login
50             login_elems = xml.xpath('./default:login | ./login')
51             service['login'] = [login_elem.get_instance(Login) for login_elem in login_elems]
52             
53             ssh_user_elems = xml.xpath('./ssh-user:service_user | ./service_user')
54             services_user = []    
55             for ssh_user_elem in ssh_user_elems:
56                 services_user = ssh_user_elem.get_instance(None, fields=['login', 'user_urn'])
57             service['services_user'] = services_user
58             services.append(service)  
59         return services
60