Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / views.py @ dd339992

History | View | Annotate | Download (20.1 kB)

1 b4b82ec4 Giorgos Korfiatis
# Copyright 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 8950a78f Christodoulos Psaltis
#
3 a5bc3755 Vangelis Koukis
# Redistribution and use in source and binary forms, with or
4 a5bc3755 Vangelis Koukis
# without modification, are permitted provided that the following
5 a5bc3755 Vangelis Koukis
# conditions are met:
6 8950a78f Christodoulos Psaltis
#
7 a5bc3755 Vangelis Koukis
#   1. Redistributions of source code must retain the above
8 a5bc3755 Vangelis Koukis
#      copyright notice, this list of conditions and the following
9 a5bc3755 Vangelis Koukis
#      disclaimer.
10 8950a78f Christodoulos Psaltis
#
11 a5bc3755 Vangelis Koukis
#   2. Redistributions in binary form must reproduce the above
12 a5bc3755 Vangelis Koukis
#      copyright notice, this list of conditions and the following
13 a5bc3755 Vangelis Koukis
#      disclaimer in the documentation and/or other materials
14 a5bc3755 Vangelis Koukis
#      provided with the distribution.
15 8950a78f Christodoulos Psaltis
#
16 a5bc3755 Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 a5bc3755 Vangelis Koukis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 a5bc3755 Vangelis Koukis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 a5bc3755 Vangelis Koukis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 a5bc3755 Vangelis Koukis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 a5bc3755 Vangelis Koukis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 a5bc3755 Vangelis Koukis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 a5bc3755 Vangelis Koukis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 a5bc3755 Vangelis Koukis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 a5bc3755 Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 a5bc3755 Vangelis Koukis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 a5bc3755 Vangelis Koukis
# POSSIBILITY OF SUCH DAMAGE.
28 8950a78f Christodoulos Psaltis
#
29 a5bc3755 Vangelis Koukis
# The views and conclusions contained in the software and
30 a5bc3755 Vangelis Koukis
# documentation are those of the authors and should not be
31 a5bc3755 Vangelis Koukis
# interpreted as representing official policies, either expressed
32 a5bc3755 Vangelis Koukis
# or implied, of GRNET S.A.
33 8950a78f Christodoulos Psaltis
#
34 258235f4 Kostas Papadimitriou
35 edda4d30 Markos Gogoulos
import os
36 258235f4 Kostas Papadimitriou
37 abf90954 Markos Gogoulos
from django.conf import settings
38 edda4d30 Markos Gogoulos
from django.utils.translation import gettext_lazy as _
39 479c3051 Ilias Tsitsimpis
from django.template import loader
40 cc7c5902 Dimitris Moraitis
from django.http import HttpResponse
41 ec06b07c Dimitris Moraitis
from django.utils.translation import get_language
42 9c901aec Markos Gogoulos
from django.utils import simplejson as json
43 734107ef Kostas Papadimitriou
from synnefo_branding.utils import render_to_string
44 b687587e Kostas Papadimitriou
from django.core.urlresolvers import reverse
45 0d0466bf Kostas Papadimitriou
from django.template import RequestContext
46 31f9a55b Kostas Papadimitriou
47 07d104d8 Kostas Papadimitriou
from synnefo.util.version import get_component_version
48 7970aa87 Kostas Papadimitriou
49 27738c43 Kostas Papadimitriou
from synnefo.ui import settings as uisettings
50 02f0cd19 Kostas Papadimitriou
51 07d104d8 Kostas Papadimitriou
SYNNEFO_JS_LIB_VERSION = get_component_version('app')
52 30b6f316 Kostas Papadimitriou
53 66be390b Kostas Papadimitriou
# UI preferences settings
54 66be390b Kostas Papadimitriou
TIMEOUT = getattr(settings, "TIMEOUT", 10000)
55 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL = getattr(settings, "UI_UPDATE_INTERVAL", 5000)
56 6de7fde5 Kostas Papadimitriou
CHANGES_SINCE_ALIGNMENT = getattr(settings, "UI_CHANGES_SINCE_ALIGNMENT", 0)
57 e3ff6830 Georgios D. Tsoukalas
UPDATE_INTERVAL_INCREASE = getattr(settings, "UI_UPDATE_INTERVAL_INCREASE",
58 e3ff6830 Georgios D. Tsoukalas
                                   500)
59 479c3051 Ilias Tsitsimpis
UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT = \
60 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT", 3)
61 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_FAST = getattr(settings, "UI_UPDATE_INTERVAL_FAST", 2500)
62 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_MAX = getattr(settings, "UI_UPDATE_INTERVAL_MAX", 10000)
63 30b6f316 Kostas Papadimitriou
64 66be390b Kostas Papadimitriou
# predefined values settings
65 479c3051 Ilias Tsitsimpis
VM_IMAGE_COMMON_METADATA = \
66 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_VM_IMAGE_COMMON_METADATA", ["OS", "users"])
67 66be390b Kostas Papadimitriou
SUGGESTED_FLAVORS_DEFAULT = {}
68 140d08d0 Kostas Papadimitriou
SUGGESTED_FLAVORS = getattr(settings, "VM_CREATE_SUGGESTED_FLAVORS",
69 140d08d0 Kostas Papadimitriou
                            SUGGESTED_FLAVORS_DEFAULT)
