summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2013-07-10 13:08:23 -0400
committerScott Moser <smoser@ubuntu.com>2013-07-10 13:08:23 -0400
commitce949d5b4c94caf9c1df6393abe86de2872e05ae (patch)
tree9a8317fdcc9489738a1b425dca0d0e91d1f267f2
parentec22feeefe309187107e0fb5471136f1c8a646c9 (diff)
downloadvyos-cloud-init-ce949d5b4c94caf9c1df6393abe86de2872e05ae.tar.gz
vyos-cloud-init-ce949d5b4c94caf9c1df6393abe86de2872e05ae.zip
add waiting for files and reading of crt keys
-rw-r--r--cloudinit/sources/DataSourceAzure.py46
-rw-r--r--packages/debian/changelog.in2
-rw-r--r--tests/unittests/test_datasource/test_azure.py21
3 files changed, 62 insertions, 7 deletions
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
index ab570344..200bede5 100644
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -19,6 +19,7 @@
import base64
import os
import os.path
+import time
from xml.dom import minidom
from cloudinit import log as logging
@@ -113,9 +114,18 @@ class DataSourceAzureNet(sources.DataSource):
wait_for = [os.path.join(mycfg['datadir'], "SharedConfig.xml")]
+ fp_files = []
for pk in self.cfg.get('_pubkeys', []):
bname = pk['fingerprint'] + ".crt"
- wait_for += [os.path.join(mycfg['datadir'], bname)]
+ fp_files += [os.path.join(mycfg['datadir'], bname)]
+
+ missing = wait_for_files(wait_for + fp_files)
+ if len(missing):
+ LOG.warn("Did not find files, but going on: %s" % missing)
+
+ pubkeys = pubkeys_from_crt_files(fp_files)
+
+ self.metadata['public-keys'] = pubkeys
return True
@@ -123,6 +133,40 @@ class DataSourceAzureNet(sources.DataSource):
return self.cfg
+def crtfile_to_pubkey(fname):
+ pipeline = ('openssl x509 -noout -pubkey < "$0" |'
+ 'ssh-keygen -i -m PKCS8 -f /dev/stdin')
+ (out, _err) = util.subp(['sh', '-c', pipeline, fname], capture=True)
+ return out.rstrip()
+
+
+def pubkeys_from_crt_files(flist):
+ pubkeys = []
+ errors = []
+ for fname in flist:
+ try:
+ pubkeys.append(crtfile_to_pubkey(fname))
+ except util.ProcessExecutionError:
+ errors.extend(fname)
+
+ if errors:
+ LOG.warn("failed to convert the crt files to pubkey: %s" % errors)
+
+ return pubkeys
+
+
+def wait_for_files(flist, maxwait=60, naplen=.5):
+ need = set(flist)
+ waited = 0
+ while waited < maxwait:
+ need -= set([f for f in need if os.path.exists(f)])
+ if len(need) == 0:
+ return []
+ time.sleep(naplen)
+ waited += naplen
+ return need
+
+
def write_files(datadir, files):
if not datadir:
return
diff --git a/packages/debian/changelog.in b/packages/debian/changelog.in
index e3e94f54..4944230b 100644
--- a/packages/debian/changelog.in
+++ b/packages/debian/changelog.in
@@ -1,5 +1,5 @@
## This is a cheetah template
-cloud-init (${version}~bzr${revision}-1) UNRELEASED; urgency=low
+cloud-init (${version}~bzr${revision}-1) raring; urgency=low
* build
diff --git a/tests/unittests/test_datasource/test_azure.py b/tests/unittests/test_datasource/test_azure.py
index a7094ec6..74ed7197 100644
--- a/tests/unittests/test_datasource/test_azure.py
+++ b/tests/unittests/test_datasource/test_azure.py
@@ -81,15 +81,23 @@ class TestAzureDataSource(MockerTestCase):
def dsdevs():
return data.get('dsdevs', [])
- def invoker(cmd):
+ def _invoke_agent(cmd):
data['agent_invoked'] = cmd
- def file_writer(datadir, files):
+ def _write_files(datadir, files):
data['files'] = {}
data['datadir'] = datadir
for (fname, content) in files.items():
data['files'][fname] = content
+ def _wait_for_files(flist, _maxwait=None, _naplen=None):
+ data['waited'] = flist
+ return []
+
+ def _pubkeys_from_crt_files(flist):
+ data['pubkey_files'] = flist
+ return ["pubkey_from: %s" % f for f in flist]
+
if data.get('ovfcontent') is not None:
populate_dir(os.path.join(self.paths.seed_dir, "azure"),
{'ovf-env.xml': data['ovfcontent']})
@@ -99,8 +107,11 @@ class TestAzureDataSource(MockerTestCase):
if data.get('dsdevs'):
self.apply_patches([(mod, 'list_possible_azure_ds_devs', dsdevs)])
- self.apply_patches([(mod, 'invoke_agent', invoker)])
- self.apply_patches([(mod, 'write_files', file_writer)])
+ self.apply_patches([(mod, 'invoke_agent', _invoke_agent),
+ (mod, 'write_files', _write_files),
+ (mod, 'wait_for_files', _wait_for_files),
+ (mod, 'pubkeys_from_crt_files',
+ _pubkeys_from_crt_files)])
dsrc = mod.DataSourceAzureNet(
data.get('sys_cfg', {}), distro=None, paths=self.paths)
@@ -209,7 +220,7 @@ class TestReadAzureOvf(MockerTestCase):
mypklist = [{'fingerprint': 'fp1', 'path': 'path1'}]
pubkeys = [(x['fingerprint'], x['path']) for x in mypklist]
content = construct_valid_ovf_env(pubkeys=pubkeys)
- (md, ud, cfg) = DataSourceAzure.read_azure_ovf(content)
+ (_md, _ud, cfg) = DataSourceAzure.read_azure_ovf(content)
for mypk in mypklist:
self.assertIn(mypk, cfg['_pubkeys'])