Statistics
| Branch: | Tag: | Revision:

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

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