70 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES_DEFAULT = ["Database server", "File server", "Mail server",
71 140d08d0 Kostas Papadimitriou
                           "Web server", "Proxy"]
72 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES = getattr(settings, "VM_CREATE_SUGGESTED_ROLES",
73 140d08d0 Kostas Papadimitriou
                          SUGGESTED_ROLES_DEFAULT)
74 30b6f316 Kostas Papadimitriou
IMAGE_ICONS = settings.IMAGE_ICONS
75 479c3051 Ilias Tsitsimpis
IMAGE_DELETED_TITLE = \
76 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_IMAGE_DELETED_TITLE', '(deleted)')
77 479c3051 Ilias Tsitsimpis
IMAGE_DELETED_SIZE_TITLE = \
78 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_IMAGE_DELETED_SIZE_TITLE', '(none)')
79 66be390b Kostas Papadimitriou
80 c2a55260 Kostas Papadimitriou
81 c2a55260 Kostas Papadimitriou
SSH_SUPPORT_OSFAMILY_EXCLUDE_LIST = getattr(
82 c2a55260 Kostas Papadimitriou
    settings, "UI_SSH_SUPPORT_OSFAMILY_EXCLUDE_LIST", ['windows'])
83 5acb8b8a Kostas Papadimitriou
84 556dcd88 Kostas Papadimitriou
OS_CREATED_USERS = getattr(settings, "UI_OS_DEFAULT_USER_MAP")
85 8fa1cbc9 Kostas Papadimitriou
UNKNOWN_OS = getattr(settings, "UI_UNKNOWN_OS", "unknown")
86 e3ff6830 Georgios D. Tsoukalas
87 85f1cd1e Kostas Papadimitriou
AUTH_COOKIE_NAME = getattr(settings, "UI_AUTH_COOKIE_NAME", 'synnefo_user')
88 30b6f316 Kostas Papadimitriou
89 acb284f7 Kostas Papadimitriou
# never change window location. Helpful in development environments
90 acb284f7 Kostas Papadimitriou
AUTH_SKIP_REDIRECTS = getattr(settings, "UI_AUTH_SKIP_REDIRECTS", False)
91 acb284f7 Kostas Papadimitriou
92 66be390b Kostas Papadimitriou
# UI behaviour settings
93 66be390b Kostas Papadimitriou
DELAY_ON_BLUR = getattr(settings, "UI_DELAY_ON_BLUR", True)
94 66be390b Kostas Papadimitriou
UPDATE_HIDDEN_VIEWS = getattr(settings, "UI_UPDATE_HIDDEN_VIEWS", False)
95 479c3051 Ilias Tsitsimpis
HANDLE_WINDOW_EXCEPTIONS = \
96 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_HANDLE_WINDOW_EXCEPTIONS", True)
97 66be390b Kostas Papadimitriou
SKIP_TIMEOUTS = getattr(settings, "UI_SKIP_TIMEOUTS", 1)
98 30b6f316 Kostas Papadimitriou
99 258235f4 Kostas Papadimitriou
# Additional settings
100 258235f4 Kostas Papadimitriou
VM_NAME_TEMPLATE = getattr(settings, "VM_CREATE_NAME_TPL", "My {0} server")
101 6fe8c2ca Kostas Papadimitriou
NO_FQDN_MESSAGE = getattr(settings, "UI_NO_FQDN_MESSAGE", "No available FQDN")
102 f5e97e7f Kostas Papadimitriou
103 258235f4 Kostas Papadimitriou
MAX_SSH_KEYS_PER_USER = getattr(settings, "USERDATA_MAX_SSH_KEYS_PER_USER")
104 479c3051 Ilias Tsitsimpis
FLAVORS_DISK_TEMPLATES_INFO = \
105 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_FLAVORS_DISK_TEMPLATES_INFO", {})
106 1faf0b9c Kostas Papadimitriou
SYSTEM_IMAGES_OWNERS = getattr(settings, "UI_SYSTEM_IMAGES_OWNERS", {})
107 28958b8e Kostas Papadimitriou
CUSTOM_IMAGE_HELP_URL = getattr(settings, "UI_CUSTOM_IMAGE_HELP_URL", None)
108 30b6f316 Kostas Papadimitriou
109 7970aa87 Kostas Papadimitriou
# MEDIA PATHS
110 479c3051 Ilias Tsitsimpis
UI_MEDIA_URL = \
111 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_MEDIA_URL",
112 e76bada8 Kostas Papadimitriou
            "%sui/static/snf/" % (settings.MEDIA_URL,))
