class SetAccessControlsAction(workflows.Action): keypair = forms.ThemableDynamicChoiceField( label=_("Key Pair"), help_text=_("Key pair to use for " "authentication."), add_item_link=KEYPAIR_IMPORT_URL) admin_pass = forms.RegexField( label=_("Admin Password"), required=False, widget=forms.PasswordInput(render_value=False), regex=validators.password_validator(), error_messages={'invalid': validators.password_validator_msg()}) confirm_admin_pass = forms.CharField( label=_("Confirm Admin Password"), required=False, widget=forms.PasswordInput(render_value=False)) groups = forms.MultipleChoiceField( label=_("Security Groups"), required=False, initial=["default"], widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Launch instance in these " "security groups.")) class Meta(object): name = _("Access & Security") help_text = _("Control access to your instance via key pairs, " "security groups, and other mechanisms.") def __init__(self, request, *args, **kwargs): super(SetAccessControlsAction, self).__init__(request, *args, **kwargs) if not api.nova.can_set_server_password(): del self.fields['admin_pass'] del self.fields['confirm_admin_pass'] self.fields['keypair'].required = api.nova.requires_keypair() def populate_keypair_choices(self, request, context): keypairs = instance_utils.keypair_field_data(request, True) if len(keypairs) == 2: self.fields['keypair'].initial = keypairs[1][0] return keypairs def populate_groups_choices(self, request, context): try: groups = api.neutron.security_group_list(request) security_group_list = [(sg.id, sg.name) for sg in groups] except Exception: exceptions.handle(request, _('Unable to retrieve list of security groups')) security_group_list = [] return security_group_list def clean(self): '''Check to make sure password fields match.''' cleaned_data = super(SetAccessControlsAction, self).clean() if 'admin_pass' in cleaned_data: if cleaned_data['admin_pass'] != cleaned_data.get( 'confirm_admin_pass', None): raise forms.ValidationError(_('Passwords do not match.')) return cleaned_data
class SetNetworkAction(workflows.Action): network = forms.MultipleChoiceField( label=_("Networks"), widget=forms.ThemableCheckboxSelectMultiple(), error_messages={ 'required': _( "At least one network must" " be specified.")}, help_text=_("Launch instance with" " these networks")) def __init__(self, request, *args, **kwargs): super(SetNetworkAction, self).__init__(request, *args, **kwargs) # NOTE(e0ne): we don't need 'required attribute for networks # checkboxes to be able to select only one network # NOTE(e0ne): we need it for compatibility with different # Django versions (prior to 1.11) self.use_required_attribute = False network_list = self.fields["network"].choices if len(network_list) == 1: self.fields['network'].initial = [network_list[0][0]] class Meta(object): name = _("Networking") permissions = ('openstack.services.network',) help_text = _("Select networks for your instance.") def populate_network_choices(self, request, context): return instance_utils.network_field_data(request)
class SelectRulesAction(workflows.Action): rule = forms.MultipleChoiceField( label=_("Rules"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Create a policy with selected rules.")) class Meta(object): name = _("Rules") permissions = ('openstack.services.network', ) help_text = _("Select rules for your policy.") def populate_rule_choices(self, request, context): try: tenant_id = self.request.user.tenant_id rules = api.fwaas.rule_list_for_tenant(request, tenant_id) rules = sorted(rules, key=lambda rule: rule.name_or_id) rule_list = [(rule.id, rule.name_or_id) for rule in rules if not rule.firewall_policy_id] except Exception as e: rule_list = [] exceptions.handle( request, _('Unable to retrieve rules (%(error)s).') % {'error': str(e)}) return rule_list
class SelectRoutersAction(workflows.Action): router = forms.MultipleChoiceField( label=_("Routers"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Create a firewall with selected routers.")) class Meta(object): name = _("Routers") permissions = ('openstack.services.network', ) help_text = _("Select routers for your firewall.") def populate_router_choices(self, request, context): try: tenant_id = self.request.user.tenant_id routers_list = api.fwaas.firewall_unassociated_routers_list( request, tenant_id) except Exception as e: routers_list = [] exceptions.handle( request, _('Unable to retrieve routers (%(error)s).') % {'error': str(e)}) routers_list = [(router.id, router.name_or_id) for router in routers_list] return routers_list
class SetNetworkAction(workflows.Action): network = forms.MultipleChoiceField( label=_("Networks"), widget=forms.ThemableCheckboxSelectMultiple(), error_messages={ 'required': _("At least one network must be " "specified.") }, help_text=_("Launch instance with these networks")) def __init__(self, request, *args, **kwargs): super().__init__(request, *args, **kwargs) self.use_required_attribute = False network_list = self.fields["network"].choices if len(network_list) == 1: self.fields['network'].initial = [network_list[0][0]] class Meta(object): name = _("Networking") permissions = ('openstack.services.network', ) help_text = _("Select networks for your instance.") def populate_network_choices(self, request, context): return instance_utils.network_field_data(request, for_launch=True)
def __init__(self, request, *args, **kwargs): super(EditTypeAccessForm, self).__init__(request, *args, **kwargs) err_msg = _('Unable to retrieve volume type access list.') self.fields["member"] = forms.MultipleChoiceField( required=False, widget=forms.ThemableCheckboxSelectMultiple()) # Get list of available projects. try: all_projects, has_more = keystone.tenant_list(request) except Exception: exceptions.handle(request, err_msg) projects_list = [(project.id, project.name) for project in all_projects] self.fields["member"].choices = projects_list volume_type_id = self.initial.get('volume_type_id') volume_type_access = [] try: if volume_type_id: volume_type = cinder.volume_type_get(request, volume_type_id) if not volume_type.is_public: volume_type_access = [ project.project_id for project in cinder.volume_type_access_list( request, volume_type_id) ] except Exception: exceptions.handle(request, err_msg) self.fields["member"].initial = volume_type_access
class RemoveRouterFromFirewall(RouterInsertionFormBase): router_ids = forms.MultipleChoiceField( label=_("Associated Routers"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Unselect the router(s) to be removed from firewall.")) failure_url = 'horizon:project:firewalls:index' success_msg = _('Router(s) was successfully removed from firewall ' '%(firewall)s.') failure_msg = _('Failed to remove router(s) from firewall %(name)s: ' '%(reason)s') init_failure_msg = _('Failed to retrieve current routers in firewall ' '%(name)s: %(reason)s') def get_router_choices(self, request, kwargs): tenant_id = self.request.user.tenant_id all_routers = api.neutron.router_list(request, tenant_id=tenant_id) current_routers = [ r for r in all_routers if r['id'] in kwargs['initial']['router_ids'] ] return [(r.id, r.name_or_id) for r in current_routers] def get_new_router_ids(self, context): # context[router_ids] is router IDs to be kept. return context['router_ids']
class AddRouterToFirewall(forms.SelfHandlingForm): router_ids = forms.MultipleChoiceField( label=_("Add Routers"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Add selected router(s) to the firewall.")) failure_url = 'horizon:project:firewalls:index' def __init__(self, request, *args, **kwargs): super(AddRouterToFirewall, self).__init__(request, *args, **kwargs) try: router_choices = self.get_router_choices(request, kwargs) self.fields['router_ids'].choices = router_choices except Exception as e: LOG.error('Failed to retrieve available routers: %s', e) msg = _('Failed to retrieve available routers: %s') % e redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) def get_router_choices(self, request, kwargs): tenant_id = self.request.user.tenant_id routers_list = api.fwaas.firewall_unassociated_routers_list( request, tenant_id) return [(r.id, r.name_or_id) for r in routers_list] def get_new_router_ids(self, context): existing_router_ids = self.initial['router_ids'] add_router_ids = context['router_ids'] return add_router_ids + existing_router_ids def handle(self, request, context): firewall_id = self.initial['firewall_id'] firewall_name_or_id = self.initial['name'] or firewall_id try: body = {'router_ids': self.get_new_router_ids(context)} firewall = api.fwaas.firewall_update(request, firewall_id, **body) msg = (_('Router(s) was/were successfully added to firewall ' '%(firewall)s.') % { 'firewall': firewall_name_or_id }) messages.success(request, msg) return firewall except Exception as e: LOG.error('Failed to add router(s) to firewall %(id)s: %(reason)s', { 'id': firewall_id, 'reason': e }) msg = (_('Failed to add router(s) to firewall %(name)s: ' '%(reason)s') % { 'name': firewall_name_or_id, 'reason': e }) redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect)
class SetNetworkAction(workflows.Action): network = forms.MultipleChoiceField( label=_("Networks"), widget=forms.ThemableCheckboxSelectMultiple(), error_messages={ 'required': _("At least one network must" " be specified.") }, help_text=_("Launch instance with" " these networks")) if api.neutron.is_port_profiles_supported(): widget = None else: widget = forms.HiddenInput() profile = forms.ChoiceField(label=_("Policy Profiles"), required=False, widget=widget, help_text=_("Launch instance with " "this policy profile")) def __init__(self, request, *args, **kwargs): super(SetNetworkAction, self).__init__(request, *args, **kwargs) network_list = self.fields["network"].choices if len(network_list) == 1: self.fields['network'].initial = [network_list[0][0]] if api.neutron.is_port_profiles_supported(): self.fields['profile'].choices = ( self.get_policy_profile_choices(request)) class Meta(object): name = _("Networking") permissions = ('openstack.services.network', ) help_text = _("Select networks for your instance.") def populate_network_choices(self, request, context): return instance_utils.network_field_data(request) def get_policy_profile_choices(self, request): profile_choices = [('', _("Select a profile"))] for profile in self._get_profiles(request, 'policy'): profile_choices.append((profile.id, profile.name)) return profile_choices def _get_profiles(self, request, type_p): profiles = [] try: profiles = api.neutron.profile_list(request, type_p) except Exception: msg = _('Network Profiles could not be retrieved.') exceptions.handle(request, msg) return profiles
class SetNetworkAction(workflows.Action): VIF_MODEL_CHOICES = [ ('avp', _("Accelerated Virtual Port (avp)")), ('e1000', _("Intel e1000 Emulation (e1000)")), ('ne2k_pci', _("NE2000 Emulation (ne2k_pci)")), ('pcnet', _("AMD PCnet/PCI Emulation (pcnet)")), ('rtl8139', _("Realtek 8139 Emulation (rtl8139)")), ('virtio', _("VirtIO Network (virtio)")), ('pci-passthrough', _("PCI Passthrough device")), ('pci-sriov', _("PCI SR-IOV device")), ('', _("from image")), ] network = forms.MultipleChoiceField( label=_("Networks"), widget=forms.ThemableCheckboxSelectMultiple(), error_messages={ 'required': _("At least one network must" " be specified.") }, help_text=_("Launch instance with" " these networks")) def __init__(self, request, *args, **kwargs): super(SetNetworkAction, self).__init__(request, *args, **kwargs) tenant_id = self.request.user.tenant_id networks = api.neutron.network_list_for_tenant(request, tenant_id) for network in networks: self.fields['vif_model_' + network.id] =\ forms.ChoiceField(required=False, initial='virtio', choices=self.VIF_MODEL_CHOICES) class Meta(object): name = _("Networking") permissions = ('openstack.services.network', ) help_text = _("Select networks for your instance.") def populate_network_choices(self, request, context): network_list = [] try: tenant_id = self.request.user.tenant_id networks = api.neutron.network_list_for_tenant(request, tenant_id) for n in networks: n.set_id_as_name_if_empty() network_list.append((n.id, n.name)) sorted(network_list, key=lambda obj: obj[1]) except Exception: exceptions.handle(request, _('Unable to retrieve networks.')) return network_list
class AddFWGPortsAction(workflows.Action): port = forms.MultipleChoiceField( label=_("Ports"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Create a Firewall Group with selected ports.")) class Meta(object): name = _("Ports") permissions = ('openstack.services.network', ) help_text = _("Select ports for your firewall group.") def populate_port_choices(self, request, context): try: tenant_id = self.request.user.tenant_id ports = api_fwaas_v2.fwg_port_list_for_tenant(request, tenant_id) ports = sorted(ports, key=attrgetter('name_or_id')) port_list = [(port.id, port.name_or_id) for port in ports] except Exception as e: port_list = [] exceptions.handle(request, _('Unable to retrieve ports (%s).') % e) return port_list
class AddRouterToFirewall(RouterInsertionFormBase): router_ids = forms.MultipleChoiceField( label=_("Add Routers"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Add selected router(s) to the firewall.")) failure_url = 'horizon:project:firewalls:index' success_msg = _('Router(s) was/were successfully added to firewall ' '%(firewall)s.') failure_msg = _('Failed to add router(s) to firewall %(name)s: %(reason)s') init_failure_msg = _('Failed to retrieve available routers: %(reason)s') def get_router_choices(self, request, kwargs): tenant_id = self.request.user.tenant_id routers_list = api.fwaas.firewall_unassociated_routers_list( request, tenant_id) return [(r.id, r.name_or_id) for r in routers_list] def get_new_router_ids(self, context): existing_router_ids = self.initial['router_ids'] add_router_ids = context['router_ids'] return add_router_ids + existing_router_ids
class RemoveRouterFromFirewall(forms.SelfHandlingForm): router_ids = forms.MultipleChoiceField( label=_("Associated Routers"), required=False, widget=forms.ThemableCheckboxSelectMultiple(), help_text=_("Unselect the router(s) to be removed from firewall.")) failure_url = 'horizon:project:firewalls:index' def __init__(self, request, *args, **kwargs): super(RemoveRouterFromFirewall, self).__init__(request, *args, **kwargs) try: router_choices = self.get_router_choices(request, kwargs) self.fields['router_ids'].choices = router_choices except Exception as e: LOG.error( 'Failed to retrieve current routers in firewall %(id)s: ' '%(reason)s', { 'id': self.initial['firewall_id'], 'reason': e }) msg = (_('Failed to retrieve current routers in firewall ' '%(name)s: %(reason)s') % { 'name': self.initial['name'], 'reason': e }) redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) def get_router_choices(self, request, kwargs): tenant_id = self.request.user.tenant_id all_routers = api.neutron.router_list(request, tenant_id=tenant_id) current_routers = [ r for r in all_routers if r['id'] in kwargs['initial']['router_ids'] ] return [(r.id, r.name_or_id) for r in current_routers] def get_new_router_ids(self, context): # context[router_ids] is router IDs to be kept. return context['router_ids'] def handle(self, request, context): firewall_id = self.initial['firewall_id'] firewall_name_or_id = self.initial['name'] or firewall_id try: body = {'router_ids': self.get_new_router_ids(context)} firewall = api.fwaas.firewall_update(request, firewall_id, **body) msg = (_('Router(s) was successfully removed from firewall ' '%(firewall)s.') % { 'firewall': firewall_name_or_id }) messages.success(request, msg) return firewall except Exception as e: LOG.error( 'Failed to remove router(s) from firewall %(id)s: ' '%(reason)s', { 'id': firewall_id, 'reason': e }) msg = (_('Failed to remove router(s) from firewall %(name)s: ' '%(reason)s') % { 'name': firewall_name_or_id, 'reason': e }) redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect)
class SetNetworkAction(workflows.Action): network = forms.MultipleChoiceField( label=_("Networks"), widget=forms.ThemableCheckboxSelectMultiple(), error_messages={ 'required': _("At least one network must" " be specified.") }, help_text=_("Update instance with" " these networks")) if api.neutron.is_port_profiles_supported(): widget = None else: widget = forms.HiddenInput() profile = forms.ChoiceField(label=_("Policy Profiles"), required=False, widget=widget, help_text=_("Update instance with " "this policy profile")) def __init__(self, request, *args, **kwargs): super(SetNetworkAction, self).__init__(request, *args, **kwargs) LOG.info("args ===============================%s" % args) network_list = self.fields["network"].choices if len(network_list) == 1: self.fields['network'].initial = [network_list[0][0]] if api.neutron.is_port_profiles_supported(): self.fields['profile'].choices = ( self.get_policy_profile_choices(request)) class Meta(object): name = _("Networking") permissions = ('openstack.services.network', ) help_text = _("Select networks for your instance.") def populate_network_choices(self, request, context): return instance_utils.network_field_data(request) def get_policy_profile_choices(self, request): profile_choices = [('', _("Select a profile"))] for profile in self._get_profiles(request, 'policy'): profile_choices.append((profile.id, profile.name)) return profile_choices def _get_profiles(self, request, type_p): profiles = [] try: profiles = api.neutron.profile_list(request, type_p) except Exception: msg = _('Network Profiles could not be retrieved.') exceptions.handle(request, msg) return profiles def handle(self, request, context): instance_id = context.get('instance_id', '') netids = context.get('network_id', None) #net_ids = [] #port_ids = [] nets = [] interfaces = api.nova.interface_list(request, instance_id) avi_nets = [] try: for interface in interfaces: port_id = getattr(interface, 'port_id') net_id = getattr(interface, 'net_id') nets.append((net_id, port_id)) if net_id not in netids: api.nova.interface_detach(request, instance_id, port_id=port_id) else: avi_nets.append(net_id) for net in netids: if net not in avi_nets: api.nova.interfaces_attach(request, instance_id, port_id=None, net_id=net, fixed_ip=None) except Exception: msg = _('Network update error.') exceptions.handle(request, msg)