def update_sc_instance_attributes(request, scinstance):
    ptg_url = "horizon:project:policytargets:policy_targetdetails"
    clsurl = "horizon:project:application_policy:policyclassifierdetails"
    scspec_url = "horizon:project:network_services:sc_spec_details"
    consumer_ptg = scinstance.consumer_ptg_id
    provider_ptg = scinstance.provider_ptg_id
    scspec = scinstance.servicechain_specs
    classifier = scinstance.classifier_id
    if consumer_ptg is not None and consumer_ptg != "N/A":
        ptg = client.policy_target_get(request, consumer_ptg)
        u = reverse(ptg_url, kwargs={'policy_target_id': ptg.id})
        atag = "<a href='%s'>%s</a>" % (u, ptg.name)
        setattr(scinstance, 'consumer_ptg', mark_safe(atag))
    if provider_ptg is not None:
        ptg = client.policy_target_get(request, provider_ptg)
        u = reverse(ptg_url, kwargs={'policy_target_id': ptg.id})
        atag = "<a href='%s'>%s</a>" % (u, ptg.name)
        setattr(scinstance, 'provider_ptg', mark_safe(atag))
    if classifier is not None:
        cls = client.policyclassifier_get(request, classifier)
        u = reverse(clsurl, kwargs={'policyclassifier_id': cls.id})
        atag = "<a href='%s'>%s</a>" % (u, cls.name)
        setattr(scinstance, 'classifier', mark_safe(atag))
    if scspec is not None:
        scs = client.get_servicechain_spec(request, scspec[0])
        url = reverse(scspec_url, kwargs={'scspec_id': scs.id})
        atag = "<a href='%s'>%s</a>" % (url, scs.name)
        setattr(scinstance, 'servicechain_spec', mark_safe(atag))
        scni = update_scn_instance_attributes(request, scs)
        setattr(scinstance, 'servicechain', scni.chain)
    return scinstance
def update_sc_instance_attributes(request, scinstance):
    ptg_url = "horizon:project:policytargets:policy_targetdetails"
    clsurl = "horizon:project:application_policy:policyclassifierdetails"
    scspec_url = "horizon:project:network_services:sc_spec_details"
    consumer_ptg = scinstance.consumer_ptg
    provider_ptg = scinstance.provider_ptg
    scspec = scinstance.servicechain_spec
    classifier = scinstance.classifier
    if consumer_ptg is not None:
        ptg = client.policy_target_get(request, consumer_ptg)
        u = reverse(ptg_url, kwargs={'policy_target_id': ptg.id})
        atag = "<a href='%s'>%s</a>" % (u, ptg.name)
        setattr(scinstance, 'consumer_ptg', mark_safe(atag))
    if provider_ptg is not None:
        ptg = client.policy_target_get(request, consumer_ptg)
        u = reverse(ptg_url, kwargs={'policy_target_id': ptg.id})
        atag = "<a href='%s'>%s</a>" % (u, ptg.name)
        setattr(scinstance, 'provider_ptg', mark_safe(atag))
    if classifier is not None:
        cls = client.policyclassifier_get(request, classifier)
        u = reverse(clsurl, kwargs={'policyclassifier_id': cls.id})
        atag = "<a href='%s'>%s</a>" % (u, cls.name)
        setattr(scinstance, 'classifier', mark_safe(atag))
    if scspec is not None:
        sc = client.get_servicechain_spec(request, scspec)
        u = reverse(scspec_url, kwargs={'scspec_id': sc.id})
        atag = "<a href='%s'>%s</a>" % (u, sc.name)
        setattr(scinstance, 'servicechain_spec', mark_safe(atag))
    return scinstance
