def _MockMakeRequests(requests, batch_url, *unused_args, **unused_kwargs): _ = batch_url, unused_args, unused_kwargs if len(requests) != 1: self.fail('expected to send single request, sent: ' + str(requests)) service = requests[0][0] verb = requests[0][1] if verb == 'AggregatedList': if service == self.compute.instanceGroupManagers: return (test_resources.MakeInstanceGroupManagers(api_version) + test_resources.MakeInstanceGroupManagers( api=api_version, scope_name='region-1', scope_type='region')) elif service == self.compute.instanceGroups: return (test_resources.MakeInstanceGroups(self.messages, api_version) + test_resources.MakeInstanceGroups(self.messages, api=api_version, scope_name='region-1', scope_type='region')) if verb == 'List': if service == self.compute.instanceGroups: return test_resources.MakeInstanceGroups(self.messages, api_version) elif service == self.compute.regionInstanceGroups: return test_resources.MakeInstanceGroups(self.messages, api=api_version, scope_name='region-1', scope_type='region') elif service == self.compute.instanceGroupManagers: return test_resources.MakeInstanceGroupManagers(api_version) elif service == self.compute.regionInstanceGroupManagers: return test_resources.MakeInstanceGroupManagers(api=api_version, scope_name='region-1', scope_type='region') else: self.fail('unexpected request ' + str(requests[0]))
def testAggregatedTableOutputWithNoErrors(self): self.SetupMockGetRegionalResources([]) self.SetupMockGetZonalResources([]) self.list_json.side_effect = [ resource_projector.MakeSerializable( test_resources.MakeInstanceGroupManagers( api=API_VERSION, scope_name='zone-1', scope_type='zone') + test_resources.MakeInstanceGroupManagers(api=API_VERSION, scope_name='region-1', scope_type='region')) ] self.make_requests.side_effect = [[ test_resources.MakeAutoscalerOk(api=API_VERSION, scope_name='region-1', scope_type='region'), test_resources.MakeAutoscalerOk(api=API_VERSION, scope_name='zone-1', scope_type='zone') ]] self.Run('compute instance-groups managed list') self.mock_get_zonal_resources.assert_any_call( service=self.compute.instanceGroups, project='my-project', requested_zones=set(['zone-1']), filter_expr=None, http=self.mock_http(), batch_url=self.batch_url, errors=[]) self.mock_get_regional_resources.assert_any_call( service=self.compute.regionInstanceGroups, project='my-project', requested_regions=set(['region-1']), filter_expr=None, http=self.mock_http(), batch_url=self.batch_url, errors=[]) self.AssertOutputEquals(textwrap.dedent("""\ NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED group-1 zone-1 zone test-instance-name-1 0 1 template-1 yes group-2 zone-1 zone test-instance-name-2 3 10 template-2 no group-3 zone-1 zone test-instance-name-3 10 1 template-2 no group-1 region-1 region test-instance-name-1 0 1 template-1 yes group-2 region-1 region test-instance-name-2 3 10 template-2 no group-3 region-1 region test-instance-name-3 10 1 template-2 no """), normalize_space=True) self.AssertErrEquals('')
def SetupMockGetRegionalResources(self, autoscalers): def _MockGetRegionalResources(service, project, requested_regions, filter_expr, http, batch_url, errors): _ = project, requested_regions, filter_expr, http, batch_url, errors if 'RegionInstanceGroupsService' in str(type(service)): return test_resources.MakeInstanceGroups(msgs=self.messages, api=API_VERSION, scope_name='region-1', scope_type='region') return None lister_patcher = mock.patch( 'googlecloudsdk.api_lib.compute.lister.GetRegionalResources', autospec=True) self.addCleanup(lister_patcher.stop) self.mock_get_regional_resources = lister_patcher.start() self.mock_get_regional_resources.side_effect = _MockGetRegionalResources self.list_json.side_effect = [ resource_projector.MakeSerializable( test_resources.MakeInstanceGroupManagers(api=API_VERSION, scope_name='region-1', scope_type='region')), autoscalers ] self.make_requests.side_effect = [autoscalers]
def testDescribeRegional(self): self.mock_client.regionInstanceGroupManagers.Get.Expect( messages.ComputeRegionInstanceGroupManagersGetRequest( instanceGroupManager='group-1', project='fake-project', region='region-1'), test_resources.MakeInstanceGroupManagers( API_VERSION, scope_type='region', scope_name='region-1')[0] ) self._MockAutoscalerRequest([]) self.Run(""" compute instance-groups managed describe group-1 --region region-1 """) self.assertMultiLineEqual( encoding.Decode(self.stdout.getvalue()), textwrap.dedent("""\ baseInstanceName: test-instance-name-1 creationTimestamp: '2013-09-06T17:54:10.636-07:00' description: Test description. fingerprint: MTIzNA== instanceGroup: {0}/projects/my-project/regions/region-1/instanceGroups/group-1 instanceTemplate: {0}/projects/my-project/global/instanceTemplates/template-1 name: group-1 region: {0}/projects/my-project/regions/region-1 selfLink: {0}/projects/my-project/regions/region-1/instanceGroupManagers/group-1 targetSize: 1 """.format(self.compute_uri)))
def testScopePrompt(self): self.mock_client.instanceGroupManagers.Get.Expect( messages.ComputeInstanceGroupManagersGetRequest( instanceGroupManager='group-1', project='fake-project', zone='zone-2'), test_resources.MakeInstanceGroupManagers(API_VERSION)[0] ) self.StartPatch('googlecloudsdk.core.console.console_io.CanPrompt', return_value=True) self.StartPatch('googlecloudsdk.api_lib.compute.zones.service.List', return_value=[ messages.Zone(name='zone-1'), messages.Zone(name='zone-2')], ) self.StartPatch('googlecloudsdk.api_lib.compute.regions.service.List', return_value=[ messages.Region(name='region-1')], ) self._MockAutoscalerRequest(test_resources.MakeAutoscalers(API_VERSION)) self.WriteInput('3\n') self.Run(""" compute instance-groups managed describe group-1 """) self.AssertErrContains('group-1') self.AssertErrContains('zone-1') self.AssertErrContains('zone-2') self.AssertErrContains('region-1')
def testMultipleZonesUri(self): self.make_requests.side_effect = iter([ [], # No Autoscalers in zone-1 and zone-2 test_resources.MakeInstanceGroupManagers(API_VERSION), ]) self.WriteInput('y') self.Run(""" compute instance-groups managed delete https://compute.googleapis.com/compute/{0}/projects/my-project/zones/zone-2/instanceGroupManagers/group-1 https://compute.googleapis.com/compute/{0}/projects/my-project/zones/zone-1/instanceGroupManagers/group-2 """.format(API_VERSION)) self.CheckRequests( self.autoscalers_list_request_zone_1 + self.autoscalers_list_request_zone_2, [(self.compute.instanceGroupManagers, 'Delete', self.messages.ComputeInstanceGroupManagersDeleteRequest( instanceGroupManager='group-1', project='my-project', zone='zone-2')), (self.compute.instanceGroupManagers, 'Delete', self.messages.ComputeInstanceGroupManagersDeleteRequest( instanceGroupManager='group-2', project='my-project', zone='zone-1'))], ) self.AssertErrContains( r'The following instance group managers will be deleted:\n' r' - [group-1] in [zone-2]\n' r' - [group-2] in [zone-1]') self.AssertErrContains('PROMPT_CONTINUE')
def SetUp(self): self.SelectApi(API_VERSION) self.make_requests.side_effect = iter([ [], # Listed 0 Autoscalers. test_resources.MakeInstanceGroupManagers(API_VERSION), [], ]) self.autoscalers_list_request_zone_1 = [( self.compute.autoscalers, 'List', self.messages.ComputeAutoscalersListRequest( maxResults=500, project='my-project', zone='zone-1', ), )] self.autoscalers_list_request_zone_2 = [( self.compute.autoscalers, 'List', self.messages.ComputeAutoscalersListRequest( maxResults=500, project='my-project', zone='zone-2', ), )]
def testMultipleZonesUriAndFlag(self): self.make_requests.side_effect = iter([ [], # No Autoscalers in any region test_resources.MakeInstanceGroupManagers(API_VERSION, scope_type='region', scope_name='region-1'), ]) self.WriteInput('y') self.Run(""" compute instance-groups managed delete https://compute.googleapis.com/compute/{0}/projects/my-project/regions/region-2/instanceGroupManagers/group-1 group-2 --region region-1 """.format(API_VERSION)) self.CheckRequests( self.autoscalers_list_request_region_1 + self.autoscalers_list_request_region_2, [(self.compute.regionInstanceGroupManagers, 'Delete', self.messages.ComputeRegionInstanceGroupManagersDeleteRequest( instanceGroupManager='group-1', project='my-project', region='region-2')), (self.compute.regionInstanceGroupManagers, 'Delete', self.messages.ComputeRegionInstanceGroupManagersDeleteRequest( instanceGroupManager='group-2', project='my-project', region='region-1'))], ) self.AssertErrContains( r'The following region instance group managers will be deleted:\n' r' - [group-1] in [region-2]\n' r' - [group-2] in [region-1]') self.AssertErrContains('PROMPT_CONTINUE')
def testZoneAndRegion(self): self.make_requests.side_effect = iter([ test_resources.MakeAutoscalers('beta', scope_type='zone', scope_name='zone-1'), test_resources.MakeAutoscalers('beta', scope_type='region', scope_name='region-1'), test_resources.MakeInstanceGroupManagers('beta', scope_type='zone', scope_name='zone-1'), test_resources.MakeInstanceGroupManagers('beta', scope_type='region', scope_name='region-1'), [], # Deleting 0 Autoscalers. ]) self.WriteInput('y') self.Run(""" beta compute instance-groups managed delete https://compute.googleapis.com/compute/{0}/projects/my-project/zones/zone-1/instanceGroupManagers/group-1 https://compute.googleapis.com/compute/{0}/projects/my-project/regions/region-1/instanceGroupManagers/group-2 """.format(API_VERSION)) self.AssertErrContains( r'The following instance group managers will be deleted:\n' r' - [group-1]\n' r' - [group-2] in [region-1]') self.AssertErrContains('PROMPT_CONTINUE') self.CheckRequests( self.autoscalers_list_request_zone_1 + self.autoscalers_list_request_region_1, [(self.compute.autoscalers, 'Delete', self.messages.ComputeAutoscalersDeleteRequest( autoscaler='autoscaler-1', project='my-project', zone='zone-1'))], [(self.compute.instanceGroupManagers, 'Delete', self.messages.ComputeInstanceGroupManagersDeleteRequest( instanceGroupManager='group-1', project='my-project', zone='zone-1')), (self.compute.regionInstanceGroupManagers, 'Delete', self.messages.ComputeRegionInstanceGroupManagersDeleteRequest( instanceGroupManager='group-2', project='my-project', region='region-1'))], )
def _ExpectGetManagedInstanceGroup(self): if self.scope is scope_util.ScopeEnum.REGION: request = self._MakeGetManagedInstanceGroupRegionRequest() if self.scope is scope_util.ScopeEnum.ZONE: request = self._MakeGetManagedInstanceGroupZoneRequest() instance_group_managers = test_resources.MakeInstanceGroupManagers( self.api) self._ExpectRequest(request, instance_group_managers[:1])
def testPromptingWithYes(self): self.make_requests.side_effect = iter([ test_resources.MakeAutoscalers(API_VERSION, scope_type='region', scope_name='region-1'), test_resources.MakeInstanceGroupManagers(API_VERSION, scope_type='region', scope_name='region-1'), [], ]) self.WriteInput('y') self.Run(""" compute instance-groups managed delete group-1 group-2 group-3 --region region-1 """) self.CheckRequests( self.autoscalers_list_request_region_1, [(self.compute.regionAutoscalers, 'Delete', self.messages.ComputeRegionAutoscalersDeleteRequest( autoscaler='autoscaler-1', project='my-project', region='region-1')), (self.compute.regionAutoscalers, 'Delete', self.messages.ComputeRegionAutoscalersDeleteRequest( autoscaler='autoscaler-2', project='my-project', region='region-1')), (self.compute.regionAutoscalers, 'Delete', self.messages.ComputeRegionAutoscalersDeleteRequest( autoscaler='autoscaler-3', project='my-project', region='region-1'))], [(self.compute.regionInstanceGroupManagers, 'Delete', self.messages.ComputeRegionInstanceGroupManagersDeleteRequest( instanceGroupManager='group-1', project='my-project', region='region-1')), (self.compute.regionInstanceGroupManagers, 'Delete', self.messages.ComputeRegionInstanceGroupManagersDeleteRequest( instanceGroupManager='group-2', project='my-project', region='region-1')), (self.compute.regionInstanceGroupManagers, 'Delete', self.messages.ComputeRegionInstanceGroupManagersDeleteRequest( instanceGroupManager='group-3', project='my-project', region='region-1'))], ) self.AssertErrContains( r'The following region instance group managers will be deleted:\n' r' - [group-1] in [region-1]\n' r' - [group-2] in [region-1]\n' r' - [group-3] in [region-1]') self.AssertErrContains('PROMPT_CONTINUE')
def _SetUpZonal(self, api_version): self.SelectApi(api_version) self.zone = 'us-central2-a' self.scope_params = ('zone', self.zone) self.make_requests.side_effect = iter([ [ self.messages.Zone(name=self.zone), ], [ test_resources.MakeInstanceGroupManagers( api_version, scope_name=self.zone)[0], ], [ test_resources.MakeInstanceGroups(self.messages, api_version, scope_name=self.zone)[0], ], [ test_resources.MakeAutoscalers(api_version, scope_name=self.zone)[0], ], ]) self.zone_1_get_request = [ (self.compute.zones, 'Get', self.messages.ComputeZonesGetRequest(project='my-project', zone=self.zone)) ] self.zone_ig_list_request = [ (self.compute.instanceGroups, 'List', self.messages.ComputeInstanceGroupsListRequest( maxResults=500, project='my-project', zone=self.zone, )) ] self.zone_as_list_request = [ (self.compute.autoscalers, 'List', self.messages.ComputeAutoscalersListRequest(maxResults=500, project='my-project', zone=self.zone)) ] self.template_1_uri = ( '{0}/projects/my-project/global/instanceTemplates/template-1'. format(self.compute_uri)) self.http_health_check_uri = ( '{0}/projects/my-project/global/httpHealthChecks/health-check-1'. format(self.compute_uri)) self.https_health_check_uri = ( '{0}/projects/my-project/global/httpsHealthChecks/health-check-2'. format(self.compute_uri))
def testDescribeAutoscaledRegional(self): self.mock_client.regionInstanceGroupManagers.Get.Expect( messages.ComputeRegionInstanceGroupManagersGetRequest( instanceGroupManager='group-1', project='fake-project', region='region-1'), test_resources.MakeInstanceGroupManagers( API_VERSION, scope_type='region', scope_name='region-1')[0] ) self._MockAutoscalerRequest(test_resources.MakeAutoscalers( API_VERSION, scope_name='region-1', scope_type='region')) self.Run(""" compute instance-groups managed describe group-1 --region region-1 """) self.assertMultiLineEqual( encoding.Decode(self.stdout.getvalue()), textwrap.dedent("""\ autoscaler: autoscalingPolicy: coolDownPeriodSec: 60 cpuUtilization: utilizationTarget: 0.8 customMetricUtilizations: - metric: custom.cloudmonitoring.googleapis.com/seconds utilizationTarget: 60.0 utilizationTargetType: DELTA_PER_MINUTE loadBalancingUtilization: utilizationTarget: 0.9 maxNumReplicas: 10 minNumReplicas: 2 creationTimestamp: Two days ago id: '1' name: autoscaler-1 region: {0}/projects/my-project/regions/region-1 selfLink: {0}/projects/my-project/regions/region-1/autoscalers/autoscaler-1 target: {0}/projects/my-project/regions/region-1/instanceGroupManagers/group-1 baseInstanceName: test-instance-name-1 creationTimestamp: '2013-09-06T17:54:10.636-07:00' description: Test description. fingerprint: MTIzNA== instanceGroup: {0}/projects/my-project/regions/region-1/instanceGroups/group-1 instanceTemplate: {0}/projects/my-project/global/instanceTemplates/template-1 name: group-1 region: {0}/projects/my-project/regions/region-1 selfLink: {0}/projects/my-project/regions/region-1/instanceGroupManagers/group-1 targetSize: 1 """.format(self.compute_uri)))
def _SetUpRegional(self, api_version): self.SelectApi(api_version) self.region = 'us-central2' self.scope_params = ('region', self.region) self.make_requests.side_effect = iter([ [ test_resources.MakeInstanceGroupManagers( api_version, scope_name=self.region, scope_type='region')[0], ], [ test_resources.MakeInstanceGroups(self.messages, api_version, scope_name=self.region, scope_type='region')[0], ], [ test_resources.MakeAutoscalers(api_version, scope_name=self.region, scope_type='region')[0], ], ]) self.region_ig_list_request = [ (self.compute.regionInstanceGroups, 'List', self.messages.ComputeRegionInstanceGroupsListRequest( maxResults=500, project='my-project', region=self.region, )) ] self.region_as_list_request = [ (self.compute.regionAutoscalers, 'List', self.messages.ComputeRegionAutoscalersListRequest( maxResults=500, project='my-project', region=self.region)) ] self.template_1_uri = ( '{0}/projects/my-project/global/instanceTemplates/template-1'. format(self.compute_uri)) self.http_health_check_uri = ( '{0}/projects/my-project/global/httpHealthChecks/health-check-1'. format(self.compute_uri)) self.https_health_check_uri = ( '{0}/projects/my-project/global/httpsHealthChecks/health-check-2'. format(self.compute_uri)) self.region_uri = ('{0}/projects/my-project/regions/{1}'.format( self.compute_uri, self.region))
def testScopePrompting(self): self.StartPatch('googlecloudsdk.core.console.console_io.CanPrompt', return_value=True) self.make_requests.side_effect = iter([ [self.messages.Region(name='region-1')], [ self.messages.Zone(name='zone-2'), self.messages.Zone(name='zone-1') ], test_resources.MakeAutoscalers(API_VERSION), test_resources.MakeInstanceGroupManagers(API_VERSION), [], # Deleting 0 Autoscalers. ]) self.WriteInput('2\ny') self.Run(""" compute instance-groups managed delete group-1 group-2 """) self.CheckRequests( self.regions_list_request, self.zones_list_request, self.autoscalers_list_request_zone_1, [(self.compute.autoscalers, 'Delete', self.messages.ComputeAutoscalersDeleteRequest( autoscaler='autoscaler-1', project='my-project', zone='zone-1')), (self.compute.autoscalers, 'Delete', self.messages.ComputeAutoscalersDeleteRequest( autoscaler='autoscaler-2', project='my-project', zone='zone-1'))], [(self.compute.instanceGroupManagers, 'Delete', self.messages.ComputeInstanceGroupManagersDeleteRequest( instanceGroupManager='group-1', project='my-project', zone='zone-1')), (self.compute.instanceGroupManagers, 'Delete', self.messages.ComputeInstanceGroupManagersDeleteRequest( instanceGroupManager='group-2', project='my-project', zone='zone-1'))], )
def _MockGetZonalResources(service, project, requested_zones, filter_expr, http, batch_url, errors): _ = project, requested_zones, filter_expr, http, batch_url, errors if service == self.compute.instanceGroupManagers: return test_resources.MakeInstanceGroupManagers(API_VERSION) if service == self.compute.instanceGroups: non_zonal_group = (self.messages.InstanceGroup( name='regional-group', selfLink=('https://compute.googleapis.com/compute/{0}/' 'projects/my-project/regions/region-1/' 'instanceGroups/group-1'.format(API_VERSION)), creationTimestamp='2013-09-06T17:54:10.636-07:00', description='Test regional instance group', fingerprint=b'123', namedPorts=[], size=0, )) return (test_resources.MakeInstanceGroups( self.messages, API_VERSION) + [non_zonal_group]) return None
def SetUp(self): self.SelectApi(API_VERSION) self.make_requests.side_effect = iter([ [test_resources.MakeInstanceGroups(self.messages, API_VERSION)[0]], [test_resources.MakeInstanceGroupManagers(API_VERSION)[0]], ])
class InstanceGroupManagersSetAutoscalingZonalTest(test_base.BaseTest): INSTANCE_GROUP_MANAGERS = ( test_resources.MakeInstanceGroupManagers(API_VERSION)) AUTOSCALERS = test_resources.MakeAutoscalers(API_VERSION) def SetUp(self): self.SelectApi(API_VERSION) self.track = calliope_base.ReleaseTrack.ALPHA self.make_requests.side_effect = iter([ [self.INSTANCE_GROUP_MANAGERS[0]], # Get IGM. self.AUTOSCALERS[1:], [] # Insert autoscaler. ]) self.StartObjectPatch(random, 'choice').return_value = 'a' self.autoscalers_list_request = [ ( self.compute.autoscalers, 'List', self.messages.ComputeAutoscalersListRequest( maxResults=500, project='my-project', zone='zone-1', ), ), ] self.managed_instance_group_get_request = [ ( self.compute.instanceGroupManagers, 'Get', self.messages.ComputeInstanceGroupManagersGetRequest( instanceGroupManager='group-1', project='my-project', zone='zone-1', ), ) ] self.managed_instance_group_self_link = ( '{0}/projects/my-project/zones/zone-1/instanceGroupManagers/group-1' .format(self.compute_uri) ) def testInsertMinimalAutoscaler(self): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1') request = self.messages.ComputeAutoscalersInsertRequest( autoscaler=self.messages.Autoscaler( autoscalingPolicy=self.messages.AutoscalingPolicy( customMetricUtilizations=[], maxNumReplicas=10, ), name='group-1-aaaa', target=self.managed_instance_group_self_link, ), project='my-project', zone='zone-1', ) self.CheckRequests( self.managed_instance_group_get_request, self.autoscalers_list_request, [(self.compute.autoscalers, 'Insert', request)], ) def testUpdateMinimalAutoscalerWithScopePrompt(self): self.StartPatch('googlecloudsdk.core.console.console_io.CanPrompt', return_value=True) self.WriteInput('2\n') self.make_requests.side_effect = iter([ [self.messages.Region(name='region-1')], [self.messages.Zone(name='zone-1'), self.messages.Zone(name='zone-2')], [self.INSTANCE_GROUP_MANAGERS[0]], self.AUTOSCALERS, [] ]) self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10') request = self.messages.ComputeAutoscalersUpdateRequest( autoscaler='autoscaler-1', autoscalerResource=self.messages.Autoscaler( autoscalingPolicy=self.messages.AutoscalingPolicy( customMetricUtilizations=[ self.messages.AutoscalingPolicyCustomMetricUtilization( metric='custom.cloudmonitoring.googleapis.com/seconds', utilizationTarget=60.0, utilizationTargetType=_GetUtilizationTargetType( self.messages, 'DELTA_PER_MINUTE'), ) ], maxNumReplicas=10, ), name='autoscaler-1', target=self.managed_instance_group_self_link, ), project='my-project', zone='zone-1', ) self.CheckRequests( self.regions_list_request, self.zones_list_request, self.managed_instance_group_get_request, self.autoscalers_list_request, [(self.compute.autoscalers, 'Update', request)], ) def testInsertAutoscalerWithEverything(self): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 ' '--zone zone-1 ' '--cool-down-period 1m ' '--description whatever ' '--min-num-replicas 5 ' '--max-num-replicas 10 ' '--scale-based-on-cpu --target-cpu-utilization 0.5 ' '--scale-based-on-load-balancing ' '--target-load-balancing-utilization 0.8 ' '--custom-metric-utilization metric=metric1,utilization-target=1,' 'utilization-target-type=GAUGE ' '--custom-metric-utilization metric=metric2,utilization-target=2,' 'utilization-target-type=DELTA_PER_SECOND ' '--custom-metric-utilization metric=metric3,utilization-target=3,' 'utilization-target-type=DELTA_PER_MINUTE ' ) request = self.messages.ComputeAutoscalersInsertRequest( autoscaler=self.messages.Autoscaler( autoscalingPolicy=self.messages.AutoscalingPolicy( cpuUtilization=self.messages.AutoscalingPolicyCpuUtilization( utilizationTarget=0.5, ), customMetricUtilizations=[ self.messages.AutoscalingPolicyCustomMetricUtilization( metric='metric1', utilizationTarget=1.0, utilizationTargetType=_GetUtilizationTargetType( self.messages, 'GAUGE'), ), self.messages.AutoscalingPolicyCustomMetricUtilization( metric='metric2', utilizationTarget=2.0, utilizationTargetType=_GetUtilizationTargetType( self.messages, 'DELTA_PER_SECOND'), ), self.messages.AutoscalingPolicyCustomMetricUtilization( metric='metric3', utilizationTarget=3.0, utilizationTargetType=_GetUtilizationTargetType( self.messages, 'DELTA_PER_MINUTE'), ), ], loadBalancingUtilization=( self.messages.AutoscalingPolicyLoadBalancingUtilization)( utilizationTarget=0.8, ), maxNumReplicas=10, minNumReplicas=5, coolDownPeriodSec=60, ), description='whatever', name='group-1-aaaa', target=self.managed_instance_group_self_link, ), project='my-project', zone='zone-1', ) self.CheckRequests( self.managed_instance_group_get_request, self.autoscalers_list_request, [(self.compute.autoscalers, 'Insert', request)], ) def testAssertsIgmExists(self): def MakeRequests(*_, **kwargs): kwargs['errors'].append((404, 'Not Found')) yield self.make_requests.side_effect = MakeRequests with self.assertRaisesRegex( managed_instance_groups_utils.ResourceNotFoundException, 'Could not fetch resource:'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1') self.CheckRequests(self.managed_instance_group_get_request) def testAssertsPositiveMinSize(self): with self.AssertRaisesArgumentErrorRegexp( r'argument --min-num-replicas: Value must be greater than or equal to ' r'0; received: -1'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--min-num-replicas -1') def testAssertsPositiveMaxSize(self): with self.AssertRaisesArgumentErrorRegexp( r'argument --max-num-replicas: Value must be greater than or equal to ' r'0; received: -1'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas -10 --zone zone-1') def testAssertsMaxSizeGreaterThanMinSize(self): with self.assertRaisesRegex( exceptions.InvalidArgumentException, r'Invalid value for \[--max-num-replicas\]: can\'t be less than min ' r'num replicas\.'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--min-num-replicas 11') def testAssertsCpuTargetIsPositive(self): with self.AssertRaisesArgumentErrorRegexp( r'argument --target-cpu-utilization: ' r'Value must be greater than or equal to 0.0; received: -0.1\d*'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--target-cpu-utilization -0.11') def testAssertsCpuTargetNotAboveOne(self): with self.AssertRaisesArgumentErrorRegexp( r'argument --target-cpu-utilization: ' r'Value must be less than or equal to 1.0; received: 1.1\d*'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--target-cpu-utilization 1.1') def testAssertsCustomMetricSpecificationComplete(self): with self.assertRaisesRegex( exceptions.InvalidArgumentException, r'Invalid value for \[--custom-metric-utilization\]: metric not ' r'present\.'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--custom-metric-utilization utilization-target=1,' 'utilization-target-type=GAUGE') def testAssertsCustomMetricTargetPositive(self): with self.assertRaisesRegex( exceptions.InvalidArgumentException, r'Invalid value for ' r'\[--custom-metric-utilization utilization-target\]: less than 0\.'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--custom-metric-utilization utilization-target=-1,' 'utilization-target-type=GAUGE,metric=metric') def testAssertsLbTargetPositive(self): with self.AssertRaisesArgumentErrorRegexp( r'argument --target-load-balancing-utilization: ' r'Value must be greater than or equal to 0.0; received: -0.1\d*'): self.Run('compute instance-groups managed set-autoscaling group-1 ' '--max-num-replicas 10 --zone zone-1 ' '--target-load-balancing-utilization -0.11')
class InstanceGroupManagersStopAutoscalingZonalTest(test_base.BaseTest): INSTANCE_GROUP_MANAGERS = test_resources.MakeInstanceGroupManagers( api=API_VERSION) AUTOSCALERS = test_resources.MakeAutoscalers(api=API_VERSION) def SetUp(self): self.SelectApi(API_VERSION) self.autoscalers_list_request = [ ( self.compute.autoscalers, 'List', self.messages.ComputeAutoscalersListRequest( maxResults=500, project='my-project', zone='zone-1', ), ), ] self.managed_instance_group_get_request = [( self.compute.instanceGroupManagers, 'Get', self.messages.ComputeInstanceGroupManagersGetRequest( instanceGroupManager='group-1', project='my-project', zone='zone-1', ), )] def testStopAutoscalingNotAutoscaledManagedInstanceGroup(self): self.make_requests.side_effect = iter([ [self.INSTANCE_GROUP_MANAGERS[0]], self.AUTOSCALERS[1:], ]) with self.assertRaisesRegex( managed_instance_groups_utils.ResourceNotFoundException, r'The managed instance group is not autoscaled\.'): self.Run( 'compute instance-groups managed stop-autoscaling group-1 ' '--zone zone-1') self.CheckRequests(self.managed_instance_group_get_request, self.autoscalers_list_request) def testStopAutoscalingAutoscaledManagedInstanceGroupWithPrompt(self): self.StartPatch('googlecloudsdk.core.console.console_io.CanPrompt', return_value=True) self.WriteInput('2\n') self.make_requests.side_effect = iter([ [self.messages.Region(name='region-1')], [ self.messages.Zone(name='zone-1'), self.messages.Zone(name='zone-2') ], [self.INSTANCE_GROUP_MANAGERS[0]], self.AUTOSCALERS, [] # Delete Autoscaler. ]) self.Run('compute instance-groups managed stop-autoscaling group-1') delete_request = self.messages.ComputeAutoscalersDeleteRequest( project='my-project', zone='zone-1', autoscaler='autoscaler-1') self.CheckRequests( self.regions_list_request, self.zones_list_request, self.managed_instance_group_get_request, self.autoscalers_list_request, [(self.compute.autoscalers, 'Delete', delete_request)], ) def testAssertsIgmExists(self): def MakeRequests(*_, **kwargs): kwargs['errors'].append((404, 'Not Found')) yield self.make_requests.side_effect = MakeRequests with self.assertRaisesRegex( managed_instance_groups_utils.ResourceNotFoundException, 'Could not fetch resource:'): self.Run( 'compute instance-groups managed stop-autoscaling group-1 ' '--zone zone-1') self.CheckRequests(self.managed_instance_group_get_request)