示例#1
0
    def test_context_undo_fail_db_update(self):
        project = Project(name='p-{}'.format(self.id()))
        self.api.project_create(project)
        vn_og = VirtualNetwork(name='og-vn-{}'.format(self.id()),
                               parent_obj=project)
        self.api.virtual_network_create(vn_og)
        vmi_obj = VirtualMachineInterface('vmi-{}'.format(self.id()),
                                          parent_obj=project)
        vmi_obj.set_virtual_network(vn_og)
        self.api.virtual_machine_interface_create(vmi_obj)
        vmi_obj = self.api.virtual_machine_interface_read(id=vmi_obj.uuid)

        # change virtual network for VMI
        vn_next = VirtualNetwork(name='next-vn-{}'.format(self.id()),
                                 parent_obj=project)
        vn_next.uuid = self.api.virtual_network_create(vn_next)
        vmi_obj.set_virtual_network(vn_next)

        def stub(*args, **kwargs):
            return False, (500, "Fake error")

        with ExpectedException(HttpError):
            with test_common.flexmocks([(self._api_server._db_conn,
                                         'dbe_update', stub)]):
                self.api.virtual_machine_interface_update(vmi_obj)
        vmi_obj = self.api.virtual_machine_interface_read(id=vmi_obj.uuid)
        vn_ref_fq_names = [n['to'] for n in vmi_obj.get_virtual_network_refs()]

        self.assertEqual(len(vn_ref_fq_names), 1)
        self.assertEqual(vn_ref_fq_names[0], vn_og.get_fq_name())
示例#2
0
    def test_context_undo_vpg_fail_db_update(self):
        proj_obj, fabric_obj, pr_obj, pi_obj, vn_obj = \
            self._create_vpg_prerequisites()

        mock_zk = self._api_server._db_conn._zk_db
        zk_alloc_count_before = mock_zk._vpg_id_allocator.get_alloc_count()

        # Create vmi obj
        vmi_name = '%s-1' % self.id()
        vmi_obj = VirtualMachineInterface(vmi_name, parent_obj=proj_obj)
        vmi_obj.set_virtual_network(vn_obj)
        self.api.virtual_machine_interface_create(vmi_obj)
        vmi_obj = self.api.virtual_machine_interface_read(id=vmi_obj.uuid)

        # Create KV_Pairs for this VMI
        pi_fq_name = pi_obj.get_fq_name()
        fabric_name = fabric_obj.get_fq_name()
        kv_pairs = self._create_kv_pairs(fabric_name, pi_fq_name)

        vmi_obj.set_virtual_machine_interface_bindings(kv_pairs)

        def stub(*args, **kwargs):
            return False, (500, "Fake error")

        with ExpectedException(HttpError):
            with test_common.flexmocks([(self._api_server._db_conn,
                                         'dbe_update', stub)]):
                self.api.virtual_machine_interface_update(vmi_obj)
        zk_alloc_count_after = mock_zk._vpg_id_allocator.get_alloc_count()
        self.assertEqual(zk_alloc_count_before, zk_alloc_count_after)
    def test_context_undo_fail_db_delete(self):
        vn_obj = self.create_virtual_network('vn-l2-%s' % self.id())
        vn_ipam_refs = vn_obj.get_network_ipam_refs()

        mock_zk = self._api_server._db_conn._zk_db
        zk_alloc_count_start = mock_zk._vn_id_allocator.get_alloc_count()

        def stub(*args, **kwargs):
            return (False, (500, "Fake error"))

        with ExpectedException(HttpError):
            with test_common.flexmocks(
                    [(self._api_server._db_conn, 'dbe_delete', stub)]):
                self.api.virtual_network_delete(id=vn_obj.uuid)

        # Make sure ipam refs still present (undo action recreated it)
        vn_obj = self.api.virtual_network_read(id=vn_obj.uuid)
        vn_ipam_refs_after_delete_fail = vn_obj.get_network_ipam_refs()

        self.assertEqual(vn_ipam_refs[0]['to'],
                         vn_ipam_refs_after_delete_fail[0]['to'])
        self.assertEqual(vn_ipam_refs[0]['uuid'],
                         vn_ipam_refs_after_delete_fail[0]['uuid'])
        self.assertEqual(vn_ipam_refs[0]['attr'].ipam_subnets[0].subnet_uuid,
                         vn_ipam_refs_after_delete_fail[0][
                             'attr'].ipam_subnets[0].subnet_uuid)
        # Make sure allocation counter stays the same
        zk_alloc_count_current = mock_zk._vn_id_allocator.get_alloc_count()
        self.assertEqual(zk_alloc_count_start, zk_alloc_count_current)
