Example #1
0
def get_nsx_switch_ids(session, cluster, neutron_network_id):
    """Return the NSX switch id for a given neutron network.

    First lookup for mappings in Neutron database. If no mapping is
    found, query the NSX backend and add the mappings.
    """
    nsx_switch_ids = nsx_db.get_nsx_switch_ids(
        session, neutron_network_id)
    if not nsx_switch_ids:
        # Find logical switches from backend.
        # This is a rather expensive query, but it won't be executed
        # more than once for each network in Neutron's lifetime
        nsx_switches = switchlib.get_lswitches(cluster, neutron_network_id)
        if not nsx_switches:
            LOG.warn(_LW("Unable to find NSX switches for Neutron network %s"),
                     neutron_network_id)
            return
        nsx_switch_ids = []
        with session.begin(subtransactions=True):
            for nsx_switch in nsx_switches:
                nsx_switch_id = nsx_switch['uuid']
                nsx_switch_ids.append(nsx_switch_id)
                # Create DB mapping
                nsx_db.add_neutron_nsx_network_mapping(
                    session,
                    neutron_network_id,
                    nsx_switch_id)
    return nsx_switch_ids
Example #2
0
 def test_create_and_get_lswitches_single(self):
     tenant_id = "pippo"
     transport_zones_config = [{"zone_uuid": _uuid(), "transport_type": "stt"}]
     lswitch = switchlib.create_lswitch(self.fake_cluster, _uuid(), tenant_id, "fake-switch", transport_zones_config)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster, lswitch["uuid"])
     self.assertEqual(len(res_lswitch), 1)
     self.assertEqual(res_lswitch[0]["uuid"], lswitch["uuid"])
Example #3
0
 def test_create_and_get_lswitches_multiple(self):
     tenant_id = "pippo"
     transport_zones_config = [{"zone_uuid": _uuid(), "transport_type": "stt"}]
     network_id = _uuid()
     main_lswitch = switchlib.create_lswitch(
         self.fake_cluster,
         network_id,
         tenant_id,
         "fake-switch",
         transport_zones_config,
         tags=[{"scope": "multi_lswitch", "tag": "True"}],
     )
     # Create secondary lswitch
     second_lswitch = switchlib.create_lswitch(
         self.fake_cluster, network_id, tenant_id, "fake-switch-2", transport_zones_config
     )
     res_lswitch = switchlib.get_lswitches(self.fake_cluster, network_id)
     self.assertEqual(len(res_lswitch), 2)
     switch_uuids = [ls["uuid"] for ls in res_lswitch]
     self.assertIn(main_lswitch["uuid"], switch_uuids)
     self.assertIn(second_lswitch["uuid"], switch_uuids)
     for ls in res_lswitch:
         if ls["uuid"] == main_lswitch["uuid"]:
             main_ls = ls
         else:
             second_ls = ls
     main_ls_tags = self._build_tag_dict(main_ls["tags"])
     second_ls_tags = self._build_tag_dict(second_ls["tags"])
     self.assertIn("multi_lswitch", main_ls_tags)
     self.assertNotIn("multi_lswitch", second_ls_tags)
     self.assertIn("quantum_net_id", main_ls_tags)
     self.assertIn("quantum_net_id", second_ls_tags)
     self.assertEqual(main_ls_tags["quantum_net_id"], network_id)
     self.assertEqual(second_ls_tags["quantum_net_id"], network_id)
Example #4
0
 def test_create_and_get_lswitches_multiple(self):
     tenant_id = 'pippo'
     transport_zones_config = [{'zone_uuid': _uuid(),
                                'transport_type': 'stt'}]
     network_id = _uuid()
     main_lswitch = switchlib.create_lswitch(
         self.fake_cluster, network_id,
         tenant_id, 'fake-switch', transport_zones_config,
         tags=[{'scope': 'multi_lswitch', 'tag': 'True'}])
     # Create secondary lswitch
     second_lswitch = switchlib.create_lswitch(
         self.fake_cluster, network_id,
         tenant_id, 'fake-switch-2', transport_zones_config)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster,
                                           network_id)
     self.assertEqual(len(res_lswitch), 2)
     switch_uuids = [ls['uuid'] for ls in res_lswitch]
     self.assertIn(main_lswitch['uuid'], switch_uuids)
     self.assertIn(second_lswitch['uuid'], switch_uuids)
     for ls in res_lswitch:
         if ls['uuid'] == main_lswitch['uuid']:
             main_ls = ls
         else:
             second_ls = ls
     main_ls_tags = self._build_tag_dict(main_ls['tags'])
     second_ls_tags = self._build_tag_dict(second_ls['tags'])
     self.assertIn('multi_lswitch', main_ls_tags)
     self.assertNotIn('multi_lswitch', second_ls_tags)
     self.assertIn('quantum_net_id', main_ls_tags)
     self.assertIn('quantum_net_id', second_ls_tags)
     self.assertEqual(main_ls_tags['quantum_net_id'],
                      network_id)
     self.assertEqual(second_ls_tags['quantum_net_id'],
                      network_id)
