summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta-openstack/recipes-devtools/python/python-horizon/horizon.init4
-rw-r--r--meta-openstack/recipes-devtools/python/python-horizon/local_settings.py450
-rw-r--r--meta-openstack/recipes-devtools/python/python-horizon/openstack-dashboard-apache.conf55
-rw-r--r--meta-openstack/recipes-devtools/python/python-horizon_git.bb36
-rw-r--r--meta-openstack/recipes-extended/packagegroups/packagegroup-cloud-controller.bb2
5 files changed, 545 insertions, 2 deletions
diff --git a/meta-openstack/recipes-devtools/python/python-horizon/horizon.init b/meta-openstack/recipes-devtools/python/python-horizon/horizon.init
index 994fbec..1c03b78 100644
--- a/meta-openstack/recipes-devtools/python/python-horizon/horizon.init
+++ b/meta-openstack/recipes-devtools/python/python-horizon/horizon.init
@@ -66,6 +66,10 @@ status()
66 echo "$DESC is not running" 66 echo "$DESC is not running"
67} 67}
68 68
69if [ -e /etc/apache2/conf.d/openstack-dashboard-apache.conf ]; then
70 chown -R daemon /usr/share/openstack-dashboard/openstack_dashboard/static
71fi
72
69case "$1" in 73case "$1" in
70 start) 74 start)
71 start 75 start
diff --git a/meta-openstack/recipes-devtools/python/python-horizon/local_settings.py b/meta-openstack/recipes-devtools/python/python-horizon/local_settings.py
new file mode 100644
index 0000000..8046b69
--- /dev/null
+++ b/meta-openstack/recipes-devtools/python/python-horizon/local_settings.py
@@ -0,0 +1,450 @@
1import os
2
3from django.utils.translation import ugettext_lazy as _
4
5from openstack_dashboard import exceptions
6
7DEBUG = True
8TEMPLATE_DEBUG = DEBUG
9
10# Required for Django 1.5.
11# If horizon is running in production (DEBUG is False), set this
12# with the list of host/domain names that the application can serve.
13# For more information see:
14# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
15#ALLOWED_HOSTS = ['horizon.example.com', ]
16
17# Set SSL proxy settings:
18# For Django 1.4+ pass this header from the proxy after terminating the SSL,
19# and don't forget to strip it from the client's request.
20# For more information see:
21# https://docs.djangoproject.com/en/1.4/ref/settings/#secure-proxy-ssl-header
22# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
23
24# If Horizon is being served through SSL, then uncomment the following two
25# settings to better secure the cookies from security exploits
26#CSRF_COOKIE_SECURE = True
27#SESSION_COOKIE_SECURE = True
28
29# Overrides for OpenStack API versions. Use this setting to force the
30# OpenStack dashboard to use a specfic API version for a given service API.
31# NOTE: The version should be formatted as it appears in the URL for the
32# service API. For example, The identity service APIs have inconsistent
33# use of the decimal point, so valid options would be "2.0" or "3".
34# OPENSTACK_API_VERSIONS = {
35# "identity": 3
36# }
37
38# Set this to True if running on multi-domain model. When this is enabled, it
39# will require user to enter the Domain name in addition to username for login.
40# OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = False
41
42# Overrides the default domain used when running on single-domain model
43# with Keystone V3. All entities will be created in the default domain.
44# OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = 'Default'
45
46# Set Console type:
47# valid options would be "AUTO", "VNC" or "SPICE"
48# CONSOLE_TYPE = "AUTO"
49
50# Default OpenStack Dashboard configuration.
51HORIZON_CONFIG = {
52 'dashboards': ('project', 'admin', 'settings',),
53 'default_dashboard': 'project',
54 'user_home': 'openstack_dashboard.views.get_user_home',
55 'ajax_queue_limit': 10,
56 'auto_fade_alerts': {
57 'delay': 3000,
58 'fade_duration': 1500,
59 'types': ['alert-success', 'alert-info']
60 },
61 'help_url': "http://docs.openstack.org",
62 'exceptions': {'recoverable': exceptions.RECOVERABLE,
63 'not_found': exceptions.NOT_FOUND,
64 'unauthorized': exceptions.UNAUTHORIZED},
65}
66
67# Specify a regular expression to validate user passwords.
68# HORIZON_CONFIG["password_validator"] = {
69# "regex": '.*',
70# "help_text": _("Your password does not meet the requirements.")
71# }
72
73# Disable simplified floating IP address management for deployments with
74# multiple floating IP pools or complex network requirements.
75# HORIZON_CONFIG["simple_ip_management"] = False
76
77# Turn off browser autocompletion for the login form if so desired.
78# HORIZON_CONFIG["password_autocomplete"] = "off"
79
80LOCAL_PATH = "/usr/share/openstack-dashboard/openstack_dashboard/static"
81
82# Set custom secret key:
83# You can either set it to a specific value or you can let horizion generate a
84# default secret key that is unique on this machine, e.i. regardless of the
85# amount of Python WSGI workers (if used behind Apache+mod_wsgi): However, there
86# may be situations where you would want to set this explicitly, e.g. when
87# multiple dashboard instances are distributed on different machines (usually
88# behind a load-balancer). Either you have to make sure that a session gets all
89# requests routed to the same dashboard instance or you set the same SECRET_KEY
90# for all of them.
91from horizon.utils import secret_key
92SECRET_KEY = secret_key.generate_or_read_from_file(os.path.join(LOCAL_PATH, '.secret_key_store'))
93
94# We recommend you use memcached for development; otherwise after every reload
95# of the django development server, you will have to login again. To use
96# memcached set CACHES to something like
97CACHES = {
98 'default': {
99 'BACKEND' : 'django.core.cache.backends.memcached.MemcachedCache',
100 'LOCATION' : '127.0.0.1:11211',
101 }
102}
103
104#CACHES = {
105# 'default': {
106# 'BACKEND' : 'django.core.cache.backends.locmem.LocMemCache'
107# }
108#}
109
110# Send email to the console by default
111EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
112# Or send them to /dev/null
113#EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
114
115# Configure these for your outgoing email host
116# EMAIL_HOST = 'smtp.my-company.com'
117# EMAIL_PORT = 25
118# EMAIL_HOST_USER = 'djangomail'
119# EMAIL_HOST_PASSWORD = 'top-secret!'
120
121# For multiple regions uncomment this configuration, and add (endpoint, title).
122# AVAILABLE_REGIONS = [
123# ('http://cluster1.example.com:5000/v2.0', 'cluster1'),
124# ('http://cluster2.example.com:5000/v2.0', 'cluster2'),
125# ]
126
127OPENSTACK_HOST = "127.0.0.1"
128OPENSTACK_KEYSTONE_URL = "http://%s:5000/v2.0" % OPENSTACK_HOST
129OPENSTACK_KEYSTONE_DEFAULT_ROLE = "Member"
130
131# Disable SSL certificate checks (useful for self-signed certificates):
132# OPENSTACK_SSL_NO_VERIFY = True
133
134# The CA certificate to use to verify SSL connections
135# OPENSTACK_SSL_CACERT = '/path/to/cacert.pem'
136
137# The OPENSTACK_KEYSTONE_BACKEND settings can be used to identify the
138# capabilities of the auth backend for Keystone.
139# If Keystone has been configured to use LDAP as the auth backend then set
140# can_edit_user to False and name to 'ldap'.
141#
142# TODO(tres): Remove these once Keystone has an API to identify auth backend.
143OPENSTACK_KEYSTONE_BACKEND = {
144 'name': 'native',
145 'can_edit_user': True,
146 'can_edit_group': True,
147 'can_edit_project': True,
148 'can_edit_domain': True,
149 'can_edit_role': True
150}
151
152OPENSTACK_HYPERVISOR_FEATURES = {
153 'can_set_mount_point': True,
154}
155
156# The OPENSTACK_NEUTRON_NETWORK settings can be used to enable optional
157# services provided by neutron. Options currenly available are load
158# balancer service, security groups, quotas, VPN service.
159OPENSTACK_NEUTRON_NETWORK = {
160 'enable_lb': False,
161 'enable_firewall': False,
162 'enable_quotas': True,
163 'enable_vpn': False,
164 # The profile_support option is used to detect if an external router can be
165 # configured via the dashboard. When using specific plugins the
166 # profile_support can be turned on if needed.
167 'profile_support': None,
168 #'profile_support': 'cisco',
169}
170
171# The OPENSTACK_IMAGE_BACKEND settings can be used to customize features
172# in the OpenStack Dashboard related to the Image service, such as the list
173# of supported image formats.
174# OPENSTACK_IMAGE_BACKEND = {
175# 'image_formats': [
176# ('', ''),
177# ('aki', _('AKI - Amazon Kernel Image')),
178# ('ami', _('AMI - Amazon Machine Image')),
179# ('ari', _('ARI - Amazon Ramdisk Image')),
180# ('iso', _('ISO - Optical Disk Image')),
181# ('qcow2', _('QCOW2 - QEMU Emulator')),
182# ('raw', _('Raw')),
183# ('vdi', _('VDI')),
184# ('vhd', _('VHD')),
185# ('vmdk', _('VMDK'))
186# ]
187# }
188
189# OPENSTACK_ENDPOINT_TYPE specifies the endpoint type to use for the endpoints
190# in the Keystone service catalog. Use this setting when Horizon is running
191# external to the OpenStack environment. The default is 'publicURL'.
192#OPENSTACK_ENDPOINT_TYPE = "publicURL"
193
194# SECONDARY_ENDPOINT_TYPE specifies the fallback endpoint type to use in the
195# case that OPENSTACK_ENDPOINT_TYPE is not present in the endpoints
196# in the Keystone service catalog. Use this setting when Horizon is running
197# external to the OpenStack environment. The default is None. This
198# value should differ from OPENSTACK_ENDPOINT_TYPE if used.
199#SECONDARY_ENDPOINT_TYPE = "publicURL"
200
201# The number of objects (Swift containers/objects or images) to display
202# on a single page before providing a paging element (a "more" link)
203# to paginate results.
204API_RESULT_LIMIT = 1000
205API_RESULT_PAGE_SIZE = 20
206
207# The timezone of the server. This should correspond with the timezone
208# of your entire OpenStack installation, and hopefully be in UTC.
209TIME_ZONE = "UTC"
210
211# When launching an instance, the menu of available flavors is
212# sorted by RAM usage, ascending. Provide a callback method here
213# (and/or a flag for reverse sort) for the sorted() method if you'd
214# like a different behaviour. For more info, see
215# http://docs.python.org/2/library/functions.html#sorted
216# CREATE_INSTANCE_FLAVOR_SORT = {
217# 'key': my_awesome_callback_method,
218# 'reverse': False,
219# }
220
221# The Horizon Policy Enforcement engine uses these values to load per service
222# policy rule files. The content of these files should match the files the
223# OpenStack services are using to determine role based access control in the
224# target installation.
225
226# Path to directory containing policy.json files
227#POLICY_FILES_PATH = os.path.join(ROOT_PATH, "conf")
228# Map of local copy of service policy files
229#POLICY_FILES = {
230# 'identity': 'keystone_policy.json',
231# 'compute': 'nova_policy.json'
232#}
233
234# Trove user and database extension support. By default support for
235# creating users and databases on database instances is turned on.
236# To disable these extensions set the permission here to something
237# unusable such as ["!"].
238# TROVE_ADD_USER_PERMS = []
239# TROVE_ADD_DATABASE_PERMS = []
240
241LOGGING = {
242 'version': 1,
243 # When set to True this will disable all logging except
244 # for loggers specified in this configuration dictionary. Note that
245 # if nothing is specified here and disable_existing_loggers is True,
246 # django.db.backends will still log unless it is disabled explicitly.
247 'disable_existing_loggers': False,
248 'handlers': {
249 'null': {
250 'level': 'DEBUG',
251 'class': 'django.utils.log.NullHandler',
252 },
253 'console': {
254 # Set the level to "DEBUG" for verbose output logging.
255 'level': 'INFO',
256 'class': 'logging.StreamHandler',
257 },
258 },
259 'loggers': {
260 # Logging from django.db.backends is VERY verbose, send to null
261 # by default.
262 'django.db.backends': {
263 'handlers': ['null'],
264 'propagate': False,
265 },
266 'requests': {
267 'handlers': ['null'],
268 'propagate': False,
269 },
270 'horizon': {
271 'handlers': ['console'],
272 'level': 'DEBUG',
273 'propagate': False,
274 },
275 'openstack_dashboard': {
276 'handlers': ['console'],
277 'level': 'DEBUG',
278 'propagate': False,
279 },
280 'novaclient': {
281 'handlers': ['console'],
282 'level': 'DEBUG',
283 'propagate': False,
284 },
285 'cinderclient': {
286 'handlers': ['console'],
287 'level': 'DEBUG',
288 'propagate': False,
289 },
290 'keystoneclient': {
291 'handlers': ['console'],
292 'level': 'DEBUG',
293 'propagate': False,
294 },
295 'glanceclient': {
296 'handlers': ['console'],
297 'level': 'DEBUG',
298 'propagate': False,
299 },
300 'neutronclient': {
301 'handlers': ['console'],
302 'level': 'DEBUG',
303 'propagate': False,
304 },
305 'heatclient': {
306 'handlers': ['console'],
307 'level': 'DEBUG',
308 'propagate': False,
309 },
310 'ceilometerclient': {
311 'handlers': ['console'],
312 'level': 'DEBUG',
313 'propagate': False,
314 },
315 'troveclient': {
316 'handlers': ['console'],
317 'level': 'DEBUG',
318 'propagate': False,
319 },
320 'swiftclient': {
321 'handlers': ['console'],
322 'level': 'DEBUG',
323 'propagate': False,
324 },
325 'openstack_auth': {
326 'handlers': ['console'],
327 'level': 'DEBUG',
328 'propagate': False,
329 },
330 'nose.plugins.manager': {
331 'handlers': ['console'],
332 'level': 'DEBUG',
333 'propagate': False,
334 },
335 'django': {
336 'handlers': ['console'],
337 'level': 'DEBUG',
338 'propagate': False,
339 },
340 'iso8601': {
341 'handlers': ['null'],
342 'propagate': False,
343 },
344 }
345}
346
347SECURITY_GROUP_RULES = {
348 'all_tcp': {
349 'name': 'ALL TCP',
350 'ip_protocol': 'tcp',
351 'from_port': '1',
352 'to_port': '65535',
353 },
354 'all_udp': {
355 'name': 'ALL UDP',
356 'ip_protocol': 'udp',
357 'from_port': '1',
358 'to_port': '65535',
359 },
360 'all_icmp': {
361 'name': 'ALL ICMP',
362 'ip_protocol': 'icmp',
363 'from_port': '-1',
364 'to_port': '-1',
365 },
366 'ssh': {
367 'name': 'SSH',
368 'ip_protocol': 'tcp',
369 'from_port': '22',
370 'to_port': '22',
371 },
372 'smtp': {
373 'name': 'SMTP',
374 'ip_protocol': 'tcp',
375 'from_port': '25',
376 'to_port': '25',
377 },
378 'dns': {
379 'name': 'DNS',
380 'ip_protocol': 'tcp',
381 'from_port': '53',
382 'to_port': '53',
383 },
384 'http': {
385 'name': 'HTTP',
386 'ip_protocol': 'tcp',
387 'from_port': '80',
388 'to_port': '80',
389 },
390 'pop3': {
391 'name': 'POP3',
392 'ip_protocol': 'tcp',
393 'from_port': '110',
394 'to_port': '110',
395 },
396 'imap': {
397 'name': 'IMAP',
398 'ip_protocol': 'tcp',
399 'from_port': '143',
400 'to_port': '143',
401 },
402 'ldap': {
403 'name': 'LDAP',
404 'ip_protocol': 'tcp',
405 'from_port': '389',
406 'to_port': '389',
407 },
408 'https': {
409 'name': 'HTTPS',
410 'ip_protocol': 'tcp',
411 'from_port': '443',
412 'to_port': '443',
413 },
414 'smtps': {
415 'name': 'SMTPS',
416 'ip_protocol': 'tcp',
417 'from_port': '465',
418 'to_port': '465',
419 },
420 'imaps': {
421 'name': 'IMAPS',
422 'ip_protocol': 'tcp',
423 'from_port': '993',
424 'to_port': '993',
425 },
426 'pop3s': {
427 'name': 'POP3S',
428 'ip_protocol': 'tcp',
429 'from_port': '995',
430 'to_port': '995',
431 },
432 'ms_sql': {
433 'name': 'MS SQL',
434 'ip_protocol': 'tcp',
435 'from_port': '1433',
436 'to_port': '1433',
437 },
438 'mysql': {
439 'name': 'MYSQL',
440 'ip_protocol': 'tcp',
441 'from_port': '3306',
442 'to_port': '3306',
443 },
444 'rdp': {
445 'name': 'RDP',
446 'ip_protocol': 'tcp',
447 'from_port': '3389',
448 'to_port': '3389',
449 },
450}
diff --git a/meta-openstack/recipes-devtools/python/python-horizon/openstack-dashboard-apache.conf b/meta-openstack/recipes-devtools/python/python-horizon/openstack-dashboard-apache.conf
new file mode 100644
index 0000000..5b77639
--- /dev/null
+++ b/meta-openstack/recipes-devtools/python/python-horizon/openstack-dashboard-apache.conf
@@ -0,0 +1,55 @@
1LoadModule wsgi_module /usr/lib64/apache2/modules/mod_wsgi.so
2
3# python 2.7.2 has a bug that causes fork run in sub interpreters to fail
4# http://bugs.python.org/issue13156
5WSGIApplicationGroup %{GLOBAL}
6
7<VirtualHost *:80>
8 ServerAdmin webmaster@localhost
9 WSGIScriptAlias / /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
10 WSGIDaemonProcess horizon user=daemon group=daemon home=/usr/share/openstack-dashboard/openstack_dashboard/static
11 #WSGIProcessGroup openstack-dashboard
12 Alias /static /usr/share/openstack-dashboard/openstack_dashboard/static
13
14 DocumentRoot /usr/share/apache2/default-site/htdocs
15
16 <Directory />
17 AllowOverride None
18 </Directory>
19
20 <Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi/>
21 <IfVersion < 2.3>
22 Order allow,deny
23 Allow from all
24 </IfVersion>
25 <IfVersion >= 2.3>
26 Require all granted
27 </IfVersion>
28 </Directory>
29
30 Alias /static/horizon %PYTHON_SITEPACKAGES%/horizon/static/horizon
31
32 <Directory %PYTHON_SITEPACKAGES%/horizon/static/horizon>
33 <IfVersion < 2.3>
34 Order allow,deny
35 Allow from all
36 </IfVersion>
37 <IfVersion >= 2.3>
38 Require all granted
39 </IfVersion>
40 </Directory>
41
42 <Directory /usr/share/openstack-dashboard/openstack_dashboard/static/>
43 <IfVersion < 2.3>
44 Order allow,deny
45 Allow from all
46 </IfVersion>
47 <IfVersion >= 2.3>
48 Require all granted
49 </IfVersion>
50 </Directory>
51
52 ErrorLog /var/log/apache2/openstack-dashboard-error.log
53 LogLevel debug
54 CustomLog /var/log/apache2/openstack-dashboard-access.log combined
55 </VirtualHost>
diff --git a/meta-openstack/recipes-devtools/python/python-horizon_git.bb b/meta-openstack/recipes-devtools/python/python-horizon_git.bb
index c3e167f..153f4d4 100644
--- a/meta-openstack/recipes-devtools/python/python-horizon_git.bb
+++ b/meta-openstack/recipes-devtools/python/python-horizon_git.bb
@@ -27,12 +27,14 @@ DEPENDS_${PN} += "python-django \
27 python-pbr \ 27 python-pbr \
28 " 28 "
29 29
30PR = "r1" 30PR = "r2"
31SRCNAME = "horizon" 31SRCNAME = "horizon"
32 32
33SRC_URI = "git://github.com/openstack/${SRCNAME}.git;branch=stable/havana \ 33SRC_URI = "git://github.com/openstack/${SRCNAME}.git;branch=stable/havana \
34 file://horizon.init \ 34 file://horizon.init \
35 file://fix_bindir_path.patch \ 35 file://fix_bindir_path.patch \
36 file://openstack-dashboard-apache.conf \
37 file://local_settings.py \
36 " 38 "
37 39
38SRCREV="b2259b352fd1e00a269b8275afa8093223598235" 40SRCREV="b2259b352fd1e00a269b8275afa8093223598235"
@@ -68,9 +70,25 @@ do_install_append() {
68 # mv ${D}${datadir}/bin ${DASHBOARD_DIR}/bin 70 # mv ${D}${datadir}/bin ${DASHBOARD_DIR}/bin
69 71
70 cp run_tests.sh ${HORIZON_CONF_DIR} 72 cp run_tests.sh ${HORIZON_CONF_DIR}
73
74 # the following are setup required for horizon-apache
75 install -d ${D}/usr/share/openstack-dashboard
76 cp -a ${S}/openstack_dashboard ${D}/usr/share/openstack-dashboard/
77 cp ${S}/manage.py ${D}/usr/share/openstack-dashboard
78
79 install -D -m 644 ${WORKDIR}/local_settings.py \
80 ${D}/etc/openstack-dashboard/local_settings.py
81 ln -fs /etc/openstack-dashboard/local_settings.py \
82 ${D}/usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py
83
84 install -D -m 644 ${WORKDIR}/openstack-dashboard-apache.conf \
85 ${D}/etc/apache2/conf.d/openstack-dashboard-apache.conf
86 sed -i -e 's#%PYTHON_SITEPACKAGES%#${PYTHON_SITEPACKAGES_DIR}#' ${D}/etc/apache2/conf.d/openstack-dashboard-apache.conf
87
88 ln -fs openstack_dashboard/static ${D}/usr/share/openstack-dashboard/static
71} 89}
72 90
73PACKAGES += "${SRCNAME}-tests ${SRCNAME}" 91PACKAGES += "${SRCNAME}-tests ${SRCNAME} ${SRCNAME}-apache"
74 92
75FILES_${PN} = "${libdir}/*" 93FILES_${PN} = "${libdir}/*"
76 94
@@ -81,6 +99,12 @@ FILES_${SRCNAME} = "${bindir}/* \
81 ${datadir}/* \ 99 ${datadir}/* \
82 " 100 "
83 101
102FILES_${SRCNAME}-apache = "/etc/apache2 \
103 /etc/openstack-dashboard/ \
104 /usr/share/openstack-dashboard/ \
105 /var/lib/openstack-dashboard \
106 "
107
84RDEP_ARCH_VAR = "" 108RDEP_ARCH_VAR = ""
85RDEP_ARCH_VAR_arm = "nodejs" 109RDEP_ARCH_VAR_arm = "nodejs"
86RDEP_ARCH_VAR_i686 = "nodejs" 110RDEP_ARCH_VAR_i686 = "nodejs"
@@ -113,3 +137,11 @@ RDEPENDS_${SRCNAME} = "${PN}"
113INITSCRIPT_PACKAGES = "${SRCNAME}" 137INITSCRIPT_PACKAGES = "${SRCNAME}"
114INITSCRIPT_NAME_${SRCNAME} = "horizon" 138INITSCRIPT_NAME_${SRCNAME} = "horizon"
115INITSCRIPT_PARAMS_${SRCNAME} = "${OS_DEFAULT_INITSCRIPT_PARAMS}" 139INITSCRIPT_PARAMS_${SRCNAME} = "${OS_DEFAULT_INITSCRIPT_PARAMS}"
140
141RDEPENDS_${SRCNAME}-apache = "\
142 apache2 \
143 mod-wsgi \
144 python-lesscpy \
145 memcached \
146 python-memcached \
147 "
diff --git a/meta-openstack/recipes-extended/packagegroups/packagegroup-cloud-controller.bb b/meta-openstack/recipes-extended/packagegroups/packagegroup-cloud-controller.bb
index f3390a1..b716052 100644
--- a/meta-openstack/recipes-extended/packagegroups/packagegroup-cloud-controller.bb
+++ b/meta-openstack/recipes-extended/packagegroups/packagegroup-cloud-controller.bb
@@ -40,6 +40,8 @@ RDEPENDS_${PN} = " postgresql-setup \
40 python-heat-cfntools \ 40 python-heat-cfntools \
41 python-openstackclient \ 41 python-openstackclient \
42 horizon \ 42 horizon \
43 horizon-apache \
44 apache2 \
43 novnc \ 45 novnc \
44 chkconfig \ 46 chkconfig \
45 qemu \ 47 qemu \