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)
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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)
Esempio n. 6
0
    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
Esempio n. 7
0
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']
Esempio n. 8
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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
Esempio n. 12
0
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
Esempio n. 13
0
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)
Esempio n. 14
0
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)