113 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_IMAGES_URL = \
114 479c3051 Ilias Tsitsimpis
    getattr(settings,
115 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_IMAGES_URL", UI_MEDIA_URL + "images/")
116 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_CSS_URL = \
117 479c3051 Ilias Tsitsimpis
    getattr(settings,
118 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_CSS_URL", UI_MEDIA_URL + "css/")
119 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_JS_URL = \
120 479c3051 Ilias Tsitsimpis
    getattr(settings,
121 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_JS_URL", UI_MEDIA_URL + "js/")
122 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_JS_LIB_URL = \
123 479c3051 Ilias Tsitsimpis
    getattr(settings,
124 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_JS_LIB_URL", UI_SYNNEFO_JS_URL + "lib/")
125 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_JS_WEB_URL = \
126 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_SYNNEFO_JS_WEB_URL", UI_SYNNEFO_JS_URL + "ui/web/")
127 12d01aa2 Kostas Papadimitriou
UI_SYNNEFO_FONTS_BASE_URL = \
128 12d01aa2 Kostas Papadimitriou
    getattr(settings,
129 12d01aa2 Kostas Papadimitriou
            "UI_FONTS_BASE_URL", "//fonts.googleapis.com/")
130 c62c6b91 Kostas Papadimitriou
131 30b6f316 Kostas Papadimitriou
# extensions
132 30b6f316 Kostas Papadimitriou
ENABLE_GLANCE = getattr(settings, 'UI_ENABLE_GLANCE', True)
133 e3ff6830 Georgios D. Tsoukalas
134 479c3051 Ilias Tsitsimpis
DIAGNOSTICS_UPDATE_INTERVAL = \
135 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_DIAGNOSTICS_UPDATE_INTERVAL', 2000)
136 d965e6dc Kostas Papadimitriou
137 126a01f2 Kostas Papadimitriou
# network settings
138 479c3051 Ilias Tsitsimpis
DEFAULT_NETWORK_TYPES = {'MAC_FILTERED': 'mac-filtering',
139 479c3051 Ilias Tsitsimpis
                         'PHYSICAL_VLAN': 'physical-vlan'}
140 479c3051 Ilias Tsitsimpis
NETWORK_TYPES = \
141 479c3051 Ilias Tsitsimpis
    getattr(settings,
142 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_AVAILABLE_NETWORK_TYPES', DEFAULT_NETWORK_TYPES)
143 126a01f2 Kostas Papadimitriou
DEFAULT_NETWORK_SUBNETS = ['10.0.0.0/24', '192.168.1.1/24']
144 479c3051 Ilias Tsitsimpis
NETWORK_SUBNETS = \
145 479c3051 Ilias Tsitsimpis
    getattr(settings,
146 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_AVAILABLE_SUBNETS', DEFAULT_NETWORK_SUBNETS)
147 479c3051 Ilias Tsitsimpis
NETWORK_DUPLICATE_NICS = \
148 479c3051 Ilias Tsitsimpis
    getattr(settings,
149 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_ALLOW_DUPLICATE_VM_NICS', False)
150 479c3051 Ilias Tsitsimpis
NETWORK_STRICT_DESTROY = \
151 479c3051 Ilias Tsitsimpis
    getattr(settings,
152 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_STRICT_DESTROY', False)
153 479c3051 Ilias Tsitsimpis
NETWORK_ALLOW_MULTIPLE_DESTROY = \
154 479c3051 Ilias Tsitsimpis
    getattr(settings,
155 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_ALLOW_MULTIPLE_DESTROY', False)
156 29cf98c9 Kostas Papadimitriou
AUTOMATIC_NETWORK_RANGE_FORMAT = getattr(settings,
157 29cf98c9 Kostas Papadimitriou
                                         'UI_AUTOMATIC_NETWORK_RANGE_FORMAT',
158 7f16b9b1 Kostas Papadimitriou
                                         "192.168.%d.0/24").replace("%d",
159 7f16b9b1 Kostas Papadimitriou
                                                                    "{0}")
160 9555268a Kostas Papadimitriou
GROUP_PUBLIC_NETWORKS = getattr(settings, 'UI_GROUP_PUBLIC_NETWORKS', True)
161 8f53cfa3 Kostas Papadimitriou
162 a1dae38d Christos Stavrakakis
DEFAULT_FORCED_SERVER_NETWORKS = \
163 a1dae38d Christos Stavrakakis
    getattr(settings, "CYCLADES_FORCED_SERVER_NETWORKS", [])
164 4bf6778f Kostas Papadimitriou
FORCED_SERVER_NETWORKS = getattr(settings, "UI_FORCED_SERVER_NETWORKS",
165 4bf6778f Kostas Papadimitriou
                                 DEFAULT_FORCED_SERVER_NETWORKS)
166 4bf6778f Kostas Papadimitriou
167 ef19e96e Kostas Papadimitriou
DEFAULT_HOTPLUG_ENABLED = getattr(settings, "CYCLADES_GANETI_USE_HOTPLUG",
168 ef19e96e Kostas Papadimitriou
                                  True)
169 ef19e96e Kostas Papadimitriou
HOTPLUG_ENABLED = getattr(settings, "UI_HOTPLUG_ENABLED",
170 ef19e96e Kostas Papadimitriou
                          DEFAULT_HOTPLUG_ENABLED)
171 a1dae38d Christos Stavrakakis
172 0d0466bf Kostas Papadimitriou
def template(name, request, context):
173 e646ebe5 Dimitris Moraitis
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
174 b303ba05 Christodoulos Psaltis
    current_template = template_path + name + '.html'
175 b303ba05 Christodoulos Psaltis
    t = loader.get_template(current_template)
176 7970aa87 Kostas Papadimitriou
    media_context = {
177 f019f93d Ilias Tsitsimpis
        'UI_MEDIA_URL': UI_MEDIA_URL,
178 f019f93d Ilias Tsitsimpis
        'SYNNEFO_JS_URL': UI_SYNNEFO_JS_URL,
179 f019f93d Ilias Tsitsimpis
        'SYNNEFO_JS_LIB_URL': UI_SYNNEFO_JS_LIB_URL,
180 12d01aa2 Kostas Papadimitriou
        'SYNNEFO_FONTS_BASE_URL': UI_SYNNEFO_FONTS_BASE_URL,
181 f019f93d Ilias Tsitsimpis
        'SYNNEFO_JS_WEB_URL': UI_SYNNEFO_JS_WEB_URL,
182 f019f93d Ilias Tsitsimpis
        'SYNNEFO_IMAGES_URL': UI_SYNNEFO_IMAGES_URL,
183 f019f93d Ilias Tsitsimpis
        'SYNNEFO_CSS_URL': UI_SYNNEFO_CSS_URL,
184 f019f93d Ilias Tsitsimpis
        'SYNNEFO_JS_LIB_VERSION': SYNNEFO_JS_LIB_VERSION,
185 f019f93d Ilias Tsitsimpis
        'DEBUG': settings.DEBUG
186 7970aa87 Kostas Papadimitriou
    }
187 7970aa87 Kostas Papadimitriou
    context.update(media_context)
188 0d0466bf Kostas Papadimitriou
    return HttpResponse(t.render(RequestContext(request, context)))
189 cc7c5902 Dimitris Moraitis
190 479c3051 Ilias Tsitsimpis
191 cc7c5902 Dimitris Moraitis
def home(request):
192 f019f93d Ilias Tsitsimpis
    context = {
193 f019f93d Ilias Tsitsimpis
        'timeout': TIMEOUT,
194 f019f93d Ilias Tsitsimpis
        'project': '+nefo',
195 f019f93d Ilias Tsitsimpis
        'request': request,
196 f019f93d Ilias Tsitsimpis
        'current_lang': get_language() or 'en',
197 f019f93d Ilias Tsitsimpis
        'compute_api_url': json.dumps(uisettings.COMPUTE_URL),
198 64fec398 Kostas Papadimitriou
        'volume_api_url': json.dumps(uisettings.VOLUME_URL),
199 a1dae38d Christos Stavrakakis
        'network_api_url': json.dumps(uisettings.NETWORK_URL),
200 f019f93d Ilias Tsitsimpis
        'user_catalog_url': json.dumps(uisettings.USER_CATALOG_URL),
201 f019f93d Ilias Tsitsimpis
        'feedback_post_url': json.dumps(uisettings.FEEDBACK_URL),
202 f019f93d Ilias Tsitsimpis
        'accounts_api_url': json.dumps(uisettings.ACCOUNT_URL),
203 f019f93d Ilias Tsitsimpis
        'logout_redirect': json.dumps(uisettings.LOGOUT_REDIRECT),
204 f019f93d Ilias Tsitsimpis
        'login_redirect': json.dumps(uisettings.LOGIN_URL),
205 f019f93d Ilias Tsitsimpis
        'glance_api_url': json.dumps(uisettings.GLANCE_URL),
206 f019f93d Ilias Tsitsimpis
        'translate_uuids': json.dumps(True),
207 f019f93d Ilias Tsitsimpis
        # update interval settings
208 f019f93d Ilias Tsitsimpis
        'update_interval': UPDATE_INTERVAL,
209 f019f93d Ilias Tsitsimpis
        'update_interval_increase': UPDATE_INTERVAL_INCREASE,
210 f019f93d Ilias Tsitsimpis
        'update_interval_increase_after_calls':
211 f019f93d Ilias Tsitsimpis
        UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
212 f019f93d Ilias Tsitsimpis
        'update_interval_fast': UPDATE_INTERVAL_FAST,
213 f019f93d Ilias Tsitsimpis
        'update_interval_max': UPDATE_INTERVAL_MAX,
214 f019f93d Ilias Tsitsimpis
        'changes_since_alignment': CHANGES_SINCE_ALIGNMENT,
215 f019f93d Ilias Tsitsimpis
        'image_icons': IMAGE_ICONS,
216 f019f93d Ilias Tsitsimpis
        'auth_cookie_name': AUTH_COOKIE_NAME,
217 f019f93d Ilias Tsitsimpis
        'auth_skip_redirects': json.dumps(AUTH_SKIP_REDIRECTS),
218 f019f93d Ilias Tsitsimpis
        'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
219 f019f93d Ilias Tsitsimpis
        'suggested_roles': json.dumps(SUGGESTED_ROLES),
220 f019f93d Ilias Tsitsimpis
        'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
221 f019f93d Ilias Tsitsimpis
        'synnefo_version': SYNNEFO_JS_LIB_VERSION,
222 f019f93d Ilias Tsitsimpis
        'delay_on_blur': json.dumps(DELAY_ON_BLUR),
223 f019f93d Ilias Tsitsimpis
        'update_hidden_views': json.dumps(UPDATE_HIDDEN_VIEWS),
224 f019f93d Ilias Tsitsimpis
        'handle_window_exceptions': json.dumps(HANDLE_WINDOW_EXCEPTIONS),
225 f019f93d Ilias Tsitsimpis
        'skip_timeouts': json.dumps(SKIP_TIMEOUTS),
226 f019f93d Ilias Tsitsimpis
        'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
227 f019f93d Ilias Tsitsimpis
        'flavors_disk_templates_info': json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
228 c2a55260 Kostas Papadimitriou
        'ssh_support_osfamily_exclude_list': json.dumps(SSH_SUPPORT_OSFAMILY_EXCLUDE_LIST),
229 f019f93d Ilias Tsitsimpis
        'unknown_os': json.dumps(UNKNOWN_OS),
230 f019f93d Ilias Tsitsimpis
        'os_created_users': json.dumps(OS_CREATED_USERS),
231 f019f93d Ilias Tsitsimpis
        'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
232 f019f93d Ilias Tsitsimpis
        'use_glance': json.dumps(ENABLE_GLANCE),
233 f019f93d Ilias Tsitsimpis
        'system_images_owners': json.dumps(SYSTEM_IMAGES_OWNERS),
234 f019f93d Ilias Tsitsimpis
        'custom_image_help_url': CUSTOM_IMAGE_HELP_URL,
235 f019f93d Ilias Tsitsimpis
        'image_deleted_title': json.dumps(IMAGE_DELETED_TITLE),
236 f019f93d Ilias Tsitsimpis
        'image_deleted_size_title': json.dumps(IMAGE_DELETED_SIZE_TITLE),
237 f019f93d Ilias Tsitsimpis
        'network_suggested_subnets': json.dumps(NETWORK_SUBNETS),
238 f019f93d Ilias Tsitsimpis
        'network_available_types': json.dumps(NETWORK_TYPES),
239 a1dae38d Christos Stavrakakis
        'forced_server_networks': json.dumps(FORCED_SERVER_NETWORKS),
240 f019f93d Ilias Tsitsimpis
        'network_allow_duplicate_vm_nics': json.dumps(NETWORK_DUPLICATE_NICS),
241 f019f93d Ilias Tsitsimpis
        'network_strict_destroy': json.dumps(NETWORK_STRICT_DESTROY),
242 f019f93d Ilias Tsitsimpis
        'network_allow_multiple_destroy':
243 f019f93d Ilias Tsitsimpis
        json.dumps(NETWORK_ALLOW_MULTIPLE_DESTROY),
244 f019f93d Ilias Tsitsimpis
        'automatic_network_range_format':
245 f019f93d Ilias Tsitsimpis
        json.dumps(AUTOMATIC_NETWORK_RANGE_FORMAT),
246 f019f93d Ilias Tsitsimpis
        'group_public_networks': json.dumps(GROUP_PUBLIC_NETWORKS),
247 ef19e96e Kostas Papadimitriou
        'hotplug_enabled': json.dumps(HOTPLUG_ENABLED),
248 f019f93d Ilias Tsitsimpis
        'diagnostics_update_interval': json.dumps(DIAGNOSTICS_UPDATE_INTERVAL),
249 6fe8c2ca Kostas Papadimitriou
        'no_fqdn_message': json.dumps(NO_FQDN_MESSAGE)
250 f019f93d Ilias Tsitsimpis
    }
251 0d0466bf Kostas Papadimitriou
    return template('home', request, context)
252 cc7c5902 Dimitris Moraitis
253 f019f93d Ilias Tsitsimpis
254 f533f224 Vangelis Koukis
def machines_console(request):
255 479c3051 Ilias Tsitsimpis
    host, port, password = ('', '', '')
256 479c3051 Ilias Tsitsimpis
    host = request.GET.get('host', '')
257 479c3051 Ilias Tsitsimpis
    port = request.GET.get('port', '')
258 479c3051 Ilias Tsitsimpis
    password = request.GET.get('password', '')
259 479c3051 Ilias Tsitsimpis
    machine = request.GET.get('machine', '')
260 479c3051 Ilias Tsitsimpis
    host_ip = request.GET.get('host_ip', '')
261 479c3051 Ilias Tsitsimpis
    host_ip_v6 = request.GET.get('host_ip_v6', '')
262 140d08d0 Kostas Papadimitriou
    context = {'host': host, 'port': port, 'password': password,
263 f019f93d Ilias Tsitsimpis
               'machine': machine, 'host_ip': host_ip,
264 f019f93d Ilias Tsitsimpis
               'host_ip_v6': host_ip_v6}
265 0d0466bf Kostas Papadimitriou
    return template('machines_console', request, context)
266 e646ebe5 Dimitris Moraitis
267 cbf7b384 Kostas Papadimitriou
268 8d08f18a Kostas Papadimitriou
def js_tests(request):
269 0d0466bf Kostas Papadimitriou
    return template('tests', request, {})
270 6f4c1371 Kostas Papadimitriou
271 479c3051 Ilias Tsitsimpis
272 479c3051 Ilias Tsitsimpis
CONNECT_LINUX_LINUX_MESSAGE = \
273 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be established using the
274 479c3051 Ilias Tsitsimpis
<a target="_blank" href="http://en.wikipedia.org/wiki/Secure_Shell">
275 479c3051 Ilias Tsitsimpis
SSH Protocol</a>.
276 479c3051 Ilias Tsitsimpis
To do so open a terminal and type the following at the prompt to connect
277 479c3051 Ilias Tsitsimpis
to your machine:""")
278 479c3051 Ilias Tsitsimpis
CONNECT_LINUX_WINDOWS_MESSAGE = \
279 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be established using
280 479c3051 Ilias Tsitsimpis
<a target="_blank"
281 479c3051 Ilias Tsitsimpis
href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">
282 479c3051 Ilias Tsitsimpis
Remote Desktop Service</a>.
283 f019f93d Ilias Tsitsimpis
To do so, open the following file with an appropriate \
284 f019f93d Ilias Tsitsimpis
remote desktop client.""")
285 479c3051 Ilias Tsitsimpis
CONNECT_LINUX_WINDOWS_SUBMESSAGE = \
286 479c3051 Ilias Tsitsimpis
    _("""If you don't have a Remote Desktop client already installed,
287 ab3e9eb8 Kostas Papadimitriou
we suggest the use of <a target="_blank"
288 479c3051 Ilias Tsitsimpis
href=
289 479c3051 Ilias Tsitsimpis
"http://sourceforge.net/projects/tsclient/files/latest/download?source=files">
290 479c3051 Ilias Tsitsimpis
tsclient</a>.<br /><span class="important">IMPORTANT: It may take up to 15
291 479c3051 Ilias Tsitsimpis
minutes for your Windows VM to become available
292 99a005df Kostas Papadimitriou
after its creation.</span>""")
293 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_LINUX_MESSAGE = \
294 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be established using the
295 479c3051 Ilias Tsitsimpis
<a target="_blank"
296 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
297 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
298 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_LINUX_SUBMESSAGE = \
299 479c3051 Ilias Tsitsimpis
    _("""If you do not have an ssh client already installed,
300 479c3051 Ilias Tsitsimpis
<a target="_blank"
301 479c3051 Ilias Tsitsimpis
href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">
302 479c3051 Ilias Tsitsimpis
Download PuTTY</a>""")
303 479c3051 Ilias Tsitsimpis
304 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_WINDOWS_MESSAGE = \
305 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be
306 17ab1a48 Vangelis Koukis
established using Remote Desktop. Click on the following link, and if asked
307 17ab1a48 Vangelis Koukis
open it using "Remote Desktop Connection".
308 479c3051 Ilias Tsitsimpis
<br /><span class="important">
309 479c3051 Ilias Tsitsimpis
IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
310 3796f345 Kostas Papadimitriou
after its creation.</span>""")
311 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = \
312 479c3051 Ilias Tsitsimpis
    _("""Save this file to disk for future use.""")
313 bdf369a2 Kostas Papadimitriou
314 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
315 bdf369a2 Kostas Papadimitriou
#
316 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
317 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
318 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
319 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
320 6f4c1371 Kostas Papadimitriou
    'linux': {
321 479c3051 Ilias Tsitsimpis
        'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
322 479c3051 Ilias Tsitsimpis
        'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
323 479c3051 Ilias Tsitsimpis
                    CONNECT_LINUX_WINDOWS_SUBMESSAGE],
324 74831b0d Kostas Papadimitriou
        'ssh_message': "ssh %(user)s@%(hostname)s",
325 74831b0d Kostas Papadimitriou
        'ssh_message_port': "ssh -p %(port)s %(user)s@%(hostname)s"
326 74831b0d Kostas Papadimitriou
327 3796f345 Kostas Papadimitriou
    },
328 6f4c1371 Kostas Papadimitriou
    'windows': {
329 479c3051 Ilias Tsitsimpis
        'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
330 479c3051 Ilias Tsitsimpis
                  CONNECT_WINDOWS_LINUX_SUBMESSAGE],
331 479c3051 Ilias Tsitsimpis
        'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
332 479c3051 Ilias Tsitsimpis
                    CONNECT_WINDOWS_WINDOWS_SUBMESSAGE],
333 74831b0d Kostas Papadimitriou
        'ssh_message': "%(user)s@%(hostname)s",
334 74831b0d Kostas Papadimitriou
        'ssh_message_port': "%(user)s@%(hostname)s (port: %(port)s)"
335 3796f345 Kostas Papadimitriou
    },
336 3796f345 Kostas Papadimitriou
}
337 3796f345 Kostas Papadimitriou
338 479c3051 Ilias Tsitsimpis
APPEND_CONNECT_PROMPT_MESSAGES = \
339 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_CONNECT_PROMPT_MESSAGES', {})
340 3796f345 Kostas Papadimitriou
for k, v in APPEND_CONNECT_PROMPT_MESSAGES.iteritems():
341 3796f345 Kostas Papadimitriou
    CONNECT_PROMPT_MESSAGES[k].update(v)
342 6f4c1371 Kostas Papadimitriou
343 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
344 140d08d0 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
345 140d08d0 Kostas Papadimitriou
                        'BACKEND_PREFIX_ID', ""))
346 65ecc5e4 Kostas Papadimitriou
347 65ecc5e4 Kostas Papadimitriou
# domain template string
348 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
349 65ecc5e4 Kostas Papadimitriou
350 479c3051 Ilias Tsitsimpis
351 fd70c1db Markos Gogoulos
def machines_connect(request):
352 479c3051 Ilias Tsitsimpis
    ip_address = request.GET.get('ip_address', '')
353 479c3051 Ilias Tsitsimpis
    hostname = request.GET.get('hostname', '')
354 479c3051 Ilias Tsitsimpis
    operating_system = metadata_os = request.GET.get('os', '')
355 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
356 479c3051 Ilias Tsitsimpis
    host_os = request.GET.get('host_os', 'Linux').lower()
357 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
358 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
359 74831b0d Kostas Papadimitriou
    ports = json.loads(request.GET.get('ports', '{}'))
360 6f4c1371 Kostas Papadimitriou
361 406bf0d9 Kostas Papadimitriou
    # guess host os
362 319091c7 Kostas Papadimitriou
    if host_os != "windows":
363 319091c7 Kostas Papadimitriou
        host_os = 'linux'
364 319091c7 Kostas Papadimitriou
365 406bf0d9 Kostas Papadimitriou
    # guess username
366 406bf0d9 Kostas Papadimitriou
    if not username:
367 406bf0d9 Kostas Papadimitriou
        username = "root"
368 406bf0d9 Kostas Papadimitriou
369 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
370 406bf0d9 Kostas Papadimitriou
            username = "user"
371 406bf0d9 Kostas Papadimitriou
372 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
373 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
374 406bf0d9 Kostas Papadimitriou
375 74831b0d Kostas Papadimitriou
    ssh_forward = ports.get("22", None)
376 74831b0d Kostas Papadimitriou
    rdp_forward = ports.get("3389", None)
377 74831b0d Kostas Papadimitriou
378 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
379 406bf0d9 Kostas Papadimitriou
    ssh = False
380 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
381 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
382 406bf0d9 Kostas Papadimitriou
        ssh = True
383 6f4c1371 Kostas Papadimitriou
384 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
385 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
386 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
387 74831b0d Kostas Papadimitriou
        port = '3389'
388 74831b0d Kostas Papadimitriou
        if rdp_forward:
389 74831b0d Kostas Papadimitriou
            hostname = rdp_forward.get('host', hostname)
390 74831b0d Kostas Papadimitriou
            ip_address = rdp_forward.get('host', ip_address)
391 74831b0d Kostas Papadimitriou
            port = str(rdp_forward.get('port', '3389'))
392 74831b0d Kostas Papadimitriou
393 9f6eb417 Kostas Papadimitriou
        extra_rdp_content = ''
394 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
395 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
396 3796f345 Kostas Papadimitriou
        EXTRA_RDP_CONTENT = getattr(settings, 'UI_EXTRA_RDP_CONTENT', '')
397 3796f345 Kostas Papadimitriou
        if callable(EXTRA_RDP_CONTENT):
398 3796f345 Kostas Papadimitriou
            extra_rdp_content = EXTRA_RDP_CONTENT(server_id, ip_address,
399 3796f345 Kostas Papadimitriou
                                                  hostname, username)
400 3796f345 Kostas Papadimitriou
        else:
401 9f6eb417 Kostas Papadimitriou
            if EXTRA_RDP_CONTENT:
402 9f6eb417 Kostas Papadimitriou
                extra_rdp_content = EXTRA_RDP_CONTENT % \
403 9f6eb417 Kostas Papadimitriou
                    {
404 9f6eb417 Kostas Papadimitriou
                        'server_id': server_id,
405 9f6eb417 Kostas Papadimitriou
                        'ip_address': ip_address,
406 9f6eb417 Kostas Papadimitriou
                        'hostname': hostname,
407 74831b0d Kostas Papadimitriou
                        'user': username,
408 74831b0d Kostas Papadimitriou
                        'port': port
409 f019f93d Ilias Tsitsimpis
                    }
410 3796f345 Kostas Papadimitriou
411 406bf0d9 Kostas Papadimitriou
        rdp_context = {
412 479c3051 Ilias Tsitsimpis
            'username': username,
413 479c3051 Ilias Tsitsimpis
            'domain': domain,
414 479c3051 Ilias Tsitsimpis
            'ip_address': ip_address,
415 479c3051 Ilias Tsitsimpis
            'hostname': hostname,
416 74831b0d Kostas Papadimitriou
            'port': request.GET.get('port', port),
417 479c3051 Ilias Tsitsimpis
            'extra_content': extra_rdp_content
418 406bf0d9 Kostas Papadimitriou
        }
419 406bf0d9 Kostas Papadimitriou
420 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
421 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
422 bdf369a2 Kostas Papadimitriou
423 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
424 3796f345 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), hostname)
425 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
426 fd70c1db Markos Gogoulos
    else:
427 74831b0d Kostas Papadimitriou
        message_key = "ssh_message"
428 74831b0d Kostas Papadimitriou
        ip_address = ip_address
429 74831b0d Kostas Papadimitriou
        hostname = hostname
430 74831b0d Kostas Papadimitriou
        port = ''
431 74831b0d Kostas Papadimitriou
        if ssh_forward:
432 74831b0d Kostas Papadimitriou
            message_key = 'ssh_message_port'
433 74831b0d Kostas Papadimitriou
            hostname = ssh_forward.get('host', hostname)
434 74831b0d Kostas Papadimitriou
            ip_address = ssh_forward.get('host', ip_address)
435 74831b0d Kostas Papadimitriou
            port = str(ssh_forward.get('port', '22'))
436 74831b0d Kostas Papadimitriou
437 74831b0d Kostas Papadimitriou
        ssh_message = CONNECT_PROMPT_MESSAGES['linux'].get(message_key)
438 3796f345 Kostas Papadimitriou
        if host_os == 'windows':
439 74831b0d Kostas Papadimitriou
            ssh_message = CONNECT_PROMPT_MESSAGES['windows'].get(message_key)
440 3796f345 Kostas Papadimitriou
        if callable(ssh_message):
441 3796f345 Kostas Papadimitriou
            link_title = ssh_message(server_id, ip_address, hostname, username)
442 3796f345 Kostas Papadimitriou
        else:
443 3796f345 Kostas Papadimitriou
            link_title = ssh_message % {
444 479c3051 Ilias Tsitsimpis
                'server_id': server_id,
445 479c3051 Ilias Tsitsimpis
                'ip_address': ip_address,
446 479c3051 Ilias Tsitsimpis
                'hostname': hostname,
447 74831b0d Kostas Papadimitriou
                'user': username,
448 74831b0d Kostas Papadimitriou
                'port': port
449 479c3051 Ilias Tsitsimpis
            }
450 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
451 bdf369a2 Kostas Papadimitriou
            link_url = None
452 bdf369a2 Kostas Papadimitriou
453 3796f345 Kostas Papadimitriou
        else:
454 3796f345 Kostas Papadimitriou
            link_title = _("Remote desktop to %s") % ip_address
455 74831b0d Kostas Papadimitriou
            if rdp_forward:
456 74831b0d Kostas Papadimitriou
                hostname = rdp_forward.get('host', hostname)
457 74831b0d Kostas Papadimitriou
                ip_address = rdp_forward.get('host', ip_address)
458 74831b0d Kostas Papadimitriou
                port = str(rdp_forward.get('port', '3389'))
459 74831b0d Kostas Papadimitriou
                link_title = _("Remote desktop to %s (port %s)") % (ip_address,
460 74831b0d Kostas Papadimitriou
                                                                    port)
461 479c3051 Ilias Tsitsimpis
            link_url = \
462 479c3051 Ilias Tsitsimpis
                "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" \
463 74831b0d Kostas Papadimitriou
                "&hostname=%s&port=%s" % (
464 3796f345 Kostas Papadimitriou
                    reverse("ui_machines_connect"), ip_address,
465 479c3051 Ilias Tsitsimpis
                    operating_system, int(server_id), username,
466 74831b0d Kostas Papadimitriou
                    domain, hostname, port)
467 b687587e Kostas Papadimitriou
468 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
469 6f4c1371 Kostas Papadimitriou
        try:
470 479c3051 Ilias Tsitsimpis
            connect_message = \
471 479c3051 Ilias Tsitsimpis
                CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
472 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
473 6f4c1371 Kostas Papadimitriou
        except KeyError:
474 479c3051 Ilias Tsitsimpis
            connect_message = \
475 479c3051 Ilias Tsitsimpis
                _("You are trying to connect from a %s "
476 479c3051 Ilias Tsitsimpis
                  "machine to a %s machine") % (host_os, operating_system)
477 bdf369a2 Kostas Papadimitriou
            subinfo = ""
478 6f4c1371 Kostas Papadimitriou
479 b687587e Kostas Papadimitriou
        response_object = {
480 479c3051 Ilias Tsitsimpis
            'ip': ip_address,
481 479c3051 Ilias Tsitsimpis
            'os': operating_system,
482 479c3051 Ilias Tsitsimpis
            'ssh': ssh,
483 479c3051 Ilias Tsitsimpis
            'info': unicode(connect_message),
484 479c3051 Ilias Tsitsimpis
            'subinfo': unicode(subinfo),
485 479c3051 Ilias Tsitsimpis
            'link': {'title': unicode(link_title), 'url': link_url}
486 479c3051 Ilias Tsitsimpis
        }
487 479c3051 Ilias Tsitsimpis
        response = \
488 479c3051 Ilias Tsitsimpis
            HttpResponse(json.dumps(response_object),
489 479c3051 Ilias Tsitsimpis
                         mimetype='application/json')  # no windows, no rdp
490 6f4c1371 Kostas Papadimitriou
491 fd70c1db Markos Gogoulos
    return response