summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevin Carlen <devin.carlen@gmail.com>2010-06-23 21:19:08 -0700
committerDevin Carlen <devin.carlen@gmail.com>2010-06-23 21:19:08 -0700
commit8572e639ac681b9efe408821d9da19aa8d6e0bc9 (patch)
treeb6ce8eff7e32c4f465febc28a86473ffcf9fe45f
parent487bb6abc3a66c93f440ae532ae92d5192624ffd (diff)
downloadnova-8572e639ac681b9efe408821d9da19aa8d6e0bc9.tar.gz
nova-8572e639ac681b9efe408821d9da19aa8d6e0bc9.tar.xz
nova-8572e639ac681b9efe408821d9da19aa8d6e0bc9.zip
Added flags to smoketests. General cleanup
-rw-r--r--smoketests/README6
-rw-r--r--smoketests/__init__.py30
-rw-r--r--smoketests/flags.py42
-rw-r--r--smoketests/novatestcase.py74
-rw-r--r--smoketests/smoketest.py132
5 files changed, 195 insertions, 89 deletions
diff --git a/smoketests/README b/smoketests/README
deleted file mode 100644
index 1a357c672..000000000
--- a/smoketests/README
+++ /dev/null
@@ -1,6 +0,0 @@
-a test suite to run against a deployed cloud
-
-THIS IS NASA CODE!
-
-It will need to be opensourced by the NASA legal process before it is in the open source
-release
diff --git a/smoketests/__init__.py b/smoketests/__init__.py
new file mode 100644
index 000000000..907545460
--- /dev/null
+++ b/smoketests/__init__.py
@@ -0,0 +1,30 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# 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.
+
+"""
+:mod:`smoketests` -- Nova Integration "Smoke" Tests
+=====================================================
+
+.. automodule:: nova.volume
+ :platform: Unix
+.. moduleauthor:: Jesse Andrews <jesse@ansolabs.com>
+.. moduleauthor:: Devin Carlen <devin.carlen@gmail.com>
+.. moduleauthor:: Vishvananda Ishaya <vishvananda@yahoo.com>
+.. moduleauthor:: Joshua McKenty <joshua@cognition.ca>
+.. moduleauthor:: Manish Singh <yosh@gimp.org>
+.. moduleauthor:: Andy Smith <andy@anarkystic.com>
+""" \ No newline at end of file
diff --git a/smoketests/flags.py b/smoketests/flags.py
new file mode 100644
index 000000000..7c35f5253
--- /dev/null
+++ b/smoketests/flags.py
@@ -0,0 +1,42 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# 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.
+
+"""
+Package-level global flags are defined here, the rest are defined
+where they're used.
+"""
+
+import socket
+
+from nova import vendor
+from gflags import *
+
+# This keeps pylint from barfing on the imports
+FLAGS = FLAGS
+DEFINE_string = DEFINE_string
+DEFINE_integer = DEFINE_integer
+DEFINE_bool = DEFINE_bool
+
+# __GLOBAL FLAGS ONLY__
+# Define any app-specific flags in their own files, docs at:
+# http://code.google.com/p/python-gflags/source/browse/trunk/gflags.py#39
+
+DEFINE_bool('verbose', False, 'show debug output')
+DEFINE_string('admin_access_key', 'admin', 'Access key for admin user')
+DEFINE_string('admin_secret_key', 'admin', 'Secret key for admin user')
+DEFINE_string('clc_ip', '127.0.0.1', 'IP of cloud controller API')
+DEFINE_string('vpn_image_id', 'ami-CLOUDPIPE', 'AMI for cloudpipe vpn server')
diff --git a/smoketests/novatestcase.py b/smoketests/novatestcase.py
index e046fc488..306e2320d 100644
--- a/smoketests/novatestcase.py
+++ b/smoketests/novatestcase.py
@@ -1,25 +1,33 @@
-# COPYRIGHT NASA
-
-import os, unittest, sys
-from commands import getstatusoutput
-from paramiko import SSHClient, RSAKey, WarningPolicy
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# 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 commands
+import os
import random
+import sys
+import unittest
-BUCKET_NAME = 'smoketest'
+from nova.adminclient import NovaAdminClient
+from nova.smoketests import flags
-try:
- # pulling from environment means euca-bundle and other shell commands
- # are runable without futzing with the environment and zip files
- access_key = os.environ['EC2_ACCESS_KEY']
- secret_key = os.environ['EC2_SECRET_KEY']
- endpoint = os.environ['EC2_URL']
- host = endpoint.split('/')[2].split(':')[0] # http://HOST:8773/services/Cloud
-except:
- print 'you need to source admin rc before running smoketests'
- sys.exit(2)
+from nova import vendor
+import paramiko
-from nova.adminclient import NovaAdminClient
-admin = NovaAdminClient(access_key=access_key, secret_key=secret_key, clc_ip=host)
+nova_admin = NovaAdminClient(access_key=flags.admin_access_key, secret_key=flags.admin_secret_key, clc_ip=host)
class NovaTestCase(unittest.TestCase):
def setUp(self):
@@ -29,37 +37,37 @@ class NovaTestCase(unittest.TestCase):
pass
def connect_ssh(self, ip, key_name):
- # TODO: set a more reasonable connection timeout time
- key = RSAKey.from_private_key_file('/tmp/%s.pem' % key_name)
- client = SSHClient()
+ # TODO(devcamcar): set a more reasonable connection timeout time
+ key = paramiko.RSAKey.from_private_key_file('/tmp/%s.pem' % key_name)
+ client = paramiko.SSHClient()
client.load_system_host_keys()
- client.set_missing_host_key_policy(WarningPolicy())
+ client.set_missing_host_key_policy(paramiko.WarningPolicy())
client.connect(ip, username='root', pkey=key)
stdin, stdout, stderr = client.exec_command('uptime')
print 'uptime: ', stdout.read()
return client
def can_ping(self, ip):
- return getstatusoutput('ping -c 1 %s' % ip)[0] == 0
+ return commands.getstatusoutput('ping -c 1 %s' % ip)[0] == 0
@property
def admin(self):
- return admin.connection_for('admin')
+ return nova_admin.connection_for('admin')
def connection_for(self, username):
- return admin.connection_for(username)
+ return nova_admin.connection_for(username)
def create_user(self, username):
- return admin.create_user(username)
+ return nova_admin.create_user(username)
def get_user(self, username):
- return admin.get_user(username)
+ return nova_admin.get_user(username)
def delete_user(self, username):
- return admin.delete_user(username)
+ return nova_admin.delete_user(username)
def get_signed_zip(self, username):
- return admin.get_zip(username)
+ return nova_admin.get_zip(username)
def create_key_pair(self, conn, key_name):
try:
@@ -81,7 +89,7 @@ class NovaTestCase(unittest.TestCase):
cmd = 'euca-bundle-image -i %s' % image
if kernel:
cmd += ' --kernel true'
- status, output = getstatusoutput(cmd)
+ status, output = commands.getstatusoutput(cmd)
if status != 0:
print '%s -> \n %s' % (cmd, output)
raise Exception(output)
@@ -89,7 +97,7 @@ class NovaTestCase(unittest.TestCase):
def upload_image(self, bucket_name, image):
cmd = 'euca-upload-bundle -b %s -m /tmp/%s.manifest.xml' % (bucket_name, image)
- status, output = getstatusoutput(cmd)
+ status, output = commands.getstatusoutput(cmd)
if status != 0:
print '%s -> \n %s' % (cmd, output)
raise Exception(output)
@@ -97,14 +105,14 @@ class NovaTestCase(unittest.TestCase):
def delete_bundle_bucket(self, bucket_name):
cmd = 'euca-delete-bundle --clear -b %s' % (bucket_name)
- status, output = getstatusoutput(cmd)
+ status, output = commands.getstatusoutput(cmd)
if status != 0:
print '%s -> \n%s' % (cmd, output)
raise Exception(output)
return True
def register_image(self, bucket_name, manifest):
- conn = admin.connection_for('admin')
+ conn = nova_admin.connection_for('admin')
return conn.register_image("%s/%s.manifest.xml" % (bucket_name, manifest))
def setUp_test_image(self, image, kernel=False):
diff --git a/smoketests/smoketest.py b/smoketests/smoketest.py
index aa03037de..ba8a7764a 100644
--- a/smoketests/smoketest.py
+++ b/smoketests/smoketest.py
@@ -1,19 +1,43 @@
-# COPYRIGHT NASA
-
-import os, re, sys, time, unittest, random
-from novatestcase import NovaTestCase
-from commands import getstatusoutput
-from paramiko import SSHException
-from zipfile import ZipFile, ZIP_DEFLATED
-
-# TODO: Make endpoint configurable
-
-DEBUG = True
-
-KERNEL_FILENAME = 'openwrt-x86-vmlinuz'
-IMAGE_FILENAME = 'openwrt-x86-ext2.image'
-
-ZIP_FILENAME = '/tmp/nova-x509.zip'
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# 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 commands
+import os
+import random
+import re
+import sys
+import time
+import unittest
+import zipfile
+
+from nova.smoketests import flags
+from nova.smoketests.novatestcase import NovaTestCase
+
+from nova import vendor
+import paramiko
+
+FLAGS = flags.FLAGS
+flags.DEFINE_string('bundle_kernel', 'openwrt-x86-vmlinuz',
+ 'Local kernel file to use for bundling tests')
+flags.DEFINE_string('bundle_image', 'openwrt-x86-ext2.image',
+ 'Local image file to use for bundling tests')
+
+# TODO(devamcar): Use random tempfile
+ZIP_FILENAME = '/tmp/euca-me-x509.zip'
data = {}
@@ -38,7 +62,7 @@ class UserTests(NovaTestCase):
output.write(buf)
output.close()
- zip = ZipFile(ZIP_FILENAME, 'a', ZIP_DEFLATED)
+ zip = zipfile.ZipFile(ZIP_FILENAME, 'a', zipfile.ZIP_DEFLATED)
bad = zip.testzip()
zip.close()
@@ -70,14 +94,14 @@ class ImageTests(NovaTestCase):
data['image_id'] = image_id
def test_004_admin_can_bundle_kernel(self):
- self.assertTrue(self.bundle_image(KERNEL_FILENAME, kernel=True))
+ self.assertTrue(self.bundle_image(flags.bundle_kernel, kernel=True))
def test_005_admin_can_upload_kernel(self):
- self.assertTrue(self.upload_image(test_bucket, KERNEL_FILENAME))
+ self.assertTrue(self.upload_image(test_bucket, flags.bundle_kernel))
def test_006_admin_can_register_kernel(self):
- # FIXME: registeration should verify that bucket/manifest exists before returning successfully!
- kernel_id = self.register_image(test_bucket, KERNEL_FILENAME)
+ # FIXME: registration should verify that bucket/manifest exists before returning successfully!
+ kernel_id = self.register_image(test_bucket, flags.bundle_kernel)
self.assert_(kernel_id is not None)
data['kernel_id'] = kernel_id
@@ -101,56 +125,61 @@ class ImageTests(NovaTestCase):
self.assert_(False) # wasn't available within 10 seconds
self.assert_(kernel.type == 'kernel')
- def test_008_images_not_public_by_default(self):
+ def test_008_admin_can_describe_image_attribute(self):
+ attrs = self.admin.get_image_attribute(data['image_id'], 'launchPermission')
+ self.assert_(attrs.name, 'launch_permission')
+
+ def test_009_me_cannot_see_non_public_images(self):
conn = self.connection_for(test_username)
images = conn.get_all_images(image_ids=[data['image_id']])
self.assertEqual(len(images), 0)
- images = conn.get_all_images(image_ids=[data['kernel_id']])
- self.assertEqual(len(images), 0)
- def test_009_images_can_be_made_public(self):
- userconn = self.connection_for(test_username)
+ def test_010_admin_can_modify_image_launch_permission(self):
+ conn = self.connection_for(test_username)
self.admin.modify_image_attribute(image_id=data['image_id'],
operation='add',
attribute='launchPermission',
groups='all')
- image = userconn.get_image(data['image_id'])
+ image = conn.get_image(data['image_id'])
self.assertEqual(image.id, data['image_id'])
- self.admin.modify_image_attribute(image_id=data['kernel_id'],
- operation='add',
- attribute='launchPermission',
- groups='all')
-
- image = userconn.get_image(data['kernel_id'])
- self.assertEqual(image.id, data['kernel_id'])
-
+ def test_011_me_can_list_public_images(self):
+ conn = self.connection_for(test_username)
+ images = conn.get_all_images(image_ids=[data['image_id']])
+ self.assertEqual(len(images), 1)
+ pass
+
+ def test_012_me_can_see_launch_permission(self):
+ attrs = self.admin.get_image_attribute(data['image_id'], 'launchPermission')
+ self.assert(_attrs.name, 'launch_permission')
+ self.assert(_attrs.groups[0], 'all')
+
# FIXME: add tests that user can launch image
-# def test_010_user_can_launch_admin_public_image(self):
+# def test_013_user_can_launch_admin_public_image(self):
# # TODO: Use openwrt kernel instead of default kernel
# conn = self.connection_for(test_username)
# reservation = conn.run_instances(data['image_id'])
# self.assertEqual(len(reservation.instances), 1)
# data['my_instance_id'] = reservation.instances[0].id
-# def test_011_instances_launch_within_30_seconds(self):
+# def test_014_instances_launch_within_30_seconds(self):
# pass
-# def test_012_user_can_terminate(self):
+# def test_015_user_can_terminate(self):
# conn = self.connection_for(test_username)
# terminated = conn.terminate_instances(instance_ids=[data['my_instance_id']])
# self.assertEqual(len(terminated), 1)
- def test_013_admin_can_deregister_kernel(self):
+ def test_016_admin_can_deregister_kernel(self):
self.assertTrue(self.admin.deregister_image(data['kernel_id']))
- def test_014_admin_can_deregister_image(self):
+ def test_017_admin_can_deregister_image(self):
self.assertTrue(self.admin.deregister_image(data['image_id']))
- def test_015_admin_can_delete_bundle(self):
+ def test_018_admin_can_delete_bundle(self):
self.assertTrue(self.delete_bundle_bucket(test_bucket))
def test_999_tearDown(self):
@@ -202,13 +231,13 @@ class SecurityTests(NovaTestCase):
def test_005_can_ping_private_ip(self):
for x in xrange(120):
# ping waits for 1 second
- status, output = getstatusoutput("ping -c1 -w1 %s" % data['my_private_ip'])
+ status, output = commands.getstatusoutput("ping -c1 -w1 %s" % data['my_private_ip'])
if status == 0:
break
else:
self.assert_("could not ping instance")
#def test_005_me_cannot_ssh_when_unauthorized(self):
- # self.assertRaises(SSHException, self.connect_ssh, data['my_private_ip'], 'mykey')
+ # self.assertRaises(paramiko.SSHException, self.connect_ssh, data['my_private_ip'], 'mykey')
#def test_006_me_can_authorize_ssh(self):
# conn = self.connection_for(test_username + '_me')
@@ -246,7 +275,7 @@ class SecurityTests(NovaTestCase):
try:
conn = self.connect_ssh(data['my_private_ip'], test_key + 'yourkey')
conn.close()
- except SSHException:
+ except paramiko.SSHException:
pass
else:
self.fail("expected SSHException")
@@ -274,7 +303,7 @@ class SecurityTests(NovaTestCase):
# build a script to bundle the instance
# build a script to upload the bundle
-# status, output = getstatusoutput('cmd')
+# status, output = commands.getstatusoutput('cmd')
# if status == 0:
# print 'ok'
# else:
@@ -321,10 +350,13 @@ class RebundlingTests(NovaTestCase):
image = conn.get_image(data['my_image_id'])
self.assertEqual(image, None)
-# def test_006_me_can_make_image_public(self):
-# # TODO: research this
-# self.assert_(False)
-#
+ def test_006_me_can_make_image_public(self):
+ conn = self.connection_for(test_username)
+ conn.modify_image_attribute(image_id=data['my_image_id'],
+ operation='add',
+ attribute='launchPermission',
+ groups='all')
+
def test_007_you_can_see_my_public_image(self):
conn = self.connection_for('you')
image = conn.get_image(data['my_image_id'])
@@ -401,7 +433,7 @@ class VolumeTests(NovaTestCase):
# wait for instance to show up
for x in xrange(120):
# ping waits for 1 second
- status, output = getstatusoutput("ping -c1 -w1 %s" % data['private_ip'])
+ status, output = commands.getstatusoutput("ping -c1 -w1 %s" % data['private_ip'])
if status == 0:
break
else: