components/openstack/nova/files/solariszones/sysconfig.py
branchs11-update
changeset 3028 5e73a3a3f66a
child 3998 5bd484384122
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/nova/files/solariszones/sysconfig.py	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,233 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+
+import locale
+
+from lxml import etree
+
+from solaris_install.utils import encrypt_password
+
+
+DTD_URL = '/usr/share/lib/xml/dtd/service_bundle.dtd.1'
+DOCTYPE_STR = '<!DOCTYPE service_bundle SYSTEM "%s">' % DTD_URL
+
+
+def create_ncp_defaultfixed(addrtype, linkname, netid, ip_version, ip=None,
+                            route=None, nameservers=None):
+    """ return an etree object representing fixed (static) networking
+    """
+    svcbundle = etree.Element("service_bundle", type="profile",
+                              name="openstack")
+
+    # create the network/physical service profile
+    physical = etree.SubElement(svcbundle, "service", version="1",
+                                type="service", name="network/physical")
+    instance = etree.SubElement(physical, "instance", enabled="true",
+                                name="default")
+    pg = etree.SubElement(instance, "property_group", type="application",
+                          name="netcfg")
+    etree.SubElement(pg, "propval", type="astring", name="active_ncp",
+                     value="DefaultFixed")
+
+    # create the network/install service profile
+    install = etree.SubElement(svcbundle, "service", version="1",
+                               type="service", name="network/install")
+    instance = etree.SubElement(install, "instance", enabled="true",
+                                name="default")
+
+    if ip_version == 4:
+        pg4 = etree.SubElement(instance, "property_group",
+                               type="ipv4_interface",
+                               name="install_ipv4_interface_%d" % netid)
+        etree.SubElement(pg4, "propval", type="astring", name="address_type",
+                         value=addrtype)
+
+        if addrtype == "static":
+            etree.SubElement(pg4, "propval", type="net_address_v4",
+                             name="static_address", value=ip)
+            etree.SubElement(pg4, "propval", type="astring", name="name",
+                             value="%s/v4" % linkname)
+            etree.SubElement(pg4, "propval", type="net_address_v4",
+                             name="default_route", value=route)
+        else:
+            etree.SubElement(pg4, "propval", type="astring", name="name",
+                             value="%s/dhcp" % linkname)
+    else:
+        if addrtype == "static":
+            link = etree.SubElement(instance, "property_group",
+                                    type="ipv6_interface",
+                                    name="install_ipv6_interface_%d" % netid)
+            etree.SubElement(link, "propval", type="astring",
+                             name="address_type", value="addrconf")
+            etree.SubElement(link, "propval", type="astring",
+                             name="name", value="%s/aconf" % linkname)
+            etree.SubElement(link, "propval", type="astring",
+                             name="stateless", value="no")
+            etree.SubElement(link, "propval", type="astring",
+                             name="stateful", value="no")
+
+            pg6 = etree.SubElement(instance, "property_group",
+                                   type="ipv6_interface",
+                                   name="install_ipv6_interface_%d_1" % netid)
+            etree.SubElement(pg6, "propval", type="astring",
+                             name="address_type", value="static")
+            etree.SubElement(pg6, "propval", type="net_address_v6",
+                             name="static_address", value=ip)
+            etree.SubElement(pg6, "propval", type="astring", name="name",
+                             value="%s/v6" % linkname)
+        else:
+            pg6 = etree.SubElement(instance, "property_group",
+                                   type="ipv6_interface",
+                                   name="install_ipv6_interface_%d" % netid)
+            etree.SubElement(pg6, "propval", type="astring",
+                             name="address_type", value="addrconf")
+            etree.SubElement(pg6, "propval", type="astring", name="name",
+                             value="%s/dhcp" % linkname)
+            etree.SubElement(pg6, "propval", type="astring",
+                             name="stateless", value="yes")
+            etree.SubElement(pg6, "propval", type="astring",
+                             name="stateful", value="yes")
+
+    # create DNS profile for static configurations
+    if addrtype == "static" and nameservers is not None:
+        dns = etree.SubElement(svcbundle, "service", version="1",
+                               type="service", name="network/dns/client")
+        etree.SubElement(dns, "instance", enabled="true", name="default")
+        pg = etree.SubElement(dns, "property_group", type="application",
+                              name="config")
+        prop = etree.SubElement(pg, "property", type="net_address",
+                                name="nameserver")
+        proplist = etree.SubElement(prop, "net_address_list")
+
+        if isinstance(nameservers, str):
+            etree.SubElement(proplist, "value_node", value=nameservers)
+        elif isinstance(nameservers, list):
+            for entry in nameservers:
+                etree.SubElement(proplist, "value_node", value=entry)
+
+        search = etree.SubElement(pg, "property", type="astring",
+                                  name="search")
+        etree.SubElement(search, "astring_list")
+
+    return svcbundle
+
+
+def create_ncp_automatic():
+    """ return an etree object representing dynamic networking
+    """
+    svcbundle = etree.Element("service_bundle", type="profile",
+                              name="openstack")
+
+    # create the network/physical service profile
+    physical = etree.SubElement(svcbundle, "service", version="1",
+                                type="service", name="network/physical")
+    instance = etree.SubElement(physical, "instance", enabled="true",
+                                name="default")
+    pg = etree.SubElement(instance, "property_group", type="application",
+                          name="netcfg")
+    etree.SubElement(pg, "propval", type="astring", name="active_ncp",
+                     value="Automatic")
+
+    return svcbundle
+
+
+def create_default_root_account(expire=None, sshkey=None):
+    """ return an etree object representing the root account
+    """
+    svcbundle = etree.Element("service_bundle", type="profile",
+                              name="openstack")
+    service = etree.SubElement(svcbundle, "service", version="1",
+                               type="service", name="system/config-user")
+    instance = etree.SubElement(service, "instance", enabled="true",
+                                name="default")
+    root_pg = etree.SubElement(instance, "property_group", type="application",
+                               name="root_account")
+    etree.SubElement(root_pg, "propval", type="astring", name="password",
+                     value="NP")
+    etree.SubElement(root_pg, "propval", type="astring", name="type",
+                     value="normal")
+
+    if expire is not None:
+        etree.SubElement(root_pg, "propval", type="astring", name="expire",
+                         value=expire)
+
+    if sshkey is not None:
+        prop = etree.SubElement(root_pg, "property", type="astring",
+                                name="ssh_public_keys")
+        alist = etree.SubElement(prop, "astring_list")
+        etree.SubElement(alist, "value_node", value=sshkey)
+
+    return svcbundle
+
+
+def create_root_ssh_keys(key):
+    """ return an etree object to set a public SSH key for root
+    """
+    svcbundle = etree.Element("service_bundle", type="profile",
+                              name="openstack")
+    service = etree.SubElement(svcbundle, "service", version="1",
+                               type="service", name="system/config-user")
+    instance = etree.SubElement(service, "instance", enabled="true",
+                                name="default")
+    root_pg = etree.SubElement(instance, "property_group", type="application",
+                               name="root_account")
+    prop = etree.SubElement(root_pg, "property", type="astring",
+                            name="ssh_public_keys")
+    alist = etree.SubElement(prop, "astring_list")
+    etree.SubElement(alist, "value_node", value=key)
+    return svcbundle
+
+
+def create_hostname(name):
+    """ return an etree object representing the instance's hostname
+    """
+
+    svcbundle = etree.Element("service_bundle", type="profile",
+                              name="openstack")
+    service = etree.SubElement(svcbundle, "service", version="1",
+                               type="service", name="system/identity")
+    instance = etree.SubElement(service, "instance", enabled="true",
+                                name="node")
+    pg = etree.SubElement(instance, "property_group", type="application",
+                          name="config")
+    etree.SubElement(pg, "propval", type="astring", name="nodename",
+                     value=name)
+
+    return svcbundle
+
+
+def create_sc_profile(path, tree):
+    """ create a file containing the proper XML headers and encoding for a
+    given etree object
+    """
+    encoding = locale.getpreferredencoding()
+    if encoding == "646":
+        # The C locale on Solaris is returned as '646'.  Set it to 'US-ASCII'
+        # instead
+        encoding = 'US-ASCII'
+
+    xml_str = etree.tostring(tree, pretty_print=True, encoding=encoding,
+                             xml_declaration=True, doctype=DOCTYPE_STR)
+
+    # insert a comment just under the doctype line
+    comment = etree.Comment(" Auto-generated by OpenStack Nova ")
+    xml_list = xml_str.split("\n")
+    xml_list.insert(2, etree.tostring(comment))
+    xml_str = "\n".join(xml_list)
+
+    with open(path, "w+") as fh:
+        fh.write(xml_str)