Statistics
| Branch: | Tag: | Revision:

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

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