lots of new stuff .. start of tempest config generator
This commit is contained in:
parent
803525e1e2
commit
febd1e01b5
@ -14,3 +14,121 @@
|
|||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
import os.path
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import argparse
|
||||||
|
from textwrap import dedent
|
||||||
|
from refstack.common import test
|
||||||
|
|
||||||
|
basedir = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
def call(*args, **kwargs):
|
||||||
|
"""subprocess.call with error checking."""
|
||||||
|
assert not subprocess.call(*args, **kwargs)
|
||||||
|
|
||||||
|
class actions(argparse.Action):
|
||||||
|
""" david please comment this """
|
||||||
|
test_id = None
|
||||||
|
params = {}
|
||||||
|
|
||||||
|
def __call__(self, parser, params, values, option_string=None, **kwargs):
|
||||||
|
"""Triggered by -c command line argument """
|
||||||
|
self.params = params
|
||||||
|
setattr(self.params, self.dest, values)
|
||||||
|
|
||||||
|
self._print(self.params, verbose=True)
|
||||||
|
|
||||||
|
# action function mapping
|
||||||
|
actions = { 'run' : self.run,
|
||||||
|
'status' : self.status,
|
||||||
|
'cancel' : self.cancel,
|
||||||
|
'result' : self.result,
|
||||||
|
'export' : self.export,
|
||||||
|
'list' : self.list }
|
||||||
|
|
||||||
|
if len(self.params.command) > 1:
|
||||||
|
print "Please only use one command at a time!\n\n"
|
||||||
|
parser.print_help()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
for command in self.params.command:
|
||||||
|
if command in actions:
|
||||||
|
actions[command]()
|
||||||
|
|
||||||
|
def _print(self, output, verbose=False):
|
||||||
|
""" print wrapper so -v and -s can be respected """
|
||||||
|
if not self.params.silent:
|
||||||
|
if verbose is False:
|
||||||
|
print(output)
|
||||||
|
elif verbose is True and self.params.verbose > 0:
|
||||||
|
print(output)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
""" run test command"""
|
||||||
|
self._print('run command called',True)
|
||||||
|
|
||||||
|
def status(self):
|
||||||
|
""" get the status of a running test"""
|
||||||
|
self._print('status command called',True)
|
||||||
|
|
||||||
|
def cancel(self):
|
||||||
|
""" cancels a running test"""
|
||||||
|
self._print('cancel command called',True)
|
||||||
|
|
||||||
|
def result(self):
|
||||||
|
""" outputs the results of a test"""
|
||||||
|
self._print('result command called',True)
|
||||||
|
|
||||||
|
def export(self):
|
||||||
|
""" export something forgot why I adddedd this"""
|
||||||
|
self._print('export command called',True)
|
||||||
|
|
||||||
|
def list(self):
|
||||||
|
""" returns a list of cached test results"""
|
||||||
|
self._print('list command called',True)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
""" command line hook """
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||||
|
description=dedent("""\
|
||||||
|
This is a CLI utility for refstack
|
||||||
|
|
||||||
|
"""),
|
||||||
|
epilog=dedent("""\
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
Refstack CLI:
|
||||||
|
\n\n\n """))
|
||||||
|
|
||||||
|
|
||||||
|
# output options
|
||||||
|
parser.add_argument('--verbose', '-v', action='count')
|
||||||
|
parser.add_argument('--silent', '-s', action='store_true')
|
||||||
|
|
||||||
|
|
||||||
|
# all paramaters can be overridden
|
||||||
|
parser.add_argument('--test-id', nargs='?', type=int,
|
||||||
|
default=None,
|
||||||
|
help="""id of the test you want to interact with.. if you are starting
|
||||||
|
a new test you can leave this blank and it will
|
||||||
|
return a new test_id""")
|
||||||
|
|
||||||
|
parser.add_argument('command', nargs='+', action=actions,
|
||||||
|
help="Command to execute. ",
|
||||||
|
choices=['run','status','cancel','result','export','list'] )
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
# validate input
|
||||||
|
#option_given = not (args.c == None)
|
||||||
|
|
||||||
|
#if not option_given:
|
||||||
|
# parser.print_help()
|
||||||
|
# sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
15
refstack/common/__init__.py
Executable file
15
refstack/common/__init__.py
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2013 Piston Cloud Computing, Inc.
|
||||||
|
# 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.
|
0
refstack/common/client.py
Executable file
0
refstack/common/client.py
Executable file
44
refstack/common/cloud.py
Executable file
44
refstack/common/cloud.py
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2013 Piston Cloud Computing, Inc.
|
||||||
|
# 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.
|
||||||
|
from refstack.common import *
|
||||||
|
|
||||||
|
|
||||||
|
class Cloud:
|
||||||
|
""" Vendor functions"""
|
||||||
|
id = None
|
||||||
|
|
||||||
|
def __init__(self, id):
|
||||||
|
""" init method loads specified id or fails"""
|
||||||
|
self.id = id
|
||||||
|
|
||||||
|
@def end_point():
|
||||||
|
doc = "The end_point property."
|
||||||
|
def fget(self):
|
||||||
|
return self._end_point
|
||||||
|
def fset(self, value):
|
||||||
|
self._end_point = value
|
||||||
|
def fdel(self):
|
||||||
|
del self._end_point
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
foo = property(**foo())
|
||||||
|
|
||||||
|
def tests(self, cloud_
|
||||||
|
id = None):
|
||||||
|
""" returns object populated with test objects that belong to
|
||||||
|
this user and filter
|
||||||
|
ed by cloud_id if specified """
|
||||||
|
|
157
refstack/common/tempest-config.py
Executable file
157
refstack/common/tempest-config.py
Executable file
@ -0,0 +1,157 @@
|
|||||||
|
|
||||||
|
class TempestConf(dict):
|
||||||
|
"""temptest config options. gets converted to a tempest config file"""
|
||||||
|
def __init__(self):
|
||||||
|
""" sets up the default configs"""
|
||||||
|
self['DEFAULT'] = {
|
||||||
|
'debug':True,
|
||||||
|
'use_stderr':False,
|
||||||
|
'log_file':'',
|
||||||
|
'lock_path':'',
|
||||||
|
'default_log_levels':"""tempest.stress=INFO,amqplib=WARN,
|
||||||
|
sqlalchemy=WARN,boto=WARN,suds=INFO,keystone=INFO,
|
||||||
|
eventlet.wsgi.server=WARN"""}
|
||||||
|
|
||||||
|
self['identity'] = {
|
||||||
|
'catalog_type': 'identity',
|
||||||
|
'disable_ssl_certificate_validation': False,
|
||||||
|
'uri': '',
|
||||||
|
'uri_v3': '',
|
||||||
|
'region': 'RegionOne',
|
||||||
|
'username': '',
|
||||||
|
'password': '',
|
||||||
|
'tenant_name': '',
|
||||||
|
'alt_username': '',
|
||||||
|
'alt_password': '',
|
||||||
|
'alt_tenant_name': '',
|
||||||
|
'admin_username': '',
|
||||||
|
'admin_password': '',
|
||||||
|
'admin_tenant_name': '',
|
||||||
|
'admin_role': ''}
|
||||||
|
|
||||||
|
|
||||||
|
self['compute'] = {
|
||||||
|
'catalog_type': 'compute',
|
||||||
|
'allow_tenant_isolation': True,
|
||||||
|
'allow_tenant_reuse': True,
|
||||||
|
'image_ref': '',
|
||||||
|
'image_ref_alt': '',
|
||||||
|
'flavor_ref': '',
|
||||||
|
'flavor_ref_alt': '',
|
||||||
|
'image_ssh_user': '',
|
||||||
|
'image_ssh_password': '',
|
||||||
|
'image_alt_ssh_user': '',
|
||||||
|
'image_alt_ssh_password': '',
|
||||||
|
'build_interval': '',
|
||||||
|
'build_timeout': '',
|
||||||
|
'run_ssh': False,
|
||||||
|
'ssh_user': '',
|
||||||
|
'fixed_network_name': '',
|
||||||
|
'network_for_ssh': '',
|
||||||
|
'ip_version_for_ssh': '',
|
||||||
|
'ping_timeout': '',
|
||||||
|
'ssh_timeout': '',
|
||||||
|
'ready_wait': 0,
|
||||||
|
'ssh_channel_timeout': 60,
|
||||||
|
'use_floatingip_for_ssh': True,
|
||||||
|
'create_image_enabled': True,
|
||||||
|
'resize_available': True,
|
||||||
|
'change_password_available': False,
|
||||||
|
'live_migration_available': False,
|
||||||
|
'use_block_migration_for_live_migration': False,
|
||||||
|
'block_migrate_supports_cinder_iscsi': False,
|
||||||
|
'disk_config_enabled': True,
|
||||||
|
'flavor_extra_enabled': True,
|
||||||
|
'volume_device_name': ''}
|
||||||
|
|
||||||
|
self['compute-admin'] = {
|
||||||
|
'username': '',
|
||||||
|
'password': '',
|
||||||
|
'tenant_name': ''}
|
||||||
|
|
||||||
|
self['image'] = {
|
||||||
|
'catalog_type': 'image',
|
||||||
|
'api_version': 1,
|
||||||
|
'http_image': ''}
|
||||||
|
|
||||||
|
self['network'] = {
|
||||||
|
'catalog_type': 'network',
|
||||||
|
'api_version': '2.0',
|
||||||
|
'tenant_network_cidr': '10.100.0.0/16',
|
||||||
|
'tenant_network_mask_bits': 28,
|
||||||
|
'tenant_networks_reachable': False,
|
||||||
|
'public_network_id': '',
|
||||||
|
'public_router_id': ''}
|
||||||
|
|
||||||
|
self['volume'] = {
|
||||||
|
'catalog_type': 'volume',
|
||||||
|
'disk_format': 'raw',
|
||||||
|
'build_interval': 1,
|
||||||
|
'build_timeout': 400,
|
||||||
|
'multi_backend_enabled': False,
|
||||||
|
'backend1_name': 'BACKEND_1',
|
||||||
|
'backend2_name': 'BACKEND_2',
|
||||||
|
'storage_protocol': 'iSCSI',
|
||||||
|
'vendor_name': 'Open Source'}
|
||||||
|
|
||||||
|
self['object-storage'] = {
|
||||||
|
'catalog_type': 'object-store',
|
||||||
|
'container_sync_timeout': 120,
|
||||||
|
'container_sync_interval': 5,
|
||||||
|
'accounts_quotas_available': True,
|
||||||
|
'operator_role': 'Member'}
|
||||||
|
|
||||||
|
self['boto'] = {
|
||||||
|
'ssh_user': 'cirros',
|
||||||
|
'ec2_url': 'http://172.16.200.130:8773/services/Cloud',
|
||||||
|
's3_url': 'http://172.16.200.130:3333',
|
||||||
|
'aws_access': '',
|
||||||
|
'aws_secret': '',
|
||||||
|
's3_materials_path': '',
|
||||||
|
'ari_manifest': 'cirros-0.3.1-x86_64-initrd.manifest.xml',
|
||||||
|
'ami_manifest': 'cirros-0.3.1-x86_64-blank.img.manifest.xml',
|
||||||
|
'aki_manifest': 'cirros-0.3.1-x86_64-vmlinuz.manifest.xml',
|
||||||
|
'instance_type': 'm1.nano',
|
||||||
|
'http_socket_timeout': 30,
|
||||||
|
'num_retries': 1,
|
||||||
|
'build_timeout': 400,
|
||||||
|
'build_interval': 1}
|
||||||
|
|
||||||
|
self['orchestration'] = {
|
||||||
|
'catalog_type': 'orchestration',
|
||||||
|
'build_interval': 1,
|
||||||
|
'build_timeout': 300,
|
||||||
|
'instance_type': 'm1.micro',
|
||||||
|
'#image_ref': 'ubuntu-vm-heat-cfntools',
|
||||||
|
'#keypair_name': 'heat_key'}
|
||||||
|
|
||||||
|
self['dashboard'] = {
|
||||||
|
'dashboard_url = http://172.16.200.130/',
|
||||||
|
'login_url = http://172.16.200.130/auth/login/',
|
||||||
|
|
||||||
|
self['scenario'] = {
|
||||||
|
'img_dir': '',
|
||||||
|
'ami_img_file': 'cirros-0.3.1-x86_64-blank.img',
|
||||||
|
'ari_img_file': 'cirros-0.3.1-x86_64-initrd',
|
||||||
|
'aki_img_file': 'cirros-0.3.1-x86_64-vmlinuz',
|
||||||
|
'ssh_user': 'cirros',
|
||||||
|
'large_ops_number': '0',
|
||||||
|
|
||||||
|
self['cli'] = {
|
||||||
|
'enabled': True,
|
||||||
|
'cli_dir': '/usr/local/bin',
|
||||||
|
'timeout': 15 }
|
||||||
|
|
||||||
|
self['service_available'] = {
|
||||||
|
'cinder': True,
|
||||||
|
'neutron': False,
|
||||||
|
'glance': True,
|
||||||
|
'swift': False,
|
||||||
|
'nova': True,
|
||||||
|
'heat': False,
|
||||||
|
'horizon': True}
|
||||||
|
|
||||||
|
self['stress'] = {
|
||||||
|
'max_instances': 32,
|
||||||
|
'log_check_interval': 60,
|
||||||
|
'default_thread_number_per_action': 4 }
|
82
refstack/common/test.py
Executable file
82
refstack/common/test.py
Executable file
@ -0,0 +1,82 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2013 Piston Cloud Computing, Inc.
|
||||||
|
# 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.
|
||||||
|
from refstack.common import *
|
||||||
|
|
||||||
|
class Tests(dict):
|
||||||
|
""" behaves like a dictionary of test objects """
|
||||||
|
user_id = None
|
||||||
|
vendor_id = None
|
||||||
|
|
||||||
|
def __init__(self,user_id=None,vendor_id=None):
|
||||||
|
""" accepts either a vendor or a user id then sets its self up
|
||||||
|
an object full of test objects filtered by the passed in id"""
|
||||||
|
|
||||||
|
|
||||||
|
class Test(object):
|
||||||
|
""" Test functions"""
|
||||||
|
id = None
|
||||||
|
sha = None
|
||||||
|
cloud_id = None
|
||||||
|
_status = None
|
||||||
|
|
||||||
|
def __init__(self,cloud_id,test_id=None,sha=None):
|
||||||
|
""" init method loads specified id or fails"""
|
||||||
|
if not id:
|
||||||
|
#create a new test id
|
||||||
|
self.id = 10
|
||||||
|
else:
|
||||||
|
# set test id
|
||||||
|
self.id = id
|
||||||
|
|
||||||
|
self.cloud_id = cloud_id
|
||||||
|
self.sha = sha
|
||||||
|
|
||||||
|
return self.id
|
||||||
|
|
||||||
|
|
||||||
|
def run_remote(self):
|
||||||
|
"""triggers remote run"""
|
||||||
|
# install tempest in virt env
|
||||||
|
# start tests against cloud_id using sha of tempest
|
||||||
|
# no sha indicates trunk
|
||||||
|
|
||||||
|
|
||||||
|
def run_local():
|
||||||
|
""" triggers local run"""
|
||||||
|
# spawns
|
||||||
|
return "run_local called"
|
||||||
|
|
||||||
|
|
||||||
|
def cancel(self):
|
||||||
|
""" cancels a running test"""
|
||||||
|
|
||||||
|
@def status():
|
||||||
|
doc = "The status property."
|
||||||
|
def fget(self):
|
||||||
|
return self._status
|
||||||
|
def fset(self, value):
|
||||||
|
self._status = value
|
||||||
|
def fdel(self):
|
||||||
|
del self._status
|
||||||
|
return locals()
|
||||||
|
|
||||||
|
@def config():
|
||||||
|
doc = "The config property."
|
||||||
|
def fget(self):
|
||||||
|
return self.config
|
||||||
|
|
||||||
|
return locals()
|
||||||
|
|
33
refstack/common/user.py
Executable file
33
refstack/common/user.py
Executable file
@ -0,0 +1,33 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2013 Piston Cloud Computing, Inc.
|
||||||
|
# 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.
|
||||||
|
from refstack.common import *
|
||||||
|
|
||||||
|
|
||||||
|
class User:
|
||||||
|
""" Vendor functions"""
|
||||||
|
id = None
|
||||||
|
|
||||||
|
def __init__(self, id):
|
||||||
|
""" init method loads specified id or fails"""
|
||||||
|
self.id = id
|
||||||
|
|
||||||
|
def clouds(self):
|
||||||
|
""" returns clouds object filtered to specified user"""
|
||||||
|
|
||||||
|
def tests(self, cloud_id = None):
|
||||||
|
""" returns object populated with test objects that belong to
|
||||||
|
this user and filtered by cloud_id if specified """
|
||||||
|
|
31
refstack/common/vendor.py
Executable file
31
refstack/common/vendor.py
Executable file
@ -0,0 +1,31 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2013 Piston Cloud Computing, Inc.
|
||||||
|
# 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.
|
||||||
|
from refstack.common import *
|
||||||
|
|
||||||
|
|
||||||
|
class Vendor:
|
||||||
|
""" Vendor functions"""
|
||||||
|
def __init__(self, id):
|
||||||
|
""" init method loads specified id or fails"""
|
||||||
|
|
||||||
|
def users(self):
|
||||||
|
""" returns users object filtered to the specified vendor"""
|
||||||
|
|
||||||
|
def clouds(self):
|
||||||
|
""" returns clouds object filtered to specified vendor"""
|
||||||
|
|
||||||
|
def tests(self):
|
||||||
|
""" returns tests object filtered to specified vendor"""
|
Loading…
x
Reference in New Issue
Block a user