def test_template_show_cfn(self): fakes.script_keystone_client() template_data = open(os.path.join(TEST_VAR_DIR, 'minimal.template')).read() resp = fakes.FakeHTTPResponse( 200, 'OK', {'content-type': 'application/json'}, template_data) resp_dict = json.loads(template_data) v1client.Client.json_request( 'GET', '/stacks/teststack/template').AndReturn((resp, resp_dict)) self.m.ReplayAll() show_text = self.shell('template-show teststack') required = [ '{', ' "AWSTemplateFormatVersion": "2010-09-09"', ' "Outputs": {}', ' "Resources": {}', ' "Parameters": {}', '}' ] for r in required: self.assertRegexpMatches(show_text, r)
def test_describe(self): fakes.script_keystone_client() resp_dict = {"stack": { "id": "1", "stack_name": "teststack", "stack_status": 'CREATE_COMPLETE', "creation_time": "2012-10-25T01:58:47Z" }} resp = fakes.FakeHTTPResponse( 200, 'OK', {'content-type': 'application/json'}, json.dumps(resp_dict)) v1client.Client.json_request( 'GET', '/stacks/teststack/1').AndReturn((resp, resp_dict)) self.m.ReplayAll() list_text = self.shell('describe teststack/1') required = [ 'id', 'stack_name', 'stack_status', 'creation_time', 'teststack', 'CREATE_COMPLETE', '2012-10-25T01:58:47Z' ] for r in required: self.assertRegexpMatches(list_text, r)
def test_template_show_hot(self): fakes.script_keystone_client() resp_dict = {"heat_template_version": "2013-05-23", "parameters": {}, "resources": {}, "outputs": {}} resp = fakes.FakeHTTPResponse( 200, 'OK', {'content-type': 'application/json'}, json.dumps(resp_dict)) v1client.Client.json_request( 'GET', '/stacks/teststack/template').AndReturn((resp, resp_dict)) self.m.ReplayAll() show_text = self.shell('template-show teststack') required = [ "heat_template_version: '2013-05-23'", "outputs: {}", "parameters: {}", "resources: {}" ] for r in required: self.assertRegexpMatches(show_text, r)
def test_create_url(self): fakes.script_keystone_client() resp = fakes.FakeHTTPResponse( 201, 'Created', {'location': 'http://no.where/v1/tenant_id/stacks/teststack2/2'}, None) v1client.Client.json_request( 'POST', '/stacks', body=mox.IgnoreArg(), headers={'X-Auth-Key': 'password', 'X-Auth-User': '******'} ).AndReturn((resp, None)) fakes.script_heat_list() self.m.ReplayAll() create_text = self.shell( 'create teststack ' '--template-url=http://no.where/minimal.template ' '--parameters="InstanceType=m1.large;DBUsername=wp;' 'DBPassword=verybadpassword;KeyName=heat_key;' 'LinuxDistribution=F17"') required = [ 'stack_name', 'id', 'teststack2', '2' ] for r in required: self.assertRegexpMatches(create_text, r)
def test_update(self): fakes.script_keystone_client() resp = fakes.FakeHTTPResponse( 202, 'Accepted', {}, 'The request is accepted for processing.') v1client.Client.json_request( 'PUT', '/stacks/teststack2/2', body=mox.IgnoreArg(), headers={'X-Auth-Key': 'password', 'X-Auth-User': '******'} ).AndReturn((resp, None)) fakes.script_heat_list() self.m.ReplayAll() template_file = os.path.join(TEST_VAR_DIR, 'minimal.template') create_text = self.shell( 'update teststack2/2 ' '--template-file=%s ' '--parameters="InstanceType=m1.large;DBUsername=wp;' 'DBPassword=verybadpassword;KeyName=heat_key;' 'LinuxDistribution=F17"' % template_file) required = [ 'stack_name', 'id', 'teststack2', '1' ] for r in required: self.assertRegexpMatches(create_text, r)
def test_build_info(self): fakes.script_keystone_client() resp_dict = { 'build_info': { 'api': {'revision': 'api_revision'}, 'engine': {'revision': 'engine_revision'} } } resp_string = jsonutils.dumps(resp_dict) headers = {'content-type': 'application/json'} http_resp = fakes.FakeHTTPResponse(200, 'OK', headers, resp_string) response = (http_resp, resp_dict) http.HTTPClient.json_request('GET', '/build_info').AndReturn(response) self.m.ReplayAll() build_info_text = self.shell('build-info') required = [ 'api', 'engine', 'revision', 'api_revision', 'engine_revision', ] for r in required: self.assertRegexpMatches(build_info_text, r)
def test_parsable_malformed_error(self): invalid_json = "ERROR: {Invalid JSON Error." fakes.script_keystone_client() fakes.script_heat_error(invalid_json) self.m.ReplayAll() try: self.shell("stack-show bad") except exc.HTTPException as e: self.assertEqual(str(e), "ERROR: " + invalid_json)
def test_bad_parameters(self): self.m.StubOutWithMock(ksclient, 'Client') self.m.StubOutWithMock(v1client.Client, 'json_request') fakes.script_keystone_client() self.m.ReplayAll() fake_env = { 'OS_USERNAME': '******', 'OS_PASSWORD': '******', 'OS_TENANT_NAME': 'tenant_name', 'OS_AUTH_URL': 'http://no.where', } self.set_fake_env(fake_env) template_file = os.path.join(TEST_VAR_DIR, 'minimal.template') cmd = '%s --template-file=%s ' % (self.command, template_file) self.shell_error(cmd, self.err)
def test_no_debug_switch_no_raises_errors(self): fakes.script_keystone_client() http.HTTPClient.json_request( 'GET', '/stacks?').AndRaise(exc.Unauthorized("FAIL")) self.m.ReplayAll() fake_env = { 'OS_USERNAME': '******', 'OS_PASSWORD': '******', 'OS_TENANT_NAME': 'tenant_name', 'OS_AUTH_URL': 'http://no.where', } self.set_fake_env(fake_env) args = ['stack-list'] self.assertRaises(SystemExit, heatclient.shell.main, args)
def test_failed_auth(self): self.m.StubOutWithMock(ksclient, 'Client') self.m.StubOutWithMock(v1client.Client, 'json_request') fakes.script_keystone_client() v1client.Client.json_request( 'GET', '/stacks?').AndRaise(exc.Unauthorized) self.m.ReplayAll() fake_env = { 'OS_USERNAME': '******', 'OS_PASSWORD': '******', 'OS_TENANT_NAME': 'tenant_name', 'OS_AUTH_URL': 'http://no.where', } self.set_fake_env(fake_env) self.shell_error('list', 'Invalid OpenStack Identity credentials.')
def test_failed_auth(self): self.m.StubOutWithMock(ksclient, 'Client') self.m.StubOutWithMock(http.HTTPClient, 'json_request') fakes.script_keystone_client() failed_msg = 'Unable to authenticate user with credentials provided' http.HTTPClient.json_request( 'GET', '/stacks?').AndRaise(exc.Unauthorized(failed_msg)) self.m.ReplayAll() fake_env = { 'OS_USERNAME': '******', 'OS_PASSWORD': '******', 'OS_TENANT_NAME': 'tenant_name', 'OS_AUTH_URL': 'http://no.where', } self.set_fake_env(fake_env) self.shell_error('stack-list', failed_msg)
def test_create_validation(self): self.m.StubOutWithMock(ksclient, 'Client') self.m.StubOutWithMock(v1client.Client, 'json_request') fakes.script_keystone_client() self.m.ReplayAll() fake_env = { 'OS_USERNAME': '******', 'OS_PASSWORD': '******', 'OS_TENANT_NAME': 'tenant_name', 'OS_AUTH_URL': 'http://no.where', } self.set_fake_env(fake_env) self.shell_error( 'create teststack ' '--parameters="InstanceType=m1.large;DBUsername=wp;' 'DBPassword=verybadpassword;KeyName=heat_key;' 'LinuxDistribution=F17"', 'Need to specify exactly one of')
def test_list(self): fakes.script_keystone_client() fakes.script_heat_list() self.m.ReplayAll() list_text = self.shell('list') required = [ 'id', 'stack_status', 'creation_time', 'teststack', '1', 'CREATE_COMPLETE', 'IN_PROGRESS', ] for r in required: self.assertRegexpMatches(list_text, r)
def test_parsable_malformed_error_missing_message(self): missing_message = { "explanation": "The resource could not be found.", "code": 404, "error": { "type": "StackNotFound", "traceback": "", }, "title": "Not Found" } fakes.script_keystone_client() fakes.script_heat_error(json.dumps(missing_message)) self.m.ReplayAll() try: self.shell("stack-show bad") except exc.HTTPException as e: self.assertEqual(str(e), "ERROR: Internal Error")
def test_parsable_malformed_error_missing_traceback(self): message = "The Stack (bad) could not be found." resp_dict = { "explanation": "The resource could not be found.", "code": 404, "error": { "message": message, "type": "StackNotFound", }, "title": "Not Found" } fakes.script_keystone_client() fakes.script_heat_error(json.dumps(resp_dict)) self.m.ReplayAll() try: exc.verbose = 1 self.shell("stack-show bad") except exc.HTTPException as e: self.assertEqual(str(e), "ERROR: The Stack (bad) could not be found.\n")
def test_delete(self): fakes.script_keystone_client() resp = fakes.FakeHTTPResponse( 204, 'No Content', {}, None) v1client.Client.raw_request( 'DELETE', '/stacks/teststack2/2', ).AndReturn((resp, None)) fakes.script_heat_list() self.m.ReplayAll() create_text = self.shell('delete teststack2/2') required = [ 'stack_name', 'id', 'teststack', '1' ] for r in required: self.assertRegexpMatches(create_text, r)
def _script_keystone_client(self): fakes.script_keystone_client(token=self.token)
def _script_keystone_client(self): fakes.script_keystone_client()