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 ObjectMeta(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) object_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField(max_length="128", label="Name") header_value = forms.CharField(max_length="256", label="Value") def __init__(self, *args, **kwargs): super(ObjectMeta, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] value = data['header_value'] container_name = data['container_name'] object_name = data['object_name'] if not header.lower().startswith('x-object-meta-'): messages.error(request, 'Object metadata must begin with x-object-meta-') else: hdrs = {} hdrs[header[14:]] = value api.swift_set_object_info(request, container_name, object_name, hdrs) 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 ContainerMetaRemove(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): super(ContainerMetaRemove, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] container_name = data['container_name'] if not header.lower().startswith('x-container-meta'): messages.error( request, "Container metadata must begin with x-container-meta-") else: hdrs = {} hdrs[header] = '' try: api.swift_set_container_info(request, container_name, hdrs) except ResponseError, e: messages.error( request, 'Unable to remove metadata from container : %s' % str(e)) return None
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 ObjectMetaRemove(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) object_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): super(ObjectMetaRemove, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] container_name = data['container_name'] object_name = data['object_name'] if not header.lower().startswith('x-object-meta-'): messages.error(request, 'Object metadata must begin with x-object-meta-') else: hdrs = {} hdrs[header[14:]] = '' try: api.swift_remove_object_info( request, container_name, object_name, hdrs, request.session.get('storage_url', None)) except ResponseError, e: messages.error(request, 'Removing Object Metadata fails %s' % str(e)) return None
class DeleteObject(forms.SelfHandlingForm): object_name = forms.CharField(widget=forms.HiddenInput()) container_name = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): api.swift_delete_object(request, data['container_name'], data['object_name']) messages.info(request, 'Successfully deleted object: %s' % \ data['object_name']) return shortcuts.redirect(request.build_absolute_uri())
class DeleteObject(forms.SelfHandlingForm): object_name = forms.CharField(widget=forms.HiddenInput()) container_name = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): api.swift_delete_object(request, data['container_name'], data['object_name'], request.session.get('storage_url', None)) messages.info(request, 'Successfully deleted object: %s' % \ data['object_name']) return None
class DetachPort(forms.SelfHandlingForm): network = forms.CharField(widget=forms.HiddenInput()) port = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: LOG.info('Detaching port %s' % data['port']) api.quantum_detach_port(request, data['network'], data['port']) except Exception, e: messages.error(request, 'Unable to detach port %s: %s' % (data['port'], e.message,)) else:
class UploadObject(forms.SelfHandlingForm): name = forms.CharField(max_length="255", label="Object Name") object_file = forms.FileField(label="File") container_name = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: file = self.files['object_file'] cont = data['container_name'] cont = cont.encode('utf-8') obj = data['name'] obj = obj.encode('utf-8') obj = obj.replace('/', '%2F') api.swift_upload_object_with_manifest( request, cont, obj, file, request.session.get('storage_url', None)) messages.success(request, "Object was successfully uploaded.") except Exception as e: messages.error(request, "Upload Object was failed (%s)" % str(e)) finally: try: if getattr(file, 'temporary_file_path', None): name = file.temporary_file_path() file.close() os.remove(name) except Exception, e: LOG.exception('file delete failed %s' % str(e)) return None
class UpdateImageForm(forms.SelfHandlingForm): image_id = forms.CharField(widget=forms.HiddenInput()) name = forms.CharField(max_length="25", label="Name") location = forms.CharField(label="Location") user = forms.CharField(label="User") password = forms.CharField(widget=forms.PasswordInput, label="Password") def handle(self, request, data): image_id = data['image_id'] tenant_id = request.user.tenant_id error_retrieving = _('Unable to retreive image info from glance: %s' % image_id) error_updating = _('Error updating image with id: %s' % image_id) scheme, location = _parse_location(data['location']) auth = ":".join([data['user'] , data['password']]) try: image = api.image_get_meta(request, image_id) #image = api.image_get(request, image_id) except glance_exception.ClientConnectionError, e: LOG.exception(_('Error connecting to glance')) messages.error(request, error_retrieving) except glance_exception.Error, e: LOG.exception(error_retrieving) messages.error(request, error_retrieving)
class CreateSnapshot(forms.SelfHandlingForm): tenant_id = forms.CharField(widget=forms.HiddenInput()) instance_id = forms.CharField(widget=forms.TextInput( attrs={'readonly': 'readonly'})) name = forms.CharField(max_length="20", label=_("Snapshot Name")) def handle(self, request, data): try: LOG.info('Creating snapshot "%s"' % data['name']) snapshot = api.snapshot_create(request, data['instance_id'], data['name']) instance = api.server_get(request, data['instance_id']) messages.info( request, _('Snapshot "%(name)s" created for instance "%(inst)s"') % { "name": data['name'], "inst": instance.name }) return shortcuts.redirect('dash_snapshots', data['tenant_id']) except api_exceptions.ApiException, e: msg = _('Error Creating Snapshot: %s') % e.message LOG.exception(msg) messages.error(request, msg) return shortcuts.redirect(request.build_absolute_uri())
class ContainerMeta(forms.SelfHandlingForm): ''' Form that handles Swift Container Meta Data ''' container_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField( max_length="128", label='Name', required=True, validators=[validators.MaxLengthValidator(128)]) header_value = forms.CharField( max_length="256", label="Value", required=True, validators=[validators.MaxLengthValidator(256)]) def __init__(self, *args, **kwargs): super(ContainerMeta, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] value = data['header_value'] container_name = data['container_name'] if not header.lower().startswith('x-container-meta'): messages.error( request, "Container metadata must begin with x-container-meta-") else: hdrs = {} hdrs[header] = value api.swift_set_container_info(request, container_name, hdrs) return shortcuts.redirect(request.build_absolute_uri())
class UpdateImageForm(forms.SelfHandlingForm): image_id = forms.CharField(widget=forms.HiddenInput()) name = forms.CharField(max_length="25", label="Name") kernel = forms.CharField(max_length="25", label="Kernel ID", required=False) ramdisk = forms.CharField(max_length="25", label="Ramdisk ID", required=False) architecture = forms.CharField(label="Architecture", required=False) container_format = forms.CharField(label="Container Format", required=False) disk_format = forms.CharField(label="Disk Format") def handle(self, request, data): image_id = data['image_id'] tenant_id = request.user.tenant_id error_retrieving = _('Unable to retreive image info from glance: %s' % image_id) error_updating = _('Error updating image with id: %s' % image_id) try: image = api.image_get(request, image_id) except glance_exception.ClientConnectionError, e: LOG.exception(_('Error connecting to glance')) messages.error(request, error_retrieving) except glance_exception.Error, e: LOG.exception(error_retrieving) messages.error(request, error_retrieving)
class TogglePort(forms.SelfHandlingForm): network = forms.CharField(widget=forms.HiddenInput()) port = forms.CharField(widget=forms.HiddenInput()) state = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: LOG.info('Toggling port state to %s' % data['state']) body = {'port': {'state': '%s' % data['state']}} api.quantum_set_port_state(request, data['network'], data['port'], body) except Exception, e: messages.error(request, 'Unable to set port state to %s: %s' % (data['state'], e.message,)) else:
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 DeletePort(forms.SelfHandlingForm): network = forms.CharField(widget=forms.HiddenInput()) port = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: LOG.info('Deleting %s ports on network %s' % (data['port'], data['network'])) api.quantum_delete_port(request, data['network'], data['port']) except Exception, e: messages.error( request, _('Unable to delete port %(port)s: %(msg)s') % { "port": data['port'], "msg": e.message }) else:
class DeleteGroup(forms.SelfHandlingForm): tenant_id = forms.CharField(widget=forms.HiddenInput()) security_group_id = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: LOG.info('Delete security_group: "%s"' % data) security_group = api.security_group_delete( request, data['security_group_id']) messages.info(request, 'Successfully deleted security_group: %s' \ % data['security_group_id']) except novaclient_exceptions.ClientException, e: LOG.error("ClientException in DeleteGroup", exc_info=True) messages.error(request, 'Error deleting security group: %s' % e.message) return shortcuts.redirect('dash_security_groups', data['tenant_id'])
class AttachPort(forms.SelfHandlingForm): network = forms.CharField(widget=forms.HiddenInput()) port = forms.CharField(widget=forms.HiddenInput()) vif_id = forms.CharField(widget=forms.Select(), label="Select VIF to connect") def handle(self, request, data): try: LOG.info('Attaching %s port to VIF %s' % (data['port'], data['vif_id'])) body = {'attachment': {'id': '%s' % data['vif_id']}} api.quantum_attach_port(request, data['network'], data['port'], body) except Exception, e: messages.error(request, 'Unable to attach port %s to VIF %s: %s' % (data['port'], data['vif_id'], e.message,)) else:
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 ContainerAclRemove(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField(widget=forms.HiddenInput()) acl_type = forms.CharField(widget=forms.HiddenInput()) acl_value = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): super(ContainerAclRemove, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] container_name = data['container_name'] acl_type = data['acl_type'] acl_value = data['acl_value'] if acl_type == "read": type = 'X-Container-Read' elif acl_type == "write": type = 'X-Container-Write' else: pass # clean and parse acl try: acl = clean_acl(type, acl_value) refs, groups = parse_acl(acl) except ValueError, e: messages.error(request, 'ACL value is invalid %s' % str(e)) return if header in groups: groups.remove(header) if header in refs: refs.remove(header) # re-calcurate referer string refs = map(lambda x: '.r:%s' % x, refs) # set header hdrs = {} hdrs[type] = ','.join(groups + refs) api.swift_set_container_info(request, container_name, hdrs) return shortcuts.redirect(request.build_absolute_uri())
class DeleteRule(forms.SelfHandlingForm): security_group_rule_id = forms.CharField(widget=forms.HiddenInput()) tenant_id = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): security_group_rule_id = data['security_group_rule_id'] tenant_id = data['tenant_id'] try: LOG.info('Delete security_group_rule: "%s"' % data) security_group = api.security_group_rule_delete( request, security_group_rule_id) messages.info(request, 'Successfully deleted rule: %s' \ % security_group_rule_id) except novaclient_exceptions.ClientException, e: LOG.error("ClientException in DeleteRule", exc_info=True) messages.error(request, 'Error authorizing security group: %s' % e.message) return shortcuts.redirect(request.build_absolute_uri())
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))
class UploadObject(forms.SelfHandlingForm): name = forms.CharField(max_length="255", label=_("Object Name")) object_file = forms.FileField(label=_("File")) container_name = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): api.swift_upload_object(request, data['container_name'], data['name'], self.files['object_file'].read()) messages.success(request, _("Object was successfully uploaded.")) return shortcuts.redirect(request.build_absolute_uri())
class ContainerMetaRemove(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField(widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): super(ContainerMetaRemove, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] container_name = data['container_name'] if not header.lower().startswith('x-container-meta'): messages.error( request, "Container metadata must begin with x-container-meta-") else: hdrs = {} hdrs[header] = '' api.swift_set_container_info(request, container_name, hdrs) return shortcuts.redirect(request.build_absolute_uri())
class ObjectMeta(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) object_name = forms.CharField(widget=forms.HiddenInput()) header_name = forms.CharField(max_length="128", label="Name") header_value = forms.CharField(max_length="256", label="Value") def __init__(self, *args, **kwargs): super(ObjectMeta, self).__init__(*args, **kwargs) def handle(self, request, data): header = data['header_name'] value = data['header_value'] container_name = data['container_name'] object_name = data['object_name'] try: header.encode('ascii') value.encode('ascii') except UnicodeEncodeError, e: messages.error( request, "Object metadata contains non-ASCII character %s" % str(e)) return None if not header.lower().startswith('x-object-meta-'): messages.error(request, 'Object metadata must begin with x-object-meta-') return None hdrs = {} hdrs[header[14:]] = value try: api.swift_set_object_info(request, container_name, object_name, hdrs, request.session.get('storage_url', None)) except ResponseError, e: messages.error(request, 'Unable to set object metadata : %s' % str(e))
class DeleteContainer(forms.SelfHandlingForm): container_name = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: api.swift_delete_container(request, data['container_name']) except ContainerNotEmpty, e: messages.error(request, 'Unable to delete non-empty container: %s' % \ data['container_name']) LOG.exception('Unable to delete container "%s". Exception: "%s"' % (data['container_name'], str(e))) else:
class DeleteKeypair(forms.SelfHandlingForm): keypair_id = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: LOG.info('Deleting keypair "%s"' % data['keypair_id']) api.keypair_delete(request, data['keypair_id']) messages.info(request, 'Successfully deleted keypair: %s' \ % data['keypair_id']) except novaclient_exceptions.ClientException, e: LOG.exception("ClientException in DeleteKeypair") messages.error(request, 'Error deleting keypair: %s' % e.message) return redirect(request.build_absolute_uri())
class DownloadObject(forms.SelfHandlingForm): object_name = forms.CharField(widget=forms.HiddenInput()) container_name = forms.CharField(widget=forms.HiddenInput()) content_type = forms.CharField(widget=forms.HiddenInput()) def handle(self, request, data): try: container_name = data['container_name'] object_name = data['object_name'] content_type = data['content_type'] object_data = api.swift_get_object_data( request, container_name, object_name, request.session.get('storage_url', None)) response = http.HttpResponse() response['Content-Disposition'] = 'attachment; filename=%s' % \ object_name.encode('utf-8') response['Content-Type'] = content_type for data in object_data: response.write(data) return response except NoSuchObject, e: messages.error(request, 'Error occurs in downloading object %s' % str(e))