예제 #3
0
    def create_ports(request, instance_name):
        nics = []
        pts = []

        for policy_target_id in request.DATA["group_policy_targets"]:
            policy_target = client.policy_target_get(request,
                                                     policy_target_id['id'])

            args = {
                'policy_target_group_id': policy_target.id,
                'name': instance_name[:41] + "_gbpui"
            }

            for subnet_id in policy_target.subnets:
                subnet = api.neutron.subnet_get(request, subnet_id)

                if 'fixed_ip' in policy_target_id and IPAddress(
                        policy_target_id['fixed_ip']) in \
                        IPNetwork(subnet['cidr']):
                    args['fixed_ips'] = [{
                        'subnet_id':
                        subnet['id'],
                        'ip_address':
                        policy_target_id['fixed_ip']
                    }]

            port = client.pt_create(request, **args)

            nics.append({'port-id': port.port_id})
            pts.append(port.id)

        meta_data = {'pts': ','.join(pts)}

        return meta_data, nics
예제 #4
0
 def handle(self, request, context):
     policy_target_id = self.initial['policy_target_id']
     url = reverse("horizon:project:policytargets:policy_targetdetails",
                   kwargs={'policy_target_id': policy_target_id})
     try:
         policy_target = client.policy_target_get(request, policy_target_id)
         for policy_rule_set in policy_target.get(
                 "consumed_policy_rule_sets"):
             context['policy_rule_set'].append(policy_rule_set)
         consumed = dict([(item, 'string')
                          for item in context['policy_rule_set']])
         client.policy_target_update(request,
                                     policy_target_id,
                                     consumed_policy_rule_sets=consumed)
         msg = _('Policy Rule Set Added successfully!')
         messages.success(request, msg)
         LOG.debug(msg)
         return http.HttpResponseRedirect(url)
     except Exception:
         msg = _('Failed to add policy_rule_set!')
         u = "horizon:project:policytargets:policy_targetdetails"
         redirect = reverse(u,
                            kwargs={'policy_target_id': policy_target_id})
         LOG.error(msg)
         exceptions.handle(request, msg, redirect=redirect)
예제 #5
0
    def create_ports(request, instance_name):
        nics = []
        pts = []

        for policy_target_id in request.DATA["group_policy_targets"]:
            policy_target = client.policy_target_get(request,
                                                     policy_target_id['id'])

            args = {
                'policy_target_group_id': policy_target.id,
                'name': instance_name[:41] + "_gbpui"
            }

            for subnet_id in policy_target.subnets:
                subnet = api.neutron.subnet_get(request, subnet_id)

                if 'fixed_ip' in policy_target_id and IPAddress(
                        policy_target_id['fixed_ip']) in \
                        IPNetwork(subnet['cidr']):
                    args['fixed_ips'] = [{
                        'subnet_id': subnet['id'],
                        'ip_address': policy_target_id['fixed_ip']
                    }]

            port = client.pt_create(request, **args)

            nics.append({
                'port-id': port.port_id
            })
            pts.append(port.id)

        meta_data = {'pts': ','.join(pts)}

        return meta_data, nics
예제 #6
0
 def handle(self, request, context):
     policy_target_id = self.initial['policy_target_id']
     url = reverse("horizon:project:policytargets:policy_targetdetails",
                   kwargs={'policy_target_id': policy_target_id})
     try:
         policy_target = client.policy_target_get(request, policy_target_id)
         old_policy_rule_sets = policy_target.get(
             "provided_policy_rule_sets")
         for policy_rule_set in context['policy_rule_set']:
             old_policy_rule_sets.remove(policy_rule_set)
         policy_rule_sets = dict([(item, 'string')
                                  for item in old_policy_rule_sets])
         client.policy_target_update(
             request, policy_target_id,
             provided_policy_rule_sets=policy_rule_sets)
         msg = _('Policy Rule Set removed successfully!')
         messages.success(request, msg)
         LOG.debug(msg)
         return http.HttpResponseRedirect(url)
     except Exception:
         msg = _('Failed to remove policy_rule_set!')
         u = "horizon:project:policytargets:policy_targetdetails"
         redirect = reverse(u,
                            kwargs={'policy_target_id': policy_target_id})
         LOG.error(msg)
         exceptions.handle(request, msg, redirect=redirect)
예제 #7
0
 def __init__(self, request, *args, **kwargs):
     super(SetGroupAction, self).__init__(request, *args, **kwargs)
     policy_targetid = self.request.path.split("/")[-2]
     ptg = client.policy_target_get(request, policy_targetid)
     for choice in self.fields['network'].choices:
         if choice[0].startswith(ptg.id):
             initial_value = choice[0]
             break
     self.fields['network'].initial = [initial_value]
