class TestCrossRegionExternalBackendServiceMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface_region_1 = GoogleApiInterface(
            self.compute, project, 'us-central1', 'us-central1-a')
        self.test_resource_creator_region_1 = TestResourceCreator(
            self.google_api_interface_region_1)
        self.google_api_interface_region_2 = GoogleApiInterface(
            self.compute, project, 'us-east1', 'us-east1-b')
        self.test_resource_creator_region_2 = TestResourceCreator(
            self.google_api_interface_region_2)

    def testAutomodeSubnetworkExistsInBothRegions(self):
        """ A backend service has two instance groups from two regions as backends.
        The network is an auto-mode network, and it has subnet with the same name
        in all regions.

        Expectation: all the backends will be migrated

        """
        ### create test resources
        auto_subnetwork_name = 'end-to-end-test-auto-subnetwork'
        try:
            target_network_selfLink = \
                self.google_api_interface_region_1.get_network(
                    auto_subnetwork_name)['selfLink']
        except:
            target_network_selfLink = \
                self.google_api_interface_region_1.create_auto_subnetwork(
                    auto_subnetwork_name)[
                    'targetLink']

        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator_region_1.create_regional_managed_instance_group(
            self.test_resource_creator_region_1.
            legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface_region_1.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        operation = self.test_resource_creator_region_2.create_regional_managed_instance_group(
            self.test_resource_creator_region_2.
            legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_2_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_2_configs = self.google_api_interface_region_2.get_multi_zone_instance_template_configs(
            group_name_2)

        backend_service_name = 'end-to-end-test-backend-service'
        operation = self.test_resource_creator_region_1.create_global_backend_service(
            'sample_external_backend_service.json', backend_service_name,
            [instance_group_2_selfLink, instance_group_1_selfLink])
        original_backend_service_configs = self.google_api_interface_region_1.get_global_backend_service_configs(
            backend_service_name)
        backend_service_selfLink = operation['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(self.compute,
                                             backend_service_selfLink,
                                             auto_subnetwork_name,
                                             auto_subnetwork_name)
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface_region_1.get_global_backend_service_configs(
            backend_service_name)

        # check backend service config
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface_region_1.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface_region_2.get_multi_zone_instance_template_configs(
            group_name_2)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_2_configs,
                new_instance_template_2_configs))

        # network changed
        self.assertTrue(
            check_instance_template_network(new_instance_template_1_configs,
                                            target_network_selfLink))

        self.assertTrue(
            check_instance_template_network(new_instance_template_2_configs,
                                            target_network_selfLink))

        print('Pass the current test')

    def testCustomSubnetworkExistsInBothRegions(self):
        """ A backend service has two instance groups from two regions as backends.

         Expectation: all the backends will be migrated

         """
        ### create test resources

        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator_region_1.create_regional_managed_instance_group(
            self.test_resource_creator_region_1.
            legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface_region_1.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        operation = self.test_resource_creator_region_2.create_regional_managed_instance_group(
            self.test_resource_creator_region_2.
            legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_2_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_2_configs = self.google_api_interface_region_2.get_multi_zone_instance_template_configs(
            group_name_2)

        backend_service_name = 'end-to-end-test-backend-service'
        operation = self.test_resource_creator_region_1.create_global_backend_service(
            'sample_external_backend_service.json', backend_service_name,
            [instance_group_2_selfLink, instance_group_1_selfLink])
        original_backend_service_configs = self.google_api_interface_region_1.get_global_backend_service_configs(
            backend_service_name)
        backend_service_selfLink = operation['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute, backend_service_selfLink,
            self.test_resource_creator_region_1.network_name,
            self.test_resource_creator_region_1.subnetwork_name)
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface_region_1.get_global_backend_service_configs(
            backend_service_name)

        # check backend service config
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface_region_1.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface_region_2.get_multi_zone_instance_template_configs(
            group_name_2)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_2_configs,
                new_instance_template_2_configs))

        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator_region_1.network_selfLink,
                self.test_resource_creator_region_1.subnetwork_selfLink))

        self.assertTrue(
            check_instance_template_network(
                new_instance_template_2_configs,
                self.test_resource_creator_region_2.network_selfLink,
                self.test_resource_creator_region_2.subnetwork_selfLink))

        print('Pass the current test')

    def testCustomSubnetworkExistsInOnlyOneRegion(self):
        """ A backend service has two instance groups from two regions as backends.

         Expectation: rollback will happen

        """
        ### create test resources
        target_subnetwork_name = 'subnetwork-only-in-region-1'
        target_subnetwork_selfLink = \
            self.google_api_interface_region_1.create_subnetwork_using_random_ip_range(
                target_subnetwork_name,
                self.test_resource_creator_region_1.network_selfLink
            )['targetLink']
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator_region_1.create_regional_managed_instance_group(
            self.test_resource_creator_region_1.
            legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface_region_1.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        operation = self.test_resource_creator_region_2.create_regional_managed_instance_group(
            self.test_resource_creator_region_2.
            legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_2_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_2_configs = self.google_api_interface_region_2.get_multi_zone_instance_template_configs(
            group_name_2)

        backend_service_name = 'end-to-end-test-backend-service'
        operation = self.test_resource_creator_region_1.create_global_backend_service(
            'sample_external_backend_service.json', backend_service_name,
            [instance_group_2_selfLink, instance_group_1_selfLink])
        original_backend_service_configs = self.google_api_interface_region_1.get_global_backend_service_configs(
            backend_service_name)
        backend_service_selfLink = operation['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute, backend_service_selfLink,
            self.test_resource_creator_region_1.network_name,
            target_subnetwork_name)
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface_region_1.get_global_backend_service_configs(
            backend_service_name)

        # check backend service config
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface_region_1.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface_region_2.get_multi_zone_instance_template_configs(
            group_name_2)
        # configs are unchanged including network
        self.assertTrue(
            instance_template_config_is_unchanged(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged(
                original_instance_template_2_configs,
                new_instance_template_2_configs))

        print('Pass the current test')

    def tearDown(self) -> None:
        self.doCleanups()

    def doCleanups(self) -> None:
        self.google_api_interface_region_1.clean_all_resources()
        self.google_api_interface_region_2.clean_all_resources()
コード例 #2
0
class TestInternalForwardingRuleMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute', 'v1', credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute,
                                                       project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testWithBackendServiceAttached(self):
        """ A backend service is in use by this forwarding rule

        Expectation: both the forwarding rule and the backend service will be migrated.

        """
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'
        backend_service_name = 'end-to-end-test-backend-service'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)

        backend_service_selfLink = \
            self.test_resource_creator.create_regional_backend_service(
                'sample_internal_backend_service.json',
                backend_service_name, [instance_group_1_selfLink])['targetLink']
        original_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_regional_forwarding_rule_with_backend_service(
                'sample_tcp_regional_forwarding_rule_internal.json',
                forwarding_rule_name,
                backend_service_selfLink)['targetLink']
        original_forwarding_rule_config = self.google_api_interface.get_regional_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(self.compute,
                                             forwarding_rule_selfLink,
                                             self.test_resource_creator.network_name,
                                             self.test_resource_creator.subnetwork_name,
                                             )

        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()

        ### check migration result
        # check internal forwarding rule
        new_forwarding_rule_config = self.google_api_interface.get_regional_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(resource_config_is_unchanged_except_for_network(
            original_forwarding_rule_config,
            new_forwarding_rule_config))
        self.assertTrue(
            check_selfLink_equal(new_forwarding_rule_config['network'],
                                 self.test_resource_creator.network_selfLink))

        # check backend service config
        new_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)
        self.assertTrue(resource_config_is_unchanged_except_for_network(
            original_backend_service_configs,
            new_backend_service_configs))
        self.assertEqual(new_backend_service_configs['network'],
                         self.test_resource_creator.network_selfLink)
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs \
                (
                group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs)
        )
        self.assertTrue(
            check_instance_template_network(new_instance_template_1_configs,
                                            self.test_resource_creator.network_selfLink,
                                            self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def testWithTargetInstanceAttached(self):
        """ A targetInstance is in use by the forwarding rule

        Expectation: both the targetInstance and the forwarding rule will be migrated

        """
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'
        target_instance_name = 'end-to-end-test-instance'

        operation = self.test_resource_creator.create_instance_using_template(
            target_instance_name,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink = operation['targetLink']

        target_instance_selfLink = \
            self.test_resource_creator.create_a_target_instance(
                target_instance_name, instance_selfLink)['targetLink']
        original_instance_config = self.google_api_interface.get_instance_configs(
            target_instance_name)
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_regional_forwarding_rule_with_target(
                'sample_tcp_regional_forwarding_rule_internal.json',
                forwarding_rule_name,
                target_instance_selfLink)['targetLink']
        original_forwarding_rule_config = self.google_api_interface.get_regional_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(self.compute,
                                             forwarding_rule_selfLink,
                                             self.test_resource_creator.network_name,
                                             self.test_resource_creator.subnetwork_name,
                                             )

        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()

        ### check migration result
        # check internal forwarding rule network
        new_forwarding_rule_config = self.google_api_interface.get_regional_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_forwarding_rule_config,
                new_forwarding_rule_config))
        self.assertEqual(new_forwarding_rule_config['network'],
                         self.test_resource_creator.network_selfLink)

        self.assertTrue(
            check_selfLink_equal(new_forwarding_rule_config['network'],
                                 self.test_resource_creator.network_selfLink))

        # check instance network
        new_instance_config = self.google_api_interface.get_instance_configs(
            target_instance_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(new_instance_config,
                                                            original_instance_config))
        # network changed
        self.assertTrue(check_instance_network(new_instance_config,
                                               self.test_resource_creator.network_selfLink,
                                               self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
class TestInternalSelfManagedForwardingRuleMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testWithTargetHttpProxy(self):
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')

        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        backend_service_name = 'end-to-end-test-backend-service'
        original_backend_selfLinks = [instance_group_1_selfLink]
        operation = self.test_resource_creator.create_global_backend_service(
            'sample_internal_self_managed_backend_service.json',
            backend_service_name, original_backend_selfLinks)

        backend_service_selfLink = operation['targetLink']
        urlmap_selfLink = \
            self.test_resource_creator.create_urlmapping(backend_service_name,
                                                         backend_service_selfLink)[
                'targetLink']

        target_proxy_name = forwarding_rule_name
        proxy_selfLink = self.test_resource_creator.create_http_target_proxy(
            target_proxy_name, urlmap_selfLink)['targetLink']
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_internal_self_managed_forwarding_rule.json',
                forwarding_rule_name,
                proxy_selfLink,
                self.test_resource_creator.legacy_network_selfLink)[
                'targetLink']
        original_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        original_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        # check forwarding rule config
        new_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_forwarding_rule_config, new_forwarding_rule_config))
        self.assertTrue(
            check_selfLink_equal(new_forwarding_rule_config['network'],
                                 self.test_resource_creator.network_selfLink))
        # check backend service config
        new_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)

        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testWithTargetGrpcProxy(self):
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')

        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        backend_service_name = 'end-to-end-test-backend-service'
        original_backend_selfLinks = [instance_group_1_selfLink]
        operation = self.test_resource_creator.create_global_backend_service(
            'sample_internal_self_managed_backend_service.json',
            backend_service_name, original_backend_selfLinks)

        backend_service_selfLink = operation['targetLink']
        urlmap_selfLink = \
            self.test_resource_creator.create_urlmapping(backend_service_name,
                                                         backend_service_selfLink)[
                'targetLink']

        grpc_proxy_name = forwarding_rule_name
        proxy_selfLink = \
            self.google_api_interface.create_grpc_proxy(grpc_proxy_name,
                                                        urlmap_selfLink)[
                'targetLink']
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_internal_self_managed_forwarding_rule.json',
                forwarding_rule_name,
                proxy_selfLink,
                self.test_resource_creator.legacy_network_selfLink)[
                'targetLink']
        original_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        original_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        # check forwarding rule config
        new_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_forwarding_rule_config, new_forwarding_rule_config))
        self.assertTrue(
            check_selfLink_equal(new_forwarding_rule_config['network'],
                                 self.test_resource_creator.network_selfLink))
        # check backend service config
        new_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))

        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
コード例 #4
0
class TestExternalForwardingRuleMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testWithTargetHttpProxy(self):
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')

        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        backend_service_name = 'end-to-end-test-backend-service'
        original_backend_selfLinks = [instance_group_1_selfLink]
        operation = self.test_resource_creator.create_global_backend_service(
            'sample_http_backend_service.json', backend_service_name,
            original_backend_selfLinks)
        original_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)

        backend_service_selfLink = operation['targetLink']
        urlmap_selfLink = \
            self.test_resource_creator.create_urlmapping(backend_service_name,
                                                         backend_service_selfLink)[
                'targetLink']
        proxy_selfLink = self.test_resource_creator.create_http_target_proxy(
            backend_service_name, urlmap_selfLink)['targetLink']
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_global_forwarding_rule.json',
                forwarding_rule_name,
                proxy_selfLink)['targetLink']
        original_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        # check forwarding rule config
        new_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_forwarding_rule_config, new_forwarding_rule_config))
        # check backend service config
        new_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def testWithTargetHttpProxyRelatedToMultipleBackendServices(self):
        """ The urlMapping is related to two backend service.
        All the backend services will be migrated.
        """
        ### create test resrouces
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'

        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_2_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)
        backend_service_name_1 = 'end-to-end-test-backend-service-1'
        original_backend_selfLinks_1 = [instance_group_1_selfLink]
        backend_service_selfLink_1 = \
            self.test_resource_creator.create_global_backend_service(
                'sample_http_backend_service.json',
                backend_service_name_1, original_backend_selfLinks_1)[
                'targetLink']

        backend_service_name_2 = 'end-to-end-test-backend-service-2'
        original_backend_selfLinks_2 = [instance_group_2_selfLink]
        backend_service_selfLink_2 = \
            self.test_resource_creator.create_global_backend_service(
                'sample_http_backend_service.json',
                backend_service_name_2, original_backend_selfLinks_2)[
                'targetLink']

        backend_service_selfLinks = [
            backend_service_selfLink_1, backend_service_selfLink_2
        ]
        urlmap_name = 'end-to-ent-test-urlmapping'
        urlmap_selfLink = \
            self.test_resource_creator.create_urlmapping_using_two_backend_service(
                urlmap_name,
                backend_service_selfLinks)[
                'targetLink']
        proxy_selfLink = self.test_resource_creator.create_http_target_proxy(
            urlmap_name, urlmap_selfLink)['targetLink']

        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_global_forwarding_rule.json',
                forwarding_rule_name,
                proxy_selfLink)['targetLink']

        original_backend_service_configs_1 = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name_1)

        original_backend_service_configs_2 = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name_2)

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs_1 = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name_1)
        new_backend_service_configs_2 = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name_2)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs_1,
                new_backend_service_configs_1))
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs_2,
                new_backend_service_configs_2))

        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)

        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_2_configs,
                new_instance_template_2_configs))

        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_2_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def testWithTargetTcpProxy(self):
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'

        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')

        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        backend_service_name = 'end-to-end-test-backend-service'
        backend_service_selfLink = \
            self.test_resource_creator.create_global_backend_service(
                'sample_tcp_backend_service.json',
                backend_service_name, [instance_group_1_selfLink])['targetLink']
        original_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        proxy_selfLink = \
            self.google_api_interface.create_tcp_proxy(group_name_1,
                                                       backend_service_selfLink)[
                'targetLink']
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_tcp_forwarding_rule_external.json',
                forwarding_rule_name,
                proxy_selfLink)['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)

        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))

        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testWithTargetSslProxy(self):
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'

        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        backend_service_name = 'end-to-end-test-backend-service'
        backend_service_selfLink = \
            self.test_resource_creator.create_global_backend_service(
                'sample_tcp_backend_service.json',
                backend_service_name, [instance_group_1_selfLink])['targetLink']
        original_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        ssl_certificate_name = forwarding_rule_name
        ssl_certificate_selfLink = \
            self.google_api_interface.create_ssl_certificate(
                ssl_certificate_name)[
                'targetLink']
        ssl_proxy_name = forwarding_rule_name
        proxy_selfLink = \
            self.google_api_interface.create_ssl_proxy(ssl_proxy_name,
                                                       backend_service_selfLink,
                                                       ssl_certificate_selfLink)[
                'targetLink']

        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_ssl_forwarding_rule_external.json',
                forwarding_rule_name,
                proxy_selfLink)['targetLink']

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)

        # check backend service config

        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testWithTargetHttpsProxy(self):
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'

        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')

        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        backend_service_name = 'end-to-end-test-backend-service'
        operation = self.test_resource_creator.create_global_backend_service(
            'sample_https_backend_service.json', backend_service_name,
            [instance_group_1_selfLink])
        original_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        backend_service_selfLink = operation['targetLink']
        urlmap_selfLink = \
            self.test_resource_creator.create_urlmapping(backend_service_name,
                                                         backend_service_selfLink)[
                'targetLink']
        ssl_certificate_name = forwarding_rule_name
        ssl_certificate_selfLink = \
            self.google_api_interface.create_ssl_certificate(
                ssl_certificate_name)[
                'targetLink']

        https_proxy_name = forwarding_rule_name
        proxy_selfLink = \
            self.google_api_interface.create_https_proxy(https_proxy_name,
                                                         urlmap_selfLink,
                                                         ssl_certificate_selfLink)[
                'targetLink']
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_global_forwarding_rule_with_target(
                'sample_global_https_forwarding_rule.json',
                forwarding_rule_name,
                proxy_selfLink)['targetLink']
        original_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            forwarding_rule_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface.get_global_backend_service_configs(
            backend_service_name)
        # check forwarding rule config
        new_forwarding_rule_config = self.google_api_interface.get_global_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_forwarding_rule_config, new_forwarding_rule_config))
        # check backend service config
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
コード例 #5
0
class TestTargetPoolMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testOnlyInstancesAsBackend(self):
        """ The target pool has single instances as its backends, no instance groups
        """
        ### create test resources
        instance_name_1 = 'end-to-end-test-instance-1'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_1,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink_1 = operation['targetLink']
        instance_name_2 = 'end-to-end-test-instance-2'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_2,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink_2 = operation['targetLink']

        target_pool_name = 'end-to-end-test-target-pool'
        operation = self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [], [instance_selfLink_1, instance_selfLink_2],
            health_check_selfLink=None)
        target_pool_selfLink = operation['targetLink']
        original_target_pool_instance_list = \
            self.google_api_interface.get_target_pool_config(target_pool_name)[
                'instances']

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            target_pool_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_target_pool_instance_list = \
            self.google_api_interface.get_target_pool_config(target_pool_name)[
                'instances']
        # target pool's instances unchanged
        self.assertTrue(
            compare_two_list(new_target_pool_instance_list,
                             original_target_pool_instance_list))
        # instances' network changed
        new_instance_1_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        self.assertTrue(
            check_instance_network(
                new_instance_1_config,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        new_instance_2_config = self.google_api_interface.get_instance_configs(
            instance_name_2)
        self.assertTrue(
            check_instance_network(
                new_instance_2_config,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testOnlyManagedInstanceGroupsAsBackend(self):
        """ The target pool is served by managed instance groups
         """
        ### create resources
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        original_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)

        target_pool_name = 'end-to-end-test-target-pool'
        operation = self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [group_name_1, group_name_2], [],
            health_check_selfLink=None)
        target_pool_selfLink = operation['targetLink']
        # time allowance to let the instance groups create instances
        time.sleep(20)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            target_pool_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_2_configs,
                new_instance_template_2_configs))

        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_2_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def testEmptyManagedInstanceGroupAsBackend(self):
        """ The target pool is served by an empty managed instance groups (no instances in the group)

        Expectation: the instance group which has no instance will not be migrated to the target subnet.
        The instance group which has instances will be migrated to the target subnet.
         """
        ### create resources
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group_with_zero_instance.json',
        )
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        original_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)

        target_pool_name = 'end-to-end-test-target-pool'
        operation = self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [group_name_2, group_name_1], [],
            health_check_selfLink=None)
        target_pool_selfLink = operation['targetLink']
        # time allowance to let the instance groups create instances
        time.sleep(20)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            target_pool_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)
        # group 1 didn't migrate
        self.assertTrue(
            instance_template_config_is_unchanged(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_2_configs,
                new_instance_template_2_configs))
        # group 2 network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_2_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testInstancesAndManagedInstanceGroupsMixedBackends(self):
        """ The target pool served by both instances and managed instance groups
        """
        ### create test resources
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        instance_name_1 = 'end-to-end-test-instance-1'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_1,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_1_selfLink = operation['targetLink']
        original_instance_1_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        target_pool_name = 'end-to-end-test-target-pool'
        operation = self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [group_name_1], [instance_1_selfLink],
            health_check_selfLink=None)
        target_pool_selfLink = operation['targetLink']
        # time allowance to let the instance groups create instances
        time.sleep(10)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            target_pool_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))

        new_instance_1_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_instance_1_config, new_instance_1_config))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        self.assertTrue(
            check_instance_network(
                new_instance_1_config,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testWithInstancesFromAnUnmanagedInstanceGroup(self):
        """ The target pool is served by an instance which is a member of an unmanaged instance group

        Expectation: the migration will not start.

        """
        ### create resources
        instance_name_1 = 'end-to-end-test-instance-1'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_1,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink_1 = operation['targetLink']

        instance_name_2 = 'end-to-end-test-instance-2'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_2,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink_2 = operation['targetLink']

        unmanaged_instance_group_name = 'end-to-end-test-unmanaged-instance-group-1'
        original_instances_in_group = [instance_name_1, instance_name_2]
        self.test_resource_creator.create_unmanaged_instance_group(
            unmanaged_instance_group_name, original_instances_in_group)
        original_group_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)

        target_pool_name = 'end-to-end-test-target-pool'
        operation = self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [], [instance_selfLink_1, instance_selfLink_2],
            health_check_selfLink=None)

        target_pool_selfLink = operation['targetLink']
        original_target_pool_config = self.google_api_interface.get_target_pool_config(
            target_pool_name)

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            target_pool_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        # the migration will not start, and raise an error
        with self.assertRaises(AmbiguousTargetResource):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()

        ### check migration result
        # unmanaged instance group doesn't change
        new_group_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)
        self.assertEqual(original_group_config, new_group_config)
        # target pool is unchanged
        new_target_pool_config = self.google_api_interface.get_target_pool_config(
            target_pool_name)
        self.assertEqual(original_target_pool_config, new_target_pool_config)

        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
コード例 #6
0
class TestInternalBackendServiceMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testWithMultipleBackends(self):
        """ A backend service has multiple backends

        Expectation: all the backends will be migrated

        """
        ### create test resources
        backend_service_name = 'end-to-end-test-backend-service'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        group_name_2 = 'end-to-end-test-managed-instance-group-2'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_2,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_2_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)

        original_backend_selfLinks = [
            instance_group_2_selfLink, instance_group_1_selfLink
        ]
        operation = self.test_resource_creator.create_regional_backend_service(
            'sample_internal_backend_service.json', backend_service_name,
            original_backend_selfLinks)

        backend_service_selfLink = operation['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            backend_service_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)
        new_backend_selfLinks = self.google_api_interface.get_backends_links_from_backend_service_configs(
            new_backend_service_configs)
        # check backend service config
        self.assertTrue(
            check_selfLink_equal(new_backend_service_configs['network'],
                                 self.test_resource_creator.network_selfLink))
        self.assertTrue(
            compare_two_list(original_backend_selfLinks,
                             new_backend_selfLinks))
        # check its backends
        new_instance_template_1_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_1)
        new_instance_template_2_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name_2)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_1_configs,
                new_instance_template_1_configs))
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_2_configs,
                new_instance_template_2_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_1_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))

        self.assertTrue(
            check_instance_template_network(
                new_instance_template_2_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testWithNoBackends(self):
        """ A backend service has no backend

        Expectation: the backend service itself will be migrated

        """
        ### create test resources
        backend_service_name = 'end-to-end-test-backend-service'
        operation = self.test_resource_creator.create_regional_backend_service(
            'sample_internal_backend_service.json', backend_service_name, [])
        original_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)
        backend_service_selfLink = operation['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            backend_service_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)

        # check backend service config
        self.assertTrue(
            check_selfLink_equal(new_backend_service_configs['network'],
                                 self.test_resource_creator.network_selfLink))
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_backend_service_configs, new_backend_service_configs))
        print('Pass the current test')

    def testWithForwardingRuleAttached(self):
        """ A forwaring rule is using the external backend service.
          Try to migrate the external backend service directly.

          Expectation: still can migrate

        """
        ### create test resources
        backend_service_name = 'end-to-end-test-backend-service'
        original_backend_selfLinks = []
        operation = self.test_resource_creator.create_regional_backend_service(
            'sample_internal_backend_service.json', backend_service_name,
            original_backend_selfLinks)
        original_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)
        backend_service_selfLink = operation['targetLink']
        self.test_resource_creator.create_regional_forwarding_rule_with_backend_service(
            'sample_tcp_regional_forwarding_rule_internal.json',
            backend_service_name, backend_service_selfLink)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            backend_service_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()

        ### check migration result
        # migration didn't start
        new_backend_service_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_name)
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_backend_service_configs, new_backend_service_configs))
        print('Pass the current test')

    def testSharingBackendWithAnotherBackendService(self):
        """ The internal backend service A shares the same backend with another backend service B

        Expectation: rollback

        """
        ### create test resources
        backend_service_1_name = 'end-to-end-test-backend-service-1'
        backend_service_2_name = 'end-to-end-test-backend-service-2'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_group_config = self.google_api_interface.get_multi_zone_managed_instance_group_configs(
            group_name_1)

        backend_service_1_selfLink = \
            self.test_resource_creator.create_regional_backend_service(
                'sample_internal_backend_service.json',
                backend_service_1_name, [instance_group_1_selfLink])[
                'targetLink']
        original_backend_service_1_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_1_name)
        self.test_resource_creator.create_regional_backend_service(
            'sample_internal_backend_service.json', backend_service_2_name,
            [instance_group_1_selfLink])
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            backend_service_1_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()
        ### check migration result
        new_backend_service_1_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_1_name)

        # check backend service config
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_backend_service_1_configs,
                new_backend_service_1_configs))
        # check its backends
        new_instance_group_config = self.google_api_interface.get_multi_zone_managed_instance_group_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged(
                original_instance_group_config, new_instance_group_config))
        print('Pass the current test')

    def testSharingBackendWithATargetPool(self):
        """ backend_service_1 share the same backend with a target pool.
            Try to migrate backend_service_1.

            Expectation: rollback

        """
        ### create test resources
        backend_service_1_name = 'end-to-end-test-backend-service-1'
        group_name_1 = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name_1,
            'sample_multi_zone_managed_instance_group.json',
        )
        instance_group_1_selfLink = operation['targetLink'].replace(
            '/instanceGroupManagers/', '/instanceGroups/')
        original_instance_group_config = self.google_api_interface.get_multi_zone_managed_instance_group_configs(
            group_name_1)

        backend_service_1_selfLink = \
            self.test_resource_creator.create_regional_backend_service(
                'sample_internal_backend_service.json',
                backend_service_1_name, [instance_group_1_selfLink])[
                'targetLink']
        original_backend_service_1_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_1_name)
        target_pool_name = 'end-to-end-test-target-pool'
        target_pool_selfLink = \
            self.test_resource_creator.create_target_pool_with_health_check(
                'sample_target_pool_with_no_instance.json',
                target_pool_name,
                [group_name_1],
                [],
                health_check_selfLink=None)['targetLink']
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            backend_service_1_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()
        ### check migration result
        new_backend_service_1_configs = self.google_api_interface.get_regional_backend_service_configs(
            backend_service_1_name)

        # check backend service config
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_backend_service_1_configs,
                new_backend_service_1_configs))
        # check its backends
        new_instance_group_config = self.google_api_interface.get_multi_zone_managed_instance_group_configs(
            group_name_1)
        self.assertTrue(
            instance_template_config_is_unchanged(
                original_instance_group_config, new_instance_group_config))
        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
