def test_full_sel(self): # """Test: Full sel log""" # listen to AMQP skip_test = False # skip filling the BMC SEL log on real hardware as don't need to test how the HW is working if "stackType" in fit_common.fitcfg(): if fit_common.fitcfg()['stackType'] == "baremetal": skip_test = True logs.info(" *** Skipping test_full_sel on baremetal stack") if not skip_test: bmc_ip = self.__get_run_context('bmc_ip') node_id = self.__get_run_context('node_id') poller_id = self.__get_run_context('poller_id') available_sel_entries = self.__get_run_context('available_sel_entries') self.__qproc.match_on_routekey('polleralert-sel-update', min=available_sel_entries - 3, max=available_sel_entries + 3, routing_key='polleralert.sel.updated.#.{}.{}'.format(poller_id, node_id)) self.__run_ipmitool_command(bmc_ip, "sel clear") self.__verify_empty_sel(bmc_ip) sel_file = self.__create_selEntries_file(available_sel_entries) fit_common.remote_shell('ls') sel_file_path = fit_common.scp_file_to_host(sel_file) self.__run_ipmitool_command(bmc_ip, "sel add {0}".format(sel_file_path)) # wait for the results results = self._amqp_sp.finish(timeout=360) results[0].assert_errors(self)
def test_upload_list_microkernel(self): microkernel_list = [] serverip = self._get_serverip() test_microkernel_urls = fit_common.fitcfg( )["image_service"]["microkernel"] for microkernelrepo in test_microkernel_urls: if microkernelrepo[:3] == "scp": file_name = self._scp_file(microkernelrepo) else: file_name = self._download_file(microkernelrepo) self.assertNotEqual(self._upload_microkernel(file_name), "fail", "Upload microkernel failed!") microkernel_list.append(file_name) file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurl = "http://" + serverip + ":" + file_port + "/common/" + file_name self.assertTrue(self._file_exists(fileurl), "The microkernel file url could not found!") logs.debug_3("microkernel_list=%s" % microkernel_list) self._release(file_name) # time.sleep(60) micorkernel_json_list = self._list_microkernel() for kernelurl in microkernel_list: found_flag = False for microkernel in micorkernel_json_list: if microkernel["name"] == kernelurl: found_flag = True break self.assertTrue( found_flag, "microkernel with name: " + kernelurl + " not found!") logs.debug_3("Found all microkernels, list is correct!")
def _compare_repo(self, walkpath, os_version): # Go through all the files in the repo. # To save time, filetocompare parameter is provide in config file to set max file number to go through. logs.debug_3("entering ..." + walkpath) os_name = walkpath serverip = self._get_serverip() file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurlprefix = "http://" + serverip + ":" + file_port + "/" + os_name + '/' + os_version filetocompare = fit_common.fitcfg()["image_service"]["filetocompare"] i = 0 for path, dirs, files in os.walk("./" + walkpath): logs.debug_3(path) for f in files: logs.debug_3(f) a = path[2:] b = a.replace(walkpath, '', 1) fileurl = fileurlprefix + b + '/' + f logs.debug_3(fileurl) i = i + 1 if i > filetocompare: break if self._file_exists(fileurl) is False: logs.error("File not found:" + "/" + path[2:] + "/" + f) return False return True
def _compare_repo(self, walkpath, os_version): # Go through all the files in the repo. # To save time, filetocompare parameter is provide in config file to set max file number to go through. logs.debug_3("entering ..." + walkpath) os_name = walkpath serverip = self._get_serverip() file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurlprefix = "http://" + serverip + ":" + file_port + "/" + os_name + '/' + os_version filetocompare = fit_common.fitcfg()["image_service"]["filetocompare"] i = 0 for path, dirs, files in os.walk("./" + walkpath): logs.debug_3(path) for f in files: logs.debug_3(f) a = path[2:] b = a.replace(walkpath, '', 1) fileurl = fileurlprefix + b + '/' + f logs.debug_3(fileurl) i = i + 1 if i > filetocompare: break if self._file_exists(fileurl) is False: logs.error("File not found:" + "/" + path[2:] + "/" + f) return False return True
def test_upload_list_microkernel(self): microkernel_list = [] serverip = self._get_serverip() test_microkernel_urls = fit_common.fitcfg()["image_service"]["microkernel"] for microkernelrepo in test_microkernel_urls: if microkernelrepo[:3] == "scp": file_name = self._scp_file(microkernelrepo) else: file_name = self._download_file(microkernelrepo) self.assertNotEqual(self._upload_microkernel(file_name), "fail", "Upload microkernel failed!") microkernel_list.append(file_name) file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurl = "http://" + serverip + ":" + file_port + "/common/" + file_name self.assertTrue(self._file_exists(fileurl), "The microkernel file url could not found!") logs.debug_3("microkernel_list=%s" % microkernel_list) self._release(file_name) # time.sleep(60) micorkernel_json_list = self._list_microkernel() for kernelurl in microkernel_list: found_flag = False for microkernel in micorkernel_json_list: if microkernel["name"] == kernelurl: found_flag = True break self.assertTrue(found_flag, "microkernel with name: " + kernelurl + " not found!") logs.debug_3("Found all microkernels, list is correct!")
def test11_add_management_server(self): log.info_5("**** Creating management server.") usr = "" pwd = "" # find correct BMC passwords from credentials list for creds in fit_common.fitcreds()['bmc']: if fit_common.remote_shell('ipmitool -I lanplus -H ' + fit_common.fitcfg()['bmc'] + ' -U ' + creds['username'] + ' -P ' + creds['password'] + ' fru')['exitcode'] == 0: usr = creds['username'] pwd = creds['password'] # create management node using these creds if usr != "" and pwd != "": payload = {"name": "Management Server " + str(time.time()), "type": "mgmt", "autoDiscover": True, "obms": [{"service": "ipmi-obm-service", "config": {"host": fit_common.fitcfg()['bmc'], "user": usr, "password": pwd}}]} api_data = fit_common.rackhdapi("/api/2.0/nodes", action='post', payload=payload) self.assertEqual(api_data['status'], 201, 'Incorrect HTTP return code, expecting 201, got ' + str(api_data['status'])) else: self.fail("Unable to contact management server BMC, skipping MGMT node create")
def test13_load_ucs_manager_config(self): """ loads the test configuration into the UCS Manger """ handle = ucshandle.UcsHandle(fit_common.fitcfg()['ucsm_ip'], fit_common.fitcfg()['ucsm_user'], fit_common.fitcfg()['ucsm_pass']) self.assertTrue(handle.login(), 'Failed to log in to UCS Manager!') path, file = os.path.split(fit_common.fitcfg()['ucsm_config_file']) import_ucs_backup(handle, file_dir=path, file_name=file) self.assertTrue(handle.logout(), 'Failed to log out from UCS Manager!')
def _get_tester_ip(self): serverip = self._get_serverip() monip = fit_common.fitcfg()["rackhd-config"]["apiServerAddress"] cmd = "ping -R -c 1 " + monip + "" (command_output, exitstatus) = pexpect.run( "ssh -q -o StrictHostKeyChecking=no -t " + fit_common.fitcfg()["image_service"]['usr'] + "@" + serverip + " sudo bash -c \\\"" + cmd + "\\\"", withexitstatus=1, events={"assword": fit_common.fitcfg()["image_service"]['pwd'] + "\n"}, timeout=300) uud = command_output.split("\t") myip = uud[1].split("\r\n")[0] logs.debug('My IP address is: ' + myip) return myip
def test08_check_node_inventory(self): # this test will verify node inventory by BMC MAC if specified in STACK_CONFIG errorlist = [] # check OBM MAC or IP addresses if "stack_nodes" in fit_common.fitcfg(): nodecheck = fit_common.rackhdapi('/api/2.0/obms')['text'] for entry in fit_common.fitcfg()['stack_nodes']: log.debug(" Expecting node: {}".format(entry)) if entry['bmcmac'] not in str(nodecheck): log.error(" **** Missing node: {} BMC {}".format(entry['sku'], entry['bmcmac'])) errorlist.append(entry['bmcmac']) self.assertEqual(errorlist, [], "Missing nodes in catalog.") log.info(" **** Node Inventory check successful") else: log.info(" **** Node Inventory check skipped")
def test05_install_rackhd_config_files(self): print "**** Installing RackHD config files." # create RackHD config hdconfig = fit_common.fitcfg()['rackhd-config'] config_json = open('config.json', 'w') config_json.write( fit_common.json.dumps(hdconfig, sort_keys=True, indent=4)) config_json.close() # AMQP config files rabbitmq_config = open('rabbitmq.config', 'w') rabbitmq_config.write( '[{rabbit,[{tcp_listeners, [5672]},{loopback_users, []}]},{rabbitmq_management,[{listener, [{port, 15672},{ip,"127.0.0.1"}]}]}].' ) rabbitmq_config.close() # copy files to ORA fit_common.scp_file_to_ora('config.json') fit_common.scp_file_to_ora('rabbitmq.config') self.assertEqual( fit_common.remote_shell('cp config.json /opt/monorail/') ['exitcode'], 0, "RackHD Config file failure.") self.assertEqual( fit_common.remote_shell('cp rabbitmq.config /etc/rabbitmq/') ['exitcode'], 0, "AMQP Config file failure.") os.remove('config.json') os.remove('rabbitmq.config') self.assertEqual( fit_common.remote_shell(PROXYVARS + "cd ~/src/on-http && ./install-web-ui.sh") ['exitcode'], 0, "web-ui install failure.") self.assertEqual( fit_common.remote_shell( PROXYVARS + "cd ~/src/on-http && ./install-swagger-ui.sh")['exitcode'], 0, "swagger-ui install failure.")
def _get_serverip(self): args = fit_common.fitargs()['unhandled_arguments'] for arg in args: if "imageserver" in arg: serverip = arg.split("=")[1] return serverip return fit_common.fitcfg()["image_service"]["imageserver"]
def _get_serverip(self): args = fit_common.fitargs()['unhandled_arguments'] for arg in args: if "imageserver" in arg: serverip = arg.split("=")[1] return serverip return fit_common.fitcfg()["image_service"]["imageserver"]
def createRackHDUser(self): headers = { 'content-type': 'application/json', 'accept': 'application/json' } payload = { 'username': self.username, 'password': self.passwd, 'role': self.role } url = "https://{0}:{1}/api/2.0/users?auth_token={2}".format( fit_common.fitcfg()['rackhd_host'], str(fit_common.fitports()['https']), fit_common.AUTH_TOKEN) try: r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=User.timeout, verify=False) except requests.exceptions.RequestException as e: logs.info("error, {0}", e) return False if r.status_code != 201: logs.info( "error status code {0}, could not create RackHD user account", r.status_code) return False return True
def createRedfishUser(self): headers = { 'content-type': 'application/json', 'accept': 'application/json', 'x-auth-token': fit_common.REDFISH_TOKEN } payload = { 'Password': self.passwd, 'UserName': self.username, 'RoleId': self.role } url = "https://{0}:{1}/redfish/v1/AccountService/Accounts".format( fit_common.fitcfg()['rackhd_host'], str(fit_common.fitports()['https'])) try: r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=User.timeout, verify=False) except requests.exceptions.RequestException as e: logs.info("error, {0}", e) return False if r.status_code != 201: logs.info_4( "error status code {0}, could not create Redfish user account '{1}'" .format(r.status_code, self.username)) return False return True
def test13_load_ucs_manager_config(self): """ loads the test configuration into the UCS Manger """ UCSM_USER, UCSM_PASS = get_ucs_cred() UCSM_IP = fit_common.fitcfg().get('ucsm_ip') handle = ucshandle.UcsHandle(UCSM_IP, UCSM_USER, UCSM_PASS) self.assertTrue(handle.login(), 'Failed to log in to UCS Manager!') path, file = os.path.split(fit_common.fitcfg()['ucsm_config_file']) try: import_ucs_backup(handle, file_dir=path, file_name=file) except Exception as e: log.info_5("error trying to configure UCSPE, continue testing") log.info_5(str(e)) self.assertTrue(handle.logout(), 'Failed to log out from UCS Manager!')
def test_create_os_repo_from_iso_upload(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: file_name = self._download_file(osrepo["url"]) self.assertNotEqual( self._upload_iso_file(osrepo["osname"], osrepo["version"], file_name), "fail", "upload image failed!") self.assertTrue(self._mount_local_os_repo(file_name, osrepo["osname"]), "Could not mount ISO") self.assertTrue(self._compare_repo(osrepo["osname"], osrepo["version"]), "Fileserver compare failed!") self._release(file_name, osrepo["osname"])
def _upload_all_microkernels(self): for microkernelrepo in fit_common.fitcfg()["image_service"]["microkernel"]: if microkernelrepo[:3] == "scp": file_name = self._scp_file(microkernelrepo) else: file_name = self._download_file(microkernelrepo) self._upload_microkernel(file_name) self._release(file_name)
def _get_tester_ip(self): serverip = self._get_serverip() monip = fit_common.fitcfg()["rackhd-config"]["apiServerAddress"] cmd = "ping -R -c 1 " + monip + "" (command_output, exitstatus) = pexpect.run( "ssh -q -o StrictHostKeyChecking=no -t " + fit_common.fitcfg()["image_service"]['usr'] + "@" + serverip + " sudo bash -c \\\"" + cmd + "\\\"", withexitstatus=1, events={ "assword": fit_common.fitcfg()["image_service"]['pwd'] + "\n" }, timeout=300) uud = command_output.split("\t") myip = uud[1].split("\r\n")[0] logs.debug('My IP address is: ' + myip) return myip
def test_create_os_repo_from_local(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: os_name = osrepo["osname"] os_version = osrepo["version"] iso_url = osrepo["url"] servercmd = "wget " + osrepo["url"] serverip = self._get_serverip() fit_common.remote_shell( shell_cmd=servercmd, address=serverip, user=fit_common.fitcfg()["image_service"]['usr'], password=fit_common.fitcfg()["image_service"]['pwd']) path = "/home/" + fit_common.fitcfg()["image_service"]['usr'] file_name = self._download_file(iso_url) self.assertNotEqual( self._upload_os_from_local(os_name, os_version, path + '/' + file_name), "fail", "upload image failed!") self.assertTrue(self._mount_local_os_repo(file_name, os_name), "Could not mount ISO") self.assertTrue(self._compare_repo(os_name, os_version), "Fileserver compare failed!") self._release(file_name, os_name) self.test_delete_all_images()
def _list_file(self, mon_url): serverip = self._get_serverip() control_port = str(fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url) if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def _upload_all_microkernels(self): for microkernelrepo in fit_common.fitcfg( )["image_service"]["microkernel"]: if microkernelrepo[:3] == "scp": file_name = self._scp_file(microkernelrepo) else: file_name = self._download_file(microkernelrepo) self._upload_microkernel(file_name) self._release(file_name)
def _delete_microkernel(self, filename): mon_url = '/microkernel?name=' + filename serverip = self._get_serverip() control_port = str(fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="delete") if response['status'] in range(200, 205): return response['json'] else: logs.debug_3('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def _delete_os_image(self, osname, osversion): mon_url = '/images?name=' + osname + '&version=' + osversion serverip = self._get_serverip() control_port = str(fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="delete") if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def test_delete_microkernels(self): microkernel_list = self._list_microkernel() serverip = self._get_serverip() for microkernel in microkernel_list: self.assertNotEqual(self._delete_microkernel(microkernel["name"]), "fail", "delete image failed!") file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurl = "http://" + serverip + ":" + file_port + "/common/" + microkernel["name"] self.assertFalse(self._file_exists(fileurl), "The kernel image does not deleted completely") microkernel_list_clear = self._list_microkernel() self.assertTrue(microkernel_list_clear == []) logs.debug_3("All microkernels are cleared!")
def _create_esxi_repo(self): logs.debug("create a ESXi repo") for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: if osrepo["osname"] == "ESXi" and osrepo["version"] == "6.0": os_name = osrepo["osname"] os_version = osrepo["version"] http_iso_url = osrepo["url"] self._upload_os_by_network(os_name, os_version, http_iso_url) logs.debug("create ESXi repo successfully") return logs.error("No ESXi source found in config")
def test07_discover_pdu_node(self): log.info_5("**** Creating PDU node.") payload = {"type": "pdu", "name": "PDU", "autoDiscover": True, "obms": [{"service": "snmp", "config": {"host": fit_common.fitcfg()['pdu'], "community": fit_common.fitcreds()['snmp'][0]['community']}}]} api_data = fit_common.rackhdapi("/api/2.0/nodes/", action='post', payload=payload) self.assertEqual(api_data['status'], 201, 'Incorrect HTTP return code, expecting 201, got ' + str(api_data['status']))
def _create_esxi_repo(self): logs.debug("create a ESXi repo") for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: if osrepo["osname"] == "ESXi" and osrepo["version"] == "6.0": os_name = osrepo["osname"] os_version = osrepo["version"] http_iso_url = osrepo["url"] self._upload_os_by_network(os_name, os_version, http_iso_url) logs.debug("create ESXi repo successfully") return logs.error("No ESXi source found in config")
def test_create_os_repo_from_ftp(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: if osrepo["linktype"] == "ftp": os_name = osrepo["osname"] os_version = osrepo["version"] ftp_iso_url = osrepo["url"] self.assertNotEqual( self._upload_os_by_network(os_name, os_version, ftp_iso_url), "fail", "upload image failed!") file_name = self._download_file(ftp_iso_url) self.assertTrue(self._mount_local_os_repo(file_name, os_name), "Could not mount ISO") self.assertTrue(self._compare_repo(os_name, os_version), "Fileserver compare failed!") self._release(file_name, os_name)
def _upload_microkernel(self, filename): myfile = open(filename, 'rb') serverip = self._get_serverip() mon_url = '/microkernel?name=' + filename control_port = str(fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="binary-put", rest_payload=myfile) if response['status'] in range(200, 205): return response['json'] else: logs.debug_3('Incorrect HTTP return code, expected 201, got:' + str(response['status'])) return "fail"
def _upload_os_from_local(self, osname, osversion, path): mon_url = '/images?name=' + osname + '&version=' + osversion + '&isolocal=' + path serverip = self._get_serverip() control_port = str(fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful( "http://" + serverip + ":" + control_port + mon_url, rest_action="put", rest_payload={}, rest_timeout=None, rest_headers={}) if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def _list_file(self, mon_url): serverip = self._get_serverip() control_port = str( fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url) if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def _upload_iso_file(self, osname, osversion, filename): serverip = self._get_serverip() mon_url = '/images?name=' + osname + '&version=' + osversion + '&isoclient=' + filename myfile = open(filename, 'rb') control_port = str(fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful( "http://" + serverip + ":" + control_port + mon_url, rest_action="binary-put", rest_payload=myfile, rest_timeout=None, rest_headers={}) if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def test_create_os_repo_from_store(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: os_name = osrepo["osname"] os_version = osrepo["version"] iso_url = osrepo["url"] file_name = self._download_file(iso_url) self.assertNotEqual(self._upload_iso_file_to_store(file_name), "fail", "upload image failed!") self.assertNotEqual( self._upload_os_by_store(os_name, os_version, file_name), "fail", "upload image failed!") self.assertTrue(self._mount_local_os_repo(file_name, os_name), "Could not mount ISO") self.assertTrue(self._compare_repo(os_name, os_version), "Fileserver compare failed!") self._release(file_name, os_name) self.test_delete_all_images()
def test_full_sel(self): # """Test: Full sel log""" # listen to AMQP skip_test = False # skip filling the BMC SEL log on real hardware as don't need to test how the HW is working if "stackType" in fit_common.fitcfg(): if fit_common.fitcfg()['stackType'] == "baremetal": skip_test = True logs.info(" *** Skipping test_full_sel on baremetal stack") if not skip_test: bmc_ip = self.__get_run_context('bmc_ip') node_id = self.__get_run_context('node_id') poller_id = self.__get_run_context('poller_id') available_sel_entries = self.__get_run_context( 'available_sel_entries') self.__qproc.match_on_routekey( 'polleralert-sel-update', min=available_sel_entries - 3, max=available_sel_entries + 3, routing_key='polleralert.sel.updated.#.{}.{}'.format( poller_id, node_id)) self.__run_ipmitool_command(bmc_ip, "sel clear") self.__verify_empty_sel(bmc_ip) sel_file = self.__create_selEntries_file(available_sel_entries) fit_common.remote_shell('ls') sel_file_path = fit_common.scp_file_to_host(sel_file) self.__run_ipmitool_command(bmc_ip, "sel add {0}".format(sel_file_path)) # wait for the results results = self._amqp_sp.finish(timeout=360) results[0].assert_errors(self)
def test_delete_microkernels(self): microkernel_list = self._list_microkernel() serverip = self._get_serverip() for microkernel in microkernel_list: self.assertNotEqual(self._delete_microkernel(microkernel["name"]), "fail", "delete image failed!") file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurl = "http://" + serverip + ":" + file_port + "/common/" + microkernel[ "name"] self.assertFalse(self._file_exists(fileurl), "The kernel image does not deleted completely") microkernel_list_clear = self._list_microkernel() self.assertTrue(microkernel_list_clear == []) logs.debug_3("All microkernels are cleared!")
def _delete_microkernel(self, filename): mon_url = '/microkernel?name=' + filename serverip = self._get_serverip() control_port = str( fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="delete") if response['status'] in range(200, 205): return response['json'] else: logs.debug_3('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def test07_discover_pdu_node(self): print "**** Creating PDU node." payload = { "type": "pdu", "name": "PDU", "autoDiscover": "true", "snmpSettings":{ "host": fit_common.fitcfg()['pdu'], "community": fit_common.fitcreds()['snmp'][0]['community'], } } api_data = fit_common.rackhdapi("/api/2.0/nodes/", action='post', payload=payload) self.assertEqual(api_data['status'], 201, 'Incorrect HTTP return code, expecting 201, got ' + str(api_data['status']))
def test_create_os_repo_from_iso_upload(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: file_name = self._download_file(osrepo["url"]) self.assertNotEqual( self._upload_iso_file(osrepo["osname"], osrepo["version"], file_name), "fail", "upload image failed!") self.assertTrue( self._mount_local_os_repo(file_name, osrepo["osname"]), "Could not mount ISO") self.assertTrue( self._compare_repo(osrepo["osname"], osrepo["version"]), "Fileserver compare failed!") self._release(file_name, osrepo["osname"])
def _delete_os_image(self, osname, osversion): mon_url = '/images?name=' + osname + '&version=' + osversion serverip = self._get_serverip() control_port = str( fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="delete") if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def deleteRackHDUserAccount(self): headers = { 'accept': 'application/json', 'authorization': 'JWT ' + fit_common.AUTH_TOKEN } url = "https://{0}:{1}/api/2.0/users/{2}".format(fit_common.fitcfg()['rackhd_host'], str(fit_common.fitports()['https']), self.username) try: r = requests.delete(url, headers=headers, timeout=User.timeout, verify=False) except requests.exceptions.RequestException as e: logs.info("error, {0}", e) return None if r.status_code != 204: logs.info("error status code {0}, unable to delete RackHD user '{1}'", r.status_code, self.username) return None
def test_create_os_repo_from_local(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: os_name = osrepo["osname"] os_version = osrepo["version"] iso_url = osrepo["url"] servercmd = "wget " + osrepo["url"] serverip = self._get_serverip() fit_common.remote_shell( shell_cmd=servercmd, address=serverip, user=fit_common.fitcfg()["image_service"]['usr'], password=fit_common.fitcfg()["image_service"]['pwd']) path = "/home/" + fit_common.fitcfg()["image_service"]['usr'] file_name = self._download_file(iso_url) self.assertNotEqual( self._upload_os_from_local(os_name, os_version, path + '/' + file_name), "fail", "upload image failed!") self.assertTrue(self._mount_local_os_repo(file_name, os_name), "Could not mount ISO") self.assertTrue(self._compare_repo(os_name, os_version), "Fileserver compare failed!") self._release(file_name, os_name) self.test_delete_all_images()
def test04_setup_rackhd_docker_services(self): # add the .env variables for HOST IP into the ".env" file envfile = open("envfile", 'w') envfile.write("TAG=latest\n") envfile.write("REGISTRY_IP=172.31.128.1\n") host_ip = "HOST_IP=" + socket.gethostbyname(fit_common.fitcfg()['rackhd_host']) + "\n" envfile.write(host_ip) envfile.close() fit_common.scp_file_to_ora("envfile") self.assertEqual(fit_common.remote_shell('cp envfile /home/onrack/.env' )['exitcode'], 0, "copy of env file failed.") os.remove('envfile') # Get the username and password from config-mn/credentials.json username = fit_common.fitcreds()['docker_hub'][0]['username'] password = fit_common.fitcreds()['docker_hub'][0]['password'] command = 'cd rackhd/docker/dell; sudo docker login --username='******' --password='******'exitcode'], 0, "Docker login failed.") # Docker up consul command = "cd rackhd/docker/dell; sudo docker-compose up -d consul" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "Docker up consul failed.") time.sleep(30) command = "cd rackhd/docker/dell; sudo chmod +x set_config.sh; sudo ./set_config.sh" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "set_config.sh failed.") # Docker up the rest of micro service containers command = "cd rackhd/docker/dell; sudo docker-compose up -d" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "docker-compose up failed.") time.sleep(180) # Set port to 8080 in smi config file port_var = fit_common.fitports()['http'] command = "cd rackhd/docker/dell; sudo sed -i 's/9090/" + str(port_var) + "/g' set_rackhd_smi_config.sh" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "set_rackhd_smi_config.sh failed.") # Populates smi config file command = "cd rackhd/docker/dell; sudo ./set_rackhd_smi_config.sh" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "set_rackhd_smi_config.sh failed.") # Replace callback Uri port from 9988 to 9080 in smi config file command = "cd /opt/monorail; sudo sed -i 's/9988/9080/g' smiConfig.json" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "Change port from 9988 to 9080 in smiConfig failed.") # Restart on-http service command = "sudo service on-http restart" self.assertEqual(fit_common.remote_shell(command)['exitcode'], 0, "failed to start on-http service.")
def test_create_os_repo_from_ftp(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: if osrepo["linktype"] == "ftp": os_name = osrepo["osname"] os_version = osrepo["version"] ftp_iso_url = osrepo["url"] self.assertNotEqual( self._upload_os_by_network(os_name, os_version, ftp_iso_url), "fail", "upload image failed!") file_name = self._download_file(ftp_iso_url) self.assertTrue(self._mount_local_os_repo(file_name, os_name), "Could not mount ISO") self.assertTrue(self._compare_repo(os_name, os_version), "Fileserver compare failed!") self._release(file_name, os_name)
def _upload_microkernel(self, filename): myfile = open(filename, 'rb') serverip = self._get_serverip() mon_url = '/microkernel?name=' + filename control_port = str( fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="binary-put", rest_payload=myfile) if response['status'] in range(200, 205): return response['json'] else: logs.debug_3('Incorrect HTTP return code, expected 201, got:' + str(response['status'])) return "fail"
def deleteRedfishUserAccount(self): headers = { 'accept': 'application/json', 'x-auth-token': fit_common.REDFISH_TOKEN } url = "https://{0}:{1}/redfish/v1/AccountService/Accounts/{2}".format(fit_common.fitcfg()['rackhd_host'], str(fit_common.fitports()['https']), self.username) try: r = requests.delete(url, headers=headers, timeout=User.timeout, verify=False) except requests.exceptions.RequestException as e: logs.info("error, {0}", e) return None if r.status_code != 204: logs.info("error status code {0}, unable to delete Redfish user '{1}'", r.status_code, self.username) return None
def test_create_os_repo_from_store(self): for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: os_name = osrepo["osname"] os_version = osrepo["version"] iso_url = osrepo["url"] file_name = self._download_file(iso_url) self.assertNotEqual(self._upload_iso_file_to_store(file_name), "fail", "upload image failed!") self.assertNotEqual( self._upload_os_by_store(os_name, os_version, file_name), "fail", "upload image failed!") self.assertTrue(self._mount_local_os_repo(file_name, os_name), "Could not mount ISO") self.assertTrue(self._compare_repo(os_name, os_version), "Fileserver compare failed!") self._release(file_name, os_name) self.test_delete_all_images()
def _upload_os_by_network(self, osname, osversion, source_url): mon_url = '/images?name=' + osname + '&version=' + osversion + '&isoweb=' + source_url serverip = self._get_serverip() control_port = str( fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="put", rest_payload={}, rest_timeout=None, rest_headers={}) if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201, got:' + str(response['status'])) return "fail"
def _upload_iso_file_to_store(self, filename): serverip = self._get_serverip() mon_url = '/iso?name=' + filename file = open(filename, 'rb') control_port = str( fit_common.fitcfg()["image_service"]["control_port"]) response = fit_common.restful("http://" + serverip + ":" + control_port + mon_url, rest_action="binary-put", rest_payload=file, rest_timeout=None, rest_headers={}) if response['status'] in range(200, 205): return response['json'] else: logs.error('Incorrect HTTP return code, expected 201-205, got:' + str(response['status'])) return "fail"
def _delete_all_images(self): os_image_list = self._list_os_image() serverip = self._get_serverip() for image_repo in os_image_list: self.assertNotEqual( self._delete_os_image(image_repo["name"], image_repo["version"]), "fail", "delete image failed!") file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) fileurlprefix = "http://" + serverip + ":" + file_port + "/" + image_repo["name"] + '/' + \ image_repo["version"] + '/' self.assertFalse(self._file_exists(fileurlprefix), "The repo url does not deleted completely") os_image_list_clear = self._list_os_image() self.assertTrue(os_image_list_clear == []) os_iso_list = self._list_os_iso() for iso_repo in os_iso_list: self.assertNotEqual(self._delete_os_iso(iso_repo["name"]), "fail", "delete iso failed!") os_iso_list_clear = self._list_os_iso() self.assertTrue(os_iso_list_clear == [], "The iso does not deleted completely") logs.debug("All repo is cleared!")
def test05_install_rackhd_config_files(self): print "**** Installing RackHD config files." # create RackHD config hdconfig = fit_common.fitcfg()['rackhd-config'] config_json = open('config.json', 'w') config_json.write(fit_common.json.dumps(hdconfig, sort_keys=True, indent=4)) config_json.close() # AMQP config files rabbitmq_config = open('rabbitmq.config', 'w') rabbitmq_config.write('[{rabbit,[{tcp_listeners, [5672]},{loopback_users, []}]},{rabbitmq_management,[{listener, [{port, 15672},{ip,"127.0.0.1"}]}]}].') rabbitmq_config.close() # copy files to ORA fit_common.scp_file_to_ora('config.json') fit_common.scp_file_to_ora('rabbitmq.config') self.assertEqual(fit_common.remote_shell('cp config.json /opt/monorail/')['exitcode'], 0, "RackHD Config file failure.") self.assertEqual(fit_common.remote_shell('cp rabbitmq.config /etc/rabbitmq/')['exitcode'], 0, "AMQP Config file failure.") os.remove('config.json') os.remove('rabbitmq.config')
def test_bootstrapping_ext_esxi6(self): self._create_esxi_repo() node_collection = test_api_utils.get_node_list_by_type("compute") fileserver_ip = self._get_tester_ip() file_port = str(fit_common.fitcfg()["image_service"]["file_port"]) repourl = "http://" + fileserver_ip + ':' + file_port + '/ESXi' + '/' + '6.0' + '/' # Select one node at random for dummy in node_collection: node = node_collection[random.randint(0, len(node_collection) - 1)] logs.debug('Running ESXI 6.0 bootstrap from external file server.') node_obm = fit_common.rackhdapi('/api/2.0/nodes/' + node)['json']['obms'] if node_obm == []: self.assertTrue(self._apply_obmsetting_to_node(node), "Fail to apply obm setting!") fit_common.rackhdapi('/api/2.0/nodes/' + node + '/workflows/action', action='put', payload={ "command": "cancel", "options": {} }) nodehostname = 'esxi60' payload_data = { "options": { "defaults": { "version": "6.0", "repo": repourl, "rootPassword": "******", "hostname": nodehostname } } } result = fit_common.rackhdapi('/api/2.0/nodes/' + node + '/workflows?name=Graph.InstallEsxi', action='post', payload=payload_data) self.assertEqual( result['status'], 201, 'Was expecting code 201. Got ' + str(result['status'])) self.assertEqual( self._wait_for_task_complete(result['json']["instanceId"], retries=80), True, 'TaskID ' + result['json']["instanceId"] + ' not successfully completed.') self._delete_all_images()
def test_list_images(self): os_id_list = [] for osrepo in fit_common.fitcfg()["image_service"]["os_image"]: os_name = osrepo["osname"] os_version = osrepo["version"] response = self._upload_os_by_network(os_name, os_version, osrepo["url"]) self.assertNotEqual(response, "fail", "upload iso failed!") id = response["id"] os_id_list.append(id) logs.debug("os_id_list=", os_id_list) os_image_list = self._list_os_image() for osid in os_id_list: found_flag = False for image_repo in os_image_list: if image_repo["id"] == osid: found_flag = True break self.assertTrue(found_flag, "image with id " + osid + " not found!") logs.error("Found all os, list is correct!")
def setRackHDToken(self, username, passwd): headers = { 'content-type': 'application/json', 'accept': 'application/json' } payload = { 'username': username, 'password': passwd } url = "https://{0}:{1}/login".format(fit_common.fitcfg()['rackhd_host'], str(fit_common.fitports()['https'])) try: r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=User.timeout, verify=False) except requests.exceptions.RequestException as e: logs.debug_3("error, %s", e) return None if r.status_code != 200: logs.info_4("error status code {0}, unable to set user rackhd token".format(r.status_code)) return None return 'JWT ' + json.loads(r.content)['token']