예제 #8
0
 def get_context_data(self, **kwargs):
     context = super(PTGDetailsView, self).get_context_data(**kwargs)
     try:
         policy_target = client.policy_target_get(
             self.request, context['policy_target_id'])
         context['policy_target'] = policy_target
     except Exception:
         pass
     return context
예제 #9
0
 def __init__(self, request, *args, **kwargs):
     super(SetGroupAction, self).__init__(request, *args, **kwargs)
     policy_targetid = self.request.path.split("/")[-2]
     ptg = client.policy_target_get(request, policy_targetid)
     for choice in self.fields['network'].choices:
         if choice[0].startswith(ptg.id):
             initial_value = choice[0]
             break
     self.fields['network'].initial = [initial_value]
예제 #10
0
 def get_context_data(self, **kwargs):
     context = super(PTGDetailsView, self).get_context_data(**kwargs)
     try:
         policy_target = client.policy_target_get(
             self.request, context['policy_target_id'])
         context['policy_target'] = policy_target
     except Exception:
         pass
     return context
예제 #11
0
 def get_context_data(self, request):
     policy_targetid = self.tab_group.kwargs["policy_target_id"]
     try:
         policy_target = client.policy_target_get(request, policy_targetid)
         l3list = client.l3policy_list(request)
         l2list = client.l2policy_list(request)
         l2list = [item for item in l2list if item.id == policy_target.l2_policy_id]
     except Exception:
         exceptions.handle(request, _("Unable to retrieve group details."), redirect=self.failure_url)
     return {"policy_target": policy_target, "l3list": l3list, "l2list": l2list}
예제 #12
0
 def _get_object(self, *args, **kwargs):
     policy_target_id = self.kwargs['policy_target_id']
     try:
         policy_target = client.policy_target_get(
             self.request, policy_target_id)
         policy_target.set_id_as_name_if_empty()
         return policy_target
     except Exception:
         redirect = self.success_url
         msg = _('Unable to retrieve policy_target details.')
         exceptions.handle(self.request, msg, redirect=redirect)
예제 #13
0
 def _get_object(self, *args, **kwargs):
     policy_target_id = self.kwargs['policy_target_id']
     try:
         policy_target = client.policy_target_get(
             self.request, policy_target_id)
         policy_target.set_id_as_name_if_empty()
         return policy_target
     except Exception:
         redirect = self.success_url
         msg = _('Unable to retrieve policy_target details.')
         exceptions.handle(self.request, msg, redirect=redirect)
예제 #14
0
 def get_context_data(self, request):
     l2policy_id = self.tab_group.kwargs['l2policy_id']
     try:
         l2policy = client.l2policy_get(request, l2policy_id)
         ptgs = []
         for item in l2policy.policy_target_groups:
             ptgs.append(client.policy_target_get(request, item))
         setattr(l2policy, 'ptgs', ptgs)
     except Exception:
         exceptions.handle(request,
                           _('Unable to retrieve l2 policy details.'),
                           redirect=self.failure_url)
     return {'l2policy': l2policy}
예제 #15
0
 def get_context_data(self, request):
     l2policy_id = self.tab_group.kwargs['l2policy_id']
     try:
         l2policy = client.l2policy_get(request, l2policy_id)
         ptgs = []
         for item in l2policy.policy_target_groups:
             ptgs.append(client.policy_target_get(request, item))
         setattr(l2policy, 'ptgs', ptgs)
     except Exception:
         exceptions.handle(
             request, _('Unable to retrieve l2 policy details.'),
             redirect=self.failure_url)
     return {'l2policy': l2policy}
예제 #16
0
 def __init__(self, request, *args, **kwargs):
     super(RemoveConsumedPRSForm, self).__init__(request, *args, **kwargs)
     policy_rule_sets = []
     try:
         policy_target_id = kwargs['initial']['policy_target_id']
         policy_target = client.policy_target_get(request, policy_target_id)
         consumedpolicy_rule_sets = policy_target.get(
             "consumed_policy_rule_sets")
         items = client.policy_rule_set_list(request)
         policy_rule_sets = [(p.id, p.name)
                             for p in items if p.id
                             in consumedpolicy_rule_sets]
     except Exception:
         pass
     self.fields['policy_rule_set'].choices = policy_rule_sets
