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