blob: 92d5437602c8e572d80da49229e01d26e3b915f1 [file] [log] [blame]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##
# Copyright 2015 Telefonica Investigacion y Desarrollo, S.A.U.
# This file is part of openmano
# 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.
#
# For those usages not covered by the Apache License, Version 2.0 please
# contact with: nfvlabs@tid.es
##
'''
test_osconnector.py makes a test over osconnector.py (openstack connector)
credentiasl must be provided with environment bash variables or arguments
'''
__author__="Alfonso Tierno, Gerardo Garcia"
__date__ ="$22-jun-2014 11:19:29$"
import os
import sys
import getopt
#import yaml
#from jsonschema import validate as js_v, exceptions as js_e
#load osconnector, insert openmano directory in the path
r=sys.argv[0].rfind('/')
if r<0:
osconnector_path=".."
else:
osconnector_path=sys.argv[0][:r+1]+".."
sys.path.insert(0, osconnector_path)
#sys.path.insert(0, '/home/atierno/workspace/openmano/openmano')
import osconnector
version="0.1"
def usage():
print "Usage: ", sys.argv[0], "[options]"
print " -v|--version openstack version (by default 2)"
print " -u|--username USER user to authenticate (by default bash:OS_USERNAME)"
print " -p|--password PASSWD password to authenticate (by default bash:OS_PASSWORD)"
print " -U|--auth_url URL url of authentication over keystone (by default bash:OS_AUTH_URL)"
print " -t|--tenant_name TENANT password to authenticate (by default bash:OS_TENANT_NAME)"
print " -i|--image IMAGE use this local path or url for loading image (by default cirros)"
print " --skip-admin-tests skip tests that requires administrative permissions, like create tenants"
print " -h|--help shows this help"
return
def delete_items():
global myvim
global rollback_list
print "Making rollback, deleting items"
for i in range(len(rollback_list)-1, -1, -1):
item,name,id_ = rollback_list[i]
if item=="creds":
print ("changing credentials %s='%s'" % (name, id_)).ljust(50),
else:
print ("deleting %s '%s'" % (item, name)).ljust(50),
sys.stdout.flush()
if item=="flavor":
result,message=myvim.delete_tenant_flavor(id_)
elif item=="image":
result,message=myvim.delete_tenant_image(id_)
elif item=="tenant":
result,message=myvim.delete_tenant(id_)
elif item=="user":
result,message=myvim.delete_user(id_)
elif item=="network":
result,message=myvim.delete_tenant_network(id_)
elif item=="vm":
result,message=myvim.delete_tenant_vminstance(id_)
elif item=="creds":
try:
myvim[name]=id_
result=1
except Exception as e:
result=-1
message= " " + str(type(e))[6:-1] + ": "+ str(e)
else:
print "Internal error unknown item rollback %s,%s,%s" % (item,name,id_)
continue
if result<0:
print " Fail"
print " VIM response:", message
continue
else:
print " Ok"
if __name__=="__main__":
global myvim
global rollback_list
#print "(c) Copyright Telefonica"
rollback_list=[]
try:
opts, args = getopt.getopt(sys.argv[1:], "hv:u:U:p:t:i:",
["username=", "help", "version=", "password=", "tenant=", "url=","skip-admin-tests",'image='])
except getopt.GetoptError as err:
# print help information and exit:
print "Error:", err # will print something like "option -a not recognized"
usage()
sys.exit(2)
creds = {}
creds['version'] = os.environ.get('OS_VERSION', '2')
creds['username'] = os.environ.get('OS_USERNAME')
creds['password'] = os.environ.get('OS_PASSWORD')
creds['auth_url'] = os.environ.get('OS_AUTH_URL')
creds['tenant_name'] = os.environ.get('OS_TENANT_NAME')
skip_admin_tests=False
image_path="http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img"
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-v", "--version"):
creds['version']=a
elif o in ("-u", "--username"):
creds['username']=a
elif o in ("-p", "--password"):
creds['password']=a
elif o in ("-U", "--auth_url"):
creds['auth_url']=a
elif o in ("-t", "--tenant_name"):
creds['tenant_name']=a
elif o in ("-i", "--image"):
image_path=a
elif o=="--skip-admin-tests":
skip_admin_tests=True
else:
assert False, "Unhandled option"
if creds['auth_url']==None:
print "you must provide openstack url with -U or bash OS_AUTH_URL"
sys.exit()
print "creds:", creds
try:
print 'load osconnector class'.ljust(50),
sys.stdout.flush()
try:
myvim=osconnector.osconnector(uuid=None, name='test-openstack', tenant=creds['tenant_name'],
url=creds['auth_url'], url_admin=None,
user=creds['username'], passwd=creds['password'],
debug = False, config={'network_vlan_ranges':'physnet_sriov'} )
print " Ok"
except Exception as e:
print " Fail"
print str(type(e))[6:-1] + ": "+ str(e)
exit(-1)
if not skip_admin_tests:
tenant_name="tos-tenant"
print ("creating new tenant '%s'" % tenant_name).ljust(50),
sys.stdout.flush()
result,new_tenant=myvim.new_tenant(tenant_name, "test tenant_description, trying a long description to get the limit. 2 trying a long description to get the limit. 3. trying a long description to get the limit.")
if result<0:
print " Fail"
print " you can skip tenant creation with param'--skip-admin-tests'"
print " VIM response:", new_tenant
exit(-1)
else:
print " Ok", new_tenant
rollback_list.append(("tenant",tenant_name,new_tenant))
user_name="tos-user"
print ("creating new user '%s'" % user_name).ljust(50),
sys.stdout.flush()
result,new_user=myvim.new_user(user_name, user_name, tenant_id=new_tenant)
if result<0:
print " Fail"
print " VIM response:", new_user
exit(-1)
else:
print " Ok", new_user
rollback_list.append(("user",user_name,new_user))
name="tos-fl1"
print ("creating new flavor '%s'"%name).ljust(50),
sys.stdout.flush()
flavor={}
flavor['name']=name
result,new_flavor1=myvim.new_tenant_flavor(flavor, True)
if result<0:
print " Fail"
print " VIM response:", new_flavor1
exit(-1)
else:
print " Ok", new_flavor1
rollback_list.append(("flavor",name,new_flavor1))
name="tos-cirros"
print ("creating new image '%s'"%name).ljust(50),
sys.stdout.flush()
image={}
image['name']=name
image['location']=image_path #"/home/atierno/cirros-0.3.3-x86_64-disk.img"
result,new_image1=myvim.new_tenant_image(image)
if result<0:
print " Fail"
print " VIM response:", new_image1
exit(-1)
else:
print " Ok", new_image1
rollback_list.append(("image",name, new_image1))
if not skip_admin_tests:
try:
print 'changing credentials to new tenant'.ljust(50),
sys.stdout.flush()
myvim['tenant'] =tenant_name
myvim['user']=user_name
myvim['passwd']=user_name
print " Ok"
rollback_list.append(("creds", "tenant", creds["tenant_name"]))
rollback_list.append(("creds", "user", creds["username"]))
rollback_list.append(("creds", "passwd", creds["password"]))
except Exception as e:
print " Fail"
print " Error setting osconnector to new tenant:", str(type(e))[6:-1] + ": "+ str(e)
exit(-1)
name="tos-net-bridge"
print ("creating new net '%s'"%name).ljust(50),
sys.stdout.flush()
result,new_net1=myvim.new_tenant_network(name, "bridge")
if result<0:
print " Fail"
print " VIM response:", new_net1
exit(-1)
else:
print " Ok", new_net1
rollback_list.append(("network",name, new_net1))
name="tos-vm-cloud"
print ("creating new VM '%s'"%name).ljust(50),
sys.stdout.flush()
result,new_vm1=myvim.new_tenant_vminstance(name, "vm-cloud-description", False,new_image1,new_flavor1,
[{"net_id":new_net1, "type":"virtio"}] )
if result<0:
print " Fail"
print " VIM response:", new_vm1
exit(-1)
else:
print " Ok", new_vm1
rollback_list.append(("vm",name, new_vm1))
print 'DONE Ok'
print "Type ENTER to delete items"
raw_input('> ')
exit()
except KeyboardInterrupt:
print " Canceled!"
except SystemExit:
pass
if len(rollback_list):
delete_items()