def test_get_event(self): fields = {'stack_id': 'teststack', 'resource_name': 'testresource', 'event_id': '1'} class FakeAPI(object): """Fake API and ensure request url is correct.""" def json_request(self, *args, **kwargs): expect = ('GET', '/stacks/teststack%2Fabcd1234/resources' '/testresource/events/1') assert args == expect return {}, {'event': []} def get(self, *args, **kwargs): pass manager = events.EventManager(FakeAPI()) with mock.patch('heatclient.v1.events.Event'): self.m.StubOutWithMock(manager, '_resolve_stack_id') self.m.StubOutWithMock(utils, 'get_response_body') utils.get_response_body(mox.IgnoreArg()).AndReturn({'event': []}) manager._resolve_stack_id('teststack').AndReturn( 'teststack/abcd1234') self.m.ReplayAll() manager.get(**fields)
def create(self, **kwargs): """Create a stack.""" headers = self.client.credentials_headers() resp = self.client.post('/stacks', data=kwargs, headers=headers) body = utils.get_response_body(resp) return body
def test_redirect_302_location(self): fake1 = fakes.FakeHTTPResponse( 302, 'OK', {'location': 'http://no.where/ishere'}, '' ) fake2 = fakes.FakeHTTPResponse( 200, 'OK', {'content-type': 'application/json'}, jsonutils.dumps({'Mount': 'Fuji'}) ) self.request.side_effect = [ (fake1, ''), (fake2, jsonutils.dumps({'Mount': 'Fuji'}))] client = http.SessionClient(session=mock.ANY, auth=mock.ANY, endpoint_override='http://no.where/') resp = client.request('', 'GET', redirect=True) self.assertEqual(200, resp.status_code) self.assertEqual({'Mount': 'Fuji'}, utils.get_response_body(resp)) self.assertEqual(('', 'GET'), self.request.call_args_list[0][0]) self.assertEqual(('ishere', 'GET'), self.request.call_args_list[1][0]) for call in self.request.call_args_list: self.assertEqual({'user_agent': 'python-heatclient', 'raise_exc': False, 'redirect': True}, call[1])
def preview(self, **kwargs): """Preview a stack.""" headers = self.client.credentials_headers() resp = self.client.post('/stacks/preview', data=kwargs, headers=headers) body = utils.get_response_body(resp) return Stack(self, body.get('stack'))
def test_302_location_no_endpoint(self): fake1 = fakes.FakeHTTPResponse( 302, 'OK', {'location': 'http://no.where/ishere'}, '' ) fake2 = fakes.FakeHTTPResponse( 200, 'OK', {'content-type': 'application/json'}, jsonutils.dumps({'Mount': 'Fuji'}) ) self.request.side_effect = [ (fake1, ''), (fake2, jsonutils.dumps({'Mount': 'Fuji'}))] client = http.SessionClient(session=mock.ANY, auth=mock.ANY) resp = client.request('', 'GET', redirect=True) self.assertEqual(200, resp.status_code) self.assertEqual({'Mount': 'Fuji'}, utils.get_response_body(resp)) self.assertEqual(('', 'GET'), self.request.call_args_list[0][0]) self.assertEqual(('http://no.where/ishere', 'GET'), self.request.call_args_list[1][0]) for call in self.request.call_args_list: self.assertEqual({'user_agent': 'python-heatclient', 'raise_exc': False, 'redirect': True}, call[1])
def output_show(self, stack_id, output_key): stack_identifier = self._resolve_stack_id(stack_id) resp = self.client.get('/stacks/%(id)s/outputs/%(key)s' % { 'id': stack_identifier, 'key': output_key }) body = utils.get_response_body(resp) return body
def get(self, stack_id): """Get the metadata for a specific stack. :param stack_id: Stack ID to lookup """ resp = self.client.get('/stacks/%s' % stack_id) body = utils.get_response_body(resp) return Stack(self, body.get('stack'))
def get(self, config_id): """Get the details for a specific software config. :param config_id: ID of the software config """ resp = self.client.get('/software_configs/%s' % config_id) body = utils.get_response_body(resp) return SoftwareConfig(self, body.get('software_config'))
def generate_template(self, resource_name): """Deprecated in favor of generate_template in ResourceTypeManager.""" url_str = '/resource_types/%s/template' % ( parse.quote(encodeutils.safe_encode(resource_name))) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def template(self, stack_id): """Get template content for a specific stack as a parsed JSON object. :param stack_id: Stack ID to get the template for """ resp = self.client.get('/stacks/%s/template' % stack_id) body = utils.get_response_body(resp) return body
def generate_template(self, resource_name): """Deprecated in favor of generate_template in ResourceTypeManager.""" url_str = '/resource_types/%s/template' % ( parse.quote(encodeutils.safe_encode(resource_name), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def preview_update(self, stack_id, **kwargs): """Preview a stack update.""" s = self.get(stack_id) headers = self.client.credentials_headers() resp = self.client.put('/stacks/%s/%s/preview' % (s.stack_name, s.id), data=kwargs, headers=headers) body = utils.get_response_body(resp) return body
def get(self, deployment_id): """Get the details for a specific software deployment. :param deployment_id: ID of the software deployment """ resp = self.client.get('/software_deployments/%s' % deployment_id) body = utils.get_response_body(resp) return SoftwareDeployment(self, body.get('software_deployment'))
def files(self, stack_id): """Returns the files for an existing stack. :param stack_id: identifies the stack :return: """ resp = self.client.get('/stacks/%s/files' % stack_id) body = utils.get_response_body(resp) return body
def environment(self, stack_id): """Returns the environment for an existing stack. :param stack_id: identifies the stack :return: """ resp = self.client.get('/stacks/%s/environment' % stack_id) body = utils.get_response_body(resp) return body
def generate_template(self, resource_name): """DEPRECATED! Use `generate_template` of `ResourceTypeManager` instead. """ url_str = '/resource_types/%s/template' % (parse.quote( encodeutils.safe_encode(resource_name), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def snapshot(self, stack_id, name=None): """Snapshot a stack.""" stack = self.get(stack_id) data = {} if name: data["name"] = name resp = self.client.post("/stacks/%s/snapshots" % stack.identifier, data=data) body = utils.get_response_body(resp) return body
def generate_template(self, resource_name): """DEPRECATED! Use `generate_template` of `ResourceTypeManager` instead. """ url_str = '/resource_types/%s/template' % ( parse.quote(encodeutils.safe_encode(resource_name), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def abandon(self, stack_id): """Abandon a stack. :param stack_id: Stack name or ID to identifies the stack """ stack_identifier = self._resolve_stack_id(stack_id) resp = self.client.delete('/stacks/%s/abandon' % stack_identifier) body = utils.get_response_body(resp) return body
def environment(self, stack_id): """Returns the environment for an existing stack. :param stack_id: Stack name or ID to identifies the stack :return: """ resp = self.client.get('/stacks/%s/environment' % stack_id) body = utils.get_response_body(resp) return body
def generate_template(self, resource_type, template_type='cfn'): url_str = '/%s/%s/template' % ( self.KEY, parse.quote(encodeutils.safe_encode(resource_type), '')) if template_type: url_str += '?%s' % parse.urlencode( {'template_type': template_type}, True) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def metadata(self, server_id): """Get a collection of software deployment metadata for given server. :rtype: list of :class:`SoftwareDeployment` """ url = '/software_deployments/metadata/%s' % parse.quote(server_id, '') resp = self.client.get(url) body = utils.get_response_body(resp) return body.get('metadata')
def validate(self, **kwargs): """Validate a stack template.""" url = '/validate' if kwargs.pop('show_nested', False): url += '?show_nested=True' resp = self.client.post(url, data=kwargs) body = utils.get_response_body(resp) return body
def files(self, stack_id): """Returns the files for an existing stack. :param stack_id: Stack name or ID to identifies the stack. :return: """ resp = self.client.get('/stacks/%s/files' % stack_id) body = utils.get_response_body(resp) return body
def generate_template(self, resource_type, template_type='cfn'): url_str = '/resource_types/%s/template' % ( parse.quote(encodeutils.safe_encode(resource_type), '')) if template_type: url_str += '?%s' % parse.urlencode( {'template_type': template_type}, True) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def export(self, stack_id): """Export data of a stack. :param stack_id: Stack name or ID to identifies the stack """ stack_identifier = self._resolve_stack_id(stack_id) resp = self.client.get('/stacks/%s/export' % stack_identifier) body = utils.get_response_body(resp) return body
def metadata(self, server_id): """Get a collection of software deployment metadata for given server. :rtype: list of :class:`SoftwareDeployment` """ url = '/software_deployments/metadata/%s' % parse.quote( server_id) resp = self.client.get(url) body = utils.get_response_body(resp) return body.get('metadata')
def snapshot(self, stack_id, name=None): """Snapshot a stack.""" stack_identifier = self._resolve_stack_id(stack_id) data = {} if name: data['name'] = name resp = self.client.post('/stacks/%s/snapshots' % stack_identifier, data=data) body = utils.get_response_body(resp) return body
def get(self, resource_type): """Get the details for a specific resource_type. :param resource_type: name of the resource type to get the details for """ url_str = '/%s/%s' % ( self.KEY, parse.quote(encodeutils.safe_encode(resource_type), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def get(self, resource_type): """Get the details for a specific resource_type. :param resource_type: name of the resource type to get the details for """ url_str = '/resource_types/%s' % ( parse.quote(encodeutils.safe_encode(resource_type), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body
def json_request(self, method, url, **kwargs): kwargs.setdefault('headers', {}) kwargs['headers'].setdefault('Content-Type', 'application/json') kwargs['headers'].setdefault('Accept', 'application/json') if 'data' in kwargs: kwargs['data'] = jsonutils.dumps(kwargs['data']) resp = self._http_request(url, method, **kwargs) body = utils.get_response_body(resp) return resp, body
def _base_test(self, expect, key): class FakeAPI(object): """Fake API and ensure request url is correct.""" def get(self, *args, **kwargs): assert ('GET', args[0]) == expect def json_request(self, *args, **kwargs): assert args == expect ret = key and {key: []} or {} return {}, {key: ret} def raw_request(self, *args, **kwargs): assert args == expect return {} def head(self, url, **kwargs): return self.json_request("HEAD", url, **kwargs) def post(self, url, **kwargs): return self.json_request("POST", url, **kwargs) def put(self, url, **kwargs): return self.json_request("PUT", url, **kwargs) def delete(self, url, **kwargs): return self.raw_request("DELETE", url, **kwargs) def patch(self, url, **kwargs): return self.json_request("PATCH", url, **kwargs) manager = resources.ResourceManager(FakeAPI()) self.m.StubOutWithMock(manager, '_resolve_stack_id') self.m.StubOutWithMock(utils, 'get_response_body') utils.get_response_body(mox.IgnoreArg()).AndReturn( {key: key and { key: [] } or {}}) manager._resolve_stack_id('teststack').AndReturn('teststack/abcd1234') self.m.ReplayAll() return manager
def _base_test(self, expect, key): class FakeAPI(object): """Fake API and ensure request url is correct.""" def get(self, *args, **kwargs): assert ('GET', args[0]) == expect def json_request(self, *args, **kwargs): assert args == expect ret = key and {key: []} or {} return {}, {key: ret} def raw_request(self, *args, **kwargs): assert args == expect return {} def head(self, url, **kwargs): return self.json_request("HEAD", url, **kwargs) def post(self, url, **kwargs): return self.json_request("POST", url, **kwargs) def put(self, url, **kwargs): return self.json_request("PUT", url, **kwargs) def delete(self, url, **kwargs): return self.raw_request("DELETE", url, **kwargs) def patch(self, url, **kwargs): return self.json_request("PATCH", url, **kwargs) manager = resources.ResourceManager(FakeAPI()) self.m.StubOutWithMock(manager, '_resolve_stack_id') self.m.StubOutWithMock(utils, 'get_response_body') utils.get_response_body(mox.IgnoreArg()).AndReturn( {key: key and {key: []} or {}}) manager._resolve_stack_id('teststack').AndReturn('teststack/abcd1234') self.m.ReplayAll() return manager
def metadata(self, stack_id, resource_name): """Get the metadata for a specific resource. :param stack_id: ID or name of stack containing the resource :param resource_name: ID of resource to get metadata for """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s/metadata' % (parse.quote( stack_id), parse.quote(encodeutils.safe_encode(resource_name))) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body.get('metadata')
def signal(self, stack_id, resource_name, data=None): """Signal a specific resource. :param stack_id: ID or name of stack containing the resource :param resource_name: ID of resource to send signal to """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s/signal' % (parse.quote( stack_id), parse.quote(encodeutils.safe_encode(resource_name))) resp = self.client.post(url_str, data=data) body = utils.get_response_body(resp) return body
def get(self, resource_type, with_description=False): """Get the details for a specific resource_type. :param resource_type: name of the resource type to get the details for :param with_description: return result with description or not """ url_str = '/%s/%s' % ( self.KEY, parse.quote(encodeutils.safe_encode(resource_type))) resp = self.client.get(url_str, params={'with_description': with_description}) body = utils.get_response_body(resp) return body
def preview_update(self, stack_id, **kwargs): """Preview a stack update.""" stack_identifier = self._resolve_stack_id(stack_id) headers = self.client.credentials_headers() path = '/stacks/%s/preview' % stack_identifier if kwargs.pop('show_nested', False): path += '?show_nested=True' if kwargs.pop('existing', None): resp = self.client.patch(path, data=kwargs, headers=headers) else: resp = self.client.put(path, data=kwargs, headers=headers) body = utils.get_response_body(resp) return body
def get(self, stack_id, resource_name): """Get the details for a specific resource. :param stack_id: ID of stack containing the resource :param resource_name: ID of resource to get the details for """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s' % ( parse.quote(stack_id, ''), parse.quote(encodeutils.safe_encode(resource_name), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return Resource(self, body.get('resource'))
def get(self, stack_id, resource_name): """Get the details for a specific resource. :param stack_id: ID of stack containing the resource :param resource_name: ID of resource to get the details for """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s' % (parse.quote( stack_id, ''), parse.quote(encodeutils.safe_encode(resource_name), '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return Resource(self, body.get('resource'))
def get(self, stack_id, resolve_outputs=True): """Get the metadata for a specific stack. :param stack_id: Stack ID to lookup :param resolve_outputs: If True, then outputs for this stack will be resolved """ kwargs = {} if not resolve_outputs: kwargs['params'] = {"resolve_outputs": False} resp = self.client.get('/stacks/%s' % stack_id, **kwargs) body = utils.get_response_body(resp) return Stack(self, body.get('stack'), loaded=True)
def metadata(self, stack_id, resource_name): """Get the metadata for a specific resource. :param stack_id: ID of stack containing the resource :param resource_name: ID of resource to get metadata for """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s/metadata' % ( parse.quote(stack_id), parse.quote(encodeutils.safe_encode(resource_name))) resp = self.client.get(url_str) body = utils.get_response_body(resp) return body.get('metadata')
def signal(self, stack_id, resource_name, data=None): """Signal a specific resource. :param stack_id: ID of stack containing the resource :param resource_name: ID of resource to send signal to """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s/signal' % ( parse.quote(stack_id), parse.quote(encodeutils.safe_encode(resource_name))) resp = self.client.post(url_str, data=data) body = utils.get_response_body(resp) return body
def get(self, resource_type, with_description=False): """Get the details for a specific resource_type. :param resource_type: name of the resource type to get the details for :param with_description: return result with description or not """ url_str = '/%s/%s' % ( self.KEY, parse.quote(encodeutils.safe_encode(resource_type), '')) resp = self.client.get(url_str, params={'with_description': with_description}) body = utils.get_response_body(resp) return body
def get(self, stack_id, resolve_outputs=True): """Get the metadata for a specific stack. :param stack_id: Stack ID to lookup :param resolve_outputs: If True, then outputs for this stack will be resolved """ kwargs = {} if not resolve_outputs: kwargs['params'] = {"resolve_outputs": False} resp = self.client.get('/stacks/%s' % stack_id, **kwargs) body = utils.get_response_body(resp) return Stack(self, body.get('stack'))
def get(self, stack_id, resource_name, event_id): """Get the details for a specific event. :param stack_id: ID of stack containing the event :param resource_name: ID of resource the event belongs to :param event_id: ID of event to get the details for """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s/events/%s' % ( parse.quote(stack_id), parse.quote(encodeutils.safe_encode(resource_name)), parse.quote(event_id, '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return Event(self, body.get('event'))
def test_generate_template(self): fields = {'resource_name': 'testresource'} expect = ('GET', '/resource_types/testresource/template') key = None class FakeAPI(object): """Fake API and ensure request url is correct.""" def get(self, *args, **kwargs): assert ('GET', args[0]) == expect def json_request(self, *args, **kwargs): assert args == expect ret = key and {key: []} or {} return {}, {key: ret} manager = resources.ResourceManager(FakeAPI()) self.m.StubOutWithMock(utils, 'get_response_body') utils.get_response_body(mox.IgnoreArg()).AndReturn( {key: key and {key: []} or {}}) self.m.ReplayAll() manager.generate_template(**fields) self.m.VerifyAll()
def get(self, stack_id, resource_name, event_id): """Get the details for a specific event. :param stack_id: ID of stack containing the event :param resource_name: ID of resource the event belongs to :param event_id: ID of event to get the details for """ stack_id = self._resolve_stack_id(stack_id) url_str = '/stacks/%s/resources/%s/events/%s' % (parse.quote( stack_id, ''), parse.quote(encodeutils.safe_encode(resource_name), ''), parse.quote(event_id, '')) resp = self.client.get(url_str) body = utils.get_response_body(resp) return Event(self, body.get('event'))