Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (19.4 kB)

1 a5bc3755 Vangelis Koukis
# Copyright 2011 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 e3ff6830 Georgios D. Tsoukalas
from urlparse import urlparse
38 e3ff6830 Georgios D. Tsoukalas
39 abf90954 Markos Gogoulos
from django.conf import settings
40 edda4d30 Markos Gogoulos
from django.utils.translation import gettext_lazy as _
41 479c3051 Ilias Tsitsimpis
from django.template import loader
42 cc7c5902 Dimitris Moraitis
from django.http import HttpResponse
43 ec06b07c Dimitris Moraitis
from django.utils.translation import get_language
44 9c901aec Markos Gogoulos
from django.utils import simplejson as json
45 734107ef Kostas Papadimitriou
from synnefo_branding.utils import render_to_string
46 b687587e Kostas Papadimitriou
from django.core.urlresolvers import reverse
47 0d0466bf Kostas Papadimitriou
from django.template import RequestContext
48 9d889386 Olga Brani
from synnefo_branding import settings as snf_settings
49 31f9a55b Kostas Papadimitriou
50 07d104d8 Kostas Papadimitriou
from synnefo.util.version import get_component_version
51 7f16b9b1 Kostas Papadimitriou
from synnefo.lib import join_urls
52 7970aa87 Kostas Papadimitriou
53 04a1b675 Christos Stavrakakis
from snf_django.lib.astakos import get_user
54 e3ff6830 Georgios D. Tsoukalas
from synnefo import cyclades_settings
55 27738c43 Kostas Papadimitriou
from synnefo.ui import settings as uisettings
56 02f0cd19 Kostas Papadimitriou
57 07d104d8 Kostas Papadimitriou
SYNNEFO_JS_LIB_VERSION = get_component_version('app')
58 30b6f316 Kostas Papadimitriou
59 66be390b Kostas Papadimitriou
# UI preferences settings
60 66be390b Kostas Papadimitriou
TIMEOUT = getattr(settings, "TIMEOUT", 10000)
61 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL = getattr(settings, "UI_UPDATE_INTERVAL", 5000)
62 6de7fde5 Kostas Papadimitriou
CHANGES_SINCE_ALIGNMENT = getattr(settings, "UI_CHANGES_SINCE_ALIGNMENT", 0)
63 e3ff6830 Georgios D. Tsoukalas
UPDATE_INTERVAL_INCREASE = getattr(settings, "UI_UPDATE_INTERVAL_INCREASE",
64 e3ff6830 Georgios D. Tsoukalas
                                   500)
65 479c3051 Ilias Tsitsimpis
UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT = \
66 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT", 3)
67 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_FAST = getattr(settings, "UI_UPDATE_INTERVAL_FAST", 2500)
68 1cc6e94f Kostas Papadimitriou
UPDATE_INTERVAL_MAX = getattr(settings, "UI_UPDATE_INTERVAL_MAX", 10000)
69 30b6f316 Kostas Papadimitriou
70 66be390b Kostas Papadimitriou
# predefined values settings
71 479c3051 Ilias Tsitsimpis
VM_IMAGE_COMMON_METADATA = \
72 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_VM_IMAGE_COMMON_METADATA", ["OS", "users"])
73 66be390b Kostas Papadimitriou
SUGGESTED_FLAVORS_DEFAULT = {}
74 140d08d0 Kostas Papadimitriou
SUGGESTED_FLAVORS = getattr(settings, "VM_CREATE_SUGGESTED_FLAVORS",
75 140d08d0 Kostas Papadimitriou
                            SUGGESTED_FLAVORS_DEFAULT)
76 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES_DEFAULT = ["Database server", "File server", "Mail server",
77 140d08d0 Kostas Papadimitriou
                           "Web server", "Proxy"]
78 140d08d0 Kostas Papadimitriou
SUGGESTED_ROLES = getattr(settings, "VM_CREATE_SUGGESTED_ROLES",
79 140d08d0 Kostas Papadimitriou
                          SUGGESTED_ROLES_DEFAULT)