Example #5
0
 def test_create_and_get_lswitches_single_name_exceeds_40_chars(self):
     tenant_id = "pippo"
     transport_zones_config = [{"zone_uuid": _uuid(), "transport_type": "stt"}]
     lswitch = switchlib.create_lswitch(self.fake_cluster, tenant_id, _uuid(), "*" * 50, transport_zones_config)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster, lswitch["uuid"])
     self.assertEqual(len(res_lswitch), 1)
     self.assertEqual(res_lswitch[0]["uuid"], lswitch["uuid"])
     self.assertEqual(res_lswitch[0]["display_name"], "*" * 40)
Example #6
0
 def _test_update_lswitch(self, tenant_id, name, tags):
     transport_zones_config = [{"zone_uuid": _uuid(), "transport_type": "stt"}]
     lswitch = switchlib.create_lswitch(self.fake_cluster, _uuid(), "pippo", "fake-switch", transport_zones_config)
     switchlib.update_lswitch(self.fake_cluster, lswitch["uuid"], name, tenant_id=tenant_id, tags=tags)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster, lswitch["uuid"])
     self.assertEqual(len(res_lswitch), 1)
     self.assertEqual(res_lswitch[0]["display_name"], name)
     if not tags:
         # no need to validate tags
         return
     switch_tags = self._build_tag_dict(res_lswitch[0]["tags"])
     for tag in tags:
         self.assertIn(tag["scope"], switch_tags)
         self.assertEqual(tag["tag"], switch_tags[tag["scope"]])
Example #7
0
 def test_create_and_get_lswitches_single_name_exceeds_40_chars(self):
     tenant_id = 'pippo'
     transport_zones_config = [{'zone_uuid': _uuid(),
                                'transport_type': 'stt'}]
     lswitch = switchlib.create_lswitch(self.fake_cluster,
                                        tenant_id,
                                        _uuid(),
                                        '*' * 50,
                                        transport_zones_config)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster,
                                           lswitch['uuid'])
     self.assertEqual(len(res_lswitch), 1)
     self.assertEqual(res_lswitch[0]['uuid'], lswitch['uuid'])
     self.assertEqual(res_lswitch[0]['display_name'], '*' * 40)
Example #8
0
 def test_create_and_get_lswitches_single(self):
     tenant_id = 'pippo'
     transport_zones_config = [{'zone_uuid': _uuid(),
                                'transport_type': 'stt'}]
     lswitch = switchlib.create_lswitch(self.fake_cluster,
                                        _uuid(),
                                        tenant_id,
                                        'fake-switch',
                                        transport_zones_config)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster,
                                           lswitch['uuid'])
     self.assertEqual(len(res_lswitch), 1)
     self.assertEqual(res_lswitch[0]['uuid'],
                      lswitch['uuid'])
Example #9
0
def fetch_nsx_switches(session, cluster, neutron_net_id):
    """Retrieve logical switches for a neutron network.

    This function is optimized for fetching all the lswitches always
    with a single NSX query.
    If there is more than 1 logical switch (chained switches use case)
    NSX lswitches are queried by 'quantum_net_id' tag. Otherwise the NSX
    lswitch is directly retrieved by id (more efficient).
    """
    nsx_switch_ids = get_nsx_switch_ids(session, cluster, neutron_net_id)
    if len(nsx_switch_ids) > 1:
        lswitches = switchlib.get_lswitches(cluster, neutron_net_id)
    else:
        lswitches = [switchlib.get_lswitch_by_id(
            cluster, nsx_switch_ids[0])]
    return lswitches
Example #10
0
 def _test_update_lswitch(self, tenant_id, name, tags):
     transport_zones_config = [{'zone_uuid': _uuid(),
                                'transport_type': 'stt'}]
     lswitch = switchlib.create_lswitch(self.fake_cluster,
                                        _uuid(),
                                        'pippo',
                                        'fake-switch',
                                        transport_zones_config)
     switchlib.update_lswitch(self.fake_cluster, lswitch['uuid'],
                              name, tenant_id=tenant_id, tags=tags)
     res_lswitch = switchlib.get_lswitches(self.fake_cluster,
                                           lswitch['uuid'])
     self.assertEqual(len(res_lswitch), 1)
     self.assertEqual(res_lswitch[0]['display_name'], name)
     if not tags:
         # no need to validate tags
         return
     switch_tags = self._build_tag_dict(res_lswitch[0]['tags'])
     for tag in tags:
         self.assertIn(tag['scope'], switch_tags)
         self.assertEqual(tag['tag'], switch_tags[tag['scope']])