コード例 #1
0
    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)
コード例 #2
0
 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!")
コード例 #3
0
 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
コード例 #4
0
 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
コード例 #5
0
 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!")
コード例 #6
0
 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")
コード例 #7
0
 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!')
コード例 #8
0
 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
コード例 #9
0
 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")
コード例 #10
0
 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.")
コード例 #11
0
 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"]
コード例 #12
0
 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"]
コード例 #13
0
ファイル: user.py プロジェクト: khanchan/RackHD
 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
コード例 #14
0
ファイル: user.py プロジェクト: khanchan/RackHD
 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
コード例 #15
0
    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!')
コード例 #16
0
 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"])
コード例 #17
0
 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)
コード例 #18
0
 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
コード例 #19
0
 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()
コード例 #20
0
 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"
コード例 #21
0
 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)
コード例 #22
0
 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"
コード例 #23
0
 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"
コード例 #24
0
 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!")
コード例 #25
0
 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")
コード例 #26
0
 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']))
コード例 #27
0
 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")
コード例 #28
0
 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)
コード例 #29
0
 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"
コード例 #30
0
 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"
コード例 #31
0
 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"
コード例 #32
0
 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"
コード例 #33
0
 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()
コード例 #34
0
    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)
コード例 #35
0
 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!")
コード例 #36
0
 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"
コード例 #37
0
ファイル: rackhd_stack_init.py プロジェクト: tannoa2/RackHD
 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']))
コード例 #38
0
 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"])
コード例 #39
0
 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"
コード例 #40
0
 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
コード例 #41
0
 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()
コード例 #42
0
    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.")
コード例 #43
0
 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)
コード例 #44
0
 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"
コード例 #45
0
 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
コード例 #46
0
 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()
コード例 #47
0
 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"
コード例 #48
0
 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"
コード例 #49
0
 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!")
コード例 #50
0
 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')
コード例 #51
0
 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()
コード例 #52
0
 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!")
コード例 #53
0
 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']