示例#4
0
    def test_context_undo_fail_db_delete(self):
        project = Project(name='p-{}'.format(self.id()))
        self.api.project_create(project)
        vn = VirtualNetwork(name='vn-{}'.format(self.id()), parent_obj=project)
        self.api.virtual_network_create(vn)
        vmi_obj = VirtualMachineInterface('vmi-{}'.format(self.id()),
                                          parent_obj=project)
        vmi_obj.set_virtual_network(vn)
        self.api.virtual_machine_interface_create(vmi_obj)
        vmi_obj = self.api.virtual_machine_interface_read(id=vmi_obj.uuid)

        mock_zk = self._api_server._db_conn._zk_db
        zk_alloc_count_before = mock_zk._vpg_id_allocator.get_alloc_count()

        def stub(*args, **kwargs):
            return False, (500, "Fake error")

        with ExpectedException(HttpError):
            with test_common.flexmocks([(self._api_server._db_conn,
                                         'dbe_delete', stub)]):
                self.api.virtual_machine_interface_delete(
                    fq_name=vmi_obj.fq_name)

        zk_alloc_count_after = mock_zk._vpg_id_allocator.get_alloc_count()
        self.assertEqual(zk_alloc_count_before, zk_alloc_count_after)
    def test_context_undo_vxlan_id_fail_db_create(self):
        # enable vxlan routing on project
        proj = self._vnc_lib.project_read(
            fq_name=["default-domain", "default-project"])
        proj.set_vxlan_routing(True)
        self._vnc_lib.project_update(proj)

        mock_zk = self._api_server._db_conn._zk_db
        vn_obj = VirtualNetwork('%s-vn' % self.id())

        vn_obj_properties = VirtualNetworkType(forwarding_mode='l3')
        vn_obj_properties.set_vxlan_network_identifier(6000)
        vn_obj.set_virtual_network_properties(vn_obj_properties)

        def stub(*args, **kwargs):
            return (False, (500, "Fake error"))

        zk_alloc_count_start = mock_zk._vn_id_allocator.get_alloc_count()
        with ExpectedException(HttpError):
            with test_common.flexmocks(
                    [(self._api_server._db_conn, 'dbe_create', stub)]):
                self.api.virtual_network_create(vn_obj)

        # make sure allocation counter stays the same
        zk_alloc_count_current = mock_zk._vn_id_allocator.get_alloc_count()
        self.assertEqual(zk_alloc_count_start, zk_alloc_count_current)