예제 #17
0
 def __init__(self, request, *args, **kwargs):
     super(RemoveConsumedPRSForm, self).__init__(request, *args, **kwargs)
     policy_rule_sets = []
     try:
         policy_target_id = kwargs['initial']['policy_target_id']
         policy_target = client.policy_target_get(request, policy_target_id)
         consumedpolicy_rule_sets = policy_target.get(
             "consumed_policy_rule_sets")
         items = client.policy_rule_set_list(
             request, tenant_id=request.user.tenant_id)
         policy_rule_sets = [(p.id, p.name) for p in items
                             if p.id in consumedpolicy_rule_sets]
     except Exception:
         pass
     self.fields['policy_rule_set'].choices = policy_rule_sets
예제 #18
0
 def __init__(self, request, *args, **kwargs):
     super(RemoveProvidedPRSForm, self).__init__(request, *args, **kwargs)
     policy_rule_sets = []
     try:
         policy_target_id = kwargs['initial']['policy_target_id']
         policy_target = client.policy_target_get(request, policy_target_id)
         providedpolicy_rule_sets = policy_target.get(
             "provided_policy_rule_sets")
         items = client.policy_rule_set_list(
             request, tenant_id=request.user.tenant_id)
         policy_rule_sets = [(p.id, p.name) for p in items
                             if p.id in providedpolicy_rule_sets]
     except Exception as e:
         msg = _('Unable to retrieve policy rule set list.') % (str(e))
         LOG.debug(msg)
     self.fields['policy_rule_set'].choices = policy_rule_sets
예제 #19
0
 def __init__(self, request, *args, **kwargs):
     super(RemoveProvidedPRSForm, self).__init__(request, *args, **kwargs)
     policy_rule_sets = []
     try:
         policy_target_id = kwargs['initial']['policy_target_id']
         policy_target = client.policy_target_get(request, policy_target_id)
         providedpolicy_rule_sets = policy_target.get(
             "provided_policy_rule_sets")
         items = client.policy_rule_set_list(request)
         policy_rule_sets = [(p.id, p.name)
                             for p in items if p.id in
                             providedpolicy_rule_sets]
     except Exception as e:
         msg = _('Unable to retrieve policy rule set list.') % (str(e))
         LOG.debug(msg)
     self.fields['policy_rule_set'].choices = policy_rule_sets
예제 #20
0
 def get_provided_policy_rule_sets_data(self):
     try:
         policy_targetid = self.tab_group.kwargs["policy_target_id"]
         policy_target = client.policy_target_get(self.request, policy_targetid)
         provided_policy_rule_set_ids = policy_target.get("provided_policy_rule_sets")
         provided_policy_rule_sets = []
         for _id in provided_policy_rule_set_ids:
             provided_policy_rule_sets.append(client.policy_rule_set_get(self.request, _id))
         provided_policy_rule_sets = [
             gfilters.update_pruleset_attributes(self.request, item) for item in provided_policy_rule_sets
         ]
         return provided_policy_rule_sets
     except Exception:
         error_message = _("Unable to get provided rule sets")
         exceptions.handle(self.request, error_message)
         return []
예제 #21
0
 def get_context_data(self, request):
     policy_targetid = self.tab_group.kwargs['policy_target_id']
     try:
         policy_target = client.policy_target_get(request, policy_targetid)
         l3list = client.l3policy_list(request)
         l2list = client.l2policy_list(request)
         l2list = [
             item for item in l2list
             if item.id == policy_target.l2_policy_id]
     except Exception:
         exceptions.handle(
             request, _('Unable to retrieve group details.'),
             redirect=self.failure_url)
     return {'policy_target': policy_target,
             'l3list': l3list,
             'l2list': l2list}
예제 #22
0
 def __init__(self, request, *args, **kwargs):
     super(UpdatePolicyTargetForm, self).__init__(request, *args, **kwargs)
     try:
         policy_target_id = self.initial['policy_target_id']
         policy_target = client.policy_target_get(request, policy_target_id)
         policy_rule_sets = client.policy_rule_set_list(request,
             tenant_id=request.user.tenant_id)
         for c in policy_rule_sets:
             c.set_id_as_name_if_empty()
         policy_rule_sets = sorted(
             policy_rule_sets, key=lambda rule: rule.name)
         policy_rule_set_list = [(c.id, c.name) for c in policy_rule_sets]
         self.fields[
             'provided_policy_rule_sets'].choices = policy_rule_set_list
         self.fields[
             'consumed_policy_rule_sets'].choices = policy_rule_set_list
         provided_init = []
         consumed_init = []
         for item in policy_rule_set_list:
             if item[0] in policy_target.provided_policy_rule_sets:
                 provided_init.append(item[0])
             if item[0] in policy_target.consumed_policy_rule_sets:
                 consumed_init.append(item[0])
         self.fields['provided_policy_rule_sets'].initial = provided_init
         self.fields['consumed_policy_rule_sets'].initial = consumed_init
         n_policies = client.l2policy_list(request,
             tenant_id=request.user.tenant_id)
         ns_policies = client.networkservicepolicy_list(request,
             tenant_id=request.user.tenant_id)
         n_policies = [(item.id, item.name) for item in n_policies]
         ns_policies = [(item.id, item.name) for item in ns_policies]
         ns_policies.insert(0, ('None', 'None'))
         self.fields['l2_policy_id'].choices = n_policies
         self.fields['network_service_policy_id'].choices = ns_policies
         for i in ['name',
                   'description',
                   'l2_policy_id',
                   'network_service_policy_id',
                   'shared']:
             self.fields[i].initial = getattr(policy_target, i)
     except Exception as e:
         msg = _('Unable to retrieve policy_rule_set details. %s') % (
             str(e))
         exceptions.handle(request, msg)
         pass
예제 #23
0
 def get_consumed_policy_rule_sets_data(self):
     try:
         policy_targetid = self.tab_group.kwargs['policy_target_id']
         policy_target = client.policy_target_get(
             self.request, policy_targetid)
         consumed_policy_rule_set_ids = policy_target.get(
             'consumed_policy_rule_sets')
         consumed_policy_rule_sets = []
         for _id in consumed_policy_rule_set_ids:
             consumed_policy_rule_sets.append(
                 client.policy_rule_set_get(self.request, _id))
         consumed_policy_rule_sets = [gfilters.update_pruleset_attributes(
             self.request, item) for item in consumed_policy_rule_sets]
         return consumed_policy_rule_sets
     except Exception:
         error_message = _('Unable to get consumed rule sets')
         exceptions.handle(self.request, error_message)
         return []
예제 #24
0
 def get_provided_policy_rule_sets_data(self):
     try:
         policy_targetid = self.tab_group.kwargs['policy_target_id']
         policy_target = client.policy_target_get(
             self.request, policy_targetid)
         provided_policy_rule_set_ids = policy_target.get(
             'provided_policy_rule_sets')
         provided_policy_rule_sets = []
         for _id in provided_policy_rule_set_ids:
             provided_policy_rule_sets.append(
                 client.policy_rule_set_get(self.request, _id))
         provided_policy_rule_sets = [gfilters.update_pruleset_attributes(
             self.request, item) for item in provided_policy_rule_sets]
         return provided_policy_rule_sets
     except Exception:
         error_message = _('Unable to get provided rule sets')
         exceptions.handle(self.request, error_message)
         return []
