Exemplo n.º 1
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()
Exemplo n.º 2
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()