diff --git a/tests/features/common-tools/common-consts.js b/tests/features/common-tools/common-consts.js index 38a7d6f3c..21ddde446 100644 --- a/tests/features/common-tools/common-consts.js +++ b/tests/features/common-tools/common-consts.js @@ -96,7 +96,10 @@ module.exports = { ] }, Common_Lists: { - Action_Menu_List: ['Download', 'Copy URI', 'View YAML', 'Add a tag', 'Delete'] + Action_Menu_List: ['Download', 'Copy URI', 'View YAML', 'Add a tag', 'Delete'], + Handler_List: ['train'], + Pods_Priority_List: ['Low','Medium', 'High'], + Ranking_Criteria_List: ['Min','Max'] }, Datasets_Info_Pane: { Tab_List: ['Overview', 'Preview', 'Metadata', 'Analysis'], @@ -106,6 +109,7 @@ module.exports = { 'Version tag:', 'Iter:', 'Size:', + 'Label column:', 'Path:', 'URI:', 'UID:', @@ -177,6 +181,7 @@ module.exports = { 'Iter:', 'Kind:', 'Size:', + 'Label column:', 'Path:', 'URI:', 'Model file:', @@ -306,9 +311,9 @@ module.exports = { Function_Name_Batch_Run_Hint: 'Valid characters: a–z, A–Z, 0–9, –, _, .\nMust begin and end with: a–z, A–Z, 0–9\nLength – max: 63\n' + 'This field is required', - Labels_Warning_Key: 'Valid characters: a–z, A–Z, 0–9, –, _, .\nMust begin and end with: a–z, A–Z, 0–9\nLength – max: 56\n' + - 'Key should be unique', - Labels_Warning_Value: 'Valid characters: a–z, A–Z, 0–9, –, _, .\nMust begin and end with: a–z, A–Z, 0–9\nLength – max: 56', + Labels_Warning_Key: 'Valid characters: a–z, A–Z, 0–9, –, _, .\nMust begin and end with: a–z, A–Z, 0–9\nLength – max: 75\n' + + 'Key must be unique', + Labels_Warning_Value: 'Valid characters: a–z, A–Z, 0–9, –, _, .\nMust begin and end with: a–z, A–Z, 0–9\nLength – max: 75', Feature_Set_Name_Hint: 'Valid characters: a–z, A–Z, 0–9, –, _, .\nMust begin and end with: a–z, A–Z, 0–9\nLength – max: 56\n' + 'This field is required', @@ -337,7 +342,7 @@ module.exports = { Base_Image_Hint: "The name of a base container image from which to build the function's processor image", Limit_Number_Warning: 'Limit must be bigger than or equal to Request and not be less than 1', - Minimum_Value_Warning: 'The minimum value should be 1', + Minimum_Value_Warning: 'The minimum value must be 1', CPU_Limit_Number_Warning: 'Limit must be bigger than or equal to Request and not be less than 0.001', Request_Number_Warning: 'Request must be less than or equal to Limit and not be less than 1', diff --git a/tests/features/common/actions/api.actions.js b/tests/features/common/actions/api.actions.js index ac96b1fbb..14ce787fb 100644 --- a/tests/features/common/actions/api.actions.js +++ b/tests/features/common/actions/api.actions.js @@ -327,7 +327,7 @@ const action = { await mainHttpClient .post( - `${REACT_APP_MLRUN_API_URL_ARTIFACTS}/projects//${mlProjectName}/artifacts/${uid}/${mlArtifactName}`, + `${REACT_APP_MLRUN_API_URL_ARTIFACTS}/projects//${mlProjectName}/artifacts`, data ) .then(res => { diff --git a/tests/features/common/actions/common.action.js b/tests/features/common/actions/common.action.js index 5ece97ff3..d049f6a50 100644 --- a/tests/features/common/actions/common.action.js +++ b/tests/features/common/actions/common.action.js @@ -94,6 +94,12 @@ const action = { .perform() await driver.sleep(250) }, + verifyClassDisabled: async function (driver, component) { + const inputField = await driver.findElement(component) + const attributes = await inputField.getAttribute('class') + const flag = attributes.includes('form-field__wrapper-disabled') + expect(flag).equal(true) + }, verifyElementDisabled: async function(driver, component) { const element = await driver.findElement(component) const flag = await element.getAttribute('disabled') diff --git a/tests/features/common/actions/input-group.action.js b/tests/features/common/actions/input-group.action.js index a90a84c38..72f52950a 100644 --- a/tests/features/common/actions/input-group.action.js +++ b/tests/features/common/actions/input-group.action.js @@ -135,6 +135,7 @@ const action = { }, checkWarningHintText: async function (driver, inputGroup, hintComponent, text) { const hintButton = await driver.findElement(inputGroup.warningHint) + await driver.sleep(250) await hintButton.click() await driver.sleep(250) const hint = await driver.findElement(hintComponent) diff --git a/tests/features/common/actions/table.action.js b/tests/features/common/actions/table.action.js index feb32ef31..3c6006167 100644 --- a/tests/features/common/actions/table.action.js +++ b/tests/features/common/actions/table.action.js @@ -74,10 +74,11 @@ const action = { value ) { const arr = await getColumnValues(driver, table, columnName) + const subString = value.replace('=', '\n:\n') expect(arr.length > 0).equal(true) - expect(arr.every(item => item.includes(value))).equal( + expect(arr.every(item => item.includes(subString))).equal( true, - `Value "${value}" does not includes in all values: [${arr}]` + `Value "${subString}" does not includes in all values: [${arr}]` ) }, isContainsSubstringInColumnAttributrCells: async function( diff --git a/tests/features/common/page-objects/commonPagesHeader.po.js b/tests/features/common/page-objects/commonPagesHeader.po.js index a91847212..8d6c7d64d 100644 --- a/tests/features/common/page-objects/commonPagesHeader.po.js +++ b/tests/features/common/page-objects/commonPagesHeader.po.js @@ -87,4 +87,24 @@ module.exports = { Project_Monitoring_First_Instance: By.css('.project-details__details .link'), Project_Monitoring_Second_Instance: By.css('.project-overview-card:nth-of-type(3) .link:nth-of-type(4)'), Project_Monitoring_Active: By.css('#monitor'), + Step_1_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(1)'), + Step_1_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(1) div'), + Step_2_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(2)'), + Step_2_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(2) div'), + Step_3_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(3)'), + Step_3_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(3) div'), + Step_4_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(4)'), + Step_4_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(4) div'), + Step_5_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(5)'), + Step_5_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(5) div'), + Step_6_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(6)'), + Step_6_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(6) div'), + Step_7_Button: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(7)'), + Step_7_Button_text: By.css('.modal .modal__content .modal__body .wizard-steps .btn:nth-of-type(7) div'), + Form_Header_Run_Details: By.css('.job-wizard__run-details .form-row .form-step-title'), + Form_Header_Data_Inputs: By.css('.job-wizard__data-inputs .form-row .form-step-title'), + Form_Header_Parameters: By.css('.job-wizard__parameters .form-row .form-step-title'), + Form_Header_Resources: By.css('.job-wizard__resources .form-row .form-step-title'), + Form_Header_Advanced: By.css('.job-wizard__advanced .form-row .form-step-title'), + Form_Header_Hyperparameter_Strategy: By.css('.job-wizard__hyperparameter-strategy .form-row .form-step-title'), } diff --git a/tests/features/common/page-objects/info-pane.po.js b/tests/features/common/page-objects/info-pane.po.js index f1eaa6cbf..819aca2df 100644 --- a/tests/features/common/page-objects/info-pane.po.js +++ b/tests/features/common/page-objects/info-pane.po.js @@ -120,6 +120,28 @@ const artifactOverviewTable = { } } +const datasetOverviewTable = { + root: '.table__item .item-info__details:nth-of-type(1)', + header: {}, + body: { + row: { + root: '', + fields: { + hash: '.details-item:nth-of-type(1) .details-item__data', + key: '.details-item:nth-of-type(2) .details-item__data', + tag: '.details-item:nth-of-type(3) .details-item__data', + iter: '.details-item:nth-of-type(4) .details-item__data', + size: '.details-item:nth-of-type(5) .details-item__data', + path: '.details-item:nth-of-type(7) .details-item__data', + uri: '.details-item:nth-of-type(7) .details-item__data', + uid: '.details-item:nth-of-type(8) .details-item__data', + updated: '.details-item:nth-of-type(9) .details-item__data', + labels: '.details-item:nth-of-type(10) .details-item__data' + } + } + } +} + const modelsOverviewTable = { root: '.table__item .item-info__details:nth-of-type(1)', header: {}, @@ -564,6 +586,7 @@ module.exports = { Overview_Producer_Headers: commonTable(infoPaneOverviewProducerHeaders), Overview_Sources_Headers: commonTable(infoPaneOverviewSourcesHeaders), Train_Button: By.css('[data-testid="detailsPanel"] .item-header__buttons button'), + Label_column: By.css('.item-info__details .details-item:nth-of-type(6) .details-item__data'), Overview_Hash_Header: labelComponent( generateLabelGroup( '.item-info__details:nth-of-type(1) .details-item:nth-of-type(1) .details-item__header', @@ -573,14 +596,14 @@ module.exports = { ), Overview_UID_Header: labelComponent( generateLabelGroup( - '.item-info__details:nth-of-type(1) .details-item:nth-of-type(8) .details-item__header', + '.item-info__details:nth-of-type(1) .details-item:nth-of-type(9) .details-item__header', false, true ) ), Expand_Sources: By.css('.details-item .info-sources'), Info_Sources_Table: commonTable(filesInfoSourcesTable), - Overview_Table: commonTable(artifactOverviewTable), + Overview_Table: commonTable(datasetOverviewTable), Edit_btn_table_view: commonEditBtnTableView, Edit_btn_full_view: commonEditBtnFullView, Version_tag_Input_table_view: commonVersionTagInputTableView, diff --git a/tests/features/common/page-objects/interactive-popup.po.js b/tests/features/common/page-objects/interactive-popup.po.js index d81f5c889..6344b5eac 100644 --- a/tests/features/common/page-objects/interactive-popup.po.js +++ b/tests/features/common/page-objects/interactive-popup.po.js @@ -24,9 +24,11 @@ import labelComponent from '../components/label.component' import checkboxComponent from '../components/checkbox.component' import textAreaGroup from '../components/text-area.component' import comboBox from '../components/combo-box.component' +import numberInputGroup from '../components/number-input-group.component' import { generateLabelGroup, + generateNumberInputGroup, generateInputGroup, generateDropdownGroup, generateTextAreaGroup @@ -168,6 +170,154 @@ const artifactsLabelsTable = { } } +const trainModelLabelsTable = { + root: + '.job-wizard__run-details .form-row:nth-of-type(4) .chips', + header: {}, + body: { + root: '.chips-wrapper', + add_row_btn: '.button-add', + row: { + root: '.chip-block', + fields: { + key_input: 'input.input-label-key', + value_input: 'input.input-label-value', + key_verify: '.edit-chip-container input.input-label-key', + value_verify: '.edit-chip-container input.input-label-value', + remove_btn: '.edit-chip__icon-close' + } + } + } +} + +const dataInputsHeaders = { + root: '.wizard-form__content [data-testid="dataInputs.dataInputsTable"]', + header: {}, + body: { + root: '.form-table__header-row', + row: { + root: '.form-table__cell', + fields: { + key: 'div' + } + } + } +} + +const parametersHeaders = { + root: '.wizard-form__content [data-testid="parameters.parametersTable"]', + header: {}, + body: { + root: '.form-table__header-row', + row: { + root: '.form-table__cell', + fields: { + key: 'div' + } + } + } +} + +const podsPriorityDropdown = dropdownComponent( + generateDropdownGroup( + '.modal__content .modal__body .job-wizard__resources .resources__select', + '.form-field-select .form-field__wrapper-normal', + '.options-list__body .select__item-label', + '.data-ellipsis' + ) +) + +const resourcesNodeSelectionTable = { + root: + '.wizard-form__content [data-testid="resources.nodeSelectorTable"]', + header: {}, + body: { + add_row_btn: '.form-table__action-row button', + row: { + root: '.form-table__row', + fields: { + key: '.form-table__cell_1:nth-of-type(1)', + value: '.form-table__cell_1:nth-of-type(2)', + delete_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(2)', + edit_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(1)', + apply_edit_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(1)', + key_input: { + componentType: inputGroup, + structure: generateInputGroup('.form-table__cell_1:nth-of-type(1)', true, false, false) + }, + value_input: { + componentType: inputGroup, + structure: generateInputGroup( + '.form-table__cell_1:nth-of-type(2)', + true, + false, + false + ) + } + } + } + } +} + +const trainModelDataInputsTable = { + root: '.wizard-form__content [data-testid="dataInputs.dataInputsTable"]', + header: {}, + body: { + add_row_btn: '.form-table__action-row button', + row: { + root: '.form-table__row', + fields: { + name_verify: '.form-table__name-cell', + edit_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(1)', + apply_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(1)', + delete_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(2)', + name_input: '.form-field-input input', + path_dropdown: { + componentType: dropdownComponent, + structure: generateDropdownGroup( + '.form-table__cell_1:nth-of-type(3) .form-field-combobox', + '.form-field__icons:nth-of-type(1)', + '.form-field-combobox__dropdown-list-option', + false, + false) + }, + path_input: 'input.form-field-combobox__input', + path_verify: '.form-table__cell_1:nth-of-type(3)' + } + } + } +} + +const trainModelParametersTable = { + root: '.wizard-form__content [data-testid="parameters.parametersTable"]', + header: {}, + body: { + add_row_btn: '.form-table__action-row button', + row: { + root: '.form-table__row', + fields: { + name_verify: '.form-table__cell_2', + edit_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(1)', + apply_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(1)', + delete_btn: '.form-table__actions-cell .round-icon-cp:nth-of-type(2)', + name_input: '.form-table__cell_2 .form-field-input input', + type_dropdown: { + componentType: dropdownComponent, + structure: generateDropdownGroup( + '.form-table__cell_1 .form-field-select', + '.form-field__icons', + '.pop-up-dialog .options-list__body .select__item', + false, + false) + }, + type_dropdown_verify: '.form-table__cell_1 .data-ellipsis', + value_input: '.form-table__cell_3 .form-field__control input', + value_verify: '.form-table__cell_3 .data-ellipsis' + } + } + } +} + // Common components const commonCancelButton = By.css('.pop-up-dialog button.pop-up-dialog__btn_cancel') @@ -246,7 +396,115 @@ module.exports = { }, trainModel:{ Title: By.css('.modal .modal__header-title'), - Cross_Cancel_Button: By.css('.modal .modal__header-button') + Cross_Cancel_Button: By.css('.modal .modal__header-button'), + Function_Title: By.css( + '.modal .modal__content h6.modal__header-sub-title' + ), + Hyperparameter_Checkbox: checkboxComponent({ + root: '#overlay_container .form-field-checkbox', + elements: { + checkbox: 'input', + name: 'label', + icon: '' + } + }), + Next_Button: By.css('.modal__content [data-testid="wizard-btn-next"]'), + Back_Button: By.css('.modal__content [data-testid="wizard-btn-back"]'), + Run_Training_Now_Button: By.css('.modal__content [data-testid="run-btn"]'), + Schedule_Training_Job_Button: By.css('.modal__content [data-testid="schedule-btn"]'), + Function_Name_Input: inputGroup( + generateInputGroup( + '.form-row .form-field-input .form-field__wrapper', + false, + true, + '.form-field__icons svg' + ) + ), + Version_Tag_Dropdown_element: By.css('[data-testid="runDetails.version-form-field-select"] [data-testid="select-header"]'), + Handler_Dropdown: dropdownComponent( + generateDropdownGroup('.form-col-1:nth-of-type(3)', '[data-testid="runDetails.handler-form-field-select"]', '.select__item-main-label', false, false) + ), + Train_Model_Labels_Table: commonTable(trainModelLabelsTable), + Add_Label_Button: By.css('.job-wizard__run-details .form-row:nth-of-type(4) .chips .chips-wrapper .button-add'), + Close_Label_Button: By.css('.job-wizard__run-details .form-row:nth-of-type(4) .chips .chips-wrapper .edit-chip__icon-close'), + Run_Details_Labels_Key: inputGroup( + generateInputGroup( + '.job-wizard__run-details .form-row:nth-of-type(4) .chips-wrapper', + false, + true, + '.pop-up-dialog' + ) + ), + Run_Details_Labels_Value: By.css ('.job-wizard__run-details .form-row:nth-of-type(4) .chips-wrapper [id="runDetails.labels[0].value"]'), + Image_Name_Input_Run_Details: inputGroup( + generateInputGroup( + '.job-wizard__run-details > div.form-field-input .form-field__wrapper', + true, + false, + '.form-field__warning svg' + ) + ), + Image_Name_Text_Run_Details: By.css('.job-wizard__run-details .warning-text'), + Train_Model_Data_Inputs_Table: commonTable(trainModelDataInputsTable), + Data_Inputs_Headers: commonTable(dataInputsHeaders), + Parameters_Headers: commonTable(parametersHeaders), + Train_Model_Parameters_Table: commonTable(trainModelParametersTable), + Pods_Priority_Dropdown: podsPriorityDropdown, + Node_Selection_Subheader: By.css('.modal__content .wizard-form__content-container .job-wizard__resources .form-row:nth-child(3)'), + Resources_Node_Selection_Table: commonTable(resourcesNodeSelectionTable), + Ranking_Subheader: By.css('.job-wizard__hyperparameter-strategy .ranking-title-grid-item'), + Ranking_Result_Input: inputGroup( + generateInputGroup( + '.job-wizard__hyperparameter-strategy .result-grid-item .form-field-input .form-field__wrapper', + false, + true, + false + ) + ), + Ranking_Criteria_Dropdown: dropdownComponent( + generateDropdownGroup( + '.job-wizard__hyperparameter-strategy .criteria-grid-item', + '[data-testid="hyperparameterStrategy.criteria-form-field-select"]', + '.options-list .select__item', + false, + false + ) + ), + Stop_Condition_Subheader: By.css('.job-wizard__hyperparameter-strategy .stop-condition-title-grid-item'), + Stop_Condition_Input: inputGroup( + generateInputGroup( + '.job-wizard__hyperparameter-strategy .stop-condition-grid-item .form-field__control', + false, + true, + false + ) + ), + Parallelism_Subheader: By.css('.job-wizard__hyperparameter-strategy .parallelism-title-grid-item'), + Parallel_Runs_Number_Input: numberInputGroup( + generateNumberInputGroup( + '.job-wizard__hyperparameter-strategy .parallel-runs-grid-item .form-field-input', + false, + true, + false, + false + ) + ), + Dask_Clutter_URL_Input: inputGroup( + generateInputGroup( + '.job-wizard__hyperparameter-strategy .dask-cluster-uri-grid-item .form-field__control', + false, + true, + false + ) + ), + Teardown_Checkbox: checkboxComponent({ + root: '.job-wizard__hyperparameter-strategy .teardown-dask-grid-item .form-field-checkbox', + elements: { + checkbox: 'input', + name: 'label', + icon: '' + } + }) }, registerDataset: { Title: commonPopupTitle, diff --git a/tests/features/common/page-objects/jobs-and-workflows.po.js b/tests/features/common/page-objects/jobs-and-workflows.po.js index db2313120..25a77565f 100644 --- a/tests/features/common/page-objects/jobs-and-workflows.po.js +++ b/tests/features/common/page-objects/jobs-and-workflows.po.js @@ -144,7 +144,7 @@ const BatchRunLabelsTable = { } const DataInputsHeaders = { - root: '.wizard-form__content .form-table', + root: '.wizard-form__content [data-testid="dataInputs.dataInputsTable"]', header: {}, body: { root: '.form-table__header-row', @@ -325,9 +325,9 @@ const jobsMonitorTable = { structure: generateDropdownGroup( '.table-body__cell:nth-of-type(5)', '.chip-block span.chips_button', - '.chip-block .chip-block-hidden_visible .data-ellipsis.tooltip-wrapper', + '.chip-block-hidden_visible .data-ellipsis.tooltip-wrapper', false, - true // options_in_root ? + false ) }, parameters: { @@ -469,9 +469,9 @@ const scheduleMonitorTable = { structure: generateDropdownGroup( '.table-body__cell:nth-of-type(5)', '.chip-block span.chips_button', - '.chip-block .chip-block-hidden_visible .data-ellipsis.tooltip-wrapper', + '.chip-block-hidden_visible .data-ellipsis.tooltip-wrapper', false, - true // options_in_root ? + false ) }, lastRun: '.table-body__cell:nth-of-type(6) .data-ellipsis', diff --git a/tests/features/common/page-objects/side-panel.po.js b/tests/features/common/page-objects/side-panel.po.js index be5973489..161fe93c0 100644 --- a/tests/features/common/page-objects/side-panel.po.js +++ b/tests/features/common/page-objects/side-panel.po.js @@ -681,7 +681,7 @@ const parametersRuntimeConfigurationTable = { } const advancedEnvironmentVariablesTable = { - root: '.wizard-form__content .form-table', + root: '.wizard-form__content [data-testid="advanced.environmentVariablesTable"]', header: {}, body: { add_row_btn: '.form-table__action-row button', @@ -1332,8 +1332,8 @@ module.exports = { ), Edit_Volume_Name_Input: inputGroup(generateInputGroup('.volumes-table .edit-row:not(.no-border_top) .table__cell-input:nth-of-type(2)')), Edit_Volume_Path_Input: inputGroup(generateInputGroup('.volumes-table .edit-row:not(.no-border_top) .table__cell-input:nth-of-type(3)')), - Add_New_Row_Button: By.css('.form-table__volume-row.active .form-table__actions-cell .round-icon-cp:nth-of-type(1)'), - Delete_New_Row_Button: By.css('.form-table__volume-row .form-table__actions-cell .round-icon-cp:nth-of-type(2)'), + Add_New_Row_Button: By.css('[data-testid="resources.volumesTable"] .form-table__actions-cell .round-icon-cp:nth-of-type(1)'), + Delete_New_Row_Button: By.css('[data-testid="resources.volumesTable"] .form-table__actions-cell .round-icon-cp:nth-of-type(2)'), Apply_Edit_Button: By.css('.volumes-table .apply-edit-btn'), Volume_Paths_Table: commonTable(volumePathsTable), Memory_Request_Dropdown: dropdownComponent( @@ -1456,7 +1456,7 @@ module.exports = { Advanced_Environment_Variables_Table: commonTable(advancedEnvironmentVariablesTable), Advanced_Accordion: { Accordion_Subheader: By.css( - '.modal__body .wizard-form__content-container .form-table-title' + '.modal__body .job-wizard__advanced .form-table-title' ), Default_Input_Path_Input: inputGroup( generateInputGroup( diff --git a/tests/features/datasets.feature b/tests/features/datasets.feature index ef94b7bfb..71bf67217 100644 --- a/tests/features/datasets.feature +++ b/tests/features/datasets.feature @@ -69,7 +69,8 @@ Feature: Datasets Page Then "Show_Iterations_Checkbox" element should be unchecked on "Artifacts_FilterBy_Popup" wizard Then check "expand_btn" visibility in "Datasets_Table" on "Datasets" wizard Then click on cell with row index 1 in "expand_btn" column in "Datasets_Table" table on "Datasets" wizard - Then click on cell with row index 2 in "name" column in "Datasets_Table" table on "Datasets" wizard + And wait load page + Then click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard Then verify "Header" element visibility on "Datasets_Info_Pane" wizard Then click on "Table_FilterBy_Button" element on "Datasets" wizard Then check "Show_Iterations_Checkbox" element on "Artifacts_FilterBy_Popup" wizard @@ -115,6 +116,7 @@ Feature: Datasets Page Then verify "Overview_Producer_Headers" on "Datasets_Info_Pane" wizard should contains "Datasets_Info_Pane"."Overview_Producer_Headers" Then verify "Overview_Sources_Headers" element visibility on "Datasets_Info_Pane" wizard Then verify "Overview_Sources_Headers" on "Datasets_Info_Pane" wizard should contains "Datasets_Info_Pane"."Overview_Sources_Headers" + Then "Label_column" element on "Datasets_Info_Pane" should contains "radius" value Then verify "Train_Button" element visibility on "Datasets_Info_Pane" wizard Then "Train_Button" element on "Datasets_Info_Pane" should contains "Train" value Then click on "Train_Button" element on "Datasets_Info_Pane" wizard @@ -133,6 +135,8 @@ Feature: Datasets Page @MLD @passive + @FAILED_TODO + #TODO: tag edit implementation on mock Scenario: MLD005 - Check Details panel still active on page refresh * set tear-down property "dataset" created in "automation-test" project with "test-file" value * create "test-dataset" Dataset with "v1" tag in "default" project with code 200 @@ -147,12 +151,12 @@ Feature: Datasets Page Then check "latest" value in "tag" column in "Overview_Table" table on "Datasets_Info_Pane" wizard Then click on "Edit_btn_table_view" element on "Datasets_Info_Pane" wizard And wait load page - When type value "v1" to "Version_tag_Input" field on "Datasets_Info_Pane" wizard + When type value "v2" to "Version_tag_Input" field on "Datasets_Info_Pane" wizard Then click on "Apply_Button" element on "Datasets_Info_Pane" wizard Then click on "Apply_Changes_Button" element on "Datasets_Info_Pane" wizard And wait load page Then click on "Table_FilterBy_Button" element on "Datasets" wizard - Then select "v1" option in "Table_Tree_Filter_Dropdown" dropdown on "Artifacts_FilterBy_Popup" wizard + Then select "v2" option in "Table_Tree_Filter_Dropdown" dropdown on "Artifacts_FilterBy_Popup" wizard Then click on "Apply_Button" element on "Artifacts_FilterBy_Popup" wizard And wait load page When click on cell with value "test-dataset" in "name" column in "Datasets_Table" table on "Datasets" wizard @@ -187,7 +191,8 @@ Feature: Datasets Page Then "Form_Subtext" component on "Register_Dataset" should contains "Register_Dataset"."Form_Subtext" Then verify "Name_Input" element visibility on "Register_Dataset" wizard Then verify "Name_Input" on "Register_Dataset" wizard should display "Input_Hint"."Dataset_Names_Unique" - Then type value " " to "Name_Input" field on "Register_Dataset" wizard + Then type value " " to "Name_Input" field on "Register_Dataset" wizard + And wait load page Then verify "Name_Input" on "Register_Dataset" wizard should display options "Input_Hint"."Artifact_Name_Hint" Then verify "Name_Input" options rules on form "Register_Dataset" wizard Then verify options in "Path_Scheme_Combobox" combobox in "Target_Path" on "Register_Dataset" wizard should contains "Register_Dataset"."Combobox_Options" @@ -239,7 +244,6 @@ Feature: Datasets Page @MLD Scenario: MLD007 - Verify behaviour on Register new Dataset - * set tear-down property "dataset" created in "default" project with "dataset-test" value Given open url And wait load page And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -343,8 +347,8 @@ Feature: Datasets Page Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard -@MLD -Scenario: MLD018 - Verify the Delete option state in Datasets table and Overview details action menu + @MLD + Scenario: MLD018 - Verify the Delete option state in Datasets table and Overview details action menu Given open url And wait load page And click on row root with value "churn-project-admin" in "name" column in "Projects_Table" table on "Projects" wizard @@ -499,8 +503,10 @@ Scenario: MLD018 - Verify the Delete option state in Datasets table and Overview Then click on "Tabel_View_Button" element on "Datasets_Info_Pane" wizard Then verify "Cross_Close_Button" element visibility on "Datasets_Info_Pane" wizard -@MLD -Scenario: MLD010 - Check that version tag dropdown shows all tags on filters wizard on Datasets page + @MLD + @FAILED_TODO + #TODO: tag edit implementation on mock + Scenario: MLD010 - Check that version tag dropdown shows all tags on filters wizard on Datasets page Given open url And wait load page And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -526,8 +532,8 @@ Scenario: MLD010 - Check that version tag dropdown shows all tags on filters wiz And wait load page Then check "newTag" value in "tag" column in "Datasets_Table" table on "Datasets" wizard -@MLD -Scenario: MLD011 - Check that version tag has "Click to add" status when it's empty after edited + @MLD + Scenario: MLD011 - Check that version tag has "Click to add" status when it's empty after edited Given open url And wait load page And click on row root with value "churn-project-admin" in "name" column in "Projects_Table" table on "Projects" wizard @@ -553,8 +559,10 @@ Scenario: MLD011 - Check that version tag has "Click to add" status when it's em And wait load page Then "Version_Tag_Input_Placeholder" element on "Datasets_Info_Pane" should contains "Click to add" value -@MLD -Scenario: MLD012 - Check filter by "All" tag is performed when version tag was edited + @MLD + @FAILED_TODO + #TODO: tag edit implementation on mock + Scenario: MLD012 - Check filter by "All" tag is performed when version tag was edited Given open url And wait load page And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -581,4 +589,522 @@ Scenario: MLD012 - Check filter by "All" tag is performed when version tag was e Then check "latest123456" value in "tag" column in "Overview_Table" table on "Datasets_Info_Pane" wizard Then save to context "name" column on 2 row from "Datasets_Table" table on "Datasets" wizard Then compare "Header" element value on "Datasets_Info_Pane" wizard with test "name" context value - \ No newline at end of file + + @MLD + Scenario: MLD019 - Check steps, buttons components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then verify "Train_Button" element visibility on "Datasets_Info_Pane" wizard + Then "Train_Button" element on "Datasets_Info_Pane" should contains "Train" value + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then verify "Title" element visibility on "Train_Model" wizard + Then "Title" element on "Train_Model" should contains "Train Model" value + Then verify "Cross_Cancel_Button" element visibility on "Train_Model" wizard + Then "Function_Title" element on "Train_Model" should contains "auto-trainer" value + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + Then "Hyperparameter_Checkbox" element should be unchecked on "Train_Model" wizard + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_1_Button_text" element on "commonPagesHeader" should contains "Run Details" value + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_4_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_5_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is enabled + Then "Next_Button" element on "Train_Model" should contains "Next" value + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + Then "Run_Training_Now_Button" element on "Train_Model" should contains "Run training now" value + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then "Schedule_Training_Job_Button" element on "Train_Model" should contains "Schedule training job" value + Then verify "Back_Button" element not exists on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Data_Inputs" element on "commonPagesHeader" should contains "Data Inputs" value + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_2_Button_text" element on "commonPagesHeader" should contains "Data Inputs" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then "Back_Button" element on "Train_Model" should contains "Back" value + Then verify "Next_Button" element on "Train_Model" wizard is enabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Parameters" element on "commonPagesHeader" should contains "Parameters" value + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_3_Button_text" element on "commonPagesHeader" should contains "Parameters" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is enabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Resources" element on "commonPagesHeader" should contains "Resources" value + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_4_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_4_Button_text" element on "commonPagesHeader" should contains "Resources" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is enabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Advanced" element on "commonPagesHeader" should contains "Advanced" value + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_4_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_5_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_5_Button_text" element on "commonPagesHeader" should contains "Advanced" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is disabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + Then click on "Cross_Cancel_Button" element on "Train_Model" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then check "Hyperparameter_Checkbox" element on "Train_Model" wizard + Then "Hyperparameter_Checkbox" element should be checked on "Train_Model" wizard + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_4_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_5_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_6_Button" element on "commonPagesHeader" wizard is enabled + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Hyperparameter_Strategy" element on "commonPagesHeader" should contains "Hyperparameter strategy" value + Then verify "Step_5_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_6_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_4_Button_text" element on "commonPagesHeader" should contains "Hyperparameter strategy" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is enabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Resources" element on "commonPagesHeader" should contains "Resources" value + Then verify "Step_6_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_5_Button_text" element on "commonPagesHeader" should contains "Resources" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is enabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Advanced" element on "commonPagesHeader" should contains "Advanced" value + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_4_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_5_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_6_Button_text" element on "commonPagesHeader" should contains "Advanced" value + Then verify "Back_Button" element on "Train_Model" wizard is enabled + Then verify "Next_Button" element on "Train_Model" wizard is disabled + Then verify "Schedule_Training_Job_Button" element on "Train_Model" wizard is enabled + Then verify "Run_Training_Now_Button" element on "Train_Model" wizard is enabled + + @MLD + Scenario: MLD020 - Check Run Details components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + Then "Hyperparameter_Checkbox" element should be unchecked on "Train_Model" wizard + Then verify "Function_Name_Input" element visibility on "Train_Model" wizard + Then type value "/" to "Function_Name_Input" field on "Train_Model" wizard + Then verify "Function_Name_Input" on "Train_Model" wizard should display options "Input_Hint"."Function_Name_Batch_Run_Hint" + Then verify "Version_Tag_Dropdown_element" element on "Train_Model" wizard is disabled by class name + Then verify "Handler_Dropdown" element visibility on "Train_Model" wizard + Then verify "Handler_Dropdown" dropdown element on "Train_Model" wizard should contains "Common_Lists"."Handler_List" + Then verify "Train_Model_Labels_Table" element visibility on "Train_Model" wizard + And click on "Add_Label_Button" element on "Train_Model" wizard + Then type value "/" to "Run_Details_Labels_Key" field on "Train_Model" wizard + Then verify labels warning should display options "Input_Hint"."Labels_Warning_Key" + Then type value "/" to "Run_Details_Labels_Value" field on "Train_Model" wizard without inputgroup + Then verify labels warning should display options "Input_Hint"."Labels_Warning_Value" + When click on "Title" element on "Train_Model" wizard + And click on "Close_Label_Button" element on "Train_Model" wizard + When add rows to "Train_Model_Labels_Table" table on "Train_Model" wizard + | key_input | value_input | + | key1 | value1 | + | key2 | value2 | + | key3 | value3 | + Then verify values in "Train_Model_Labels_Table" table on "Train_Model" wizard with attribute + | key_verify | value_verify | + | key1 | value1 | + | key2 | value2 | + | key3 | value3 | + Then verify "Image_Name_Input_Run_Details" element visibility on "Train_Model" wizard + Then type value "" to "Image_Name_Input_Run_Details" field on "Train_Model" wizard + Then verify "Image_Name_Input_Run_Details" on "Train_Model" wizard should display warning "Input_Hint"."Input_Field_Require" + Then "Image_Name_Text_Run_Details" component on "Train_Model" should contains "Batch_Run"."Image_Name_Text" + + @MLD + Scenario: MLD021 - Check Data Inputs components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Data_Inputs" element on "commonPagesHeader" should contains "Data Inputs" value + Then verify "Data_Inputs_Headers" on "Train_Model" wizard should contains "Batch_Run"."Data_Inputs_Table_Header" + Then verify data in "Train_Model_Data_Inputs_Table" table on "Train_Model" wizard + | name_verify | path_verify | + | dataset | store://datasets/default/auto-trainer-train_test_set#0:latest | + | sample_set | | + | test_set | | + When add data to "Train_Model_Data_Inputs_Table" table on "Train_Model" wizard with a pre-filled table + | name_input | path_dropdown | path_input | + | name1 | V3IO | container-name/file | + | name2 | V3IO | container-name/file | + | name3 | V3IO | container-name/file | + Then verify data in "Train_Model_Data_Inputs_Table" table on "Train_Model" wizard + | name_verify | path_verify | + | dataset | store://datasets/default/auto-trainer-train_test_set#0:latest | + | sample_set | | + | test_set | | + | name1 | v3io:///container-name/file | + | name2 | v3io:///container-name/file | + | name3 | v3io:///container-name/file | + When click on "delete_btn" with data in "Train_Model_Data_Inputs_Table" table on "Train_Model" wizard with offset "false" + | name_verify | + | name1 | + | name3 | + Then verify data in "Train_Model_Data_Inputs_Table" table on "Train_Model" wizard + | name_verify | path_verify | + | dataset | store://datasets/default/auto-trainer-train_test_set#0:latest | + | sample_set | | + | test_set | | + | name2 | v3io:///container-name/file | + Then edit 4 row in "Train_Model_Data_Inputs_Table" key-value table on "Train_Model" wizard + | name_input | path_input | + | edited | edited | + Then verify data in "Train_Model_Data_Inputs_Table" table on "Train_Model" wizard + | name_verify | path_verify | + | dataset | store://datasets/default/auto-trainer-train_test_set#0:latest | + | sample_set | | + | test_set | | + | name2edited | v3io:///container-name/fileedited | + + @MLD + Scenario: MLD022 - Check Parameters components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Parameters" element on "commonPagesHeader" should contains "Parameters" value + Then verify "Parameters_Headers" on "Train_Model" wizard should contains "Batch_Run"."Parameters_Table_Header" + Then verify data in "Train_Model_Parameters_Table" table on "Train_Model" wizard + | name_verify | type_dropdown_verify | value_verify | + | model_class | str | | + | label_columns | Optional[Union[str, List[str]]] | | + | drop_columns | List[str] | | + | model_name | str | model | + | tag | str | | + | train_test_split_size | float | | + | random_state | int | | + | labels | dict | | + When add custom parameters to "Train_Model_Parameters_Table" table on "Train_Model" wizard with a pre-filled table + | name_input | type_dropdown | value_input | + | name1 | str | value1 | + | name2 | int | 1 | + | name3 | float | 0.5 | + Then verify data in "Train_Model_Parameters_Table" table on "Train_Model" wizard + | name_verify | type_dropdown_verify | value_verify | + | model_class | str | | + | label_columns | Optional[Union[str, List[str]]] | | + | drop_columns | List[str] | | + | model_name | str | model | + | tag | str | | + | train_test_split_size | float | | + | random_state | int | | + | labels | dict | | + | name1 | str | value1 | + | name2 | int | 1 | + | name3 | float | 0.5 | + When click on "delete_btn" in "Train_Model_Parameters_Table" table on "Train_Model" wizard with offset "false" + | name_verify | + | name3 | + | name1 | + Then verify data in "Train_Model_Parameters_Table" table on "Train_Model" wizard + | name_verify | type_dropdown_verify | value_verify | + | model_class | str | | + | label_columns | Optional[Union[str, List[str]]] | | + | drop_columns | List[str] | | + | model_name | str | model | + | tag | str | | + | train_test_split_size | float | | + | random_state | int | | + | labels | dict | | + | name2 | int | 1 | + Then edit 9 row in "Train_Model_Parameters_Table" key-value table on "Train_Model" wizard + | name_input | value_input | + | edited | 234 | + Then verify data in "Train_Model_Parameters_Table" table on "Train_Model" wizard + | name_verify | type_dropdown_verify | value_verify | + | model_class | str | | + | label_columns | Optional[Union[str, List[str]]] | | + | drop_columns | List[str] | | + | model_name | str | model | + | tag | str | | + | train_test_split_size | float | | + | random_state | int | | + | labels | dict | | + | name2edited | int | 1234 | + + @MLD + Scenario: MLD023 - Check Resources components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Resources" element on "commonPagesHeader" should contains "Resources" value + Then verify "Pods_Priority_Dropdown" element visibility on "Train_Model" wizard + Then verify "Pods_Priority_Dropdown" dropdown element on "Train_Model" wizard should contains "Common_Lists"."Pods_Priority_List" + Then verify "Node_Selection_Subheader" element visibility on "Train_Model" wizard + Then "Node_Selection_Subheader" element on "Train_Model" should contains "Node selection" value + When add data rows to "Resources_Node_Selection_Table" key-value table on "Train_Model" wizard + | key_input | value_input | + | key1 | value1 | + | key2 | value2 | + | key3 | value3 | + | key4 | value4 | + Then verify data values in "Resources_Node_Selector_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard + | key | value | + | key1 | value1 | + | key2 | value2 | + | key3 | value3 | + | key4 | value4 | + When click on "delete_btn" in "Resources_Node_Selector_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard with offset "false" + | key | + | key3 | + | key1 | + Then verify data values in "Resources_Node_Selector_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard + | key | value | + | key2 | value2 | + | key4 | value4 | + Then edit 2 row in "Resources_Node_Selector_Table" key-value table in "Resources_Accordion" on "Batch_Run_Edit" wizard + | key_input | value_input | + | edited | edited | + Then verify data values in "Resources_Node_Selector_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard + | key | value | + | key2edited | value2edited | + | key4 | value4 | + Then verify "Memory_Request_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."Memory_Unit_Options" + Then verify "Memory_Limit_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."Memory_Unit_Options" + Then type value "0" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Minimum_Value_Warning" + Then type value "1" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then type value "1025" to "Memory_Request_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Limit_Number_Warning" + Then verify "Memory_Request_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Request_Number_Warning" + Then type value "2" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then select "KB" option in "Memory_Limit_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Limit_Number_Warning" + Then verify "Memory_Request_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Request_Number_Warning" + Then select "KB" option in "Memory_Request_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then type value "" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then type value "2" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then select "GB" option in "Memory_Request_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Limit_Number_Warning" + Then verify "Memory_Request_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Request_Number_Warning" + Then verify "CPU_Request_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."CPU_Unit_Options" + Then verify "CPU_Limit_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."CPU_Unit_Options" + Then select "millicpu" option in "CPU_Limit_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then select "millicpu" option in "CPU_Request_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then type value "0" to "CPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "CPU_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Minimum_Value_Warning" + Then type value "1" to "CPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then type value "1025" to "CPU_Request_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "CPU_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Limit_Number_Warning" + Then verify "CPU_Request_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Request_Number_Warning" + Then type value "0" to "GPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "GPU_Limit_Number_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Minimum_Value_Warning" + Then verify "Memory_Request_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."Memory_Unit_Options" + Then type value "1" to "Memory_Request_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then increase value on 15 points in "Memory_Request_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then decrease value on 15 points in "Memory_Request_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Memory_Limit_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."Memory_Unit_Options" + Then type value "2" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then increase value on 15 points in "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then decrease value on 15 points in "Memory_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "CPU_Request_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."CPU_Unit_Options" + Then type value "3" to "CPU_Request_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then increase value on 15 points in "CPU_Request_Number_Input" field with "millicpu" on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then decrease value on 15 points in "CPU_Request_Number_Input" field with "millicpu" on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then select "cpu" option in "CPU_Request_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "CPU_Request_Number_Input" input should contains "0.003" value in "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "CPU_Limit_Dropdown" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."CPU_Unit_Options" + Then type value "4" to "CPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then increase value on 15 points in "CPU_Limit_Number_Input" field with "millicpu" on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then decrease value on 15 points in "CPU_Limit_Number_Input" field with "millicpu" on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then select "cpu" option in "CPU_Limit_Dropdown" dropdown on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "CPU_Limit_Number_Input" input should contains "0.004" value in "Resources_Accordion" on "Batch_Run_Edit" wizard + Then type value "5" to "GPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then increase value on 15 points in "GPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then decrease value on 15 points in "GPU_Limit_Number_Input" field on "Resources_Accordion" on "Batch_Run_Edit" wizard + Then verify "Volumes_Subheader" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Label_Hint"."New_Job_Volumes" + When add new volume rows to "Volume_Paths_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard using nontable inputs + | Volume_Paths_Table_Type_Dropdown | Volume_Paths_Table_Volume_Name_Input | Volume_Paths_Table_Path_Input | Volume_Paths_Table_Container_Input | Volume_Paths_Table_Access_Key_Input | Volume_Paths_Table_Resource_Path_Input | Add_New_Row_Button | + | V3IO | | | | | | yes | + Then verify "Volume_Paths_Table_Volume_Name_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Access_Key_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Mount_Path_Hint" + Then verify "Volume_Paths_Table_Container_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Data_Container_Hint" + Then verify "Volume_Paths_Table_Access_Key_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."DataAccess_Key_Hint" + Then verify "Volume_Paths_Table_Resource_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Relative_Directory_Path_Hint" + When click on "Delete_New_Row_Button" element in "Resources_Accordion" on "Batch_Run_Edit" wizard + When add new volume rows to "Volume_Paths_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard using nontable inputs + | Volume_Paths_Table_Type_Dropdown | Volume_Paths_Table_Volume_Name_Input | Volume_Paths_Table_Path_Input | Volume_Paths_Table_Config_Map_Input | Add_New_Row_Button | + | Config Map | | | | yes | + Then verify "Volume_Paths_Table_Volume_Name_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Config_Map_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Mount_Path_Hint" + When click on "Delete_New_Row_Button" element in "Resources_Accordion" on "Batch_Run_Edit" wizard + When add new volume rows to "Volume_Paths_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard using nontable inputs + | Volume_Paths_Table_Type_Dropdown | Volume_Paths_Table_Volume_Name_Input | Volume_Paths_Table_Path_Input | Volume_Paths_Table_Secret_Name_Input | Add_New_Row_Button | + | Secret | | | | yes | + Then verify "Volume_Paths_Table_Volume_Name_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Secret_Name_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Mount_Path_Hint" + When click on "Delete_New_Row_Button" element in "Resources_Accordion" on "Batch_Run_Edit" wizard + When add new volume rows to "Volume_Paths_Table" table in "Resources_Accordion" on "Batch_Run_Edit" wizard using nontable inputs + | Volume_Paths_Table_Type_Dropdown | Volume_Paths_Table_Volume_Name_Input | Volume_Paths_Table_Path_Input | Volume_Paths_Table_Claime_Name_Input | Add_New_Row_Button | + | PVC | | | | yes | + Then verify "Volume_Paths_Table_Volume_Name_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Claime_Name_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display warning "Input_Hint"."Input_Field_Require" + Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Mount_Path_Hint" + When click on "Delete_New_Row_Button" element in "Resources_Accordion" on "Batch_Run_Edit" wizard + + @MLD + Scenario: MLD024 - Check Advanced components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Advanced" element on "commonPagesHeader" should contains "Advanced" value + Then "Accordion_Subheader" element in "Advanced_Accordion" on "Batch_Run_Edit" should contains "Environment variables" value + Then verify "Advanced_Environment_Variables_Table" element visibility on "Batch_Run_Edit" wizard + When add data to "Advanced_Environment_Variables_Table" table on "Batch_Run_Edit" wizard + | name_input | type_dropdown | value_input | + | name1 | Value | value1 | + | name2 | Value | 1 | + | name3 | Value | 0.5 | + Then verify data in "Advanced_Environment_Variables_Table" table on "Batch_Run_Edit" wizard + | name_verify | type_dropdown_verify | value_verify | + | name1 | value | value1 | + | name2 | value | 1 | + | name3 | value | 0.5 | + Then edit dropdown field 1 row in "Advanced_Environment_Variables_Table" key-value table on "Batch_Run_Edit" wizard + | type_dropdown | value_input | value_input_key | + | Secret | sectretName1 | sectretKey1 | + Then edit dropdown field 3 row in "Advanced_Environment_Variables_Table" key-value table on "Batch_Run_Edit" wizard + | type_dropdown | value_input | value_input_key | + | Secret | sectretName2 | sectretKey2 | + Then verify data in "Advanced_Environment_Variables_Table" table on "Batch_Run_Edit" wizard + | name_verify | type_dropdown_verify | value_verify | + | name1 | secret | sectretName1:sectretKey1 | + | name2 | value | 1 | + | name3 | secret | sectretName2:sectretKey2 | + + @MLD + Scenario: MLD025 - Check Hyperparameter strategy components on Train Model wizard + Given open url + And wait load page + And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard + And wait load page + And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard + And click on cell with value "Datasets" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard + And wait load page + When click on cell with row index 1 in "name" column in "Datasets_Table" table on "Datasets" wizard + Then click on "Train_Button" element on "Datasets_Info_Pane" wizard + And wait load page + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value + Then check "Hyperparameter_Checkbox" element on "Train_Model" wizard + Then "Hyperparameter_Checkbox" element should be checked on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + And click on "Next_Button" element on "Train_Model" wizard + Then "Form_Header_Hyperparameter_Strategy" element on "commonPagesHeader" should contains "Hyperparameter strategy" value + Then verify "Strategy_Dropdown" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard should contains "Dropdown_Options"."Hyperparameter_Strategy_Options" + Then verify "Strategy_Dropdown" dropdown in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard selected option value "List" + Then verify "Max_Iterations" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is disabled by class name + Then verify "Max_Errors" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is disabled by class name + Then select "Grid" option in "Strategy_Dropdown" dropdown on "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard + Then verify "Strategy_Dropdown" dropdown in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard selected option value "Grid" + Then verify "Max_Iterations" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is disabled by class name + Then verify "Max_Errors" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is disabled by class name + Then select "Random" option in "Strategy_Dropdown" dropdown on "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard + Then verify "Strategy_Dropdown" dropdown in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard selected option value "Random" + Then verify "Max_Iterations" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is enabled by class name + Then verify "Max_Errors" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is enabled by class name + Then "Ranking_Subheader" element on "Train_Model" should contains "Ranking" value + When type value "ordinal" to "Ranking_Result_Input" field on "Train_Model" wizard + Then verify "Ranking_Criteria_Dropdown" dropdown element on "Train_Model" wizard should contains "Common_Lists"."Ranking_Criteria_List" + Then "Stop_Condition_Subheader" element on "Train_Model" should contains "Stop condition" value + When type value "dbutils.notebook.exit()" to "Stop_Condition_Input" field on "Train_Model" wizard + Then "Parallelism_Subheader" element on "Train_Model" should contains "Parallelism" value + Then type value "5" to "Parallel_Runs_Number_Input" field on "Train_Model" wizard + Then increase value on 4 points in "Parallel_Runs_Number_Input" field on "Train_Model" wizard + Then decrease value on 4 points in "Parallel_Runs_Number_Input" field on "Train_Model" wizard + When type value "cluster.dashboard_link" to "Dask_Clutter_URL_Input" field on "Train_Model" wizard + Then "Teardown_Checkbox" element should be unchecked on "Train_Model" wizard + Then check "Teardown_Checkbox" element on "Train_Model" wizard + Then "Teardown_Checkbox" element should be checked on "Train_Model" wizard + + + \ No newline at end of file diff --git a/tests/features/featureStore.feature b/tests/features/featureStore.feature index e63a62a4e..b1442e2a8 100644 --- a/tests/features/featureStore.feature +++ b/tests/features/featureStore.feature @@ -276,8 +276,6 @@ Feature: Feature Store Page @MLFS @passive - @FAILED_TODO - #TODO: bug ML-5151 (fixed v1.6.0-rc17) Scenario: MLFS009 - Check all mandatory components in Item infopane on Preview tab table Given open url And click on row root with value "fsdemo-admin" in "name" column in "Projects_Table" table on "Projects" wizard @@ -378,7 +376,7 @@ Feature: Feature Store Page Then type value "type=featureSet" to "Table_Label_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard Then click on "Table_Refresh_Button" element on "Feature_Store_Feature_Sets_Tab" wizard And wait load page - Then value in "labels" column with "dropdowns" in "Feature_Sets_Table" on "Feature_Store_Feature_Sets_Tab" wizard should contains "type=featureSet" in "Overlay" + Then value in "labels" column with "text" in "Feature_Sets_Table" on "Feature_Store_Feature_Sets_Tab" wizard should contains "type=featureSet" Then type value "v3io_user=123" to "Table_Label_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard Then click on "Table_Refresh_Button" element on "Feature_Store_Feature_Sets_Tab" wizard And wait load page @@ -455,11 +453,11 @@ Feature: Feature Store Page Then type value "owner" to "Table_Label_Filter_Input" field on "Feature_Store_Features_Vectors_Tab" wizard Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Vectors_Tab" wizard And wait load page - Then value in "labels" column with "dropdowns" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "owner" in "Overlay" + Then value in "labels" column with "text" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "owner" Then type value "type=featureVector" to "Table_Label_Filter_Input" field on "Feature_Store_Features_Vectors_Tab" wizard Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Tab" wizard And wait load page - Then value in "labels" column with "dropdowns" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "type=featureVector" in "Overlay" + Then value in "labels" column with "text" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "type=featureVector" Then type value "v3io_user=123" to "Table_Label_Filter_Input" field on "Feature_Store_Features_Vectors_Tab" wizard Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Vectors_Tab" wizard And wait load page @@ -1880,6 +1878,8 @@ Feature: Feature Store Page And verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard And click on "Create_Set_Button" element on "Feature_Store_Feature_Sets_Tab" wizard Then click on "Save_Button" element on "New_Feature_Set" wizard + And wait load page + Then type value " " to "Feature_Set_Name_Input" field on "New_Feature_Set" wizard Then verify "Feature_Set_Name_Input" on "New_Feature_Set" wizard should display options "Input_Hint"."Feature_Set_Name_Hint" Then verify "URL_Combobox" element in "Data_Source_Accordion" on "New_Feature_Set" wizard should display warning "Input_Hint"."Input_Field_Require" Then verify "Entities_Input" element in "Schema_Accordion" on "New_Feature_Set" wizard should display warning "Input_Hint"."Input_Field_Require" diff --git a/tests/features/files.feature b/tests/features/files.feature index 7e121abe2..92a143d66 100644 --- a/tests/features/files.feature +++ b/tests/features/files.feature @@ -142,7 +142,7 @@ Feature: Files Page Then verify "Cross_Cancel_Button" element visibility on "Register_File_Popup" wizard Then verify "New_File_Name_Input" element visibility on "Register_File_Popup" wizard Then verify "New_File_Name_Input" on "Register_File_Popup" wizard should display "Input_Hint"."Artifact_Names_Unique" - Then type value " " to "New_File_Name_Input" field on "Register_File_Popup" wizard + Then type value " " to "New_File_Name_Input" field on "Register_File_Popup" wizard Then verify "New_File_Name_Input" on "Register_File_Popup" wizard should display options "Input_Hint"."Artifact_Name_Hint" Then verify "New_File_Name_Input" options rules on form "Register_File_Popup" wizard Then verify options in "Path_Scheme_Combobox" combobox in "Target_Path" on "Register_File_Popup" wizard should contains "Register_Artifact"."Combobox_Options" @@ -267,11 +267,13 @@ Feature: Files Page @MLA @passive + @FAILED_TODO + #TODO: tag edit implementation on mock Scenario: MLA013 - Check Details panel still active on page refresh * set tear-down property "project" created with "automation-test" value * set tear-down property "file" created in "automation-test" project with "test-file" value * create "automation-test" MLRun Project with code 201 - * create "test-file" File with "v1" tag in "automation-test" project with code 200 + * create "test-file" File with "test" tag in "automation-test" project with code 200 Given open url And wait load page And click on row root with value "automation-test" in "name" column in "Projects_Table" table on "Projects" wizard @@ -582,6 +584,8 @@ Feature: Files Page Then verify "Cross_Close_Button" element visibility on "Files_Info_Pane" wizard @MLA + @FAILED_TODO + #TODO: tag edit implementation on mock Scenario: MLA010 - Check that version tag dropdown shows all tags on filters wizard on Artifacts page Given open url And wait load page @@ -636,6 +640,8 @@ Feature: Files Page Then "Version_Tag_Input_Placeholder" element on "Files_Info_Pane" should contains "Click to add" value @MLA + @FAILED_TODO + #TODO: tag edit implementation on mock Scenario: MLA012 - Check filter by "All" tag is performed when version tag was edited Given open url And wait load page diff --git a/tests/features/jobsAndWorkflows.feature b/tests/features/jobsAndWorkflows.feature index 4ae41da7b..25fa8dddc 100644 --- a/tests/features/jobsAndWorkflows.feature +++ b/tests/features/jobsAndWorkflows.feature @@ -43,6 +43,7 @@ Feature: Jobs and workflows And wait load page Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard + @MLJW @passive Scenario: MLJW002 - Check all mandatory components on Workflows Monitor tab Given open url @@ -69,6 +70,7 @@ Feature: Jobs and workflows Then verify "Monitor Workflows" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard Then verify "Workflows_Monitor_Table" element visibility on "Workflows_Monitor_Tab" wizard + @MLJW @passive Scenario: MLJW003 - Check all mandatory components on Schedule Monitor tab Given open url @@ -84,7 +86,7 @@ Feature: Jobs and workflows And click on cell with value "Jobs and workflows" in "link" column in "General_Info_Quick_Links" table on "commonPagesHeader" wizard And hover "MLRun_Logo" component on "commonPagesHeader" wizard And wait load page - Then verify breadcrumbs "tab" label should be equal "Jobs" value + Then verify breadcrumbs "tab" label should be equal "Jobs and workflows" value Then verify "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard should contains "Jobs_And_Workflows"."Tab_List" And select "Schedule" tab in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard And wait load page @@ -94,6 +96,7 @@ Feature: Jobs and workflows Then verify "Table_Refresh_Button" element visibility on "Schedule_Monitor_Tab" wizard Then verify "Schedule_Monitor_Table" element visibility on "Schedule_Monitor_Tab" wizard + @MLJW @passive Scenario: MLJW004 - Check date picker dropdown options on Jobs Monitor tab Given open url @@ -117,6 +120,7 @@ Feature: Jobs and workflows When select "Custom range" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard Then verify "Date_Time_Picker" element visibility on "Jobs_Monitor_Tab" wizard + @MLJW @passive Scenario: MLJW005 - Verify date picker element on Jobs Monitor tab Given open url @@ -137,6 +141,7 @@ Feature: Jobs and workflows When pick up "Custom range" from "03/31/2025 10:31" to "03/21/2025 10:30" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard Then verify error message in "Date_Time_Picker" on "Jobs_Monitor_Tab" wizard with value "Date_Time_Picker"."Error_Message" + @MLJW @passive Scenario: MLJW006 - Verify filtering by job name on Jobs Monitor tab Given open url @@ -154,6 +159,7 @@ Feature: Jobs and workflows And wait load page Then value in "name" column with "text" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "test" + @MLJW @passive Scenario: MLJW007 - Verify filtering by job name on Schedule Monitor tab Given open url @@ -172,6 +178,7 @@ Feature: Jobs and workflows And wait load page Then value in "name" column with "text" in "Schedule_Monitor_Table" on "Schedule_Monitor_Tab" wizard should contains "test" + @MLJW @passive Scenario: MLJW008 - Verify filtering by name on Workflows Monitor tab Given open url @@ -194,9 +201,7 @@ Feature: Jobs and workflows And wait load page Then value in "name" column with "text" in "Schedule_Monitor_Table" on "Schedule_Monitor_Tab" wizard should contains "main" - @FAILED_TODO - #TODO: need to rewrite test - "labels" column with "dropdowns" contains "author" not just in dropdown, add capture for all data in "labels" column - #TODO: also run just on full screen, because of scroll + @MLJW @passive Scenario: MLJW009 - Verify filtering by job label with key on Jobs Monitor tab Given open url @@ -222,6 +227,7 @@ Feature: Jobs and workflows And wait load page And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard + @MLJW @passive @inProgress Scenario: MLJW010 - Verify filtering by job label with key on Schedule tab @@ -245,6 +251,7 @@ Feature: Jobs and workflows And wait load page Then value in "labels" column with "dropdowns" in "Schedule_Monitor_Table" on "Schedule_Monitor_Tab" wizard should contains "v3io_user=admin" + @MLJW @passive #TODO: run just on full screen, because of scroll Scenario: MLJW011 - Verify filtering by job status on Jobs Monitor tab @@ -267,6 +274,7 @@ Feature: Jobs and workflows And wait load page Then value in "status" column with "tooltip" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "Pending" + @MLJW @passive Scenario: verify filtering Jobs after re-run action Given open url @@ -290,6 +298,7 @@ Feature: Jobs and workflows Then value in "name" column with "text" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "test" Then value in "labels" column with "dropdowns" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "kind" + @MLJW @passive @inProgress Scenario: verify filtering by starttime on Jobs Monitor tab @@ -305,7 +314,7 @@ Feature: Jobs and workflows Then verify from "11/07/2021 00:00" to "11/09/2021 00:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard Then value in "datetime" column in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should be from "11/07/2021 00:00" to "11/09/2021 00:00" - @passive + @oldJobWizard Scenario: verify mandatory elements starttime on Jobs Monitor tab Given open url And wait load page @@ -321,7 +330,7 @@ Feature: Jobs and workflows Then verify "Select_Function_From_Dropdown" element visibility in "Select_Functions_From_Accordion" on "Create_Job" wizard Then verify "Collapse_Button" element visibility in "Function_Templates_Accordion" on "Create_Job" wizard - @passive + @oldJobWizard Scenario: verify mandatory elements starttime on Jobs Monitor tab Given open url And wait load page @@ -453,7 +462,7 @@ Feature: Jobs and workflows Then "Delete_Button" element on "Delete_Confirm_Popup" should contains "Delete" value When click on "Cancel_Button" element on "Delete_Confirm_Popup" wizard - + @MLJW @passive #TODO: rewrite twst accourding to new implementation "Refresh" button Scenario: Check all mandatory components in Item infopane on Logs tab table on Jobs Monitor Page @@ -479,6 +488,7 @@ Feature: Jobs and workflows Then verify "Logs_Refresh_Button" element visibility on "Jobs_Monitor_Tab_Info_Pane" wizard #Then "Logs_Refresh_Button" element on "Jobs_Monitor_Tab_Info_Pane" should contains "Refresh" value - change from button to item_logs with text "Refresh" in toltip + @MLJW @FAILED_TODO #TODO: select "Artifacts" tab in "Info_Pane_Tab_Selector" - rewrite test accourding to new implementation 'JOB' nesting @passive @@ -516,6 +526,7 @@ Feature: Jobs and workflows And wait load page Then verify "Artifacts_Table" element visibility on "Artifacts_Info_Pane" wizard + @MLJW @passive Scenario: Check all mandatory components in Item infopane on Overview tab table on Schedule Page Given open url @@ -539,6 +550,7 @@ Feature: Jobs and workflows Then verify "Overview" tab is active in "Info_Pane_Tab_Selector" on "ML_Function_Info_Pane" wizard Then verify "Overview_Headers" on "ML_Function_Info_Pane" wizard should contains "ML_Function_Info_Pane"."Overview_Headers" + @MLJW @passive Scenario: Verify all mandatory components on Delete existing scheduled job Given open url @@ -560,6 +572,7 @@ Feature: Jobs and workflows Then verify "Delete_Button" element visibility on "Common_Popup" wizard Then "Delete_Button" element on "Common_Popup" should contains "Delete" value + @MLJW Scenario: Delete Scheduled Job * set tear-down property "schedule" created in "automation-test-name01" project with "new-aqa-schedule-01" value * set tear-down property "project" created with "automation-test-name01" value @@ -582,7 +595,7 @@ Feature: Jobs and workflows And wait load page Then check "new-aqa-schedule-01" value not in "name" column in "Schedule_Monitor_Table" table on "Schedule_Monitor_Tab" wizard - @passive + @oldJobWizard Scenario: verify mandatory elements on Create New Jobs side panel except accordions Given open url And wait load page @@ -599,7 +612,7 @@ Feature: Jobs and workflows And wait load page Then click on "Name_Edit_Button" element on "New_JobTemplate_Edit" wizard Then type value " " to "Job_Name_Input" field on "New_JobTemplate_Edit" wizard - #Then verify "Job_Name_Input" on "New_JobTemplate_Edit" wizard should display options "Input_Hint"."Jobs_Name_Hint" - This field doesn't required + Then verify "Job_Name_Input" on "New_JobTemplate_Edit" wizard should display options "Input_Hint"."Jobs_Name_Hint" Then verify "Job_Name_Input" options rules on "New_JobTemplate_Edit" wizard Then type value "demo_Job_00" to "Job_Name_Input" field on "New_JobTemplate_Edit" wizard When collapse "Data_Inputs_Accordion" on "New_JobTemplate_Edit" wizard @@ -616,7 +629,7 @@ Feature: Jobs and workflows Then verify "Run_Now_Button" element visibility on "New_JobTemplate_Edit" wizard Then "Run_Now_Button" element on "New_JobTemplate_Edit" should contains "Run now" value - @passive + @oldJobWizard Scenario: verify mandatory elements in Data Inputs Accordion on Create New Jobs side panel Given open url And wait load page @@ -634,9 +647,7 @@ Feature: Jobs and workflows Then verify "Default_Input_Path_Input" element visibility in "Data_Inputs_Accordion" on "New_JobTemplate_Edit" wizard Then verify "Default_Artifact_Path_Input" element visibility in "Data_Inputs_Accordion" on "New_JobTemplate_Edit" wizard - @FAILED_TODO - #TODO: verify "URL_Combobox" element in "Data_Inputs_Accordion" - bug ML-3996 - @passive + @oldJobWizard Scenario: Verify behaviour of Combobox element on Create New Jobs wizard on Data Inputs Accordion Given open url And wait load page @@ -677,7 +688,7 @@ Feature: Jobs and workflows Then select "Google storage" option in "URL_Combobox" combobox on "Data_Inputs_Accordion" accordion on "New_JobTemplate_Edit" wizard Then verify "URL_Combobox" element in "Data_Inputs_Accordion" on "New_JobTemplate_Edit" wizard should display warning "Input_Hint"."S3_Path_Hint" - @passive + @oldJobWizard Scenario: Verify behaviour of Data Inputs Table in Data Inputs Accordion on create New JobTemplate edit wizard Given open url And wait load page @@ -738,7 +749,7 @@ Feature: Jobs and workflows | edited_name2 | store://artifacts/my-project/edited-artifact | | edited_name3 | s3://artifacts/my-project/edited-artifact3 | - @passive + @oldJobWizard Scenario: verify mandatory elements in Parameters Accordion on Create New Jobs side panel Given open url And wait load page @@ -765,8 +776,7 @@ Feature: Jobs and workflows Then verify "Criteria_Dropdown" element visibility in "Parameters_Accordion" on "New_JobTemplate_Edit" wizard Then verify "Criteria_Dropdown" element in "Parameters_Accordion" on "New_JobTemplate_Edit" wizard should contains "Dropdown_Options"."Criteria_Dropdown_Options" - @passive - #TODO: for 8 elements it's timeout - check function waiting time + @oldJobWizard Scenario: Verify behaviour of Parameters Table in Resources Accordion on create New JobTemplate edit wizard Given open url And wait load page @@ -841,7 +851,7 @@ Feature: Jobs and workflows #| name6 | float | Simple | value6 | | edited_name6 | float | Simple | editedValue6 | - @passive + @oldJobWizard Scenario: Verify behaviour of Volume Paths Table in Resources Accordion on create New JobTemplate edit wizard Given open url And wait load page @@ -940,7 +950,7 @@ Feature: Jobs and workflows | Edited_Name_5 | /newPath/to/happines5 | | Volume_Name_7 | /path/to/happines7 | - @passive + @oldJobWizard Scenario: Verify behaviour of Node Selector Table in Resources Accordion on create New JobTemplate edit wizard Given open url And wait load page @@ -989,8 +999,8 @@ Feature: Jobs and workflows | key | value | | key2edited | value2edited | | key4edited | value4edited | - #TODO: Pods_Toleration is deleted from implementation - @passive + + @oldJobWizard Scenario: verify mandatory elements in Resources Accordion on Create New Jobs side panel Given open url And wait load page @@ -1011,13 +1021,13 @@ Feature: Jobs and workflows And wait load page Then verify "Pods_Priority_Dropdown" element visibility in "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then verify "Pods_Priority_Dropdown" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard should contains "Dropdown_Options"."Pods_Priority" - #Then verify "Pods_Toleration_Dropdown" element visibility in "Resources_Accordion" on "New_JobTemplate_Edit" wizard - Pods_Toleration is deleted from implementation - #Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Prevent" - #Then verify "Pods_Toleration_Dropdown" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard should contains "Dropdown_Options"."Pods_Toleration" - #Then select "Allow" option in "Pods_Toleration_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard - #Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Allow" - #Then select "Constrain" option in "Pods_Toleration_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard - #Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Constrain" + Then verify "Pods_Toleration_Dropdown" element visibility in "Resources_Accordion" on "New_JobTemplate_Edit" wizard - Pods_Toleration is deleted from implementation + Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Prevent" + Then verify "Pods_Toleration_Dropdown" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard should contains "Dropdown_Options"."Pods_Toleration" + Then select "Allow" option in "Pods_Toleration_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard + Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Allow" + Then select "Constrain" option in "Pods_Toleration_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard + Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Constrain" Then verify "Volumes_Subheader" element visibility in "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then verify "Volumes_Subheader" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard should display hint "Label_Hint"."New_Job_Volumes" Then verify "Volume_Paths_Table" element visibility in "Resources_Accordion" on "New_JobTemplate_Edit" wizard @@ -1094,7 +1104,7 @@ Feature: Jobs and workflows Then increase value on 15 points in "GPU_Limit_Number_Input" field on "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then decrease value on 15 points in "GPU_Limit_Number_Input" field on "Resources_Accordion" on "New_JobTemplate_Edit" wizard - @passive + @oldJobWizard Scenario: verify mandatory elements in Advanced Accordion on Create New Jobs side panel Given open url And wait load page @@ -1115,8 +1125,7 @@ Feature: Jobs and workflows Then verify "Advanced_Environment_Variables_Table" element visibility in "Advanced_Accordion" on "New_JobTemplate_Edit" wizard When collapse "Advanced_Accordion" on "New_JobTemplate_Edit" wizard - @passive - @demo + @oldJobWizard Scenario: verify mandatory elements in Advanced Accordion on Create New Jobs side panel in Demo mode Given open url And wait load page @@ -1139,8 +1148,7 @@ Feature: Jobs and workflows Then verify "Advanced_Secrets_Table" element visibility in "Advanced_Accordion" on "New_JobTemplate_Edit" wizard When collapse "Advanced_Accordion" on "New_JobTemplate_Edit" wizard - @passive - @inProgress + @oldJobWizard Scenario: verify Advanced Environment Variables Table in Advanced Accordion on Create New Jobs side panel Given open url And wait load page @@ -1197,11 +1205,7 @@ Feature: Jobs and workflows | name0edited | value0edited | | name5edited | value5edited | - @FAILED_TODO - #TODO: Advanced_Environment_Variables_Table - implementation was changed, need rewrite the test - @passive - @inProgress - @demo + @oldJobWizard Scenario: verify Advanced Environment Variables Table in Advanced Accordion on Create New Jobs side panel Given open url And wait load page @@ -1328,8 +1332,7 @@ Feature: Jobs and workflows | kind | value | | file | value2edited | - @passive - @inProgress + @oldJobWizard Scenario: verify non-unique value input hint on Create New Jobs side panel Given open url And wait load page @@ -1366,9 +1369,7 @@ Feature: Jobs and workflows | name0 | value0 | yes | | Then verify "Environment_Variables_Name_Input" element in "Advanced_Accordion" on "New_JobTemplate_Edit" wizard should display warning "Input_Hint"."Name_Already_Exists" - @FAILED_TODO - #TODO: Re-run Job - not enought data for re-run - #TODO: Resourses changes - RUN ON SPOT NODES add to test + @oldJobWizard Scenario: Run New Job from template * set tear-down property "project" created with "automation-test-name-1100" value * create "automation-test-name-1100" MLRun Project with code 201 @@ -1434,6 +1435,7 @@ Feature: Jobs and workflows Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard + @MLJW @passive Scenario: Verify View YAML action on Workflows Monitor tab Given open url @@ -1453,6 +1455,7 @@ Feature: Jobs and workflows Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard + @MLJW @passive Scenario: Verify View YAML action on Schedule Monitor tab Given open url @@ -1477,6 +1480,7 @@ Feature: Jobs and workflows Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard + @MLJW @passive Scenario: Check all mandatory components on Workflow List View Given open url @@ -1497,6 +1501,7 @@ Feature: Jobs and workflows Then click on "Toggle_View_Button" element on "Workflows_Monitor_Tab" wizard Then verify "Workflow_List_View_Table" element visibility on "Workflows_Monitor_Tab" wizard + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1526,6 +1531,7 @@ Feature: Jobs and workflows Then verify "Overview" tab is active in "Info_Pane_Tab_Selector" on "Workflows_Monitor_Tab_Info_Pane" wizard Then verify "Overview_Headers" on "Workflows_Monitor_Tab_Info_Pane" wizard should contains "Jobs_Monitor_Tab_Info_Pane"."Overview_Headers" + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1551,6 +1557,7 @@ Feature: Jobs and workflows Then verify "Logs_Refresh_Button" element visibility on "Workflows_Monitor_Tab_Info_Pane" wizard Then "Logs_Refresh_Button" element on "Workflows_Monitor_Tab_Info_Pane" should contains "Refresh" value + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1574,6 +1581,7 @@ Feature: Jobs and workflows And select "Inputs" tab in "Info_Pane_Tab_Selector" on "Workflows_Monitor_Tab_Info_Pane" wizard Then verify "Inputs_Table" element visibility on "Inputs_Info_Pane" wizard + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1597,6 +1605,7 @@ Feature: Jobs and workflows And select "Artifacts" tab in "Info_Pane_Tab_Selector" on "Workflows_Monitor_Tab_Info_Pane" wizard Then verify "Artifacts_Table" element visibility on "Artifacts_Info_Pane" wizard + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1620,6 +1629,7 @@ Feature: Jobs and workflows And select "Results" tab in "Info_Pane_Tab_Selector" on "Workflows_Monitor_Tab_Info_Pane" wizard Then verify "Results_Table" element visibility on "Results_Info_Pane" wizard + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1669,6 +1679,7 @@ Feature: Jobs and workflows Then verify "Run_Now_Button" element visibility on "New_JobTemplate_Edit" wizard Then "Run_Now_Button" element on "New_JobTemplate_Edit" should contains "Run now" value + @MLJW @FAILED_TODO #TODO: Workflow_List_View_Table not clickable need check data on server @passive @@ -1716,6 +1727,7 @@ Feature: Jobs and workflows Then select "Pending" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard Then verify options in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table with "Pending" value in "status" column should contains "Jobs_And_Workflows"."Pending_Job_Action_Menu_Options" + @MLJW @passive Scenario: Check options in action menu on Workflows Monitor tab Given open url @@ -1732,6 +1744,7 @@ Feature: Jobs and workflows Then verify "Monitor Workflows" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard Then verify options in action menu on "Workflows_Monitor_Tab" wizard in "Workflows_Monitor_Table" table with "Completed" value in "status" column should contains "Jobs_And_Workflows"."Workflows_Action_Menu_Options" + @MLJW @passive Scenario: Check options in action menu on Schedule tab Given open url @@ -1747,6 +1760,7 @@ Feature: Jobs and workflows Then verify "Schedule" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard Then verify options in action menu on "Schedule_Monitor_Tab" wizard in "Schedule_Monitor_Table" table with "Job" value in "type" column should contains "Jobs_And_Workflows"."Schedule_Action_Menu_Options" + @MLJW @passive Scenario: Verify all mandatory component on Edit Scheduled Job sidebar Given open url @@ -1790,6 +1804,7 @@ Feature: Jobs and workflows Then verify "Run_Now_Button" element visibility on "New_JobTemplate_Edit" wizard Then "Run_Now_Button" element on "New_JobTemplate_Edit" should contains "Save" value + @MLJW @FAILED_TODO #TODO: Switch to list view - add #TODO: Not enought data - node with index 2 in "Workflow_Graph" graph not clickable @@ -1822,6 +1837,7 @@ Feature: Jobs and workflows When click on node with name "deploy-churn-server" in "Workflow_Graph" graph on "Workflows_Monitor_Tab" wizard Then verify "Info_Pane_Tab_Selector" on "ML_Function_Info_Pane" wizard should contains "ML_Function_Info_Pane"."Tab_List" + @MLJW @passive @links Scenario: MLJW030 - Check redirect to project`s Function Infopane from Job Overview @@ -1857,6 +1873,7 @@ Feature: Jobs and workflows Then verify redirection to "projects/default/functions" And wait load page + @MLJW @FAILED_TODO #TODO: create "test-scheduled" Schedule in "automation-test" project - createAPISchedule, newJobTemplate creating error @links @@ -1888,6 +1905,7 @@ Feature: Jobs and workflows And select "Results" tab in "Info_Pane_Tab_Selector" on "Workflows_Monitor_Tab_Info_Pane" wizard And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard + @oldJobWizard Scenario: Check redirection to Function details from Schedules tab * set tear-down property "function" created in "automation-test" project with "schedule-function" value * set tear-down property "schedule" created in "automation-test" project with "schedule-function" value @@ -1922,6 +1940,7 @@ Feature: Jobs and workflows And wait load page Then compare current browser URL with test "href" context value + @oldJobWizard Scenario: Check all mandatory components on Create new Schedule Given open url And wait load page @@ -1955,9 +1974,7 @@ Feature: Jobs and workflows Then click on "Schedule_Button" element in "Schedule_For_Later" on "New_JobTemplate_Edit" wizard Then "Error_Message" component on "New_JobTemplate_Edit" should contains "Error_Messages"."Already_Scheduled" - @FAILED_TODO - #TODO: check if the varification is valid after Pods_Toleration is deleted from implementation - @passive + @oldJobWizard Scenario: Verify behaviour of Method changing on Create New Job panel Given open url And wait load page @@ -1976,7 +1993,7 @@ Feature: Jobs and workflows Then collapse "Parameters_Accordion" on "New_JobTemplate_Edit" wizard Then expand "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then select "High" option in "Pods_Priority_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard - #Then select "Allow" option in "Pods_Toleration_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard - Pods_Toleration is deleted from implementation + Then select "Allow" option in "Pods_Toleration_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then type value "5" to "Memory_Request_Number_Input" field on "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then type value "10" to "Memory_Limit_Number_Input" field on "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then select "millicpu" option in "CPU_Limit_Dropdown" dropdown on "Resources_Accordion" on "New_JobTemplate_Edit" wizard @@ -1986,7 +2003,7 @@ Feature: Jobs and workflows Then type value "10" to "GPU_Limit_Number_Input" field on "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then select "plot_stat" option in "Job_Method_Dropdown" dropdown on "New_JobTemplate_Edit" wizard Then verify "Pods_Priority_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Medium" - #Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Prevent" - Pods_Toleration is deleted from implementation + Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Prevent" Then verify "Memory_Request_Number_Input" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard is disabled Then verify "Memory_Request_Number_Input" input should contains "" value in "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard is disabled @@ -2001,7 +2018,7 @@ Feature: Jobs and workflows Then verify "Run_Now_Button" element on "New_JobTemplate_Edit" wizard is disabled Then click on "Job_Method_Cancel" element on "New_JobTemplate_Edit" wizard Then verify "Pods_Priority_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "High" - #Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Allow" - Pods_Toleration is deleted from implementation + Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Allow" Then verify "Memory_Request_Number_Input" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard is enabled Then verify "Memory_Request_Number_Input" input should contains "5" value in "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then verify "Memory_Limit_Number_Input" element in "Resources_Accordion" on "New_JobTemplate_Edit" wizard is enabled @@ -2017,7 +2034,7 @@ Feature: Jobs and workflows Then select "plot_stat" option in "Job_Method_Dropdown" dropdown on "New_JobTemplate_Edit" wizard Then click on "Job_Method_Apply" element on "New_JobTemplate_Edit" wizard Then verify "Pods_Priority_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Medium" - #Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Prevent" - Pods_Toleration is deleted from implementation + Then verify "Pods_Toleration_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "Prevent" Then verify "CPU_Limit_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "cpu" Then verify "CPU_Request_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "cpu" Then verify "Memory_Request_Dropdown" dropdown in "Resources_Accordion" on "New_JobTemplate_Edit" wizard selected option value "MiB" @@ -2028,6 +2045,7 @@ Feature: Jobs and workflows Then verify "CPU_Limit_Number_Input" input should contains "" value in "Resources_Accordion" on "New_JobTemplate_Edit" wizard Then verify "GPU_Limit_Number_Input" input should contains "" value in "Resources_Accordion" on "New_JobTemplate_Edit" wizard + @MLJW Scenario: Check broken link redirection on Monitor Jobs and Schedules screens Given open url And wait load page @@ -2072,6 +2090,7 @@ Feature: Jobs and workflows Then verify redirection from "projects/default/jobs/INVALID" to "projects/default/jobs/monitor-jobs" Then verify redirection from "projects/default/INVALID/monitor-jobs" to "projects" + @MLJW @FAILED_TODO #TODO: Not enought data - click on node with name "clean-data" in "Workflow_Graph" graph not clickable Scenario: Check broken link redirection on Monitor Jobs and Schedules screens @@ -2119,7 +2138,7 @@ Feature: Jobs and workflows Then verify redirection from "projects/churn-project-admin/jobs/monitor-workflows/workflow/eaae138e-439a-47fa-93c6-ba0fe1dc3b79/INVALID/overview" to "projects/churn-project-admin/jobs/monitor-workflows" Then verify redirection from "projects/INVALID/jobs/monitor-workflows/workflow/eaae138e-439a-47fa-93c6-ba0fe1dc3b79/e3195358eaed416f8469451d8390ba19/overview" to "projects" - @MLJW0 + @MLJW Scenario: MLJW012 - Check all mandatory components on Batch Run wizard - Function selection Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2202,6 +2221,7 @@ Feature: Jobs and workflows Then verify "Schedule_for_later_Button" element on "Batch_Run" wizard is enabled Then verify "Run_Button" element on "Batch_Run" wizard is enabled + @MLJW Scenario: MLJW013 - Verify behaviour of Filter by category on Batch Run wizard - Function selection (Hub tab) Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2237,6 +2257,7 @@ Feature: Jobs and workflows And wait load page Then value in "labels" column with "attribute" in "Functions_Table" on "Batch_Run" wizard should contains "Other" + @MLJW Scenario: MLJW042 - Check all mandatory components on Batch Run wizard - Run Details without Method Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2251,22 +2272,22 @@ Feature: Jobs and workflows Then "Function_Title" element on "Batch_Run" should contains "test" value Then verify "Next_Button" element on "Batch_Run" wizard is enabled And click on "Next_Button" element on "Batch_Run" wizard - Then verify "Step_1_Button" element on "Batch_Run" wizard is enabled - Then verify "Step_2_Button" element on "Batch_Run" wizard is enabled - Then verify "Step_3_Button" element on "Batch_Run" wizard is enabled - Then verify "Step_4_Button" element on "Batch_Run" wizard is disabled - Then verify "Step_5_Button" element on "Batch_Run" wizard is disabled - Then "Step_5_Button" element on "Batch_Run" should contains "Resources" value - Then verify "Step_6_Button" element on "Batch_Run" wizard is disabled - Then verify "Form_Header_Batch_Run" element visibility on "Batch_Run" wizard - Then "Form_Header_Batch_Run" element on "Batch_Run" should contains "Run Details" value + Then verify "Step_1_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_2_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_3_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_4_Button" element on "commonPagesHeader" wizard is enabled + Then verify "Step_5_Button" element on "commonPagesHeader" wizard is enabled + Then "Step_5_Button_text" element on "commonPagesHeader" should contains "Resources" value + Then verify "Step_6_Button" element on "Batch_Run" wizard is enabled + Then verify "Form_Header_Run_Details" element visibility on "commonPagesHeader" wizard + Then "Form_Header_Run_Details" element on "commonPagesHeader" should contains "Run Details" value Then verify "Hyperparameter_Checkbox" element visibility on "Batch_Run" wizard Then "Hyperparameter_Checkbox" element should be unchecked on "Batch_Run" wizard Then check "Hyperparameter_Checkbox" element on "Batch_Run" wizard Then "Hyperparameter_Checkbox" element should be checked on "Batch_Run" wizard - Then "Step_5_Button" element on "Batch_Run" should contains "Hyperparameter strategy" value + Then "Step_5_Button_text" element on "Batch_Run" should contains "Hyperparameter strategy" value Then verify "Function_Name_Input_Batch_Run" element visibility on "Batch_Run" wizard - Then type value " " to "Function_Name_Input_Batch_Run" field on "Batch_Run" wizard + Then type value "/" to "Function_Name_Input_Batch_Run" field on "Batch_Run" wizard Then verify "Function_Name_Input_Batch_Run" on "Batch_Run" wizard should display options "Input_Hint"."Function_Name_Batch_Run_Hint" Then type value "test" to "Function_Name_Input_Batch_Run" field on "Batch_Run" wizard Then "Function_Title" element on "Batch_Run" should contains "test" value @@ -2297,6 +2318,7 @@ Feature: Jobs and workflows | key_verify | value_verify | | key2 | value2 | + @MLJW Scenario: MLJW044 - Check "Max Iterations", "Max errors" inputs field availability according to the strategy type in Hyperparameter strategy Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2326,7 +2348,8 @@ Feature: Jobs and workflows Then verify "Strategy_Dropdown" dropdown in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard selected option value "Random" Then verify "Max_Iterations" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is enabled by class name Then verify "Max_Errors" element in "Hyperparameter_Strategy_Accordion" on "Batch_Run_Edit" wizard is enabled by class name - + + @MLJW Scenario: MLJW051 - Check all mandatory components on Batch Run wizard - Run Details with Method Given open url And click on row root with value "churn-project-admin" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2375,6 +2398,7 @@ Feature: Jobs and workflows | key2 | value2 | | key3 | value3 | + @MLJW Scenario: MLJW053 - Check changing "Method" after "Hyperparameter" check in Run Details section of Batch Run Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2397,6 +2421,7 @@ Feature: Jobs and workflows And select "plot_stat" option in "Method_Dropdown" dropdown on "Batch_Run" wizard Then "Method_Dropdown_Option" element on "Batch_Run" should contains "plot_stat" value + @MLJW Scenario: MLJW054 - Check "Image name" field in Run Details section of Batch Run Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2416,6 +2441,7 @@ Feature: Jobs and workflows Then verify "Image_Name_Input_Run_Details" on "Batch_Run" wizard should display warning "Input_Hint"."Input_Field_Require" Then "Image_Name_Text_Run_Details" component on "Batch_Run" should contains "Batch_Run"."Image_Name_Text" + @MLJW Scenario: MLJW039 - Check all mandatory components on Batch Run wizard - Data Inputs Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2465,6 +2491,7 @@ Feature: Jobs and workflows | name_verify | path_verify | | name2edited | v3io:///container-name/fileedited | + @MLJW Scenario: MLJW038 - Check all mandatory components on Batch Run wizard - Parameters Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2523,6 +2550,7 @@ Feature: Jobs and workflows | name_verify | type_dropdown_verify | value_verify | | name2edited | int | 1234 | + @MLJW @inProgress Scenario: MLJW037 - Check all mandatory components on Batch Run wizard - Step 5 (Resources) Given open url @@ -2661,6 +2689,7 @@ Feature: Jobs and workflows Then verify "Volumes_Subheader" element visibility in "Resources_Accordion" on "Batch_Run_Edit" wizard Then verify "Volumes_Subheader" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Label_Hint"."New_Job_Volumes" + @MLJW Scenario: MLJW043 - Check Batch-Run running after edit GPU limit in Resources section Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2685,6 +2714,7 @@ Feature: Jobs and workflows And wait load page Then value in "name" column with "text" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "test" + @MLJW Scenario: MLJW025 - Check Minimum CPU value on Batch Run wizard - Resources Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2729,6 +2759,7 @@ Feature: Jobs and workflows | V3IO | Volume_Name_1 | /path/to/happines1 | Container_Input_1 | Access_Key_1 | /resource/path_1 | yes | | | V3IO | Volume_Name_2 | /path/to/happines2 | Container_Input_2 | Access_Key_2 | /resource/path_2 | yes | | + @MLJW Scenario: MLJW026 - Check tip and warning messages in Volumes section on Batch Run wizard - Resources Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2786,6 +2817,7 @@ Feature: Jobs and workflows Then verify "Volume_Paths_Table_Path_Input" element in "Resources_Accordion" on "Batch_Run_Edit" wizard should display hint "Input_Hint"."Mount_Path_Hint" When click on "Delete_New_Row_Button" element in "Resources_Accordion" on "Batch_Run_Edit" wizard + @MLJW Scenario: MLJW031 - Check mandatory of Container and Resource Path fields for V3IO volume - Batch Run - Resources Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2814,7 +2846,8 @@ Feature: Jobs and workflows And click on "Run_Button" element on "Batch_Run" wizard And wait load page Then value in "name" column with "text" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "test" - + + @MLJW Scenario: MLJW033 - Check autocomplete without tags MLRun Store path for datasets, artifacts, models, feature vectors - Batch Run - Data input Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2845,6 +2878,7 @@ Feature: Jobs and workflows | Models | store://models/default/model | | Feature vectors | store://feature-vectors/default/test-i | + @MLJW Scenario: MLJW034 - Check setting schedule for a job - Batch Run - Schedule for later Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2881,6 +2915,7 @@ Feature: Jobs and workflows Then "Error_Message" component in "Schedule_For_Later" on "Batch_Run_Edit" should contains "Error_Messages"."One_Day_Option" Then verify "Schedule_Button" not input element in "Schedule_For_Later" on "Batch_Run_Edit" wizard is disabled + @MLJW Scenario: MLJW035 - Check environment variables table types components on Batch Run in Advanced section Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard @@ -2923,7 +2958,8 @@ Feature: Jobs and workflows | V3IO_ACCESS_KEY | secret | sectretName2:sectretKey2 | | V3IO_FRAMESD | value | http://framesd:8080 | -Scenario: MLJW036 - Check setting schedule for a job - Batch Run - Schedule for later + @MLJW + Scenario: MLJW036 - Check setting schedule for a job - Batch Run - Schedule for later Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard And wait load page @@ -2998,6 +3034,7 @@ Scenario: MLJW036 - Check setting schedule for a job - Batch Run - Schedule for Then type value "15:15" to "At_time_Input" field on "Schedule_For_Later" on "Batch_Run_Edit" wizard Then type value "01:45" to "At_time_Input" field on "Schedule_For_Later" on "Batch_Run_Edit" wizard + @MLJW Scenario: MLJW045 - Check back navigation from Job overview to Jobs Monitor tab and forward to Job overview Given open url And wait load page @@ -3030,6 +3067,7 @@ Scenario: MLJW036 - Check setting schedule for a job - Batch Run - Schedule for Then verify "Info_Pane_Tab_Selector" element visibility on "Jobs_Monitor_Tab_Info_Pane" wizard Then verify "Info_Pane_Tab_Selector" on "Jobs_Monitor_Tab_Info_Pane" wizard should contains "Jobs_Monitor_Tab_Info_Pane"."Tab_List" + @MLJW Scenario: MLJW046 - Check components in Parameters section on Batch Run wizard with checked Hyper Given open url And click on row root with value "default" in "name" column in "Projects_Table" table on "Projects" wizard diff --git a/tests/features/models.feature b/tests/features/models.feature index fe96610e6..936aa3941 100644 --- a/tests/features/models.feature +++ b/tests/features/models.feature @@ -313,6 +313,7 @@ Feature: Models Page @MLM @FAILED_TODO #TODO: Register_Model_Button hidden from 1.4.0, running on demo mode + #TODO: Overview Model file doesn't created Scenario: MLM010 - Verify behaviour on Register new Model * set tear-down property "model" created in "default" project with "automation-model" value Given open url diff --git a/tests/features/projectsPage.feature b/tests/features/projectsPage.feature index 7c12f49ae..c277a5606 100644 --- a/tests/features/projectsPage.feature +++ b/tests/features/projectsPage.feature @@ -2,6 +2,7 @@ Feature: MLRun Projects Page Testcases that verifies functionality on MLRun Projects Page + @MLPr @passive @FAILED_TODO #TODO: last two steps are unstable on small screen extensions because scroll change the screen coordinates, it needs another solution @@ -21,6 +22,7 @@ Feature: MLRun Projects Page Then value in "running" column with "tooltip" in "Projects_Table" on "Projects" wizard should contains "ML jobs and Nuclio functions" Then value in "failed" column with "tooltip" in "Projects_Table" on "Projects" wizard should contains "Failed ML jobs and nuclio functions in the last 24 hours" + @MLPr @passive Scenario: MLPr002 - Verify searching by project name Given open url @@ -46,6 +48,7 @@ Feature: MLRun Projects Page Then type value "defa" to "Search_Projects_Input" field on "Projects" wizard Then value in "name" column with "text" in "Projects_Table" on "Projects" wizard should contains "default" + @MLPr @passive Scenario: MLPr003 - Sort projects in ascending and descending order Given open url @@ -56,6 +59,7 @@ Feature: MLRun Projects Page When select "By created date" option in "Projects_Sort_Dropdown" filter dropdown on "Projects" wizard Then sort projects in ascending order + @MLPr @passive Scenario: MLPr004 - Verify all mandatory components on Create new ML Project Given open url @@ -76,6 +80,7 @@ Feature: MLRun Projects Page Then click on "Create_Button" element on "Create_New_Project" wizard Then "Error_Message" component on "Create_New_Project" should be equal "Error_Messages"."Project_Already_Exists" + @MLPr @passive Scenario: MLPr005 - Verify all mandatory components on Archive ML Project Given open url @@ -88,6 +93,7 @@ Feature: MLRun Projects Page Then verify "Confirm_Button" element visibility on "Common_Popup" wizard Then "Confirm_Button" element on "Common_Popup" should contains "Archive" value + @MLPr @passive Scenario: MLPr006 - Verify all mandatory components on Delete existing ML Project Given open url @@ -100,6 +106,7 @@ Feature: MLRun Projects Page Then verify "Delete_Button" element visibility on "Common_Popup" wizard Then "Delete_Button" element on "Common_Popup" should contains "Delete" value + @MLPr @sanity Scenario: MLPr007 - Create new ML Project with description Given open url @@ -113,6 +120,7 @@ Feature: MLRun Projects Page And set tear-down property "project" created with "automation-test-name" value Then check "automation-test-name" value in "name" column in "Projects_Table" table on "Projects" wizard + @MLPr @passive Scenario: MLPr008 - Archive ML Project * set tear-down property "project" created with "automation-test-name1" value @@ -127,6 +135,7 @@ Feature: MLRun Projects Page Then click on "Archive_Projects_Button" element on "Projects" wizard Then check "automation-test-name1" value in "name" column in "Projects_Table" table on "Projects" wizard + @MLPr @passive Scenario: MLPr009 - Delete existing ML Project * set tear-down property "project" created with "automation-test-name2" value @@ -164,6 +173,7 @@ Feature: MLRun Projects Page Then click on "Active_Projects_Button" element on "Projects" wizard Then check "automation-test-name7" value in "name" column in "Projects_Table" table on "Projects" wizard + @MLPr @passive Scenario: MLPr011 - Verify View YAML action Given open url @@ -176,7 +186,8 @@ Feature: MLRun Projects Page Then select "Export YAML" option in action menu on "Projects" wizard in "Projects_Table" table at row with "default" value in "name" column And wait load page Then check that "default.yaml" file is existed on "Downloads" directory - + + @MLPr @danger # Run this test case only with mocked backend!!! Scenario: MLPr012 - Check projects limit message @@ -188,6 +199,7 @@ Feature: MLRun Projects Page Then click on "Create_Button" element on "Create_New_Project" wizard Then "Error_Message" component on "Create_New_Project" should contains "Error_Messages"."Projects_Limit_Reached" + @MLPr @passive Scenario: MLPr013 - Create new ML Project and check navigation through project navigation menu Given open url diff --git a/tests/features/step-definitions/steps.js b/tests/features/step-definitions/steps.js index ce358900b..a7e6671e3 100644 --- a/tests/features/step-definitions/steps.js +++ b/tests/features/step-definitions/steps.js @@ -48,7 +48,8 @@ import { verifyElementActive, verifyElementNotActive, generatePath, - determineFileAccess + determineFileAccess, + verifyClassDisabled } from '../common/actions/common.action' import { checkTableColumnValues, @@ -374,6 +375,16 @@ Then( } ) +Then( + 'verify {string} element on {string} wizard is disabled by class name', + async function(inputField, wizardName) { + await verifyClassDisabled( + this.driver, + pageObjects[wizardName][inputField] + ) + } +) + When( 'type searchable fragment {string} into {string} on {string} wizard', async function(subName, inputGroup, wizard) { @@ -442,6 +453,27 @@ Then( } ) +Then( + 'increase value on {int} points in {string} field on {string} wizard', + async function(value, inputField, wizard) { + const txt = await getInputValue( + this.driver, + pageObjects[wizard][inputField] + ) + const result = Number.parseInt(txt) + value + await incrementValue( + this.driver, + pageObjects[wizard][inputField], + value + ) + await verifyTypedValue( + this.driver, + pageObjects[wizard][inputField], + result.toString() + ) + } +) + Then( 'increase value on {int} points in {string} field with {string} on {string} on {string} wizard', async function(value, inputField, unit, accordion, wizard) { @@ -485,6 +517,27 @@ Then( } ) +Then( + 'decrease value on {int} points in {string} field on {string} wizard', + async function(value, inputField, wizard) { + const txt = await getInputValue( + this.driver, + pageObjects[wizard][inputField] + ) + const result = Number.parseInt(txt) - value + await decrementValue( + this.driver, + pageObjects[wizard][inputField], + value + ) + await verifyTypedValue( + this.driver, + pageObjects[wizard][inputField], + result.toString() + ) + } +) + Then( 'decrease value on {int} points in {string} field with {string} on {string} on {string} wizard', async function (value, inputField, unit, accordion, wizard) { diff --git a/tests/features/step-definitions/table.steps.js b/tests/features/step-definitions/table.steps.js index 2e3b1de35..926172e68 100644 --- a/tests/features/step-definitions/table.steps.js +++ b/tests/features/step-definitions/table.steps.js @@ -217,6 +217,76 @@ When('add data to {string} table on {string} wizard', async function (table, wiz } }) +When('add data to {string} table on {string} wizard with a pre-filled table', async function (table, wizard, dataTable) { + const inputFields = dataTable['rawTable'][0] + const rows = dataTable.rows() + for (const row_indx in rows) { + let rowsNumber = await getTableRows(this.driver, pageObjects[wizard][table]) + await clickOnComponent(this.driver, pageObjects[wizard][table]['add_row_btn']) + await this.driver.sleep(100) + await clickOnComponent(this.driver, pageObjects[wizard][table]['tableFields'][inputFields[0]](rowsNumber + 2)) + await this.driver.sleep(250) + await typeIntoInputField( + this.driver, + pageObjects[wizard][table]['tableFields'][inputFields[0]](rowsNumber + 2), + rows[row_indx][0] + ) + await this.driver.sleep(100) + await openDropdown(this.driver, pageObjects[wizard][table]['tableFields'][inputFields[1]](rowsNumber + 2)) + await selectOptionInDropdownWithoutCheck( + this.driver, + pageObjects[wizard][table]['tableFields'][inputFields[1]](rowsNumber + 2), + rows[row_indx][1] + ) + await this.driver.sleep(100) + await typeIntoInputField( + this.driver, + pageObjects[wizard][table]['tableFields'][inputFields[2]](rowsNumber + 2), + rows[row_indx][2] + ) + await this.driver.sleep(100) + await hoverComponent(this.driver, pageObjects[wizard][table]['tableFields']['apply_btn'](rowsNumber + 2)) + await this.driver.sleep(100) + await clickOnComponent(this.driver, pageObjects[wizard][table]['tableFields']['apply_btn'](rowsNumber + 2)) + await this.driver.sleep(100) + } +}) + +When('add custom parameters to {string} table on {string} wizard with a pre-filled table', async function (table, wizard, dataTable) { + const inputFields = dataTable['rawTable'][0] + const rows = dataTable.rows() + for (const row_indx in rows) { + let rowsNumber = await getTableRows(this.driver, pageObjects[wizard][table]) + await clickOnComponent(this.driver, pageObjects[wizard][table]['add_row_btn']) + await this.driver.sleep(100) + await clickOnComponent(this.driver, pageObjects[wizard][table]['tableFields'][inputFields[0]](rowsNumber + 1)) + await this.driver.sleep(250) + await typeIntoInputField( + this.driver, + pageObjects[wizard][table]['tableFields'][inputFields[0]](rowsNumber + 1), + rows[row_indx][0] + ) + await this.driver.sleep(100) + await openDropdown(this.driver, pageObjects[wizard][table]['tableFields'][inputFields[1]](rowsNumber + 1)) + await selectOptionInDropdownWithoutCheck( + this.driver, + pageObjects[wizard][table]['tableFields'][inputFields[1]](rowsNumber + 1), + rows[row_indx][1] + ) + await this.driver.sleep(100) + await typeIntoInputField( + this.driver, + pageObjects[wizard][table]['tableFields'][inputFields[2]](rowsNumber + 1), + rows[row_indx][2] + ) + await this.driver.sleep(100) + await hoverComponent(this.driver, pageObjects[wizard][table]['tableFields']['apply_btn'](rowsNumber + 1)) + await this.driver.sleep(100) + await clickOnComponent(this.driver, pageObjects[wizard][table]['tableFields']['apply_btn'](rowsNumber + 1)) + await this.driver.sleep(100) + } +}) + When('add data to {string} table on {string} wizard with combobox', async function (table, wizard, dataTable) { const inputFields = dataTable['rawTable'][0] const rows = dataTable.rows() @@ -627,6 +697,34 @@ When( } ) +When( + 'add data rows to {string} key-value table on {string} wizard', + async function (table, wizard, dataTable) { + const inputFields = dataTable['rawTable'][0] + const rows = dataTable.rows() + for (const row_indx in rows) { + await clickOnComponent(this.driver, pageObjects[wizard][table]['add_row_btn']) + await this.driver.sleep(100) + for (const i in inputFields) { + const component = pageObjects[wizard][table]['tableFields'][inputFields[i]](parseInt(row_indx) + 2) + const inputField = component.inputField ?? component + await typeIntoInputField(this.driver, inputField, rows[row_indx][i]) + } + + if (pageObjects[wizard][table]['save_row_btn']) { + await clickOnComponent(this.driver, pageObjects[wizard][table]['save_row_btn']) + } else { + await hoverComponent(this.driver, pageObjects[wizard][table]['tableFields']['apply_edit_btn'](parseInt(row_indx) + 2)) + await this.driver.sleep(100) + await clickOnComponent(this.driver, pageObjects[wizard][table]['tableFields']['apply_edit_btn'](parseInt(row_indx) + 2)) + await this.driver.sleep(100) + } + + await this.driver.sleep(100) + } + } +) + When( 'edit dropdown field {int} row in {string} key-value table on {string} wizard', async function (index, table, wizard, dataTable) { diff --git a/tests/mockServer/data/artifacts.json b/tests/mockServer/data/artifacts.json index 0995c458f..4c950d65c 100644 --- a/tests/mockServer/data/artifacts.json +++ b/tests/mockServer/data/artifacts.json @@ -11927,6 +11927,7 @@ "owner": "admin", "workflow": "eaae138e-439a-47fa-93c6-ba0fe1dc3b79" }, + "label_column": "radius", "sources": [ { "name": "models_path", @@ -35012,6 +35013,7 @@ "uri": "ds-source/7cce8e5794aa41bca4ca7fd0f492bd1b", "owner": "admin" }, + "label_column": "radius", "sources": [ { "name": "dataset", diff --git a/tests/mockServer/data/itemsCatalog.json b/tests/mockServer/data/itemsCatalog.json index b1b96d3cc..cca145b10 100644 --- a/tests/mockServer/data/itemsCatalog.json +++ b/tests/mockServer/data/itemsCatalog.json @@ -4545,350 +4545,26 @@ "updated": null, "created": null, "source": "functions", - "version": "1.3.0", + "version": "1.6.0", "tag": "latest", - "mlrunVersion": "1.3.0", "doc": "", "categories": [ "machine-learning", - "model-training" - ], - "platformVersion": "3.5.0", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2022-08-28:17-25", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/latest/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.0.7", - "tag": "1.0.7", - "mlrunVersion": "1.0.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "", - "icon": "", - "marketplaceType": "", - "generationDate": "2022-04-26:10-43", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/1.0.7/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.1.0", - "tag": "1.1.0", - "mlrunVersion": "1.1.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "3.5.0", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2022-08-28:17-25", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/1.1.0/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.3.0", - "tag": "1.3.0", - "mlrunVersion": "1.3.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "3.5.0", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2022-08-28:17-25", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/1.3.0/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.0.5", - "tag": "1.0.5", - "mlrunVersion": "1.0.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "", - "icon": "", - "marketplaceType": "", - "generationDate": "2022-04-26:10-43", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/1.0.5/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.0.6", - "tag": "1.0.6", - "mlrunVersion": "1.0.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "", - "icon": "", - "marketplaceType": "", - "generationDate": "2022-04-26:10-43", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/1.0.6/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "0.10.2", - "tag": "0.10.2", - "mlrunVersion": "0.10.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "", - "icon": "", - "marketplaceType": "", - "generationDate": "2022-02-06:10-18", - "example": "auto_trainer.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/0.10.2/", - "assets": { - "example": "src/auto_trainer.ipynb", - "source": "src/auto_trainer.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [], - "kind": "job", - "filename": "auto_trainer.py", - "handler": "train", - "image": "" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "auto-trainer", - "description": "Automatic train, evaluate and predict functions for the ML frameworks - Scikit-Learn, XGBoost and LightGBM.", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "0.10.3", - "tag": "0.10.3", - "mlrunVersion": "0.10.0", - "doc": "", - "categories": [ - "machine-learning", - "model-training" - ], - "platformVersion": "", - "icon": "", - "marketplaceType": "", - "generationDate": "2022-04-26:10-43", + "model-training" + ], + "generationDate": "2022-08-28:17-25", "example": "auto_trainer.ipynb", + "mlrunVersion": "1.5.2", "url": "", + "apiVersion": "v1", + "hidden": false, + "platformVersion": "3.5.0", "maintainers": [], - "apiVersion": "v1" + "marketplaceType": "", + "icon": "" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/0.10.3/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/auto_trainer/latest/", "assets": { "example": "src/auto_trainer.ipynb", "source": "src/auto_trainer.py", @@ -4896,10 +4572,10 @@ "docs": "static/documentation.html" }, "requirements": [], - "kind": "job", + "image": "mlrun/mlrun", "filename": "auto_trainer.py", "handler": "train", - "image": "" + "kind": "job" }, "status": { "state": null @@ -12149,256 +11825,18 @@ "function": "src/function.yaml", "docs": "static/documentation.html" }, - "requirements": [ - "onnx~=1.10.1", - "onnxruntime~=1.8.1", - "optimum~=1.6.4", - "transformers~=4.26.1", - "datasets~=2.10.1", - "scikit-learn~=1.0.2" - ], - "kind": "job", - "filename": "hugging_face_classifier_trainer.py", - "handler": "train", - "image": "mlrun/ml-models" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "validate-great-expectations", - "description": "Validate a dataset using Great Expectations", - "labels": { - "author": "nicks", - "framework": "great-expectations" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.1.0", - "tag": "latest", - "mlrunVersion": "1.1.0", - "doc": "", - "categories": [ - "data-validation", - "data-analysis" - ], - "platformVersion": "3.5.2", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2022-04-26:12-28", - "example": "validate_great_expectations.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/validate_great_expectations/latest/", - "assets": { - "example": "src/validate_great_expectations.ipynb", - "source": "src/validate_great_expectations.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [ - "great-expectations==0.15.41" - ], - "kind": "job", - "filename": "validate_great_expectations.py", - "handler": "validate_expectations", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "validate-great-expectations", - "description": "Validate a dataset using Great Expectations", - "labels": { - "author": "nicks", - "framework": "great-expectations" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "1.1.0", - "tag": "1.1.0", - "mlrunVersion": "1.1.0", - "doc": "", - "categories": [ - "data-validation", - "data-analysis" - ], - "platformVersion": "3.5.2", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2022-04-26:12-28", - "example": "validate_great_expectations.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/validate_great_expectations/1.1.0/", - "assets": { - "example": "src/validate_great_expectations.ipynb", - "source": "src/validate_great_expectations.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": [ - "great-expectations==0.15.41" - ], - "kind": "job", - "filename": "validate_great_expectations.py", - "handler": "validate_expectations", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "question-answering", - "description": "GenAI approach of question answering on a given data", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "0.2.0", - "tag": "latest", - "mlrunVersion": "1.4.0", - "doc": "", - "categories": [ - "machine-learning" - ], - "platformVersion": "3.5.0", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2023-08-07:11-30", - "example": "question_answering.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/question_answering/latest/", - "assets": { - "example": "src/question_answering.ipynb", - "source": "src/question_answering.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": "transformers torch tqdm", - "kind": "job", - "filename": "question_answering.py", - "handler": "answer_questions", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "question-answering", - "description": "GenAI approach of question answering on a given data", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "0.2.0", - "tag": "0.2.0", - "mlrunVersion": "1.4.0", - "doc": "", - "categories": [ - "machine-learning" - ], - "platformVersion": "3.5.0", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2023-08-07:11-30", - "example": "question_answering.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/question_answering/0.2.0/", - "assets": { - "example": "src/question_answering.ipynb", - "source": "src/question_answering.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": "transformers torch tqdm", - "kind": "job", - "filename": "question_answering.py", - "handler": "answer_questions", - "image": "mlrun/mlrun" - }, - "status": { - "state": null - } - }, - { - "kind": "HubItem", - "metadata": { - "name": "question-answering", - "description": "GenAI approach of question answering on a given data", - "labels": { - "author": "yonish" - }, - "updated": null, - "created": null, - "source": "functions", - "version": "0.1.0", - "tag": "0.1.0", - "mlrunVersion": "1.4.0", - "doc": "", - "categories": [ - "machine-learning" - ], - "platformVersion": "3.5.0", - "icon": "", - "marketplaceType": "", - "hidden": false, - "generationDate": "2023-08-07:11-30", - "example": "question_answering.ipynb", - "url": "", - "maintainers": [], - "apiVersion": "v1" - }, - "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/question_answering/0.1.0/", - "assets": { - "example": "src/question_answering.ipynb", - "source": "src/question_answering.py", - "function": "src/function.yaml", - "docs": "static/documentation.html" - }, - "requirements": "transformers torch tqdm", + "requirements": [ + "onnx~=1.10.1", + "onnxruntime~=1.8.1", + "optimum~=1.6.4", + "transformers~=4.26.1", + "datasets~=2.10.1", + "scikit-learn~=1.0.2" + ], "kind": "job", - "filename": "question_answering.py", - "handler": "answer_questions", - "image": "mlrun/mlrun" + "filename": "hugging_face_classifier_trainer.py", + "handler": "train", + "image": "mlrun/ml-models" }, "status": { "state": null @@ -12407,48 +11845,47 @@ { "kind": "HubItem", "metadata": { - "name": "transcribe", - "description": "Transcribe audio files into text files", + "name": "validate-great-expectations", + "description": "Validate a dataset using Great Expectations", "labels": { - "author": "yonatans" + "author": "nicks", + "framework": "great-expectations" }, "updated": null, "created": null, "source": "functions", - "version": "0.0.1", + "version": "1.1.0", "tag": "latest", - "mlrunVersion": "1.4.0", + "mlrunVersion": "1.1.0", "doc": "", "categories": [ - "data-preparation", - "machine-learning" + "data-validation", + "data-analysis" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.2", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-07-13:11-20", - "example": "transcribe.ipynb", - "test_valid": false, + "generationDate": "2022-04-26:12-28", + "example": "validate_great_expectations.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/transcribe/latest/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/validate_great_expectations/latest/", "assets": { - "example": "src/transcribe.ipynb", - "source": "src/transcribe.py", + "example": "src/validate_great_expectations.ipynb", + "source": "src/validate_great_expectations.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, "requirements": [ - "openai-whisper", - "tqdm" + "great-expectations==0.15.41" ], "kind": "job", - "filename": "transcribe.py", - "handler": "transcribe", + "filename": "validate_great_expectations.py", + "handler": "validate_expectations", "image": "mlrun/mlrun" }, "status": { @@ -12458,48 +11895,47 @@ { "kind": "HubItem", "metadata": { - "name": "transcribe", - "description": "Transcribe audio files into text files", + "name": "validate-great-expectations", + "description": "Validate a dataset using Great Expectations", "labels": { - "author": "yonatans" + "author": "nicks", + "framework": "great-expectations" }, "updated": null, "created": null, "source": "functions", - "version": "0.0.1", - "tag": "0.0.1", - "mlrunVersion": "1.4.0", + "version": "1.1.0", + "tag": "1.1.0", + "mlrunVersion": "1.1.0", "doc": "", "categories": [ - "data-preparation", - "machine-learning" + "data-validation", + "data-analysis" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.2", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-07-13:11-20", - "example": "transcribe.ipynb", - "test_valid": false, + "generationDate": "2022-04-26:12-28", + "example": "validate_great_expectations.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/transcribe/0.0.1/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/validate_great_expectations/1.1.0/", "assets": { - "example": "src/transcribe.ipynb", - "source": "src/transcribe.py", + "example": "src/validate_great_expectations.ipynb", + "source": "src/validate_great_expectations.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, "requirements": [ - "openai-whisper", - "tqdm" + "great-expectations==0.15.41" ], "kind": "job", - "filename": "transcribe.py", - "handler": "transcribe", + "filename": "validate_great_expectations.py", + "handler": "validate_expectations", "image": "mlrun/mlrun" }, "status": { @@ -12509,54 +11945,43 @@ { "kind": "HubItem", "metadata": { - "name": "pii-recognizer", - "description": "This function is used to recognize PII in a directory of text files", + "name": "question-answering", + "description": "GenAI approach of question answering on a given data", "labels": { - "author": "pgw" + "author": "yonish" }, "updated": null, "created": null, "source": "functions", - "version": "0.1.0", + "version": "0.2.0", "tag": "latest", "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "machine-learning", - "data-preparation" + "machine-learning" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.0", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-15:10-24", - "example": "pii_recognizer.ipynb", - "test_valid": false, + "generationDate": "2023-08-07:11-30", + "example": "question_answering.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/pii_recognizer/latest/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/question_answering/latest/", "assets": { - "example": "src/pii_recognizer.ipynb", - "source": "src/pii_recognizer.py", + "example": "src/question_answering.ipynb", + "source": "src/question_answering.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, - "requirements": [ - "nltk", - "pandas", - "presidio-anonymizer", - "presidio-analyzer", - "torch", - "flair@git+https://github.com/flairNLP/flair.git@d4ed67bf663e4066517f00397412510d90043653", - "st-annotated-text", - "https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl" - ], + "requirements": "transformers torch tqdm", "kind": "job", - "filename": "pii_recognizer.py", - "handler": "recognize_pii", + "filename": "question_answering.py", + "handler": "answer_questions", "image": "mlrun/mlrun" }, "status": { @@ -12566,54 +11991,43 @@ { "kind": "HubItem", "metadata": { - "name": "pii-recognizer", - "description": "This function is used to recognize PII in a directory of text files", + "name": "question-answering", + "description": "GenAI approach of question answering on a given data", "labels": { - "author": "pgw" + "author": "yonish" }, "updated": null, "created": null, "source": "functions", - "version": "0.1.0", - "tag": "0.1.0", + "version": "0.2.0", + "tag": "0.2.0", "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "machine-learning", - "data-preparation" + "machine-learning" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.0", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-15:10-24", - "example": "pii_recognizer.ipynb", - "test_valid": false, + "generationDate": "2023-08-07:11-30", + "example": "question_answering.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/pii_recognizer/0.1.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/question_answering/0.2.0/", "assets": { - "example": "src/pii_recognizer.ipynb", - "source": "src/pii_recognizer.py", + "example": "src/question_answering.ipynb", + "source": "src/question_answering.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, - "requirements": [ - "nltk", - "pandas", - "presidio-anonymizer", - "presidio-analyzer", - "torch", - "flair@git+https://github.com/flairNLP/flair.git@d4ed67bf663e4066517f00397412510d90043653", - "st-annotated-text", - "https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl" - ], + "requirements": "transformers torch tqdm", "kind": "job", - "filename": "pii_recognizer.py", - "handler": "recognize_pii", + "filename": "question_answering.py", + "handler": "answer_questions", "image": "mlrun/mlrun" }, "status": { @@ -12623,53 +12037,43 @@ { "kind": "HubItem", "metadata": { - "name": "pii-recognizer", - "description": "This function is used to recognize PII in a directory of text files", + "name": "question-answering", + "description": "GenAI approach of question answering on a given data", "labels": { - "author": "pgw" + "author": "yonish" }, "updated": null, "created": null, "source": "functions", - "version": "0.0.1", - "tag": "0.0.1", + "version": "0.1.0", + "tag": "0.1.0", "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "machine-learning", - "data-preparation" + "machine-learning" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.0", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-15:10-24", - "example": "pii_recognizer.ipynb", + "generationDate": "2023-08-07:11-30", + "example": "question_answering.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/pii_recognizer/0.0.1/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/question_answering/0.1.0/", "assets": { - "example": "src/pii_recognizer.ipynb", - "source": "src/pii_recognizer.py", + "example": "src/question_answering.ipynb", + "source": "src/question_answering.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, - "requirements": [ - "nltk", - "pandas", - "presidio-anonymizer", - "presidio-analyzer", - "torch", - "flair@git+https://github.com/flairNLP/flair.git@d4ed67bf663e4066517f00397412510d90043653", - "st-annotated-text", - "https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl" - ], + "requirements": "transformers torch tqdm", "kind": "job", - "filename": "pii_recognizer.py", - "handler": "recognize_pii", + "filename": "question_answering.py", + "handler": "answer_questions", "image": "mlrun/mlrun" }, "status": { @@ -12679,44 +12083,48 @@ { "kind": "HubItem", "metadata": { - "name": "huggingface-auto-trainer", - "description": "fine-tune llm model with ease", + "name": "transcribe", + "description": "Transcribe audio files into text files", "labels": { - "author": "Zeevr" + "author": "yonatans" }, "updated": null, "created": null, "source": "functions", - "version": "1.0.0", + "version": "0.0.1", "tag": "latest", "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "machine-learning", - "model-training" + "data-preparation", + "machine-learning" ], - "platformVersion": "3.5.0", + "platformVersion": "3.5.3", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-21:17-25", - "example": "huggingface_auto_trainer.ipynb", + "generationDate": "2023-07-13:11-20", + "example": "transcribe.ipynb", + "test_valid": false, "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/huggingface_auto_trainer/latest/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/transcribe/latest/", "assets": { - "example": "src/huggingface_auto_trainer.ipynb", - "source": "src/huggingface_auto_trainer.py", + "example": "src/transcribe.ipynb", + "source": "src/transcribe.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, - "requirements": [], + "requirements": [ + "openai-whisper", + "tqdm" + ], "kind": "job", - "filename": "huggingface_auto_trainer.py", - "handler": "finetune_llm", + "filename": "transcribe.py", + "handler": "transcribe", "image": "mlrun/mlrun" }, "status": { @@ -12726,44 +12134,48 @@ { "kind": "HubItem", "metadata": { - "name": "huggingface-auto-trainer", - "description": "fine-tune llm model with ease", + "name": "transcribe", + "description": "Transcribe audio files into text files", "labels": { - "author": "Zeevr" + "author": "yonatans" }, "updated": null, "created": null, "source": "functions", - "version": "1.0.0", - "tag": "1.0.0", + "version": "0.0.1", + "tag": "0.0.1", "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "machine-learning", - "model-training" + "data-preparation", + "machine-learning" ], - "platformVersion": "3.5.0", + "platformVersion": "3.5.3", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-21:17-25", - "example": "huggingface_auto_trainer.ipynb", + "generationDate": "2023-07-13:11-20", + "example": "transcribe.ipynb", + "test_valid": false, "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/huggingface_auto_trainer/1.0.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/transcribe/0.0.1/", "assets": { - "example": "src/huggingface_auto_trainer.ipynb", - "source": "src/huggingface_auto_trainer.py", + "example": "src/transcribe.ipynb", + "source": "src/transcribe.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, - "requirements": [], + "requirements": [ + "openai-whisper", + "tqdm" + ], "kind": "job", - "filename": "huggingface_auto_trainer.py", - "handler": "finetune_llm", + "filename": "transcribe.py", + "handler": "transcribe", "image": "mlrun/mlrun" }, "status": { @@ -12773,52 +12185,54 @@ { "kind": "HubItem", "metadata": { - "name": "batch-inference-v2", - "description": "Batch inference (also knows as prediction) for the common ML frameworks (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis.", + "name": "pii-recognizer", + "description": "This function is used to recognize PII in a directory of text files", "labels": { - "author": "eyald" + "author": "pgw" }, "updated": null, "created": null, "source": "functions", - "version": "2.0.0", + "version": "0.1.0", "tag": "latest", - "mlrunVersion": "1.5.0", + "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "utils", - "data-analysis", - "monitoring" + "machine-learning", + "data-preparation" ], "platformVersion": "3.5.3", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-07:12-25", - "example": "batch_inference_v2.ipynb", + "generationDate": "2023-08-15:10-24", + "example": "pii_recognizer.ipynb", + "test_valid": false, "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/latest/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/pii_recognizer/latest/", "assets": { - "example": "src/batch_inference_v2.ipynb", - "source": "src/batch_inference_v2.py", + "example": "src/pii_recognizer.ipynb", + "source": "src/pii_recognizer.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, + "requirements": [ + "nltk", + "pandas", + "presidio-anonymizer", + "presidio-analyzer", + "torch", + "flair@git+https://github.com/flairNLP/flair.git@d4ed67bf663e4066517f00397412510d90043653", + "st-annotated-text", + "https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl" + ], "kind": "job", - "filename": "batch_inference_v2.py", - "extra_spec": { - "allow_empty_resources": true, - "build": { - "auto_build": false, - "with_mlrun": false - } - }, - "handler": "infer", - "requirements": null, + "filename": "pii_recognizer.py", + "handler": "recognize_pii", "image": "mlrun/mlrun" }, "status": { @@ -12828,52 +12242,54 @@ { "kind": "HubItem", "metadata": { - "name": "batch-inference-v2", - "description": "Batch inference (also knows as prediction) for the common ML frameworks (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis.", + "name": "pii-recognizer", + "description": "This function is used to recognize PII in a directory of text files", "labels": { - "author": "eyald" + "author": "pgw" }, "updated": null, "created": null, "source": "functions", - "version": "1.5.0", - "tag": "1.5.0", - "mlrunVersion": "1.5.0-rc9", + "version": "0.1.0", + "tag": "0.1.0", + "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "utils", - "data-analysis", - "monitoring" + "machine-learning", + "data-preparation" ], "platformVersion": "3.5.3", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-07:12-25", - "example": "batch_inference_v2.ipynb", + "generationDate": "2023-08-15:10-24", + "example": "pii_recognizer.ipynb", + "test_valid": false, "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/1.5.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/pii_recognizer/0.1.0/", "assets": { - "example": "src/batch_inference_v2.ipynb", - "source": "src/batch_inference_v2.py", + "example": "src/pii_recognizer.ipynb", + "source": "src/pii_recognizer.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, + "requirements": [ + "nltk", + "pandas", + "presidio-anonymizer", + "presidio-analyzer", + "torch", + "flair@git+https://github.com/flairNLP/flair.git@d4ed67bf663e4066517f00397412510d90043653", + "st-annotated-text", + "https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl" + ], "kind": "job", - "filename": "batch_inference_v2.py", - "extra_spec": { - "allow_empty_resources": true, - "build": { - "auto_build": false, - "with_mlrun": false - } - }, - "handler": "infer", - "requirements": null, + "filename": "pii_recognizer.py", + "handler": "recognize_pii", "image": "mlrun/mlrun" }, "status": { @@ -12883,52 +12299,53 @@ { "kind": "HubItem", "metadata": { - "name": "batch-inference-v2", - "description": "Batch inference (also knows as prediction) for the common ML frameworks (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis.", + "name": "pii-recognizer", + "description": "This function is used to recognize PII in a directory of text files", "labels": { - "author": "eyald" + "author": "pgw" }, "updated": null, "created": null, "source": "functions", - "version": "1.9.0", - "tag": "1.9.0", - "mlrunVersion": "1.5.0-rc16", + "version": "0.0.1", + "tag": "0.0.1", + "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "utils", - "data-analysis", - "monitoring" + "machine-learning", + "data-preparation" ], "platformVersion": "3.5.3", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-07:12-25", - "example": "batch_inference_v2.ipynb", + "generationDate": "2023-08-15:10-24", + "example": "pii_recognizer.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/1.9.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/pii_recognizer/0.0.1/", "assets": { - "example": "src/batch_inference_v2.ipynb", - "source": "src/batch_inference_v2.py", + "example": "src/pii_recognizer.ipynb", + "source": "src/pii_recognizer.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, + "requirements": [ + "nltk", + "pandas", + "presidio-anonymizer", + "presidio-analyzer", + "torch", + "flair@git+https://github.com/flairNLP/flair.git@d4ed67bf663e4066517f00397412510d90043653", + "st-annotated-text", + "https://huggingface.co/beki/en_spacy_pii_distilbert/resolve/main/en_spacy_pii_distilbert-any-py3-none-any.whl" + ], "kind": "job", - "filename": "batch_inference_v2.py", - "extra_spec": { - "allow_empty_resources": true, - "build": { - "auto_build": false, - "with_mlrun": false - } - }, - "handler": "infer", - "requirements": null, + "filename": "pii_recognizer.py", + "handler": "recognize_pii", "image": "mlrun/mlrun" }, "status": { @@ -12938,52 +12355,44 @@ { "kind": "HubItem", "metadata": { - "name": "batch-inference-v2", - "description": "Batch inference (also knows as prediction) for the common ML frameworks (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis.", + "name": "huggingface-auto-trainer", + "description": "fine-tune llm model with ease", "labels": { - "author": "eyald" + "author": "Zeevr" }, "updated": null, "created": null, "source": "functions", - "version": "1.8.0", - "tag": "1.8.0", - "mlrunVersion": "1.5.0-rc13", + "version": "1.0.0", + "tag": "latest", + "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "utils", - "data-analysis", - "monitoring" + "machine-learning", + "model-training" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.0", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-07:12-25", - "example": "batch_inference_v2.ipynb", + "generationDate": "2023-08-21:17-25", + "example": "huggingface_auto_trainer.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/1.8.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/huggingface_auto_trainer/latest/", "assets": { - "example": "src/batch_inference_v2.ipynb", - "source": "src/batch_inference_v2.py", + "example": "src/huggingface_auto_trainer.ipynb", + "source": "src/huggingface_auto_trainer.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, + "requirements": [], "kind": "job", - "filename": "batch_inference_v2.py", - "extra_spec": { - "allow_empty_resources": true, - "build": { - "auto_build": false, - "with_mlrun": false - } - }, - "handler": "infer", - "requirements": null, + "filename": "huggingface_auto_trainer.py", + "handler": "finetune_llm", "image": "mlrun/mlrun" }, "status": { @@ -12993,52 +12402,44 @@ { "kind": "HubItem", "metadata": { - "name": "batch-inference-v2", - "description": "Batch inference (also knows as prediction) for the common ML frameworks (SciKit-Learn, XGBoost and LightGBM) while performing data drift analysis.", + "name": "huggingface-auto-trainer", + "description": "fine-tune llm model with ease", "labels": { - "author": "eyald" + "author": "Zeevr" }, "updated": null, "created": null, "source": "functions", - "version": "2.0.0", - "tag": "2.0.0", - "mlrunVersion": "1.5.0", + "version": "1.0.0", + "tag": "1.0.0", + "mlrunVersion": "1.4.0", "doc": "", "categories": [ - "utils", - "data-analysis", - "monitoring" + "machine-learning", + "model-training" ], - "platformVersion": "3.5.3", + "platformVersion": "3.5.0", "icon": "", "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-07:12-25", - "example": "batch_inference_v2.ipynb", + "generationDate": "2023-08-21:17-25", + "example": "huggingface_auto_trainer.ipynb", "url": "", "maintainers": [], "apiVersion": "v1" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/2.0.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/huggingface_auto_trainer/1.0.0/", "assets": { - "example": "src/batch_inference_v2.ipynb", - "source": "src/batch_inference_v2.py", + "example": "src/huggingface_auto_trainer.ipynb", + "source": "src/huggingface_auto_trainer.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, + "requirements": [], "kind": "job", - "filename": "batch_inference_v2.py", - "extra_spec": { - "allow_empty_resources": true, - "build": { - "auto_build": false, - "with_mlrun": false - } - }, - "handler": "infer", - "requirements": null, + "filename": "huggingface_auto_trainer.py", + "handler": "finetune_llm", "image": "mlrun/mlrun" }, "status": { @@ -13056,34 +12457,33 @@ "updated": null, "created": null, "source": "functions", - "version": "1.6.0", - "tag": "1.6.0", - "mlrunVersion": "1.5.0-rc9", - "doc": "", + "version": "2.2.0", + "tag": "latest", "categories": [ "utils", "data-analysis", "monitoring" ], - "platformVersion": "3.5.3", + "apiVersion": "v1", + "example": "batch_inference_v2.ipynb", "icon": "", - "marketplaceType": "", "hidden": false, - "generationDate": "2023-08-07:12-25", - "example": "batch_inference_v2.ipynb", + "platformVersion": "3.5.3", "url": "", + "mlrunVersion": "1.5.0", "maintainers": [], - "apiVersion": "v1" + "doc": "", + "generationDate": "2023-08-07:12-25", + "marketplaceType": "" }, "spec": { - "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/1.6.0/", + "item_uri": "https://mlrun.github.io/marketplace/functions/master/batch_inference_v2/latest/", "assets": { "example": "src/batch_inference_v2.ipynb", "source": "src/batch_inference_v2.py", "function": "src/function.yaml", "docs": "static/documentation.html" }, - "kind": "job", "filename": "batch_inference_v2.py", "extra_spec": { "allow_empty_resources": true, @@ -13093,8 +12493,9 @@ } }, "handler": "infer", - "requirements": null, - "image": "mlrun/mlrun" + "image": "mlrun/mlrun", + "kind": "job", + "requirements": null }, "status": { "state": null diff --git a/tests/mockServer/data/mlrun/functions/auto_trainer/auto_trainer.yaml b/tests/mockServer/data/mlrun/functions/auto_trainer/auto_trainer.yaml new file mode 100644 index 000000000..2d0c07fd8 --- /dev/null +++ b/tests/mockServer/data/mlrun/functions/auto_trainer/auto_trainer.yaml @@ -0,0 +1,177 @@ +# Copyright 2019 Iguazio +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +kind: job +metadata: + name: auto-trainer + tag: '' + hash: 95201dacf05c181e0257b5dd145cb79a503b6fbe + project: '' + labels: + author: yonish + categories: + - machine-learning + - model-training +spec: + command: '' + args: [] + image: mlrun/mlrun + build: + functionSourceCode: IyBDb3B5cmlnaHQgMjAxOSBJZ3VhemlvCiMKIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiMKIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiMKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBBbnksIERpY3QsIExpc3QsIE9wdGlvbmFsLCBUdXBsZSwgVW5pb24KCmltcG9ydCBtbHJ1bgppbXBvcnQgbWxydW4uZGF0YXN0b3JlCmltcG9ydCBtbHJ1bi51dGlscwppbXBvcnQgcGFuZGFzIGFzIHBkCmZyb20gbWxydW4gaW1wb3J0IGZlYXR1cmVfc3RvcmUgYXMgZnMKZnJvbSBtbHJ1bi5kYXRhc3RvcmUgaW1wb3J0IERhdGFJdGVtCmZyb20gbWxydW4uZXhlY3V0aW9uIGltcG9ydCBNTENsaWVudEN0eApmcm9tIG1scnVuLmZyYW1ld29ya3MuYXV0b19tbHJ1biBpbXBvcnQgQXV0b01MUnVuCmZyb20gbWxydW4udXRpbHMuaGVscGVycyBpbXBvcnQgY3JlYXRlX2NsYXNzLCBjcmVhdGVfZnVuY3Rpb24KZnJvbSBza2xlYXJuLm1vZGVsX3NlbGVjdGlvbiBpbXBvcnQgdHJhaW5fdGVzdF9zcGxpdAoKUGF0aFR5cGUgPSBVbmlvbltzdHIsIFBhdGhdCgoKY2xhc3MgS1dBcmdzUHJlZml4ZXM6CiAgICBNT0RFTF9DTEFTUyA9ICJDTEFTU18iCiAgICBGSVQgPSAiRklUXyIKICAgIFRSQUlOID0gIlRSQUlOXyIKCgpkZWYgX2dldF9zdWJfZGljdF9ieV9wcmVmaXgoc3JjOiBEaWN0LCBwcmVmaXhfa2V5OiBzdHIpIC0+IERpY3Rbc3RyLCBBbnldOgogICAgIiIiCiAgICBDb2xsZWN0IGFsbCB0aGUga2V5cyBmcm9tIHRoZSBnaXZlbiBkaWN0IHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgY3JlYXRlcyBhIG5ldyBkaWN0aW9uYXJ5IHdpdGggdGhlc2UKICAgIGtleXMuCgogICAgOnBhcmFtIHNyYzogICAgICAgICBUaGUgc291cmNlIGRpY3QgdG8gZXh0cmFjdCB0aGUgdmFsdWVzIGZyb20uCiAgICA6cGFyYW0gcHJlZml4X2tleTogIE9ubHkga2V5cyB3aXRoIHRoaXMgcHJlZml4IHdpbGwgYmUgcmV0dXJuZWQuIFRoZSBrZXlzIGluIHRoZSByZXN1bHQgZGljdCB3aWxsIGJlIHdpdGhvdXQgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXguCiAgICAiIiIKICAgIHJldHVybiB7CiAgICAgICAga2V5LnJlcGxhY2UocHJlZml4X2tleSwgIiIpOiB2YWwKICAgICAgICBmb3Iga2V5LCB2YWwgaW4gc3JjLml0ZW1zKCkKICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aChwcmVmaXhfa2V5KQogICAgfQoKCmRlZiBfZ2V0X2RhdGFmcmFtZSgKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogRGF0YUl0ZW0sCiAgICBsYWJlbF9jb2x1bW5zOiBPcHRpb25hbFtVbmlvbltzdHIsIExpc3Rbc3RyXV1dID0gTm9uZSwKICAgIGRyb3BfY29sdW1uczogVW5pb25bc3RyLCBMaXN0W3N0cl0sIGludCwgTGlzdFtpbnRdXSA9IE5vbmUsCikgLT4gVHVwbGVbcGQuRGF0YUZyYW1lLCBPcHRpb25hbFtVbmlvbltzdHIsIExpc3Rbc3RyXV1dXToKICAgICIiIgogICAgR2V0dGluZyB0aGUgRGF0YUZyYW1lIG9mIHRoZSBkYXRhc2V0IGFuZCBkcm9wIHRoZSBjb2x1bW5zIGFjY29yZGluZ2x5LgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgIE1MUnVuIGNvbnRleHQuCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICBUaGUgZGF0YXNldCB0byB0cmFpbiB0aGUgbW9kZWwgb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgZWl0aGVyIGEgbGlzdCBvZiBsaXN0cywgZGljdCwgVVJJIG9yIGEgRmVhdHVyZVZlY3Rvci4KICAgIDpwYXJhbSBsYWJlbF9jb2x1bW5zOiAgIFRoZSB0YXJnZXQgbGFiZWwocykgb2YgdGhlIGNvbHVtbihzKSBpbiB0aGUgZGF0YXNldC4gZm9yIFJlZ3Jlc3Npb24gb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpY2F0aW9uIHRhc2tzLgogICAgOnBhcmFtIGRyb3BfY29sdW1uczogICAgc3RyL2ludCBvciBhIGxpc3Qgb2Ygc3RyaW5ncy9pbnRzIHRoYXQgcmVwcmVzZW50IHRoZSBjb2x1bW4gbmFtZXMvaW5kaWNlcyB0byBkcm9wLgogICAgIiIiCiAgICBzdG9yZV91cmlfcHJlZml4LCBfID0gbWxydW4uZGF0YXN0b3JlLnBhcnNlX3N0b3JlX3VyaShkYXRhc2V0LmFydGlmYWN0X3VybCkKCiAgICAjIEdldHRpbmcgdGhlIGRhdGFzZXQ6CiAgICBpZiBtbHJ1bi51dGlscy5TdG9yZVByZWZpeC5GZWF0dXJlVmVjdG9yID09IHN0b3JlX3VyaV9wcmVmaXg6CiAgICAgICAgIyBGZWF0dXJlVmVjdG9yIGNhc2U6CiAgICAgICAgbGFiZWxfY29sdW1ucyA9IGxhYmVsX2NvbHVtbnMgb3IgZGF0YXNldC5tZXRhLnN0YXR1cy5sYWJlbF9jb2x1bW4KICAgICAgICBkYXRhc2V0ID0gZnMuZ2V0X29mZmxpbmVfZmVhdHVyZXMoCiAgICAgICAgICAgIGRhdGFzZXQubWV0YS51cmksIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMKICAgICAgICApLnRvX2RhdGFmcmFtZSgpCgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJsYWJlbCBjb2x1bW5zOiB7bGFiZWxfY29sdW1uc30iKQoKICAgIGVsaWYgbm90IGxhYmVsX2NvbHVtbnM6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygKICAgICAgICAgICAgImxhYmVsX2NvbHVtbnMgbm90IHByb3ZpZGVkLCBtYW5kYXRvcnkgd2hlbiBkYXRhc2V0IGlzIG5vdCBhIEZlYXR1cmVWZWN0b3IiCiAgICAgICAgKQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKCiAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YXNldCwgKGxpc3QsIGRpY3QpKToKICAgICAgICAjIGxpc3QvZGljdCBjYXNlOgogICAgICAgIGRhdGFzZXQgPSBwZC5EYXRhRnJhbWUoZGF0YXNldCkKICAgICAgICAjIENoZWNraW5nIGlmIGRyb3BfY29sdW1ucyBwcm92aWRlZCBieSBpbnRlZ2VyIHR5cGU6CiAgICAgICAgaWYgZHJvcF9jb2x1bW5zOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRyb3BfY29sdW1ucywgc3RyKSBvciAoCiAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRyb3BfY29sdW1ucywgbGlzdCkKICAgICAgICAgICAgICAgIGFuZCBhbnkoaXNpbnN0YW5jZShjb2wsIHN0cikgZm9yIGNvbCBpbiBkcm9wX2NvbHVtbnMpCiAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICAgICAiZHJvcF9jb2x1bW5zIG11c3QgYmUgYW4gaW50ZWdlci9saXN0IG9mIGludGVnZXJzIGlmIG5vdCBwcm92aWRlZCB3aXRoIGEgVVJJL0ZlYXR1cmVWZWN0b3IgZGF0YXNldCIKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgICAgZGF0YXNldC5kcm9wKGRyb3BfY29sdW1ucywgYXhpcz0xLCBpbnBsYWNlPVRydWUpCgogICAgZWxzZToKICAgICAgICAjIHNpbXBsZSBVUkwgY2FzZToKICAgICAgICBkYXRhc2V0ID0gZGF0YXNldC5hc19kZigpCiAgICAgICAgaWYgZHJvcF9jb2x1bW5zOgogICAgICAgICAgICBpZiBhbGwoY29sIGluIGRhdGFzZXQgZm9yIGNvbCBpbiBkcm9wX2NvbHVtbnMpOgogICAgICAgICAgICAgICAgZGF0YXNldCA9IGRhdGFzZXQuZHJvcChkcm9wX2NvbHVtbnMsIGF4aXM9MSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgb2YgdGhlIGNvbHVtbnMgdG8gZHJvcCBpbiB0aGUgZGF0YXNldCwgZHJvcCBjb2x1bW5zIHByb2Nlc3Mgc2tpcHBlZCIKICAgICAgICAgICAgICAgICkKCiAgICByZXR1cm4gZGF0YXNldCwgbGFiZWxfY29sdW1ucwoKCmRlZiB0cmFpbigKICAgIGNvbnRleHQ6IE1MQ2xpZW50Q3R4LAogICAgZGF0YXNldDogRGF0YUl0ZW0sCiAgICBtb2RlbF9jbGFzczogc3RyLAogICAgbGFiZWxfY29sdW1uczogT3B0aW9uYWxbVW5pb25bc3RyLCBMaXN0W3N0cl1dXSA9IE5vbmUsCiAgICBkcm9wX2NvbHVtbnM6IExpc3Rbc3RyXSA9IE5vbmUsCiAgICBtb2RlbF9uYW1lOiBzdHIgPSAibW9kZWwiLAogICAgdGFnOiBzdHIgPSAiIiwKICAgIHNhbXBsZV9zZXQ6IERhdGFJdGVtID0gTm9uZSwKICAgIHRlc3Rfc2V0OiBEYXRhSXRlbSA9IE5vbmUsCiAgICB0cmFpbl90ZXN0X3NwbGl0X3NpemU6IGZsb2F0ID0gTm9uZSwKICAgIHJhbmRvbV9zdGF0ZTogaW50ID0gTm9uZSwKICAgIGxhYmVsczogZGljdCA9IE5vbmUsCiAgICAqKmt3YXJncywKKToKICAgICIiIgogICAgVHJhaW5pbmcgYSBtb2RlbCB3aXRoIHRoZSBnaXZlbiBkYXRhc2V0LgoKICAgIGV4YW1wbGU6OgoKICAgICAgICBpbXBvcnQgbWxydW4KICAgICAgICBwcm9qZWN0ID0gbWxydW4uZ2V0X29yX2NyZWF0ZV9wcm9qZWN0KCJteS1wcm9qZWN0IikKICAgICAgICBwcm9qZWN0LnNldF9mdW5jdGlvbigiaHViOi8vYXV0b190cmFpbmVyIiwgInRyYWluIikKICAgICAgICB0cmFpbmVyX3J1biA9IHByb2plY3QucnVuKAogICAgICAgICAgICBuYW1lPSJ0cmFpbiIsCiAgICAgICAgICAgIGhhbmRsZXI9InRyYWluIiwKICAgICAgICAgICAgaW5wdXRzPXsiZGF0YXNldCI6ICIuL3BhdGgvdG8vZGF0YXNldC5jc3YifSwKICAgICAgICAgICAgcGFyYW1zPXsKICAgICAgICAgICAgICAgICJtb2RlbF9jbGFzcyI6ICJza2xlYXJuLmxpbmVhcl9tb2RlbC5Mb2dpc3RpY1JlZ3Jlc3Npb24iLAogICAgICAgICAgICAgICAgImxhYmVsX2NvbHVtbnMiOiAibGFiZWwiLAogICAgICAgICAgICAgICAgImRyb3BfY29sdW1ucyI6ICJpZCIsCiAgICAgICAgICAgICAgICAibW9kZWxfbmFtZSI6ICJteS1tb2RlbCIsCiAgICAgICAgICAgICAgICAidGFnIjogInYxLjAuMCIsCiAgICAgICAgICAgICAgICAic2FtcGxlX3NldCI6ICIuL3BhdGgvdG8vc2FtcGxlX3NldC5jc3YiLAogICAgICAgICAgICAgICAgInRlc3Rfc2V0IjogIi4vcGF0aC90by90ZXN0X3NldC5jc3YiLAogICAgICAgICAgICAgICAgIkNMQVNTX3NvbHZlciI6ICJsaWJsaW5lYXIiLAogICAgICAgICAgICB9LAogICAgICAgICkKCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgIE1MUnVuIGNvbnRleHQKICAgIDpwYXJhbSBkYXRhc2V0OiAgICAgICAgICAgICAgICAgVGhlIGRhdGFzZXQgdG8gdHJhaW4gdGhlIG1vZGVsIG9uLiBDYW4gYmUgZWl0aGVyIGEgVVJJIG9yIGEgRmVhdHVyZVZlY3RvcgogICAgOnBhcmFtIG1vZGVsX2NsYXNzOiAgICAgICAgICAgICBUaGUgY2xhc3Mgb2YgdGhlIG1vZGVsLCBlLmcuIGBza2xlYXJuLmxpbmVhcl9tb2RlbC5Mb2dpc3RpY1JlZ3Jlc3Npb25gCiAgICA6cGFyYW0gbGFiZWxfY29sdW1uczogICAgICAgICAgIFRoZSB0YXJnZXQgbGFiZWwocykgb2YgdGhlIGNvbHVtbihzKSBpbiB0aGUgZGF0YXNldC4gZm9yIFJlZ3Jlc3Npb24gb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NpZmljYXRpb24gdGFza3MuIE1hbmRhdG9yeSB3aGVuIGRhdGFzZXQgaXMgbm90IGEgRmVhdHVyZVZlY3Rvci4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgICAgICAgICAgc3RyIG9yIGEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgcmVwcmVzZW50IHRoZSBjb2x1bW5zIHRvIGRyb3AKICAgIDpwYXJhbSBtb2RlbF9uYW1lOiAgICAgICAgICAgICAgVGhlIG1vZGVsJ3MgbmFtZSB0byB1c2UgZm9yIHN0b3JpbmcgdGhlIG1vZGVsIGFydGlmYWN0LCBkZWZhdWx0IHRvICdtb2RlbCcKICAgIDpwYXJhbSB0YWc6ICAgICAgICAgICAgICAgICAgICAgVGhlIG1vZGVsJ3MgdGFnIHRvIGxvZyB3aXRoCiAgICA6cGFyYW0gc2FtcGxlX3NldDogICAgICAgICAgICAgIEEgc2FtcGxlIHNldCBvZiBpbnB1dHMgZm9yIHRoZSBtb2RlbCBmb3IgbG9nZ2luZyBpdHMgc3RhdHMgYWxvbmcgdGhlIG1vZGVsIGluIGZhdm91cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtb2RlbCBtb25pdG9yaW5nLiBDYW4gYmUgZWl0aGVyIGEgVVJJIG9yIGEgRmVhdHVyZVZlY3RvcgogICAgOnBhcmFtIHRlc3Rfc2V0OiAgICAgICAgICAgICAgICBUaGUgdGVzdCBzZXQgdG8gdHJhaW4gdGhlIG1vZGVsIHdpdGguCiAgICA6cGFyYW0gdHJhaW5fdGVzdF9zcGxpdF9zaXplOiAgIGlmIHRlc3Rfc2V0IHdhcyBwcm92aWRlZCB0aGVuIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGJldHdlZW4gMC4wIGFuZCAxLjAgYW5kIHJlcHJlc2VudCB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgZGF0YXNldCB0byBpbmNsdWRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSB0ZXN0IHNwbGl0LiBUaGUgc2l6ZSBvZiB0aGUgVHJhaW5pbmcgc2V0IGlzIHNldCB0byB0aGUgY29tcGxlbWVudCBvZiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiBEZWZhdWx0ID0gMC4yCiAgICA6cGFyYW0gcmFuZG9tX3N0YXRlOiAgICAgICAgICAgIFJlbGV2YW50IG9ubHkgd2hlbiB1c2luZyB0cmFpbl90ZXN0X3NwbGl0X3NpemUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmFuZG9tIHN0YXRlIHNlZWQgdG8gc2h1ZmZsZSB0aGUgZGF0YS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9zY2lraXQtbGVhcm4ub3JnL3N0YWJsZS9nbG9zc2FyeS5odG1sI3Rlcm0tcmFuZG9tX3N0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGljZSB0aGF0IGhlcmUgd2Ugb25seSBwYXNzIGludGVnZXIgdmFsdWVzLgogICAgOnBhcmFtIGxhYmVsczogICAgICAgICAgICAgICAgICBMYWJlbHMgdG8gbG9nIHdpdGggdGhlIG1vZGVsCiAgICA6cGFyYW0ga3dhcmdzOiAgICAgICAgICAgICAgICAgIEhlcmUgeW91IGNhbiBwYXNzIGtleXdvcmQgYXJndW1lbnRzIHdpdGggcHJlZml4ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBwYXJzZWQgYW5kIHBhc3NlZCB0byB0aGUgcmVsZXZhbnQgZnVuY3Rpb24sIGJ5IHRoZSBmb2xsb3dpbmcgcHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYENMQVNTX2AgLSBmb3IgdGhlIG1vZGVsIGNsYXNzIGFyZ3VtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGBGSVRfYCAtIGZvciB0aGUgYGZpdGAgZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYFRSQUlOX2AgLSBmb3IgdGhlIGB0cmFpbmAgZnVuY3Rpb24gKGluIHhnYiBvciBsZ2JtIHRyYWluIGZ1bmN0aW9uIC0gZnV0dXJlKQoKICAgICIiIgogICAgIyBWYWxpZGF0ZSBpbnB1dHM6CiAgICAjIENoZWNrIGlmIGV4YWN0bHkgb25lIG9mIHRoZW0gaXMgc3VwcGxpZWQ6CiAgICBpZiB0ZXN0X3NldCBpcyBOb25lOgogICAgICAgIGlmIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZSBpcyBOb25lOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgInRlc3Rfc2V0IG9yIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZSBhcmUgbm90IHByb3ZpZGVkLCBzZXR0aW5nIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZSB0byAwLjIiCiAgICAgICAgICAgICkKICAgICAgICAgICAgdHJhaW5fdGVzdF9zcGxpdF9zaXplID0gMC4yCgogICAgZWxpZiB0cmFpbl90ZXN0X3NwbGl0X3NpemU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygKICAgICAgICAgICAgInRlc3Rfc2V0IHByb3ZpZGVkLCBpZ25vcmluZyBnaXZlbiB0cmFpbl90ZXN0X3NwbGl0X3NpemUgdmFsdWUiCiAgICAgICAgKQogICAgICAgIHRyYWluX3Rlc3Rfc3BsaXRfc2l6ZSA9IE5vbmUKCiAgICAjIEdldCBEYXRhRnJhbWUgYnkgVVJMIG9yIGJ5IEZlYXR1cmVWZWN0b3I6CiAgICBkYXRhc2V0LCBsYWJlbF9jb2x1bW5zID0gX2dldF9kYXRhZnJhbWUoCiAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgIGRhdGFzZXQ9ZGF0YXNldCwKICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsCiAgICAgICAgZHJvcF9jb2x1bW5zPWRyb3BfY29sdW1ucywKICAgICkKCiAgICAjIEdldHRpbmcgdGhlIHNhbXBsZSBzZXQ6CiAgICBpZiBzYW1wbGVfc2V0IGlzIE5vbmU6CiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbygKICAgICAgICAgICAgZiJTYW1wbGUgc2V0IG5vdCBnaXZlbiwgdXNpbmcgdGhlIHdob2xlIHRyYWluaW5nIHNldCBhcyB0aGUgc2FtcGxlIHNldCIKICAgICAgICApCiAgICAgICAgc2FtcGxlX3NldCA9IGRhdGFzZXQKICAgIGVsc2U6CiAgICAgICAgc2FtcGxlX3NldCwgXyA9IF9nZXRfZGF0YWZyYW1lKAogICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgICAgIGRhdGFzZXQ9c2FtcGxlX3NldCwKICAgICAgICAgICAgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zLAogICAgICAgICAgICBkcm9wX2NvbHVtbnM9ZHJvcF9jb2x1bW5zLAogICAgICAgICkKCiAgICAjIFBhcnNpbmcga3dhcmdzOgogICAgIyBUT0RPOiBVc2UgaW4geGdiIG9yIGxnYm0gdHJhaW4gZnVuY3Rpb24uCiAgICB0cmFpbl9rd2FyZ3MgPSBfZ2V0X3N1Yl9kaWN0X2J5X3ByZWZpeChzcmM9a3dhcmdzLCBwcmVmaXhfa2V5PUtXQXJnc1ByZWZpeGVzLlRSQUlOKQogICAgZml0X2t3YXJncyA9IF9nZXRfc3ViX2RpY3RfYnlfcHJlZml4KHNyYz1rd2FyZ3MsIHByZWZpeF9rZXk9S1dBcmdzUHJlZml4ZXMuRklUKQogICAgbW9kZWxfY2xhc3Nfa3dhcmdzID0gX2dldF9zdWJfZGljdF9ieV9wcmVmaXgoCiAgICAgICAgc3JjPWt3YXJncywgcHJlZml4X2tleT1LV0FyZ3NQcmVmaXhlcy5NT0RFTF9DTEFTUwogICAgKQoKICAgICMgQ2hlY2sgaWYgbW9kZWwgb3IgZnVuY3Rpb246CiAgICBpZiBoYXNhdHRyKG1vZGVsX2NsYXNzLCAidHJhaW4iKToKICAgICAgICAjIFRPRE86IE5lZWQgdG8gY2FsbDogbW9kZWwoKSwgYWZ0ZXJ3YXJkcyB0byBzdGFydCB0aGUgdHJhaW4gZnVuY3Rpb24uCiAgICAgICAgIyBtb2RlbCA9IGNyZWF0ZV9mdW5jdGlvbihmInttb2RlbF9jbGFzc30udHJhaW4iKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgIGVsc2U6CiAgICAgICAgIyBDcmVhdGluZyBtb2RlbCBpbnN0YW5jZToKICAgICAgICBtb2RlbCA9IGNyZWF0ZV9jbGFzcyhtb2RlbF9jbGFzcykoKiptb2RlbF9jbGFzc19rd2FyZ3MpCgogICAgeCA9IGRhdGFzZXQuZHJvcChsYWJlbF9jb2x1bW5zLCBheGlzPTEpCiAgICB5ID0gZGF0YXNldFtsYWJlbF9jb2x1bW5zXQogICAgaWYgdHJhaW5fdGVzdF9zcGxpdF9zaXplOgogICAgICAgIHhfdHJhaW4sIHhfdGVzdCwgeV90cmFpbiwgeV90ZXN0ID0gdHJhaW5fdGVzdF9zcGxpdCgKICAgICAgICAgICAgeCwgeSwgdGVzdF9zaXplPXRyYWluX3Rlc3Rfc3BsaXRfc2l6ZSwgcmFuZG9tX3N0YXRlPXJhbmRvbV9zdGF0ZQogICAgICAgICkKICAgIGVsc2U6CiAgICAgICAgeF90cmFpbiwgeV90cmFpbiA9IHgsIHkKCiAgICAgICAgdGVzdF9zZXQgPSB0ZXN0X3NldC5hc19kZigpCiAgICAgICAgaWYgZHJvcF9jb2x1bW5zOgogICAgICAgICAgICB0ZXN0X3NldCA9IGRhdGFzZXQuZHJvcChkcm9wX2NvbHVtbnMsIGF4aXM9MSkKCiAgICAgICAgeF90ZXN0LCB5X3Rlc3QgPSB0ZXN0X3NldC5kcm9wKGxhYmVsX2NvbHVtbnMsIGF4aXM9MSksIHRlc3Rfc2V0W2xhYmVsX2NvbHVtbnNdCgogICAgQXV0b01MUnVuLmFwcGx5X21scnVuKAogICAgICAgIG1vZGVsPW1vZGVsLAogICAgICAgIG1vZGVsX25hbWU9bW9kZWxfbmFtZSwKICAgICAgICBjb250ZXh0PWNvbnRleHQsCiAgICAgICAgdGFnPXRhZywKICAgICAgICBzYW1wbGVfc2V0PXNhbXBsZV9zZXQsCiAgICAgICAgeV9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsCiAgICAgICAgdGVzdF9zZXQ9dGVzdF9zZXQsCiAgICAgICAgeF90ZXN0PXhfdGVzdCwKICAgICAgICB5X3Rlc3Q9eV90ZXN0LAogICAgICAgIGFydGlmYWN0cz1jb250ZXh0LmFydGlmYWN0cywKICAgICAgICBsYWJlbHM9bGFiZWxzLAogICAgKQogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInRyYWluaW5nICd7bW9kZWxfbmFtZX0nIikKICAgIG1vZGVsLmZpdCh4X3RyYWluLCB5X3RyYWluLCAqKmZpdF9rd2FyZ3MpCgoKZGVmIGV2YWx1YXRlKAogICAgY29udGV4dDogTUxDbGllbnRDdHgsCiAgICBtb2RlbDogc3RyLAogICAgZGF0YXNldDogbWxydW4uRGF0YUl0ZW0sCiAgICBkcm9wX2NvbHVtbnM6IExpc3Rbc3RyXSA9IE5vbmUsCiAgICBsYWJlbF9jb2x1bW5zOiBPcHRpb25hbFtVbmlvbltzdHIsIExpc3Rbc3RyXV1dID0gTm9uZSwKICAgICoqa3dhcmdzLAopOgogICAgIiIiCiAgICBFdmFsdWF0aW5nIGEgbW9kZWwuIEFydGlmYWN0cyBnZW5lcmF0ZWQgYnkgdGhlIE1MSGFuZGxlci4KCiAgICA6cGFyYW0gY29udGV4dDogICAgICAgICAgICAgICAgIE1MUnVuIGNvbnRleHQuCiAgICA6cGFyYW0gbW9kZWw6ICAgICAgICAgICAgICAgICAgIFRoZSBtb2RlbCBTdG9yZSBwYXRoLgogICAgOnBhcmFtIGRhdGFzZXQ6ICAgICAgICAgICAgICAgICBUaGUgZGF0YXNldCB0byBldmFsdWF0ZSB0aGUgbW9kZWwgb24uIENhbiBiZSBlaXRoZXIgYSBVUkkgb3IgYSBGZWF0dXJlVmVjdG9yLgogICAgOnBhcmFtIGRyb3BfY29sdW1uczogICAgICAgICAgICBzdHIgb3IgYSBsaXN0IG9mIHN0cmluZ3MgdGhhdCByZXByZXNlbnQgdGhlIGNvbHVtbnMgdG8gZHJvcC4KICAgIDpwYXJhbSBsYWJlbF9jb2x1bW5zOiAgICAgICAgICAgVGhlIHRhcmdldCBsYWJlbChzKSBvZiB0aGUgY29sdW1uKHMpIGluIHRoZSBkYXRhc2V0LiBmb3IgUmVncmVzc2lvbiBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiB0YXNrcy4gTWFuZGF0b3J5IHdoZW4gZGF0YXNldCBpcyBub3QgYSBGZWF0dXJlVmVjdG9yLgogICAgOnBhcmFtIGt3YXJnczogICAgICAgICAgICAgICAgICBIZXJlIHlvdSBjYW4gcGFzcyBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGUgcHJlZGljdCBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFJFRElDVF8gcHJlZml4IGlzIG5vdCByZXF1aXJlZCkuCiAgICAiIiIKICAgICMgR2V0IGRhdGFzZXQgYnkgVVJMIG9yIGJ5IEZlYXR1cmVWZWN0b3I6CiAgICBkYXRhc2V0LCBsYWJlbF9jb2x1bW5zID0gX2dldF9kYXRhZnJhbWUoCiAgICAgICAgY29udGV4dD1jb250ZXh0LAogICAgICAgIGRhdGFzZXQ9ZGF0YXNldCwKICAgICAgICBsYWJlbF9jb2x1bW5zPWxhYmVsX2NvbHVtbnMsCiAgICAgICAgZHJvcF9jb2x1bW5zPWRyb3BfY29sdW1ucywKICAgICkKCiAgICAjIFBhcnNpbmcgbGFiZWxfY29sdW1uczoKICAgIHBhcnNlZF9sYWJlbF9jb2x1bW5zID0gW10KICAgIGlmIGxhYmVsX2NvbHVtbnM6CiAgICAgICAgbGFiZWxfY29sdW1ucyA9ICgKICAgICAgICAgICAgbGFiZWxfY29sdW1ucyBpZiBpc2luc3RhbmNlKGxhYmVsX2NvbHVtbnMsIGxpc3QpIGVsc2UgW2xhYmVsX2NvbHVtbnNdCiAgICAgICAgKQogICAgICAgIGZvciBsYyBpbiBsYWJlbF9jb2x1bW5zOgogICAgICAgICAgICBpZiBmcy5jb21tb24uZmVhdHVyZV9zZXBhcmF0b3IgaW4gbGM6CiAgICAgICAgICAgICAgICBmZWF0dXJlX3NldF9uYW1lLCBsYWJlbF9uYW1lLCBhbGlhcyA9IGZzLmNvbW1vbi5wYXJzZV9mZWF0dXJlX3N0cmluZyhsYykKICAgICAgICAgICAgICAgIHBhcnNlZF9sYWJlbF9jb2x1bW5zLmFwcGVuZChhbGlhcyBvciBsYWJlbF9uYW1lKQogICAgICAgIGlmIHBhcnNlZF9sYWJlbF9jb2x1bW5zOgogICAgICAgICAgICBsYWJlbF9jb2x1bW5zID0gcGFyc2VkX2xhYmVsX2NvbHVtbnMKCiAgICB4ID0gZGF0YXNldC5kcm9wKGxhYmVsX2NvbHVtbnMsIGF4aXM9MSkKICAgIHkgPSBkYXRhc2V0W2xhYmVsX2NvbHVtbnNdCgogICAgIyBMb2FkaW5nIHRoZSBtb2RlbCBhbmQgcHJlZGljdGluZzoKICAgIG1vZGVsX2hhbmRsZXIgPSBBdXRvTUxSdW4ubG9hZF9tb2RlbCgKICAgICAgICBtb2RlbF9wYXRoPW1vZGVsLCBjb250ZXh0PWNvbnRleHQsIG1vZGVsX25hbWU9Im1vZGVsX0xpbmVhclJlZ3Jlc3Npb24iCiAgICApCiAgICBBdXRvTUxSdW4uYXBwbHlfbWxydW4obW9kZWxfaGFuZGxlci5tb2RlbCwgeV90ZXN0PXksIG1vZGVsX3BhdGg9bW9kZWwpCgogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmImV2YWx1YXRpbmcgJ3ttb2RlbF9oYW5kbGVyLm1vZGVsX25hbWV9JyIpCiAgICBtb2RlbF9oYW5kbGVyLm1vZGVsLnByZWRpY3QoeCwgKiprd2FyZ3MpCgoKZGVmIHByZWRpY3QoCiAgICBjb250ZXh0OiBNTENsaWVudEN0eCwKICAgIG1vZGVsOiBzdHIsCiAgICBkYXRhc2V0OiBtbHJ1bi5EYXRhSXRlbSwKICAgIGRyb3BfY29sdW1uczogVW5pb25bc3RyLCBMaXN0W3N0cl0sIGludCwgTGlzdFtpbnRdXSA9IE5vbmUsCiAgICBsYWJlbF9jb2x1bW5zOiBPcHRpb25hbFtVbmlvbltzdHIsIExpc3Rbc3RyXV1dID0gTm9uZSwKICAgIHJlc3VsdF9zZXQ6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgKiprd2FyZ3MsCik6CiAgICAiIiIKICAgIFByZWRpY3RpbmcgZGF0YXNldCBieSBhIG1vZGVsLgoKICAgIDpwYXJhbSBjb250ZXh0OiAgICAgICAgICAgICAgICAgTUxSdW4gY29udGV4dC4KICAgIDpwYXJhbSBtb2RlbDogICAgICAgICAgICAgICAgICAgVGhlIG1vZGVsIFN0b3JlIHBhdGguCiAgICA6cGFyYW0gZGF0YXNldDogICAgICAgICAgICAgICAgIFRoZSBkYXRhc2V0IHRvIHByZWRpY3QgdGhlIG1vZGVsIG9uLiBDYW4gYmUgZWl0aGVyIGEgVVJJLCBhIEZlYXR1cmVWZWN0b3Igb3IgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgaW4gYSBzaGFwZSBvZiBhIGxpc3QvZGljdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBwYXNzaW5nIGEgc2FtcGxlLCBwYXNzIHRoZSBkYXRhc2V0IGFzIGEgZmllbGQgaW4gYHBhcmFtc2AgaW5zdGVhZCBvZiBgaW5wdXRzYC4KICAgIDpwYXJhbSBkcm9wX2NvbHVtbnM6ICAgICAgICAgICAgc3RyL2ludCBvciBhIGxpc3Qgb2Ygc3RyaW5ncy9pbnRzIHRoYXQgcmVwcmVzZW50IHRoZSBjb2x1bW4gbmFtZXMvaW5kaWNlcyB0byBkcm9wLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHRoZSBkYXRhc2V0IGlzIGEgbGlzdC9kaWN0IHRoaXMgcGFyYW1ldGVyIHNob3VsZCBiZSByZXByZXNlbnRlZCBieSBpbnRlZ2Vycy4KICAgIDpwYXJhbSBsYWJlbF9jb2x1bW5zOiAgICAgICAgICAgVGhlIHRhcmdldCBsYWJlbChzKSBvZiB0aGUgY29sdW1uKHMpIGluIHRoZSBkYXRhc2V0LiBmb3IgUmVncmVzc2lvbiBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiB0YXNrcy4gTWFuZGF0b3J5IHdoZW4gZGF0YXNldCBpcyBub3QgYSBGZWF0dXJlVmVjdG9yLgogICAgOnBhcmFtIHJlc3VsdF9zZXQ6ICAgICAgICAgICAgICBUaGUgZGIga2V5IHRvIHNldCBuYW1lIG9mIHRoZSBwcmVkaWN0aW9uIHJlc3VsdCBhbmQgdGhlIGZpbGVuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRvICdwcmVkaWN0aW9uJy4KICAgIDpwYXJhbSBrd2FyZ3M6ICAgICAgICAgICAgICAgICAgSGVyZSB5b3UgY2FuIHBhc3Mga2V5d29yZCBhcmd1bWVudHMgdG8gdGhlIHByZWRpY3QgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBSRURJQ1RfIHByZWZpeCBpcyBub3QgcmVxdWlyZWQpLgogICAgIiIiCiAgICAjIEdldCBkYXRhc2V0IGJ5IFVSTCBvciBieSBGZWF0dXJlVmVjdG9yOgogICAgZGF0YXNldCwgbGFiZWxfY29sdW1ucyA9IF9nZXRfZGF0YWZyYW1lKAogICAgICAgIGNvbnRleHQ9Y29udGV4dCwKICAgICAgICBkYXRhc2V0PWRhdGFzZXQsCiAgICAgICAgbGFiZWxfY29sdW1ucz1sYWJlbF9jb2x1bW5zLAogICAgICAgIGRyb3BfY29sdW1ucz1kcm9wX2NvbHVtbnMsCiAgICApCgogICAgIyBsb2FkaW5nIHRoZSBtb2RlbCwgYW5kIGdldHRpbmcgdGhlIG1vZGVsIGhhbmRsZXI6CiAgICBtb2RlbF9oYW5kbGVyID0gQXV0b01MUnVuLmxvYWRfbW9kZWwobW9kZWxfcGF0aD1tb2RlbCwgY29udGV4dD1jb250ZXh0KQoKICAgICMgRHJvcHBpbmcgbGFiZWwgY29sdW1ucyBpZiBuZWNlc3Nhcnk6CiAgICBpZiBub3QgbGFiZWxfY29sdW1uczoKICAgICAgICBsYWJlbF9jb2x1bW5zID0gW10KICAgIGVsaWYgaXNpbnN0YW5jZShsYWJlbF9jb2x1bW5zLCBzdHIpOgogICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbbGFiZWxfY29sdW1uc10KCiAgICAjIFByZWRpY3Rpbmc6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYibWFraW5nIHByZWRpY3Rpb24gYnkgJ3ttb2RlbF9oYW5kbGVyLm1vZGVsX25hbWV9JyIpCiAgICB5X3ByZWQgPSBtb2RlbF9oYW5kbGVyLm1vZGVsLnByZWRpY3QoZGF0YXNldCwgKiprd2FyZ3MpCgogICAgIyBQcmVwYXJpbmcgYW5kIHZhbGlkYXRpbmcgbGFiZWwgY29sdW1ucyBmb3IgdGhlIGRhdGFmcmFtZSBvZiB0aGUgcHJlZGljdGlvbiByZXN1bHQ6CiAgICBudW1fcHJlZGljdGVkID0gMSBpZiBsZW4oeV9wcmVkLnNoYXBlKSA9PSAxIGVsc2UgeV9wcmVkLnNoYXBlWzFdCgogICAgaWYgbnVtX3ByZWRpY3RlZCA+IGxlbihsYWJlbF9jb2x1bW5zKToKICAgICAgICBpZiBudW1fcHJlZGljdGVkID09IDE6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMgPSBbInByZWRpY3RlZCBsYWJlbHMiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxhYmVsX2NvbHVtbnMuZXh0ZW5kKAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIGYicHJlZGljdGVkX2xhYmVsX3tpICsgMSArIGxlbihsYWJlbF9jb2x1bW5zKX0iCiAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtX3ByZWRpY3RlZCAtIGxlbihsYWJlbF9jb2x1bW5zKSkKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgKQogICAgZWxpZiBudW1fcHJlZGljdGVkIDwgbGVuKGxhYmVsX2NvbHVtbnMpOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKAogICAgICAgICAgICBmIm51bWJlciBvZiBwcmVkaWN0ZWQgbGFiZWxzOiB7bnVtX3ByZWRpY3RlZH0gaXMgc21hbGxlciB0aGFuIG51bWJlciBvZiBsYWJlbCBjb2x1bW5zOiB7bGVuKGxhYmVsX2NvbHVtbnMpfSIKICAgICAgICApCiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgoKICAgIGFydGlmYWN0X25hbWUgPSByZXN1bHRfc2V0IG9yICJwcmVkaWN0aW9uIgogICAgbGFiZWxzX2luc2lkZV9kZiA9IHNldChsYWJlbF9jb2x1bW5zKSAmIHNldChkYXRhc2V0LmNvbHVtbnMudG9saXN0KCkpCiAgICBpZiBsYWJlbHNfaW5zaWRlX2RmOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmVycm9yKAogICAgICAgICAgICBmIlRoZSBsYWJlbHM6IHtsYWJlbHNfaW5zaWRlX2RmfSBhcmUgYWxyZWFkeSBleGlzdGVkIGluIHRoZSBkYXRhZnJhbWUiCiAgICAgICAgKQogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgIHByZWRfZGYgPSBwZC5jb25jYXQoW2RhdGFzZXQsIHBkLkRhdGFGcmFtZSh5X3ByZWQsIGNvbHVtbnM9bGFiZWxfY29sdW1ucyldLCBheGlzPTEpCiAgICBjb250ZXh0LmxvZ19kYXRhc2V0KGFydGlmYWN0X25hbWUsIHByZWRfZGYsIGRiX2tleT1yZXN1bHRfc2V0KQo= + commands: [] + code_origin: '' + origin_filename: '' + requirements: [] + entry_points: + train: + name: train + doc: "Training a model with the given dataset.\n\nexample::\n\n import mlrun\n\ + \ project = mlrun.get_or_create_project(\"my-project\")\n project.set_function(\"\ + hub://auto_trainer\", \"train\")\n trainer_run = project.run(\n \ + \ name=\"train\",\n handler=\"train\",\n inputs={\"dataset\"\ + : \"./path/to/dataset.csv\"},\n params={\n \"model_class\"\ + : \"sklearn.linear_model.LogisticRegression\",\n \"label_columns\"\ + : \"label\",\n \"drop_columns\": \"id\",\n \"model_name\"\ + : \"my-model\",\n \"tag\": \"v1.0.0\",\n \"sample_set\"\ + : \"./path/to/sample_set.csv\",\n \"test_set\": \"./path/to/test_set.csv\"\ + ,\n \"CLASS_solver\": \"liblinear\",\n },\n )" + parameters: + - name: context + type: MLClientCtx + doc: MLRun context + - name: dataset + type: DataItem + doc: The dataset to train the model on. Can be either a URI or a FeatureVector + - name: model_class + type: str + doc: The class of the model, e.g. `sklearn.linear_model.LogisticRegression` + - name: label_columns + type: Optional[Union[str, List[str]]] + doc: The target label(s) of the column(s) in the dataset. for Regression or + Classification tasks. Mandatory when dataset is not a FeatureVector. + default: null + - name: drop_columns + type: List[str] + doc: str or a list of strings that represent the columns to drop + default: null + - name: model_name + type: str + doc: The model's name to use for storing the model artifact, default to 'model' + default: model + - name: tag + type: str + doc: The model's tag to log with + default: '' + - name: sample_set + type: DataItem + doc: A sample set of inputs for the model for logging its stats along the + model in favour of model monitoring. Can be either a URI or a FeatureVector + default: null + - name: test_set + type: DataItem + doc: The test set to train the model with. + default: null + - name: train_test_split_size + type: float + doc: if test_set was provided then this argument is ignored. Should be between + 0.0 and 1.0 and represent the proportion of the dataset to include in the + test split. The size of the Training set is set to the complement of this + value. Default = 0.2 + default: null + - name: random_state + type: int + doc: 'Relevant only when using train_test_split_size. A random state seed + to shuffle the data. For more information, see: https://scikit-learn.org/stable/glossary.html#term-random_state + Notice that here we only pass integer values.' + default: null + - name: labels + type: dict + doc: Labels to log with the model + default: null + outputs: [] + lineno: 117 + has_varargs: false + has_kwargs: true + evaluate: + name: evaluate + doc: Evaluating a model. Artifacts generated by the MLHandler. + parameters: + - name: context + type: MLClientCtx + doc: MLRun context. + - name: model + type: str + doc: The model Store path. + - name: dataset + type: DataItem + doc: The dataset to evaluate the model on. Can be either a URI or a FeatureVector. + - name: drop_columns + type: List[str] + doc: str or a list of strings that represent the columns to drop. + default: null + - name: label_columns + type: Optional[Union[str, List[str]]] + doc: The target label(s) of the column(s) in the dataset. for Regression or + Classification tasks. Mandatory when dataset is not a FeatureVector. + default: null + outputs: [] + lineno: 269 + has_varargs: false + has_kwargs: true + predict: + name: predict + doc: Predicting dataset by a model. + parameters: + - name: context + type: MLClientCtx + doc: MLRun context. + - name: model + type: str + doc: The model Store path. + - name: dataset + type: DataItem + doc: The dataset to predict the model on. Can be either a URI, a FeatureVector + or a sample in a shape of a list/dict. When passing a sample, pass the dataset + as a field in `params` instead of `inputs`. + - name: drop_columns + type: Union[str, List[str], int, List[int]] + doc: str/int or a list of strings/ints that represent the column names/indices + to drop. When the dataset is a list/dict this parameter should be represented + by integers. + default: null + - name: label_columns + type: Optional[Union[str, List[str]]] + doc: The target label(s) of the column(s) in the dataset. for Regression or + Classification tasks. Mandatory when dataset is not a FeatureVector. + default: null + - name: result_set + type: Optional[str] + doc: The db key to set name of the prediction result and the filename. Default + to 'prediction'. + default: null + outputs: [] + lineno: 323 + has_varargs: false + has_kwargs: true + description: Automatic train, evaluate and predict functions for the ML frameworks + - Scikit-Learn, XGBoost and LightGBM. + default_handler: train + disable_auto_mount: false + clone_target_dir: '' + env: [] + priority_class_name: '' + preemption_mode: prevent + affinity: null + tolerations: null + security_context: {} +verbose: false \ No newline at end of file diff --git a/tests/mockServer/mock.js b/tests/mockServer/mock.js index f6c4a59a0..524553cf7 100644 --- a/tests/mockServer/mock.js +++ b/tests/mockServer/mock.js @@ -27,7 +27,6 @@ import { cloneDeep, remove } from 'lodash' import frontendSpec from './data/frontendSpec.json' import projects from './data/projects.json' import projectsSummary from './data/summary.json' -import hubItemInference from './data/hubItemInference.json' import artifacts from './data/artifacts.json' import featureSets from './data/featureSets.json' import features from './data/features.json' @@ -352,7 +351,10 @@ function getProjectsSummaries(req, res) { } function getFunctionItem(req, res) { - res.send(hubItemInference) + const funcName = req.params.uid === 'batch_inference_v2' ? 'batch-inference-v2' : req.params.uid + const hubItem = itemsCatalog.catalog.find(item => item.metadata.name === funcName) + + res.send(hubItem) } function getFunctionObject (req, res){ @@ -1164,13 +1166,13 @@ function putTags(req, res){ const projectName = req.params.project const artifactForUpdate = artifacts.artifacts - .find(artifact => (((artifact.metadata?.project === req.params.project) - || artifact.project === req.params.project) - && artifact.kind === req.body.identifiers[0].kind - && ((artifact.metadata?.tree === req.body.identifiers[0].uid) - || artifact.tree === req.body.identifiers[0].uid) - && ((artifact.spec?.db_key === req.body.identifiers[0].key) - || artifact.db_key === req.body.identifiers[0].key))) + .filter(artifact => ((artifact.metadata?.project === req.params.project || artifact.project === req.params.project) + && (artifact.kind === req.body.identifiers[0].kind) + && (artifact.metadata?.uid === req.body.identifiers[0].uid || artifact.metadata?.tree === req.body.identifiers[0].uid || artifact.tree === req.body.identifiers[0].uid) + && (artifact.spec?.db_key === req.body.identifiers[0].key || artifact.db_key === req.body.identifiers[0].key) + ) + ) + if (artifactForUpdate) { if (artifactForUpdate.metadata?.tag || artifactForUpdate.metadata?.tag === ''){ artifactForUpdate.metadata.tag = req.params.tag @@ -1179,7 +1181,7 @@ function putTags(req, res){ artifactForUpdate.tag = req.params.tag } } - + res.send({ name: tagName, project: projectName @@ -1269,9 +1271,8 @@ function postArtifact(req, res) { function deleteArtifact(req, res){ const collectedArtifacts = artifacts.artifacts .filter (artifact => (artifact.metadata?.project === req.params.project || artifact.project === req.params.project) - && (artifact.metadata?.tree === req.params.uid || artifact.tree === req.params.uid) - && (artifact.metadata?.key === req.query.key || artifact.key === req.query.key)) - + && (artifact.metadata?.tree === req.query.tree || artifact.tree === req.query.tree) + && (artifact.metadata?.key === req.params.uid || artifact.key === req.params.uid)) if (collectedArtifacts?.length > 0){ collectedArtifacts.forEach(collectedArtifact => remove(artifacts.artifacts, collectedArtifact)) } @@ -1595,7 +1596,7 @@ app.get(`${mlrunAPIIngress}/projects/:project/pipelines/:pipelineID`, getPipelin app.get(`${mlrunAPIIngress}/projects/:project/artifact-tags`, getProjectsArtifactTags) app.get(`${mlrunAPIIngressV2}/projects/:project/artifacts`, getArtifacts) app.post(`${mlrunAPIIngressV2}/projects/:project/artifacts`, postArtifact) -app.delete(`${mlrunAPIIngress}/projects/:project/artifacts/:uid`, deleteArtifact) +app.delete(`${mlrunAPIIngressV2}/projects/:project/artifacts/:uid`, deleteArtifact) app.put(`${mlrunAPIIngress}/projects/:project/tags/:tag`, putTags) app.delete(`${mlrunAPIIngress}/projects/:project/tags/:tag`, deleteTags)