예제 #25
0
 def __init__(self, request, *args, **kwargs):
     super(UpdatePolicyTargetForm, self).__init__(request, *args, **kwargs)
     try:
         policy_target_id = self.initial['policy_target_id']
         policy_target = client.policy_target_get(request, policy_target_id)
         policy_rule_sets = client.policy_rule_set_list(
             request, tenant_id=request.user.tenant_id)
         for c in policy_rule_sets:
             c.set_id_as_name_if_empty()
         policy_rule_sets = sorted(policy_rule_sets,
                                   key=lambda rule: rule.name)
         policy_rule_set_list = [(c.id, c.name) for c in policy_rule_sets]
         self.fields[
             'provided_policy_rule_sets'].choices = policy_rule_set_list
         self.fields[
             'consumed_policy_rule_sets'].choices = policy_rule_set_list
         provided_init = []
         consumed_init = []
         for item in policy_rule_set_list:
             if item[0] in policy_target.provided_policy_rule_sets:
                 provided_init.append(item[0])
             if item[0] in policy_target.consumed_policy_rule_sets:
                 consumed_init.append(item[0])
         self.fields['provided_policy_rule_sets'].initial = provided_init
         self.fields['consumed_policy_rule_sets'].initial = consumed_init
         n_policies = client.l2policy_list(request,
                                           tenant_id=request.user.tenant_id)
         ns_policies = client.networkservicepolicy_list(
             request, tenant_id=request.user.tenant_id)
         n_policies = [(item.id, item.name) for item in n_policies]
         ns_policies = [(item.id, item.name) for item in ns_policies]
         ns_policies.insert(0, ('None', 'None'))
         self.fields['l2_policy_id'].choices = n_policies
         self.fields['network_service_policy_id'].choices = ns_policies
         for i in [
                 'name', 'description', 'l2_policy_id',
                 'network_service_policy_id', 'shared'
         ]:
             self.fields[i].initial = getattr(policy_target, i)
     except Exception as e:
         msg = _('Unable to retrieve policy_rule_set details. %s') % (
             str(e))
         exceptions.handle(request, msg)
         pass
예제 #26
0
 def get_context_data(self, request):
     policy_targetid = self.tab_group.kwargs['policy_target_id']
     nsp = ''
     try:
         policy_target = client.policy_target_get(request, policy_targetid)
         l2_policy = client.l2policy_get(request,
                         policy_target["l2_policy_id"])
         l3_policy = client.l3policy_get(request,
                         l2_policy["l3_policy_id"])
         if policy_target['network_service_policy_id']:
             nsp_id = policy_target['network_service_policy_id']
             nsp = client.get_networkservice_policy(request, nsp_id)
     except Exception:
         exceptions.handle(
             request, _('Unable to retrieve group details.'),
             redirect=self.failure_url)
     return {'policy_target': policy_target,
             'l3_policy': l3_policy,
             'l2_policy': l2_policy,
             'nsp': nsp}
예제 #27
0
 def get_context_data(self, request):
     policy_targetid = self.tab_group.kwargs['policy_target_id']
     nsp = ''
     try:
         policy_target = client.policy_target_get(request, policy_targetid)
         l2_policy = client.l2policy_get(request,
                                         policy_target["l2_policy_id"])
         l3_policy = client.l3policy_get(request, l2_policy["l3_policy_id"])
         if policy_target['network_service_policy_id']:
             nsp_id = policy_target['network_service_policy_id']
             nsp = client.get_networkservice_policy(request, nsp_id)
     except Exception:
         exceptions.handle(request,
                           _('Unable to retrieve group details.'),
                           redirect=self.failure_url)
     return {
         'policy_target': policy_target,
         'l3_policy': l3_policy,
         'l2_policy': l2_policy,
         'nsp': nsp
     }
예제 #28
0
 def __init__(self, request, *args, **kwargs):
     super(SetGroupAction, self).__init__(request, *args, **kwargs)
     policy_targetid = self.request.path.split("/")[-2]
     ptg = client.policy_target_get(request, policy_targetid)
     subnet_dedails = None
     for subnet_id in ptg.subnets:
         try:
             subnet = api.neutron.subnet_get(request, subnet_id)
             if subnet_dedails is None:
                 subnet_dedails = subnet['cidr']
             else:
                 subnet_dedails = subnet_dedails + ";" + subnet['cidr']
             allocation_pools = subnet['allocation_pools']
             if allocation_pools:
                 start = allocation_pools[0]['start']
                 end = allocation_pools[0]['end']
                 subnet_dedails = subnet_dedails + "," + start
                 subnet_dedails = subnet_dedails + "," + end
         except Exception as e:
             LOG.error(str(e))
             pass
     initial_value = policy_targetid + ":" + subnet_dedails
     self.fields['network'].initial = [initial_value]