コード例 #7
0
class TestUnmanagedInstanceGroupMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testWithMultipleInstancesInTheGroup(self):
        ### create test resources
        instance_name_1 = 'end-to-end-test-instance-1'
        self.test_resource_creator.create_instance_using_template(
            instance_name_1,
            self.test_resource_creator.legacy_instance_template_selfLink)

        instance_name_2 = 'end-to-end-test-instance-2'
        self.test_resource_creator.create_instance_using_template(
            instance_name_2,
            self.test_resource_creator.legacy_instance_template_selfLink)

        unmanaged_instance_group_name = 'end-to-end-test-unmanaged-instance-group-1'
        original_instances_in_group = [instance_name_1, instance_name_2]
        self.test_resource_creator.create_unmanaged_instance_group(
            unmanaged_instance_group_name, original_instances_in_group)
        original_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute, original_config['selfLink'],
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name, False)
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_config, new_config))

        # network changed
        self.assertTrue(
            check_selfLink_equal(new_config['network'],
                                 self.test_resource_creator.network_selfLink))
        self.assertTrue(
            check_selfLink_equal(
                new_config['subnetwork'],
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testWithNoInstanceInTheGroup(self):
        ### create test resources
        unmanaged_instance_group_name = 'end-to-end-test-unmanaged-instance-group-1'
        self.test_resource_creator.create_unmanaged_instance_group(
            unmanaged_instance_group_name, [])
        original_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute, original_config['selfLink'],
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name, False)
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)

        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_config, new_config))

        # network changed
        self.assertTrue(
            check_selfLink_equal(new_config['network'],
                                 self.test_resource_creator.network_selfLink))
        print('Pass the current test')

    def testAsBackendOfTargetPool(self):
        """ The unmanaged instance group serves a target pool, which means the
        instances in this instance group serve the target pool.

        Expectation: The migration can still succeed.
        But the instances might be detached from the target pool after the migration.

        """
        ### create test resources
        instance_name_1 = 'end-to-end-test-instance-1'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_1,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink_1 = operation['targetLink']
        original_instance_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        unmanaged_instance_group_name = 'end-to-end-test-unmanaged-instance-group-1'
        original_instances_in_group = [instance_name_1]
        unmanaged_instance_group_selfLink = \
            self.test_resource_creator.create_unmanaged_instance_group(
                unmanaged_instance_group_name,
                original_instances_in_group)['targetLink']
        original_instance_group_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)
        target_pool_name = 'end-to-end-test-target-pool'
        self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [], [instance_selfLink_1],
            health_check_selfLink=None)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            unmanaged_instance_group_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        # the migration is successful
        new_instance_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        new_instance_group_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_instance_config, new_instance_config))
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                original_instance_group_config, new_instance_group_config))

        # network changed
        self.assertTrue(
            check_instance_network(
                new_instance_config,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        print('Pass the current test')

    def testAsBackendOfBackendService(self):
        """ The instance group is serving a backend service

        Expectation: The migration will fail and rollback to the legacy network.

        """
        ### create test resources
        instance_name_1 = 'end-to-end-test-instance-1'
        operation = self.test_resource_creator.create_instance_using_template(
            instance_name_1,
            self.test_resource_creator.legacy_instance_template_selfLink)

        original_instance_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        unmanaged_instance_group_name = 'end-to-end-test-unmanaged-instance-group-1'
        original_instances_in_group = [instance_name_1]
        unmanaged_instance_group_selfLink = \
            self.test_resource_creator.create_unmanaged_instance_group(
                unmanaged_instance_group_name,
                original_instances_in_group)['targetLink']
        original_instance_group_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)
        backend_service_name = 'end-to-end-test-backend-service'
        original_backend_selfLinks = [unmanaged_instance_group_selfLink]
        self.test_resource_creator.create_regional_backend_service(
            'sample_internal_backend_service.json', backend_service_name,
            original_backend_selfLinks)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            unmanaged_instance_group_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()

        ### check migration result
        # the migration is failed and the resources are rolled back
        new_instance_config = self.google_api_interface.get_instance_configs(
            instance_name_1)
        new_instance_group_config = self.google_api_interface.get_unmanaged_instance_group_configs(
            unmanaged_instance_group_name)
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_instance_config, new_instance_config))
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_instance_group_config, new_instance_group_config))

        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
class TestTargetInstanceMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testAttachingAnInternalForwardingRule(self):
        """ A targetInstance is in use by the forwarding rule

        Expectation: both the targetInstance and the forwarding rule will be migrated

        """
        ### create test resources
        forwarding_rule_name = 'end-to-end-test-forwarding-rule'
        target_instance_name = 'end-to-end-test-instance'

        operation = self.test_resource_creator.create_instance_using_template(
            target_instance_name,
            self.test_resource_creator.legacy_instance_template_selfLink)
        instance_selfLink = operation['targetLink']

        target_instance_selfLink = \
            self.test_resource_creator.create_a_target_instance(
                target_instance_name, instance_selfLink)['targetLink']
        original_instance_config = self.google_api_interface.get_instance_configs(
            target_instance_name)
        forwarding_rule_selfLink = \
            self.test_resource_creator.create_regional_forwarding_rule_with_target(
                'sample_tcp_regional_forwarding_rule_internal.json',
                forwarding_rule_name,
                target_instance_selfLink)['targetLink']
        original_forwarding_rule_config = self.google_api_interface.get_regional_forwarding_rule_config(
            forwarding_rule_name)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            target_instance_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )

        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()

        ### check migration result

        new_forwarding_rule_config = self.google_api_interface.get_regional_forwarding_rule_config(
            forwarding_rule_name)
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_forwarding_rule_config, new_forwarding_rule_config))
        # check instance network
        new_instance_config = self.google_api_interface.get_instance_configs(
            target_instance_name)
        self.assertTrue(
            resource_config_is_unchanged_except_for_network(
                new_instance_config, original_instance_config))
        # network changed
        self.assertTrue(
            check_instance_network(
                new_instance_config,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()
コード例 #9
0
class TestManagedInstanceGroupMigration(unittest.TestCase):
    def setUp(self):
        print('Initialize test environment.')
        project = os.environ["PROJECT_ID"]
        credentials, default_project = google.auth.default()
        self.compute = discovery.build('compute',
                                       'v1',
                                       credentials=credentials)
        self.google_api_interface = GoogleApiInterface(self.compute, project,
                                                       'us-central1',
                                                       'us-central1-a')
        self.test_resource_creator = TestResourceCreator(
            self.google_api_interface)

    def testWithAutoscalerAttached(self):
        # create test resources
        group_name = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name,
            'sample_multi_zone_managed_instance_group.json',
            autoscaler_file_name='sample_autoscaler.json')
        instance_group_selfLink = operation['targetLink']
        original_instance_template_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name)
        original_autoscaler_configs = self.google_api_interface.get_region_autoscaler(
            group_name)

        # start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            instance_group_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_instance_template_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_configs,
                new_instance_template_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))
        # autoscaler doesn't change
        current_autoscaler_configs = self.google_api_interface.get_region_autoscaler(
            group_name)
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_autoscaler_configs, current_autoscaler_configs))

        print('Pass the current test')

    def testWithoutAutoscalerAttached(self):
        ### create test resources
        group_name = 'end-to-end-test-managed-instance-group-1'
        operation = self.test_resource_creator.create_regional_managed_instance_group(
            self.test_resource_creator.legacy_instance_template_selfLink,
            group_name, 'sample_multi_zone_managed_instance_group.json')
        instance_group_selfLink = operation['targetLink']
        original_instance_template_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name)

        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            instance_group_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        migration_handler = selfLink_executor.build_migration_handler()
        migration_handler.network_migration()
        ### check migration result
        new_instance_template_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name)
        self.assertTrue(
            instance_template_config_is_unchanged_except_for_network_and_name(
                original_instance_template_configs,
                new_instance_template_configs))
        # network changed
        self.assertTrue(
            check_instance_template_network(
                new_instance_template_configs,
                self.test_resource_creator.network_selfLink,
                self.test_resource_creator.subnetwork_selfLink))

        print('Pass the current test')

    def testAsBackendOfTargetPool(self):
        """ The managed instance group serves a target pool.

        Expectation: The migration will not start.

        """
        ### create test resources
        group_name = 'end-to-end-test-managed-instance-group-1'
        instance_group_selfLink = \
            self.test_resource_creator.create_regional_managed_instance_group(
                self.test_resource_creator.legacy_instance_template_selfLink,
                group_name,
                'sample_multi_zone_managed_instance_group.json')[
                'targetLink']
        original_instance_template_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name)

        target_pool_name = 'end-to-end-test-target-pool'
        self.test_resource_creator.create_target_pool_with_health_check(
            'sample_target_pool_with_no_instance.json',
            target_pool_name, [group_name], [],
            health_check_selfLink=None)
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            instance_group_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()
        ### check migration result
        # the migration didn't start
        new_instance_template_configs = self.google_api_interface.get_multi_zone_instance_template_configs(
            group_name)
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                new_instance_template_configs, new_instance_template_configs))
        print('Pass the current test')

    def testAsBackendOfBackendService(self):
        """ The managed instance group serves a backend service.

        Expectation: The migration will fail and rollback.

        """
        ### create test resources
        group_name = 'end-to-end-test-managed-instance-group-1'
        instance_group_selfLink = \
            self.test_resource_creator.create_regional_managed_instance_group(
                self.test_resource_creator.legacy_instance_template_selfLink,
                group_name,
                'sample_multi_zone_managed_instance_group.json')[
                'targetLink'].replace('/instanceGroupManagers/',
                                      '/instanceGroups/')
        original_instance_group_config = self.google_api_interface.get_multi_zone_managed_instance_group_configs(
            group_name)
        backend_service_name = 'end-to-end-test-backend-service'
        self.test_resource_creator.create_regional_backend_service(
            'sample_internal_backend_service.json', backend_service_name,
            [instance_group_selfLink])
        ### start migration
        selfLink_executor = SelfLinkExecutor(
            self.compute,
            instance_group_selfLink,
            self.test_resource_creator.network_name,
            self.test_resource_creator.subnetwork_name,
        )
        with self.assertRaises(MigrationFailed):
            migration_handler = selfLink_executor.build_migration_handler()
            migration_handler.network_migration()

        ### check migration result
        # the migration is failed and the resources are rolled back
        new_instance_group_config = self.google_api_interface.get_multi_zone_managed_instance_group_configs(
            group_name)
        self.assertTrue(
            resource_config_is_unchanged_including_network(
                original_instance_group_config, new_instance_group_config))
        print('Pass the current test')

    def tearDown(self) -> None:
        pass

    def doCleanups(self) -> None:
        self.google_api_interface.clean_all_resources()