def __init__(self, *args, **kwargs): super(LaunchForm, self).__init__(*args, **kwargs) flavorlist = kwargs.get('initial', {}).get('flavorlist', []) self.fields['flavor'] = forms.ChoiceField( choices=flavorlist, label="Flavor", help_text="Size of Image to launch") keynamelist = kwargs.get('initial', {}).get('keynamelist', []) self.fields['key_name'] = forms.ChoiceField( choices=keynamelist, label="Key Name", required=False, help_text="Which keypair to use for authentication") securitygrouplist = kwargs.get('initial', {}).get('securitygrouplist', []) self.fields['security_groups'] = forms.MultipleChoiceField( choices=securitygrouplist, label='Security Groups', required=True, initial=['default'], widget=forms.SelectMultiple(attrs={ 'class': 'chzn-select', 'style': "min-width: 200px" }), help_text="Launch instance in these Security Groups") # setting self.fields.keyOrder seems to break validation, # so ordering fields manually field_list = ('name', 'user_data', 'flavor', 'key_name') for field in field_list[::-1]: self.fields.insert(0, field, self.fields.pop(field))
class MakePublicContainer(forms.SelfHandlingForm): index_object_name = forms.ChoiceField(label="Object used for index.html") css_object_name = forms.ChoiceField( label="Object used as a css file for listing Container") error = forms.CharField(max_length="255", label="file suffix to be used when error occurs", required=False) public_html = forms.BooleanField(label="Published as HTML", required=False) use_css_in_listing = forms.BooleanField( label="Use CSS file for listing Container", required=False) html_listing = forms.BooleanField(label="Enable Container listing", required=False) container_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): objects = kwargs.pop('objects') headers = kwargs.pop('headers') super(MakePublicContainer, self).__init__(*args, **kwargs) self.fields['index_object_name'].choices = objects self.fields['css_object_name'].choices = objects for name, value in headers: name = name.lower() if name == 'x-container-meta-web-index': self.fields['public_html'].initial = True self.fields['index_object_name'].initial = (value, value) if name == 'x-container-meta-web-listing': self.fields['html_listing'].initial = value == 'true' if name == 'x-container-meta-web-listing-css': self.fields['use_css_in_listing'].initial = True self.fields['css_object_name'].initial = (value, value) if name == 'x-container-meta-web-error': self.fields['error'].value = value def handle(self, request, data): hdrs = {} index_object_name = data['index_object_name'] css_object_name = data['css_object_name'] public_html = data['public_html'] error = data['error'] html_listing = data['html_listing'] use_css_in_listing = data['use_css_in_listing'] container_name = data['container_name'] for name in ['Index', 'Listing', 'Listing-Css', 'Error']: hdrs['X-Container-Meta-Web-' + name] = '' if public_html: hdrs['X-Container-Meta-Web-Index'] = index_object_name if html_listing: hdrs['X-Container-Meta-Web-Listing'] = 'true' if use_css_in_listing: hdrs['X-Container-Meta-Web-Listing-Css'] = css_object_name if error: hdrs['X-Container-Meta-Web-Error'] = error api.swift_set_container_info(request, container_name, hdrs) return shortcuts.redirect("dash_containers", request.user.tenant_id)
class FloatingIpAssociate(forms.SelfHandlingForm): floating_ip_id = forms.CharField(widget=forms.HiddenInput()) floating_ip = forms.CharField(widget=forms.TextInput( attrs={'readonly': 'readonly'})) instance_id = forms.ChoiceField() def __init__(self, *args, **kwargs): super(FloatingIpAssociate, self).__init__(*args, **kwargs) instancelist = kwargs.get('initial', {}).get('instances', []) self.fields['instance_id'] = forms.ChoiceField(choices=instancelist, label="Instance") def handle(self, request, data): try: api.server_add_floating_ip(request, data['instance_id'], data['floating_ip_id']) LOG.info('Associating Floating IP "%s" with Instance "%s"' % (data['floating_ip'], data['instance_id'])) messages.info( request, 'Successfully associated Floating IP: %s \ with Instance: %s' % (data['floating_ip'], data['instance_id'])) except novaclient_exceptions.ClientException, e: LOG.error("ClientException in FloatingIpAssociate", exc_info=True) messages.error(request, 'Error associating Floating IP: %s' % e.message) return shortcuts.redirect('dash_floating_ips', request.user.tenant)
class AddRule(forms.SelfHandlingForm): ip_protocol = forms.ChoiceField(choices=[('tcp', 'tcp'), ('udp', 'udp'), ('icmp', 'icmp')]) from_port = forms.CharField() to_port = forms.CharField() cidr = forms.CharField() # TODO (anthony) source group support # group_id = forms.CharField() security_group_id = forms.CharField(widget=forms.HiddenInput()) tenant_id = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): tenant_id = data['tenant_id'] try: LOG.info('Add security_group_rule: "%s"' % data) rule = api.security_group_rule_create( request, data['security_group_id'], data['ip_protocol'], data['from_port'], data['to_port'], data['cidr']) messages.info(request, 'Successfully added rule: %s' \ % rule.id) except novaclient_exceptions.ClientException, e: LOG.error("ClientException in AddRule", exc_info=True) messages.error(request, 'Error adding rule security group: %s' % e.message) return shortcuts.redirect(request.build_absolute_uri())
class CopyObject(forms.SelfHandlingForm): new_container_name = forms.ChoiceField( label="Container to store object in") new_object_name = forms.CharField(max_length="255", label="New object name") orig_container_name = forms.CharField(widget=forms.HiddenInput()) orig_object_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): containers = kwargs.pop('containers') super(CopyObject, self).__init__(*args, **kwargs) self.fields['new_container_name'].choices = containers def handle(self, request, data): orig_container_name = data['orig_container_name'] orig_object_name = data['orig_object_name'] new_container_name = data['new_container_name'] new_object_name = data['new_object_name'] api.swift_copy_object(request, orig_container_name, orig_object_name, new_container_name, new_object_name) messages.success(request, 'Object was successfully copied to %s\%s' % (new_container_name, new_object_name)) return shortcuts.redirect(request.build_absolute_uri())
class UserEnableDisableForm(forms.SelfHandlingForm): id = forms.CharField(label=_("ID (username)"), widget=forms.HiddenInput()) enabled = forms.ChoiceField(label=_("enabled"), widget=forms.HiddenInput(), choices=[[c, c] for c in ("disable", "enable")]) def handle(self, request, data): user_id = data['id'] enabled = data['enabled'] == "enable" try: api.user_update_enabled(request, user_id, enabled) messages.info( request, _("User %(user)s %(state)s") % { "user": user_id, "state": "enabled" if enabled else "disabled" }) except api_exceptions.ApiException: messages.error( request, _("Unable to %(state)s user %(user)s") % { "state": "enable" if enabled else "disable", "user": user_id }) return redirect(request.build_absolute_uri())
class BillForm(forms.Form): def __init__(self, *args, **kwargs): tenant_list = kwargs.pop('tenant_list', None) super(BillForm, self).__init__(*args, **kwargs) self.fields['tenant_id'].choices = [[tenant.id, tenant.id] for tenant in tenant_list] vcpu = forms.DecimalField(label="virtual CPU (1 - $)", max_digits=5, decimal_places=2) ram = forms.DecimalField(label="RAM (1 MB - $)", max_digits=5, decimal_places=2) vdisk = forms.DecimalField(label="virtual Disk (1 GB - $)", max_digits=5, decimal_places=2) tenant_id = forms.ChoiceField(label="Month-Year")
class UserForm(forms.Form): def __init__(self, *args, **kwargs): tenant_list = kwargs.pop('tenant_list', None) super(UserForm, self).__init__(*args, **kwargs) self.fields['tenant_id'].choices = [[tenant.id, tenant.id] for tenant in tenant_list] id = forms.CharField(label="ID (username)") email = forms.CharField(label="Email") password = forms.CharField(label="Password", widget=forms.PasswordInput(render_value=False), required=False) tenant_id = forms.ChoiceField(label="Primary Tenant")
class UserUpdateForm(forms.Form): def __init__(self, *args, **kwargs): tenant_list = kwargs.pop('tenant_list', None) super(UserUpdateForm, self).__init__(*args, **kwargs) self.fields['tenant_id'].choices = [[tenant.id, tenant.name] for tenant in tenant_list] id = forms.CharField(label="ID", widget=forms.TextInput(attrs={'readonly': 'readonly'})) # FIXME: keystone doesn't return the username from a get API call. #name = forms.CharField(label="Name") email = forms.CharField(label="Email") password = forms.CharField(label="Password", widget=forms.PasswordInput(render_value=False), required=False) tenant_id = forms.ChoiceField(label="Primary Tenant")
class OtherContainer(forms.SelfHandlingForm): storage_url = forms.CharField(widget=forms.HiddenInput(), required=False) storage_urls = forms.ChoiceField(initial=1, widget=forms.Select, required=False) def __init__(self, *args, **kwargs): fields = kwargs.pop('storage_urls') storage_url = kwargs.pop('storage_url') super(OtherContainer, self).__init__(*args, **kwargs) self.fields['storage_urls'].choices = [(value, value) for value in fields] if storage_url: self.fields['storage_urls'].initial = (storage_url, storage_url) def handle(self, request, data): storage_url = data['storage_url'] storage_urls = data['storage_urls'] if storage_url: target_url = storage_url elif storage_urls: target_url = storage_urls containers = [] try: containers = api.swift_get_containers(request, target_url) request.session['storage_url'] = target_url if not request.session.get('storage_url_list', None): request.session['storage_url_list'] = set() request.session['storage_url_list'].add(target_url) except Exception, e: msg = "Unable to retrieve containers from swift: %s" % str(e) LOG.exception(msg) messages.error(request, msg) return shortcuts.redirect('dash_containers', request.user.tenant_id) return shortcuts.render_to_response( 'django_openstack/dash/containers/index.html', { 'containers': containers, 'storage_url_form': self, 'storage_url': storage_url }, context_instance=template.RequestContext(request))
class ContainerAcl(forms.SelfHandlingForm): ''' Form that handles Swift Container Acl ''' container_name = forms.CharField(widget=forms.HiddenInput()) acl_type = forms.ChoiceField(label="ACL Type", choices=((1, 'ReadAcl'), (0, 'WriteAcl')), initial=1, widget=forms.RadioSelect) read_acl = forms.CharField(widget=forms.HiddenInput(), required=False) write_acl = forms.CharField(widget=forms.HiddenInput(), required=False) acl_add = forms.CharField(max_length="255", label="ACL", required=True) def __init__(self, *args, **kwargs): super(ContainerAcl, self).__init__(*args, **kwargs) def handle(self, request, data): container_name = data['container_name'] acl_type = data['acl_type'] try: acl_add = data['acl_add'] acl_add.encode('ascii') except UnicodeEncodeError, e: messages.error( request, "Container ACL contains non-ASCII \ character %s" % str(e)) return shortcuts.redirect(request.build_absolute_uri()) if acl_type == "1": type = 'X-Container-Read' acl_value = data.get('read_acl', '') elif acl_type == "0": type = 'X-Container-Write' acl_value = data.get('write_acl', '') # clean and parse acl try: acl = clean_acl(type, acl_add) acl_orig = clean_acl(type, acl_value) ref_add, group_add = parse_acl(acl) ref_orig, group_orig = parse_acl(acl_orig) except ValueError, e: messages.error(request, 'ACL value is invalid %s' % str(e)) return None
class CopyObject(forms.SelfHandlingForm): new_container_name = forms.ChoiceField( label="Container to store object in") new_object_name = forms.CharField(max_length="1024", label="New object name") orig_container_name = forms.CharField(widget=forms.HiddenInput()) orig_object_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): containers = kwargs.pop('containers') super(CopyObject, self).__init__(*args, **kwargs) self.fields['new_container_name'].choices = containers def handle(self, request, data): values = {} values['orig_cont'] = data['orig_container_name'] values['orig_obj'] = data['orig_object_name'] values['new_cont'] = data['new_container_name'] values['new_obj'] = data['new_object_name'] escaped = {} for key, value in values.iteritems(): escaped[key] = value.encode('utf-8').replace('/', '%2F') #escaped[key] = value.encode('utf-8') try: api.swift_copy_object(request, escaped['orig_cont'], escaped['orig_obj'], escaped['new_cont'], escaped['new_obj'], request.session.get('storage_url', None)) messages.success( request, 'Object was successfully copied to %s/%s' % (values['new_cont'], values['new_obj'])) except NoSuchContainer, e: messages.error(request, 'Object copy is failed. %s' % str(e)) except ResponseError, e: messages.error(request, 'Object copy is failed. %s' % str(e))
def __init__(self, *args, **kwargs): super(FloatingIpAssociate, self).__init__(*args, **kwargs) instancelist = kwargs.get('initial', {}).get('instances', []) self.fields['instance_id'] = forms.ChoiceField(choices=instancelist, label="Instance")
class MakePublicContainer(forms.SelfHandlingForm): index_object_name = forms.ChoiceField(label="Object used for index.html") css_object_name = forms.ChoiceField( label="Object used as a css file for listing Container") error = forms.CharField(max_length="255", label="file suffix to be used when error occurs", required=False) public_html = forms.BooleanField(label="Published as HTML", required=False) use_css_in_listing = forms.BooleanField( label="Use CSS file for listing Container", required=False) html_listing = forms.BooleanField(label="Enable Container listing", required=False) container_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): objects = kwargs.pop('objects') headers = kwargs.pop('headers') super(MakePublicContainer, self).__init__(*args, **kwargs) self.fields['index_object_name'].choices = objects self.fields['css_object_name'].choices = objects for name, value in headers: name = name.lower() if name == 'x-container-meta-web-index': self.fields['public_html'].initial = True self.fields['index_object_name'].initial = (value, value) if name == 'x-container-meta-web-listings': self.fields['html_listing'].initial = value == 'true' if name == 'x-container-meta-web-listings-css': self.fields['use_css_in_listing'].initial = True self.fields['css_object_name'].initial = (value, value) if name == 'x-container-meta-web-error': self.fields['error'].value = value def handle(self, request, data): hdrs = {} index_object_name = data['index_object_name'] css_object_name = data['css_object_name'] public_html = data['public_html'] error = data['error'] try: error = error.encode('ascii') except Exception, e: messages.error( request, 'Container Public contains non-ASCII character %s' % str(e)) return html_listing = data['html_listing'] use_css_in_listing = data['use_css_in_listing'] container_name = data['container_name'] for name in ['Index', 'Listings', 'Listings-Css', 'Error']: hdrs['X-Container-Meta-Web-' + name] = '' if public_html: hdrs['X-Container-Meta-Web-Index'] = index_object_name if html_listing: hdrs['X-Container-Meta-Web-Listings'] = 'true' if use_css_in_listing: hdrs['X-Container-Meta-Web-Listings-Css'] = css_object_name if error: hdrs['X-Container-Meta-Web-Error'] = error try: api.swift_set_container_info(request, container_name, hdrs) except Exception, e: messages.error( request, 'Unable to set container metadata for public : %s' % str(e)) return
class ContainerAcl(forms.SelfHandlingForm): ''' Form that handles Swift Container Acl ''' container_name = forms.CharField(widget=forms.HiddenInput()) acl_type = forms.ChoiceField(label="ACL Type", choices=((1, 'ReadAcl'), (0, 'WriteAcl')), initial=1, widget=forms.RadioSelect) read_acl = forms.CharField(widget=forms.HiddenInput(), required=False) write_acl = forms.CharField(widget=forms.HiddenInput(), required=False) acl_add = forms.CharField(max_length="255", label="ACL", required=True) def __init__(self, *args, **kwargs): super(ContainerAcl, self).__init__(*args, **kwargs) def handle(self, request, data): container_name = data['container_name'] acl_type = data['acl_type'] if acl_type == "1": type = 'X-Container-Read' acl_value = data.get('read_acl', '') elif acl_type == "0": type = 'X-Container-Write' acl_value = data.get('write_acl', '') # clean and parse acl try: acl = clean_acl(type, data['acl_add']) acl_orig = clean_acl(type, acl_value) ref_add, group_add = parse_acl(acl) ref_orig, group_orig = parse_acl(acl_orig) except ValueError, e: messages.error(request, 'ACL value is invalid %s' % str(e)) print str(e) return # duplicate check ref_add = list(set(ref_add)) ref_orig = list(set(ref_orig)) group_add = list(set(group_add)) group_orig = list(set(group_orig)) acl_result = [] acl_ref_result = [] for item in group_add: if not item in group_orig: acl_result.append(item) for item in ref_add: if not item in ref_orig: acl_ref_result.append(item) group_result = group_orig + acl_result ref_result = acl_ref_result + ref_orig # re-calcurate referer string refs_result = map(lambda x: '.r:%s' % x, ref_result) # set header hdrs = {} hdrs[type] = ','.join(group_result + ref_result) api.swift_set_container_info(request, container_name, hdrs) return shortcuts.redirect(request.build_absolute_uri())