diff options
| -rw-r--r-- | cloudinit/sources/DataSourceOVF.py | 8 | ||||
| -rw-r--r-- | tests/unittests/test_datasource/test_ovf.py | 83 | 
2 files changed, 87 insertions, 4 deletions
| diff --git a/cloudinit/sources/DataSourceOVF.py b/cloudinit/sources/DataSourceOVF.py index 43347cfb..5b3bdb4e 100644 --- a/cloudinit/sources/DataSourceOVF.py +++ b/cloudinit/sources/DataSourceOVF.py @@ -237,7 +237,7 @@ def wait_for_imc_cfg_file(dirpath, filename, maxwait=180, naplen=5):  def read_vmware_imc(config):      md = {}      cfg = {} -    ud = "" +    ud = None      if config.host_name:          if config.domain_name:              md['local-hostname'] = config.host_name + "." + config.domain_name @@ -256,7 +256,7 @@ def read_ovf_environment(contents):      props = get_properties(contents)      md = {}      cfg = {} -    ud = "" +    ud = None      cfg_props = ['password']      md_props = ['seedfrom', 'local-hostname', 'public-keys', 'instance-id']      for (prop, val) in props.items(): @@ -268,9 +268,9 @@ def read_ovf_environment(contents):              cfg[prop] = val          elif prop == "user-data":              try: -                ud = base64.decodestring(val) +                ud = base64.b64decode(val.encode())              except Exception: -                ud = val +                ud = val.encode()      return (md, ud, cfg) diff --git a/tests/unittests/test_datasource/test_ovf.py b/tests/unittests/test_datasource/test_ovf.py new file mode 100644 index 00000000..5f8e7e44 --- /dev/null +++ b/tests/unittests/test_datasource/test_ovf.py @@ -0,0 +1,83 @@ +# vi: ts=4 expandtab +# +#    Copyright (C) 2016 Canonical Ltd. +# +#    Author: Scott Moser <scott.moser@canonical.com> +# +#    This program is free software: you can redistribute it and/or modify +#    it under the terms of the GNU General Public License version 3, as +#    published by the Free Software Foundation. +# +#    This program is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with this program.  If not, see <http://www.gnu.org/licenses/>. + +import base64 + +from .. import helpers as test_helpers + +from cloudinit.sources import DataSourceOVF as dsovf + +OVF_ENV_CONTENT = """<?xml version="1.0" encoding="UTF-8"?> +<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1" +  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +  xmlns:oe="http://schemas.dmtf.org/ovf/environment/1" +  xsi:schemaLocation="http://schemas.dmtf.org/ovf/environment/1 ../dsp8027.xsd" +  oe:id="WebTier"> +  <!-- Information about hypervisor platform --> +  <oe:PlatformSection> +      <Kind>ESX Server</Kind> +      <Version>3.0.1</Version> +      <Vendor>VMware, Inc.</Vendor> +      <Locale>en_US</Locale> +  </oe:PlatformSection> +  <!--- Properties defined for this virtual machine --> +  <PropertySection> +{properties} +  </PropertySection> +</Environment> +""" + + +def fill_properties(props, template=OVF_ENV_CONTENT): +    lines = [] +    prop_tmpl = '<Property oe:key="{key}" oe:value="{val}"/>' +    for key, val in props.items(): +        lines.append(prop_tmpl.format(key=key, val=val)) +    indent = "        " +    properties = ''.join([indent + l + "\n" for l in lines]) +    return template.format(properties=properties) + + +class TestReadOvfEnv(test_helpers.TestCase): +    def test_with_b64_userdata(self): +        user_data = "#!/bin/sh\necho hello world\n" +        user_data_b64 = base64.b64encode(user_data.encode()).decode() +        props = {"user-data": user_data_b64, "password": "passw0rd", +                 "instance-id": "inst-001"} +        env = fill_properties(props) +        md, ud, cfg = dsovf.read_ovf_environment(env) +        self.assertEqual({"instance-id": "inst-001"}, md) +        self.assertEqual(user_data.encode(), ud) +        self.assertEqual({'password': "passw0rd"}, cfg) + +    def test_with_non_b64_userdata(self): +        user_data = "my-user-data" +        props = {"user-data": user_data, "instance-id": "inst-001"} +        env = fill_properties(props) +        md, ud, cfg = dsovf.read_ovf_environment(env) +        self.assertEqual({"instance-id": "inst-001"}, md) +        self.assertEqual(user_data.encode(), ud) +        self.assertEqual({}, cfg) + +    def test_with_no_userdata(self): +        props = {"password": "passw0rd", "instance-id": "inst-001"} +        env = fill_properties(props) +        md, ud, cfg = dsovf.read_ovf_environment(env) +        self.assertEqual({"instance-id": "inst-001"}, md) +        self.assertEqual({'password': "passw0rd"}, cfg) +        self.assertEqual(None, ud) | 
