class InstanceTests(TestCase): api_client = None expected_output = { "alias": "", "alias_hash": "", "created_by": "", "has_shell": "", "has_vnc": "", "ip_address": "", "machine_alias": "", "machine_alias_hash": "", "machine_name": "", "name": "", "size_alias": "", "start_date": "", "status": "", "tags": "", "token": "", } def setUp_API(self): # Initialize API self.api_client = TokenAPIClient() self.api_client.login(username=settings.TEST_RUNNER_USER, password=settings.TEST_RUNNER_PASS) def setUp(self): self.setUp_API() def tearDown(self): self.api_client.logout() def test_openstack_launch(self): print "Testing launch. ETA:10min" self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # def test_openstack_stop_start(self): # print "Testing stop/start ETA:10min" # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'stop') # time.sleep(5*60) # self.instance_action_step(self.os_instance_id, 'start') # time.sleep(5*60) # def test_openstack_suspend_resume(self): # print "Testing suspend/resume ETA:10min" # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'suspend') # time.sleep(5*60) # self.instance_action_step(self.os_instance_id, 'resume') # time.sleep(5*60) # def test_openstack_resize_and_revert(self): # print "Testing resize/revert. ETA:20min" # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'resize', {'size':'3'}) # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'revert_resize') # time.sleep(7*60) # def test_openstack_resize_up_and_down(self): # print "Testing resize up/down. ETA:40min" # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'resize', {'size':'3'}) # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'confirm_resize') # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'resize', {'size':'1'}) # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'confirm_resize') # time.sleep(7*60) def launch_openstack_instance(self): """ Testing instances must be done in order * Create the instance * Detail the instance * Delete the instance """ global delete_instances os_instance_id, os_instance_ip = standup_instance( self, os_base_instance_url, "0f539197-3718-40bc-8a29-c22e0841684f", "1", "Ubuntu 12.04 - Automated OpenStack Testing", delete_before=delete_instances, ) if delete_instances: delete_instances = False return (os_instance_id, os_instance_ip) def instance_action_step(self, instance_id, action, action_params={}): instance_action_url = urljoin(urljoin(os_base_instance_url, "%s/" % instance_id), "action/") # Attach volume parameters action_params.update({"action": action}) action_resp = self.api_client.post(instance_action_url, action_params, format="json") self.assertEqual(action_resp.status_code, status.HTTP_200_OK) self.assertEqual("success", action_resp.data.get("result", "No Result In Data")) return action_resp def detail_step_os(self, instance_id): # Detail the instance os_instance_url = urljoin(os_base_instance_url, "%s/" % instance_id) instance_get_resp = self.api_client.get(os_instance_url) # Validate the output self.assertEqual(instance_get_resp.status_code, status.HTTP_200_OK) verify_expected_output(self, instance_get_resp.data, self.expected_output) def predelete_step_os(self): list_instance_resp = self.api_client.get(os_base_instance_url) self.assertEqual(list_instance_resp.status_code, status.HTTP_200_OK) if not list_instance_resp.data: return False for instance in list_instance_resp.data: self.delete_step_os(instance["alias"]) return True def delete_step_os(self, instance_id): os_instance_url = os.path.join(os_base_instance_url, "%s/" % instance_id) # Delete the instance delete_resp = self.api_client.delete(os_instance_url) # Validate the output self.assertEqual(delete_resp.status_code, status.HTTP_200_OK)
class InstanceTests(TestCase): api_client = None expected_output = { "alias": "", "alias_hash": "", "created_by": "", "has_shell": "", "has_vnc": "", "ip_address": "", "machine_alias": "", "machine_alias_hash": "", "machine_name": "", "name": "", "size_alias": "", "start_date": "", "status": "", "tags": "", "token": "", } def setUp_API(self): #Initialize API self.api_client = TokenAPIClient() self.api_client.login(username=settings.TEST_RUNNER_USER, password=settings.TEST_RUNNER_PASS) def setUp(self): self.setUp_API() def tearDown(self): self.api_client.logout() #def test_openstack_launch(self): # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() #def test_openstack_stop_start(self): # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'stop') # time.sleep(5*60) # self.instance_action_step(self.os_instance_id, 'start') # time.sleep(5*60) #def test_openstack_suspend_resume(self): # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'suspend') # time.sleep(5*60) # self.instance_action_step(self.os_instance_id, 'resume') # time.sleep(5*60) #def test_openstack_resize_and_revert(self): # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'resize', {'size':'3'}) # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'revert_resize') # time.sleep(7*60) #def test_openstack_resize_up_and_down(self): # self.os_instance_id, self.os_instance_ip = self.launch_openstack_instance() # self.instance_action_step(self.os_instance_id, 'resize', {'size':'3'}) # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'confirm_resize') # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'resize', {'size':'1'}) # time.sleep(7*60) # self.instance_action_step(self.os_instance_id, 'confirm_resize') # time.sleep(7*60) def launch_openstack_instance(self): """ Testing instances must be done in order * Create the instance * Detail the instance * Delete the instance """ global delete_instances os_instance_id, os_instance_ip = standup_instance( self, os_base_instance_url, "0f539197-3718-40bc-8a29-c22e0841684f", "1", "Ubuntu 12.04 - Automated OpenStack Testing", delete_before=delete_instances) if delete_instances: delete_instances = False return (os_instance_id, os_instance_ip) def instance_action_step(self, instance_id, action, action_params={}): instance_action_url = urljoin( urljoin(os_base_instance_url, '%s/' % instance_id), 'action/') #Attach volume parameters action_params.update({ 'action': action, }) action_resp = self.api_client.post(instance_action_url, action_params, format='json') self.assertEqual(action_resp.status_code, status.HTTP_200_OK) self.assertEqual('success', action_resp.data.get('result', 'No Result In Data')) return action_resp def detail_step_os(self, instance_id): #Detail the instance os_instance_url = urljoin(os_base_instance_url, '%s/' % instance_id) instance_get_resp = self.api_client.get(os_instance_url) #Validate the output self.assertEqual(instance_get_resp.status_code, status.HTTP_200_OK) verify_expected_output(self, instance_get_resp.data, self.expected_output) def predelete_step_os(self): list_instance_resp = self.api_client.get(os_base_instance_url) self.assertEqual(list_instance_resp.status_code, status.HTTP_200_OK) if not list_instance_resp.data: return False for instance in list_instance_resp.data: self.delete_step_os(instance['alias']) return True def delete_step_os(self, instance_id): os_instance_url = os.path.join(os_base_instance_url, '%s/' % instance_id) #Delete the instance delete_resp = self.api_client.delete(os_instance_url) #Validate the output self.assertEqual(delete_resp.status_code, status.HTTP_200_OK)
class VolumeTests(TestCase): api_client = None expected_output = { "status": "", "attach_data": "", "alias": "", "provider": "", "size": "", "name": "", "description": "", "created_by": "", "created_by_identity": "", "start_date": "" } def setUp(self): #Initialize core DB #self.euca_admin_id = create_euca_provider() #self.euca_provider = self.euca_admin_id.provider self.os_admin_id = create_os_provider() self.os_provider = self.os_admin_id.provider #Ensure there is an account created/ready to go #euca_accounts = EucaAccounts(self.euca_provider) #euca_user = euca_accounts.get_user(settings.TEST_RUNNER_USER) #self.euca_id = euca_accounts.create_account(euca_user, max_quota=True) os_accounts = OSAccounts(self.os_provider) self.os_id = os_accounts.create_account(settings.TEST_RUNNER_USER, os_accounts.hashpass( settings.TEST_RUNNER_USER), max_quota=True) #user = AtmosphereUser.objects.get(username=settings.TEST_RUNNER_USER) #user.is_staff = True #user.is_superuser = True #user.save() #Initialize API self.api_client = TokenAPIClient() self.api_client.login(username=settings.TEST_RUNNER_USER, password=settings.TEST_RUNNER_PASS) reverse_link = reverse('api:public_apis:instance-list', args=[self.os_id.provider.id, self.os_id.id]) self.os_instance_url = urljoin(settings.SERVER_URL, reverse_link) reverse_link = reverse('api:public_apis:volume-list', args=[self.os_id.provider.id, self.os_id.id]) #Prepare Openstack self.os_volume_url = urljoin(settings.SERVER_URL, reverse_link) instance_data = { "size_alias": "2", "machine_alias": "0f539197-3718-40bc-8a29-c22e0841684f", "name": "test volume attachment", "delete_before": False } (self.os_instance_id, self.os_instance_ip) = standup_instance(self, self.os_instance_url, **instance_data) #Prepare Eucalyptus #reverse_link = reverse('api:public_apis:volume-list', # args=[self.euca_id.provider.id, # self.euca_id.id]) #self.euca_volume_url = urljoin(settings.SERVER_URL, reverse_link) #reverse_link = reverse('api:public_apis:instance-list', # args=[self.euca_id.provider.id, # self.euca_id.id]) #self.euca_instance_url = urljoin(settings.SERVER_URL, reverse_link) #instance_data = { # "size_alias":"m1.small", # "machine_alias":"emi-E7F8300F", # "name":"test volume attachment", # "delete_before":False # } #(self.euca_instance_id, self.euca_instance_ip) = standup_instance( # self, self.euca_instance_url, **instance_data) def tearDown(self): self.api_client.logout() #def test_openstack_volume(self): # """ # Testing volumes must be done in order # * Create the volume # * Detail the volume # * Delete the volume # """ # volume_post_data = { # "name":"openstack_vol_test1", # "size":1, # } # self.expected_output['name'] = volume_post_data['name'] # self.expected_output['size'] = volume_post_data['size'] # volume_id = self.create_volume(self.os_volume_url, volume_post_data) # self.detail_volume(self.os_volume_url, volume_id) # # Wait time associated between 'create' and 'attachment' # time.sleep(30) # self.attach_volume(self.os_instance_url, self.os_instance_id, volume_id) # time.sleep(30) # self.detach_volume(self.os_instance_url, self.os_instance_id, volume_id) # # Wait time associated between 'detach' and 'delete' # time.sleep(30) # Sorry, its euca. # #Delete all volumes # deleted = self.delete_all_volumes(self.os_volume_url) #def test_euca_volume(self): # """ # Testing volumes must be done in order # * Create the volume # * wait a second # * Attach the volume # * Verify success # * If failed, Try again(?) # * Detach the volume # * Verify success # * wait a second # * Delete the volume # # Wait for volume to deploy and # # Ensure: SSH, VNC, Shellinabox, Deploy access # """ # volume_post_data = { # "name":"euca_vol_test1", # "size":1, # } # self.expected_output['name'] = volume_post_data['name'] # self.expected_output['size'] = volume_post_data['size'] # volume_id = self.create_volume(self.euca_volume_url, volume_post_data) # self.detail_volume(self.euca_volume_url, volume_id) # # Wait time associated between 'create' and 'attachment' # time.sleep(30) # self.attach_volume(self.euca_instance_url, self.euca_instance_id, volume_id) # time.sleep(30) # self.detach_volume(self.euca_instance_url, self.euca_instance_id, volume_id) # #Delete all volumes # deleted = self.delete_all_volumes(self.euca_volume_url) # if deleted: # # Wait time associated between 'detach' and 'delete' # time.sleep(30) # Sorry, its euca. def attach_volume(self, instance_base_url, instance_id, volume_id): #Make action url instance_action_url = urljoin( urljoin(instance_base_url, '%s/' % instance_id), 'action/') #Attach volume parameters action_params = { 'action': 'attach_volume', 'volume_id': volume_id, #'device':'/dev/xvdb', } volume_attach_resp = self.api_client.post(instance_action_url, action_params, format='json') #Wait and see.. def detach_volume(self, instance_base_url, instance_id, volume_id): #Make action url instance_action_url = urljoin( urljoin(instance_base_url, '%s/' % instance_id), 'action/') #Attach volume parameters action_params = { 'action': 'detach_volume', 'volume_id': volume_id, #'device': '/dev/xvdb', } volume_detach_resp = self.api_client.post(instance_action_url, action_params, format='json') #Wait and see.. def create_volume(self, volume_base_url, post_data): #Create the volume volume_launch_resp = self.api_client.post(volume_base_url, post_data, format='json') #Validate the output if volume_launch_resp.status_code != status.HTTP_201_CREATED: logger.info(volume_launch_resp) self.assertEqual(volume_launch_resp.status_code, status.HTTP_201_CREATED) self.assertIsNotNone(volume_launch_resp.data) verify_expected_output(self, volume_launch_resp.data, self.expected_output) volume_id = volume_launch_resp.data['alias'] return volume_id def delete_all_volumes(self, volume_list_url): list_volume_resp = self.api_client.get(volume_list_url) self.assertEqual(list_volume_resp.status_code, status.HTTP_200_OK) if not list_volume_resp.data: return False for volume in list_volume_resp.data: self.delete_volume(volume_list_url, volume['alias']) return True def delete_volume(self, volume_base_url, volume_alias): specific_volume_url = urljoin(volume_base_url, '%s/' % volume_alias) #Delete the volume delete_resp = self.api_client.delete(specific_volume_url) #Validate the output self.assertEqual(delete_resp.status_code, status.HTTP_200_OK) def detail_volume(self, volume_base_url, volume_id): #Detail the volume specific_volume_url = urljoin(volume_base_url, '%s/' % volume_id) volume_get_resp = self.api_client.get(specific_volume_url) #Validate the output self.assertEqual(volume_get_resp.status_code, status.HTTP_200_OK) verify_expected_output(self, volume_get_resp.data, self.expected_output)
class VolumeTests(TestCase): api_client = None expected_output = { "status": "", "attach_data": "", "alias": "", "provider": "", "size": "", "name": "", "description": "", "created_by": "", "created_by_identity": "", "start_date": "" } def setUp(self): #Initialize core DB #self.euca_admin_id = create_euca_provider() #self.euca_provider = self.euca_admin_id.provider self.os_admin_id = create_os_provider() self.os_provider = self.os_admin_id.provider #Ensure there is an account created/ready to go #euca_accounts = EucaAccounts(self.euca_provider) #euca_user = euca_accounts.get_user(settings.TEST_RUNNER_USER) #self.euca_id = euca_accounts.create_account(euca_user, max_quota=True) os_accounts = OSAccounts(self.os_provider) self.os_id = os_accounts.create_account( settings.TEST_RUNNER_USER, os_accounts.hashpass(settings.TEST_RUNNER_USER), max_quota=True) #user = AtmosphereUser.objects.get(username=settings.TEST_RUNNER_USER) #user.is_staff = True #user.is_superuser = True #user.save() #Initialize API self.api_client = TokenAPIClient() self.api_client.login( username=settings.TEST_RUNNER_USER, password=settings.TEST_RUNNER_PASS) reverse_link = reverse('api:public_apis:instance-list', args=[self.os_id.provider.id, self.os_id.id]) self.os_instance_url = urljoin(settings.SERVER_URL, reverse_link) reverse_link = reverse('api:public_apis:volume-list', args=[self.os_id.provider.id, self.os_id.id]) #Prepare Openstack self.os_volume_url = urljoin(settings.SERVER_URL, reverse_link) instance_data = { "size_alias":"2", "machine_alias":"0f539197-3718-40bc-8a29-c22e0841684f", "name":"test volume attachment", "delete_before":False } (self.os_instance_id, self.os_instance_ip) = standup_instance( self, self.os_instance_url, **instance_data) #Prepare Eucalyptus #reverse_link = reverse('api:public_apis:volume-list', # args=[self.euca_id.provider.id, # self.euca_id.id]) #self.euca_volume_url = urljoin(settings.SERVER_URL, reverse_link) #reverse_link = reverse('api:public_apis:instance-list', # args=[self.euca_id.provider.id, # self.euca_id.id]) #self.euca_instance_url = urljoin(settings.SERVER_URL, reverse_link) #instance_data = { # "size_alias":"m1.small", # "machine_alias":"emi-E7F8300F", # "name":"test volume attachment", # "delete_before":False # } #(self.euca_instance_id, self.euca_instance_ip) = standup_instance( # self, self.euca_instance_url, **instance_data) def tearDown(self): self.api_client.logout() #def test_openstack_volume(self): # """ # Testing volumes must be done in order # * Create the volume # * Detail the volume # * Delete the volume # """ # volume_post_data = { # "name":"openstack_vol_test1", # "size":1, # } # self.expected_output['name'] = volume_post_data['name'] # self.expected_output['size'] = volume_post_data['size'] # volume_id = self.create_volume(self.os_volume_url, volume_post_data) # self.detail_volume(self.os_volume_url, volume_id) # # Wait time associated between 'create' and 'attachment' # time.sleep(30) # self.attach_volume(self.os_instance_url, self.os_instance_id, volume_id) # time.sleep(30) # self.detach_volume(self.os_instance_url, self.os_instance_id, volume_id) # # Wait time associated between 'detach' and 'delete' # time.sleep(30) # Sorry, its euca. # #Delete all volumes # deleted = self.delete_all_volumes(self.os_volume_url) #def test_euca_volume(self): # """ # Testing volumes must be done in order # * Create the volume # * wait a second # * Attach the volume # * Verify success # * If failed, Try again(?) # * Detach the volume # * Verify success # * wait a second # * Delete the volume # # Wait for volume to deploy and # # Ensure: SSH, VNC, Shellinabox, Deploy access # """ # volume_post_data = { # "name":"euca_vol_test1", # "size":1, # } # self.expected_output['name'] = volume_post_data['name'] # self.expected_output['size'] = volume_post_data['size'] # volume_id = self.create_volume(self.euca_volume_url, volume_post_data) # self.detail_volume(self.euca_volume_url, volume_id) # # Wait time associated between 'create' and 'attachment' # time.sleep(30) # self.attach_volume(self.euca_instance_url, self.euca_instance_id, volume_id) # time.sleep(30) # self.detach_volume(self.euca_instance_url, self.euca_instance_id, volume_id) # #Delete all volumes # deleted = self.delete_all_volumes(self.euca_volume_url) # if deleted: # # Wait time associated between 'detach' and 'delete' # time.sleep(30) # Sorry, its euca. def attach_volume(self, instance_base_url, instance_id, volume_id): #Make action url instance_action_url = urljoin( urljoin(instance_base_url, '%s/' % instance_id), 'action/') #Attach volume parameters action_params = { 'action':'attach_volume', 'volume_id':volume_id, #'device':'/dev/xvdb', } volume_attach_resp = self.api_client.post(instance_action_url, action_params, format='json') #Wait and see.. def detach_volume(self, instance_base_url, instance_id, volume_id): #Make action url instance_action_url = urljoin( urljoin(instance_base_url, '%s/' % instance_id), 'action/') #Attach volume parameters action_params = { 'action': 'detach_volume', 'volume_id': volume_id, #'device': '/dev/xvdb', } volume_detach_resp = self.api_client.post(instance_action_url, action_params, format='json') #Wait and see.. def create_volume(self, volume_base_url, post_data): #Create the volume volume_launch_resp = self.api_client.post(volume_base_url, post_data, format='json') #Validate the output if volume_launch_resp.status_code != status.HTTP_201_CREATED: logger.info(volume_launch_resp) self.assertEqual(volume_launch_resp.status_code, status.HTTP_201_CREATED) self.assertIsNotNone(volume_launch_resp.data) verify_expected_output(self, volume_launch_resp.data, self.expected_output) volume_id = volume_launch_resp.data['alias'] return volume_id def delete_all_volumes(self, volume_list_url): list_volume_resp = self.api_client.get(volume_list_url) self.assertEqual(list_volume_resp.status_code, status.HTTP_200_OK) if not list_volume_resp.data: return False for volume in list_volume_resp.data: self.delete_volume(volume_list_url, volume['alias']) return True def delete_volume(self, volume_base_url, volume_alias): specific_volume_url = urljoin( volume_base_url, '%s/' % volume_alias) #Delete the volume delete_resp = self.api_client.delete(specific_volume_url) #Validate the output self.assertEqual(delete_resp.status_code, status.HTTP_200_OK) def detail_volume(self, volume_base_url, volume_id): #Detail the volume specific_volume_url = urljoin( volume_base_url, '%s/' % volume_id) volume_get_resp = self.api_client.get(specific_volume_url) #Validate the output self.assertEqual(volume_get_resp.status_code, status.HTTP_200_OK) verify_expected_output(self, volume_get_resp.data, self.expected_output)