rubbos testcase running entrance
[bottlenecks.git] / testsuites / rubbos / run_rubbos.py
1 #!/usr/bin/env python
2 ##############################################################################
3 # Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10 import os
11 import argparse
12 import time
13 import heatclient
14 import keystoneclient
15 import glanceclient
16 import novaclient
17
18 #------------------------------------------------------
19 # parser for configuration files in each test case
20 # ------------------------------------------------------
21 parser = argparse.ArgumentParser()
22 parser.add_argument("-c", "--conf",
23                     help="configuration files for the testcase, in yaml format",
24                     default="rubbos_1-1-1.yaml")
25 args = parser.parse_args()
26
27 #--------------------------------------------------
28 # logging configuration
29 #--------------------------------------------------
30 logger = logging.getLogger('run_rubbos')
31 logger.setLevel(logging.DEBUG)
32
33 def _get_keystone_client():
34     keystone_client = keystoneclient.v2_0.client.Client(
35                 auth_url=os.environ.get('OS_AUTH_URL'),
36                 username=os.environ.get('OS_USERNAME'),
37                 password=os.environ.get('OS_PASSWORD'),
38                 tenant_name=os.environ.get('OS_TENANT_NAME'),
39                 cacert=os.environ.get('OS_CACERT'))
40     return keystone_client
41
42 def _get_heat_client():
43     keystone = _get_keystone_client()
44     heat_endpoint = keystone.service_catalog.url_for(service_type='orchestration')
45     heat_client = heatclient.client.Client('1', endpoint=heat_endpoint, token=keystone.auth_token)
46
47     return heat_client
48
49 def _get_glance_client():
50     keystone = _get_keystone_client()
51     glance_endpoint = keystone.service_catalog.url_for(service_type='image',
52                                                        endpoint_type='publicURL')
53     return glanceclient.v2.client.Client(glance_endpoint, token=keystone.auth_token)
54
55 def _get_nova_client():
56     nova_client = novaclient.client.Client("2", auth_url=os.environ.get('OS_AUTH_URL'),
57                 username=os.environ.get('OS_USERNAME'),
58                 password=os.environ.get('OS_PASSWORD'),
59                 tenant_name=os.environ.get('OS_TENANT_NAME'),
60                 region_name=os.environ.get('OS_REGION_NAME'),
61                 cacert=os.environ.get('OS_CACERT'))
62     return nova_client
63
64 def download_url(url, dest_path):
65     """
66     Download a file to a destination path given a URL
67     """
68     name = url.rsplit('/')[-1]
69     dest = dest_path + "/" + name
70     try:
71         response = urllib2.urlopen(url)
72     except (urllib2.HTTPError, urllib2.URLError):
73         return False
74
75     with open(dest, 'wb') as f:
76         shutil.copyfileobj(response, f)
77     return True
78
79 def rubbos_env_prepare(template=None):
80     """ Prepare for rubbos running env
81     """
82     #logger.info("generate heat template for the testcase based on template '%s'." % template)
83     pass
84
85 def rubbos_env_cleanup():
86     glance = _get_glance_client()
87     heat = _get_heat_client()
88     nova = _get_nova_client()
89
90     for stack in self.heat.stacks.list():
91         heat.stacks.delete(stack.id)
92
93     for image in self.glance.images.list():
94         glance.images.delete(image.id)
95
96     for keypair in self.nova.keypairs.list():
97         nova.keypairs.delete(keypair.id)
98
99     for flavor in self.nova.flavors.list():
100         nova.flavors.delete(flavor.id)
101
102     logger.info("openstack env cleanup")
103
104 def rubbos_load_image(name=None):
105     file_url = '/tmp'
106     download_url(image_url,file_url)
107
108     glance = _get_glance_client()
109     image_args = {'name': name,
110                   'disk-format': 'qcow2',
111                   'container_format': 'bare',
112                   'file': '/tmp/bottlenecks-trusty-server.img'}
113     image = glance.images.create(**image_args)
114     if not (image.id):
115        logger.error("failed to upload rubbos image to openstack")
116        exit(-1)
117
118 def rubbos_create_instance(template_file=None, rubbos_parameters=None):
119     heat = _get_heat_client()
120     template = open(template_file, 'r')
121     rubbos_stack = heat.stacks.create(stack_name='rubbos', template=template.read(), parameters=rubbos_parameters)
122     uid = rubbos_stack['stack']['id']
123
124 def rubbos_stack_check(stack_name=None):
125     for stack in heat.stacks.list():
126         if stack.stack_name == stack_name:
127            return stack.stack_status
128     return 'NOT_FOUND'
129
130 def rubbos_run():
131     pass
132
133 def main():
134     global Heat_template
135     global image_url
136
137     image_url = 'http://artifacts.opnfv.org/bottlenecks/rubbos/bottlenecks-trusty-server.img'
138
139     if not (args.conf):
140        logger.error("configuration files are not set for testcase")
141        exit(-1)
142     else:
143        Heat_template = args.conf
144
145     parameters={'image': 'rubbos',
146                 'key_name': 'rubbos-key',
147                 'public_net': 'net04_ext'}
148
149     rubbos_env_prepare(Heat_template)
150     rubbos_env_cleanup()
151     rubbos_load_image(name='rubbos')
152     rubbos_create_instance(template_file=Heat_template, rubbos_paramters=parameters)
153     time.sleep(400)
154     rubbos_stack_check(stack_name='rubbos')
155     rubbos_run()
156     rubbos_env_cleanup()
157
158 if __name__=='__main__':
159     main()