80 30b6f316 Kostas Papadimitriou
IMAGE_ICONS = settings.IMAGE_ICONS
81 479c3051 Ilias Tsitsimpis
IMAGE_DELETED_TITLE = \
82 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_IMAGE_DELETED_TITLE', '(deleted)')
83 479c3051 Ilias Tsitsimpis
IMAGE_DELETED_SIZE_TITLE = \
84 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_IMAGE_DELETED_SIZE_TITLE', '(none)')
85 66be390b Kostas Papadimitriou
86 556dcd88 Kostas Papadimitriou
SUPPORT_SSH_OS_LIST = getattr(settings, "UI_SUPPORT_SSH_OS_LIST",)
87 556dcd88 Kostas Papadimitriou
OS_CREATED_USERS = getattr(settings, "UI_OS_DEFAULT_USER_MAP")
88 8fa1cbc9 Kostas Papadimitriou
UNKNOWN_OS = getattr(settings, "UI_UNKNOWN_OS", "unknown")
89 e3ff6830 Georgios D. Tsoukalas
90 85f1cd1e Kostas Papadimitriou
AUTH_COOKIE_NAME = getattr(settings, "UI_AUTH_COOKIE_NAME", 'synnefo_user')
91 30b6f316 Kostas Papadimitriou
92 acb284f7 Kostas Papadimitriou
# never change window location. Helpful in development environments
93 acb284f7 Kostas Papadimitriou
AUTH_SKIP_REDIRECTS = getattr(settings, "UI_AUTH_SKIP_REDIRECTS", False)
94 acb284f7 Kostas Papadimitriou
95 66be390b Kostas Papadimitriou
# UI behaviour settings
96 66be390b Kostas Papadimitriou
DELAY_ON_BLUR = getattr(settings, "UI_DELAY_ON_BLUR", True)
97 66be390b Kostas Papadimitriou
UPDATE_HIDDEN_VIEWS = getattr(settings, "UI_UPDATE_HIDDEN_VIEWS", False)
98 479c3051 Ilias Tsitsimpis
HANDLE_WINDOW_EXCEPTIONS = \
99 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_HANDLE_WINDOW_EXCEPTIONS", True)
100 66be390b Kostas Papadimitriou
SKIP_TIMEOUTS = getattr(settings, "UI_SKIP_TIMEOUTS", 1)
101 30b6f316 Kostas Papadimitriou
102 258235f4 Kostas Papadimitriou
# Additional settings
103 258235f4 Kostas Papadimitriou
VM_NAME_TEMPLATE = getattr(settings, "VM_CREATE_NAME_TPL", "My {0} server")
104 3796f345 Kostas Papadimitriou
VM_HOSTNAME_FORMAT = getattr(settings, "UI_VM_HOSTNAME_FORMAT",
105 8fa1cbc9 Kostas Papadimitriou
                                    'snf-%(id)s.vm.synnefo.org')
106 f5e97e7f Kostas Papadimitriou
107 f5e97e7f Kostas Papadimitriou
if isinstance(VM_HOSTNAME_FORMAT, basestring):
108 479c3051 Ilias Tsitsimpis
    VM_HOSTNAME_FORMAT = VM_HOSTNAME_FORMAT % {'id': '{0}'}
109 f5e97e7f Kostas Papadimitriou
110 258235f4 Kostas Papadimitriou
MAX_SSH_KEYS_PER_USER = getattr(settings, "USERDATA_MAX_SSH_KEYS_PER_USER")
111 479c3051 Ilias Tsitsimpis
FLAVORS_DISK_TEMPLATES_INFO = \
112 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_FLAVORS_DISK_TEMPLATES_INFO", {})
113 1faf0b9c Kostas Papadimitriou
SYSTEM_IMAGES_OWNERS = getattr(settings, "UI_SYSTEM_IMAGES_OWNERS", {})
114 28958b8e Kostas Papadimitriou
CUSTOM_IMAGE_HELP_URL = getattr(settings, "UI_CUSTOM_IMAGE_HELP_URL", None)
115 30b6f316 Kostas Papadimitriou
116 7970aa87 Kostas Papadimitriou
# MEDIA PATHS
117 479c3051 Ilias Tsitsimpis
UI_MEDIA_URL = \
118 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_MEDIA_URL",
119 479c3051 Ilias Tsitsimpis
            "%ssnf-%s/" % (settings.MEDIA_URL, SYNNEFO_JS_LIB_VERSION))