예제 #29
0
    def handle(self, request, context):
        custom_script = context.get('script_data', '')
        dev_mapping_1 = None
        dev_mapping_2 = None

        image_id = ''

        # Determine volume mapping options
        source_type = context.get('source_type', None)
        if source_type in ['image_id', 'instance_snapshot_id']:
            image_id = context['source_id']
        elif source_type in ['volume_id', 'volume_snapshot_id']:
            try:
                if api.nova.extension_supported("BlockDeviceMappingV2Boot",
                                                request):
                    # Volume source id is extracted from the source
                    volume_source_id = context['source_id'].split(':')[0]
                    device_name = context.get('device_name', '') \
                        .strip() or None
                    dev_source_type_mapping = {
                        'volume_id': 'volume',
                        'volume_snapshot_id': 'snapshot'
                    }
                    dev_mapping_2 = [
                        {'device_name': device_name,
                         'source_type': dev_source_type_mapping[source_type],
                         'destination_type': 'volume',
                         'delete_on_termination':
                             int(bool(context['delete_on_terminate'])),
                         'uuid': volume_source_id,
                         'boot_index': '0',
                         'volume_size': context['volume_size']
                         }
                    ]
                else:
                    dev_mapping_1 = {context['device_name']: '%s::%s' %
                                     (context['source_id'],
                                     int(bool(context['delete_on_terminate'])))
                                     }
            except Exception:
                msg = _('Unable to retrieve extensions information')
                exceptions.handle(request, msg)

        elif source_type == 'volume_image_id':
            device_name = context.get('device_name', '').strip() or None
            dev_mapping_2 = [
                {'device_name': device_name,  # None auto-selects device
                 'source_type': 'image',
                 'destination_type': 'volume',
                 'delete_on_termination':
                     int(bool(context['delete_on_terminate'])),
                 'uuid': context['source_id'],
                 'boot_index': '0',
                 'volume_size': context['volume_size']
                 }
            ]
        avail_zone = context.get('availability_zone', None)
        try:
            instance_count = int(context['count'])
            count = 1
            while count <= instance_count:
                if instance_count == 1:
                    instance_name = context['name']
                else:
                    instance_name = context['name'] + str(count)
                nics = []
                for ptg_id in context['group_id']:
                    values = ptg_id.split(":")
                    ptg_id = values[0]
                    args = {'policy_target_group_id': ptg_id,
                            'name': instance_name[:41] + "_gbpui"}
                    if len(values) == 3:
                        ptg = client.policy_target_get(request, ptg_id)
                        fixed_ip = values[2]
                        for subnet_id in ptg.subnets:
                            subnet = api.neutron.subnet_get(request, subnet_id)
                            if IPAddress(fixed_ip) in \
                                    IPNetwork(subnet['cidr']):
                                args['fixed_ips'] = [
                                    {'subnet_id': subnet['id'],
                                     'ip_address': fixed_ip}]
                                break
                    ep = client.pt_create(request, **args)
                    nics.append({'port-id': ep.port_id})
                api.nova.server_create(request,
                                   instance_name,
                                   image_id,
                                   context['flavor'],
                                   context['keypair_id'],
                                   normalize_newlines(custom_script),
                                   security_groups=None,
                                   block_device_mapping=dev_mapping_1,
                                   block_device_mapping_v2=dev_mapping_2,
                                   nics=nics,
                                   availability_zone=avail_zone,
                                   instance_count=1,
                                   admin_pass=context['admin_pass'],
                                   disk_config=context.get('disk_config'),
                                   config_drive=context.get('config_drive'))
                count += 1
            return True
        except Exception as e:
            error = _("Unable to launch member %(count)s with name %(name)s")
            msg = error % {'count': count, 'name': instance_name}
            LOG.error(str(e))
            u = "horizon:project:policytargets:policy_targetdetails"
            policy_target_id = self.request.path.split("/")[-2]
            redirect = reverse(u, kwargs={'policy_target_id':
                policy_target_id})
            exceptions.handle(request, msg, redirect=redirect)
            return False
