def create_group(self, **kwargs): """ :return: a tuple of the scaling group with (the helper's pool) and the server name prefix used for the scaling group. """ if self.clbs: # allow us to override the CLB setup kwargs.setdefault( 'use_lbs', [clb.scaling_group_spec() for clb in self.clbs]) kwargs.setdefault("flavor_ref", flavor_ref) kwargs.setdefault("min_entities", 0) server_name_prefix = "{}-{}".format( random_string(), reactor.seconds()) if "server_name_prefix" in kwargs: server_name_prefix = "{}-{}".format(kwargs['server_name_prefix'], server_name_prefix) kwargs['server_name_prefix'] = server_name_prefix return ( ScalingGroup( group_config=create_scaling_group_dict(**kwargs), treq=self.treq, pool=self.pool), server_name_prefix)
def test_scaling_down(self): """ Verify that a basic scale down operation completes as expected. """ scaling_group_body = autoscale.create_scaling_group_dict( image_ref=image_ref, flavor_ref=flavor_ref, name="tr-scaledown-conf", ) self.scaling_group = autoscale.ScalingGroup( group_config=scaling_group_body, pool=self.pool ) self.scaling_policy_up_2 = autoscale.ScalingPolicy( scale_by=2, scaling_group=self.scaling_group ) self.scaling_policy_down_1 = autoscale.ScalingPolicy( scale_by=-1, scaling_group=self.scaling_group ) rcs = TestResources() d = ( self.identity.authenticate_user( rcs, resources={ "otter": ("autoscale", "http://localhost:9000/v1.0/{0}"), "loadbalancers": ("cloudLoadBalancers",), }, region=region ).addCallback(print_token_and_ep) .addCallback(self.scaling_group.start, self) .addCallback(self.scaling_policy_up_2.start, self) .addCallback(self.scaling_policy_up_2.execute) .addCallback(self.scaling_group.wait_for_N_servers, 2, timeout=1800) .addCallback( lambda _: self.scaling_group.get_scaling_group_state(rcs)) .addCallback(dump_state) .addCallback(lambda _: rcs) .addCallback(self.scaling_policy_down_1.start, self) .addCallback(self.scaling_policy_down_1.execute) .addCallback(self.scaling_group.wait_for_N_servers, 1, timeout=900) .addCallback( lambda _: self.scaling_group.get_scaling_group_state(rcs) ).addCallback(dump_state) ) return d
def create_servers(self, rcs, num, wait_for=None): """ Create some number of servers using just Nova, and wait until they are active. This uses the same default server arguments as `create_group`. :param TestResources rcs: An instance of :class:`otter.integration.lib.resources.TestResources` :param int num: The number of servers to create. :param wait_for: What state to wait for for those servers - by default, it waits just for them to be active :return: an iterable of server details JSON of the created servers. """ image_id = yield fetch_ubuntu_image_id(rcs, self.pool) as_args = create_scaling_group_dict( image_ref=image_id, flavor_ref=flavor_ref) server_args = as_args['launchConfiguration']['args'] server_args['server']['name'] = "autogenerated-non-as-test-server" if wait_for is None: wait_for = ContainsDict({'status': Equals("ACTIVE")}) server_ids = yield gatherResults([ create_server(rcs, self.pool, server_args) for _ in range(num)]) self.test_case.addCleanup(delete_servers, server_ids, rcs, self.pool) servers = yield wait_for_servers( rcs, self.pool, # The list of active servers' ids has the created server ids AfterPreprocessing( lambda servers: [s for s in servers if s['id'] in server_ids], AllMatch(wait_for) ) ) returnValue( [server for server in servers if server['id'] in server_ids])
def test_scaling_up(self): scaling_group_body = autoscale.create_scaling_group_dict( image_ref=image_ref, flavor_ref=flavor_ref, name="my-group-configuration" ) self.scaling_group = autoscale.ScalingGroup( group_config=scaling_group_body, pool=self.pool ) self.scaling_policy = autoscale.ScalingPolicy( scale_by=2, scaling_group=self.scaling_group ) rcs = TestResources() d = ( self.identity.authenticate_user( rcs, resources={ "otter": ("autoscale", "http://localhost:9000/v1.0/{0}"), "loadbalancers": ("cloudLoadBalancers",), }, region=region, ).addCallback(print_token_and_ep) .addCallback(self.scaling_group.start, self) .addCallback(dump_groups) .addCallback(self.scaling_policy.start, self) .addCallback(self.scaling_policy.execute) .addCallback( self.scaling_group.wait_for_N_servers, 2, timeout=1800 ).addCallback( lambda _: self.scaling_group.get_scaling_group_state(rcs) ).addCallback(dump_state) ) return d