Ejemplo n.º 1
0
    def test_should_raise_exception_if_stack_creation_lasts_longer_than_timeout(
            self):
        stack_name = 'test-stack'
        stack_version = 'test-version'
        image_version = '0.0.0'
        timeout = 0

        senza_wrapper = SenzaWrapper(TEST_CONFIG)
        senza_wrapper.set_stack_creation_retry_timeout(timeout)

        create_mock = MagicMock(return_value=0)
        subprocess.call = create_mock

        events_mock = MagicMock()
        subprocess.check_output = events_mock

        with self.assertRaisesRegex(
                Exception, 'Timeout while creating new stack version'):
            senza_wrapper.create_stack(stack_name, stack_version,
                                       image_version)

        create_mock.assert_called_once_with([
            'senza', 'create', '--region', 'eu-west-1', '--disable-rollback',
            TEST_CONFIG, stack_version, 'ImageVersion=' + image_version
        ])

        events_mock.assert_not_called()
Ejemplo n.º 2
0
    def test_should_not_raise_exceptions_when_executing_all_bootstrap_steps(
            self):
        senza_mock = SenzaWrapper(CONFIG)
        senza_create_mock = senza_mock.create_stack = MagicMock()
        senza_switch_mock = senza_mock.switch_traffic = MagicMock(
            return_value=True)
        os.listdir = MagicMock(side_effect=self.__side_effect_config_list)
        controller = ClusterBootstrapController(
            base_url=BASE_URL,
            stack_name=STACK_NAME,
            sharding_level=SHARDING_LEVEL,
            replication_factor=REPLICATION_FACTOR,
            image_version=IMAGE_VERSION,
            oauth_token=OAUTH_TOKEN,
            senza_wrapper=senza_mock)
        controller.set_retry_count(1)
        controller.set_retry_wait(0)

        urlopen_mock = MagicMock(
            side_effect=self.__side_effect_return_cluster_state)
        urllib.request.urlopen = urlopen_mock

        controller.bootstrap_cluster()

        senza_create_mock.assert_called_once_with(STACK_NAME,
                                                  INITIAL_BOOTSTRAP_VERSION,
                                                  IMAGE_VERSION)
        senza_switch_mock.assert_called_once_with(STACK_NAME,
                                                  INITIAL_BOOTSTRAP_VERSION,
                                                  100)
Ejemplo n.º 3
0
    def test_should_write_warning_when_waiting_for_cluster_to_be_ready_and_timeout_on_cluster_state(
            self, log):
        senza_mock = SenzaWrapper(CONFIG)
        controller = ClusterBootstrapController(
            base_url=BASE_URL,
            stack_name=STACK_NAME,
            sharding_level=SHARDING_LEVEL,
            replication_factor=REPLICATION_FACTOR,
            image_version=IMAGE_VERSION,
            oauth_token=OAUTH_TOKEN,
            senza_wrapper=senza_mock)
        controller.set_retry_count(1)
        controller.set_retry_wait(0)

        urlopen_mock = MagicMock(side_effect=self.__side_effect_timeout)
        urllib.request.urlopen = urlopen_mock

        controller.wait_for_cluster_to_be_ready()

        log.check(
            ('root', 'WARNING',
             'Clould not get cluster state: Failed sending request to Solr '
             '[' + BASE_URL +
             '/admin/collections?action=CLUSTERSTATUS&wt=json]: '
             'HTTP Error 504: None'),
            ('root', 'WARNING', 'Cluster is not ready, yet, retrying ...'),
            ('root', 'WARNING',
             'Clould not get cluster state: Failed sending request to Solr '
             '[' + BASE_URL +
             '/admin/collections?action=CLUSTERSTATUS&wt=json]: '
             'HTTP Error 504: None'),
            ('root', 'WARNING', 'Cluster is not ready, yet, retrying ...'),
            ('root', 'WARNING', 'Cluster did not become ready in time.'))
Ejemplo n.º 4
0
    def test_should_write_warning_when_waiting_for_cluster_to_be_ready_and_not_enough_nodes_are_available(
            self, log):
        senza_mock = SenzaWrapper(CONFIG)
        sharding_level = SHARDING_LEVEL + 1
        controller = ClusterBootstrapController(
            base_url=BASE_URL,
            stack_name=STACK_NAME,
            sharding_level=sharding_level,
            replication_factor=REPLICATION_FACTOR,
            image_version=IMAGE_VERSION,
            oauth_token=OAUTH_TOKEN,
            senza_wrapper=senza_mock)
        controller.set_retry_count(1)
        controller.set_retry_wait(0)

        urlopen_mock = MagicMock(
            side_effect=self.__side_effect_return_cluster_state)
        urllib.request.urlopen = urlopen_mock

        controller.wait_for_cluster_to_be_ready()

        log.check(
            ('root', 'WARNING', 'Cluster is not ready, yet, retrying ...'),
            ('root', 'WARNING', 'Cluster is not ready, yet, retrying ...'),
            ('root', 'WARNING', 'Cluster did not become ready in time.'))
Ejemplo n.º 5
0
 def setUp(self):
     senza_wrapper = SenzaWrapper(CONFIG)
     self.__controller = ClusterBootstrapController(
         base_url=BASE_URL,
         stack_name=STACK_NAME,
         sharding_level=SHARDING_LEVEL,
         replication_factor=REPLICATION_FACTOR,
         image_version=IMAGE_VERSION,
         oauth_token=OAUTH_TOKEN,
         senza_wrapper=senza_wrapper)
     self.__controller.set_retry_count(1)
     self.__controller.set_retry_wait(0)
Ejemplo n.º 6
0
    def test_should_not_raise_any_exception_when_creating_a_new_cluster(self):
        senza_mock = SenzaWrapper(CONFIG)
        senza_create_mock = senza_mock.create_stack = MagicMock()

        controller = ClusterBootstrapController(
            base_url=BASE_URL,
            stack_name=STACK_NAME,
            sharding_level=SHARDING_LEVEL,
            replication_factor=REPLICATION_FACTOR,
            image_version=IMAGE_VERSION,
            oauth_token=OAUTH_TOKEN,
            senza_wrapper=senza_mock)
        controller.create_cluster()

        senza_create_mock.assert_called_once_with(STACK_NAME,
                                                  INITIAL_BOOTSTRAP_VERSION,
                                                  IMAGE_VERSION)
Ejemplo n.º 7
0
    def test_should_create_stack_with_additional_senza_parameter(self):
        stack_name = 'test-stack'
        stack_version = 'test-version'
        image_version = '0.0.0'
        timeout = 1

        senza_wrapper = SenzaWrapper(TEST_CONFIG)
        senza_wrapper.set_stack_creation_retry_timeout(timeout)

        senza_wrapper.add_parameter("test-key", "test-value")

        create_mock = MagicMock(return_value=0)
        subprocess.call = create_mock

        events = [{
            'stack_name': stack_name,
            'version': stack_version,
            'resource_type': 'CloudFormation::Stack',
            'event_time': '0',
            'ResourceStatus': 'CREATE_COMPLETE'
        }]
        events_mock = MagicMock(
            return_value=bytes(json.dumps(events), encoding='utf-8'))
        subprocess.check_output = events_mock

        senza_wrapper.create_stack(stack_name, stack_version, image_version)

        create_mock.assert_called_once_with([
            'senza', 'create', '--region', 'eu-west-1', '--disable-rollback',
            TEST_CONFIG, stack_version, 'ImageVersion=' + image_version,
            'test-key=test-value'
        ])
        events_mock.assert_called_once_with([
            'senza', 'events', '--region', 'eu-west-1', '--output', 'json',
            stack_name, stack_version
        ])
Ejemplo n.º 8
0
 def setup_method(self, method):
     self.__senza_wrapper = SenzaWrapper(TEST_CONFIG)
     self.__senza_wrapper.set_retry_wait(0)
     self.__senza_wrapper.set_stack_creation_retry_timeout(1)
     self.__senza_wrapper.set_stack_creation_retry_wait(0)
Ejemplo n.º 9
0
def solrcloud_cli(cli_args):
    parser = build_args_parser()
    args = parser.parse_args(cli_args)

    if not args.config:
        args.config = os.path.expanduser(DEFAULT_CONF_FILE)

    if not os.path.exists(args.config):
        print('Configuration file does not exist:', args.config)
        parser.print_usage()
        return

    with open(args.config, 'rb') as fd:
        settings = yaml.load(fd)

    senza_wrapper = SenzaWrapper(args.senza_configuration)
    if args.region:
        senza_wrapper.set_region(args.region)

    for key, value in settings.items():
        senza_wrapper.add_parameter(key, value)

    if args.command in ['bootstrap']:
        controller = ClusterBootstrapController(
            base_url=settings['SolrBaseUrl'],
            stack_name=settings['ApplicationId'],
            sharding_level=args.sharding_level,
            replication_factor=args.replication_level,
            image_version=args.image_version,
            oauth_token=args.token,
            senza_wrapper=senza_wrapper)
    elif args.command in [
            'deploy', 'create-new-cluster', 'delete-old-cluster',
            'add-new-nodes', 'delete-old-nodes', 'switch'
    ]:
        controller = ClusterDeploymentController(
            base_url=settings['SolrBaseUrl'],
            stack_name=settings['ApplicationId'],
            image_version=args.image_version,
            oauth_token=args.token,
            senza_wrapper=senza_wrapper)
    elif args.command in ['delete']:
        controller = ClusterDeleteController(
            base_url=settings['SolrBaseUrl'],
            stack_name=settings['ApplicationId'],
            oauth_token=args.token,
            senza_wrapper=senza_wrapper)
    else:
        print('Unknown command:', args.command)
        parser.print_usage()
        return

    if args.command == 'bootstrap':
        controller.bootstrap_cluster()
    elif args.command == 'deploy':
        controller.deploy_new_version()
    elif args.command == 'delete':
        controller.delete_cluster()
    elif args.command == 'create-new-cluster':
        controller.create_cluster()
    elif args.command == 'delete-old-cluster':
        controller.delete_cluster()
    elif args.command == 'add-new-nodes':
        controller.add_new_nodes_to_cluster()
    elif args.command == 'delete-old-nodes':
        controller.delete_old_nodes_from_cluster()
    elif args.command == 'switch':
        controller.switch_traffic()