예제 #30
0
    def handle(self, request, context):
        custom_script = context.get('script_data', '')
        dev_mapping_1 = None
        dev_mapping_2 = None

        image_id = ''

        # Determine volume mapping options
        source_type = context.get('source_type', None)
        if source_type in ['image_id', 'instance_snapshot_id']:
            image_id = context['source_id']
        elif source_type in ['volume_id', 'volume_snapshot_id']:
            try:
                if api.nova.extension_supported("BlockDeviceMappingV2Boot",
                                                request):
                    # Volume source id is extracted from the source
                    volume_source_id = context['source_id'].split(':')[0]
                    device_name = context.get('device_name', '') \
                        .strip() or None
                    dev_source_type_mapping = {
                        'volume_id': 'volume',
                        'volume_snapshot_id': 'snapshot'
                    }
                    dev_mapping_2 = [
                        {'device_name': device_name,
                         'source_type': dev_source_type_mapping[source_type],
                         'destination_type': 'volume',
                         'delete_on_termination':
                             int(bool(context['delete_on_terminate'])),
                         'uuid': volume_source_id,
                         'boot_index': '0',
                         'volume_size': context['volume_size']
                         }
                    ]
                else:
                    dev_mapping_1 = {context['device_name']: '%s::%s' %
                                     (context['source_id'],
                                     int(bool(context['delete_on_terminate'])))
                                     }
            except Exception:
                msg = _('Unable to retrieve extensions information')
                exceptions.handle(request, msg)

        elif source_type == 'volume_image_id':
            device_name = context.get('device_name', '').strip() or None
            dev_mapping_2 = [
                {'device_name': device_name,  # None auto-selects device
                 'source_type': 'image',
                 'destination_type': 'volume',
                 'delete_on_termination':
                     int(bool(context['delete_on_terminate'])),
                 'uuid': context['source_id'],
                 'boot_index': '0',
                 'volume_size': context['volume_size']
                 }
            ]
        avail_zone = context.get('availability_zone', None)
        try:
            instance_count = int(context['count'])
            count = 1
            while count <= instance_count:
                if instance_count == 1:
                    instance_name = context['name']
                else:
                    instance_name = context['name'] + str(count)
                nics = []
                pts = []
                for ptg_id in context['group_id']:
                    values = ptg_id.split(":")
                    ptg_id = values[0]
                    args = {'policy_target_group_id': ptg_id,
                            'name': instance_name[:41] + "_gbpui"}
                    if len(values) == 3:
                        ptg = client.policy_target_get(request, ptg_id)
                        fixed_ip = values[2]
                        for subnet_id in ptg.subnets:
                            try:
                                subnet = api.neutron.subnet_get(
                                    request, subnet_id)
                            except Exception:
                                continue
                            if IPAddress(fixed_ip) in \
                                    IPNetwork(subnet['cidr']):
                                args['fixed_ips'] = [
                                    {'subnet_id': subnet['id'],
                                     'ip_address': fixed_ip}]
                                break
                    ep = client.pt_create(request, **args)
                    nics.append({'port-id': ep.port_id})
                    pts.append(ep.id)
                meta_data = {'pts': ','.join(pts)}
                api.nova.server_create(request,
                                   instance_name,
                                   image_id,
                                   context['flavor'],
                                   context['keypair_id'],
                                   normalize_newlines(custom_script),
                                   security_groups=None,
                                   block_device_mapping=dev_mapping_1,
                                   block_device_mapping_v2=dev_mapping_2,
                                   nics=nics,
                                   availability_zone=avail_zone,
                                   instance_count=1,
                                   admin_pass=context['admin_pass'],
                                   disk_config=context.get('disk_config'),
                                   config_drive=context.get('config_drive'),
                                   meta=meta_data)
                count += 1
            return True
        except Exception as e:
            error = _("Unable to launch member %(count)s with name %(name)s")
            msg = error % {'count': count, 'name': instance_name}
            LOG.error(str(e))
            u = "horizon:project:policytargets:policy_targetdetails"
            policy_target_id = self.request.path.split("/")[-2]
            redirect = reverse(u, kwargs={'policy_target_id':
                policy_target_id})
            exceptions.handle(request, msg, redirect=redirect)
            return False