120 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_IMAGES_URL = \
121 479c3051 Ilias Tsitsimpis
    getattr(settings,
122 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_IMAGES_URL", UI_MEDIA_URL + "images/")
123 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_CSS_URL = \
124 479c3051 Ilias Tsitsimpis
    getattr(settings,
125 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_CSS_URL", UI_MEDIA_URL + "css/")
126 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_JS_URL = \
127 479c3051 Ilias Tsitsimpis
    getattr(settings,
128 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_JS_URL", UI_MEDIA_URL + "js/")
129 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_JS_LIB_URL = \
130 479c3051 Ilias Tsitsimpis
    getattr(settings,
131 479c3051 Ilias Tsitsimpis
            "UI_SYNNEFO_JS_LIB_URL", UI_SYNNEFO_JS_URL + "lib/")
132 479c3051 Ilias Tsitsimpis
UI_SYNNEFO_JS_WEB_URL = \
133 479c3051 Ilias Tsitsimpis
    getattr(settings, "UI_SYNNEFO_JS_WEB_URL", UI_SYNNEFO_JS_URL + "ui/web/")
134 c62c6b91 Kostas Papadimitriou
135 30b6f316 Kostas Papadimitriou
# extensions
136 30b6f316 Kostas Papadimitriou
ENABLE_GLANCE = getattr(settings, 'UI_ENABLE_GLANCE', True)
137 e3ff6830 Georgios D. Tsoukalas
138 479c3051 Ilias Tsitsimpis
DIAGNOSTICS_UPDATE_INTERVAL = \
139 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_DIAGNOSTICS_UPDATE_INTERVAL', 2000)
140 d965e6dc Kostas Papadimitriou
141 126a01f2 Kostas Papadimitriou
# network settings
142 479c3051 Ilias Tsitsimpis
DEFAULT_NETWORK_TYPES = {'MAC_FILTERED': 'mac-filtering',
143 479c3051 Ilias Tsitsimpis
                         'PHYSICAL_VLAN': 'physical-vlan'}
144 479c3051 Ilias Tsitsimpis
NETWORK_TYPES = \
145 479c3051 Ilias Tsitsimpis
    getattr(settings,
146 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_AVAILABLE_NETWORK_TYPES', DEFAULT_NETWORK_TYPES)
147 126a01f2 Kostas Papadimitriou
DEFAULT_NETWORK_SUBNETS = ['10.0.0.0/24', '192.168.1.1/24']
148 479c3051 Ilias Tsitsimpis
NETWORK_SUBNETS = \
149 479c3051 Ilias Tsitsimpis
    getattr(settings,
150 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_AVAILABLE_SUBNETS', DEFAULT_NETWORK_SUBNETS)
151 479c3051 Ilias Tsitsimpis
NETWORK_DUPLICATE_NICS = \
152 479c3051 Ilias Tsitsimpis
    getattr(settings,
153 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_ALLOW_DUPLICATE_VM_NICS', False)
154 479c3051 Ilias Tsitsimpis
NETWORK_STRICT_DESTROY = \
155 479c3051 Ilias Tsitsimpis
    getattr(settings,
156 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_STRICT_DESTROY', False)
157 5b90c56d Kostas Papadimitriou
PRIVATE_NETWORKS_NIC_HOTPLUG = \
158 5b90c56d Kostas Papadimitriou
    getattr(settings,
159 5b90c56d Kostas Papadimitriou
            'UI_PRIVATE_NETWORK_NIC_HOTPLUG', False)
160 479c3051 Ilias Tsitsimpis
NETWORK_ALLOW_MULTIPLE_DESTROY = \
161 479c3051 Ilias Tsitsimpis
    getattr(settings,
162 479c3051 Ilias Tsitsimpis
            'UI_NETWORK_ALLOW_MULTIPLE_DESTROY', False)
163 29cf98c9 Kostas Papadimitriou
AUTOMATIC_NETWORK_RANGE_FORMAT = getattr(settings,
164 29cf98c9 Kostas Papadimitriou
                                         'UI_AUTOMATIC_NETWORK_RANGE_FORMAT',
165 7f16b9b1 Kostas Papadimitriou
                                         "192.168.%d.0/24").replace("%d",
166 7f16b9b1 Kostas Papadimitriou
                                                                    "{0}")
167 9555268a Kostas Papadimitriou
GROUP_PUBLIC_NETWORKS = getattr(settings, 'UI_GROUP_PUBLIC_NETWORKS', True)
168 479c3051 Ilias Tsitsimpis
GROUPED_PUBLIC_NETWORK_NAME = \
169 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_GROUPED_PUBLIC_NETWORK_NAME', 'Internet')
170 126a01f2 Kostas Papadimitriou
171 8f53cfa3 Kostas Papadimitriou
172 4bf6778f Kostas Papadimitriou
DEFAULT_FORCED_SERVER_NETWORKS = getattr(settings,
173 4bf6778f Kostas Papadimitriou
                                         "CYCLADES_FORCED_SERVER_NETWORKS", []);
174 4bf6778f Kostas Papadimitriou
FORCED_SERVER_NETWORKS = getattr(settings, "UI_FORCED_SERVER_NETWORKS",
175 4bf6778f Kostas Papadimitriou
                                 DEFAULT_FORCED_SERVER_NETWORKS)
176 4bf6778f Kostas Papadimitriou
177 0d0466bf Kostas Papadimitriou
def template(name, request, context):
178 e646ebe5 Dimitris Moraitis
    template_path = os.path.join(os.path.dirname(__file__), "templates/")
179 b303ba05 Christodoulos Psaltis
    current_template = template_path + name + '.html'
180 b303ba05 Christodoulos Psaltis
    t = loader.get_template(current_template)
181 7970aa87 Kostas Papadimitriou
    media_context = {
182 7970aa87 Kostas Papadimitriou
       'UI_MEDIA_URL': UI_MEDIA_URL,
183 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_URL': UI_SYNNEFO_JS_URL,
184 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_URL': UI_SYNNEFO_JS_LIB_URL,
185 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_WEB_URL': UI_SYNNEFO_JS_WEB_URL,
186 7970aa87 Kostas Papadimitriou
       'SYNNEFO_IMAGES_URL': UI_SYNNEFO_IMAGES_URL,
187 7970aa87 Kostas Papadimitriou
       'SYNNEFO_CSS_URL': UI_SYNNEFO_CSS_URL,
188 7970aa87 Kostas Papadimitriou
       'SYNNEFO_JS_LIB_VERSION': SYNNEFO_JS_LIB_VERSION,
189 7970aa87 Kostas Papadimitriou
       'DEBUG': settings.DEBUG
190 7970aa87 Kostas Papadimitriou
    }
191 7970aa87 Kostas Papadimitriou
    context.update(media_context)
192 0d0466bf Kostas Papadimitriou
    return HttpResponse(t.render(RequestContext(request, context)))
193 cc7c5902 Dimitris Moraitis
194 479c3051 Ilias Tsitsimpis
195 cc7c5902 Dimitris Moraitis
def home(request):
196 e646ebe5 Dimitris Moraitis
    context = {'timeout': TIMEOUT,
197 a226ff9f Christodoulos Psaltis
               'project': '+nefo',
198 e646ebe5 Dimitris Moraitis
               'request': request,
199 f533f224 Vangelis Koukis
               'current_lang': get_language() or 'en',
200 27738c43 Kostas Papadimitriou
               'compute_api_url': json.dumps(uisettings.COMPUTE_URL),
201 e481c282 Kostas Papadimitriou
               'network_api_url': json.dumps(uisettings.NETWORK_URL),
202 27738c43 Kostas Papadimitriou
               'user_catalog_url': json.dumps(uisettings.USER_CATALOG_URL),
203 27738c43 Kostas Papadimitriou
               'feedback_post_url': json.dumps(uisettings.FEEDBACK_URL),
204 adcfcd8c Kostas Papadimitriou
               'accounts_api_url': json.dumps(uisettings.ACCOUNT_URL),
205 27738c43 Kostas Papadimitriou
               'logout_redirect': json.dumps(uisettings.LOGOUT_REDIRECT),
206 27738c43 Kostas Papadimitriou
               'login_redirect': json.dumps(uisettings.LOGIN_URL),
207 27738c43 Kostas Papadimitriou
               'glance_api_url': json.dumps(uisettings.GLANCE_URL),
208 27738c43 Kostas Papadimitriou
               'translate_uuids': json.dumps(True),
209 479c3051 Ilias Tsitsimpis
               # update interval settings
210 7b03c69d Dimitris Moraitis
               'update_interval': UPDATE_INTERVAL,
211 1cc6e94f Kostas Papadimitriou
               'update_interval_increase': UPDATE_INTERVAL_INCREASE,
212 479c3051 Ilias Tsitsimpis
               'update_interval_increase_after_calls':
213 426e1fb9 Kostas Papadimitriou
                UPDATE_INTERVAL_INCREASE_AFTER_CALLS_COUNT,
214 1cc6e94f Kostas Papadimitriou
               'update_interval_fast': UPDATE_INTERVAL_FAST,
215 1cc6e94f Kostas Papadimitriou
               'update_interval_max': UPDATE_INTERVAL_MAX,
216 3f339d85 Kostas Papadimitriou
               'changes_since_alignment': CHANGES_SINCE_ALIGNMENT,
217 0e8e87ac Kostas Papadimitriou
               'image_icons': IMAGE_ICONS,
218 85f1cd1e Kostas Papadimitriou
               'auth_cookie_name': AUTH_COOKIE_NAME,
219 acb284f7 Kostas Papadimitriou
               'auth_skip_redirects': json.dumps(AUTH_SKIP_REDIRECTS),
220 e0dea91a Kostas Papadimitriou
               'suggested_flavors': json.dumps(SUGGESTED_FLAVORS),
221 73e25ce2 Kostas Papadimitriou
               'suggested_roles': json.dumps(SUGGESTED_ROLES),
222 bcd451ea Kostas Papadimitriou
               'vm_image_common_metadata': json.dumps(VM_IMAGE_COMMON_METADATA),
223 5764e310 Kostas Papadimitriou
               'synnefo_version': SYNNEFO_JS_LIB_VERSION,
224 66be390b Kostas Papadimitriou
               'delay_on_blur': json.dumps(DELAY_ON_BLUR),
225 66be390b Kostas Papadimitriou
               'update_hidden_views': json.dumps(UPDATE_HIDDEN_VIEWS),
226 66be390b Kostas Papadimitriou
               'handle_window_exceptions': json.dumps(HANDLE_WINDOW_EXCEPTIONS),
227 66be390b Kostas Papadimitriou
               'skip_timeouts': json.dumps(SKIP_TIMEOUTS),
228 9c191b95 Kostas Papadimitriou
               'vm_name_template': json.dumps(VM_NAME_TEMPLATE),
229 479c3051 Ilias Tsitsimpis
               'flavors_disk_templates_info':
230 479c3051 Ilias Tsitsimpis
               json.dumps(FLAVORS_DISK_TEMPLATES_INFO),
231 47276ec2 Kostas Papadimitriou
               'support_ssh_os_list': json.dumps(SUPPORT_SSH_OS_LIST),
232 3f339d85 Kostas Papadimitriou
               'unknown_os': json.dumps(UNKNOWN_OS),
233 47276ec2 Kostas Papadimitriou
               'os_created_users': json.dumps(OS_CREATED_USERS),
234 c72a830d Kostas Papadimitriou
               'userdata_keys_limit': json.dumps(MAX_SSH_KEYS_PER_USER),
235 30b6f316 Kostas Papadimitriou
               'use_glance': json.dumps(ENABLE_GLANCE),
236 03639c6d Kostas Papadimitriou
               'system_images_owners': json.dumps(SYSTEM_IMAGES_OWNERS),
237 28958b8e Kostas Papadimitriou
               'custom_image_help_url': CUSTOM_IMAGE_HELP_URL,
238 03639c6d Kostas Papadimitriou
               'image_deleted_title': json.dumps(IMAGE_DELETED_TITLE),
239 03639c6d Kostas Papadimitriou
               'image_deleted_size_title': json.dumps(IMAGE_DELETED_SIZE_TITLE),
240 126a01f2 Kostas Papadimitriou
               'network_suggested_subnets': json.dumps(NETWORK_SUBNETS),
241 126a01f2 Kostas Papadimitriou
               'network_available_types': json.dumps(NETWORK_TYPES),
242 4bf6778f Kostas Papadimitriou
               'forced_server_networks': json.dumps(FORCED_SERVER_NETWORKS),
243 479c3051 Ilias Tsitsimpis
               'network_allow_duplicate_vm_nics':
244 479c3051 Ilias Tsitsimpis
               json.dumps(NETWORK_DUPLICATE_NICS),
245 126a01f2 Kostas Papadimitriou
               'network_strict_destroy': json.dumps(NETWORK_STRICT_DESTROY),
246 479c3051 Ilias Tsitsimpis
               'network_allow_multiple_destroy':
247 479c3051 Ilias Tsitsimpis
               json.dumps(NETWORK_ALLOW_MULTIPLE_DESTROY),
248 479c3051 Ilias Tsitsimpis
               'automatic_network_range_format':
249 479c3051 Ilias Tsitsimpis
               json.dumps(AUTOMATIC_NETWORK_RANGE_FORMAT),
250 479c3051 Ilias Tsitsimpis
               'grouped_public_network_name':
251 479c3051 Ilias Tsitsimpis
               json.dumps(GROUPED_PUBLIC_NETWORK_NAME),
252 9555268a Kostas Papadimitriou
               'group_public_networks': json.dumps(GROUP_PUBLIC_NETWORKS),
253 5b90c56d Kostas Papadimitriou
               'private_networks_nic_hotplug':
254 5b90c56d Kostas Papadimitriou
                   json.dumps(PRIVATE_NETWORKS_NIC_HOTPLUG),
255 479c3051 Ilias Tsitsimpis
               'diagnostics_update_interval':
256 479c3051 Ilias Tsitsimpis
               json.dumps(DIAGNOSTICS_UPDATE_INTERVAL),
257 f5e97e7f Kostas Papadimitriou
               'vm_hostname_format': json.dumps(VM_HOSTNAME_FORMAT)
258 479c3051 Ilias Tsitsimpis
               }
259 0d0466bf Kostas Papadimitriou
    return template('home', request, context)
260 cc7c5902 Dimitris Moraitis
261 f533f224 Vangelis Koukis
def machines_console(request):
262 479c3051 Ilias Tsitsimpis
    host, port, password = ('', '', '')
263 479c3051 Ilias Tsitsimpis
    host = request.GET.get('host', '')
264 479c3051 Ilias Tsitsimpis
    port = request.GET.get('port', '')
265 479c3051 Ilias Tsitsimpis
    password = request.GET.get('password', '')
266 479c3051 Ilias Tsitsimpis
    machine = request.GET.get('machine', '')
267 479c3051 Ilias Tsitsimpis
    host_ip = request.GET.get('host_ip', '')
268 479c3051 Ilias Tsitsimpis
    host_ip_v6 = request.GET.get('host_ip_v6', '')
269 140d08d0 Kostas Papadimitriou
    context = {'host': host, 'port': port, 'password': password,
270 140d08d0 Kostas Papadimitriou
               'machine': machine, 'host_ip': host_ip, 'host_ip_v6': host_ip_v6}
271 0d0466bf Kostas Papadimitriou
    return template('machines_console', request, context)
272 e646ebe5 Dimitris Moraitis
273 cbf7b384 Kostas Papadimitriou
274 8d08f18a Kostas Papadimitriou
def js_tests(request):
275 0d0466bf Kostas Papadimitriou
    return template('tests', request, {})
276 6f4c1371 Kostas Papadimitriou
277 479c3051 Ilias Tsitsimpis
278 479c3051 Ilias Tsitsimpis
CONNECT_LINUX_LINUX_MESSAGE = \
279 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be established using the
280 479c3051 Ilias Tsitsimpis
<a target="_blank" href="http://en.wikipedia.org/wiki/Secure_Shell">
281 479c3051 Ilias Tsitsimpis
SSH Protocol</a>.
282 479c3051 Ilias Tsitsimpis
To do so open a terminal and type the following at the prompt to connect
283 479c3051 Ilias Tsitsimpis
to your machine:""")
284 479c3051 Ilias Tsitsimpis
CONNECT_LINUX_WINDOWS_MESSAGE = \
285 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be established using
286 479c3051 Ilias Tsitsimpis
<a target="_blank"
287 479c3051 Ilias Tsitsimpis
href="http://en.wikipedia.org/wiki/Remote_Desktop_Services">
288 479c3051 Ilias Tsitsimpis
Remote Desktop Service</a>.
289 479c3051 Ilias Tsitsimpis
To do so, open the following file with an appropriate remote desktop client.""")
290 479c3051 Ilias Tsitsimpis
CONNECT_LINUX_WINDOWS_SUBMESSAGE = \
291 479c3051 Ilias Tsitsimpis
    _("""If you don't have a Remote Desktop client already installed,
292 ab3e9eb8 Kostas Papadimitriou
we suggest the use of <a target="_blank"
293 479c3051 Ilias Tsitsimpis
href=
294 479c3051 Ilias Tsitsimpis
"http://sourceforge.net/projects/tsclient/files/latest/download?source=files">
295 479c3051 Ilias Tsitsimpis
tsclient</a>.<br /><span class="important">IMPORTANT: It may take up to 15
296 479c3051 Ilias Tsitsimpis
minutes for your Windows VM to become available
297 99a005df Kostas Papadimitriou
after its creation.</span>""")
298 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_LINUX_MESSAGE = \
299 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be established using the
300 479c3051 Ilias Tsitsimpis
<a target="_blank"
301 bdf369a2 Kostas Papadimitriou
href="http://en.wikipedia.org/wiki/Secure_Shell">SSH Protocol</a>.
302 ae748a9d Kostas Papadimitriou
Open an ssh client such as PuTTY and type the following:""")
303 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_LINUX_SUBMESSAGE = \
304 479c3051 Ilias Tsitsimpis
    _("""If you do not have an ssh client already installed,
305 479c3051 Ilias Tsitsimpis
<a target="_blank"
306 479c3051 Ilias Tsitsimpis
href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe">
307 479c3051 Ilias Tsitsimpis
Download PuTTY</a>""")
308 479c3051 Ilias Tsitsimpis
309 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_WINDOWS_MESSAGE = \
310 479c3051 Ilias Tsitsimpis
    _("""A direct connection to this machine can be
311 17ab1a48 Vangelis Koukis
established using Remote Desktop. Click on the following link, and if asked
312 17ab1a48 Vangelis Koukis
open it using "Remote Desktop Connection".
313 479c3051 Ilias Tsitsimpis
<br /><span class="important">
314 479c3051 Ilias Tsitsimpis
IMPORTANT: It may take up to 15 minutes for your Windows VM to become available
315 3796f345 Kostas Papadimitriou
after its creation.</span>""")
316 479c3051 Ilias Tsitsimpis
CONNECT_WINDOWS_WINDOWS_SUBMESSAGE = \
317 479c3051 Ilias Tsitsimpis
    _("""Save this file to disk for future use.""")
318 bdf369a2 Kostas Papadimitriou
319 bdf369a2 Kostas Papadimitriou
# info/subinfo for all os combinations
320 bdf369a2 Kostas Papadimitriou
#
321 bdf369a2 Kostas Papadimitriou
# [0] info gets displayed on top of the message box
322 bdf369a2 Kostas Papadimitriou
# [1] subinfo gets displayed on the bottom as extra info
323 bdf369a2 Kostas Papadimitriou
# provided to the user when needed
324 65ecc5e4 Kostas Papadimitriou
CONNECT_PROMPT_MESSAGES = {
325 6f4c1371 Kostas Papadimitriou
    'linux': {
326 479c3051 Ilias Tsitsimpis
        'linux': [CONNECT_LINUX_LINUX_MESSAGE, ""],
327 479c3051 Ilias Tsitsimpis
        'windows': [CONNECT_LINUX_WINDOWS_MESSAGE,
328 479c3051 Ilias Tsitsimpis
                    CONNECT_LINUX_WINDOWS_SUBMESSAGE],
329 479c3051 Ilias Tsitsimpis
        'ssh_message': "ssh %(user)s@%(hostname)s"
330 3796f345 Kostas Papadimitriou
    },
331 6f4c1371 Kostas Papadimitriou
    'windows': {
332 479c3051 Ilias Tsitsimpis
        'linux': [CONNECT_WINDOWS_LINUX_MESSAGE,
333 479c3051 Ilias Tsitsimpis
                  CONNECT_WINDOWS_LINUX_SUBMESSAGE],
334 479c3051 Ilias Tsitsimpis
        'windows': [CONNECT_WINDOWS_WINDOWS_MESSAGE,
335 479c3051 Ilias Tsitsimpis
                    CONNECT_WINDOWS_WINDOWS_SUBMESSAGE],
336 479c3051 Ilias Tsitsimpis
        'ssh_message': "%(user)s@%(hostname)s"
337 3796f345 Kostas Papadimitriou
    },
338 3796f345 Kostas Papadimitriou
}
339 3796f345 Kostas Papadimitriou
340 479c3051 Ilias Tsitsimpis
APPEND_CONNECT_PROMPT_MESSAGES = \
341 479c3051 Ilias Tsitsimpis
    getattr(settings, 'UI_CONNECT_PROMPT_MESSAGES', {})
342 3796f345 Kostas Papadimitriou
for k, v in APPEND_CONNECT_PROMPT_MESSAGES.iteritems():
343 3796f345 Kostas Papadimitriou
    CONNECT_PROMPT_MESSAGES[k].update(v)
344 6f4c1371 Kostas Papadimitriou
345 65ecc5e4 Kostas Papadimitriou
# retrieve domain prefix from settings
346 140d08d0 Kostas Papadimitriou
DOMAIN_PREFIX = getattr(settings, 'MACHINE_DOMAIN_PREFIX', getattr(settings,
347 140d08d0 Kostas Papadimitriou
                        'BACKEND_PREFIX_ID', ""))
348 65ecc5e4 Kostas Papadimitriou
349 65ecc5e4 Kostas Papadimitriou
# domain template string
350 65ecc5e4 Kostas Papadimitriou
DOMAIN_TPL = "%s%%s" % DOMAIN_PREFIX
351 65ecc5e4 Kostas Papadimitriou
352 479c3051 Ilias Tsitsimpis
353 fd70c1db Markos Gogoulos
def machines_connect(request):
354 479c3051 Ilias Tsitsimpis
    ip_address = request.GET.get('ip_address', '')
355 479c3051 Ilias Tsitsimpis
    hostname = request.GET.get('hostname', '')
356 479c3051 Ilias Tsitsimpis
    operating_system = metadata_os = request.GET.get('os', '')
357 bdf369a2 Kostas Papadimitriou
    server_id = request.GET.get('srv', 0)
358 479c3051 Ilias Tsitsimpis
    host_os = request.GET.get('host_os', 'Linux').lower()
359 5bc1794f Kostas Papadimitriou
    username = request.GET.get('username', None)
360 65ecc5e4 Kostas Papadimitriou
    domain = request.GET.get("domain", DOMAIN_TPL % int(server_id))
361 6f4c1371 Kostas Papadimitriou
362 406bf0d9 Kostas Papadimitriou
    # guess host os
363 319091c7 Kostas Papadimitriou
    if host_os != "windows":
364 319091c7 Kostas Papadimitriou
        host_os = 'linux'
365 319091c7 Kostas Papadimitriou
366 406bf0d9 Kostas Papadimitriou
    # guess username
367 406bf0d9 Kostas Papadimitriou
    if not username:
368 406bf0d9 Kostas Papadimitriou
        username = "root"
369 406bf0d9 Kostas Papadimitriou
370 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() in ['ubuntu', 'kubuntu', 'fedora']:
371 406bf0d9 Kostas Papadimitriou
            username = "user"
372 406bf0d9 Kostas Papadimitriou
373 406bf0d9 Kostas Papadimitriou
        if metadata_os.lower() == "windows":
374 406bf0d9 Kostas Papadimitriou
            username = "Administrator"
375 406bf0d9 Kostas Papadimitriou
376 406bf0d9 Kostas Papadimitriou
    # operating system provides ssh access
377 406bf0d9 Kostas Papadimitriou
    ssh = False
378 6f4c1371 Kostas Papadimitriou
    if operating_system != "windows":
379 6f4c1371 Kostas Papadimitriou
        operating_system = "linux"
380 406bf0d9 Kostas Papadimitriou
        ssh = True
381 6f4c1371 Kostas Papadimitriou
382 bdf369a2 Kostas Papadimitriou
    # rdp param is set, the user requested rdp file
383 406bf0d9 Kostas Papadimitriou
    # check if we are on windows
384 406bf0d9 Kostas Papadimitriou
    if operating_system == 'windows' and request.GET.get("rdp", False):
385 9f6eb417 Kostas Papadimitriou
        extra_rdp_content = ''
386 406bf0d9 Kostas Papadimitriou
        # UI sent domain info (from vm metadata) use this
387 406bf0d9 Kostas Papadimitriou
        # otherwise use our default snf-<vm_id> domain
388 3796f345 Kostas Papadimitriou
        EXTRA_RDP_CONTENT = getattr(settings, 'UI_EXTRA_RDP_CONTENT', '')
389 3796f345 Kostas Papadimitriou
        if callable(EXTRA_RDP_CONTENT):
390 3796f345 Kostas Papadimitriou
            extra_rdp_content = EXTRA_RDP_CONTENT(server_id, ip_address,
391 3796f345 Kostas Papadimitriou
                                                  hostname, username)
392 3796f345 Kostas Papadimitriou
        else:
393 9f6eb417 Kostas Papadimitriou
            if EXTRA_RDP_CONTENT:
394 9f6eb417 Kostas Papadimitriou
                extra_rdp_content = EXTRA_RDP_CONTENT % \
395 9f6eb417 Kostas Papadimitriou
                    {
396 9f6eb417 Kostas Papadimitriou
                        'server_id': server_id,
397 9f6eb417 Kostas Papadimitriou
                        'ip_address': ip_address,
398 9f6eb417 Kostas Papadimitriou
                        'hostname': hostname,
399 9f6eb417 Kostas Papadimitriou
                        'user': username
400 9f6eb417 Kostas Papadimitriou
                      }
401 3796f345 Kostas Papadimitriou
402 406bf0d9 Kostas Papadimitriou
        rdp_context = {
403 479c3051 Ilias Tsitsimpis
            'username': username,
404 479c3051 Ilias Tsitsimpis
            'domain': domain,
405 479c3051 Ilias Tsitsimpis
            'ip_address': ip_address,
406 479c3051 Ilias Tsitsimpis
            'hostname': hostname,
407 479c3051 Ilias Tsitsimpis
            'extra_content': extra_rdp_content
408 406bf0d9 Kostas Papadimitriou
        }
409 406bf0d9 Kostas Papadimitriou
410 406bf0d9 Kostas Papadimitriou
        rdp_file_data = render_to_string("synnefo-windows.rdp", rdp_context)
411 406bf0d9 Kostas Papadimitriou
        response = HttpResponse(rdp_file_data, mimetype='application/x-rdp')
412 bdf369a2 Kostas Papadimitriou
413 bdf369a2 Kostas Papadimitriou
        # proper filename, use server id and ip address
414 3796f345 Kostas Papadimitriou
        filename = "%d-%s.rdp" % (int(server_id), hostname)
415 bdf369a2 Kostas Papadimitriou
        response['Content-Disposition'] = 'attachment; filename=%s' % filename
416 fd70c1db Markos Gogoulos
    else:
417 3796f345 Kostas Papadimitriou
        ssh_message = CONNECT_PROMPT_MESSAGES['linux'].get('ssh_message')
418 3796f345 Kostas Papadimitriou
        if host_os == 'windows':
419 3796f345 Kostas Papadimitriou
            ssh_message = CONNECT_PROMPT_MESSAGES['windows'].get('ssh_message')
420 3796f345 Kostas Papadimitriou
        if callable(ssh_message):
421 3796f345 Kostas Papadimitriou
            link_title = ssh_message(server_id, ip_address, hostname, username)
422 3796f345 Kostas Papadimitriou
        else:
423 3796f345 Kostas Papadimitriou
            link_title = ssh_message % {
424 479c3051 Ilias Tsitsimpis
                'server_id': server_id,
425 479c3051 Ilias Tsitsimpis
                'ip_address': ip_address,
426 479c3051 Ilias Tsitsimpis
                'hostname': hostname,
427 479c3051 Ilias Tsitsimpis
                'user': username
428 479c3051 Ilias Tsitsimpis
            }
429 b687587e Kostas Papadimitriou
        if (operating_system != "windows"):
430 bdf369a2 Kostas Papadimitriou
            link_url = None
431 bdf369a2 Kostas Papadimitriou
432 3796f345 Kostas Papadimitriou
        else:
433 3796f345 Kostas Papadimitriou
            link_title = _("Remote desktop to %s") % ip_address
434 479c3051 Ilias Tsitsimpis
            link_url = \
435 479c3051 Ilias Tsitsimpis
                "%s?ip_address=%s&os=%s&rdp=1&srv=%d&username=%s&domain=%s" \
436 479c3051 Ilias Tsitsimpis
                "&hostname=%s" % (
437 3796f345 Kostas Papadimitriou
                    reverse("ui_machines_connect"), ip_address,
438 479c3051 Ilias Tsitsimpis
                    operating_system, int(server_id), username,
439 479c3051 Ilias Tsitsimpis
                    domain, hostname)
440 b687587e Kostas Papadimitriou
441 6f4c1371 Kostas Papadimitriou
        # try to find a specific message
442 6f4c1371 Kostas Papadimitriou
        try:
443 479c3051 Ilias Tsitsimpis
            connect_message = \
444 479c3051 Ilias Tsitsimpis
                CONNECT_PROMPT_MESSAGES[host_os][operating_system][0]
445 65ecc5e4 Kostas Papadimitriou
            subinfo = CONNECT_PROMPT_MESSAGES[host_os][operating_system][1]
446 6f4c1371 Kostas Papadimitriou
        except KeyError:
447 479c3051 Ilias Tsitsimpis
            connect_message = \
448 479c3051 Ilias Tsitsimpis
                _("You are trying to connect from a %s "
449 479c3051 Ilias Tsitsimpis
                  "machine to a %s machine") % (host_os, operating_system)
450 bdf369a2 Kostas Papadimitriou
            subinfo = ""
451 6f4c1371 Kostas Papadimitriou
452 b687587e Kostas Papadimitriou
        response_object = {
453 479c3051 Ilias Tsitsimpis
            'ip': ip_address,
454 479c3051 Ilias Tsitsimpis
            'os': operating_system,
455 479c3051 Ilias Tsitsimpis
            'ssh': ssh,
456 479c3051 Ilias Tsitsimpis
            'info': unicode(connect_message),
457 479c3051 Ilias Tsitsimpis
            'subinfo': unicode(subinfo),
458 479c3051 Ilias Tsitsimpis
            'link': {'title': unicode(link_title), 'url': link_url}
459 479c3051 Ilias Tsitsimpis
        }
460 479c3051 Ilias Tsitsimpis
        response = \
461 479c3051 Ilias Tsitsimpis
            HttpResponse(json.dumps(response_object),
462 479c3051 Ilias Tsitsimpis
                         mimetype='application/json')  # no windows, no rdp
463 6f4c1371 Kostas Papadimitriou
464 fd70c1db Markos Gogoulos
    return response