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()
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)
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.'))
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.'))
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)
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)
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 ])
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)
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()