示例#6
0
    def test_connection_status_change(self):
        # up->down->up transition check
        proj_id = str(uuid.uuid4())
        proj_name = self.id() + 'verify-active'
        test_case.get_keystone_client().tenants.add_tenant(proj_id, proj_name)
        self._vnc_lib.project_read(id=proj_id)
        conn_info = [
            ConnectionState._connection_map[x]
            for x in ConnectionState._connection_map if x[1] == 'Keystone'
        ][0]
        self.assertThat(conn_info.status.lower(), Equals('up'))

        fake_list_invoked = list()

        def fake_list(*args, **kwargs):
            fake_list_invoked.append(True)
            raise Exception("Fake Keystone Projects List exception")

        def verify_down():
            conn_info = [
                ConnectionState._connection_map[x]
                for x in ConnectionState._connection_map if x[1] == 'Keystone'
            ][0]
            self.assertThat(conn_info.status.lower(), Equals('down'))

        with test_common.flexmocks([(self.openstack_driver._ks.tenants, 'list',
                                     fake_list)]):
            # wait for tenants.list is invoked for 2*self.resync_interval max
            for x in range(10):
                if len(fake_list_invoked) >= 1:
                    break
                gevent.sleep(float(self.resync_interval) / 5.0)
            # check that tenants.list was called once
            self.assertThat(len(fake_list_invoked), Equals(1))
            # wait for 1/10 of self.resync_interval to let code reach
            # reset_connection in service
            gevent.sleep(float(self.resync_interval) / 10.0)
            # verify up->down
            verify_down()
            # should remain down
            gevent.sleep(float(self.resync_interval) * 1.05)
            verify_down()
            self.assertThat(len(fake_list_invoked), Equals(2))

        # sleep for a retry and verify down->up
        gevent.sleep(self.resync_interval)
        conn_info = [
            ConnectionState._connection_map[x]
            for x in ConnectionState._connection_map if x[1] == 'Keystone'
        ][0]
        self.assertThat(conn_info.status.lower(), Equals('up'))
    def test_context_undo_fail_db_create(self):
        mock_zk = self._api_server._db_conn._zk_db
        vn_obj = VirtualNetwork('%s-vn' % self.id())
        zk_alloc_count_start = mock_zk._vn_id_allocator.get_alloc_count()

        def stub(*args, **kwargs):
            return (False, (500, "Fake error"))

        with ExpectedException(HttpError):
            with test_common.flexmocks(
                    [(self._api_server._db_conn, 'dbe_create', stub)]):
                self.api.virtual_network_create(vn_obj)

        zk_alloc_count_current = mock_zk._vn_id_allocator.get_alloc_count()
        self.assertEqual(zk_alloc_count_start, zk_alloc_count_current)
    def test_context_undo_vn_to_vxlan_id_fail_db_update(self):
        # Enable vxlan routing on project
        proj = self._vnc_lib.project_read(
            fq_name=["default-domain", "default-project"])
        proj.set_vxlan_routing(True)
        self._vnc_lib.project_update(proj)

        mock_zk = self._api_server._db_conn._zk_db
        vn_obj = VirtualNetwork('%s-vn' % self.id())

        self.api.virtual_network_create(vn_obj)

        vn_fqname = mock_zk.get_vn_from_id(vn_obj.virtual_network_network_id)
        vn_id = vn_obj.virtual_network_network_id

        # Change vn to vxlan type
        vxlan_id = 6000
        vn_obj_properties = VirtualNetworkType(forwarding_mode='l3')
        vn_obj_properties.set_vxlan_network_identifier(vxlan_id)
        vn_obj_properties.set_forwarding_mode('l2_l3')
        vn_obj.set_virtual_network_properties(vn_obj_properties)

        def stub(*args, **kwargs):
            return (False, (500, "Fake error"))

        zk_alloc_count_start = mock_zk._vn_id_allocator.get_alloc_count()
        with ExpectedException(HttpError):
            with test_common.flexmocks(
                    [(self._api_server._db_conn, 'dbe_update', stub)]):
                self.api.virtual_network_update(vn_obj)

        # Make sure vxlan_id was dealocated
        new_vxlan_fqname = mock_zk.get_vn_from_id(vxlan_id)
        self.assertEqual(new_vxlan_fqname, None)

        # Make sure vn id is the same
        new_vn_id = vn_obj.virtual_network_network_id
        self.assertEqual(vn_id, new_vn_id)

        # Make sure fqname is the same fot vn_id
        update_vn_fqname = mock_zk.get_vn_from_id(
            vn_obj.virtual_network_network_id)
        self.assertEqual(vn_fqname, update_vn_fqname)

        # Make sure allocation counter stays the same
        zk_alloc_count_current = mock_zk._vn_id_allocator.get_alloc_count()
        self.assertEqual(zk_alloc_count_start, zk_alloc_count_current)
    def test_context_undo_fail_db_create_routing_instance(self):
        project = Project('project-%s' % self.id())
        self.api.project_create(project)
        vn = VirtualNetwork('vn-%s' % self.id(), parent_obj=project)
        self.api.virtual_network_create(vn)

        mock_zk = self._api_server._db_conn._zk_db

        ri_name = 'ri-%s' % self.id()
        ri_fq_name = vn.fq_name + [ri_name]
        ri = RoutingInstance(ri_name, parent_obj=vn)
        ri.set_routing_instance_is_default(False)
        self.api.routing_instance_create(ri)

        # Make sure we have right zk path (ri_fq_name)
        ri_uuid, _ = mock_zk.get_fq_name_to_uuid_mapping(
            'routing_instance', ri_fq_name)
        self.assertTrue(ri_uuid is not None)

        # Clean ri
        self.api.routing_instance_delete(id=ri_uuid)

        ri = RoutingInstance(ri_name, parent_obj=vn)
        ri.set_routing_instance_is_default(False)

        def stub(*args, **kwargs):
            return (False, (500, "Fake error"))

        with ExpectedException(HttpError):
            with test_common.flexmocks([(self._api_server._db_conn,
                                         'dbe_create', stub)]):
                self.api.routing_instance_create(ri)

        # Check if uuid for ri got released during undo action
        # using same zk path parameters as above
        with ExpectedException(TypeError):
            mock_zk.get_fq_name_to_uuid_mapping('routing_instance', ri_fq_name)