- {
({
page: MODELS_PAGE,
diff --git a/src/components/Project/ProjectMonitor.js b/src/components/Project/ProjectMonitor.js
index 6d611cf29..73f847709 100644
--- a/src/components/Project/ProjectMonitor.js
+++ b/src/components/Project/ProjectMonitor.js
@@ -107,10 +107,10 @@ const ProjectMonitor = ({
const openRegisterModelModal = useCallback(() => {
openPopUp(RegisterModelModal, {
- projectName: params.projectName,
+ params: params,
refresh: () => navigate(registerArtifactLink(MODEL_TYPE))
})
- }, [params.projectName, navigate, registerArtifactLink])
+ }, [params, navigate, registerArtifactLink])
const { createNewOptions } = useMemo(() => {
const createNewOptions = generateCreateNewOptions(
diff --git a/src/components/ProjectSettings/projectSettings.util.js b/src/components/ProjectSettings/projectSettings.util.js
index 0794b701b..de4e9ec9c 100644
--- a/src/components/ProjectSettings/projectSettings.util.js
+++ b/src/components/ProjectSettings/projectSettings.util.js
@@ -17,7 +17,7 @@ illegal under applicable law, and the grant of the foregoing license
under the Apache 2.0 license is conditioned upon your compliance with
such restriction.
*/
-import React, { createRef } from 'react'
+import React from 'react'
import { forEach, groupBy } from 'lodash'
import { membersActions } from '../../elements/MembersPopUp/membersReducer'
@@ -75,8 +75,7 @@ const addMember = (members, name, id, type, initialRole, role) => {
initialRole,
role,
icon: type === USER_ROLE ? : ,
- modification: '',
- actionElement: createRef()
+ modification: ''
})
}
diff --git a/src/components/ProjectsJobsMonitoring/JobsMonitoring/JobsMonitoringFilters.js b/src/components/ProjectsJobsMonitoring/JobsMonitoring/JobsMonitoringFilters.js
index 96e581371..d61dcd4ef 100644
--- a/src/components/ProjectsJobsMonitoring/JobsMonitoring/JobsMonitoringFilters.js
+++ b/src/components/ProjectsJobsMonitoring/JobsMonitoring/JobsMonitoringFilters.js
@@ -23,7 +23,12 @@ import { useForm } from 'react-final-form'
import { FormInput, FormOnChange, FormSelect } from 'igz-controls/components'
import StatusFilter from '../../../common/StatusFilter/StatusFilter'
-import { LABELS_FILTER, PROJECT_FILTER, STATUS_FILTER_NAME } from '../../../constants'
+import {
+ JOBS_MONITORING_JOBS_TAB,
+ LABELS_FILTER,
+ PROJECT_FILTER,
+ STATUS_FILTER_NAME
+} from '../../../constants'
import { generateTypeFilter, jobsStatuses } from '../../FilterMenu/filterMenu.settings'
const JobsMonitoringFilters = () => {
@@ -46,10 +51,19 @@ const JobsMonitoringFilters = () => {
-
+
-
+
handleInputChange(value, LABELS_FILTER)}
name={LABELS_FILTER}
diff --git a/src/components/ProjectsJobsMonitoring/JobsMonitoring/jobsMonitoring.util.js b/src/components/ProjectsJobsMonitoring/JobsMonitoring/jobsMonitoring.util.js
deleted file mode 100644
index b45e7203c..000000000
--- a/src/components/ProjectsJobsMonitoring/JobsMonitoring/jobsMonitoring.util.js
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
-Copyright 2019 Iguazio Systems Ltd.
-
-Licensed under the Apache License, Version 2.0 (the "License") with
-an addition restriction as set forth herein. 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.
-
-In addition, you may not use the software for any purposes that are
-illegal under applicable law, and the grant of the foregoing license
-under the Apache 2.0 license is conditioned upon your compliance with
-such restriction.
-*/
-import { getJobIdentifier } from '../../../utils/getUniqueIdentifier'
-import { validateArguments } from '../../../utils/validateArguments'
-import { generateLinkToDetailsPanel } from '../../../utils/link-helper.util'
-import { ERROR_STATE, JOB_KIND_WORKFLOW, JOBS_PAGE, MONITOR_JOBS_TAB } from '../../../constants'
-import measureTime from '../../../utils/measureTime'
-import { formatDatetime } from '../../../utils'
-
-export const createJobsMonitoringContent = (jobs, jobName, isStagingMode) => {
- return jobs.map(job => {
- const identifierUnique = getJobIdentifier(job, true)
- const type = job.labels?.find(label => label.includes('kind:'))?.replace('kind: ', '') ?? ''
- const getLink = tab => {
- if (jobName) {
- return validateArguments(job.uid, tab, job.name)
- ? generateLinkToDetailsPanel(
- job.project,
- JOBS_PAGE,
- MONITOR_JOBS_TAB,
- job.uid,
- null,
- tab,
- null,
- null,
- job.name
- )
- : ''
- } else {
- return `/projects/${job.project}/${JOBS_PAGE.toLowerCase()}/${MONITOR_JOBS_TAB}/${job.name}`
- }
- }
-
- return {
- data: {
- ...job,
- ui: {
- ...job.ui,
- identifier: getJobIdentifier(job),
- identifierUnique: identifierUnique
- }
- },
- content: [
- {
- headerId: jobName ? 'uid' : 'name',
- headerLabel: jobName ? 'UID' : 'Name',
- id: `name.${identifierUnique}`,
- value: jobName ? job.uid : job.name,
- className: 'table-cell-name',
- type: type === JOB_KIND_WORKFLOW && !isStagingMode ? 'hidden' : 'link',
- getLink,
- showStatus: true
- },
- {
- headerId: 'projectName',
- headerLabel: 'Project name',
- id: `projectName.${identifierUnique}`,
- value: job.project,
- className: 'table-cell-1'
- },
- {
- headerId: 'type',
- headerLabel: 'Type',
- id: `type.${identifierUnique}`,
- value: type,
- className: 'table-cell-1',
- type: 'type'
- },
- {
- headerId: 'job.uid',
- id: `uid.${identifierUnique}`,
- value: job.uid,
- className: 'table-cell-1',
- type: 'hidden'
- },
- {
- headerId: 'startTime',
- headerLabel: 'Start time',
- id: `startTime.${identifierUnique}`,
- value: formatDatetime(job.startTime),
- className: 'table-cell-1'
- },
- {
- headerId: 'duration',
- headerLabel: 'Duration',
- id: `duration.${identifierUnique}`,
- value: measureTime(
- job.startTime || new Date(job.created_at),
- (job.state?.value !== 'running' && job.updated) ||
- (job.state?.value !== ERROR_STATE && new Date(job.finished_at))
- ),
- className: 'table-cell-1',
- type: 'duration'
- },
- {
- headerId: 'owner',
- headerLabel: 'Owner',
- id: `owner.${identifierUnique}`,
- value: job.owner,
- className: 'table-cell-1'
- },
- {
- headerId: 'parameters',
- headerLabel: 'Parameters',
- id: `parameters.${identifierUnique}`,
- value: job.parametersChips,
- className: 'table-cell-1',
- type: 'parameters'
- },
- {
- headerId: 'labels',
- headerLabel: 'Labels',
- id: `labels.${identifierUnique}`,
- value: job.labels,
- className: 'table-cell-1',
- type: 'labels'
- },
-
- {
- headerId: 'updated',
- id: `updated.${identifierUnique}`,
- value: job.updated || new Date(job.finished_at),
- className: 'table-cell-1',
- type: 'hidden'
- }
- ]
- }
- })
-}
diff --git a/src/components/ProjectsJobsMonitoring/ProjectsJobsMonitoring.js b/src/components/ProjectsJobsMonitoring/ProjectsJobsMonitoring.js
index bafe5c298..40c998fb7 100644
--- a/src/components/ProjectsJobsMonitoring/ProjectsJobsMonitoring.js
+++ b/src/components/ProjectsJobsMonitoring/ProjectsJobsMonitoring.js
@@ -17,8 +17,8 @@ illegal under applicable law, and the grant of the foregoing license
under the Apache 2.0 license is conditioned upon your compliance with
such restriction.
*/
-import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react'
-import { useDispatch, useSelector } from 'react-redux'
+import React, { useLayoutEffect, useMemo, useState } from 'react'
+import { useSelector } from 'react-redux'
import { Outlet, useLocation, useNavigate, useParams } from 'react-router-dom'
import ContentMenu from '../../elements/ContentMenu/ContentMenu'
@@ -32,87 +32,61 @@ import WorkflowsMonitoringFilters from './WorkflowsMonitoring/WorkflowsMonitorin
import { STATS_TOTAL_CARD, tabs } from './projectsJobsMotinoring.util'
import {
- DATES_FILTER,
- FILTER_ALL_ITEMS,
- GROUP_BY_WORKFLOW,
- JOB_KIND_LOCAL,
JOBS_MONITORING_JOBS_TAB,
JOBS_MONITORING_PAGE,
JOBS_MONITORING_SCHEDULED_TAB,
- JOBS_MONITORING_WORKFLOWS_TAB,
- LABELS_FILTER,
- NAME_FILTER,
- PROJECT_FILTER,
- SCHEDULE_TAB,
- STATUS_FILTER,
- TYPE_FILTER
+ JOBS_MONITORING_WORKFLOWS_TAB
} from '../../constants'
-import { monitorJob, pollAbortingJobs, rerunJob } from '../Jobs/jobs.util'
import { TERTIARY_BUTTON } from 'igz-controls/constants'
-import { parseJob } from '../../utils/parseJob'
-import { fetchWorkflows } from '../../reducers/workflowReducer'
-import { fetchAllJobRuns, fetchJobs, fetchScheduledJobs } from '../../reducers/jobReducer'
import './projectsJobsMonitoring.scss'
+import {
+ getJobsFiltersConfig,
+ getScheduledFiltersConfig,
+ getWorkflowsFiltersConfig
+} from '../../utils/jobs.util'
+import { useJobsPageData } from '../../hooks/useJobsPageData'
export const ProjectJobsMonitoringContext = React.createContext({})
const ProjectsJobsMonitoring = () => {
- const [abortingJobs, setAbortingJobs] = useState({})
- const [editableItem, setEditableItem] = useState(null)
- const [jobWizardMode, setJobWizardMode] = useState(null)
- const [jobWizardIsOpened, setJobWizardIsOpened] = useState(false)
const [confirmData, setConfirmData] = useState(null)
const [selectedTab, setSelectedTab] = useState(null)
- const [scheduledJobs, setScheduledJobs] = useState([])
- const [jobRuns, setJobRuns] = useState([])
- const [jobs, setJobs] = useState([])
- const [selectedRunProject, setSelectedRunProject] = useState('')
- const [requestErrorMessage, setRequestErrorMessage] = useState('')
const { jobsMonitoringData } = useSelector(store => store.projectStore)
const [selectedCard, setSelectedCard] = useState(
jobsMonitoringData.filters?.status || STATS_TOTAL_CARD
)
- const abortJobRef = useRef(null)
- const abortControllerRef = useRef(new AbortController())
- const dispatch = useDispatch()
const location = useLocation()
const params = useParams()
const navigate = useNavigate()
- const appStore = useSelector(store => store.appStore)
const artifactsStore = useSelector(store => store.artifactsStore)
const jobsStore = useSelector(store => store.jobsStore)
-
- const jobsFiltersConfig = useMemo(() => {
- return {
- [NAME_FILTER]: { label: 'Name:', hidden: Boolean(params.jobName) },
- [DATES_FILTER]: { label: 'Start time:' },
- [PROJECT_FILTER]: { label: 'Project:' },
- [STATUS_FILTER]: { label: 'Status:' },
- [TYPE_FILTER]: { label: 'Type:' },
- [LABELS_FILTER]: { label: 'Labels:' }
- }
- }, [params.jobName])
-
- const workflowsFiltersConfig = useMemo(() => {
- return {
- [NAME_FILTER]: { label: 'Name:' },
- [DATES_FILTER]: { label: 'Created at:' },
- [PROJECT_FILTER]: { label: 'Project:' },
- [STATUS_FILTER]: { label: 'Status:' },
- [LABELS_FILTER]: { label: 'Labels:' }
- }
- }, [])
-
- const scheduledFiltersConfig = useMemo(() => {
- return {
- [NAME_FILTER]: { label: 'Name:' },
- [DATES_FILTER]: { label: 'Scheduled at:', isFuture: true },
- [PROJECT_FILTER]: { label: 'Project:' },
- [TYPE_FILTER]: { label: 'Type:' },
- [LABELS_FILTER]: { label: 'Labels:' }
- }
- }, [])
+ const {
+ abortControllerRef,
+ abortJobRef,
+ abortingJobs,
+ editableItem,
+ getWorkflows,
+ jobRuns,
+ jobs,
+ jobWizardIsOpened,
+ jobWizardMode,
+ handleMonitoring,
+ handleRerunJob,
+ refreshJobs,
+ refreshScheduled,
+ requestErrorMessage,
+ scheduledJobs,
+ setAbortingJobs,
+ setEditableItem,
+ setJobRuns,
+ setJobWizardIsOpened,
+ setJobWizardMode,
+ setJobs,
+ setScheduledJobs,
+ setSelectedRunProject,
+ terminateAbortTasksPolling
+ } = useJobsPageData()
const handleTabChange = tabName => {
setSelectedCard(STATS_TOTAL_CARD)
@@ -120,164 +94,6 @@ const ProjectsJobsMonitoring = () => {
navigate(`/projects/*/${JOBS_MONITORING_PAGE}/${tabName}`)
}
- const handleRerunJob = useCallback(
- async job => await rerunJob(job, setEditableItem, setJobWizardMode, dispatch),
- [dispatch]
- )
-
- const handleMonitoring = useCallback(
- item => {
- monitorJob(appStore.frontendSpec.jobs_dashboard_url, item, params.projectName)
- },
- [appStore.frontendSpec.jobs_dashboard_url, params.projectName]
- )
-
- const terminateAbortTasksPolling = useCallback(() => {
- abortJobRef?.current?.()
- setAbortingJobs({})
- }, [])
-
- const refreshJobs = useCallback(
- filters => {
- if (params.jobName) {
- setJobRuns([])
- } else {
- setJobs([])
- }
-
- abortControllerRef.current = new AbortController()
-
- terminateAbortTasksPolling()
-
- const fetchData = params.jobName ? fetchAllJobRuns : fetchJobs
- const newParams = !params.jobName && {
- 'partition-by': 'project_and_name',
- 'partition-sort-by': 'updated'
- }
-
- dispatch(
- fetchData({
- project: params.jobName
- ? selectedRunProject || '*'
- : filters.project
- ? filters.project.toLowerCase()
- : '*',
- filters,
- config: {
- ui: {
- controller: abortControllerRef.current,
- setRequestErrorMessage
- },
- params: { ...newParams }
- },
- jobName: params.jobName ?? false
- })
- )
- .unwrap()
- .then(jobs => {
- if (jobs) {
- const parsedJobs = jobs
- .map(job => parseJob(job))
- .filter(job => {
- const type =
- job.labels?.find(label => label.includes('kind:'))?.replace('kind: ', '') ??
- JOB_KIND_LOCAL
-
- return (
- !filters.type ||
- filters.type === FILTER_ALL_ITEMS ||
- filters.type.split(',').includes(type)
- )
- })
- const responseAbortingJobs = parsedJobs.reduce((acc, job) => {
- if (job.state.value === 'aborting' && job.abortTaskId) {
- acc[job.abortTaskId] = {
- uid: job.uid,
- name: job.name
- }
- }
-
- return acc
- }, {})
-
- if (Object.keys(responseAbortingJobs).length > 0) {
- setAbortingJobs(responseAbortingJobs)
- pollAbortingJobs(
- params.jobName
- ? selectedRunProject || '*'
- : filters.project
- ? filters.project.toLowerCase()
- : '*',
- abortJobRef,
- responseAbortingJobs,
- () => refreshJobs(filters),
- dispatch
- )
- }
-
- if (params.jobName) {
- setJobRuns(parsedJobs)
- } else {
- setJobs(parsedJobs)
- }
- }
- })
- },
- [dispatch, params.jobName, selectedRunProject, terminateAbortTasksPolling]
- )
-
- const refreshScheduled = useCallback(
- filters => {
- setScheduledJobs([])
- abortControllerRef.current = new AbortController()
-
- dispatch(
- fetchScheduledJobs({
- project: filters.project ? filters.project.toLowerCase() : '*',
- filters,
- config: {
- ui: {
- controller: abortControllerRef.current,
- setRequestErrorMessage
- }
- }
- })
- )
- .unwrap()
- .then(jobs => {
- if (jobs) {
- const parsedJobs = jobs
- .map(job => parseJob(job, SCHEDULE_TAB))
- .filter(job => {
- let inDateRange = true
-
- if (filters.dates) {
- const timeTo = filters.dates.value[1]?.getTime?.() || ''
- const timeFrom = filters.dates.value[0]?.getTime?.() || ''
- const nextRun = job.nextRun.getTime()
-
- if (timeFrom) {
- inDateRange = nextRun >= timeFrom
- }
-
- if (timeTo && inDateRange) {
- inDateRange = nextRun <= timeTo
- }
- }
-
- return (
- inDateRange &&
- (!filters.type || filters.type === FILTER_ALL_ITEMS || job.type === filters.type)
- )
- })
-
- setScheduledJobs(parsedJobs)
- }
- })
- },
- [dispatch]
- )
-
useLayoutEffect(() => {
setSelectedTab(
location.pathname.includes(JOBS_MONITORING_WORKFLOWS_TAB)
@@ -288,26 +104,9 @@ const ProjectsJobsMonitoring = () => {
)
}, [location.pathname])
- const getWorkflows = useCallback(
- filter => {
- abortControllerRef.current = new AbortController()
-
- dispatch(
- fetchWorkflows({
- project: filter.project ? filter.project.toLowerCase() : '*',
- filter: { ...filter, groupBy: GROUP_BY_WORKFLOW },
- config: {
- ui: {
- controller: abortControllerRef.current,
- setRequestErrorMessage
- }
- },
- withPagination: true
- })
- )
- },
- [dispatch]
- )
+ const jobsFiltersConfig = useMemo(() => getJobsFiltersConfig(params.jobName), [params.jobName])
+ const scheduledFiltersConfig = useMemo(() => getScheduledFiltersConfig(), [])
+ const workflowsFiltersConfig = useMemo(() => getWorkflowsFiltersConfig(), [])
const tabData = useMemo(() => {
return {
diff --git a/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoring.js b/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoring.js
index 573f3729d..69437d147 100644
--- a/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoring.js
+++ b/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoring.js
@@ -73,7 +73,7 @@ const ScheduledMonitoring = () => {
diff --git a/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoringFilters.js b/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoringFilters.js
index c0d667004..87cced60a 100644
--- a/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoringFilters.js
+++ b/src/components/ProjectsJobsMonitoring/ScheduledMonitoring/ScheduledMonitoringFilters.js
@@ -22,8 +22,8 @@ import { useForm } from 'react-final-form'
import { FormInput, FormOnChange, FormSelect } from 'igz-controls/components'
-import { LABELS_FILTER, PROJECT_FILTER } from '../../../constants'
-import { filterScheduledTypeOptions } from '../../FilterMenu/filterMenu.settings'
+import { JOBS_MONITORING_SCHEDULED_TAB, LABELS_FILTER, PROJECT_FILTER } from '../../../constants'
+import { generateTypeFilter } from '../../FilterMenu/filterMenu.settings'
const ScheduledMonitoringFilters = () => {
const form = useForm()
@@ -42,10 +42,19 @@ const ScheduledMonitoringFilters = () => {
/>
-
+
-
+
handleInputChange(value, LABELS_FILTER)}
name={LABELS_FILTER}
diff --git a/src/components/ProjectsJobsMonitoring/WorkflowsMonitoring/WorkflowsMonitoringFilters.js b/src/components/ProjectsJobsMonitoring/WorkflowsMonitoring/WorkflowsMonitoringFilters.js
index 6bc0b4af9..04c3edd2c 100644
--- a/src/components/ProjectsJobsMonitoring/WorkflowsMonitoring/WorkflowsMonitoringFilters.js
+++ b/src/components/ProjectsJobsMonitoring/WorkflowsMonitoring/WorkflowsMonitoringFilters.js
@@ -49,7 +49,12 @@ const WorkflowsMonitoringFilters = () => {
{isDemoMode && (
-
+
handleInputChange(value, LABELS_FILTER)}
name={LABELS_FILTER}
diff --git a/src/components/ProjectsPage/ProjectsView.js b/src/components/ProjectsPage/ProjectsView.js
index c8246eb5b..57bfad3ad 100644
--- a/src/components/ProjectsPage/ProjectsView.js
+++ b/src/components/ProjectsPage/ProjectsView.js
@@ -107,7 +107,7 @@ const ProjectsView = ({
/>
)}
- {projectStore.projects.length > 0 &&
}
+
diff --git a/src/components/ProjectsPage/projects.util.js b/src/components/ProjectsPage/projects.util.js
index 70781036a..01bc246a1 100644
--- a/src/components/ProjectsPage/projects.util.js
+++ b/src/components/ProjectsPage/projects.util.js
@@ -176,7 +176,7 @@ export const pollDeletingProjects = (terminatePollRef, deletingProjects, refresh
)
if (finishedTasks.length > 0) {
- const tasksToExclude = []
+ const tasksToExclude = []
finishedTasks.forEach(task => {
tasksToExclude.push(task.metadata.name)
@@ -241,25 +241,23 @@ export const generateMonitoringCounters = (data, dispatch) => {
}
data.forEach(project => {
- monitoringCounters.jobs.all +=
- project.runs_completed_recent_count || 0 +
- project.runs_failed_recent_count || 0 +
- project.runs_running_count || 0
+ monitoringCounters.jobs.all += project.runs_completed_recent_count || 0
+ monitoringCounters.jobs.all += project.runs_failed_recent_count || 0
+ monitoringCounters.jobs.all += project.runs_running_count || 0
monitoringCounters.jobs.completed += project.runs_completed_recent_count || 0
monitoringCounters.jobs.failed += project.runs_failed_recent_count || 0
monitoringCounters.jobs.running += project.runs_running_count || 0
- monitoringCounters.workflows.all +=
- project.pipelines_completed_recent_count || 0 +
- project.pipelines_failed_recent_count || 0 +
- project.pipelines_running_count || 0
+ monitoringCounters.workflows.all += project.pipelines_completed_recent_count || 0
+ monitoringCounters.workflows.all += project.pipelines_failed_recent_count || 0
+ monitoringCounters.workflows.all += project.pipelines_running_count || 0
monitoringCounters.workflows.completed += project.pipelines_completed_recent_count || 0
monitoringCounters.workflows.failed += project.pipelines_failed_recent_count || 0
monitoringCounters.workflows.running += project.pipelines_running_count || 0
- monitoringCounters.scheduled.all +=
- project.distinct_scheduled_jobs_pending_count || 0 +
- project.distinct_scheduled_pipelines_pending_count || 0
+ monitoringCounters.scheduled.all += project.distinct_scheduled_jobs_pending_count || 0
+ monitoringCounters.scheduled.all += project.distinct_scheduled_pipelines_pending_count || 0
monitoringCounters.scheduled.jobs += project.distinct_scheduled_jobs_pending_count || 0
- monitoringCounters.scheduled.workflows += project.distinct_scheduled_pipelines_pending_count || 0
+ monitoringCounters.scheduled.workflows +=
+ project.distinct_scheduled_pipelines_pending_count || 0
})
dispatch(projectsAction.setJobsMonitoringData(monitoringCounters))
diff --git a/src/constants.js b/src/constants.js
index d0e01fe18..de9f30648 100644
--- a/src/constants.js
+++ b/src/constants.js
@@ -88,6 +88,7 @@ export const REAL_TIME_PIPELINES_TAB = 'real-time-pipelines'
export const PIPELINE_SUB_PAGE = 'pipeline'
export const FEATURE_STORE_PAGE = 'FEATURE-STORE'
+export const FEATURE_STORE_PAGE_PATH = 'feature-store'
export const FEATURES_TAB = 'features'
export const FEATURE_SETS_TAB = 'feature-sets'
export const FEATURE_VECTORS_TAB = 'feature-vectors'
@@ -248,7 +249,9 @@ export const SET_NEW_FUNCTION_TRACK_MODELS = 'SET_NEW_FUNCTION_TRACK_MODELS'
export const SET_NEW_FUNCTION_VOLUMES = 'SET_NEW_FUNCTION_VOLUMES'
export const SET_NEW_FUNCTION_VOLUME_MOUNTS = 'SET_NEW_FUNCTION_VOLUME_MOUNTS'
export const FUNCTION_CREATING_STATE = 'creating'
+export const FUNCTION_FAILED_STATE = 'failed'
export const FUNCTION_FAILED_TO_DELETE_STATE = 'failedToDelete'
+export const FUNCTION_ERROR_STATE = 'error'
export const FUNCTION_INITIALIZED_STATE = 'initialized'
export const FUNCTION_READY_STATE = 'ready'
export const FUNCTION_PENDINDG_STATE = 'pending'
@@ -276,11 +279,14 @@ export const FETCH_ENTITIES_BEGIN = 'FETCH_ENTITIES_BEGIN'
export const FETCH_ENTITIES_FAILURE = 'FETCH_ENTITIES_FAILURE'
export const FETCH_ENTITIES_SUCCESS = 'FETCH_ENTITIES_SUCCESS'
export const FETCH_ENTITY_SUCCESS = 'FETCH_ENTITY_SUCCESS'
+export const FETCH_EXPANDED_FEATURE_SET_SUCCESS = 'FETCH_EXPANDED_FEATURE_SET_SUCCESS'
export const FETCH_FEATURES_BEGIN = 'FETCH_FEATURES_BEGIN'
export const FETCH_FEATURES_FAILURE = 'FETCH_FEATURES_FAILURE'
export const FETCH_FEATURES_SUCCESS = 'FETCH_FEATURES_SUCCESS'
export const FETCH_FEATURE_SETS_BEGIN = 'FETCH_FEATURE_SETS_BEGIN'
export const FETCH_FEATURE_SETS_FAILURE = 'FETCH_FEATURE_SETS_FAILURE'
+export const FETCH_FEATURE_SET_BEGIN = 'FETCH_FEATURE_SET_BEGIN'
+export const FETCH_FEATURE_SET_FAILURE = 'FETCH_FEATURE_SET_FAILURE'
export const FETCH_FEATURE_SET_SUCCESS = 'FETCH_FEATURE_SET_SUCCESS'
export const FETCH_FEATURE_SETS_SUCCESS = 'FETCH_FEATURE_SETS_SUCCESS'
export const FETCH_FEATURE_SUCCESS = 'FETCH_FEATURE_SUCCESS'
@@ -578,3 +584,6 @@ export const CHART_TYPE_BAR = 'bar'
export const ARTIFACT_MAX_CHUNK_SIZE = 1048576 // 1MB
export const ARTIFACT_MAX_PREVIEW_SIZE = 10485760 // 10MB
export const ARTIFACT_MAX_DOWNLOAD_SIZE = 104857600 // 100MB
+
+/*=========== NOTIFICATION =============*/
+export const NOTIFICATION_DURATION = 500
diff --git a/src/elements/DetailsInfoItem/DetailsInfoItem.js b/src/elements/DetailsInfoItem/DetailsInfoItem.js
index 08f06cdd9..10be72f43 100644
--- a/src/elements/DetailsInfoItem/DetailsInfoItem.js
+++ b/src/elements/DetailsInfoItem/DetailsInfoItem.js
@@ -219,10 +219,7 @@ const DetailsInfoItem = React.forwardRef(
className="details-item__data details-item__link"
template={
}
>
-
+
{func}
@@ -234,11 +231,7 @@ const DetailsInfoItem = React.forwardRef(
if (!infoItem) return null
return item.link ? (
-
+
}>{infoItem}
) : (
diff --git a/src/elements/DetailsInfoItemChip/DetailsInfoItemChip.js b/src/elements/DetailsInfoItemChip/DetailsInfoItemChip.js
index d0a45b2ed..5e5b78c70 100644
--- a/src/elements/DetailsInfoItemChip/DetailsInfoItemChip.js
+++ b/src/elements/DetailsInfoItemChip/DetailsInfoItemChip.js
@@ -24,7 +24,10 @@ import { useDispatch, useSelector } from 'react-redux'
import { RoundedIcon, FormChipCell, FormOnChange } from 'igz-controls/components'
-import { getValidationRules, getInternalLabelsValidationRule } from 'igz-controls/utils/validation.util'
+import {
+ getValidationRules,
+ getInternalLabelsValidationRule
+} from 'igz-controls/utils/validation.util'
import { detailsInfoActions } from '../../components/DetailsInfo/detailsInfoReducer'
import detailsActions from '../../actions/details'
diff --git a/src/elements/FeaturesTablePanel/FeaturesTablePanel.js b/src/elements/FeaturesTablePanel/FeaturesTablePanel.js
index f2cfd5346..c00bfb1cc 100644
--- a/src/elements/FeaturesTablePanel/FeaturesTablePanel.js
+++ b/src/elements/FeaturesTablePanel/FeaturesTablePanel.js
@@ -38,7 +38,7 @@ import { showErrorNotification } from '../../utils/notifications.util'
const FeaturesTablePanel = ({
createNewFeatureVector,
- filtersStore,
+ projectName = '',
handleCancel = null,
onSubmit = null,
updateFeatureVectorData
@@ -51,13 +51,13 @@ const FeaturesTablePanel = ({
if (tableStore.features.isNewFeatureVector) {
dispatch(
updateCurrentProjectName(
- filtersStore.project || tableStore.features.featureVector.metadata.project
+ projectName || tableStore.features.featureVector.metadata.project
)
)
}
}, [
dispatch,
- filtersStore.project,
+ projectName,
tableStore.features.featureVector.metadata.project,
tableStore.features.isNewFeatureVector
])
@@ -174,12 +174,11 @@ const FeaturesTablePanel = ({
FeaturesTablePanel.propTypes = {
handleCancel: PropTypes.func,
- onSubmit: PropTypes.func
+ onSubmit: PropTypes.func,
+ projectName: PropTypes.string
}
export default connect(
- filtersStore => ({
- ...filtersStore
- }),
+ null,
{ ...featureStoreActions }
)(FeaturesTablePanel)
diff --git a/src/elements/JobsTable/JobsTable.js b/src/elements/JobsTable/JobsTable.js
index 28683bed0..a1d4e8748 100644
--- a/src/elements/JobsTable/JobsTable.js
+++ b/src/elements/JobsTable/JobsTable.js
@@ -80,6 +80,7 @@ const JobsTable = React.forwardRef(
refreshJobs,
requestErrorMessage,
selectedJob,
+ selectedRunProject,
setAbortingJobs,
setJobRuns,
setJobs,
@@ -98,6 +99,10 @@ const JobsTable = React.forwardRef(
const dispatch = useDispatch()
const navigate = useNavigate()
const location = useLocation()
+ const [jobsFilterMenu, jobsFilterMenuModal] = useSelector(state => [
+ state.filtersStore.filterMenu[MONITOR_JOBS_TAB],
+ state.filtersStore.filterMenuModal[MONITOR_JOBS_TAB]
+ ])
const fetchJobFunctionsPromiseRef = useRef()
const {
editableItem,
@@ -178,11 +183,20 @@ const JobsTable = React.forwardRef(
modifyAndSelectRun(item)
}
- if (!params.jobName && setSelectedRunProject) {
+ if (
+ (!params.jobName && setSelectedRunProject) ||
+ params.projectName !== selectedRunProject
+ ) {
setSelectedRunProject(item.project)
}
},
- [modifyAndSelectRun, params.jobName, setSelectedRunProject]
+ [
+ modifyAndSelectRun,
+ params.jobName,
+ params.projectName,
+ selectedRunProject,
+ setSelectedRunProject
+ ]
)
const fetchRun = useCallback(
@@ -214,7 +228,7 @@ const JobsTable = React.forwardRef(
job => {
const refresh = !isEmpty(selectedJob)
? () => fetchRun(job.project)
- : () => refreshJobs(filtersStore)
+ : () => refreshJobs({ ...jobsFilterMenu.values, ...jobsFilterMenuModal.values })
handleAbortJob(
job,
@@ -233,7 +247,8 @@ const JobsTable = React.forwardRef(
abortingJobs,
dispatch,
fetchRun,
- filtersStore,
+ jobsFilterMenu.values,
+ jobsFilterMenuModal.values,
refreshJobs,
selectedJob,
setAbortingJobs,
@@ -387,7 +402,8 @@ const JobsTable = React.forwardRef(
defaultData: jobWizardMode === PANEL_RERUN_MODE ? editableItem?.rerun_object : {},
mode: jobWizardMode,
wizardTitle: jobWizardMode === PANEL_RERUN_MODE ? 'Batch re-run' : undefined,
- onSuccessRequest: () => refreshJobs(filtersStore)
+ onSuccessRequest: () =>
+ refreshJobs({ ...jobsFilterMenu.values, ...jobsFilterMenuModal.values })
})
setJobWizardIsOpened(true)
@@ -397,6 +413,8 @@ const JobsTable = React.forwardRef(
filtersStore,
jobWizardIsOpened,
jobWizardMode,
+ jobsFilterMenu.values,
+ jobsFilterMenuModal.values,
params,
refreshJobs,
setEditableItem,
@@ -539,6 +557,7 @@ JobsTable.propTypes = {
refreshJobs: PropTypes.func.isRequired,
requestErrorMessage: PropTypes.string.isRequired,
selectedJob: PropTypes.object.isRequired,
+ selectedRunProject: PropTypes.string.isRequired,
setAbortingJobs: PropTypes.func.isRequired,
setJobRuns: PropTypes.func.isRequired,
setJobs: PropTypes.func.isRequired,
diff --git a/src/elements/MembersPopUp/MembersPopUp.js b/src/elements/MembersPopUp/MembersPopUp.js
index deb3b0983..ea1488044 100644
--- a/src/elements/MembersPopUp/MembersPopUp.js
+++ b/src/elements/MembersPopUp/MembersPopUp.js
@@ -17,9 +17,8 @@ illegal under applicable law, and the grant of the foregoing license
under the Apache 2.0 license is conditioned upon your compliance with
such restriction.
*/
-import React, { createRef, useState } from 'react'
+import React, { useState } from 'react'
import PropTypes from 'prop-types'
-import classnames from 'classnames'
import { useDispatch } from 'react-redux'
import { cloneDeep, debounce, groupBy } from 'lodash'
@@ -27,14 +26,10 @@ import CheckBox from '../../common/CheckBox/CheckBox'
import ChipInput from '../../common/ChipInput/ChipInput'
import Input from '../../common/Input/Input'
import Select from '../../common/Select/Select'
+import MembersPopUpRow from './MembersPopUpRow'
import { Button, ConfirmDialog, RoundedIcon, Tip } from 'igz-controls/components'
-import {
- DANGER_BUTTON,
- TERTIARY_BUTTON,
- PRIMARY_BUTTON,
- SECONDARY_BUTTON
-} from 'igz-controls/constants'
+import { TERTIARY_BUTTON, PRIMARY_BUTTON, SECONDARY_BUTTON } from 'igz-controls/constants'
import projectsIguazioApi from '../../api/projects-iguazio-api'
import { FORBIDDEN_ERROR_STATUS_CODE } from 'igz-controls/constants'
import { getErrorMsg } from 'igz-controls/utils/common.util'
@@ -44,11 +39,10 @@ import { membersActions } from './membersReducer'
import { showErrorNotification } from '../../utils/notifications.util'
import { useNavigate } from 'react-router-dom'
-import { OWNER_ROLE, USER_GROUP_ROLE, USER_ROLE } from '../../constants'
+import { USER_GROUP_ROLE, USER_ROLE } from '../../constants'
import { ReactComponent as Add } from 'igz-controls/images/add.svg'
import { ReactComponent as Close } from 'igz-controls/images/close.svg'
-import { ReactComponent as Delete } from 'igz-controls/images/delete.svg'
import { ReactComponent as Filter } from 'igz-controls/images/filter.svg'
import { ReactComponent as User } from 'igz-controls/images/user.svg'
import { ReactComponent as Users } from 'igz-controls/images/users.svg'
@@ -57,7 +51,6 @@ import './membersPopUp.scss'
const MembersPopUp = ({ changeMembersCallback, membersDispatch, membersState }) => {
const [membersData, setMembersData] = useState(membersState)
- const [deleteMemberId, setDeleteMemberId] = useState('')
const [confirmDiscard, setConfirmDiscard] = useState(false)
const [inviteNewMembers, setInviteNewMembers] = useState(false)
const [notifyByEmail, setNotifyByEmail] = useState(false)
@@ -70,7 +63,6 @@ const MembersPopUp = ({ changeMembersCallback, membersDispatch, membersState })
})
const dispatch = useDispatch()
const navigate = useNavigate()
- const membersTableRowClassNames = classnames('table-row', inviteNewMembers && 'inactive')
const handleOnClose = () => {
setConfirmDiscard(false)
@@ -94,8 +86,7 @@ const MembersPopUp = ({ changeMembersCallback, membersDispatch, membersState })
type: newMember.ui.type,
role: newMembersRole,
icon: newMember.ui.type === USER_ROLE ?
:
,
- modification: 'post',
- actionElement: createRef()
+ modification: 'post'
})
}
})
@@ -226,18 +217,6 @@ const MembersPopUp = ({ changeMembersCallback, membersDispatch, membersState })
return membersData.members.some(member => member.modification !== '')
}
- const changeMemberRole = (roleOption, memberToEdit) => {
- const membersCopy = cloneDeep(membersData.members)
- const member = membersCopy.find(member => member.id === memberToEdit.id)
-
- if (member.initialRole) {
- member.modification = member.initialRole !== roleOption ? 'put' : ''
- }
- member.role = roleOption
-
- setMembersData(state => ({ ...state, members: membersCopy }))
- }
-
const closeMemberPopUp = event => {
if (areChangesMade()) {
setConfirmDiscard(true)
@@ -246,19 +225,6 @@ const MembersPopUp = ({ changeMembersCallback, membersDispatch, membersState })
}
}
- const deleteMember = memberToDelete => {
- let membersCopy = cloneDeep(membersData.members)
-
- if (memberToDelete.initialRole) {
- membersCopy.find(member => member.id === memberToDelete.id).modification = DELETE_MODIFICATION
- } else {
- membersCopy = membersCopy.filter(member => member.id !== memberToDelete.id)
- }
-
- setMembersData(state => ({ ...state, members: membersCopy }))
- setDeleteMemberId('')
- }
-
const discardChanges = event => {
event.stopPropagation()
setMembersData(membersState)
@@ -447,55 +413,13 @@ const MembersPopUp = ({ changeMembersCallback, membersDispatch, membersState })
)
})
.map(member => (
-
-
-
-
{member.name[0]?.toUpperCase()}
-
{member.icon}
-
{member.name}
-
-
- changeMemberRole(roleOption, member)}
- options={getRoleOptions(member.role)}
- selectedId={member.role}
- />
-
-
- setDeleteMemberId(member.id)}
- >
-
-
-
- {deleteMemberId === member.id && (
-
setDeleteMemberId('')}
- confirmButton={{
- handler: () => deleteMember(member),
- label: 'Remove member',
- variant: DANGER_BUTTON
- }}
- customPosition={{
- element: member.actionElement,
- position: 'top-right'
- }}
- header="Are you sure?"
- isOpen={deleteMemberId === member.id}
- message="Removing a member will revoke all access."
- />
- )}
-
+ inviteNewMembers={inviteNewMembers}
+ member={member}
+ membersData={membersData}
+ setMembersData={setMembersData}
+ />
))}
diff --git a/src/elements/MembersPopUp/MembersPopUpRow.js b/src/elements/MembersPopUp/MembersPopUpRow.js
new file mode 100644
index 000000000..50f593ca8
--- /dev/null
+++ b/src/elements/MembersPopUp/MembersPopUpRow.js
@@ -0,0 +1,114 @@
+/*
+Copyright 2019 Iguazio Systems Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License") with
+an addition restriction as set forth herein. 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.
+
+In addition, you may not use the software for any purposes that are
+illegal under applicable law, and the grant of the foregoing license
+under the Apache 2.0 license is conditioned upon your compliance with
+such restriction.
+*/
+import React, { useRef, useState } from 'react'
+import classnames from 'classnames'
+import { cloneDeep } from 'lodash'
+
+import { ConfirmDialog } from 'igz-controls/components'
+import Select from '../../common/Select/Select'
+
+import { DELETE_MODIFICATION, getRoleOptions } from './membersPopUp.util'
+import { DANGER_BUTTON } from 'igz-controls/constants'
+import { OWNER_ROLE } from '../../constants'
+
+import { ReactComponent as Delete } from 'igz-controls/images/delete.svg'
+
+const MembersPopUpRow = ({ inviteNewMembers, member, membersData, setMembersData }) => {
+ const memberRef = useRef()
+ const [deleteMemberId, setDeleteMemberId] = useState('')
+
+ const membersTableRowClassNames = classnames('table-row', inviteNewMembers && 'inactive')
+
+ const changeMemberRole = (roleOption, memberToEdit) => {
+ const membersCopy = cloneDeep(membersData.members)
+ const member = membersCopy.find(member => member.id === memberToEdit.id)
+
+ if (member.initialRole) {
+ member.modification = member.initialRole !== roleOption ? 'put' : ''
+ }
+ member.role = roleOption
+
+ setMembersData(state => ({ ...state, members: membersCopy }))
+ }
+
+ const deleteMember = memberToDelete => {
+ let membersCopy = cloneDeep(membersData.members)
+
+ if (memberToDelete.initialRole) {
+ membersCopy.find(member => member.id === memberToDelete.id).modification = DELETE_MODIFICATION
+ } else {
+ membersCopy = membersCopy.filter(member => member.id !== memberToDelete.id)
+ }
+
+ setMembersData(state => ({ ...state, members: membersCopy }))
+ setDeleteMemberId('')
+ }
+
+ return (
+
+
+
+
{member.name[0]?.toUpperCase()}
+
{member.icon}
+
{member.name}
+
+
+ changeMemberRole(roleOption, member)}
+ options={getRoleOptions(member.role)}
+ selectedId={member.role}
+ />
+
+
+ setDeleteMemberId(member.id)}
+ >
+
+
+
+ {deleteMemberId === member.id && (
+
setDeleteMemberId('')}
+ confirmButton={{
+ handler: () => deleteMember(member),
+ label: 'Remove member',
+ variant: DANGER_BUTTON
+ }}
+ customPosition={{
+ element: memberRef,
+ position: 'top-right'
+ }}
+ header="Are you sure?"
+ isOpen={deleteMemberId === member.id}
+ message="Removing a member will revoke all access."
+ />
+ )}
+
+ )
+}
+
+export default MembersPopUpRow
diff --git a/src/elements/ProjectCard/ProjectCard.js b/src/elements/ProjectCard/ProjectCard.js
index 927e3eb8e..a1040f03d 100644
--- a/src/elements/ProjectCard/ProjectCard.js
+++ b/src/elements/ProjectCard/ProjectCard.js
@@ -17,7 +17,7 @@ illegal under applicable law, and the grant of the foregoing license
under the Apache 2.0 license is conditioned upon your compliance with
such restriction.
*/
-import React, { useEffect, useState, useMemo } from 'react'
+import React, { useEffect, useState, useMemo, useRef } from 'react'
import PropTypes from 'prop-types'
import { connect } from 'react-redux'
@@ -26,19 +26,10 @@ import ProjectCardView from './ProjectCardView'
import { generateProjectStatistic } from './projectCard.util'
import projectsAction from '../../actions/projects'
-const ProjectCard = ({
- actionsMenu,
- nuclioStore,
- project,
- projectStore,
- projectSummary
-}) => {
- const [
- fetchNuclioFunctionsFailure,
- setFetchNuclioFunctionsFailure
- ] = useState(false)
+const ProjectCard = ({ actionsMenu, nuclioStore, project, projectStore, projectSummary }) => {
+ const [fetchNuclioFunctionsFailure, setFetchNuclioFunctionsFailure] = useState(false)
- const actionsMenuRef = React.createRef()
+ const actionsMenuRef = useRef()
useEffect(() => {
setFetchNuclioFunctionsFailure(
diff --git a/src/elements/ProjectSettingsGeneral/ProjectSettingsGeneral.js b/src/elements/ProjectSettingsGeneral/ProjectSettingsGeneral.js
index 3c35572a0..7dfb1aa86 100644
--- a/src/elements/ProjectSettingsGeneral/ProjectSettingsGeneral.js
+++ b/src/elements/ProjectSettingsGeneral/ProjectSettingsGeneral.js
@@ -258,10 +258,7 @@ const ProjectSettingsGeneral = ({
label="Pull at runtime"
name={LOAD_SOURCE_ON_RUN}
/>
-
+
Node Selectors
-
+
{
const onNavigate = (statistic, key) => {
let filters = {}
+ let pageFilters = {}
+ let modalFilters = {}
if (['running', 'workflows'].includes(key)) {
const anyTimeOption = datePickerPastOptions.find(option => option.id === ANY_TIME_DATE_OPTION)
-
filters = {
- saveFilters: true,
- state: 'running',
- dates: {
- value: anyTimeOption.handler(),
- isPredefined: false,
- initialSelectedOptionId: anyTimeOption.id
+ saveFilters: true
+ }
+ pageFilters = {
+ name: key === 'workflows' ? MONITOR_WORKFLOWS_TAB : MONITOR_JOBS_TAB,
+ value: {
+ [DATES_FILTER]: {
+ value: anyTimeOption.handler(),
+ isPredefined: false,
+ initialSelectedOptionId: anyTimeOption.id
+ }
+ }
+ }
+ modalFilters = {
+ name: key === 'workflows' ? MONITOR_WORKFLOWS_TAB : MONITOR_JOBS_TAB,
+ value: {
+ [STATUS_FILTER]: key === 'workflows' ? ['running'] : ['running', 'pending', 'aborting']
}
}
} else if (key === FAILED_STATE) {
const past24HourOption = datePickerPastOptions.find(
option => option.id === PAST_24_HOUR_DATE_OPTION
)
-
filters = {
- saveFilters: true,
- state: ERROR_STATE,
- dates: {
- value: past24HourOption.handler(),
- isPredefined: past24HourOption.isPredefined,
- initialSelectedOptionId: past24HourOption.id
+ saveFilters: true
+ }
+ pageFilters = {
+ name: MONITOR_JOBS_TAB,
+ value: {
+ [DATES_FILTER]: {
+ value: past24HourOption.handler(),
+ isPredefined: past24HourOption.isPredefined,
+ initialSelectedOptionId: past24HourOption.id
+ }
+ }
+ }
+ modalFilters = {
+ name: MONITOR_JOBS_TAB,
+ value: { [STATUS_FILTER]: ['error', 'aborted'] }
+ }
+ } else if (key === 'scheduled') {
+ const anyTimeOption = datePickerPastOptions.find(option => option.id === ANY_TIME_DATE_OPTION)
+ filters = {
+ saveFilters: true
+ }
+ pageFilters = {
+ name: SCHEDULE_TAB,
+ value: {
+ [DATES_FILTER]: {
+ value: anyTimeOption.handler(),
+ isPredefined: false,
+ initialSelectedOptionId: anyTimeOption.id
+ }
}
}
}
dispatch(setFilters(filters))
+ dispatch(setModalFiltersValues(modalFilters))
+ dispatch(setFiltersValues(pageFilters))
navigate(statistic.link)
}
diff --git a/src/elements/ProjectsMonitoringCounters/JobsCounters.js b/src/elements/ProjectsMonitoringCounters/JobsCounters.js
index 9094c710f..09b4dbd05 100644
--- a/src/elements/ProjectsMonitoringCounters/JobsCounters.js
+++ b/src/elements/ProjectsMonitoringCounters/JobsCounters.js
@@ -74,7 +74,7 @@ const JobsCounters = () => {
{projectStore.projectsSummary.loading ? (
) : (
- }>
+ }>
{counter}
diff --git a/src/elements/ProjectsMonitoringCounters/WorkflowsCounters.js b/src/elements/ProjectsMonitoringCounters/WorkflowsCounters.js
index 8faf553ab..a12e5d0df 100644
--- a/src/elements/ProjectsMonitoringCounters/WorkflowsCounters.js
+++ b/src/elements/ProjectsMonitoringCounters/WorkflowsCounters.js
@@ -83,7 +83,7 @@ const WorkflowsCounters = () => {
{projectStore.projectsSummary.loading ? (
) : (
- }>
+ }>
{counter}
diff --git a/src/elements/ScheduledJobsTable/ScheduledJobsTable.js b/src/elements/ScheduledJobsTable/ScheduledJobsTable.js
index 2b134738e..d5ea92889 100644
--- a/src/elements/ScheduledJobsTable/ScheduledJobsTable.js
+++ b/src/elements/ScheduledJobsTable/ScheduledJobsTable.js
@@ -53,7 +53,7 @@ const ScheduledJobsTable = ({
context,
filters = null,
filtersConfig = null,
- filtersMenuName = '',
+ filterMenuName = '',
jobs,
refreshJobs,
requestErrorMessage,
@@ -261,7 +261,7 @@ const ScheduledJobsTable = ({
requestErrorMessage,
JOBS_PAGE,
SCHEDULE_TAB,
- filtersMenuName
+ filterMenuName
)}
/>
) : (
@@ -295,7 +295,7 @@ ScheduledJobsTable.propTypes = {
context: PropTypes.object.isRequired,
filters: PropTypes.array,
filtersConfig: FILTERS_CONFIG,
- filtersMenuName: PropTypes.string,
+ filterMenuName: PropTypes.string,
jobs: PropTypes.array.isRequired,
refreshJobs: PropTypes.func.isRequired,
requestErrorMessage: PropTypes.string.isRequired,
diff --git a/src/elements/WorkflowsTable/WorkflowsTable.js b/src/elements/WorkflowsTable/WorkflowsTable.js
index d384de311..38460dd1a 100644
--- a/src/elements/WorkflowsTable/WorkflowsTable.js
+++ b/src/elements/WorkflowsTable/WorkflowsTable.js
@@ -72,7 +72,7 @@ import { useYaml } from '../../hooks/yaml.hook'
import cssVariables from '../../components/Jobs/MonitorWorkflows/monitorWorkflows.scss'
import { fetchJob } from '../../reducers/jobReducer'
-import { fetchWorkflow, resetWorkflow } from '../../reducers/workflowReducer'
+import { fetchWorkflow, rerunWorkflow, resetWorkflow } from '../../reducers/workflowReducer'
const WorkflowsTable = React.forwardRef(
(
@@ -385,6 +385,28 @@ const WorkflowsTable = React.forwardRef(
[onDeleteJob, setConfirmData]
)
+ const handleRerun = useCallback(
+ workflow => {
+ dispatch(rerunWorkflow({ project: workflow.project, workflowId: workflow.id }))
+ .unwrap()
+ .then(
+ dispatch(
+ setNotification({
+ status: 200,
+ id: Math.random(),
+ message: 'Workflow ran successfully.'
+ })
+ )
+ )
+ .catch(error => {
+ showErrorNotification(dispatch, error, 'Workflow did not run successfully', '', () =>
+ handleRerun(workflow)
+ )
+ })
+ },
+ [dispatch]
+ )
+
const actionsMenu = useMemo(() => {
return job =>
generateActionsMenu(
@@ -395,7 +417,8 @@ const WorkflowsTable = React.forwardRef(
appStore.frontendSpec.abortable_function_kinds,
handleConfirmAbortJob,
handleConfirmDeleteJob,
- toggleConvertedYaml
+ toggleConvertedYaml,
+ handleRerun
)
}, [
handleRerunJob,
@@ -404,7 +427,8 @@ const WorkflowsTable = React.forwardRef(
handleMonitoring,
handleConfirmAbortJob,
handleConfirmDeleteJob,
- toggleConvertedYaml
+ toggleConvertedYaml,
+ handleRerun
])
const handleCancel = useCallback(() => {
diff --git a/src/hooks/useInitialTableFetch.hook.js b/src/hooks/useInitialTableFetch.hook.js
index 28d50464e..aeb841c30 100644
--- a/src/hooks/useInitialTableFetch.hook.js
+++ b/src/hooks/useInitialTableFetch.hook.js
@@ -20,7 +20,7 @@ such restriction.
import { useEffect, useLayoutEffect, useMemo, useRef } from 'react'
import { useParams } from 'react-router-dom'
import { useDispatch } from 'react-redux'
-import { debounce } from 'lodash'
+import { debounce, has, isEmpty } from 'lodash'
import {
GROUP_BY_FILTER,
@@ -30,15 +30,17 @@ import {
TAG_FILTER,
TAG_FILTER_ALL_ITEMS
} from '../constants'
-import { setFilters, setModalFiltersValues } from '../reducers/filtersReducer'
+import { setFilters, setFiltersValues, setModalFiltersValues } from '../reducers/filtersReducer'
import { expandRowByName } from '../utils/tableRows.util'
export const useInitialTableFetch = ({
createRowData,
- filters,
fetchData,
fetchTags,
- filterMenuName,
+ filterModalName,
+ filterName,
+ filters,
+ filtersConfig,
setExpandedRowsData,
setInitialFilters,
sortExpandedRowsDataBy
@@ -96,27 +98,45 @@ export const useInitialTableFetch = ({
if (setInitialFilters) {
setInitialFilters()
} else {
- if (params.name) {
- dispatch(
- setFilters({
- [NAME_FILTER]: params.name,
- [ITERATIONS_FILTER]: '',
- [TAG_FILTER]: TAG_FILTER_ALL_ITEMS
- })
- )
-
- if (filterMenuName) {
+ if (params.name) {
+ if (filterName) {
+ dispatch(
+ setFiltersValues({
+ name: filterName,
+ value: { [NAME_FILTER]: params.name }
+ })
+ )
+ } else {
+ // todo remove when all filters will be changed to new components
dispatch(
- setModalFiltersValues({
- name: filterMenuName,
- value: { [ITERATIONS_FILTER]: '', [TAG_FILTER]: TAG_FILTER_ALL_ITEMS }
+ setFilters({
+ [NAME_FILTER]: params.name
})
)
}
+
+ if (filterModalName) {
+ const value = { [ITERATIONS_FILTER]: '', [TAG_FILTER]: TAG_FILTER_ALL_ITEMS }
+
+ if (filtersConfig) {
+ for (const filterName of Object.keys(value)) {
+ if (!has(filtersConfig, filterName)) delete value[filterName]
+ }
+ }
+
+ if (!isEmpty(value)) {
+ dispatch(
+ setModalFiltersValues({
+ name: filterModalName,
+ value: value
+ })
+ )
+ }
+ }
}
}
}
- }, [dispatch, filterMenuName, params.name, setInitialFilters])
+ }, [dispatch, filterModalName, filterName, filtersConfig, params.name, setInitialFilters])
useEffect(() => {
sendInitialRequest({
@@ -133,7 +153,7 @@ export const useInitialTableFetch = ({
dispatch,
fetchData,
fetchTags,
- filterMenuName,
+ filterModalName,
filters,
params.name,
sendInitialRequest,
diff --git a/src/hooks/useJobsPageData.js b/src/hooks/useJobsPageData.js
new file mode 100644
index 000000000..24e67b1f4
--- /dev/null
+++ b/src/hooks/useJobsPageData.js
@@ -0,0 +1,265 @@
+/*
+Copyright 2019 Iguazio Systems Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License") with
+an addition restriction as set forth herein. 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.
+
+In addition, you may not use the software for any purposes that are
+illegal under applicable law, and the grant of the foregoing license
+under the Apache 2.0 license is conditioned upon your compliance with
+such restriction.
+*/
+import { useCallback, useRef, useState } from 'react'
+import { useParams } from 'react-router-dom'
+import { useDispatch, useSelector } from 'react-redux'
+
+import { monitorJob, pollAbortingJobs, rerunJob } from '../components/Jobs/jobs.util'
+import { getJobKindFromLabels } from '../utils/jobs.util'
+import { parseJob } from '../utils/parseJob'
+import { FILTER_ALL_ITEMS, GROUP_BY_WORKFLOW, JOB_KIND_LOCAL, SCHEDULE_TAB } from '../constants'
+import { fetchAllJobRuns, fetchJobs, fetchScheduledJobs } from '../reducers/jobReducer'
+import { fetchWorkflows } from '../reducers/workflowReducer'
+
+export const useJobsPageData = () => {
+ const [jobRuns, setJobRuns] = useState([])
+ const [editableItem, setEditableItem] = useState(null)
+ const [jobWizardMode, setJobWizardMode] = useState(null)
+ const [jobWizardIsOpened, setJobWizardIsOpened] = useState(false)
+ const [jobs, setJobs] = useState([])
+ const [abortingJobs, setAbortingJobs] = useState({})
+ const [dateFilter, setDateFilter] = useState(['', ''])
+ const abortControllerRef = useRef(new AbortController())
+ const abortJobRef = useRef(null)
+ const params = useParams()
+ const [selectedRunProject, setSelectedRunProject] = useState(params.projectName || '')
+ const [requestErrorMessage, setRequestErrorMessage] = useState('')
+ const [scheduledJobs, setScheduledJobs] = useState([])
+ const dispatch = useDispatch()
+ const appStore = useSelector(store => store.appStore)
+
+ const terminateAbortTasksPolling = useCallback(() => {
+ abortJobRef?.current?.()
+ setAbortingJobs({})
+ }, [])
+
+ const refreshJobs = useCallback(
+ filters => {
+ if (params.jobName) {
+ setJobRuns([])
+ } else {
+ setJobs([])
+ }
+
+ abortControllerRef.current = new AbortController()
+
+ terminateAbortTasksPolling()
+
+ if (filters.dates) {
+ setDateFilter(filters.dates.value)
+ }
+
+ const fetchData = params.jobName ? fetchAllJobRuns : fetchJobs
+ const newParams = !params.jobName && {
+ 'partition-by': 'project_and_name',
+ 'partition-sort-by': 'updated'
+ }
+
+ dispatch(
+ fetchData({
+ project: params.jobName
+ ? selectedRunProject || '*'
+ : filters.project
+ ? filters.project.toLowerCase()
+ : params.projectName || '*',
+ filters,
+ config: {
+ ui: {
+ controller: abortControllerRef.current,
+ setRequestErrorMessage
+ },
+ params: { ...newParams }
+ },
+ jobName: params.jobName ?? false
+ })
+ )
+ .unwrap()
+ .then(jobs => {
+ if (jobs) {
+ const parsedJobs = jobs
+ .map(job => parseJob(job))
+ .filter(job => {
+ const type = getJobKindFromLabels(job.labels) ?? JOB_KIND_LOCAL
+
+ return (
+ (!filters.type ||
+ filters.type === FILTER_ALL_ITEMS ||
+ filters.type.split(',').includes(type)) &&
+ (!filters.project || job.project.includes(filters.project.toLowerCase()))
+ )
+ })
+ const responseAbortingJobs = parsedJobs.reduce((acc, job) => {
+ if (job.state.value === 'aborting' && job.abortTaskId) {
+ acc[job.abortTaskId] = {
+ uid: job.uid,
+ name: job.name
+ }
+ }
+
+ return acc
+ }, {})
+
+ if (Object.keys(responseAbortingJobs).length > 0) {
+ setAbortingJobs(responseAbortingJobs)
+ pollAbortingJobs(
+ params.jobName
+ ? selectedRunProject || '*'
+ : filters.project
+ ? filters.project.toLowerCase()
+ : params.projectName || '*',
+ abortJobRef,
+ responseAbortingJobs,
+ () => refreshJobs(filters),
+ dispatch
+ )
+ }
+
+ if (params.jobName) {
+ setJobRuns(parsedJobs)
+ } else {
+ setJobs(parsedJobs)
+ }
+ }
+ })
+ },
+ [dispatch, params.jobName, params.projectName, selectedRunProject, terminateAbortTasksPolling]
+ )
+
+ const refreshScheduled = useCallback(
+ filters => {
+ setScheduledJobs([])
+ abortControllerRef.current = new AbortController()
+
+ dispatch(
+ fetchScheduledJobs(
+ filters.project ? filters.project.toLowerCase() : params.projectName || '*',
+ filters,
+ {
+ ui: {
+ controller: abortControllerRef.current,
+ setRequestErrorMessage
+ }
+ }
+ )
+ )
+ .unwrap()
+ .then(jobs => {
+ if (jobs) {
+ const parsedJobs = jobs
+ .map(job => parseJob(job, SCHEDULE_TAB))
+ .filter(job => {
+ let inDateRange = true
+
+ if (filters.dates) {
+ const timeTo = filters.dates.value[1]?.getTime?.() || ''
+ const timeFrom = filters.dates.value[0]?.getTime?.() || ''
+ const nextRun = job.nextRun.getTime()
+
+ if (timeFrom) {
+ inDateRange = nextRun >= timeFrom
+ }
+
+ if (timeTo && inDateRange) {
+ inDateRange = nextRun <= timeTo
+ }
+ }
+
+ return (
+ inDateRange &&
+ (!filters.type ||
+ filters.type === FILTER_ALL_ITEMS ||
+ job.type === filters.type) &&
+ (!filters.project || job.project.includes(filters.project.toLowerCase()))
+ )
+ })
+
+ setScheduledJobs(parsedJobs)
+ }
+ })
+ },
+ [dispatch, params.projectName]
+ )
+
+ const getWorkflows = useCallback(
+ filter => {
+ abortControllerRef.current = new AbortController()
+
+ if (filter.dates) {
+ setDateFilter(filter.dates.value)
+ }
+
+ dispatch(
+ fetchWorkflows({
+ project: filter.project ? filter.project.toLowerCase() : params.projectName || '*',
+ filter: { ...filter, groupBy: GROUP_BY_WORKFLOW },
+ config: {
+ ui: {
+ controller: abortControllerRef.current,
+ setRequestErrorMessage
+ }
+ },
+ withPagination: !params.projectName
+ })
+ )
+ },
+ [dispatch, params.projectName]
+ )
+
+ const handleMonitoring = useCallback(
+ item => {
+ monitorJob(appStore.frontendSpec.jobs_dashboard_url, item, params.projectName)
+ },
+ [appStore.frontendSpec.jobs_dashboard_url, params.projectName]
+ )
+
+ const handleRerunJob = useCallback(
+ async job => await rerunJob(job, setEditableItem, setJobWizardMode, dispatch),
+ [dispatch]
+ )
+
+ return {
+ abortControllerRef,
+ abortJobRef,
+ abortingJobs,
+ dateFilter,
+ editableItem,
+ getWorkflows,
+ handleMonitoring,
+ handleRerunJob,
+ jobRuns,
+ jobs,
+ jobWizardIsOpened,
+ jobWizardMode,
+ refreshJobs,
+ refreshScheduled,
+ requestErrorMessage,
+ scheduledJobs,
+ selectedRunProject,
+ setAbortingJobs,
+ setEditableItem,
+ setJobRuns,
+ setJobWizardIsOpened,
+ setJobWizardMode,
+ setJobs,
+ setScheduledJobs,
+ setSelectedRunProject,
+ terminateAbortTasksPolling
+ }
+}
diff --git a/src/hooks/useVirtualization.hook.js b/src/hooks/useVirtualization.hook.js
index be8ad3ccf..9cc58150c 100644
--- a/src/hooks/useVirtualization.hook.js
+++ b/src/hooks/useVirtualization.hook.js
@@ -208,22 +208,32 @@ const useTableScroll = ({
* @param {string|number} options.heightData.rowHeightExtended - Height of an extended row.
* @param {string|number} options.heightData.headerRowHeight - Height of the table header row.
* @param {boolean} options.activateTableScroll - Boolean indicator for useTableScroll hook.
+ * @param {string|number} options.tableId - Custom table ID.
+ * @param {string|number} options.tableBodyId - Custom table body ID.
+ * @param {boolean} options.ignoreHorizontalScroll - Boolean indicator for ignoring horizontal scroll event
* @returns {Object} - Object containing virtualization configuration.
*/
+const rowsDataDefault = {
+ content: []
+}
+const rowsSizesDefault = []
+
export const useVirtualization = ({
renderTriggerItem,
- rowsSizes = [],
- rowsData = {
- content: []
- },
- heightData: { rowHeight, rowHeightExtended, headerRowHeight },
- activateTableScroll = false
+ rowsSizes = rowsSizesDefault,
+ rowsData = rowsDataDefault,
+ heightData: { rowHeight = 0, rowHeightExtended = 0, headerRowHeight = 0 },
+ activateTableScroll = false,
+ tableId = null,
+ tableBodyId = null,
+ ignoreHorizontalScroll = false
}) => {
const [virtualizationConfig, setVirtualizationConfig] = useState(virtualizationConfigInitialState)
const [rowsSizesLocal, setRowsSizesLocal] = useState(rowsSizes)
const rowHeightLocal = useMemo(() => parseInt(rowHeight), [rowHeight])
const extendedRowHeightLocal = useMemo(() => parseInt(rowHeightExtended), [rowHeightExtended])
const headerRowHeightLocal = useMemo(() => parseInt(headerRowHeight), [headerRowHeight])
+ const prevScrollTop = useRef(null)
useLayoutEffect(() => {
if (isEmpty(rowsData.content) && !isEqual(rowsSizes, rowsSizesLocal)) {
@@ -255,11 +265,15 @@ export const useVirtualization = ({
])
useLayoutEffect(() => {
- const tableElement = document.getElementById(MAIN_TABLE_ID)
- const tableBodyElement = document.getElementById(MAIN_TABLE_BODY_ID)
+ const tableElement = document.getElementById(tableId || MAIN_TABLE_ID)
+ const tableBodyElement = document.getElementById(tableBodyId || MAIN_TABLE_BODY_ID)
const elementsHeight = sum(rowsSizesLocal)
- const calculateVirtualizationConfig = throttle(() => {
+ const calculateVirtualizationConfig = throttle(event => {
+ if (ignoreHorizontalScroll && event?.type === 'scroll') {
+ if (tableElement.scrollTop === prevScrollTop.current) return
+ prevScrollTop.current = tableElement.scrollTop
+ }
const scrollClientHeight = parseInt(
tableElement.scrollTop + tableElement.clientHeight - headerRowHeightLocal
)
@@ -342,7 +356,15 @@ export const useVirtualization = ({
window.removeEventListener('resize', calculateVirtualizationConfig)
}
}
- }, [renderTriggerItem, headerRowHeightLocal, rowsSizesLocal, rowsData.content])
+ }, [
+ renderTriggerItem,
+ headerRowHeightLocal,
+ rowsSizesLocal,
+ rowsData.content,
+ tableId,
+ tableBodyId,
+ ignoreHorizontalScroll
+ ])
useTableScroll({
rowHeight: rowHeightLocal,
diff --git a/src/httpClient.js b/src/httpClient.js
index 021f0ac93..e758ea10e 100755
--- a/src/httpClient.js
+++ b/src/httpClient.js
@@ -129,7 +129,10 @@ const responseFulfillInterceptor = response => {
delete requestTimeouts[response.config.ui.requestId]
if (isLargeResponse) {
- showLargeResponsePopUp(response.config.ui.setRequestErrorMessage, response.config.ui.customErrorMessage)
+ showLargeResponsePopUp(
+ response.config.ui.setRequestErrorMessage,
+ response.config.ui.customErrorMessage
+ )
throw new Error(LARGE_REQUEST_CANCELED)
} else {
@@ -174,7 +177,8 @@ mainHttpClientV2.interceptors.response.use(responseFulfillInterceptor, responseR
export const showLargeResponsePopUp = (setRequestErrorMessage, customErrorMessage) => {
if (!largeResponsePopUpIsOpen) {
- const errorMessage = customErrorMessage ||
+ const errorMessage =
+ customErrorMessage ||
'The query result is too large to display. Add a filter (or narrow it) to retrieve fewer results.'
setRequestErrorMessage(errorMessage)
diff --git a/src/reducers/featureStoreReducer.js b/src/reducers/featureStoreReducer.js
index fc5e82152..803cc2201 100644
--- a/src/reducers/featureStoreReducer.js
+++ b/src/reducers/featureStoreReducer.js
@@ -66,7 +66,10 @@ import {
START_FEATURE_SET_INGEST_SUCCESS,
FETCH_FEATURE_SET_SUCCESS,
SET_NEW_FEATURE_SET_CREDENTIALS_ACCESS_KEY,
- PANEL_DEFAULT_ACCESS_KEY
+ PANEL_DEFAULT_ACCESS_KEY,
+ FETCH_EXPANDED_FEATURE_SET_SUCCESS,
+ FETCH_FEATURE_SET_BEGIN,
+ FETCH_FEATURE_SET_FAILURE
} from '../constants'
const initialState = {
@@ -75,7 +78,8 @@ const initialState = {
allData: [],
selectedRowData: {
content: {}
- }
+ },
+ featureSetLoading: false
},
featureVectors: {
allData: [],
@@ -174,18 +178,7 @@ const featureStoreReducer = (state = initialState, { type, payload }) => {
}
}
}
- case FETCH_FEATURE_SETS_BEGIN:
- return {
- ...state,
- loading: true
- }
- case FETCH_FEATURE_SETS_FAILURE:
- return {
- ...state,
- error: payload,
- loading: false
- }
- case FETCH_FEATURE_SET_SUCCESS:
+ case FETCH_EXPANDED_FEATURE_SET_SUCCESS:
return {
...state,
featureSets: {
@@ -199,6 +192,41 @@ const featureStoreReducer = (state = initialState, { type, payload }) => {
}
}
}
+ case FETCH_FEATURE_SET_BEGIN:
+ return {
+ ...state,
+ featureSets: {
+ ...state.featureSets,
+ featureSetLoading: true
+ }
+ }
+ case FETCH_FEATURE_SET_FAILURE:
+ return {
+ ...state,
+ featureSets: {
+ ...state.featureSets,
+ featureSetLoading: false
+ }
+ }
+ case FETCH_FEATURE_SET_SUCCESS:
+ return {
+ ...state,
+ featureSets: {
+ ...state.featureSets,
+ featureSetLoading: false
+ }
+ }
+ case FETCH_FEATURE_SETS_BEGIN:
+ return {
+ ...state,
+ loading: true
+ }
+ case FETCH_FEATURE_SETS_FAILURE:
+ return {
+ ...state,
+ error: payload,
+ loading: false
+ }
case FETCH_FEATURE_SETS_SUCCESS:
return {
...state,
diff --git a/src/reducers/filtersReducer.js b/src/reducers/filtersReducer.js
index 17e7d700d..cc19ea350 100644
--- a/src/reducers/filtersReducer.js
+++ b/src/reducers/filtersReducer.js
@@ -21,6 +21,7 @@ import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { set } from 'lodash'
import {
+ ADD_TO_FEATURE_VECTOR_TAB,
ARTIFACT_OTHER_TYPE,
CONSUMER_GROUPS_FILTER,
CONSUMER_GROUP_FILTER,
@@ -28,6 +29,10 @@ import {
DATASET_TYPE,
DATES_FILTER,
DATE_FILTER_ANY_TIME,
+ ENTITIES_FILTER,
+ FEATURES_TAB,
+ FEATURE_SETS_TAB,
+ FEATURE_VECTORS_TAB,
FILES_FILTERS,
FILTER_ALL_ITEMS,
FILTER_MENU,
@@ -40,15 +45,20 @@ import {
JOBS_MONITORING_WORKFLOWS_TAB,
LABELS_FILTER,
MODELS_FILTERS,
+ MODEL_ENDPOINTS_TAB,
MODEL_TYPE,
NAME_FILTER,
PROJECT_FILTER,
+ REAL_TIME_PIPELINES_TAB,
SHOW_ITERATIONS,
SHOW_UNTAGGED_FILTER,
STATUS_FILTER,
TAG_FILTER,
TAG_FILTER_LATEST,
- TYPE_FILTER
+ TYPE_FILTER,
+ MONITOR_JOBS_TAB,
+ MONITOR_WORKFLOWS_TAB,
+ SCHEDULE_TAB
} from '../constants'
import {
NEXT_24_HOUR_DATE_OPTION,
@@ -56,7 +66,8 @@ import {
PAST_WEEK_DATE_OPTION,
datePickerFutureOptions,
datePickerPastOptions,
- getDatePickerFilterValue
+ getDatePickerFilterValue,
+ ANY_TIME_DATE_OPTION
} from '../utils/datePicker.util'
const initialState = {
@@ -116,14 +127,44 @@ const initialState = {
)
}
},
+ [MONITOR_JOBS_TAB]: {
+ initialValues: {
+ [NAME_FILTER]: '',
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION)
+ },
+ values: {
+ [NAME_FILTER]: '',
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION)
+ }
+ },
+ [MONITOR_WORKFLOWS_TAB]: {
+ initialValues: {
+ [NAME_FILTER]: '',
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION)
+ },
+ values: {
+ [NAME_FILTER]: '',
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION)
+ }
+ },
+ [SCHEDULE_TAB]: {
+ initialValues: {
+ [NAME_FILTER]: '',
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerFutureOptions, ANY_TIME_DATE_OPTION)
+ },
+ values: {
+ [NAME_FILTER]: '',
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerFutureOptions, ANY_TIME_DATE_OPTION)
+ }
+ },
[FUNCTION_FILTERS]: {
values: {
[NAME_FILTER]: '',
- [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION),
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION)
},
initialValues: {
[NAME_FILTER]: '',
- [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION),
+ [DATES_FILTER]: getDatePickerFilterValue(datePickerPastOptions, PAST_WEEK_DATE_OPTION)
}
},
[CONSUMER_GROUPS_FILTER]: {
@@ -141,6 +182,46 @@ const initialState = {
initialValues: {
[NAME_FILTER]: ''
}
+ },
+ [FEATURE_SETS_TAB]: {
+ values: {
+ [NAME_FILTER]: ''
+ },
+ initialValues: {
+ [NAME_FILTER]: ''
+ }
+ },
+ [FEATURES_TAB]: {
+ values: {
+ [NAME_FILTER]: ''
+ },
+ initialValues: {
+ [NAME_FILTER]: ''
+ }
+ },
+ [FEATURE_VECTORS_TAB]: {
+ values: {
+ [NAME_FILTER]: ''
+ },
+ initialValues: {
+ [NAME_FILTER]: ''
+ }
+ },
+ [ADD_TO_FEATURE_VECTOR_TAB]: {
+ values: {
+ [NAME_FILTER]: ''
+ },
+ initialValues: {
+ [NAME_FILTER]: ''
+ }
+ },
+ [REAL_TIME_PIPELINES_TAB]: {
+ values: {
+ [NAME_FILTER]: ''
+ },
+ initialValues: {
+ [NAME_FILTER]: ''
+ }
}
},
[FILTER_MENU_MODAL]: {
@@ -221,6 +302,90 @@ const initialState = {
[PROJECT_FILTER]: '',
[TYPE_FILTER]: FILTER_ALL_ITEMS
}
+ },
+ [MONITOR_JOBS_TAB]: {
+ initialValues: {
+ [LABELS_FILTER]: '',
+ [STATUS_FILTER]: [FILTER_ALL_ITEMS],
+ [TYPE_FILTER]: FILTER_ALL_ITEMS
+ },
+ values: {
+ [LABELS_FILTER]: '',
+ [STATUS_FILTER]: [FILTER_ALL_ITEMS],
+ [TYPE_FILTER]: FILTER_ALL_ITEMS
+ }
+ },
+ [MONITOR_WORKFLOWS_TAB]: {
+ initialValues: {
+ [LABELS_FILTER]: '',
+ [STATUS_FILTER]: [FILTER_ALL_ITEMS]
+ },
+ values: {
+ [LABELS_FILTER]: '',
+ [STATUS_FILTER]: [FILTER_ALL_ITEMS]
+ }
+ },
+ [SCHEDULE_TAB]: {
+ initialValues: {
+ [LABELS_FILTER]: '',
+ [TYPE_FILTER]: FILTER_ALL_ITEMS
+ },
+ values: {
+ [LABELS_FILTER]: '',
+ [TYPE_FILTER]: FILTER_ALL_ITEMS
+ }
+ },
+ [FEATURE_SETS_TAB]: {
+ initialValues: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [LABELS_FILTER]: ''
+ },
+ values: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [LABELS_FILTER]: ''
+ }
+ },
+ [FEATURES_TAB]: {
+ initialValues: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [LABELS_FILTER]: ''
+ },
+ values: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [LABELS_FILTER]: ''
+ }
+ },
+ [FEATURE_VECTORS_TAB]: {
+ initialValues: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [LABELS_FILTER]: ''
+ },
+ values: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [LABELS_FILTER]: ''
+ }
+ },
+ [ADD_TO_FEATURE_VECTOR_TAB]: {
+ initialValues: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [ENTITIES_FILTER]: '',
+ [LABELS_FILTER]: '',
+ [PROJECT_FILTER]: ''
+ },
+ values: {
+ [TAG_FILTER]: TAG_FILTER_LATEST,
+ [ENTITIES_FILTER]: '',
+ [LABELS_FILTER]: '',
+ [PROJECT_FILTER]: ''
+ }
+ },
+ [MODEL_ENDPOINTS_TAB]: {
+ initialValues: {
+ [LABELS_FILTER]: ''
+ },
+ values: {
+ [LABELS_FILTER]: ''
+ }
}
}
}
@@ -257,7 +422,11 @@ const filtersSlice = createSlice({
state[FILTER_MENU][action.payload] = initialState[FILTER_MENU][action.payload]
},
resetModalFilter(state, action) {
- state[FILTER_MENU_MODAL][action.payload] = initialState[FILTER_MENU_MODAL][action.payload]
+ state[FILTER_MENU_MODAL][action.payload.name] =
+ initialState[FILTER_MENU_MODAL][action.payload.name]
+ action.payload.resetModalFilterCallback?.(
+ initialState[FILTER_MENU_MODAL][action.payload.name]?.initialValues
+ )
},
setFilters(state, action) {
for (let filterProp in action.payload) {
diff --git a/src/reducers/workflowReducer.js b/src/reducers/workflowReducer.js
index 901bd9421..e2f414d55 100644
--- a/src/reducers/workflowReducer.js
+++ b/src/reducers/workflowReducer.js
@@ -98,6 +98,10 @@ export const fetchWorkflows = createAsyncThunk(
}
)
+export const rerunWorkflow = createAsyncThunk('rerunWorkflow', ({ project, workflowId }) => {
+ return workflowApi.rerunWorkflow(project, workflowId)
+})
+
const workflowsSlice = createSlice({
name: 'workflowsStore',
initialState,
diff --git a/src/scss/main.scss b/src/scss/main.scss
index f74a7bc9d..6914b53f1 100644
--- a/src/scss/main.scss
+++ b/src/scss/main.scss
@@ -96,6 +96,17 @@ body {
align-items: center;
padding: 4px 0 15px 0;
+ &.content__action-bar-wrapper_multi-row {
+ @media screen and (max-width: 1610px) {
+ flex-wrap: wrap;
+
+ .action-bar {
+ justify-content: flex-end;
+ margin-top: 10px;
+ }
+ }
+ }
+
&_hidden {
display: none;
}
@@ -843,6 +854,7 @@ div[id^='chartjs-tooltip'] {
.action-bar {
.filters-button {
margin-left: 5px;
+ margin-right: 5px;
}
&__filters {
@@ -857,17 +869,15 @@ div[id^='chartjs-tooltip'] {
&__actions {
display: flex;
+ margin-left: 15px;
.action-button {
white-space: nowrap;
+ margin-right: 10px;
@media screen and (min-width: 1300px) {
min-width: 160px;
}
-
- &:not(:last-of-type) {
- margin-right: 10px;
- }
}
.auto-refresh {
diff --git a/src/utils/createJobsContent.js b/src/utils/createJobsContent.js
index 22ed54f43..169e204ad 100644
--- a/src/utils/createJobsContent.js
+++ b/src/utils/createJobsContent.js
@@ -37,11 +37,12 @@ import { generateFunctionDetailsLink, generateLinkToDetailsPanel } from './link-
import { getJobIdentifier, getWorkflowJobIdentifier } from './getUniqueIdentifier'
import { parseKeyValues } from './object'
import { validateArguments } from './validateArguments'
+import { getJobKindFromLabels } from './jobs.util'
export const createJobsMonitorTabContent = (jobs, jobName, isStagingMode) => {
return jobs.map(job => {
const identifierUnique = getJobIdentifier(job, true)
- const type = job.labels?.find(label => label.includes('kind:'))?.replace('kind: ', '') ?? ''
+ const type = getJobKindFromLabels(job.labels)
const getLink = tab => {
if (jobName) {
return validateArguments(job.uid, tab, job.name)
@@ -353,7 +354,12 @@ export const createJobsWorkflowContent = (
type: 'link',
getLink: tab => {
return workflowProjectName
- ? getWorkflowMonitoringDetailsLink(workflowProjectName, workflowId, job.customData, tab)
+ ? getWorkflowMonitoringDetailsLink(
+ workflowProjectName,
+ workflowId,
+ job.customData,
+ tab
+ )
: getWorkflowDetailsLink(
projectName,
workflowId,
@@ -418,7 +424,7 @@ export const createJobsWorkflowContent = (
export const createJobsMonitoringContent = (jobs, jobName, isStagingMode) => {
return jobs.map(job => {
const identifierUnique = getJobIdentifier(job, true)
- const type = job.labels?.find(label => label.includes('kind:'))?.replace('kind: ', '') ?? ''
+ const type = getJobKindFromLabels(job.labels)
const getLink = tab => {
if (jobName) {
return validateArguments(job.uid, tab, job.name)
diff --git a/src/utils/generateMonitoringData.js b/src/utils/generateMonitoringData.js
index 29bedc23c..4b491cec5 100644
--- a/src/utils/generateMonitoringData.js
+++ b/src/utils/generateMonitoringData.js
@@ -47,7 +47,7 @@ export const generateMonitoringStats = (data, navigate, dispatch, tab) => {
return tab === JOBS_MONITORING_JOBS_TAB
? {
all: {
- counter: data.all,
+ counter: data.all || 0,
link: () => navigateToJobsMonitoringPage({ [STATUS_FILTER]: [FILTER_ALL_ITEMS] })
},
counters: [
@@ -85,7 +85,7 @@ export const generateMonitoringStats = (data, navigate, dispatch, tab) => {
: tab === JOBS_MONITORING_WORKFLOWS_TAB
? {
all: {
- counter: data.all,
+ counter: data.all || 0,
link: () => navigateToJobsMonitoringPage({ [STATUS_FILTER]: [FILTER_ALL_ITEMS] })
},
counters: [
@@ -106,7 +106,8 @@ export const generateMonitoringStats = (data, navigate, dispatch, tab) => {
},
{
counter: data.failed,
- link: () => navigateToJobsMonitoringPage({ [STATUS_FILTER]: [ERROR_STATE, FAILED_STATE] }),
+ link: () =>
+ navigateToJobsMonitoringPage({ [STATUS_FILTER]: [ERROR_STATE, FAILED_STATE] }),
statusClass: 'failed',
tooltip: 'Error, Failed'
},
@@ -120,15 +121,15 @@ export const generateMonitoringStats = (data, navigate, dispatch, tab) => {
}
: {
all: {
- counter: data.all,
+ counter: data.all || 0,
link: () => navigateToJobsMonitoringPage({ [TYPE_FILTER]: FILTER_ALL_ITEMS }, {})
},
jobs: {
- counter: data.jobs,
+ counter: data.jobs || 0,
link: () => navigateToJobsMonitoringPage({ [TYPE_FILTER]: JOB_KIND_JOB }, {})
},
workflows: {
- counter: data.workflows,
+ counter: data.workflows || 0,
link: () => navigateToJobsMonitoringPage({ [TYPE_FILTER]: JOB_KIND_WORKFLOW }, {})
}
}
diff --git a/src/utils/generateStoreResourceLink.js b/src/utils/generateStoreResourceLink.js
index 3061687eb..ff6a75334 100644
--- a/src/utils/generateStoreResourceLink.js
+++ b/src/utils/generateStoreResourceLink.js
@@ -17,7 +17,13 @@ illegal under applicable law, and the grant of the foregoing license
under the Apache 2.0 license is conditioned upon your compliance with
such restriction.
*/
-import { DATASETS_TAB, FEATURE_VECTORS_TAB, FILES_TAB, MODELS_TAB, TAG_FILTER_LATEST } from '../constants'
+import {
+ DATASETS_TAB,
+ FEATURE_VECTORS_TAB,
+ FILES_TAB,
+ MODELS_TAB,
+ TAG_FILTER_LATEST
+} from '../constants'
export const generateStoreResourceLink = (input, projectName) => {
if ([MODELS_TAB, DATASETS_TAB].includes(input.kind)) {
@@ -27,17 +33,17 @@ export const generateStoreResourceLink = (input, projectName) => {
}
const inputsLinks = {
- model: `/projects/${projectName}/models/${MODELS_TAB}/${
+ model: `${process.env.PUBLIC_URL}/projects/${projectName}/models/${MODELS_TAB}/${
input.db_key || input.key
}/${input.tag ?? input.tree ?? TAG_FILTER_LATEST}${input.iter ? `/${input.iter}` : ''}/overview`,
- dataset: `/projects/${projectName}/${DATASETS_TAB}/${
+ dataset: `${process.env.PUBLIC_URL}/projects/${projectName}/${DATASETS_TAB}/${
input.db_key || input.key
}/${input.tag ?? input.tree ?? TAG_FILTER_LATEST}${input.iter ? `/${input.iter}` : ''}/overview`,
- files: `/projects/${projectName}/${FILES_TAB}/${input.db_key || input.key}/${input.tag ?? input.tree ?? TAG_FILTER_LATEST}${
+ files: `${process.env.PUBLIC_URL}/projects/${projectName}/${FILES_TAB}/${input.db_key || input.key}/${input.tag ?? input.tree ?? TAG_FILTER_LATEST}${
input.iter ? `/${input.iter}` : ''
}/overview`,
- FeatureVector: `/projects/${projectName}/feature-store/${FEATURE_VECTORS_TAB}/${input.name ?? input.key}/${input.tag ?? input.uid ?? TAG_FILTER_LATEST}/overview`
+ FeatureVector: `${process.env.PUBLIC_URL}/projects/${projectName}/feature-store/${FEATURE_VECTORS_TAB}/${input.name ?? input.key}/${input.tag ?? input.uid ?? TAG_FILTER_LATEST}/overview`
}
- return input ? inputsLinks[input.kind] ?? inputsLinks.files : ''
+ return input ? (inputsLinks[input.kind] ?? inputsLinks.files) : ''
}
diff --git a/src/utils/getNoDataMessage.js b/src/utils/getNoDataMessage.js
index 0772426fb..f719e2d9d 100644
--- a/src/utils/getNoDataMessage.js
+++ b/src/utils/getNoDataMessage.js
@@ -53,7 +53,9 @@ import {
PROJECT_FILTER,
TYPE_FILTER,
CONSUMER_GROUP_PAGE,
- CONSUMER_GROUPS_PAGE
+ CONSUMER_GROUPS_PAGE,
+ MONITOR_JOBS_TAB,
+ SCHEDULE_TAB
} from '../constants'
const messageNamesList = {
@@ -87,6 +89,12 @@ const messageNamesList = {
[MONITOR_WORKFLOWS_TAB]: {
plural: 'Workflows'
},
+ [MONITOR_JOBS_TAB]: {
+ plural: 'Jobs'
+ },
+ [SCHEDULE_TAB]: {
+ plural: 'Scheduled jobs'
+ },
[MODEL_ENDPOINTS_TAB]: {
plural: 'Model endpoints'
},
@@ -149,7 +157,12 @@ const getSelectedDateValue = (filterType, filtersStore, filtersStoreKey) => {
)
return (filterType === DATE_RANGE_TIME_FILTER &&
- !isEqual(filtersStore.dates.value, DATE_FILTER_ANY_TIME)) ||
+ (filtersStoreKey
+ ? !isEqual(
+ filtersStore[FILTER_MENU][filtersStoreKey].values[DATES_FILTER].value[0],
+ DATE_FILTER_ANY_TIME
+ )
+ : !isEqual(filtersStore.dates.value, DATE_FILTER_ANY_TIME))) ||
(filterType === DATES_FILTER &&
!isEqual(
filtersStore[FILTER_MENU][filtersStoreKey].values[DATES_FILTER].value,
@@ -172,9 +185,9 @@ const generateNoEntriesFoundMessage = (
? 'true'
: filterType === DATE_RANGE_TIME_FILTER || filterType === DATES_FILTER
? getSelectedDateValue(filterType, filtersStore, filtersStoreKey)
- : filtersStore[FILTER_MENU][filtersStoreKey]?.values?.[filterType] ??
+ : (filtersStore[FILTER_MENU][filtersStoreKey]?.values?.[filterType] ??
filtersStore[FILTER_MENU_MODAL][filtersStoreKey]?.values?.[filterType] ??
- filtersStore[filterType]
+ filtersStore[filterType])
const isLastElement = index === visibleFilterTypes.length - 1
return message + `${label} ${value}${isLastElement ? '"' : ', '}`
@@ -202,7 +215,7 @@ const getVisibleFilterTypes = (filtersConfig, filtersStore, filtersStoreKey) =>
type === LABELS_FILTER ||
type === ENTITIES_FILTER ||
type === PROJECT_FILTER) &&
- (filtersStore[type].length > 0 ||
+ (filtersStore[type]?.length > 0 ||
filtersStore[FILTER_MENU][filtersStoreKey]?.values?.[type]?.length > 0 ||
filtersStore[FILTER_MENU_MODAL][filtersStoreKey]?.values?.[type]?.length > 0)
const isStatusVisible =
@@ -220,7 +233,12 @@ const getVisibleFilterTypes = (filtersConfig, filtersStore, filtersStoreKey) =>
)
const isDateVisible =
(type === DATE_RANGE_TIME_FILTER &&
- !isEqual(filtersStore.dates.value, DATE_FILTER_ANY_TIME)) ||
+ !isEqual(
+ filtersStoreKey
+ ? filtersStore[FILTER_MENU][filtersStoreKey]?.values?.dates?.value
+ : filtersStore?.dates?.value,
+ DATE_FILTER_ANY_TIME
+ )) ||
(type === DATES_FILTER &&
!isEqual(
filtersStore[FILTER_MENU][filtersStoreKey]?.values?.[DATES_FILTER]?.value,
diff --git a/src/utils/getState.js b/src/utils/getState.js
index 71445e322..b9715377b 100644
--- a/src/utils/getState.js
+++ b/src/utils/getState.js
@@ -20,12 +20,12 @@ such restriction.
import { isEmpty } from 'lodash'
import {
- ERROR_STATE,
+ ERROR_STATE,
FAIL_STATE,
- FAILED_STATE,
- FUNCTION_INITIALIZED_STATE,
+ FAILED_STATE, FUNCTION_INITIALIZED_STATE,
FUNCTIONS_PAGE,
- JOBS_MONITORING_WORKFLOWS_TAB
+ JOBS_MONITORING_WORKFLOWS_TAB,
+ MONITOR_WORKFLOWS_TAB
} from '../constants'
const errorStates = [ERROR_STATE, FAIL_STATE, FAILED_STATE]
@@ -42,7 +42,7 @@ const getState = (state, page, kind, reason = '') => {
}`
}
} else {
- const commonLabel = state ? commonStateLabels(page === JOBS_MONITORING_WORKFLOWS_TAB)[state] : ''
+ const commonLabel = state ? commonStateLabels(page === JOBS_MONITORING_WORKFLOWS_TAB || page === MONITOR_WORKFLOWS_TAB)[state] : ''
const label = reason && errorStates.includes(state) ? `${commonLabel}. Reason: ${reason}` : commonLabel
return {
diff --git a/src/utils/jobs.util.js b/src/utils/jobs.util.js
new file mode 100644
index 000000000..55b9daa23
--- /dev/null
+++ b/src/utils/jobs.util.js
@@ -0,0 +1,63 @@
+/*
+Copyright 2019 Iguazio Systems Ltd.
+
+Licensed under the Apache License, Version 2.0 (the "License") with
+an addition restriction as set forth herein. 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.
+
+In addition, you may not use the software for any purposes that are
+illegal under applicable law, and the grant of the foregoing license
+under the Apache 2.0 license is conditioned upon your compliance with
+such restriction.
+*/
+
+import {
+ DATES_FILTER,
+ LABELS_FILTER,
+ NAME_FILTER,
+ PROJECT_FILTER,
+ STATUS_FILTER,
+ TYPE_FILTER
+} from '../constants'
+
+export const getJobKindFromLabels = (labels = []) => {
+ return labels.find(label => label.includes('kind:'))?.replace('kind: ', '') ?? ''
+}
+
+export const getJobsFiltersConfig = jobName => {
+ return {
+ [NAME_FILTER]: { label: 'Name:', hidden: Boolean(jobName) },
+ [DATES_FILTER]: { label: 'Start time:' },
+ [PROJECT_FILTER]: { label: 'Project:' },
+ [STATUS_FILTER]: { label: 'Status:' },
+ [TYPE_FILTER]: { label: 'Type:' },
+ [LABELS_FILTER]: { label: 'Labels:' }
+ }
+}
+
+export const getWorkflowsFiltersConfig = () => {
+ return {
+ [NAME_FILTER]: { label: 'Name:' },
+ [DATES_FILTER]: { label: 'Created at:' },
+ [PROJECT_FILTER]: { label: 'Project:' },
+ [STATUS_FILTER]: { label: 'Status:' },
+ [LABELS_FILTER]: { label: 'Labels:' }
+ }
+}
+
+export const getScheduledFiltersConfig = () => {
+ return {
+ [NAME_FILTER]: { label: 'Name:' },
+ [DATES_FILTER]: { label: 'Scheduled at:', isFuture: true },
+ [PROJECT_FILTER]: { label: 'Project:' },
+ [TYPE_FILTER]: { label: 'Type:' },
+ [LABELS_FILTER]: { label: 'Labels:' }
+ }
+}
diff --git a/src/utils/parseJob.js b/src/utils/parseJob.js
index 38c3391f3..99e0d905a 100644
--- a/src/utils/parseJob.js
+++ b/src/utils/parseJob.js
@@ -26,6 +26,7 @@ import {
SCHEDULE_TAB
} from '../constants'
import getState from './getState'
+import { getJobKindFromLabels } from './jobs.util'
import { getJobIdentifier } from './getUniqueIdentifier'
import { parseKeyValues } from './object'
import { convertTriggerToCrontab } from '../components/Jobs/jobs.util'
@@ -52,9 +53,16 @@ export const parseJob = (job, tab, customState, customError) => {
: convertTriggerToCrontab(job.scheduled_object?.schedule)
},
startTime: new Date(job.last_run?.status?.start_time),
- state: getState(job.last_run?.status?.state, JOBS_PAGE, JOB_KIND_JOB),
+ state: getState(
+ job.last_run?.status?.state,
+ JOBS_PAGE,
+ JOB_KIND_JOB,
+ job.last_run?.status?.reason ?? job.last_run?.status?.error
+ ),
type:
- job.kind === JOB_KIND_PIPELINE || jobHasWorkflowLabel(job) ? JOB_KIND_WORKFLOW : job.kind,
+ job.kind === JOB_KIND_PIPELINE || jobHasWorkflowLabel(job)
+ ? JOB_KIND_WORKFLOW
+ : getJobKindFromLabels(parseKeyValues(job.labels || {})),
ui: {
originalContent: job
}
@@ -95,7 +103,7 @@ export const parseJob = (job, tab, customState, customError) => {
customState || job.status?.state,
JOBS_PAGE,
JOB_KIND_JOB,
- job.status?.reason
+ job.status?.reason ?? job.status?.error
),
ui_run: job.status?.ui_url,
uid: job.metadata.uid,
diff --git a/src/utils/resultsTable.js b/src/utils/resultsTable.js
index d0642ca2a..1a6832147 100644
--- a/src/utils/resultsTable.js
+++ b/src/utils/resultsTable.js
@@ -46,11 +46,13 @@ export const generateResultsContent = job => {
{
headerId: 'name',
headerLabel: 'Name',
+ className: 'table-cell-3',
value: resultName
},
{
headerId: 'value',
headerLabel: 'Value',
+ className: 'table-cell-8',
value: String(resultValue ?? '')
}
]
diff --git a/src/utils/scroll.util.js b/src/utils/scroll.util.js
index fed18fcfd..9316e74d3 100644
--- a/src/utils/scroll.util.js
+++ b/src/utils/scroll.util.js
@@ -31,10 +31,23 @@ export const scrollToElement = (
shouldScrollToTop
? parentRef.current.scrollTo({ top: 0, left: 0, behavior: 'smooth' })
: setTimeout(() => {
- selectedElement.scrollIntoView({
- behavior: 'smooth',
- block: 'center',
- inline: 'start'
- })
+ scrollToCenter(parentRef?.current, selectedElement)
}, timeoutDuration)
}
+
+const scrollToCenter = (container, element) => {
+ const containerRect = container.getBoundingClientRect()
+ const elementRect = element.getBoundingClientRect()
+
+ const scrollTop =
+ container.scrollTop +
+ elementRect.top -
+ containerRect.top -
+ container.clientHeight / 2 +
+ elementRect.height / 2
+
+ container.scrollTo({
+ top: scrollTop,
+ behavior: 'smooth'
+ })
+}
diff --git a/tests/features/MLFunction.feature b/tests/features/MLFunction.feature
index a7a2c1e4f..7d949eae9 100644
--- a/tests/features/MLFunction.feature
+++ b/tests/features/MLFunction.feature
@@ -699,7 +699,7 @@ Feature: ML Functions
When collapse "Resources_Accordion" on "New_Function" wizard
Then "Deploy_Button" element on "New_Function" should contains "Create" value
Then click on "Deploy_Button" element on "New_Function" wizard
- Then click on "Cross_Close_Button" element on "ML_Function_Info_Pane" wizard
+ And wait load page
Then check "new-aqa-function-01" value in "name" column in "Functions_Table" table on "ML_Functions" wizard
@MLF
@@ -1079,7 +1079,7 @@ Feature: ML Functions
Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
Then click on "Cross_Cancel_Button" element on "View_YAML" wizard
- Then click on cell with row index 9 in "expand_btn" column in "Functions_Table" table on "ML_Functions" wizard
+ Then click on cell with row index 8 in "expand_btn" column in "Functions_Table" table on "ML_Functions" wizard
And wait load page
Then select "View YAML" option in action menu on "ML_Functions" wizard in "Functions_Table" table at row with "Nov 23, 2021, 11:31:51 AM" value in "name" column
Then verify if "View_YAML" popup dialog appears
@@ -1321,6 +1321,8 @@ Feature: ML Functions
When click on cell with row index 1 in "name" column in "Functions_Table" table on "ML_Functions" wizard
And wait load page
Then verify redirection from "projects/default/functions/INVALID/latest/overview" to "projects/default/functions"
+ And wait load page
+ And wait load page
Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
And wait load page
Then "Notification_Pop_Up" element on "Notification_Popup" should contains "This function either does not exist or was deleted" value
@@ -1334,16 +1336,16 @@ Feature: ML Functions
Then verify "Date_Picker_Filter_Dropdown" element visibility on "ML_Functions" wizard
When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "ML_Functions" wizard
And wait load page
- When click on cell with row index 1 in "name" column in "Functions_Table" table on "ML_Functions" wizard
+ When click on cell with row index 2 in "name" column in "Functions_Table" table on "ML_Functions" wizard
And wait load page
- Then verify redirection from "projects/default/functions/85957751e571a92e07213781f5e0c35bfbe42c64/INVALID" to "projects/default/functions/85957751e571a92e07213781f5e0c35bfbe42c64/overview"
+ Then verify redirection from "projects/default/functions/model-monitoring-stream/latest/INVALID" to "projects/default/functions/model-monitoring-stream/latest/overview"
Then select "Code" tab in "Info_Pane_Tab_Selector" on "ML_Function_Info_Pane" wizard
And wait load page
- Then verify redirection from "projects/default/functions/85957751e571a92e07213781f5e0c35bfbe42c64/INVALID" to "projects/default/functions/85957751e571a92e07213781f5e0c35bfbe42c64/overview"
+ Then verify redirection from "projects/default/functions/model-monitoring-stream/latest/INVALID" to "projects/default/functions/model-monitoring-stream/latest/overview"
Then select "Build Log" tab in "Info_Pane_Tab_Selector" on "ML_Function_Info_Pane" wizard
And wait load page
- Then verify redirection from "projects/default/functions/85957751e571a92e07213781f5e0c35bfbe42c64/INVALID" to "projects/default/functions/85957751e571a92e07213781f5e0c35bfbe42c64/overview"
- Then verify redirection from "projects/default/INVALID/85957751e571a92e07213781f5e0c35bfbe42c64/overview" to "projects"
+ Then verify redirection from "projects/default/functions/model-monitoring-stream/latest/INVALID" to "projects/default/functions/model-monitoring-stream/latest/overview"
+ Then verify redirection from "projects/default/INVALID/model-monitoring-stream/latest/overview" to "projects"
@MLF
@smoke
@@ -1412,8 +1414,19 @@ Feature: ML Functions
Then verify "New_Function_Build_Commands_Text_Area" not input element in "Code_Accordion" on "New_Function" wizard is enabled
Then click on "Save_Button" element on "New_Function" wizard
And wait load page
- Then "Header" element on "ML_Function_Info_Pane" should contains "demo-function-02" value
+ Then check "demo-function-02" value in "name" column in "Functions_Table" table on "ML_Functions" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "ML_Functions" wizard
+ Then click on "Table_FilterBy_Button" element on "ML_Functions" wizard
+ Then "Title" element on "FilterBy_Popup" should contains "Filter by" value
+ Then verify "Show_Untagged" element visibility on "FilterBy_Popup" wizard
+ Then check "Show_Untagged" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And wait load page
+ Then check "demo-function-02" value in "name" column in "Functions_Table" table on "ML_Functions" wizard
+ When click on cell with value "demo-function-02" in "name" column in "Functions_Table" table on "ML_Functions" wizard
Then check "demo-function-02" value in "name" column in "Overview_Table" table on "ML_Function_Info_Pane" wizard
+ Then "Header" element on "ML_Function_Info_Pane" should contains "demo-function-02" value
@MLF
@passive
diff --git a/tests/features/artifacts.feature b/tests/features/artifacts.feature
index 60c8094c0..c8d5548b2 100644
--- a/tests/features/artifacts.feature
+++ b/tests/features/artifacts.feature
@@ -756,7 +756,7 @@ Feature: Artifacts Page
Then verify "Add_Tag_Popup" element visibility on "Add_Tag_Popup" wizard
Then verify "Close_Button" element visibility on "Add_Tag_Popup" wizard
Then verify "Title" element visibility on "Add_Tag_Popup" wizard
- # Then "Title" element on "Add_Tag_Popup" should contains "Add a tag" value - bug 'Add A Tag'
+ Then "Title" element on "Add_Tag_Popup" should contains "Add A Tag" value
Then verify "Input_Label" element visibility on "Add_Tag_Popup" wizard
Then "Input_Label" element on "Add_Tag_Popup" should contains "Artifact tag *" value
Then verify "Tag_Input" element visibility on "Add_Tag_Popup" wizard
diff --git a/tests/features/common-tools/common-consts.js b/tests/features/common-tools/common-consts.js
index 76167584a..842bcaf1e 100644
--- a/tests/features/common-tools/common-consts.js
+++ b/tests/features/common-tools/common-consts.js
@@ -53,7 +53,7 @@ module.exports = {
'Azure storage',
'Google storage',
'Databricks filesystem'
- ]
+ ]
},
Real_Time_Pipeline_Pane: {
Overview_Headers: [
@@ -241,10 +241,10 @@ module.exports = {
'Stream path:'
],
Overview_Drift_Headers: [
- 'Mean TVD:',
- 'Mean Hellinger:',
- 'Mean KLD:',
- 'Drift Actual Value:',
+ 'Mean TVD:',
+ 'Mean Hellinger:',
+ 'Mean KLD:',
+ 'Drift Actual Value:',
'Drift Detected Threshold:',
'Possible Drift Threshold:'
]
@@ -310,7 +310,7 @@ module.exports = {
'Google storage',
'Databricks filesystem'
],
- Register_Error_Message: /That combination of name and tag is already in use in an existing (artifact|dataset|plotly|table)\. If you proceed, the existing (artifact|dataset|plotly|table) will be overwritten/
+ Register_Error_Message: /That combination of name and tag is already in use in an existing (artifact|dataset|plotly|table)\. If you proceed, the existing (artifact|dataset|plotly|table) will be overwritten/
},
Register_Dataset: {
Type_Options: ['General', 'Chart', 'Plot', 'Table'],
@@ -326,13 +326,17 @@ module.exports = {
'Azure storage',
'Google storage',
'Databricks filesystem'
- ]
+ ]
},
Project_Settings: {
Tab_List: ['General', 'Members', 'Secrets'],
Secrets_Hint:
'These secrets are automatically available to all jobs belonging to this project that are not executed locally. See Secrets'
},
+ Common_Tooltips:{
+ FilterBy_Button: 'Filter',
+ Refresh_Button: 'Refresh'
+ },
Input_Hint: {
Artifact_Names_Unique: 'Artifact names in the same project must be unique',
Dataset_Names_Unique: 'Dataset names in the same project must be unique',
@@ -481,10 +485,11 @@ module.exports = {
Job_Action_Menu_Options: ['Batch re-run', 'Monitoring', 'View YAML', 'Delete'],
Job_Overview_Action_Menu_Options: ['View YAML', 'Batch re-run', 'Delete'],
Running_Job_Action_Menu_Options: ['Monitoring', 'Abort', 'View YAML'],
- Workflows_Action_Menu_Options: ['View YAML'],
+ Workflows_Action_Menu_Options: ['View YAML', 'Retry'],
Workflows_Info_Pane_Action_Menu_Options: ['Batch re-run', 'Monitoring', 'View YAML', 'Delete'],
Pending_Job_Action_Menu_Options: ['Batch re-run', 'Monitoring', 'Abort', 'View YAML'],
- Schedule_Action_Menu_Options: ['Run now', 'Edit', 'Delete', 'View YAML']
+ Schedule_Action_Menu_Options: ['Run now', 'Edit', 'Delete', 'View YAML'],
+ Workflows_Unsuccessful_Run_Message: 'Workflow did not run successfully\nRETRY'
},
Jobs_Monitor_Tab_Info_Pane: {
Tab_List: ['Overview', 'Inputs', 'Artifacts', 'Results', 'Logs', 'Pods'],
@@ -495,6 +500,7 @@ module.exports = {
'Run on spot:',
'Node selector:',
'Priority:',
+ 'Handler:',
'Parameters:',
'Function:',
'Function tag:',
@@ -598,6 +604,9 @@ module.exports = {
},
No_Data_Message: {
Common_Message_Jobs_Monitoring: /No data matches the filter: "Start time: \d{2}\/\d{2}\/\d{4} \d{2}:\d{2} - \d{2}\/\d{2}\/\d{4} \d{2}:\d{2}, Project: test"/,
+ Common_Message_Jobs_Monitoring_Status: /No data matches the filter: "Created at: \d{2}\/\d{2}\/\d{4} \d{2}:\d{2} - \d{2}\/\d{2}\/\d{4} \d{2}:\d{2}, Status: (.+?)"/,
+ Common_Message_Jobs_Monitoring_Type: /No data matches the filter: "Start time: \d{2}\/\d{2}\/\d{4} \d{2}:\d{2} - \d{2}\/\d{2}\/\d{4} \d{2}:\d{2}, Type: (.+?)"/,
+ Common_Message_Monitor_Jobs: /No data matches the filter: "Start time: \d{2}\/\d{2}\/\d{4} \d{2}:\d{2} - \d{2}\/\d{2}\/\d{4} \d{2}:\d{2}"/,
Common_Message_Jobs_Monitoring_Scheduled: /No data matches the filter: "Scheduled at: \d{2}\/\d{2}\/\d{4} \d{2}:\d{2} - \d{2}\/\d{2}\/\d{4} \d{2}:\d{2}, Project: test"/,
Common_Message: 'No data matches the filter: "Version Tag: latest, Name: ccccc"',
Common_Message_Feature: 'No data matches the filter: "Version Tag: latest"',
diff --git a/tests/features/common-tools/common-tools.js b/tests/features/common-tools/common-tools.js
index c36c0796b..4383c2891 100644
--- a/tests/features/common-tools/common-tools.js
+++ b/tests/features/common-tools/common-tools.js
@@ -17,6 +17,7 @@ illegal under applicable law, and the grant of the foregoing license
under the Apache 2.0 license is conditioned upon your compliance with
such restriction.
*/
+import axios from 'axios'
import { generateRegEx, getLength, getNotToBe, getRule } from './utils'
import {
deleteAPIArtifact,
@@ -39,10 +40,16 @@ module.exports = {
return result.join('')
}
},
- generateInputGroup: function (root, label = false, hint = false, warning = false, input = 'input') {
+ generateInputGroup: function (
+ root,
+ label = false,
+ hint = false,
+ warning = false,
+ input = 'input'
+ ) {
const structure = { root, elements: {} }
structure.elements.input = input
-
+
if (label) {
structure.elements.label = 'label'
}
@@ -81,7 +88,7 @@ module.exports = {
if (warning) {
structure.elements.warningHint = typeof warning === 'string' ? warning : '.range__warning svg'
structure.elements.warningText = '.tooltip .tooltip__text'
- }
+ }
return structure
},
@@ -187,5 +194,15 @@ module.exports = {
return null
}
})
+ },
+ setRequestsFailureCondition: async shouldFail => {
+ try {
+ const response = await axios.post('http://localhost:30000/set-failure-condition', {
+ shouldFail
+ })
+ console.log(response.data)
+ } catch (error) {
+ console.error(`Error setting failure condition: ${error}`)
+ }
}
}
diff --git a/tests/features/common/actions/common.action.js b/tests/features/common/actions/common.action.js
index c771a4bad..a02adec3d 100644
--- a/tests/features/common/actions/common.action.js
+++ b/tests/features/common/actions/common.action.js
@@ -255,6 +255,19 @@ const action = {
await driver.executeScript('arguments[0].scrollIntoView()', element)
await driver.sleep(250)
},
+ checkComponentHintTextWithHover:async function (driver, component, hintComponent, text) {
+ const hintButton = await driver.findElement(component)
+ const coordinates = await hintButton.getRect()
+ const actions = driver.actions({ async: true })
+ await actions
+ .move({ x: parseInt(coordinates.x), y: parseInt(coordinates.y) })
+ .perform()
+ await driver.sleep(250)
+ const hint = await driver.findElement(hintComponent)
+ const hintText = await hint.getText()
+
+ expect(hintText).equal(text)
+ },
scrollToWebElement
}
diff --git a/tests/features/common/actions/table.action.js b/tests/features/common/actions/table.action.js
index a2d714693..e4097aaea 100644
--- a/tests/features/common/actions/table.action.js
+++ b/tests/features/common/actions/table.action.js
@@ -81,7 +81,7 @@ const action = {
`Value "${subString}" does not includes in all values: [${arr}]`
)
},
- isContainsSubstringInColumnAttributrCells: async function(
+ isContainsSubstringInColumnAttributeCells: async function(
driver,
table,
columnName,
@@ -94,6 +94,19 @@ const action = {
`Value "${value}" does not includes in all values: [${arr}]`
)
},
+ isContainsSubstringInColumnAttributeListCells: async function(
+ driver,
+ table,
+ columnName,
+ value
+ ) {
+ const arr = await getColumnValuesAttribute(driver, table, columnName)
+ expect(arr.length > 0).to.equal(true)
+ expect(arr.every(item => value.includes(item))).to.equal(
+ true,
+ `Value "${value}" does not includes in all values: [${arr}]`
+ )
+ },
isContainsSubstringInColumnDropdownCells: async function(
driver,
table,
diff --git a/tests/features/common/page-objects.js b/tests/features/common/page-objects.js
index 432e42fa1..87defd53f 100644
--- a/tests/features/common/page-objects.js
+++ b/tests/features/common/page-objects.js
@@ -73,6 +73,7 @@ module.exports = {
Metrics_Selector_Popup: interactivePopup['metricsSelectorPopup'],
ML_Function_Info_Pane: infoPane['mlFunctionInfoPane'],
ML_Functions: Functions['mlFunctions'],
+ MLRun_Unhealthy_PopUp: interactivePopup['mLRunUnhealthyPopUp'],
Model_Endpoints: models['modelEndpoints'],
Models: models['modelsTab'],
Models_Info_Pane: infoPane['modelsInfoPane'],
diff --git a/tests/features/common/page-objects/feature-store.po.js b/tests/features/common/page-objects/feature-store.po.js
index 305f5d8ce..845e27d45 100644
--- a/tests/features/common/page-objects/feature-store.po.js
+++ b/tests/features/common/page-objects/feature-store.po.js
@@ -340,14 +340,14 @@ const datasetsTable = {
// Common components
const featureStoreTabSelector = commonTable(tabSelector)
const tableRefreshButton = By.css('.content__action-bar-wrapper [data-testid="refresh"]')
-const tableFilterByButton = By.css('.content .content__action-bar-wrapper .action-bar__filters .filters-button button')
-const pageHeaderButton = By.css('.content__header .page-actions-container button')
+const tableFilterByButton = By.css('[data-testid="filter-menu-btn"]')
+const pageHeaderButton = By.css('[data-testid="btn"]')
const commonNameFilterInput = inputGroup(
generateInputGroup(
- '.content .content__action-bar-wrapper .filters .filter-column:nth-of-type(2) .input-wrapper',
+ '[data-testid="name-form-field-input"]',
true,
false,
- true
+ '.form-field__warning svg'
)
)
const commonNameFilterInputDataset = inputGroup(
@@ -363,7 +363,7 @@ const commonLabelFilterInput = inputGroup(
'.content .content__action-bar-wrapper .filters .filter-column:nth-of-type(3) .input-wrapper',
true,
false,
- true
+ '.form-field__warning svg'
)
)
const commonTableTreeFilterDropdown = dropdownComponent(
@@ -378,6 +378,7 @@ const commonTableTreeFilterDropdown = dropdownComponent(
module.exports = {
featureSetsTab: {
+ Table_FilterBy_Button: tableFilterByButton,
Table_Refresh_Button: tableRefreshButton,
Create_Set_Button: pageHeaderButton,
Table_Expand_Rows_Button: By.css(
@@ -392,6 +393,7 @@ module.exports = {
},
featuresTab: {
Feature_Store_Tab_Selector: featureStoreTabSelector,
+ Table_FilterBy_Button: tableFilterByButton,
Add_To_Feature_Vector_Button: By.css(
'.content .content__action-bar-wrapper .action-bar button.btn-secondary'
),
@@ -404,6 +406,7 @@ module.exports = {
featureVectorsTab: {
Feature_Store_Tab_Selector: featureStoreTabSelector,
Create_Vector_Button: pageHeaderButton,
+ Table_FilterBy_Button: tableFilterByButton,
Table_Name_Filter_Input: commonNameFilterInput,
Table_Label_Filter_Input: commonLabelFilterInput,
Table_Tag_Filter_Dropdown: commonTableTreeFilterDropdown,
@@ -422,6 +425,7 @@ module.exports = {
},
addToFeatureVector: {
Table_Tree_Filter_Dropdown: commonTableTreeFilterDropdown,
+ Table_FilterBy_Button: tableFilterByButton,
Table_Name_Filter_Input: commonNameFilterInput,
Table_Entity_Filter_Input: inputGroup(
generateInputGroup(
@@ -450,7 +454,7 @@ module.exports = {
Table_Refresh_Button: tableRefreshButton,
Add_To_Feature_Vector_Table: commonTable(addToFeatureVectorTable),
Add_Button: By.css('.features-panel__buttons .btn-primary'),
- Cancel_Button: By.css('.features-panel__buttons .btn-label'),
+ Cancel_Button: By.css('.features-panel__buttons .btn-tertiary'),
Features_Panel_Title: labelComponent(
generateLabelGroup('.add-to-feature-vector .features-panel__header', false, true)
),
diff --git a/tests/features/common/page-objects/info-pane.po.js b/tests/features/common/page-objects/info-pane.po.js
index ca2f9a74a..10b9bfb5d 100644
--- a/tests/features/common/page-objects/info-pane.po.js
+++ b/tests/features/common/page-objects/info-pane.po.js
@@ -688,6 +688,8 @@ module.exports = {
Cross_Close_Button: crossCloseButton,
Info_Pane_Tab_Selector: commonInfoPaneTabSelector,
Overview_Headers: commonTable(infoPaneOverviewHeaders),
+ Resource_Monitoring_Button: By.css('.item-header__buttons .btn-tertiary'),
+ Info_Pane_Refresh_Button: By.css('.item-header__buttons [data-testid="refresh"]'),
// Logs tab.
Logs_Text_container: By.css('.table__item .table__item-logs-content'),
diff --git a/tests/features/common/page-objects/interactive-popup.po.js b/tests/features/common/page-objects/interactive-popup.po.js
index 9a1152566..b7e38d09a 100644
--- a/tests/features/common/page-objects/interactive-popup.po.js
+++ b/tests/features/common/page-objects/interactive-popup.po.js
@@ -137,10 +137,10 @@ const artifactsPreviewRow = {
}
const artifactsPreviewHeader = {
- root: '.pop-up-dialog',
+ root: '.pop-up-dialog',
header: {},
body: {
- root: '.preview-body',
+ root: '.preview-body',
row: {
root: '.preview-item:nth-of-type(1)',
fields: {
@@ -189,8 +189,7 @@ const artifactsLabelsTable = {
}
const labelsTable = {
- root:
- '.job-wizard__run-details .form-row:nth-of-type(4) .chips',
+ root: '.job-wizard__run-details .form-row:nth-of-type(4) .chips',
header: {},
body: {
root: '.chips-wrapper',
@@ -209,8 +208,7 @@ const labelsTable = {
}
const newProjectLabelsTable = {
- root:
- '.create-project-dialog .form-row:nth-of-type(4) .chips',
+ root: '.create-project-dialog .form-row:nth-of-type(4) .chips',
header: {},
body: {
root: '.chips-wrapper',
@@ -229,10 +227,10 @@ const newProjectLabelsTable = {
}
const dataInputsHeaders = {
- root: '.wizard-form__content [data-testid="dataInputs.dataInputsTable"]',
+ root: '.wizard-form__content [data-testid="dataInputs.dataInputsTable"]',
header: {},
body: {
- root: '.form-table__header-row',
+ root: '.form-table__header-row',
row: {
root: '.form-table__cell',
fields: {
@@ -243,10 +241,10 @@ const dataInputsHeaders = {
}
const parametersHeaders = {
- root: '.wizard-form__content [data-testid="parameters.parametersTable"]',
+ root: '.wizard-form__content [data-testid="parameters.parametersTable"]',
header: {},
body: {
- root: '.form-table__header-row',
+ root: '.form-table__header-row',
row: {
root: '.form-table__cell',
fields: {
@@ -259,19 +257,18 @@ const parametersHeaders = {
const podsPriorityDropdown = dropdownComponent(
generateDropdownGroup(
'.modal__content .modal__body .job-wizard__resources .resources__select',
- '.form-field-select .form-field__wrapper-normal',
+ '.form-field-select .form-field__wrapper-normal',
'.options-list__body .select__item-label',
'.data-ellipsis'
)
)
const resourcesNodeSelectorTable = {
- root:
- '.wizard-form__content [data-testid="resources.nodeSelectorTable"]',
+ root: '.wizard-form__content [data-testid="resources.nodeSelectorTable"]',
header: {
sorters: {
key: '.form-table__cell_1:nth-of-type(1)',
- value: '.form-table__cell_1:nth-of-type(2)',
+ value: '.form-table__cell_1:nth-of-type(2)'
}
},
body: {
@@ -290,12 +287,7 @@ const resourcesNodeSelectorTable = {
},
value_input: {
componentType: inputGroup,
- structure: generateInputGroup(
- '.form-table__cell_1:nth-of-type(2)',
- true,
- false,
- false
- )
+ structure: generateInputGroup('.form-table__cell_1:nth-of-type(2)', true, false, false)
}
}
}
@@ -311,14 +303,13 @@ const actionMenuStructure = {
}
const volumePathsTable = {
- root:
- '.modal__content .form-row:nth-of-type(7)',
+ root: '.modal__content .form-row:nth-of-type(7)',
header: {
root: '.form-table__header-row',
sorters: {
type: '.form-table__cell:nth-of-type(1)',
volume_name: '.form-table__cell:nth-of-type(2)',
- path: '.form-table__cell:nth-of-type(3)',
+ path: '.form-table__cell:nth-of-type(3)'
}
},
body: {
@@ -362,10 +353,8 @@ const dataInputsInferenceTable = {
)
}
}
-
}
}
-
}
const dataInputsTable = {
root: '.wizard-form__content [data-testid="dataInputs.dataInputsTable"]',
@@ -384,50 +373,55 @@ const dataInputsTable = {
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)
+ '.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_dropdown_autocomplete_artifacts: {
componentType: dropdownComponent,
structure: generateDropdownGroup(
- '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
- '.form-field-combobox__input',
- '.form-field-combobox__dropdown-list-option',
- false,
- false)
+ '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
+ '.form-field-combobox__input',
+ '.form-field-combobox__dropdown-list-option',
+ false,
+ false
+ )
},
path_dropdown_autocomplete_project: {
componentType: dropdownComponent,
structure: generateDropdownGroup(
- '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
- '.form-field-combobox__input',
- '.form-field-combobox__dropdown-list-option',
- false,
- false)
+ '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
+ '.form-field-combobox__input',
+ '.form-field-combobox__dropdown-list-option',
+ false,
+ false
+ )
},
path_dropdown_autocomplete_item: {
componentType: dropdownComponent,
structure: generateDropdownGroup(
- '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
- '.form-field-combobox__input',
- '.form-field-combobox__dropdown-list-option',
- false,
- false)
+ '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
+ '.form-field-combobox__input',
+ '.form-field-combobox__dropdown-list-option',
+ false,
+ false
+ )
},
path_dropdown_autocomplete_tag: {
componentType: dropdownComponent,
structure: generateDropdownGroup(
- '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
- '.form-field-combobox__input',
- '.form-field-combobox__dropdown-list-option',
- false,
- false)
+ '.form-table__cell_1:nth-of-type(3) .form-field-combobox',
+ '.form-field-combobox__input',
+ '.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)'
+ path_verify: '.form-table__cell_1:nth-of-type(3)'
}
}
}
@@ -449,15 +443,16 @@ const parametersTable = {
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)
+ '.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',
+ 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'
+ value_verify: '.form-table__cell_3 .data-ellipsis'
}
}
}
@@ -481,16 +476,18 @@ const advancedEnvironmentVariablesTable = {
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)
+ '.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',
+ 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',
- value_input_key: '.form-table__cell_3 .form-field-input:nth-of-type(2) .form-field__control input'
+ value_input_key:
+ '.form-table__cell_3 .form-field-input:nth-of-type(2) .form-field__control input'
}
}
}
@@ -503,12 +500,9 @@ const functionsTableSelector = {
row: {
root: '.job-card-template',
fields: {
- name:
- '.job-card-template__header > div:first-child',
- sub_name:
- '.job-card-template__header .job-card-template__sub-header .data-ellipsis',
- description:
- '.job-card-template__description',
+ name: '.job-card-template__header > div:first-child',
+ sub_name: '.job-card-template__header .job-card-template__sub-header .data-ellipsis',
+ description: '.job-card-template__description',
labels: {
componentType: dropdownComponent,
structure: generateDropdownGroup(
@@ -571,8 +565,7 @@ const categorySelect = dropdownComponent(
)
const runDetailsLabelsTable = {
- root:
- '.job-wizard__run-details .form-row:nth-of-type(4) .chips',
+ root: '.job-wizard__run-details .form-row:nth-of-type(4) .chips',
header: {},
body: {
root: '.chips-wrapper',
@@ -597,10 +590,8 @@ const checkboxCategorySelector = {
row: {
root: '.category',
fields: {
- name:
- '.form-field-checkbox label',
- checkbox:
- '.form-field-checkbox input'
+ name: '.form-field-checkbox label',
+ checkbox: '.form-field-checkbox input'
}
}
}
@@ -653,17 +644,12 @@ const commonLabelFilterInput = inputGroup(
'[data-testid="labels-form-field-input"]',
true,
false,
- true
+ '.form-field__warning svg'
)
)
const commonProjectFilterInput = inputGroup(
- generateInputGroup(
- '[data-testid="project-form-field-input"]',
- true,
- false,
- true
- )
+ generateInputGroup('[data-testid="project-form-field-input"]', true, false, true)
)
const commonTableTreeFilterDropdown = dropdownComponent(
@@ -693,8 +679,12 @@ module.exports = {
Create_Button: By.css('.pop-up-dialog .btn-secondary'),
Error_Message: By.css('.pop-up-dialog .error__message'),
New_Project_Labels_Table: commonTable(newProjectLabelsTable),
- Add_Label_Button: By.css('.create-project-dialog .form-row:nth-of-type(4) .chips .chips-wrapper button'),
- Close_Label_Button: By.css('.create-project-dialog .form-row:nth-of-type(4) .chips .chips-wrapper .item-icon-close'),
+ Add_Label_Button: By.css(
+ '.create-project-dialog .form-row:nth-of-type(4) .chips .chips-wrapper button'
+ ),
+ Close_Label_Button: By.css(
+ '.create-project-dialog .form-row:nth-of-type(4) .chips .chips-wrapper .item-icon-close'
+ ),
Labels_Key: inputGroup(
generateInputGroup(
'.create-project-dialog .form-row:nth-of-type(4) .chips .chips-wrapper',
@@ -711,7 +701,7 @@ module.exports = {
false,
'.input-label-value'
)
- ),
+ )
},
commonPopup: {
Title: commonTitle,
@@ -723,12 +713,8 @@ module.exports = {
Message: By.css('#overlay_container > div > div > div:nth-child(2)')
},
metricsSelectorPopup: {
- Search_Metrics_Input:inputGroup(
- generateInputGroup(
- '[data-testid="metricSearchName-form-field-input"]',
- false,
- false
- )
+ Search_Metrics_Input: inputGroup(
+ generateInputGroup('[data-testid="metricSearchName-form-field-input"]', false, false)
),
Evidently_App_Test_Accordion: {
Accordion_Header: By.css(
@@ -762,15 +748,14 @@ module.exports = {
Cross_Close_Button: By.css('.modal .modal__header-button'),
Preview_text: By.css('.modal .modal__content .modal__header-preview-text'),
Wizard_Steps_Content: commonTable(wizardStepsContent),
- Function_Title: By.css(
- '.modal .modal__content h6.modal__header-sub-title'
- ),
+ Function_Title: By.css('.modal .modal__content h6.modal__header-sub-title'),
Function_Selection_Tabs: commonTable(functionSelectionTabs),
Search_Input: inputWithAutocomplete({
root: '.form-row .search-container',
elements: {
input: 'input',
- options: '.functions-list > div > div.job-card-template__header > div.data-ellipsis.tooltip-wrapper',
+ options:
+ '.functions-list > div > div.job-card-template__header > div.data-ellipsis.tooltip-wrapper',
option_name: ''
}
}),
@@ -784,11 +769,13 @@ module.exports = {
},
Category_Selector_Dropdown: categorySelect,
Checkbox_Category_Selector: commonTable(checkboxCategorySelector),
- Overlay: By.css('#overlay_container .chip-block-hidden .chip-block-hidden__scrollable-container'),
+ Overlay: By.css(
+ '#overlay_container .chip-block-hidden .chip-block-hidden__scrollable-container'
+ ),
Hyperparameter_Checkbox: checkboxComponent({
root: '#overlay_container .form-field-checkbox',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -810,13 +797,25 @@ module.exports = {
'.form-field__icons svg'
)
),
- Version_Tag_Dropdown: By.css('[data-testid="runDetails.version-form-field-select"] [data-testid="select-header"]'),
+ Version_Tag_Dropdown: 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)
+ generateDropdownGroup(
+ '.form-col-1:nth-of-type(3)',
+ '[data-testid="runDetails.handler-form-field-select"]',
+ '.select__item-main-label',
+ false,
+ false
+ )
+ ),
+ Handler_Edit_Job: By.css(
+ '.form-col-1:nth-of-type(2) [data-testid="runDetails.handler-form-input"]'
),
- Handler_Edit_Job: By.css('.form-col-1:nth-of-type(2) [data-testid="runDetails.handler-form-input"]'),
Labels_Table: commonTable(labelsTable),
- Add_Label_Button: By.css('.job-wizard__run-details .form-row:nth-of-type(4) .chips .chips-wrapper .button-add'),
+ Add_Label_Button: By.css(
+ '.job-wizard__run-details .form-row:nth-of-type(4) .chips .chips-wrapper .button-add'
+ ),
Run_Details_Labels_Key: inputGroup(
generateInputGroup(
'.job-wizard__run-details .form-row:nth-of-type(4) .chips-wrapper',
@@ -825,8 +824,12 @@ module.exports = {
'.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"]'),
- Close_Label_Button: By.css('.job-wizard__run-details .form-row:nth-of-type(4) .chips .chips-wrapper .item-icon-close'),
+ Run_Details_Labels_Value: By.css(
+ '.job-wizard__run-details .form-row:nth-of-type(4) .chips-wrapper [id="runDetails.labels[0].value"]'
+ ),
+ Close_Label_Button: By.css(
+ '.job-wizard__run-details .form-row:nth-of-type(4) .chips .chips-wrapper .item-icon-close'
+ ),
Image_Name_Input_Run_Details: inputGroup(
generateInputGroup(
'.job-wizard__run-details > div.form-field-input .form-field__wrapper',
@@ -839,12 +842,26 @@ module.exports = {
Data_Inputs_Headers: commonTable(dataInputsHeaders),
Run_Name_Field: By.css('.form-row .form-field-input .form-field__wrapper input'),
Version_Dropdown: dropdownComponent(
- generateDropdownGroup('.form-col-1:nth-of-type(2)', '.form-field-select', '.form-field__select-value', false, false)
+ generateDropdownGroup(
+ '.form-col-1:nth-of-type(2)',
+ '.form-field-select',
+ '.form-field__select-value',
+ false,
+ false
+ )
),
Method_Dropdown: dropdownComponent(
- generateDropdownGroup('.form-col-1:nth-of-type(3)', '.form-field-select', '.select__item-main-label', false, false)
+ generateDropdownGroup(
+ '.form-col-1:nth-of-type(3)',
+ '.form-field-select',
+ '.select__item-main-label',
+ false,
+ false
+ )
+ ),
+ Method_Dropdown_Option: By.css(
+ '.form-col-1:nth-of-type(3) .form-field-select .form-field__select span'
),
- Method_Dropdown_Option: By.css('.form-col-1:nth-of-type(3) .form-field-select .form-field__select span'),
Method_Dropdown_Label: By.css('[data-testid="runDetails.handler-form-label"]'),
Method_Dropdown_Label_Select: By.css('[data-testid="runDetails.handler-form-select-label"]'),
Run_Details_Labels_Table: commonTable(runDetailsLabelsTable),
@@ -852,36 +869,39 @@ module.exports = {
Data_Inputs_Inference_Table: commonTable(dataInputsInferenceTable),
Parameters_Headers: commonTable(parametersHeaders),
Parameters_Table: commonTable(parametersTable),
- Add_Custom_Parameter_Button: By.css('.job-wizard__parameters [data-testid="parameters.parametersTable"] .form-table__action-row button'),
+ Add_Custom_Parameter_Button: By.css(
+ '.job-wizard__parameters [data-testid="parameters.parametersTable"] .form-table__action-row button'
+ ),
Checkbox_Parameters: checkboxComponent(
- generateCheckboxGroup('.job-wizard__parameters .form-table__row_active .form-field-checkbox input', false, false, false)
- ),
- Delete_Button_Parameters: By.css('.job-wizard__parameters [data-testid="delete-discard-btn-tooltip-wrapper"]'),
- Parameters_Accordion:{
- Parameters_From_UI_Radiobutton: radiobuttonComponent(
- {
- root:
- '.modal__content .wizard-form__content-container .form-row .form-field-radio:nth-of-type(1)',
- elements: {
- radiobutton: 'input',
- mark: 'label',
- name: '',
- description: ''
- }
+ generateCheckboxGroup(
+ '.job-wizard__parameters .form-table__row_active .form-field-checkbox input',
+ false,
+ false,
+ false
+ )
+ ),
+ Delete_Button_Parameters: By.css(
+ '.job-wizard__parameters [data-testid="delete-discard-btn-tooltip-wrapper"]'
+ ),
+ Parameters_Accordion: {
+ Parameters_From_UI_Radiobutton: radiobuttonComponent({
+ root: '.modal__content .wizard-form__content-container .form-row .form-field-radio:nth-of-type(1)',
+ elements: {
+ radiobutton: 'input',
+ mark: 'label',
+ name: '',
+ description: ''
}
- ),
- Parameters_From_File_Radiobutton: radiobuttonComponent(
- {
- root:
- '.modal__content .wizard-form__content-container .form-row .form-field-radio:nth-of-type(2)',
- elements: {
- radiobutton: 'input',
- mark: '',
- name: 'label',
- description: ''
- }
+ }),
+ Parameters_From_File_Radiobutton: radiobuttonComponent({
+ root: '.modal__content .wizard-form__content-container .form-row .form-field-radio:nth-of-type(2)',
+ elements: {
+ radiobutton: 'input',
+ mark: '',
+ name: 'label',
+ description: ''
}
- ),
+ }),
Parameters_From_File_Input: inputGroup(
generateInputGroup(
'.job-wizard__parameters .form-row .form-field-input .form-field__wrapper',
@@ -890,11 +910,15 @@ module.exports = {
false
)
),
- Hyper_Toggle_Switch: By.css('.modal__content .form-table__row:nth-of-type(2) .form-table__cell_hyper .form-field-toggle__switch')
+ Hyper_Toggle_Switch: By.css(
+ '.modal__content .form-table__row:nth-of-type(2) .form-table__cell_hyper .form-field-toggle__switch'
+ )
},
Resources_Accordion: {
Pods_Priority_Dropdown: podsPriorityDropdown,
- Node_Selection_Subheader: By.css(' .modal__content .wizard-form__content-container .job-wizard__resources .form-row:nth-child(3)'),
+ Node_Selection_Subheader: By.css(
+ ' .modal__content .wizard-form__content-container .job-wizard__resources .form-row:nth-child(3)'
+ ),
Volumes_Subheader: labelComponent(
generateLabelGroup(
'.modal__content .wizard-form__content-container .form-row:nth-child(6)',
@@ -975,10 +999,22 @@ module.exports = {
true
)
),
- 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('[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)'),
+ 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(
+ '[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(
@@ -1002,12 +1038,12 @@ module.exports = {
)
),
Memory_Limit_Dropdown: dropdownComponent(
- generateDropdownGroup(
- '.wizard-form__content-container .resources-units .form-col-1:nth-of-type(1) .resources-card__fields:nth-child(3)',
- '.resources-card__fields-select',
- '.options-list__body .select__item',
- '.data-ellipsis .data-ellipsis'
- )
+ generateDropdownGroup(
+ '.wizard-form__content-container .resources-units .form-col-1:nth-of-type(1) .resources-card__fields:nth-child(3)',
+ '.resources-card__fields-select',
+ '.options-list__body .select__item',
+ '.data-ellipsis .data-ellipsis'
+ )
),
Memory_Limit_Number_Input: numberInputGroup(
generateNumberInputGroup(
@@ -1036,12 +1072,12 @@ module.exports = {
)
),
CPU_Limit_Dropdown: dropdownComponent(
- generateDropdownGroup(
- '.wizard-form__content-container .resources-units .form-col-1:nth-of-type(2) .resources-card__fields:nth-child(3)',
- '.resources-card__fields-select',
- '.options-list__body .select__item',
- '.data-ellipsis .data-ellipsis'
- )
+ generateDropdownGroup(
+ '.wizard-form__content-container .resources-units .form-col-1:nth-of-type(2) .resources-card__fields:nth-child(3)',
+ '.resources-card__fields-select',
+ '.options-list__body .select__item',
+ '.data-ellipsis .data-ellipsis'
+ )
),
CPU_Limit_Number_Input: numberInputGroup(
generateNumberInputGroup(
@@ -1069,12 +1105,7 @@ module.exports = {
generateCheckboxGroup('.job-wizard__advanced .access-key-checkbox input', false, false, false)
),
Access_Key_Input: inputGroup(
- generateInputGroup(
- '.align-stretch .form-field-input',
- true,
- false,
- '.tooltip-wrapper svg'
- )
+ generateInputGroup('.align-stretch .form-field-input', true, false, '.tooltip-wrapper svg')
),
Advanced_Accordion: {
Default_Input_Path_Input: inputGroup(
@@ -1094,11 +1125,11 @@ module.exports = {
)
)
},
- Hyperparameter_Strategy_Accordion:{
+ Hyperparameter_Strategy_Accordion: {
Strategy_Dropdown: dropdownComponent(
generateDropdownGroup(
'.modal__content .modal__body .job-wizard__hyperparameter-strategy .strategy-grid-item',
- '.form-field-select .form-field__wrapper-normal',
+ '.form-field-select .form-field__wrapper-normal',
'.options-list__body .select__item-label',
'.data-ellipsis'
)
@@ -1131,14 +1162,16 @@ module.exports = {
),
Ranking_Criteria_Dropdown: dropdownComponent(
generateDropdownGroup(
- '.job-wizard__hyperparameter-strategy .criteria-grid-item',
- '[data-testid="hyperparameterStrategy.criteria-form-field-select"]',
- '.options-list .select__item',
- false,
+ '.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_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',
@@ -1147,7 +1180,9 @@ module.exports = {
false
)
),
- Parallelism_Subheader: By.css('.job-wizard__hyperparameter-strategy .parallelism-title-grid-item'),
+ 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',
@@ -1168,12 +1203,15 @@ module.exports = {
Teardown_Checkbox: checkboxComponent({
root: '.job-wizard__hyperparameter-strategy .teardown-dask-grid-item .form-field-checkbox',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
})
},
+ mLRunUnhealthyPopUp: {
+ Message: By.css('[data-testid="pop-up-dialog"]')
+ },
registerDataset: {
Title: commonPopupTitle,
Form_Text: commonFormText,
@@ -1182,16 +1220,14 @@ module.exports = {
Name_Input: inputGroup(commonNameInput),
Tag_Input: inputGroup(commonTagInput),
Target_Path: {
- Path_Scheme_Combobox: comboBox(
- '.form .form-row:nth-of-type(4) .form-field__wrapper',
- true
- )
+ Path_Scheme_Combobox: comboBox('.form .form-row:nth-of-type(4) .form-field__wrapper', true)
},
Description_Input: textAreaGroup(
generateTextAreaGroup(
- '.form .form-row:nth-of-type(3) .form-field-textarea',
- '.form-field__counter'
- )),
+ '.form .form-row:nth-of-type(3) .form-field-textarea',
+ '.form-field__counter'
+ )
+ ),
Cancel_Button: commonFormCancelButton,
Register_Button: commonFormConfirmButton,
Register_Error_Message: commonRegisterErrorMessage
@@ -1231,10 +1267,7 @@ module.exports = {
Tag_Input: inputGroup(commonTagInput),
Register_Error_Message: commonRegisterErrorMessage,
Target_Path: {
- Path_Scheme_Combobox: comboBox(
- '.form .form-row:nth-of-type(4) .form-field__wrapper',
- true
- )
+ Path_Scheme_Combobox: comboBox('.form .form-row:nth-of-type(4) .form-field__wrapper', true)
},
New_File_Description_Input: textAreaGroup(commonDescriptionTextArea),
New_File_Type_Dropdown: dropdownComponent(
@@ -1259,10 +1292,7 @@ module.exports = {
)
),
Target_Path: {
- Path_Scheme_Combobox: comboBox(
- '.form .form-row:nth-of-type(3) .form-field__wrapper',
- true
- )
+ Path_Scheme_Combobox: comboBox('.form .form-row:nth-of-type(3) .form-field__wrapper', true)
},
New_File_Description_Input: textAreaGroup(
generateTextAreaGroup(
@@ -1348,7 +1378,7 @@ module.exports = {
Delete_Button: By.css('.confirm-dialog .btn-danger'),
Overwrite_Button: By.css('.confirm-dialog .btn-primary')
},
- previewPopup:{
+ previewPopup: {
Title: By.css('.pop-up-dialog .pop-up-dialog__header'),
Cross_Cancel_Button: commonCrossCancelButton,
Preview_Modal_Container: By.css('.pop-up-dialog .item-artifacts__modal-preview'),
@@ -1445,10 +1475,20 @@ module.exports = {
Title: commonTitle,
Cross_Cancel_Button: commonCrossCancelButton,
New_Secret_Key_Input: inputGroup(
- generateInputGroup('[data-testid="secrets"] .form-table__row_active .form-table__cell_1:nth-of-type(1)', true, false, '.form-field__warning svg')
+ generateInputGroup(
+ '[data-testid="secrets"] .form-table__row_active .form-table__cell_1:nth-of-type(1)',
+ true,
+ false,
+ '.form-field__warning svg'
+ )
),
New_Secret_Value_Input: inputGroup(
- generateInputGroup('[data-testid="secrets"] .form-table__row_active .form-table__cell_1:nth-of-type(2)', true, false, '.form-field__warning svg')
+ generateInputGroup(
+ '[data-testid="secrets"] .form-table__row_active .form-table__cell_1:nth-of-type(2)',
+ true,
+ false,
+ '.form-field__warning svg'
+ )
),
Cancel_Button: By.css('.pop-up-dialog .btn-label'),
Save_Button: By.css('.pop-up-dialog .secrets__footer-container .btn.btn-primary')
@@ -1473,12 +1513,27 @@ module.exports = {
Title: commonTitle,
Cross_Cancel_Button: commonCrossCancelButton,
Name_Input: inputGroup(
- generateInputGroup('.pop-up-dialog [data-testid="name-form-field-input"] .form-field__wrapper', true, '.form-field__warning svg', true)
+ generateInputGroup(
+ '.pop-up-dialog [data-testid="name-form-field-input"] .form-field__wrapper',
+ true,
+ '.form-field__warning svg',
+ true
+ )
),
Tag_Input: inputGroup(
- generateInputGroup('.pop-up-dialog [data-testid="tag-form-field-input"] .form-field__wrapper', true, '.form-field__warning svg', true)
+ generateInputGroup(
+ '.pop-up-dialog [data-testid="tag-form-field-input"] .form-field__wrapper',
+ true,
+ '.form-field__warning svg',
+ true
+ )
+ ),
+ Description_Input: textAreaGroup(
+ generateTextAreaGroup(
+ '.pop-up-dialog .new-feature-vector__description-row',
+ '.form-field__counter'
+ )
),
- Description_Input: textAreaGroup(generateTextAreaGroup('.pop-up-dialog .new-feature-vector__description-row', '.form-field__counter')),
Labels_Table: commonTable(createFeatureVectorLabelsTable),
Cancel_Button: commonCancelButton,
Create_Button: commonConfirmButton
@@ -1499,7 +1554,9 @@ module.exports = {
Cross_Cancel_Button: commonCrossCancelButton,
Preview_Row: commonTable(artifactsPreviewRow),
Preview_Header: commonTable(artifactsPreviewHeader),
- Download_Button: By.css('.pop-up-dialog .preview-body .preview-item:nth-of-type(2) .preview-body__download')
+ Download_Button: By.css(
+ '.pop-up-dialog .preview-body .preview-item:nth-of-type(2) .preview-body__download'
+ )
},
removeMemberPopup: {
Title: By.css('.delete-member__pop-up .pop-up-dialog__header-text'),
@@ -1512,7 +1569,9 @@ module.exports = {
},
filterByPopup: {
Title: By.css('[data-testid="pop-up-dialog"] h3'),
- Table_Label_Filter_Input: commonLabelFilterInput,
+ Table_Label_Filter_Input: inputGroup(
+ generateInputGroup('[data-testid="labels-form-field-input"]', true, false, 'svg')
+ ),
Table_Project_Filter_Input: commonProjectFilterInput,
Table_Tree_Filter_Dropdown: commonTableTreeFilterDropdown,
Status_Filter_Element: By.css('[data-testid="state-form-field-select"]'),
@@ -1533,7 +1592,15 @@ module.exports = {
Show_Iterations_Checkbox: checkboxComponent({
root: '#overlay_container .form-field-checkbox input',
elements: {
- checkbox: '',
+ checkbox: '',
+ name: '',
+ icon: ''
+ }
+ }),
+ Show_Untagged: checkboxComponent({
+ root: '#overlay_container .form-field-checkbox input',
+ elements: {
+ checkbox: '',
name: '',
icon: ''
}
@@ -1541,7 +1608,7 @@ module.exports = {
Status_All_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(1)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1549,7 +1616,7 @@ module.exports = {
Status_Aborting_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(3)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1557,7 +1624,7 @@ module.exports = {
Status_Jobs_Running_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(6)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1565,7 +1632,7 @@ module.exports = {
Status_Workflows_Running_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(4)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1573,7 +1640,7 @@ module.exports = {
Status_Pending_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(7)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1581,7 +1648,7 @@ module.exports = {
Status_Aborted_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(2)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1589,7 +1656,7 @@ module.exports = {
Status_Jobs_Error_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(5)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1597,7 +1664,7 @@ module.exports = {
Status_Workflows_Error_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(2)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1605,7 +1672,7 @@ module.exports = {
Status_Failed_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(3)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1613,7 +1680,7 @@ module.exports = {
Status_Jobs_Completed_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(4)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
@@ -1621,35 +1688,56 @@ module.exports = {
Status_Workflows_Completed_Checkbox: checkboxComponent({
root: '[data-testid="select-checkbox"]:nth-of-type(5)',
elements: {
- checkbox: 'input',
+ checkbox: 'input',
name: 'label',
icon: ''
}
}),
Checkbox_Label: By.css('#overlay_container .form-field-checkbox label'),
+ Table_Projects_Filter_Dropdown: dropdownComponent(
+ generateDropdownGroup(
+ '[data-testid="project-form-field-select"] [data-testid="select-header"]',
+ 'svg',
+ '[data-testid="select-body"] [data-testid="select-option"]',
+ ''
+ )
+ ),
+ Table_Entity_Filter_Input: inputGroup(
+ generateInputGroup(
+ '[data-testid="entities-form-field-input"]',
+ true,
+ false,
+ true
+ )
+ ),
Clear_Button: By.css('[data-testid="filter-clear-btn"]'),
Apply_Button: By.css('[data-testid="filter-apply-btn"]')
},
downloadsPopUp: {
Download_Pop_Up: By.css('[data-testid="download-container"]'),
- Download_Pop_Up_Cross_Cancel_Button: By.css('[data-testid="download-container"] .notification__button-close'),
+ Download_Pop_Up_Cross_Cancel_Button: By.css(
+ '[data-testid="download-container"] .notification__button-close'
+ ),
Header_Download_Pop_Up: By.css('[data-testid="download-container"] .download-container__header')
},
notificationPopUp: {
Title: By.css('#overlay_container .notification__body'),
Notification_Pop_Up: By.css('#overlay_container .notification__body'),
- Notification_Pop_Up_Cross_Close_Button: By.css('#overlay_container .notification__button-close')
+ Notification_Pop_Up_Cross_Close_Button: By.css('#overlay_container .notification__button-close'),
+ Retry_Button: By.css('#overlay_container .notification__body .notification__body__button-retry')
},
addTagPopup: {
Add_Tag_Popup: By.css('[data-testid="modal"]'),
Close_Button: By.css('[data-testid="modal"] .modal__header-button'),
Title: By.css('[data-testid="modal"] .modal__content .modal__header h5'),
- Input_Label: By.css('[data-testid="modal"] .modal__body [data-testid="artifactTag-form-label"]'),
+ Input_Label: By.css(
+ '[data-testid="modal"] .modal__body [data-testid="artifactTag-form-label"]'
+ ),
Tag_Input: inputGroup(
generateInputGroup(
- '[data-testid="modal"] .modal__body .form-field__wrapper',
- true,
- '.form-field__warning svg',
+ '[data-testid="modal"] .modal__body .form-field__wrapper',
+ true,
+ '.form-field__warning svg',
true
)
),
@@ -1658,7 +1746,9 @@ module.exports = {
},
deleteArtifactPopup: {
Delete_Artifact_Popup: By.css('[data-testid="pop-up-dialog"]'),
- Close_Button: By.css('[data-testid="pop-up-dialog"] .pop-up-dialog__header .pop-up-dialog__btn_close'),
+ Close_Button: By.css(
+ '[data-testid="pop-up-dialog"] .pop-up-dialog__header .pop-up-dialog__btn_close'
+ ),
Title: By.css('[data-testid="pop-up-dialog"] .pop-up-dialog__header .tooltip-wrapper span'),
Dialog_Message: By.css('[data-testid="pop-up-dialog"] .confirm-dialog__message'),
Delete_Data_Checkbox: checkboxComponent(
@@ -1669,8 +1759,12 @@ module.exports = {
false
)
),
- Delete_Button: By.css('[data-testid="pop-up-dialog"] .confirm-dialog__btn-container .btn-danger'),
- Cancel_Button: By.css('[data-testid="pop-up-dialog"] .confirm-dialog__btn-container .pop-up-dialog__btn_cancel')
+ Delete_Button: By.css(
+ '[data-testid="pop-up-dialog"] .confirm-dialog__btn-container .btn-danger'
+ ),
+ Cancel_Button: By.css(
+ '[data-testid="pop-up-dialog"] .confirm-dialog__btn-container .pop-up-dialog__btn_cancel'
+ )
},
schedulePopUp: {
Schedule_For_Later: {
@@ -1699,13 +1793,27 @@ module.exports = {
false
)
),
- Schedule_item_Sunday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(1)'),
- Schedule_item_Monday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(2)'),
- Schedule_item_Tuesday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(3)'),
- Schedule_item_Wednesday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(4)'),
- Schedule_item_Thursday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(5)'),
- Schedule_item_Friday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(6)'),
- Schedule_item_Saturday: By.css('.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(7)'),
+ Schedule_item_Sunday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(1)'
+ ),
+ Schedule_item_Monday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(2)'
+ ),
+ Schedule_item_Tuesday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(3)'
+ ),
+ Schedule_item_Wednesday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(4)'
+ ),
+ Schedule_item_Thursday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(5)'
+ ),
+ Schedule_item_Friday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(6)'
+ ),
+ Schedule_item_Saturday: By.css(
+ '.simple-schedule-item .schedule-repeat-week .schedule-repeat-week_day:nth-of-type(7)'
+ ),
Error_Message: By.css('.schedule-content .error')
}
}
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 231bf6d5e..a00b95037 100644
--- a/tests/features/common/page-objects/jobs-and-workflows.po.js
+++ b/tests/features/common/page-objects/jobs-and-workflows.po.js
@@ -408,7 +408,7 @@ const functionsTemplates = {
// Common components
const pageHeaderButton = By.css(
- '.content__header .page-actions-container button'
+ '.action-bar .action-bar__actions button'
)
const jobsTabSelector = commonTable(tabSelector)
const tableRefreshButton = By.css(
@@ -431,32 +431,60 @@ const commonStartTimeFilter = dropdownComponent(
false // options_in_root ?
)
)
+const commonDatePickerFilter = dropdownComponent(
+ generateDropdownGroup(
+ '[data-testid="date-picker-container"]',
+ '[data-testid="date-picker-input"]',
+ '.date-picker__pop-up .select__item',
+ '.data-ellipsis .data-ellipsis',
+ false
+ )
+)
+
+const commonTableNameFilter = inputGroup(
+ generateInputGroup(
+ '[data-testid="name-form-field-input"]',
+ true,
+ false
+ )
+)
+
+const commonTableFilterByButton = By.css('[data-testid="filter-menu-btn-tooltip-wrapper"]')
+const commonErrorMessage = By.css('[data-testid="no-data"] h3')
+
+const commonCustomRangeFilter = dropdownComponent(
+ generateDropdownGroup(
+ '[data-testid="date-picker-container"]',
+ '[data-testid="date-picker-input"] input',
+ '.date-picker__pop-up .select__item',
+ '.data-ellipsis .data-ellipsis',
+ false
+ )
+)
module.exports = {
JobsMonitorTab: {
Jobs_Tab_Selector: jobsTabSelector,
+ Date_Picker_Filter_Dropdown: commonDatePickerFilter,
+ Table_FilterBy_Button: commonTableFilterByButton,
Batch_Run_Button: pageHeaderButton,
+ Error_Message: commonErrorMessage,
+ Custom_Range_Filter_Dropdown: commonCustomRangeFilter,
Arrow_Back: By.css('.link-back__icon'),
Resource_Monitoring_Button: By.css(
'.content__action-bar-wrapper .action-bar button'
),
Auto_Refresh_Checkbox: checkboxComponent({
- root: '.content__action-bar-wrapper .checkbox',
+ root: '[data-testid="form-field-checkbox"]',
elements: {
- checkbox: 'svg',
+ checkbox: 'input',
name: '',
icon: ''
}
}),
Table_Refresh_Button: tableRefreshButton,
Status_Filter_Dropdown: commonStatusFilter,
- Table_Name_Filter_Input: inputGroup(
- generateInputGroup(
- '.content__action-bar-wrapper .filter-column:nth-of-type(2) .input-wrapper',
- true,
- false
- )
- ),
+ Table_Name_Filter_Input: commonTableNameFilter,
Table_Labels_Filter_Input: inputGroup(
generateInputGroup(
'.content__action-bar-wrapper .filter-column:nth-of-type(3) .input-wrapper',
@@ -470,29 +498,27 @@ module.exports = {
},
WorkflowsMonitorTab: {
Status_Filter_Dropdown: commonStatusFilter,
- Table_Name_Filter_Input: inputGroup(
- generateInputGroup(
- '.content__action-bar-wrapper .filter-column:nth-of-type(2) .input-wrapper',
- true,
- false
- )
- ),
+ Table_Name_Filter_Input: commonTableNameFilter,
+ Date_Picker_Filter_Dropdown: commonDatePickerFilter,
+ Table_FilterBy_Button: commonTableFilterByButton,
+ Error_Message: commonErrorMessage,
+ Custom_Range_Filter_Dropdown: commonCustomRangeFilter,
Start_Time_Filter_Dropdown: commonStartTimeFilter,
Date_Time_Picker: datepicker(dateTimePickerCalendars),
Workflows_Monitor_Table: commonTable(workflowsMonitorTable),
Toggle_View_Button: By.css('.workflow-container .actions .toggle-view-btn'),
Workflow_List_View_Table: commonTable(jobsMonitorTable),
Workflow_Graph: graph(monitorWorkflowGraph),
- Table_Refresh_Button: tableRefreshButton
+ Table_Refresh_Button: tableRefreshButton,
+ Monitor_Workflows_Subtitle: By.css('.table-container .monitor-workflows__subtitle')
},
ScheduleMonitorTab: {
- Table_Name_Filter_Input: inputGroup(
- generateInputGroup(
- '.content__action-bar-wrapper .filter-column:nth-of-type(1) .input-wrapper',
- true,
- false
- )
- ),
+ Table_Name_Filter_Input: commonTableNameFilter,
+ Date_Picker_Filter_Dropdown: commonDatePickerFilter,
+ Table_FilterBy_Button: commonTableFilterByButton,
+ Batch_Run_Button: pageHeaderButton,
+ Error_Message: commonErrorMessage,
+ Custom_Range_Filter_Dropdown: commonCustomRangeFilter,
Table_Labels_Filter_Input: inputGroup(
generateInputGroup(
'.content__action-bar-wrapper .filter-column:nth-of-type(2) .input-wrapper',
diff --git a/tests/features/common/page-objects/jobs-monitoring.po.js b/tests/features/common/page-objects/jobs-monitoring.po.js
index e8bcaaa09..6cb7a1992 100644
--- a/tests/features/common/page-objects/jobs-monitoring.po.js
+++ b/tests/features/common/page-objects/jobs-monitoring.po.js
@@ -20,13 +20,16 @@ such restriction.
import { By } from 'selenium-webdriver'
import commonTable from '../components/table.component'
import dropdownComponent from '../components/dropdown.component'
+import labelComponent from '../components/label.component'
import {
generateDropdownGroup,
- generateInputGroup
+ generateInputGroup,
+ generateLabelGroup
} from '../../common-tools/common-tools'
import inputGroup from '../components/input-group.component'
import checkboxComponent from '../components/checkbox.component'
import datepicker from '../components/date-picker.component'
+import actionMenu from '../components/action-menu.component'
const tabSelector = {
root: '.content .content-menu',
@@ -42,6 +45,14 @@ const tabSelector = {
}
}
+const actionMenuStructure = {
+ root: '.actions-menu__container',
+ menuElements: {
+ open_button: 'button',
+ options: '.actions-menu__body .actions-menu__option'
+ }
+}
+
const overallTable = {
root: '.table__content',
header: {
@@ -61,6 +72,15 @@ const overallTable = {
row: {
root: '.table-row',
fields: {
+ status: {
+ componentType: labelComponent,
+ structure: generateLabelGroup(
+ '.table-body__cell:nth-of-type(1) .status',
+ 'i',
+ true,
+ '.tooltip .tooltip__text span'
+ )
+ },
name: '[data-testid="name"] a .link',
project_name: '[data-testid="projectName"] .data-ellipsis',
datetime:
@@ -68,7 +88,30 @@ const overallTable = {
uid:
'.table-body__cell:nth-of-type(1) a .date-uid-row .link-subtext:nth-of-type(2)',
duration: '.table-body__cell:nth-of-type(3) .data-ellipsis',
- owner: '.table-body__cell:nth-of-type(4) .data-ellipsis'
+ owner: '.table-body__cell:nth-of-type(4) .data-ellipsis',
+ action_menu: {
+ componentType: actionMenu,
+ structure: actionMenuStructure
+ },
+ labels: {
+ componentType: dropdownComponent,
+ structure: generateDropdownGroup(
+ '.table-body__cell:nth-of-type(7)',
+ '.chip-block span.chips_button',
+ '.chip-block-hidden_visible .data-ellipsis.tooltip-wrapper',
+ false,
+ false
+ )
+ },
+ type: {
+ componentType: labelComponent,
+ structure: generateLabelGroup(
+ '.table-body__cell:nth-of-type(3)',
+ '.data-ellipsis',
+ true,
+ '.tooltip .tooltip__text span'
+ )
+ },
}
}
}
diff --git a/tests/features/common/page-objects/ml-functions.po.js b/tests/features/common/page-objects/ml-functions.po.js
index 702526f74..e090495ae 100644
--- a/tests/features/common/page-objects/ml-functions.po.js
+++ b/tests/features/common/page-objects/ml-functions.po.js
@@ -94,6 +94,7 @@ module.exports = {
false
)
),
+ Table_FilterBy_Button: By.css('[data-testid="filter-menu-btn-tooltip-wrapper"]'),
New_Function_Button: By.css('.content [data-testid="btn"]'),
Table_Refresh_Button: By.css(
'.content [data-testid="refresh-tooltip-wrapper"]'
diff --git a/tests/features/common/page-objects/models.po.js b/tests/features/common/page-objects/models.po.js
index c0db4178a..a8df23653 100644
--- a/tests/features/common/page-objects/models.po.js
+++ b/tests/features/common/page-objects/models.po.js
@@ -246,17 +246,20 @@ const realTimePipelinesGraph = {
// Common components
const tableRefreshButton = By.css('.content__action-bar-wrapper .action-bar [data-testid="refresh"]')
+const tableNameFilterInput = inputGroup(
+ generateInputGroup(
+ '.content .content__action-bar-wrapper .action-bar .name-filter .form-field-input',
+ true,
+ false,
+ '.form-field__warning svg'
+ )
+)
module.exports = {
modelsTab: {
Delete_Artifact_Popup: By.css('[data-testid="pop-up-dialog"]'),
Models_Tab_Selector: commonTable(tabSelector),
- Table_Name_Filter_Input: inputGroup(
- generateInputGroup(
- '.content .content__action-bar-wrapper .action-bar .name-filter .form-field-input',
- true
- )
- ),
+ Table_Name_Filter_Input: tableNameFilterInput,
Table_Refresh_Button: By.css('.content__action-bar-wrapper .action-bar__actions [data-testid="refresh"]'),
Models_Table: commonTable(modelsTable),
Overlay: By.css('#overlay_container .chip-block-hidden_visible'),
@@ -268,34 +271,18 @@ module.exports = {
},
modelEndpoints: {
Table_Refresh_Button: tableRefreshButton,
- Table_Label_Filter_Input: inputGroup(
- generateInputGroup(
- '.content .content__action-bar-wrapper .input-wrapper:nth-of-type(1)',
- true,
- false,
- true
- )
- ),
- Table_Sort_By_Filter: dropdownComponent(
- generateDropdownGroup(
- '.content__action-bar-wrapper .filters .filter-column:nth-of-type(2) .select',
- '.select__header',
- '.select__body .select__item',
- '.data-ellipsis .data-ellipsis'
- )
- ),
Model_Endpoints_Table: commonTable(modelsEndpointTable),
- Overlay: By.css('#overlay_container .chip-block-hidden_visible')
+ Overlay: By.css('#overlay_container .chip-block-hidden_visible'),
+ Table_FilterBy_Button: By.css(
+ '[data-testid="filter-menu-btn-tooltip-wrapper"]'
+ ),
+ Column_Name_Header: By.css('[data-testid="name"]'),
+ Sort_By_Name: By.css('[data-testid="name"].sortable-header-cell_active svg'),
+ Sort_By_Function: By.css('[data-testid="function"].sortable-header-cell_active svg'),
+ Column_Function_Header: By.css('[data-testid="function"]')
},
realTimePipelinesTab: {
- Table_Name_Filter_Input: inputGroup(
- generateInputGroup(
- '.content .content__action-bar-wrapper .filters .input-wrapper',
- true,
- false,
- true
- )
- ),
+ Table_Name_Filter_Input: tableNameFilterInput,
Table_Refresh_Button: tableRefreshButton,
Real_Time_Pipelines_Table: commonTable(realTimePipelinesTable),
Real_Time_Pipelines_Graph: graph(realTimePipelinesGraph)
diff --git a/tests/features/common/page-objects/project-settings.po.js b/tests/features/common/page-objects/project-settings.po.js
index 05e126669..87c1f0166 100644
--- a/tests/features/common/page-objects/project-settings.po.js
+++ b/tests/features/common/page-objects/project-settings.po.js
@@ -22,6 +22,7 @@ import commonTable from '../components/table.component'
import inputGroup from '../components/input-group.component'
import textAreaGroup from '../components/text-area.component'
import { generateInputGroup, generateTextAreaGroup } from '../../common-tools/common-tools'
+import checkboxComponent from '../components/checkbox.component'
const tabSelector = {
@@ -150,7 +151,7 @@ module.exports = {
'.form-key-value-table .form-table__row_active .form-table__cell_1:nth-of-type(1)',
true,
false,
- '.form-field__warning'
+ '.form-field__warning svg'
)
),
Parameters_Table_Value_Input: inputGroup(
@@ -158,7 +159,7 @@ module.exports = {
'.form-key-value-table .form-table__row_active .form-table__cell_1:nth-of-type(2)',
true,
false,
- '.form-field__warning'
+ '.form-field__warning svg'
)
),
Parameters_Table_Add_Row_Button: By.css(
@@ -185,6 +186,14 @@ module.exports = {
'.input-label-value'
)
),
+ Pull_At_Runtime_Checkbox: checkboxComponent({
+ root: '.settings__source [data-testid="form-field-checkbox"]',
+ elements: {
+ checkbox: 'input',
+ name: '',
+ icon: ''
+ }
+ })
},
secretsTab: {
Secrets_Table: commonTable(secretsTable),
diff --git a/tests/features/common/page-objects/projects.po.js b/tests/features/common/page-objects/projects.po.js
index 6964970c5..a36f41cc9 100644
--- a/tests/features/common/page-objects/projects.po.js
+++ b/tests/features/common/page-objects/projects.po.js
@@ -36,8 +36,7 @@ const ProjectsTableSelector = {
row: {
root: '.project-card',
fields: {
- name:
- '.project-card__general-info .project-card__header .project-card__header-title .data-ellipsis.tooltip-wrapper.project-card__title',
+ name: '.project-card__general-info .project-card__header .project-card__header-title .data-ellipsis.tooltip-wrapper.project-card__title',
description:
'.project-card__general-info .project-card__content .project-card__description .data-ellipsis',
running: {
@@ -58,6 +57,24 @@ const ProjectsTableSelector = {
'.tooltip .tooltip__text span'
)
},
+ labels_key: {
+ componentType: labelComponent,
+ structure: generateLabelGroup(
+ '[data-testid="project-card__labels"] .chip-block .input-label-key',
+ false,
+ false,
+ '.tooltip .tooltip__text span'
+ )
+ },
+ labels_value: {
+ componentType: labelComponent,
+ structure: generateLabelGroup(
+ '[data-testid="project-card__labels"] .chip-block .input-label-value',
+ false,
+ false,
+ '.tooltip .tooltip__text span'
+ )
+ },
labels: {
componentType: dropdownComponent,
structure: generateDropdownGroup(
@@ -85,12 +102,11 @@ const ProjectsTableSelector = {
}
module.exports = {
+ Retrieving_projects_message: By.css('[data-testid=no-data]'),
New_Project_Button: By.css(
'.projects__wrapper .projects-content-header-item .page-actions-container .btn_register'
),
- Refresh_Projects_Button: By.css(
- '.projects-content-header .data-ellipsis button'
- ),
+ Refresh_Projects_Button: By.css('.projects-content-header .data-ellipsis button'),
Projects_Table: commonTable(ProjectsTableSelector),
Overlay: By.css('#overlay_container .chip-block-hidden_visible'),
Active_Projects_Button: By.css(
@@ -99,9 +115,7 @@ module.exports = {
Archive_Projects_Button: By.css(
'.projects__wrapper .projects-content-header .projects-content-header-item .content-menu .content-menu__list li[data-testid=archived] a'
),
- Projects_Sorter: By.css(
- '.projects-content-header-item .sort .split-btn__button:nth-of-type(1)'
- ),
+ Projects_Sorter: By.css('.projects-content-header-item .sort .split-btn__button:nth-of-type(1)'),
Projects_Sort_Dropdown: dropdownComponent(
generateDropdownGroup(
'.projects-content-header-item .sort .split-btn__button:nth-of-type(2)',
@@ -110,63 +124,136 @@ module.exports = {
'.data-ellipsis > .tooltip-wrapper' // Option value
)
),
- No_Archived_Projects_Label:
- '.projects .projects__wrapper .projects-content .no-filtered-data',
+ No_Archived_Projects_Label: '.projects .projects__wrapper .projects-content .no-filtered-data',
Search_Projects_Input: inputGroup(
- generateInputGroup(
- '.projects__wrapper .projects-content-header .search-container'
- )
+ generateInputGroup('.projects__wrapper .projects-content-header .search-container')
),
- Projects_Monitoring_Container:{
+ Projects_Monitoring_Container: {
Monitoring_Container: By.css('.projects .projects-monitoring-container'),
- Monitoring_Container_Title: By.css('.projects-monitoring-container .projects-monitoring-legend .page-header__title'),
- Monitoring_Container_Running_Status: By.css('.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(1)'),
- Monitoring_Container_Running_Icon: By.css('.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(1) i'),
- Monitoring_Container_Failed_Status: By.css('.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(2)'),
- Monitoring_Container_Failed_Icon: By.css('.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(2) i'),
- Monitoring_Container_Completed_Status: By.css('.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(3)'),
- Monitoring_Container_Completed_Icon: By.css('.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(3) i'),
- Monitoring_Jobs_Box: By.css('.projects-monitoring-container .projects-monitoring-stats .stats-card:nth-of-type(1)'),
- Monitoring_Workflows_Box: By.css('.projects-monitoring-container .projects-monitoring-stats .stats-card:nth-of-type(2)'),
- Monitoring_Scheduled_Box: By.css('.projects-monitoring-container .projects-monitoring-stats .stats-card:nth-of-type(3)')
+ Monitoring_Container_Title: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .page-header__title'
+ ),
+ Monitoring_Container_Running_Status: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(1)'
+ ),
+ Monitoring_Container_Running_Icon: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(1) i'
+ ),
+ Monitoring_Container_Failed_Status: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(2)'
+ ),
+ Monitoring_Container_Failed_Icon: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(2) i'
+ ),
+ Monitoring_Container_Completed_Status: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(3)'
+ ),
+ Monitoring_Container_Completed_Icon: By.css(
+ '.projects-monitoring-container .projects-monitoring-legend .projects-monitoring-legend__status li:nth-of-type(3) i'
+ ),
+ Monitoring_Jobs_Box: By.css(
+ '.projects-monitoring-container .projects-monitoring-stats .stats-card:nth-of-type(1)'
+ ),
+ Monitoring_Workflows_Box: By.css(
+ '.projects-monitoring-container .projects-monitoring-stats .stats-card:nth-of-type(2)'
+ ),
+ Monitoring_Scheduled_Box: By.css(
+ '.projects-monitoring-container .projects-monitoring-stats .stats-card:nth-of-type(3)'
+ )
},
- Monitoring_Jobs_Box:{
- Monitoring_Jobs_Box_Title: By.css('.projects-monitoring-stats .stats-card:nth-of-type(1) .stats-card__title'),
+ Monitoring_Jobs_Box: {
+ Monitoring_Jobs_Box_Title: By.css(
+ '.projects-monitoring-stats .stats-card:nth-of-type(1) .stats-card__title'
+ ),
Filtering_Time_Period: By.css('.stats-card:nth-of-type(1) .project-card__info'),
- Total_Counter_Title: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .stats__subtitle'),
- Total_Counter_Number: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .stats__counter'),
- Counter_Running_Status_Number: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1)'),
- Counter_Running_Status_Icon: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1) i'),
- Counter_Failed_Status_Number: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2)'),
- Counter_Failed_Status_Icon: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2) i'),
- Counter_Completed_Status_Number: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3)'),
- Counter_Completed_Status_Icon: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3) i'),
+ Total_Counter_Title: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .stats__subtitle'
+ ),
+ Total_Counter_Number: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .stats__counter'
+ ),
+ Counter_Running_Status_Number: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1)'
+ ),
+ Counter_Running_Status_Icon: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1) i'
+ ),
+ Counter_Failed_Status_Number: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2)'
+ ),
+ Counter_Failed_Status_Icon: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2) i'
+ ),
+ Counter_Completed_Status_Number: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3)'
+ ),
+ Counter_Completed_Status_Icon: By.css(
+ '.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3) i'
+ ),
See_All_Link: By.css('.stats-card:nth-of-type(1) .stats-card__row:nth-of-type(3) .link')
},
- Monitoring_Workflows_Box:{
- Monitoring_Workflows_Box_Title: By.css('.projects-monitoring-stats .stats-card:nth-of-type(2) .stats-card__title'),
+ Monitoring_Workflows_Box: {
+ Monitoring_Workflows_Box_Title: By.css(
+ '.projects-monitoring-stats .stats-card:nth-of-type(2) .stats-card__title'
+ ),
Filtering_Time_Period: By.css('.stats-card:nth-of-type(2) .project-card__info'),
- Total_Counter_Title: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .stats__subtitle'),
- Total_Counter_Number: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .stats__counter'),
- Counter_Running_Status_Number: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1)'),
- Counter_Running_Status_Icon: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1) i'),
- Counter_Failed_Status_Number: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2)'),
- Counter_Failed_Status_Icon: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2) i'),
- Counter_Completed_Status_Number: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3)'),
- Counter_Completed_Status_Icon: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3) i'),
+ Total_Counter_Title: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .stats__subtitle'
+ ),
+ Total_Counter_Number: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .stats__counter'
+ ),
+ Counter_Running_Status_Number: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1)'
+ ),
+ Counter_Running_Status_Icon: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(1) i'
+ ),
+ Counter_Failed_Status_Number: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2)'
+ ),
+ Counter_Failed_Status_Icon: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(2) i'
+ ),
+ Counter_Completed_Status_Number: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3)'
+ ),
+ Counter_Completed_Status_Icon: By.css(
+ '.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(2) .projects-monitoring-legend__status .link:nth-of-type(3) i'
+ ),
See_All_Link: By.css('.stats-card:nth-of-type(2) .stats-card__row:nth-of-type(3) .link')
},
- Monitoring_Scheduled_Box:{
- Monitoring_Scheduled_Box_Title: By.css('.projects-monitoring-stats .stats-card:nth-of-type(3) .stats-card__title'),
+ Monitoring_Scheduled_Box: {
+ Monitoring_Scheduled_Box_Title: By.css(
+ '.projects-monitoring-stats .stats-card:nth-of-type(3) .stats-card__title'
+ ),
Filtering_Time_Period: By.css('.stats-card:nth-of-type(3) .project-card__info'),
- Total_Job_Counter_Title: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(1) .stats__subtitle'),
- Total_Workflows_Counter_Title: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(2) .stats__subtitle'),
- Total_Scheduled_Title: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(3) .stats__subtitle'),
- Total_Job_Counter_Number: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(1) .stats__counter'),
- Total_Workflows_Counter_Number: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(2) .stats__counter'),
- Total_Scheduled_Number: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(3) .stats__counter'),
- Jobs_See_All_Link: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(3) .stats-card__col:nth-of-type(1) .link'),
- Workflows_See_All_Link: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(3) .stats-card__col:nth-of-type(2) .link'),
- Total_See_All_Link: By.css('.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(3) .stats-card__col:nth-of-type(3) .link')
+ Total_Job_Counter_Title: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(1) .stats__subtitle'
+ ),
+ Total_Workflows_Counter_Title: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(2) .stats__subtitle'
+ ),
+ Total_Scheduled_Title: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(3) .stats__subtitle'
+ ),
+ Total_Job_Counter_Number: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(1) .stats__counter'
+ ),
+ Total_Workflows_Counter_Number: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(2) .stats__counter'
+ ),
+ Total_Scheduled_Number: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(2) .stats-card__col:nth-of-type(3) .stats__counter'
+ ),
+ Jobs_See_All_Link: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(3) .stats-card__col:nth-of-type(1) .link'
+ ),
+ Workflows_See_All_Link: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(3) .stats-card__col:nth-of-type(2) .link'
+ ),
+ Total_See_All_Link: By.css(
+ '.stats-card:nth-of-type(3) .stats-card__row:nth-of-type(3) .stats-card__col:nth-of-type(3) .link'
+ )
}
}
diff --git a/tests/features/datasets.feature b/tests/features/datasets.feature
index 46bafc152..27d6b13fb 100644
--- a/tests/features/datasets.feature
+++ b/tests/features/datasets.feature
@@ -172,6 +172,7 @@ Feature: Datasets Page
Then verify "Header" element visibility on "Datasets_Info_Pane" wizard
Then "Header" element on "Datasets_Info_Pane" should contains "test-dataset" value
Then refresh a page
+ And wait load page
Then verify "Header" element visibility on "Datasets_Info_Pane" wizard
Then "Header" element on "Datasets_Info_Pane" should contains "test-dataset" value
@@ -1237,16 +1238,16 @@ Feature: Datasets Page
And wait load page
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
- Then verify that 16 row elements are displayed in "Datasets_Table" on "Datasets" wizard
+ Then verify that 17 row elements are displayed in "Datasets_Table" on "Datasets" wizard
Then check "new_dataset_10" value in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "new_dataset_24" value in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "test-regressor_cox-test-summary" value in "name" column in "Datasets_Table" table on "Datasets" wizard
- Then check "survival-curves_coxhazard-summary" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
+ Then check "survival-curves_coxhazard-summary" value in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "iris_gen_iris_dataset" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "data_clean_cleaned-data" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
When scroll to the element with "test-regressor_cox-test-summary" value in "name" column in "Datasets_Table" table on "Datasets" wizard
And wait load page
- Then verify that 17 row elements are displayed in "Datasets_Table" on "Datasets" wizard
+ Then verify that 18 row elements are displayed in "Datasets_Table" on "Datasets" wizard
Then check "test-regressor_cox-test-summary" value in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "iris_gen_iris_dataset" value in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "new_dataset_10" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
@@ -1275,10 +1276,11 @@ Feature: Datasets Page
Then select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
- Then verify that 16 row elements are displayed in "Datasets_Table" on "Datasets" wizard
+ Then verify that 17 row elements are displayed in "Datasets_Table" on "Datasets" wizard
Then check "new_dataset_24" value in "name" column in "Datasets_Table" table on "Datasets" wizard
Then check "test-regressor_cox-test-summary" value in "name" column in "Datasets_Table" table on "Datasets" wizard
- Then check "survival-curves_coxhazard-summary" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
+ Then check "survival-curves_coxhazard-summary" value in "name" column in "Datasets_Table" table on "Datasets" wizard
+ Then check "iris_gen_iris_dataset" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
Then click on cell with value "test-regressor_cox-test-summary" in "name" column in "Datasets_Table" table on "Datasets" wizard
And wait load page
Then check "new_dataset_10" value not in "name" column in "Datasets_Table" table on "Datasets" wizard
diff --git a/tests/features/featureStore.feature b/tests/features/featureStore.feature
index 5d796044e..657a880f1 100644
--- a/tests/features/featureStore.feature
+++ b/tests/features/featureStore.feature
@@ -26,13 +26,22 @@ Feature: Feature Store Page
Then verify "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard should contains "Feature_Store"."Tab_List"
Then verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" dropdown element on "Feature_Store_Feature_Sets_Tab" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
Then type value " " to "Table_Name_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Name_Filter_Input" on "Feature_Store_Feature_Sets_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
- Then verify "Table_Label_Filter_Input" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then type value " " to "Table_Label_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Label_Filter_Input" on "Feature_Store_Feature_Sets_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value " " to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then verify "Table_Label_Filter_Input" on "FilterBy_Popup" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
Then verify "Feature_Sets_Table" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Feature_Store_Tab_Selector" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Create_Set_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
@@ -66,13 +75,23 @@ Feature: Feature Store Page
Then "Add_To_Feature_Vector_Button" element on "Feature_Store_Features_Tab" should contains "Add to feature vector" value
Then verify "Table_Refresh_Button" element visibility on "Feature_Store_Features_Tab" wizard
Then verify "Table_Name_Filter_Input" element visibility on "Feature_Store_Features_Tab" wizard
- Then verify "Table_Label_Filter_Input" element visibility on "Feature_Store_Features_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" element visibility on "Feature_Store_Features_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" dropdown element on "Feature_Store_Features_Tab" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Features_Table" element visibility on "Feature_Store_Features_Tab" wizard
Then select "project" with "test-test" value in breadcrumbs menu
Then "No_Data_Message" component on "commonPagesHeader" should contains "No_Data_Message"."Common_Message_Feature"
- Then select "All" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ Then select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then "No_Data_Message" component on "commonPagesHeader" should contains "No_Data_Message"."No_Features_Yet"
@MLFS
@@ -95,9 +114,16 @@ Feature: Feature Store Page
Then verify "Create_Vector_Button" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
Then "Create_Vector_Button" element on "Feature_Store_Features_Vectors_Tab" should contains "Create Vector" value
Then verify "Table_Name_Filter_Input" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
- Then verify "Table_Label_Filter_Input" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" dropdown element on "Feature_Store_Features_Vectors_Tab" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
Then verify "Feature_Vectors_Table" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
@@ -115,7 +141,9 @@ Feature: Feature Store Page
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
- Then select "All" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
When click on cell with row index 2 in "name" column in "Feature_Sets_Table" table on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Header" element visibility on "Feature_Sets_Info_Pane" wizard
@@ -218,7 +246,9 @@ Feature: Feature Store Page
And wait load page
And select "Feature Vectors" tab in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Feature Vectors" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Features_Vectors_Tab" wizard
- When select "test-tag" option in "Table_Tag_Filter_Dropdown" filter dropdown on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ When select "test-tag" option in "Table_Tree_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Feature_Vectors_Table" table on "Feature_Store_Features_Vectors_Tab" wizard
Then verify "Header" element visibility on "Feature_Vectors_Info_Pane" wizard
@@ -381,16 +411,19 @@ Feature: Feature Store Page
And wait load page
And select "tab" with "Feature store" value in breadcrumbs menu
And wait load page
- Then type value "my-key" 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
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then type value "my-key" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "text" in "Feature_Sets_Table" on "Feature_Store_Feature_Sets_Tab" wizard should contains "my-key"
- 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
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then type value "type=featureSet" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
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
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then type value "v3io_user=123" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
@@ -425,16 +458,19 @@ Feature: Feature Store Page
And wait load page
And select "Features" tab in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
And wait load page
- Then type value "owner" to "Table_Label_Filter_Input" field on "Feature_Store_Features_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ Then type value "owner" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Features_Table" on "Feature_Store_Features_Tab" wizard should contains "owner"
- Then type value "type=feature" to "Table_Label_Filter_Input" field on "Feature_Store_Features_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ Then type value "type=feature" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Features_Table" on "Feature_Store_Features_Tab" wizard should contains "type=feature"
- Then type value "v3io_user=123" to "Table_Label_Filter_Input" field on "Feature_Store_Features_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ Then type value "v3io_user=123" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
@@ -466,16 +502,19 @@ Feature: Feature Store Page
And wait load page
And select "Feature Vectors" tab in "Feature_Store_Tab_Selector" on "Feature_Store_Features_Vectors_Tab" wizard
And wait load 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
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ Then type value "owner" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
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
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ Then type value "type=featureVector" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
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
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ Then type value "v3io_user=123" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
@@ -489,8 +528,9 @@ Feature: Feature Store Page
And select "tab" with "Feature store" value in breadcrumbs menu
And wait load page
Then verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
- When select "my-tag" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Feature_Sets_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ When select "my-tag" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "tag" column with "text" in "Feature_Sets_Table" on "Feature_Store_Feature_Sets_Tab" wizard should contains "my-tag"
@@ -504,8 +544,9 @@ Feature: Feature Store Page
And select "tab" with "Feature store" value in breadcrumbs menu
And wait load page
And select "Feature Vectors" tab in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
- When select "test-tag" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Vectors_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ When select "test-tag" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "tag" column with "text" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "test-tag"
@@ -1044,23 +1085,38 @@ Feature: Feature Store Page
Then verify "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard should contains "Feature_Store"."Tab_List"
Then verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then check "expand_btn" not presented in "Feature_Sets_Table" on "Feature_Store_Feature_Sets_Tab" wizard
- When select "my-tag" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ When select "my-tag" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then check "expand_btn" not presented in "Feature_Sets_Table" on "Feature_Store_Feature_Sets_Tab" wizard
When select "Features" tab in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
And wait load page
Then verify "Features" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then check "expand_btn" not presented in "Features_Table" on "Feature_Store_Features_Tab" wizard
- When select "All" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ When select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then check "expand_btn" visibility in "Features_Table" on "Feature_Store_Features_Tab" wizard with 0 offset
- When select "my-tag" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Tab" wizard
+ When select "my-tag" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then check "expand_btn" not presented in "Features_Table" on "Feature_Store_Features_Tab" wizard
When select "Feature Vectors" tab in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
And wait load page
Then verify "Feature Vectors" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then check "expand_btn" not presented in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard
- When select "All" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ When select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then check "expand_btn" visibility in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard with 0 offset
- When select "test-tag" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ When select "test-tag" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then check "expand_btn" not presented in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard
@MLFS
@@ -1093,7 +1149,10 @@ Feature: Feature Store Page
Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
Then click on "Cross_Cancel_Button" element on "View_YAML" wizard
- Then select "All" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ When select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then click on cell with row index 1 in "expand_btn" column in "Feature_Sets_Table" table on "Feature_Store_Feature_Sets_Tab" wizard
Then select "View YAML" option in action menu on "Feature_Store_Feature_Sets_Tab" wizard in "Feature_Sets_Table" table at row with "latest" value in "name_expand_btn" column
Then verify if "View_YAML" popup dialog appears
@@ -1138,7 +1197,10 @@ Feature: Feature Store Page
Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
Then click on "Cross_Cancel_Button" element on "View_YAML" wizard
- Then select "All" option in "Table_Tag_Filter_Dropdown" dropdown on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ When select "All" option in "Table_Tree_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then click on cell with row index 4 in "expand_btn" column in "Feature_Vectors_Table" table on "Feature_Store_Features_Vectors_Tab" wizard
Then select "View YAML" option in action menu on "Feature_Store_Features_Vectors_Tab" wizard in "Feature_Vectors_Table" table at row with "my-tag" value in "name_expand_btn" column
Then verify if "View_YAML" popup dialog appears
@@ -1304,18 +1366,29 @@ Feature: Feature Store Page
Then click on "Create_Button" element on "Create_Feature_Vector_Popup" wizard
And wait load page
Then verify "Add_To_Feature_Vector_Table" element visibility on "Add_To_Feature_Vector_Tab" wizard
- Then verify "Table_Tree_Filter_Dropdown" element visibility on "Add_To_Feature_Vector_Tab" wizard
Then verify "Table_Name_Filter_Input" element visibility on "Add_To_Feature_Vector_Tab" wizard
- Then verify "Table_Entity_Filter_Input" element visibility on "Add_To_Feature_Vector_Tab" wizard
- Then verify "Table_Label_Filter_Input" element visibility on "Add_To_Feature_Vector_Tab" wizard
- Then verify "Table_Projects_Filter_Dropdown" element visibility on "Add_To_Feature_Vector_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then verify "Table_Projects_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Entity_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Add_To_Feature_Vector_Tab" wizard
Then verify "Features_Panel_Title" element visibility on "Add_To_Feature_Vector_Tab" wizard
Then verify "Features_Panel_Title" on "Add_To_Feature_Vector_Tab" wizard should display "Input_Hint"."Add_Feature_Vector_Hint"
- When select "test-test" option in "Table_Projects_Filter_Dropdown" filter dropdown on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ When select "test-test" option in "Table_Projects_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then "No_Data_Message" component on "commonPagesHeader" should contains "No_Data_Message"."Common_Message_Feature_Vector_Tab"
- When select "stocks" option in "Table_Projects_Filter_Dropdown" filter dropdown on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ When select "stocks" option in "Table_Projects_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then verify "Features_Panel_Title" element visibility on "Add_To_Feature_Vector_Tab" wizard
Then verify "Features_Panel_Title" on "Add_To_Feature_Vector_Tab" wizard should display "Input_Hint"."Add_Feature_Vector_Hint"
@@ -1344,13 +1417,19 @@ Feature: Feature Store Page
Then click on "Create_Button" element on "Create_Feature_Vector_Popup" wizard
And wait load page
Then type value "dep" to "Table_Name_Filter_Input" field on "Add_To_Feature_Vector_Tab" wizard
- Then type value "patient_id" to "Table_Entity_Filter_Input" field on "Add_To_Feature_Vector_Tab" wizard
Then click on "Table_Refresh_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then type value "patient_id" to "Table_Entity_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then value in "featureName" column with "text" in "Add_To_Feature_Vector_Table" on "Add_To_Feature_Vector_Tab" wizard should contains "department"
Then value in "entities" column with "text" in "Add_To_Feature_Vector_Table" on "Add_To_Feature_Vector_Tab" wizard should contains "patient_id"
Then type value "" to "Table_Name_Filter_Input" field on "Add_To_Feature_Vector_Tab" wizard
- Then type value "patient_id" to "Table_Entity_Filter_Input" field on "Add_To_Feature_Vector_Tab" wizard
Then click on "Table_Refresh_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then type value "patient_id" to "Table_Entity_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then value in "entities" column with "text" in "Add_To_Feature_Vector_Table" on "Add_To_Feature_Vector_Tab" wizard should contains "patient_id"
@MLFS
@@ -1394,7 +1473,10 @@ Feature: Feature Store Page
| patient_details : latest #age_mapped_elder |
| patient_details : latest #department |
| patient_details : latest #gender |
- Then select "stocks" option in "Table_Projects_Filter_Dropdown" dropdown on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then select "stocks" option in "Table_Projects_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then expand "Features_By_Projects_Accordion" on "Add_To_Feature_Vector_Tab" wizard
Then verify values in "Features_By_Projects_Table" table in "Features_By_Projects_Accordion" on "Add_To_Feature_Vector_Tab" wizard
| feature |
@@ -1423,7 +1505,10 @@ Feature: Feature Store Page
| stocks : latest #exchange |
Then click on "Add_Button" element on "Add_To_Feature_Vector_Tab" wizard
And set tear-down property "featureVector" created in "fsdemo-admin" project with "temp_vector01" value
- When select "temp_tag" option in "Table_Tree_Filter_Dropdown" filter dropdown on "Add_To_Feature_Vector_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ When select "temp_tag" option in "Table_Tree_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then value in "name" column with "text" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "temp_vector"
Then value in "description" column with "text" in "Feature_Vectors_Table" on "Feature_Store_Features_Vectors_Tab" wizard should contains "Automation test description"
@@ -1449,8 +1534,11 @@ Feature: Feature Store Page
| featureName |
| department |
| bad |
- | room |
- Then select "stocks-admin" option in "Table_Projects_Filter_Dropdown" dropdown on "Add_To_Feature_Vector_Tab" wizard
+ | room |
+ Then click on "Table_FilterBy_Button" element on "Add_To_Feature_Vector_Tab" wizard
+ Then select "stocks-admin" option in "Table_Projects_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then click on "add_feature_btn" in "Add_To_Feature_Vector_Table" table on "Add_To_Feature_Vector_Tab" wizard
| featureName |
| price |
diff --git a/tests/features/jobsAndWorkflows.feature b/tests/features/jobsAndWorkflows.feature
index 5cf5ffa87..0910d9319 100644
--- a/tests/features/jobsAndWorkflows.feature
+++ b/tests/features/jobsAndWorkflows.feature
@@ -25,24 +25,40 @@ Feature: Jobs and workflows
And wait load page
Then verify "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard should contains "Jobs_And_Workflows"."Tab_List"
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_Name_Filter_Input" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" dropdown element on "Jobs_Monitor_Tab" wizard should contains "Dropdown_Options"."Date_Picker_Filter_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then "Title" element on "FilterBy_Popup" should contains "Filter by" value
+ Then verify "Status_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Status_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Jobs_Status_Filter_Options"
+ And wait load page
+ Then click on "Status_Filter_Element" element on "FilterBy_Popup" wizard
+ Then "Status_All_Checkbox" element should be checked on "FilterBy_Popup" wizard
+ Then click on "Status_Filter_Element" element on "FilterBy_Popup" wizard
+ Then verify "Type_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Type_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Jobs_Type_Filter_Options"
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
Then verify "Batch_Run_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then "Batch_Run_Button" element on "Jobs_Monitor_Tab" should contains "Batch Run" value
Then verify "Resource_Monitoring_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Auto_Refresh_Checkbox" element visibility on "Jobs_Monitor_Tab" wizard
+ Then "Auto_Refresh_Checkbox" element should be checked on "Jobs_Monitor_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" dropdown element on "Jobs_Monitor_Tab" wizard should contains "Dropdown_Options"."Status_Filter_Options"
- Then verify "Table_Name_Filter_Input" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Table_Labels_Filter_Input" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Start_Time_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Start_Time_Filter_Dropdown" dropdown element on "Jobs_Monitor_Tab" wizard should contains "Dropdown_Options"."Start_Time_Filter_Options"
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- And wait load page
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Any time"
Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
- And wait load page
- And wait load page
- And wait load page
+ Then wait for 3 seconds
Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
@MLJW
@@ -69,7 +85,40 @@ Feature: Jobs and workflows
And select "Monitor Workflows" tab in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
And wait load page
Then verify "Monitor Workflows" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_Name_Filter_Input" element visibility on "Workflows_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Workflows_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" dropdown element on "Workflows_Monitor_Tab" wizard should contains "Dropdown_Options"."Date_Picker_Filter_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Workflows_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Workflows_Monitor_Tab" wizard
+ Then "Title" element on "FilterBy_Popup" should contains "Filter by" value
+ Then verify "Status_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Status_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Workflows_Status_Filter_Options"
+ And wait load page
+ Then click on "Status_Filter_Element" element on "FilterBy_Popup" wizard
+ Then "Status_All_Checkbox" element should be checked on "FilterBy_Popup" wizard
+ Then click on "Status_Filter_Element" element on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Workflows_Monitor_Tab" wizard
+ Then verify "Table_Refresh_Button" element visibility on "Workflows_Monitor_Tab" wizard
+ Then verify "Workflows_Monitor_Table" element visibility on "Workflows_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Workflows_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Workflows_Monitor_Tab" wizard selected option value "Any time"
Then verify "Workflows_Monitor_Table" element visibility on "Workflows_Monitor_Tab" wizard
+ Then click on "Table_Refresh_Button" element on "Workflows_Monitor_Tab" wizard
+ Then wait for 3 seconds
+ Then verify "Workflows_Monitor_Table" element visibility on "Workflows_Monitor_Tab" wizard
+ Then verify "Monitor_Workflows_Subtitle" element visibility on "Workflows_Monitor_Tab" wizard
+ Then "Monitor_Workflows_Subtitle" element on "Workflows_Monitor_Tab" should contains "View running workflows and previously executed workflows" value
+ And turn on demo mode
+ And wait load page
+ Then click on "Table_FilterBy_Button" element on "Workflows_Monitor_Tab" wizard
+ #moved to demo mode ML-7352
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
@MLJW
@passive
@@ -92,9 +141,31 @@ Feature: Jobs and workflows
And wait load page
Then verify "Schedule" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
Then verify "Table_Name_Filter_Input" element visibility on "Schedule_Monitor_Tab" wizard
- Then verify "Table_Labels_Filter_Input" element visibility on "Schedule_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Schedule_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" dropdown element on "Schedule_Monitor_Tab" wizard should contains "Dropdown_Options"."Scheduled_Date_Picker_Filter_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Schedule_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Schedule_Monitor_Tab" wizard
+ Then "Title" element on "FilterBy_Popup" should contains "Filter by" value
+ Then verify "Type_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Type_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Scheduled_Type_Filter_Options"
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Schedule_Monitor_Tab" wizard
+ Then verify "Batch_Run_Button" element visibility on "Schedule_Monitor_Tab" wizard
+ Then "Batch_Run_Button" element on "Schedule_Monitor_Tab" should contains "Batch Run" value
Then verify "Table_Refresh_Button" element visibility on "Schedule_Monitor_Tab" wizard
Then verify "Schedule_Monitor_Table" element visibility on "Schedule_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Schedule_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Schedule_Monitor_Tab" wizard selected option value "Any time"
+ Then verify "Schedule_Monitor_Table" element visibility on "Schedule_Monitor_Tab" wizard
+ Then click on "Table_Refresh_Button" element on "Schedule_Monitor_Tab" wizard
+ Then wait for 3 seconds
+ Then verify "Schedule_Monitor_Table" element visibility on "Schedule_Monitor_Tab" wizard
@MLJW
@passive
@@ -108,18 +179,35 @@ 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
- When select "Past hour" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then verify "Past hour" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- When select "Past 24 hours" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then verify "Past 24 hours" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- When select "Past week" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then verify "Past week" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- When select "Past month" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then verify "Past month" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- When select "Past year" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then verify "Past leap year" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- 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
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" dropdown element on "Jobs_Monitor_Tab" wizard should contains "Dropdown_Options"."Date_Picker_Filter_Options"
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Past 24 hours"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Any time"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+ When select "Past hour" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Past hour"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+ When select "Past week" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Past week"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+ When select "Past month" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Past month"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+ When select "Past year" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitor_Tab" wizard selected option value "Past year"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "10/01/2021 00:00" to "11/30/2021 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify from "10/01/2021 00:00" to "11/30/2021 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
@MLJW
@passive
@@ -133,14 +221,14 @@ 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
- When pick up "Custom range" from "03/31/2014 10:30" to "03/21/2015 19:15" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then verify from "03/31/2014 10:30" to "03/21/2015 19:15" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- When pick up "Custom range" from "03/31/2044 10:30" to "03/21/2015 19:15" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "03/31/2014 10:30" to "03/21/2015 19:15" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then verify from "03/31/2014 10:30" to "03/21/2015 19:15" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "03/31/2044 10:30" to "03/21/2015 19:15" in "Date_Time_Picker" via "Date_Picker_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"
Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
- When pick up "Custom range" from "03/31/2030 10:30" to "03/31/2030 10:31" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then verify from "03/31/2030 10:30" to "03/31/2030 10:31" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- 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
+ When pick up "Custom range" from "03/31/2030 10:30" to "03/31/2030 10:31" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then verify from "03/31/2030 10:30" to "03/31/2030 10:31" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "03/31/2025 10:31" to "03/21/2025 10:30" in "Date_Time_Picker" via "Date_Picker_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
@@ -155,7 +243,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
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
Then type value "test" to "Table_Name_Filter_Input" field on "Jobs_Monitor_Tab" wizard
Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
And wait load page
@@ -217,18 +305,22 @@ 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
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then type value "author" to "Table_Labels_Filter_Input" field on "Jobs_Monitor_Tab" wizard
- And wait load page
- Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then "Title" element on "FilterBy_Popup" should contains "Filter by" value
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value "author" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "author"
- Then type value "mlrun/schedule-name=tf2-serving" to "Table_Labels_Filter_Input" field on "Jobs_Monitor_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then type value "mlrun/schedule-name=tf2-serving" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "mlrun/schedule-name=tf2-serving"
- Then type value "123456" to "Table_Labels_Filter_Input" field on "Jobs_Monitor_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then type value "123456" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
@@ -248,12 +340,14 @@ Feature: Jobs and workflows
And select "Schedule" tab in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
And wait load page
Then verify "Schedule" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- Then type value "v3io_user" to "Table_Labels_Filter_Input" field on "Schedule_Monitor_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Schedule_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Schedule_Monitor_Tab" wizard
+ Then type value "v3io_user" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Schedule_Monitor_Table" on "Schedule_Monitor_Tab" wizard should contains "v3io_user"
- Then type value "v3io_user=admin" to "Table_Labels_Filter_Input" field on "Schedule_Monitor_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Schedule_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Schedule_Monitor_Tab" wizard
+ Then type value "v3io_user=admin" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
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"
@@ -269,19 +363,32 @@ 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
- When pick up "Custom range" from "09/03/2021 00:00" to "09/04/2021 00:00" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then verify from "09/03/2021 00:00" to "09/04/2021 00:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "09/03/2021 00:00" to "09/04/2021 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then verify from "09/03/2021 00:00" to "09/04/2021 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
- Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "status" column with "tooltip" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "Completed"
- Then select "Error" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then select "Error" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "status" column with "tooltip" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "Error"
- When pick up "Custom range" from "09/08/2021 00:00" to "09/09/2021 00:00" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then verify from "09/08/2021 00:00" to "09/09/2021 00:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "10/01/2021 00:00" to "11/30/2021 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then verify from "10/01/2021 00:00" to "11/30/2021 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
- Then select "Pending" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Error" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then select "Pending" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "status" column with "tooltip" in "Jobs_Monitor_Table" on "Jobs_Monitor_Tab" wizard should contains "Pending"
@@ -297,10 +404,11 @@ 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 select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
Then type value "seff" to "Table_Name_Filter_Input" field on "Jobs_Monitor_Tab" wizard
- Then type value "kind" to "Table_Labels_Filter_Input" field on "Jobs_Monitor_Tab" wizard
- Then click on "Table_Refresh_Button" element on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then type value "kind" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then select "Batch re-run" option in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table at row with "seff" value in "name" column
And wait load page
@@ -326,8 +434,8 @@ Feature: Jobs and workflows
Then "Auto_Refresh_Checkbox" element should be checked on "Jobs_Monitor_Tab" wizard
Then uncheck "Auto_Refresh_Checkbox" element on "Jobs_Monitor_Tab" wizard
Then "Auto_Refresh_Checkbox" element should be unchecked on "Jobs_Monitor_Tab" wizard
- When pick up "Custom range" from "11/07/2021 18:00" to "11/08/2021 18:00" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then verify from "11/07/2021 18:00" to "11/08/2021 18:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "11/07/2021 18:00" to "11/08/2021 18:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then verify from "11/07/2021 18:00" to "11/08/2021 18:00" filter band in "Custom_Range_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 18:00" to "11/08/2021 18:00"
@MLJW
@@ -343,11 +451,11 @@ Feature: Jobs and workflows
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
- When pick up "Custom range" from "01/01/2021 00:00" to "01/01/2023 00:00" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then verify from "01/01/2021 00:00" to "01/01/2023 00:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "01/01/2021 00:00" to "01/01/2023 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then verify from "01/01/2021 00:00" to "01/01/2023 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
@@ -361,10 +469,10 @@ Feature: Jobs and workflows
Then verify "Overview_Headers" on "Jobs_Monitor_Tab_Info_Pane" wizard should contains "Jobs_Monitor_Tab_Info_Pane"."Overview_Headers"
Then click on "Arrow_Back" element on "Jobs_Monitor_Tab_Info_Pane" wizard
And wait load page
- Then verify from "01/01/2021 00:00" to "01/01/2023 00:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then verify from "01/01/2021 00:00" to "01/01/2023 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
Then click on "Arrow_Back" element on "Jobs_Monitor_Tab" wizard
And wait load page
- Then verify from "01/01/2021 00:00" to "01/01/2023 00:00" filter band in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then verify from "01/01/2021 00:00" to "01/01/2023 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
@MLJW
@smoke
@@ -378,10 +486,15 @@ Feature: Jobs and workflows
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
Then verify options in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table with "Job" value in "type" column should contains "Jobs_And_Workflows"."Job_Action_Menu_Options"
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Batch_Run_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Auto_Refresh_Checkbox" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_Refresh_Button" element visibility on "Jobs_Monitor_Tab" wizard
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
Then verify "Action_Menu" dropdown element on "Jobs_Monitor_Tab_Info_Pane" wizard should contains "Jobs_And_Workflows"."Job_Overview_Action_Menu_Options"
@@ -389,6 +502,8 @@ Feature: Jobs and workflows
Then verify "Header" element visibility on "Jobs_Monitor_Tab_Info_Pane" wizard
Then verify "Updated" element visibility on "Jobs_Monitor_Tab_Info_Pane" wizard
Then verify "Cross_Close_Button" element visibility on "Jobs_Monitor_Tab_Info_Pane" wizard
+ Then verify "Resource_Monitoring_Button" element visibility on "Jobs_Monitor_Tab_Info_Pane" wizard
+ Then verify "Info_Pane_Refresh_Button" 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"
Then verify "Overview" tab is active in "Info_Pane_Tab_Selector" on "Jobs_Monitor_Tab_Info_Pane" wizard
Then verify "Overview_Headers" on "Jobs_Monitor_Tab_Info_Pane" wizard should contains "Jobs_Monitor_Tab_Info_Pane"."Overview_Headers"
@@ -405,7 +520,7 @@ Feature: Jobs and workflows
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
Then select "Delete" option in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table at row with "test-m_ingest" value in "name" column
And wait load page
Then verify if "Confirm_Popup" popup dialog appears
@@ -459,8 +574,11 @@ Feature: Jobs and workflows
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Schedule_Monitor_Table" table on "Schedule_Monitor_Tab" wizard
And wait load page
@@ -474,8 +592,6 @@ Feature: Jobs and workflows
@MLJW
@passive
@smoke
- @FAILED_TODO
- #TODO: Bug ML-6603 [Monitor Jobs, per project] The artifact preview is not collapsed
Scenario: MLJW065 - Check all mandatory components in Item infopane on Artifacts tab on Jobs Monitor Page
Given open url
And wait load page
@@ -485,8 +601,11 @@ 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 wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
When click on cell with value "trainer-train" in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
@@ -598,7 +717,7 @@ Feature: Jobs and workflows
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- Then select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
Then select "View YAML" option in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table at row with "test-m_ingest" value in "name" column
Then verify if "View_YAML" popup dialog appears
Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
@@ -606,7 +725,7 @@ Feature: Jobs and workflows
When click on "Cross_Cancel_Button" element on "View_YAML" wizard
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
- Then select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
@@ -906,16 +1025,38 @@ Feature: Jobs and workflows
And hover "MLRun_Logo" component on "commonPagesHeader" wizard
And wait load page
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
- When pick up "Custom range" from "09/01/2021 18:00" to "09/03/2021 18:00" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then select "Error" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "09/01/2021 18:00" to "09/03/2021 18:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Error" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then verify options in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table with "Error" value in "status" column should contains "Jobs_And_Workflows"."Job_Action_Menu_Options"
- Then select "Running" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Error" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then select "Running" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then verify options in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table with "Running" value in "status" column should contains "Jobs_And_Workflows"."Running_Job_Action_Menu_Options"
- When pick up "Custom range" from "08/28/2021 18:00" to "09/01/2021 18:00" in "Date_Time_Picker" via "Start_Time_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
- Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When pick up "Custom range" from "08/28/2021 18:00" to "09/01/2021 18:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Running" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
Then verify options in action menu on "Jobs_Monitor_Tab" wizard in "Jobs_Monitor_Table" table with "Completed" value in "status" column should contains "Jobs_And_Workflows"."Job_Action_Menu_Options"
- Then select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
- Then select "Pending" option in "Status_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitor_Tab" wizard
+ Then select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then select "Pending" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
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
@@ -1167,12 +1308,12 @@ Feature: Jobs and workflows
And select "tab" with "Jobs and workflows" value in breadcrumbs menu
And wait load page
Then verify redirection from "projects/default/jobs/INVALID" to "projects/default/jobs/monitor-jobs"
- Then select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
Then verify redirection from "projects/default/jobs/INVALID" to "projects/default/jobs/monitor-jobs"
- Then select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ Then select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
And wait load page
@@ -1195,6 +1336,12 @@ Feature: Jobs and workflows
And wait load page
Then verify redirection from "projects/default/jobs/monitor-jobs/aggregate-test/864f4da42773494eb94dce1c8834feb6/INVALID" to "projects/default/jobs/monitor-jobs/aggregate-test/864f4da42773494eb94dce1c8834feb6/overview"
Then verify redirection from "projects/default/jobs/monitor-jobs/aggregate-test/INVALID/overview" to "projects/default/jobs/monitor-jobs"
+ And wait load page
+ Then verify if "Notification_Popup" popup dialog appears
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "This job either does not exist or was deleted" value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
And select "Schedule" tab in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
And wait load page
Then verify redirection from "projects/default/jobs/INVALID" to "projects/default/jobs/monitor-jobs"
@@ -1241,9 +1388,13 @@ Feature: Jobs and workflows
Then select "Pods" tab in "Info_Pane_Tab_Selector" on "Workflows_Monitor_Tab_Info_Pane" wizard
And wait load page
Then verify redirection from "projects/churn-project-admin/jobs/monitor-workflows/workflow/eaae138e-439a-47fa-93c6-ba0fe1dc3b79/07f98fb46a424b2dbee5247b35f37727/INVALID" to "projects/churn-project-admin/jobs/monitor-workflows/workflow/eaae138e-439a-47fa-93c6-ba0fe1dc3b79/07f98fb46a424b2dbee5247b35f37727/overview"
+ And wait load page
Then verify redirection from "projects/churn-project-admin/jobs/monitor-workflows/workflow/INVALID/07f98fb46a424b2dbee5247b35f37727/overview" to "projects/churn-project-admin/jobs/monitor-workflows"
+ And wait load page
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"
+ And wait load page
Then verify redirection from "projects/INVALID/jobs/monitor-workflows/workflow/eaae138e-439a-47fa-93c6-ba0fe1dc3b79/07f98fb46a424b2dbee5247b35f37727/overview" to "projects"
+ And wait load page
@MLJW
@smoke
@@ -2195,7 +2346,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
- When select "Any time" option in "Start_Time_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
+ When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitor_Tab" wizard
And wait load page
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
When click on cell with row index 1 in "name" column in "Jobs_Monitor_Table" table on "Jobs_Monitor_Tab" wizard
@@ -2252,4 +2403,34 @@ Feature: Jobs and workflows
Then verify "Parameters_From_File_Input" element in "Parameters_Accordion" on "Modal_Wizard_Form" wizard is enabled by class name
Then verify "Parameters_Headers" on "Modal_Wizard_Form" wizard should contains "Modal_Wizard_Form"."Parameters_Table_Header"
Then verify "Hyper_Toggle_Switch" element not exists in "Parameters_Accordion" on "Modal_Wizard_Form" wizard
-
\ No newline at end of file
+
+ @MLJW
+ @passive
+ @smoke
+ Scenario: MLJW087 - Check Retry option in action menu on Workflows Monitor tab
+ Given open url
+ And click on row root with value "churn-project-admin" 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 "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
+ And select "Monitor Workflows" tab in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
+ And wait load page
+ 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"
+ Then select "Retry" option in action menu on "Workflows_Monitor_Tab" wizard in "Workflows_Monitor_Table" table at row with "kfpipeline 2021-07-06 11-16-28" value in "name" column
+ And wait load page
+ Then verify if "Notification_Popup" popup dialog appears
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Workflow ran successfully." value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ Then verify if "Notification_Popup" popup dialog appears
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" component on "Notification_Popup" should contains "Jobs_And_Workflows"."Workflows_Unsuccessful_Run_Message"
+ Then verify "Retry_Button" element visibility on "Notification_Popup" wizard
+ Then "Retry_Button" element on "Notification_Popup" should contains "RETRY" value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+
\ No newline at end of file
diff --git a/tests/features/jobsMonitoring.feature b/tests/features/jobsMonitoring.feature
index 1305b2863..239b0168f 100644
--- a/tests/features/jobsMonitoring.feature
+++ b/tests/features/jobsMonitoring.feature
@@ -8,7 +8,6 @@ Feature: Jobs Monitoring Page
Given open url
And wait load page
Then verify "Monitoring_Container" element visibility in "Projects_Monitoring_Container" on "Projects" wizard
- Then "Total_Counter_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "19" value
When click on "See_All_Link" element in "Monitoring_Jobs_Box" on "Projects" wizard
And wait load page
Then verify redirection to "projects/*/jobs-monitoring/jobs"
@@ -17,7 +16,6 @@ Feature: Jobs Monitoring Page
Then verify "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard should contains "Jobs_Monitoring"."Tab_List"
Then verify "Jobs" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 6 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
Then verify "Search_By_Name_Filter_Input" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Workflows_Tab" wizard selected option value "Past 24 hours"
@@ -52,7 +50,6 @@ Feature: Jobs Monitoring Page
Then navigate back
And wait load page
Then verify "Counter_Running_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
- Then "Counter_Running_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "16" value
When click on "Counter_Running_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" wizard
And wait load page
Then verify "Jobs" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard
@@ -67,11 +64,9 @@ Feature: Jobs Monitoring Page
Then "Status_Jobs_Running_Checkbox" element should be checked on "FilterBy_Popup" wizard
Then "Status_Pending_Checkbox" element should be checked on "FilterBy_Popup" wizard
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 15 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
And wait load page
Then verify "Counter_Failed_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
- Then "Counter_Failed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "2" value
When click on "Counter_Failed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" wizard
And wait load page
Then verify "Jobs" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard
@@ -88,11 +83,9 @@ Feature: Jobs Monitoring Page
Then "Status_Aborted_Checkbox" element should be checked on "FilterBy_Popup" wizard
Then "Status_Jobs_Error_Checkbox" element should be checked on "FilterBy_Popup" wizard
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 2 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
And wait load page
Then verify "Counter_Completed_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
- Then "Counter_Completed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "1" value
When click on "Counter_Completed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" wizard
And wait load page
Then verify "Jobs" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard
@@ -110,7 +103,6 @@ Feature: Jobs Monitoring Page
Then "Status_Jobs_Error_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
Then "Status_Jobs_Completed_Checkbox" element should be checked on "FilterBy_Popup" wizard
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 1 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
And select "crossTab" with "Jobs monitoring" value in breadcrumbs menu
Then verify redirection to "projects/*/jobs-monitoring/jobs"
Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
@@ -124,7 +116,7 @@ Feature: Jobs Monitoring Page
Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then "Error_Message" component on "Jobs_Monitoring_Jobs_Tab" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring"
-
+
@MLJM
@smoke
Scenario: MLJM004 - Check search by name, project name, filter by Date picker on Jobs tab of Jobs monitoring page
@@ -155,7 +147,7 @@ Feature: Jobs Monitoring Page
And wait load page
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Jobs_Tab" wizard selected option value "Past 24 hours"
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 6 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 7 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
When select "Any time" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitoring_Jobs_Tab" wizard
And wait load page
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Jobs_Tab" wizard selected option value "Any time"
@@ -169,21 +161,227 @@ Feature: Jobs Monitoring Page
And wait load page
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Jobs_Tab" wizard selected option value "Past week"
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 6 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 7 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
When select "Past month" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitoring_Jobs_Tab" wizard
And wait load page
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Jobs_Tab" wizard selected option value "Past month"
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 6 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 7 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
When select "Past year" option in "Date_Picker_Filter_Dropdown" filter dropdown on "Jobs_Monitoring_Jobs_Tab" wizard
And wait load page
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Jobs_Tab" wizard selected option value "Past year"
Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
- Then verify that 6 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 7 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
When pick up "Custom range" from "09/03/2024 00:00" to "09/04/2024 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitoring_Jobs_Tab" wizard
Then verify from "09/03/2024 00:00" to "09/04/2024 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitoring_Jobs_Tab" wizard
And wait load page
-
+
+ @MLJM
+ @smoke
+ Scenario: MLJM007 - Check filter by Statuses and View Yaml action on Jobs tab of Jobs monitoring page
+ Given open url
+ And wait load page
+ When click on "See_All_Link" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/jobs"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ When select "Aborted" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Aborted"
+ When select "Aborting" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Aborted, Aborting"
+ When select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "3 items selected"
+ When select "Error" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "4 items selected"
+ When select "Running" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "5 items selected"
+ When select "Pending" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then select "View YAML" option in action menu on "Jobs_Monitoring_Jobs_Tab" wizard in "Jobs_Table" table at row with "test" value in "name" column
+ Then verify if "View_YAML" popup dialog appears
+ Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
+ Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
+
+ @MLJM
+ @smoke
+ Scenario: MLJM010 - Check filter by Types on Jobs tab of Jobs monitoring page
+ Given open url
+ And wait load page
+ When click on "See_All_Link" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/jobs"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ When select "Job" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Job"
+ When select "Nuclio" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Nuclio"
+ When select "Application" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Type"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Application"
+ When select "Serving" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Type"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Serving"
+ When select "Spark" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Type"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Spark"
+ When select "Horovod" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Horovod"
+ When select "Dask" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Type"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Dask"
+ When select "Databricks" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Type"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Databricks"
+ When select "Local" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Type"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Local"
+ When select "Handler" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Handler"
+
+ @MLJM
+ @smoke
+ Scenario: MLJM011 - Check filter by Labels on Jobs tab of Jobs monitoring page
+ Given open url
+ And wait load page
+ When click on "See_All_Link" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/jobs"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value "host" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ And wait load page
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then value in "labels" column with "dropdowns" in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard should contains "host"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then type value "author=yaronh" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ And wait load page
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then value in "labels" column with "dropdowns" in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard should contains "author=yaronh"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then type value " " to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then verify "Table_Label_Filter_Input" on "FilterBy_Popup" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
+ And select "Scheduled" tab in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Scheduled_Tab" wizard
+ And wait load page
+ And select "Jobs" tab in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard
+ And wait load page
+ Then verify options in action menu on "Jobs_Monitoring_Jobs_Tab" wizard in "Jobs_Table" table with "Job" value in "type" column should contains "Jobs_And_Workflows"."Job_Action_Menu_Options"
+ Then select "Batch re-run" option in action menu on "Jobs_Monitoring_Jobs_Tab" wizard in "Jobs_Table" table at row with "sef" value in "name" column
+ And wait load page
+ Then verify "Title" element visibility on "Modal_Wizard_Form" wizard
+ And wait load page
+ Then "Title" element on "Modal_Wizard_Form" should contains "Batch Re-Run" value
+ Then verify "Run_Button" element visibility on "Modal_Wizard_Form" wizard
+ Then "Run_Button" element on "Modal_Wizard_Form" should contains "Run" value
+ And click on "Run_Button" element on "Modal_Wizard_Form" wizard
+ Then wait for 5 seconds
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "The batch run was started" value
+ And wait load page
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ And wait load page
+ Then select "Delete" option in action menu on "Jobs_Monitoring_Jobs_Tab" wizard in "Jobs_Table" table at row with "qwe" value in "name" column
+ And wait load page
+ Then verify if "Confirm_Popup" popup dialog appears
+ Then "Title" element on "Confirm_Popup" should contains "Delete job?" value
+ When click on "Delete_Button" element on "Confirm_Popup" wizard
+ Then wait for 5 seconds
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Job is successfully deleted" value
+ And wait load page
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ And wait load page
+
@MLJM
@smoke
Scenario: MLJM002 - Check components on Workflows tab of Jobs monitoring page
@@ -192,7 +390,6 @@ Feature: Jobs Monitoring Page
Then verify "Monitoring_Container" element visibility in "Projects_Monitoring_Container" on "Projects" wizard
Then verify "Monitoring_Workflows_Box" element visibility in "Projects_Monitoring_Container" on "Projects" wizard
Then verify "Total_Counter_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
- Then "Total_Counter_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "2" value
When click on "See_All_Link" element in "Monitoring_Workflows_Box" on "Projects" wizard
And wait load page
Then verify redirection to "projects/*/jobs-monitoring/workflows"
@@ -201,7 +398,6 @@ Feature: Jobs Monitoring Page
Then verify "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Workflows_Tab" wizard should contains "Jobs_Monitoring"."Tab_List"
Then verify "Workflows" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Workflows_Tab" wizard
Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
- Then verify that 2 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
Then verify "Search_By_Name_Filter_Input" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Workflows_Tab" wizard selected option value "Past 24 hours"
@@ -228,7 +424,6 @@ Feature: Jobs Monitoring Page
Then navigate back
And wait load page
Then verify "Counter_Running_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
- Then "Counter_Running_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "0" value
When click on "Counter_Running_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
And wait load page
Then verify "Workflows" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Workflows_Tab" wizard
@@ -241,11 +436,9 @@ Feature: Jobs Monitoring Page
Then "Status_Workflows_Error_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
Then "Status_Failed_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
Then "Status_Workflows_Completed_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
- Then verify that 0 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
And wait load page
Then verify "Counter_Failed_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
- Then "Counter_Failed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "1" value
When click on "Counter_Failed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
And wait load page
Then verify "Workflows" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Workflows_Tab" wizard
@@ -259,11 +452,9 @@ Feature: Jobs Monitoring Page
Then "Status_Workflows_Running_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
Then "Status_Workflows_Completed_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
- Then verify that 1 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
And wait load page
Then verify "Counter_Completed_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
- Then "Counter_Completed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "1" value
When click on "Counter_Completed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
And wait load page
Then verify "Workflows" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Workflows_Tab" wizard
@@ -277,7 +468,6 @@ Feature: Jobs Monitoring Page
Then "Status_Workflows_Running_Checkbox" element should be unchecked on "FilterBy_Popup" wizard
Then "Status_Workflows_Completed_Checkbox" element should be checked on "FilterBy_Popup" wizard
Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
- Then verify that 1 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
And select "crossTab" with "Jobs monitoring" value in breadcrumbs menu
Then verify redirection to "projects/*/jobs-monitoring/jobs"
Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
@@ -361,6 +551,68 @@ Feature: Jobs Monitoring Page
When pick up "Custom range" from "09/03/2024 00:00" to "09/04/2024 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitoring_Workflows_Tab" wizard
Then verify from "09/03/2024 00:00" to "09/04/2024 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitoring_Workflows_Tab" wizard
And wait load page
+
+ @MLJM
+ @smoke
+ Scenario: MLJM008 - Check filter by Statuses and View Yaml action on Workflows tab of Jobs monitoring page
+ Given open url
+ And wait load page
+ When click on "See_All_Link" element in "Monitoring_Workflows_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/workflows"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ When select "Error" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
+ Then "No_Data_Message" component on "commonPagesHeader" should be equal "No_Data_Message"."Common_Message_Jobs_Monitoring_Status"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Error"
+ When select "Failed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Error, Failed"
+ When select "Running" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "3 items selected"
+ When select "Completed" option in "Status_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify "Status_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then select "View YAML" option in action menu on "Jobs_Monitoring_Workflows_Tab" wizard in "Workflows_Table" table at row with "kfpipeline 2021-07-06 11-16-28" value in "name" column
+ Then verify if "View_YAML" popup dialog appears
+ Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
+ Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
+ Then click on "Cross_Cancel_Button" element on "View_YAML" wizard
+ And wait load page
+ Then verify options in action menu on "Jobs_Monitoring_Workflows_Tab" wizard in "Workflows_Table" table with "Completed" value in "status" column should contains "Jobs_And_Workflows"."Workflows_Action_Menu_Options"
+ Then select "Retry" option in action menu on "Jobs_Monitoring_Workflows_Tab" wizard in "Workflows_Table" table at row with "kfpipeline 2021-07-06 11-16-28" value in "name" column
+ And wait load page
+ Then verify if "Notification_Popup" popup dialog appears
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Workflow ran successfully." value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ Then verify if "Notification_Popup" popup dialog appears
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" component on "Notification_Popup" should contains "Jobs_And_Workflows"."Workflows_Unsuccessful_Run_Message"
+ Then verify "Retry_Button" element visibility on "Notification_Popup" wizard
+ Then "Retry_Button" element on "Notification_Popup" should contains "RETRY" value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
@MLJM
@smoke
@@ -372,7 +624,6 @@ Feature: Jobs Monitoring Page
Then verify "Total_Job_Counter_Title" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
Then "Total_Job_Counter_Title" element in "Monitoring_Scheduled_Box" on "Projects" should contains "Jobs" value
Then verify "Total_Job_Counter_Number" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
- Then "Total_Job_Counter_Number" element in "Monitoring_Scheduled_Box" on "Projects" should contains "7" value
Then verify "Jobs_See_All_Link" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
When click on "Jobs_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
And wait load page
@@ -382,7 +633,6 @@ Feature: Jobs Monitoring Page
Then verify "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Scheduled_Tab" wizard should contains "Jobs_Monitoring"."Tab_List"
Then verify "Scheduled" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
- Then verify that 7 row elements are displayed in "Scheduled_Table" on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Search_By_Name_Filter_Input" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Scheduled_Tab" wizard selected option value "Next 24 hours"
@@ -408,7 +658,6 @@ Feature: Jobs Monitoring Page
Then verify "Total_Workflows_Counter_Title" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
Then "Total_Workflows_Counter_Title" element in "Monitoring_Scheduled_Box" on "Projects" should contains "Workflows" value
Then verify "Total_Workflows_Counter_Number" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
- Then "Total_Workflows_Counter_Number" element in "Monitoring_Scheduled_Box" on "Projects" should contains "1" value
Then verify "Workflows_See_All_Link" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
When click on "Workflows_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
Then verify redirection to "projects/*/jobs-monitoring/scheduled"
@@ -417,7 +666,6 @@ Feature: Jobs Monitoring Page
Then verify "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Scheduled_Tab" wizard should contains "Jobs_Monitoring"."Tab_List"
Then verify "Scheduled" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
- Then verify that 1 row elements are displayed in "Scheduled_Table" on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Search_By_Name_Filter_Input" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify "Date_Picker_Filter_Dropdown" dropdown on "Jobs_Monitoring_Scheduled_Tab" wizard selected option value "Next 24 hours"
@@ -444,7 +692,6 @@ Feature: Jobs Monitoring Page
Then verify "Total_Scheduled_Title" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
Then "Total_Scheduled_Title" element in "Monitoring_Scheduled_Box" on "Projects" should contains "Total" value
Then verify "Total_Job_Counter_Number" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
- Then "Total_Scheduled_Number" element in "Monitoring_Scheduled_Box" on "Projects" should contains "8" value
Then verify "Total_See_All_Link" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
When click on "Total_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
And wait load page
@@ -521,3 +768,138 @@ Feature: Jobs Monitoring Page
When pick up "Custom range" from "09/03/2024 00:00" to "09/04/2024 00:00" in "Date_Time_Picker" via "Date_Picker_Filter_Dropdown" on "Jobs_Monitoring_Scheduled_Tab" wizard
Then verify from "09/03/2024 00:00" to "09/04/2024 00:00" filter band in "Custom_Range_Filter_Dropdown" filter dropdown on "Jobs_Monitoring_Scheduled_Tab" wizard
And wait load page
+
+ @MLJM
+ @smoke
+ Scenario: MLJM009 - Check filter by Statuses and View Yaml action on Scheduled tab of Jobs monitoring page
+ Given open url
+ And wait load page
+ When click on "Total_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/scheduled"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "All"
+ When select "Jobs" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then select "View YAML" option in action menu on "Jobs_Monitoring_Scheduled_Tab" wizard in "Scheduled_Table" table at row with "clean-data" value in "name" column
+ Then verify if "View_YAML" popup dialog appears
+ Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
+ Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
+ Then click on "Cross_Cancel_Button" element on "View_YAML" wizard
+ And wait load page
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Jobs"
+ When select "Workflows" option in "Type_Filter_Dropdown" filter dropdown on "FilterBy_Popup" wizard
+ Then click on "Title" element on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
+ And wait load page
+ Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then verify "Type_Filter_Dropdown" dropdown on "FilterBy_Popup" wizard selected option value "Workflows"
+ Then click on "Table_FilterBy_Button" element on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then select "View YAML" option in action menu on "Jobs_Monitoring_Scheduled_Tab" wizard in "Scheduled_Table" table at row with "main3" value in "name" column
+ Then verify if "View_YAML" popup dialog appears
+ Then verify "Cross_Cancel_Button" element visibility on "View_YAML" wizard
+ Then verify "YAML_Modal_Container" element visibility on "View_YAML" wizard
+
+ @MLJM
+ @smoke
+ Scenario: MLJM012 - Check jobs/workflows/scheduled count consistency among counter data and Jobs monitoring Tabs
+ Given open url
+ And wait load page
+ Then verify "Monitoring_Container" element visibility in "Projects_Monitoring_Container" on "Projects" wizard
+ Then "Total_Counter_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "20" value
+ When click on "See_All_Link" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/jobs"
+ Then verify "Jobs" tab is active in "Cross_Jobs_Tab_Selector" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 7 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then navigate back
+ And wait load page
+ Then verify "Counter_Running_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
+ Then "Counter_Running_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "16" value
+ When click on "Counter_Running_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 15 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify "Counter_Failed_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
+ Then "Counter_Failed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "3" value
+ When click on "Counter_Failed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 3 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify "Counter_Completed_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
+ Then "Counter_Completed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "1" value
+ When click on "Counter_Completed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" wizard
+ And wait load page
+ Then verify "Jobs_Table" element visibility on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then verify that 1 row elements are displayed in "Jobs_Table" on "Jobs_Monitoring_Jobs_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify "Total_Counter_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
+ Then "Total_Counter_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "3" value
+ When click on "See_All_Link" element in "Monitoring_Workflows_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/workflows"
+ Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify that 3 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then navigate back
+ And wait load page
+ Then verify "Counter_Running_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
+ Then "Counter_Running_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "0" value
+ When click on "Counter_Running_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
+ And wait load page
+ Then verify that 0 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify "Counter_Failed_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
+ Then "Counter_Failed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "1" value
+ When click on "Counter_Failed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
+ And wait load page
+ Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify that 1 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify "Counter_Completed_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
+ Then "Counter_Completed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "2" value
+ When click on "Counter_Completed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
+ And wait load page
+ Then verify "Workflows_Table" element visibility on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then verify that 2 row elements are displayed in "Workflows_Table" on "Jobs_Monitoring_Workflows_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then "Total_Job_Counter_Number" element in "Monitoring_Scheduled_Box" on "Projects" should contains "7" value
+ Then verify "Jobs_See_All_Link" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
+ When click on "Jobs_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/scheduled"
+ Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then verify that 7 row elements are displayed in "Scheduled_Table" on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then navigate back
+ And wait load page
+ Then "Total_Workflows_Counter_Number" element in "Monitoring_Scheduled_Box" on "Projects" should contains "1" value
+ Then verify "Workflows_See_All_Link" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
+ When click on "Workflows_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/scheduled"
+ Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then verify that 1 row elements are displayed in "Scheduled_Table" on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then click on breadcrumbs "projectsPage" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify redirection to "projects"
+ Then "Total_Scheduled_Number" element in "Monitoring_Scheduled_Box" on "Projects" should contains "8" value
+ Then verify "Total_See_All_Link" element visibility in "Monitoring_Scheduled_Box" on "Projects" wizard
+ When click on "Total_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
+ And wait load page
+ Then verify redirection to "projects/*/jobs-monitoring/scheduled"
+ Then verify "Scheduled_Table" element visibility on "Jobs_Monitoring_Scheduled_Tab" wizard
+ Then verify that 8 row elements are displayed in "Scheduled_Table" on "Jobs_Monitoring_Scheduled_Tab" wizard
+
diff --git a/tests/features/models.feature b/tests/features/models.feature
index e77b17095..9815bba5c 100644
--- a/tests/features/models.feature
+++ b/tests/features/models.feature
@@ -69,9 +69,24 @@ Feature: Models Page
And select "Model Endpoints" tab in "Models_Tab_Selector" on "Models" wizard
And wait load page
Then verify "Model Endpoints" tab is active in "Models_Tab_Selector" on "Models" wizard
- Then verify "Table_Label_Filter_Input" element visibility on "Model_Endpoints" wizard
- Then verify "Table_Sort_By_Filter" element visibility on "Model_Endpoints" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Model_Endpoints" wizard
+ Then verify "Table_FilterBy_Button" element on "Model_Endpoints" wizard should display hover tooltip "Common_Tooltips"."FilterBy_Button"
+ Then click on "Table_FilterBy_Button" element on "Model_Endpoints" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
Then verify "Table_Refresh_Button" element visibility on "Model_Endpoints" wizard
+ Then verify "Table_Refresh_Button" element on "Model_Endpoints" wizard should display hover tooltip "Common_Tooltips"."Refresh_Button"
+ Then verify "Sort_By_Function" element visibility on "Model_Endpoints" wizard
+ Then verify "Sort_By_Name" element not exists on "Model_Endpoints" wizard
+ Then click on "Column_Name_Header" element on "Model_Endpoints" wizard
+ Then verify "Sort_By_Name" element visibility on "Model_Endpoints" wizard
+ Then verify "Sort_By_Function" element not exists on "Model_Endpoints" wizard
+ Then click on "Column_Function_Header" element on "Model_Endpoints" wizard
+ Then verify "Sort_By_Function" element visibility on "Model_Endpoints" wizard
+ Then verify "Sort_By_Name" element not exists on "Model_Endpoints" wizard
Then verify "Model_Endpoints_Table" element visibility on "Model_Endpoints" wizard
@MLM
@@ -93,6 +108,7 @@ Feature: Models Page
Then verify "Real-Time Pipelines" tab is active in "Models_Tab_Selector" on "Models" wizard
Then verify "Table_Name_Filter_Input" element visibility on "Real_Time_Pipelines" wizard
Then verify "Table_Refresh_Button" element visibility on "Real_Time_Pipelines" wizard
+ Then verify "Table_Refresh_Button" element on "Real_Time_Pipelines" wizard should display hover tooltip "Common_Tooltips"."Refresh_Button"
Then verify "Real_Time_Pipelines_Table" element visibility on "Real_Time_Pipelines" wizard
@MLM
@@ -168,6 +184,11 @@ Feature: Models Page
Then click on "Table_Refresh_Button" element on "Real_Time_Pipelines" wizard
And wait load page
Then value in "name" column with "text" in "Real_Time_Pipelines_Table" on "Real_Time_Pipelines" wizard should contains "churn-server"
+ Then click on cell with row index 1 in "name" column in "Real_Time_Pipelines_Table" table on "Real_Time_Pipelines" wizard
+ And wait load page
+ Then verify "Real_Time_Pipelines_Graph" element visibility on "Real_Time_Pipelines" wizard
+ When click on node with index 2 in "Real_Time_Pipelines_Graph" graph on "Real_Time_Pipelines" wizard
+ Then verify "Header" element visibility on "Real_Time_Pipeline_Pane" wizard
@MLM
@passive
@@ -211,17 +232,22 @@ Feature: Models Page
And select "Model Endpoints" tab in "Models_Tab_Selector" on "Models" wizard
And wait load page
Then verify "Model Endpoints" tab is active in "Models_Tab_Selector" on "Models" wizard
- Then verify "Table_Label_Filter_Input" element visibility on "Model_Endpoints" wizard
- Then type value "my-key" to "Table_Label_Filter_Input" field on "Model_Endpoints" wizard
- Then click on "Table_Refresh_Button" element on "Model_Endpoints" wizard
+ Then click on "Table_FilterBy_Button" element on "Model_Endpoints" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value "my-key" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Model_Endpoints_Table" on "Model_Endpoints" wizard should contains "my-key=my-value" in "Overlay"
- Then type value "my-key=my-value" to "Table_Label_Filter_Input" field on "Model_Endpoints" wizard
- Then click on "Table_Refresh_Button" element on "Model_Endpoints" wizard
+ Then click on "Table_FilterBy_Button" element on "Model_Endpoints" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value "my-key=my-value" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
Then value in "labels" column with "dropdowns" in "Model_Endpoints_Table" on "Model_Endpoints" wizard should contains "my-key=my-value" in "Overlay"
- Then type value "MY-KEY" to "Table_Label_Filter_Input" field on "Model_Endpoints" wizard
- Then click on "Table_Refresh_Button" element on "Model_Endpoints" wizard
+ Then click on "Table_FilterBy_Button" element on "Model_Endpoints" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value "MY-KEY" to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then click on "Apply_Button" element on "FilterBy_Popup" wizard
And wait load page
And verify "No_Data_Message" element visibility on "commonPagesHeader" wizard
@@ -708,6 +734,7 @@ Feature: Models Page
Then verify "Header" element visibility on "Models_Info_Pane" wizard
Then "Header" element on "Models_Info_Pane" should contains "test-model" value
Then refresh a page
+ And wait load page
Then verify "Header" element visibility on "Models_Info_Pane" wizard
Then "Header" element on "Models_Info_Pane" should contains "test-model" value
diff --git a/tests/features/projectMonitoring.feature b/tests/features/projectMonitoring.feature
index c664b5272..6bbc18639 100644
--- a/tests/features/projectMonitoring.feature
+++ b/tests/features/projectMonitoring.feature
@@ -23,7 +23,7 @@ Feature: Project Monitoring Page
@MLPM
@passive
@smoke
- Scenario: MLNB001 - Check all mandatory components on Navigation Bar
+ Scenario: MLPM001 - Check all mandatory components on Navigation Bar
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
@@ -180,12 +180,12 @@ Feature: Project Monitoring Page
Then verify "New_File_Type_Dropdown" dropdown on "Register_File_Popup" wizard selected option value "Table"
@MLPM
- @FAILED_TODO
- #TODO: 'Register Model' option is missing in list of 'Create New' dropdown in demo mode
@passive
@smoke
Scenario: MLPM005 - Check all mandatory components on Register Model Popup
Given open url
+ And turn on demo mode
+ 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
Then verify "Create_New" element visibility on "Project" wizard
@@ -203,9 +203,9 @@ Feature: Project Monitoring Page
Then verify "New_File_Name_Input" on "Register_Model_Popup" wizard should display options "Input_Hint"."Artifact_Name_Hint"
When select "V3IO" option in "Path_Scheme_Combobox" combobox on "Target_Path" accordion on "Register_Model_Popup" wizard
When type value " " to "Path_Scheme_Combobox" field on "Target_Path" on "Register_Model_Popup" wizard
- Then verify "Path_Scheme_Combobox" element in "Target_Path" on "Register_Model_Popup" wizard should display warning "Input_Hint"."V3IO_Path_Hint"
+ Then verify "Path_Scheme_Combobox" element in "Target_Path" on "Register_Model_Popup" wizard should display hover warning "Input_Hint"."V3IO_Path_Hint"
Then type value " " to "New_File_Description_Input" field on "Register_Model_Popup" wizard
- Then verify "New_File_Description_Input" on "Register_Model_Popup" wizard should display warning "Input_Hint"."Input_Field_Invalid"
+ Then verify "New_File_Description_Input" on "Register_Model_Popup" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
When add rows to "Labels_Table" table on "Register_Model_Popup" wizard
| key_input | value_input |
| key1 | value1 |
@@ -568,12 +568,22 @@ Feature: Project Monitoring Page
Then verify "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard should contains "Feature_Store"."Tab_List"
Then verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
Then type value " " to "Table_Name_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Name_Filter_Input" on "Feature_Store_Feature_Sets_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
- Then verify "Table_Label_Filter_Input" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then type value " " to "Table_Label_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Label_Filter_Input" on "Feature_Store_Feature_Sets_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value " " to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then verify "Table_Label_Filter_Input" on "FilterBy_Popup" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
Then verify "Feature_Sets_Table" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Feature_Store_Tab_Selector" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Create_Set_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
@@ -609,11 +619,17 @@ Feature: Project Monitoring Page
And wait load page
Then verify "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard should contains "Jobs_And_Workflows"."Tab_List"
Then verify "Monitor Jobs" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_Name_Filter_Input" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then verify "Batch_Run_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then "Batch_Run_Button" element on "Jobs_Monitor_Tab" should contains "Batch Run" value
Then verify "Resource_Monitoring_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Auto_Refresh_Checkbox" element visibility on "Jobs_Monitor_Tab" wizard
+ Then "Auto_Refresh_Checkbox" element should be checked on "Jobs_Monitor_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
+
@MLPM
@passive
@@ -626,14 +642,17 @@ Feature: Project Monitoring Page
And wait load page
Then verify "Schedule" tab is active in "Jobs_Tab_Selector" on "Jobs_Monitor_Tab" wizard
Then verify "Table_Name_Filter_Input" element visibility on "Schedule_Monitor_Tab" wizard
- Then verify "Table_Labels_Filter_Input" element visibility on "Schedule_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Schedule_Monitor_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Schedule_Monitor_Tab" wizard
+ Then verify "Batch_Run_Button" element visibility on "Schedule_Monitor_Tab" wizard
+ Then "Batch_Run_Button" element on "Schedule_Monitor_Tab" should contains "Batch Run" value
Then verify "Table_Refresh_Button" element visibility on "Schedule_Monitor_Tab" wizard
Then verify "Schedule_Monitor_Table" element visibility on "Schedule_Monitor_Tab" wizard
@MLPM
@passive
@smoke
- Scenario: MLB003 - Verify behaviour of Breadcrumbs menu
+ Scenario: MLPM022 - Verify behaviour of Breadcrumbs menu
Given open url
And click on row root with value "churn-project-admin" in "name" column in "Projects_Table" table on "Projects" wizard
And wait load page
@@ -689,9 +708,11 @@ Feature: Project Monitoring Page
Then verify "Batch_Run_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then "Batch_Run_Button" element on "Jobs_Monitor_Tab" should contains "Batch Run" value
Then verify "Resource_Monitoring_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_Name_Filter_Input" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" dropdown element on "Jobs_Monitor_Tab" wizard should contains "Dropdown_Options"."Status_Filter_Options"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
@MLPM
@passive
diff --git a/tests/features/projectSettings.feature b/tests/features/projectSettings.feature
index eaf788842..ec349ad03 100644
--- a/tests/features/projectSettings.feature
+++ b/tests/features/projectSettings.feature
@@ -25,6 +25,34 @@ Feature: Project Settings page
Then verify "Source_URL_Input" on "Project_Settings_General_Tab" wizard should display "Input_Hint"."Source_URL_Input"
Then type value " " to "Source_URL_Input" field on "Project_Settings_General_Tab" wizard
Then verify "Source_URL_Input" on "Project_Settings_General_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
+ Then type value "test" to "Source_URL_Input" field on "Project_Settings_General_Tab" wizard
+ Then verify "Pull_At_Runtime_Checkbox" element visibility on "Project_Settings_General_Tab" wizard
+ Then "Pull_At_Runtime_Checkbox" element should be unchecked on "Project_Settings_General_Tab" wizard
+ Then check "Pull_At_Runtime_Checkbox" element on "Project_Settings_General_Tab" wizard
+ And wait load page
+ Then verify if "Notification_Popup" popup dialog appears
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Data was edited successfully" value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ And wait load page
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ And wait load page
+ Then "Pull_At_Runtime_Checkbox" element should be checked on "Project_Settings_General_Tab" wizard
+ Then click on breadcrumbs "project" label on "commonPagesHeader" wizard
+ And wait load page
+ Then verify breadcrumbs "tab" label should be equal "Project monitoring" value
+ And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard
+ Then click on "Project_Settings_Button" element on "commonPagesHeader" wizard
+ And hover "MLRun_Logo" component on "commonPagesHeader" wizard
+ Then "Pull_At_Runtime_Checkbox" element should be checked on "Project_Settings_General_Tab" wizard
+ Then uncheck "Pull_At_Runtime_Checkbox" element on "Project_Settings_General_Tab" wizard
+ And wait load page
+ Then verify if "Notification_Popup" popup dialog appears
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Data was edited successfully" value
+ Then verify "Notification_Pop_Up_Cross_Close_Button" element visibility on "Notification_Popup" wizard
+ Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
+ And wait load page
+ Then "Pull_At_Runtime_Checkbox" element should be unchecked on "Project_Settings_General_Tab" wizard
Then verify "Artifact_Path_Input" element visibility on "Project_Settings_General_Tab" wizard
Then type value " " to "Artifact_Path_Input" field on "Project_Settings_General_Tab" wizard
Then verify "Artifact_Path_Input" on "Project_Settings_General_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
@@ -77,9 +105,8 @@ Feature: Project Settings page
And click on "MLRun_Logo" element on "commonPagesHeader" wizard
And wait load page
Then type value "cat-vs-dog-classification" to "Search_Projects_Input" field on "Projects" wizard
- Then value in "labels" column with "dropdowns" in "Projects_Table" on "Projects" wizard should contains "c=d" in "Overlay"
- Then click on "Active_Projects_Button" element on "Projects" wizard
- Then value in "labels" column with "dropdowns" in "Projects_Table" on "Projects" wizard should contains "e=f" in "Overlay"
+ Then value in "labels_key" column with "attribute_list" in "Projects_Table" on "Projects" wizard should contains "a,c,e"
+ Then value in "labels_value" column with "attribute_list" in "Projects_Table" on "Projects" wizard should contains "b,d,f"
And click on row root with value "cat-vs-dog-classification" in "name" column in "Projects_Table" table on "Projects" wizard
And wait load page
And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard
@@ -95,17 +122,15 @@ Feature: Project Settings page
Then verify "Source_URL_Input" on "Project_Settings_General_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
When add rows to "Labels_Table" table on "Project_Settings_General_Tab" wizard
| key_input | value_input |
- | a | b |
- | project_label_key | project_label_value |
| a12345 | b54321 |
+ | project_label_key | project_label_value |
+ | a | b |
Then type value "test" to "Source_URL_Input" field on "Project_Settings_General_Tab" wizard
And click on "MLRun_Logo" element on "commonPagesHeader" wizard
And wait load page
Then type value "cat-vs-dog-classification" to "Search_Projects_Input" field on "Projects" wizard
- Then value in "labels" column with "dropdowns" in "Projects_Table" on "Projects" wizard should contains "project_label_key=project_label_value" in "Overlay"
- Then click on "Active_Projects_Button" element on "Projects" wizard
- Then value in "labels" column with "dropdowns" in "Projects_Table" on "Projects" wizard should contains "a12345=b54321" in "Overlay"
- Then click on "Active_Projects_Button" element on "Projects" wizard
+ Then value in "labels_key" column with "attribute_list" in "Projects_Table" on "Projects" wizard should contains "a12345,project_label_key,a"
+ Then value in "labels_value" column with "attribute_list" in "Projects_Table" on "Projects" wizard should contains "b54321,project_label_value,b"
And click on row root with value "cat-vs-dog-classification" in "name" column in "Projects_Table" table on "Projects" wizard
And wait load page
And hover "Project_Navigation_Toggler" component on "commonPagesHeader" wizard
@@ -399,4 +424,4 @@ Feature: Project Settings page
And select "Secrets" tab in "Project_Settings_Tab_Selector" on "Project_Settings_General_Tab" wizard
And wait load page
Then verify redirection from "projects/default/settings/INVALID" to "projects/default/settings/general"
- Then verify redirection from "projects/default/INVALID/general" to "projects"
\ No newline at end of file
+ Then verify redirection from "projects/default/INVALID/general" to "projects"
diff --git a/tests/features/projectsPage.feature b/tests/features/projectsPage.feature
index 826eb1eb3..8da52e3c1 100644
--- a/tests/features/projectsPage.feature
+++ b/tests/features/projectsPage.feature
@@ -47,7 +47,7 @@ Feature: Projects Page
Then type value "" to "Search_Projects_Input" field on "Projects" wizard
Then click on "Refresh_Projects_Button" element on "Projects" wizard
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"
+ Then value in "name" column with "text" in "Projects_Table" on "Projects" wizard should contains "default"
@MLPr
@passive
@@ -105,6 +105,7 @@ Feature: Projects Page
Given open url
And wait load page
Then select "Delete" option in action menu on "Projects" wizard in "Projects_Table" table at row with "churn-project-admin" value in "name" column
+ And wait load page
Then verify if "Common_Popup" popup dialog appears
Then "Description" component on "Common_Popup" should be equal "Descriptions"."Delete_Project_Confirm_Message"
Then verify "Cancel_Button" element visibility on "Common_Popup" wizard
@@ -121,12 +122,13 @@ Feature: Projects Page
Then verify if "Create_New_Project" popup dialog appears
Then type into "Name_Input" on "Create_New_Project" popup dialog "empty-project" value
Then type into "Description_Input" on "Create_New_Project" popup dialog "empty project description" value
+ And click on "Add_Label_Button" element on "Create_New_Project" wizard
Then type value "empty" to "Labels_Key" field on "Create_New_Project" wizard
Then type value "project" to "Labels_Value" field on "Create_New_Project" wizard
When click on "Title" element on "Create_New_Project" wizard
And wait load page
Then click on "Create_Button" element on "Create_New_Project" wizard
- And wait load page
+ Then wait for 4 seconds
Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Project \"empty-project\" was created successfully" value
And wait load page
@@ -134,6 +136,8 @@ Feature: Projects Page
Then click on "Notification_Pop_Up_Cross_Close_Button" element on "Notification_Popup" wizard
And wait load page
Then check "empty-project" value in "name" column in "Projects_Table" table on "Projects" wizard
+ Then type value "empty" to "Search_Projects_Input" field on "Projects" wizard
+ Then value in "name" column with "text" in "Projects_Table" on "Projects" wizard should contains "empty"
Then select "Delete" option in action menu on "Projects" wizard in "Projects_Table" table at row with "empty-project" value in "name" column
Then verify if "Common_Popup" popup dialog appears
Then "Description" component on "Common_Popup" should be equal "Descriptions"."Delete_Project_Confirm_Message"
@@ -178,7 +182,7 @@ Feature: Projects Page
Then click on "Create_Button" element on "Create_New_Project" wizard
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
@smoke
@@ -194,7 +198,7 @@ Feature: Projects Page
Then check "automation-test-name1" value not in "name" column in "Projects_Table" table on "Projects" wizard
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
@smoke
@@ -222,7 +226,7 @@ Feature: Projects Page
Then check "automation-test-name2" value not in "name" column in "Projects_Table" table on "Projects" wizard
Then verify "New_Project_Button" element visibility on "Projects" wizard
Then "New_Project_Button" element on "Projects" should contains "New Project" value
-
+
@MLPr
@passive
@smoke
@@ -248,7 +252,7 @@ Feature: Projects Page
Then select "Unarchive" option in action menu on "Projects" wizard in "Projects_Table" table at row with "automation-test-name7" value in "name" column
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
@smoke
@@ -263,8 +267,8 @@ Feature: 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
+
+ @MLPr
@danger
@smoke
# Run this test case only with mocked backend!!!
@@ -384,13 +388,13 @@ Feature: Projects Page
Then verify "Total_Counter_Title" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
Then "Total_Counter_Title" element in "Monitoring_Jobs_Box" on "Projects" should contains "Jobs" value
Then verify "Total_Counter_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
- Then "Total_Counter_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "19" value
+ Then "Total_Counter_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "20" value
Then verify "Counter_Running_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
Then verify "Counter_Running_Status_Icon" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
Then "Counter_Running_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "16" value
Then verify "Counter_Failed_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
Then verify "Counter_Failed_Status_Icon" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
- Then "Counter_Failed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "2" value
+ Then "Counter_Failed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "3" value
Then verify "Counter_Completed_Status_Number" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
Then verify "Counter_Completed_Status_Icon" element visibility in "Monitoring_Jobs_Box" on "Projects" wizard
Then "Counter_Completed_Status_Number" element in "Monitoring_Jobs_Box" on "Projects" should contains "1" value
@@ -436,7 +440,7 @@ Feature: Projects Page
Then verify "Total_Counter_Title" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
Then "Total_Counter_Title" element in "Monitoring_Workflows_Box" on "Projects" should contains "Workflows" value
Then verify "Total_Counter_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
- Then "Total_Counter_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "2" value
+ Then "Total_Counter_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "3" value
Then verify "Counter_Running_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
Then verify "Counter_Running_Status_Icon" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
Then "Counter_Running_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "0" value
@@ -445,7 +449,7 @@ Feature: Projects Page
Then "Counter_Failed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "1" value
Then verify "Counter_Completed_Status_Number" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
Then verify "Counter_Completed_Status_Icon" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
- Then "Counter_Completed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "1" value
+ Then "Counter_Completed_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" should contains "2" value
Then verify "See_All_Link" element visibility in "Monitoring_Workflows_Box" on "Projects" wizard
Then "See_All_Link" element in "Monitoring_Workflows_Box" on "Projects" should contains "See all" value
When click on "Counter_Running_Status_Number" element in "Monitoring_Workflows_Box" on "Projects" wizard
@@ -515,3 +519,26 @@ Feature: Projects Page
When click on "Total_See_All_Link" element in "Monitoring_Scheduled_Box" on "Projects" wizard
Then verify redirection to "projects/*/jobs-monitoring/scheduled"
And wait load page
+
+ @MLPr
+ @mlrunUnhealthyTest
+ @passive
+ @smoke
+ Scenario: MLPr019 - Check Mlrun unhealthy popup
+ Given open url
+ And wait load page
+ Then verify "New_Project_Button" element visibility on "Projects" wizard
+ Then "New_Project_Button" element on "Projects" should contains "New Project" value
+ Then verify "Active_Projects_Button" element visibility on "Projects" wizard
+ Then verify "Archive_Projects_Button" element visibility on "Projects" wizard
+ Then verify "Projects_Sort_Dropdown" element visibility on "Projects" wizard
+ Then verify "Projects_Sorter" element visibility on "Projects" wizard
+ Then verify "Retrieving_projects_message" element visibility on "Projects" wizard
+ Then "Retrieving_projects_message" element on "Projects" should contains "Retrieving projects." value
+ And wait load page
+ Then verify "Notification_Pop_Up" element visibility on "Notification_Popup" wizard
+ Then "Notification_Pop_Up" element on "Notification_Popup" should contains "Failed to fetch projects" value
+ Then wait for 181 seconds
+ Then verify "Message" element visibility on "MLRun_Unhealthy_PopUp" wizard
+ Then "Message" element on "MLRun_Unhealthy_PopUp" should contains "MLRun seems to be down. Try again in a few minutes." value
+ And wait load page
diff --git a/tests/features/quickActions.feature b/tests/features/quickActions.feature
index 55216f5c1..4f50a3462 100644
--- a/tests/features/quickActions.feature
+++ b/tests/features/quickActions.feature
@@ -485,13 +485,22 @@ Feature: Quick actions Page
Then verify "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard should contains "Feature_Store"."Tab_List"
Then verify "Feature Sets" tab is active in "Feature_Store_Tab_Selector" on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" dropdown element on "Feature_Store_Feature_Sets_Tab" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
Then type value " " to "Table_Name_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Name_Filter_Input" on "Feature_Store_Feature_Sets_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
- Then verify "Table_Label_Filter_Input" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
- Then type value " " to "Table_Label_Filter_Input" field on "Feature_Store_Feature_Sets_Tab" wizard
- Then verify "Table_Label_Filter_Input" on "Feature_Store_Feature_Sets_Tab" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then type value " " to "Table_Label_Filter_Input" field on "FilterBy_Popup" wizard
+ Then verify "Table_Label_Filter_Input" on "FilterBy_Popup" wizard should display hover warning "Input_Hint"."Input_Field_Invalid"
Then verify "Feature_Sets_Table" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Feature_Store_Tab_Selector" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Create_Set_Button" element visibility on "Feature_Store_Feature_Sets_Tab" wizard
@@ -564,10 +573,18 @@ Feature: Quick actions Page
| Feature Vectors |
And wait load page
Then verify "Table_Name_Filter_Input" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
- Then verify "Table_Label_Filter_Input" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
- Then verify "Table_Tag_Filter_Dropdown" dropdown element on "Feature_Store_Features_Vectors_Tab" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Table_FilterBy_Button" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Features_Vectors_Tab" wizard
+ Then verify "Table_Label_Filter_Input" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" element visibility on "FilterBy_Popup" wizard
+ Then verify "Table_Tree_Filter_Dropdown" dropdown element on "FilterBy_Popup" wizard should contains "Dropdown_Options"."Tag_Filer_Options"
+ Then verify "Apply_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Apply_Button" element on "FilterBy_Popup" wizard is disabled
+ Then verify "Clear_Button" element visibility on "FilterBy_Popup" wizard
+ Then verify "Clear_Button" element on "FilterBy_Popup" wizard is disabled
+ Then click on "Table_FilterBy_Button" element on "Feature_Store_Feature_Sets_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
+ Then verify "Feature_Vectors_Table" element visibility on "Feature_Store_Features_Vectors_Tab" wizard
@MLPH
@passive
@@ -612,9 +629,11 @@ Feature: Quick actions Page
Then verify "Batch_Run_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then "Batch_Run_Button" element on "Jobs_Monitor_Tab" should contains "Batch Run" value
Then verify "Resource_Monitoring_Button" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_Name_Filter_Input" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Jobs_Monitor_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" element visibility on "Jobs_Monitor_Tab" wizard
- Then verify "Status_Filter_Dropdown" dropdown element on "Jobs_Monitor_Tab" wizard should contains "Dropdown_Options"."Status_Filter_Options"
+ Then verify "Jobs_Monitor_Table" element visibility on "Jobs_Monitor_Tab" wizard
@MLPH
@passive
@@ -662,6 +681,8 @@ Feature: Quick actions Page
And wait load page
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
+ Then verify "Date_Picker_Filter_Dropdown" element visibility on "Workflows_Monitor_Tab" wizard
+ Then verify "Table_FilterBy_Button" element visibility on "Workflows_Monitor_Tab" wizard
Then verify "Table_Refresh_Button" element visibility on "Workflows_Monitor_Tab" wizard
Then verify "Table_Name_Filter_Input" element visibility on "Workflows_Monitor_Tab" wizard
diff --git a/tests/features/step-definitions/steps.js b/tests/features/step-definitions/steps.js
index 865e8d24a..a9f5212b9 100644
--- a/tests/features/step-definitions/steps.js
+++ b/tests/features/step-definitions/steps.js
@@ -49,7 +49,8 @@ import {
verifyElementNotActive,
generatePath,
determineFileAccess,
- verifyClassDisabled
+ verifyClassDisabled,
+ checkComponentHintTextWithHover
} from '../common/actions/common.action'
import {
checkTableColumnValues,
@@ -1034,6 +1035,18 @@ Then(
}
)
+Then(
+ 'verify {string} element on {string} wizard should display hover tooltip {string}.{string}',
+ async function(inputField, wizard, constStorage, constValue) {
+ await checkComponentHintTextWithHover(
+ this.driver,
+ pageObjects[wizard][inputField],
+ pageObjects['commonPagesHeader']['Common_Tolltip'],
+ pageObjectsConsts[constStorage][constValue]
+ )
+ }
+)
+
Then(
'verify {string} on {string} wizard should display {string}.{string} in {string}',
async function(inputField, wizard, constStorage, constValue, commonTipType) {
diff --git a/tests/features/step-definitions/table.steps.js b/tests/features/step-definitions/table.steps.js
index c27267706..55497c763 100644
--- a/tests/features/step-definitions/table.steps.js
+++ b/tests/features/step-definitions/table.steps.js
@@ -45,7 +45,8 @@ import {
getCellByIndexColumn,
getTableRows,
isContainsSubstringInColumnCells,
- isContainsSubstringInColumnAttributrCells,
+ isContainsSubstringInColumnAttributeCells,
+ isContainsSubstringInColumnAttributeListCells,
isContainsSubstringInColumnDropdownCells,
isContainsSubstringInColumnDropdownCellsOverlay,
isContainsSubstringInColumnTooltipCells,
@@ -1240,7 +1241,16 @@ Then(
'value in {string} column with {string} in {string} on {string} wizard should contains {string}',
async function (column, type, table, wizard, substring) {
if (type === 'attribute') {
- await isContainsSubstringInColumnAttributrCells(
+ await isContainsSubstringInColumnAttributeCells(
+ this.driver,
+ pageObjects[wizard][table],
+ column,
+ substring
+ )
+ }
+
+ if (type === 'attribute_list') {
+ await isContainsSubstringInColumnAttributeListCells(
this.driver,
pageObjects[wizard][table],
column,
diff --git a/tests/features/support/hooks.js b/tests/features/support/hooks.js
index d7b50dc1e..3ab97927f 100644
--- a/tests/features/support/hooks.js
+++ b/tests/features/support/hooks.js
@@ -20,15 +20,15 @@ such restriction.
import { Before, After, Status } from '@cucumber/cucumber'
import wd from 'selenium-webdriver'
import { browser } from '../../config'
-import { clearBackendAfterTest } from '../common-tools/common-tools'
+import { clearBackendAfterTest, setRequestsFailureCondition } from '../common-tools/common-tools'
-Before(async function() {
+Before(async function () {
await this.driver.manage().window()
this.createdItems = []
this.testContext = {}
})
-After(async function(testCase) {
+After(async function (testCase) {
if (testCase.result.status === Status.FAILED) {
var stream = await this.driver.takeScreenshot()
await this.attach(stream, 'base64:image/png')
@@ -36,12 +36,7 @@ After(async function(testCase) {
let logs = []
if (browser === 'chrome') {
await this.driver
- .then(() =>
- this.driver
- .manage()
- .logs()
- .get(wd.logging.Type.BROWSER)
- )
+ .then(() => this.driver.manage().logs().get(wd.logging.Type.BROWSER))
.then(result => {
logs = result
})
@@ -51,9 +46,15 @@ After(async function(testCase) {
await this.driver.quit()
if (logs.some(log => log.level.name_ === 'SEVERE')) {
- await logs.forEach(log =>
- this.attach(`${log.level.name} ${log.message}`, 'text/plain')
- )
+ await logs.forEach(log => this.attach(`${log.level.name} ${log.message}`, 'text/plain'))
// throw new Error('There are some errors in console')
}
})
+
+Before('@mlrunUnhealthyTest', async function () {
+ await setRequestsFailureCondition(true)
+})
+
+After('@mlrunUnhealthyTest', async function () {
+ await setRequestsFailureCondition(false)
+})
diff --git a/tests/mockServer/data/funcs.json b/tests/mockServer/data/funcs.json
index 999d2be06..114e81727 100644
--- a/tests/mockServer/data/funcs.json
+++ b/tests/mockServer/data/funcs.json
@@ -30219,6 +30219,96 @@
},
"verbose": false,
"status": {}
- }
+ },
+ {
+ "spec": {
+ "priority_class_name": "igz-workload-medium",
+ "command": "python your_training_script.py",
+ "state_thresholds": {
+ "pending_scheduled": "1h",
+ "pending_not_scheduled": "-1",
+ "image_pull_backoff": "1h",
+ "executing": "24h"
+ },
+ "image": "your_image_with_horovod",
+ "description": "",
+ "replicas": 4,
+ "preemption_mode": "prevent",
+ "disable_auto_mount": true,
+ "build": {
+ "functionSourceCode": "IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG1scnVuCgojIENyZWF0ZSBvciBsb2FkIGFuIE1MUnVuIHByb2plY3QKcHJvamVjdCA9IG1scnVuLm5ld19wcm9qZWN0KCJob3Jvdm9kcHJvamVjdCIsIGNvbnRleHQ9Ii4vIiwgdXNlcl9wcm9qZWN0PVRydWUpCgojIERlZmluZSB0aGUgTVBJIGpvYiBmdW5jdGlvbgpmbiA9IG1scnVuLmNvZGVfdG9fZnVuY3Rpb24oCiAgICBuYW1lPSJob3Jvdm9kLXRyYWluIiwKICAgIGtpbmQ9Im1waWpvYiIsCiAgICBpbWFnZT0ieW91cl9pbWFnZV93aXRoX2hvcm92b2QiLAopCgojIFNldCBjb21tYW5kIGFuZCBvdGhlciBzcGVjcyBkaXJlY3RseQpmbi5zcGVjLmNvbW1hbmQgPSAicHl0aG9uIHlvdXJfdHJhaW5pbmdfc2NyaXB0LnB5Igpmbi5zcGVjLnJlcGxpY2FzID0gNAoKIyBSdW4gdGhlIGpvYgpydW4gPSBmbi5ydW4oKQoK",
+ "code_origin": "horovod-train.ipynb",
+ "origin_filename": "horovod-train.ipynb"
+ },
+ "default_handler": "",
+ "clean_pod_policy": "All",
+ "mpi_args": [
+ "-x",
+ "NCCL_SOCKET_NTHREADS=2",
+ "-x",
+ "NCCL_NSOCKS_PERTHREAD=8",
+ "-x",
+ "NCCL_MIN_NCHANNELS=4"
+ ],
+ "resources": {
+ "requests": {
+ "memory": "1Mi",
+ "cpu": "25m"
+ },
+ "limits": {
+ "memory": "20Gi",
+ "cpu": "2"
+ }
+ },
+ "env": [
+ {
+ "name": "V3IO_API",
+ "value": "v3io-webapi.default-tenant.svc:8081"
+ },
+ {
+ "name": "V3IO_USERNAME",
+ "value": "admin"
+ },
+ {
+ "name": "V3IO_ACCESS_KEY",
+ "valueFrom": {
+ "secretKeyRef": {
+ "key": "accessKey",
+ "name": "mlrun-auth-secrets.352e93afc5b83672fc9aaf3f20478d0b82f572eaddf9a8f4bf71c51d"
+ }
+ }
+ },
+ {
+ "name": "V3IO_FRAMESD",
+ "value": "framesd:8081"
+ },
+ {
+ "name": "MLRUN_AUTH_SESSION",
+ "valueFrom": {
+ "secretKeyRef": {
+ "key": "accessKey",
+ "name": "mlrun-auth-secrets.f9557c6c45ee4666c5c1550dafeb323ef82127208de229b8ea3ae472"
+ }
+ }
+ }
+ ],
+ "affinity": null,
+ "node_selector": {},
+ "tolerations": null
+ },
+ "kind": "mpijob",
+ "verbose": false,
+ "metadata": {
+ "tag": "latest",
+ "credentials": {
+ "access_key": "$ref:mlrun-auth-secrets.f9557c6c45ee4666c5c1550dafeb323ef82127208de229b8ea3ae472"
+ },
+ "name": "horovod-train",
+ "project": "sk-project-admin",
+ "hash": "c93f6c0bf4b3b633ef84c7c59093bd28b028e3a6",
+ "updated": "2024-10-08T14:06:44.563424+00:00"
+ },
+ "status": {}
+ }
]
}
diff --git a/tests/mockServer/data/run.json b/tests/mockServer/data/run.json
index d1563906e..264ef40ab 100644
--- a/tests/mockServer/data/run.json
+++ b/tests/mockServer/data/run.json
@@ -64564,6 +64564,51 @@
}
]
}
- }
+ },
+ {
+ "kind": "run",
+ "metadata": {
+ "name": "horovod-train",
+ "uid": "85c3a6bcc292462d89e4d65444d179b1",
+ "iteration": 0,
+ "project": "sk-project-admin",
+ "labels": {
+ "v3io_user": "admin",
+ "kind": "mpijob",
+ "owner": "admin",
+ "mlrun/client_version": "1.7.0-rc51",
+ "mlrun/client_python_version": "3.9.18"
+ },
+ "annotations": {}
+ },
+ "spec": {
+ "function": "sk-project-admin/horovod-train@c93f6c0bf4b3b633ef84c7c59093bd28b028e3a6",
+ "log_level": "info",
+ "parameters": {},
+ "handler": null,
+ "outputs": [],
+ "output_path": "v3io:///projects/sk-project-admin/artifacts",
+ "inputs": {},
+ "notifications": [],
+ "state_thresholds": {
+ "pending_scheduled": "1h",
+ "pending_not_scheduled": "-1",
+ "image_pull_backoff": "1h",
+ "executing": "24h"
+ },
+ "node_selector": {},
+ "hyperparams": {},
+ "hyper_param_options": {},
+ "data_stores": []
+ },
+ "status": {
+ "results": {},
+ "start_time": "2024-10-08T14:06:44.618450+00:00",
+ "last_update": "2024-10-08T14:34:12.621378+00:00",
+ "state": "aborted",
+ "abort_task_id": "74be3e06-56fb-4bc9-9ece-b77f7f818373",
+ "status_text": "aborted"
+ }
+ }
]
}
diff --git a/tests/mockServer/data/runs.json b/tests/mockServer/data/runs.json
index 16b13dfa8..455f25972 100644
--- a/tests/mockServer/data/runs.json
+++ b/tests/mockServer/data/runs.json
@@ -64451,6 +64451,51 @@
}
]
}
- }
+ },
+ {
+ "kind": "run",
+ "metadata": {
+ "name": "horovod-train",
+ "uid": "85c3a6bcc292462d89e4d65444d179b1",
+ "iteration": 0,
+ "project": "sk-project-admin",
+ "labels": {
+ "v3io_user": "admin",
+ "kind": "mpijob",
+ "owner": "admin",
+ "mlrun/client_version": "1.7.0-rc51",
+ "mlrun/client_python_version": "3.9.18"
+ },
+ "annotations": {}
+ },
+ "spec": {
+ "function": "sk-project-admin/horovod-train@c93f6c0bf4b3b633ef84c7c59093bd28b028e3a6",
+ "log_level": "info",
+ "parameters": {},
+ "handler": null,
+ "outputs": [],
+ "output_path": "v3io:///projects/sk-project-admin/artifacts",
+ "inputs": {},
+ "notifications": [],
+ "state_thresholds": {
+ "pending_scheduled": "1h",
+ "pending_not_scheduled": "-1",
+ "image_pull_backoff": "1h",
+ "executing": "24h"
+ },
+ "node_selector": {},
+ "hyperparams": {},
+ "hyper_param_options": {},
+ "data_stores": []
+ },
+ "status": {
+ "results": {},
+ "start_time": "2024-10-08T14:06:44.618450+00:00",
+ "last_update": "2024-10-08T14:34:12.621378+00:00",
+ "state": "aborted",
+ "abort_task_id": "74be3e06-56fb-4bc9-9ece-b77f7f818373",
+ "status_text": "aborted"
+ }
+ }
]
}
diff --git a/tests/mockServer/dateSynchronization.js b/tests/mockServer/dateSynchronization.js
index d04441c92..ff8f58db3 100644
--- a/tests/mockServer/dateSynchronization.js
+++ b/tests/mockServer/dateSynchronization.js
@@ -39,7 +39,7 @@ const nextHour = new Date(now.getTime() + (60 * 60 * 1000))
function updateRuns(runs) {
// update start_time та last_update
runs.runs = runs.runs.map(run => {
- if (['cf842616c89347c7bb7bca2c9e840a21', '76f48c8165da473bb4356ef7b196343f','f5751299ee21476e897dfd90d94c49c4', 'dad0fdf93bd949589f6b20f79fa47798', '9723e5a30b0e43b0b7cfda098445c446']
+ if (['cf842616c89347c7bb7bca2c9e840a21', '76f48c8165da473bb4356ef7b196343f','f5751299ee21476e897dfd90d94c49c4', 'dad0fdf93bd949589f6b20f79fa47798', '9723e5a30b0e43b0b7cfda098445c446', '85c3a6bcc292462d89e4d65444d179b1']
.includes(run.metadata.uid)) {
return { ...run, status: { ...run.status, start_time: formatDate(oneDayAgo), last_update: formatDate(oneDayAgo) }
diff --git a/tests/mockServer/mock.js b/tests/mockServer/mock.js
index 80c8eb13a..3f2b44bb0 100644
--- a/tests/mockServer/mock.js
+++ b/tests/mockServer/mock.js
@@ -92,6 +92,19 @@ const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
+// intercepts all the requests and reject them if `failAllRequests` is true
+// should be used ONLY for test framework
+let failAllRequests = false
+app.use((req, res, next) => {
+ if (failAllRequests && req.url !== '/set-failure-condition') {
+ res.statusCode = 502
+
+ res.send({})
+ } else {
+ next()
+ }
+})
+
// MLRun object Templates
const projectBackgroundTasks = {}
const backgroundTasks = {}
@@ -160,7 +173,8 @@ const projectExistsConflict = {
detail: "MLRunConflictError('Conflict - Project already exists')"
}
const projectsLimitReachedConflict = {
- detail: "MLRunHTTPError(\"Failed creating project in Iguazio: [{'status': 405, 'detail': 'Resource limit reached. Cannot create more records'}]\")"
+ detail:
+ "MLRunHTTPError(\"Failed creating project in Iguazio: [{'status': 405, 'detail': 'Resource limit reached. Cannot create more records'}]\")"
}
const secretKeyTemplate = {
provider: 'kubernetes',
@@ -308,7 +322,9 @@ function deleteProjectHandler(req, res, omitResponse) {
function filterByLabels(elementLabels, requestLabels) {
if (requestLabels?.length > 0 && !isEmpty(elementLabels)) {
- const requestLabelsList = (isArray(requestLabels) ? requestLabels : [requestLabels]).map(label => label.split('='))
+ const requestLabelsList = (isArray(requestLabels) ? requestLabels : [requestLabels]).map(
+ label => label.split('=')
+ )
return requestLabelsList.every(([key = '', value = '']) => {
const trimmedKey = key.trim()
@@ -319,10 +335,15 @@ function filterByLabels(elementLabels, requestLabels) {
}
if (trimmedValue && trimmedValue.startsWith('~')) {
- return elementLabels[trimmedKey] && elementLabels[trimmedKey].toLowerCase().includes(trimmedValue.substring(1).toLowerCase())
+ return (
+ elementLabels[trimmedKey] &&
+ elementLabels[trimmedKey].toLowerCase().includes(trimmedValue.substring(1).toLowerCase())
+ )
}
- return elementLabels[trimmedKey] && (!trimmedValue || elementLabels[trimmedKey] === trimmedValue)
+ return (
+ elementLabels[trimmedKey] && (!trimmedValue || elementLabels[trimmedKey] === trimmedValue)
+ )
})
}
@@ -372,7 +393,20 @@ function getFeatureSet(req, res) {
}
if (req.query['label']) {
- collectedFeatureSets = collectedFeatureSets.filter(featureSet => filterByLabels(featureSet.metadata.labels, req.query['label']))
+ collectedFeatureSets = collectedFeatureSets.filter(featureSet =>
+ filterByLabels(featureSet.metadata.labels, req.query['label'])
+ )
+ }
+
+ if (req.query['format'] === 'minimal') {
+ collectedFeatureSets = collectedFeatureSets.map(featureSet => {
+ const metadataFields = ['description', 'name', 'project', 'tag', 'uid', 'labels'].map(
+ fieldName => `metadata.${fieldName}`
+ )
+ const specFields = ['entities', 'targets', 'engine'].map(fieldName => `spec.${fieldName}`)
+
+ return pick(featureSet, ['kind', ...metadataFields, 'status.state', ...specFields])
+ })
}
res.send({ feature_sets: collectedFeatureSets })
@@ -459,26 +493,52 @@ function deleteProject(req, res) {
}
function deleteProjectV2(req, res) {
- const taskFunc = () => {
- return new Promise(resolve => {
- setTimeout(
- () => {
- deleteProjectHandler(req, res, true)
+ const isCascade = req.headers['x-mlrun-deletion-strategy'] === 'cascade'
- resolve()
- },
- random(5000, 10000)
- )
+ const handleDeletion = () => {
+ const taskFunc = () => {
+ return new Promise(resolve => {
+ setTimeout(
+ () => {
+ deleteProjectHandler(req, res, true)
+ resolve()
+ },
+ random(5000, 10000)
+ )
+ })
+ }
+
+ const task = createTask(null, {
+ taskFunc,
+ kind: `project.deletion.wrapper.${req.params.project}`
})
+
+ res.status = 202
+ res.send(task)
}
- const task = createTask(null, {
- taskFunc,
- kind: `project.deletion.wrapper.${req.params.project}`
- })
- res.status = 202
+ if (isCascade) {
+ handleDeletion()
+ } else {
+ const collectedProject = projects.projects.filter(
+ project => project.metadata.name === req.params['project']
+ )
- res.send(task)
+ const isEmpty = collectedProject.every(
+ project =>
+ (project.spec.functions && project.spec.functions.length > 0) ||
+ (project.spec.workflows && project.spec.workflows.length > 0) ||
+ (project.spec.artifacts && project.spec.artifacts.length > 0)
+ )
+
+ if (!isEmpty) {
+ handleDeletion()
+ } else {
+ res.status(412).send({
+ detail: `MLRunPreconditionFailedError('Project ${req.params.project} cannot be deleted since related resources found: artifacts')`
+ })
+ }
+ }
}
function patchProject(req, res) {
@@ -700,17 +760,17 @@ function getRuns(req, res) {
.filter(run => {
const runStartTime = new Date(run.status.start_time)
- if (!start_time_from || runStartTime >= new Date(start_time_from)) {
- if (state) {
- if (isArray(state)) {
- return state.includes(run.status.state)
+ if (!start_time_from || runStartTime >= new Date(start_time_from)) {
+ if (state) {
+ if (isArray(state)) {
+ return state.includes(run.status.state)
+ } else {
+ return run.status.state === state
+ }
} else {
- return run.status.state === state
+ return true
}
- } else {
- return true
}
- }
return false
})
@@ -733,12 +793,22 @@ function getRuns(req, res) {
}
if (req.query['state']) {
- collectedRuns = collectedRuns.filter(run => run.status.state === req.query['state'])
+ const state = req.query['state']
+
+ collectedRuns = collectedRuns.filter(run => {
+ if (isArray(state)) {
+ return state.includes(run.status.state)
+ } else {
+ return run.status.state === state
+ }
+ })
}
}
if (req.query['label']) {
- collectedRuns = collectedRuns.filter(run => filterByLabels(run.metadata.labels, req.query['label']))
+ collectedRuns = collectedRuns.filter(run =>
+ filterByLabels(run.metadata.labels, req.query['label'])
+ )
}
if (req.query['partition-by'] && req.query['partition-sort-by']) {
@@ -876,7 +946,9 @@ function getProjectsSchedules(req, res) {
}
if (req.query['label']) {
- collectedSchedules = collectedSchedules.filter(schedule => filterByLabels(schedule.labels, req.query['label']))
+ collectedSchedules = collectedSchedules.filter(schedule =>
+ filterByLabels(schedule.labels, req.query['label'])
+ )
}
res.send({ schedules: collectedSchedules })
@@ -1072,7 +1144,7 @@ function getProjectsFeaturesEntities(req, res) {
if (artifact === 'feature-vectors' && item.metadata.labels) {
return filterByLabels(item.metadata.labels, req.query['label'])
} else if ((artifact === 'features' || artifact === 'entities') && item.labels) {
- return filterByLabels(item.metadata.labels, req.query['label'])
+ return filterByLabels(item.labels, req.query['label'])
}
return false
@@ -1153,7 +1225,9 @@ function getArtifacts(req, res) {
}
if (req.query['label']) {
- collectedArtifacts = collectedArtifacts.filter(artifact => filterByLabels(artifact.metadata.labels, req.query['label']))
+ collectedArtifacts = collectedArtifacts.filter(artifact =>
+ filterByLabels(artifact.metadata.labels, req.query['label'])
+ )
}
if (req.query['name']) {
@@ -1192,17 +1266,17 @@ function getArtifacts(req, res) {
if (req.query['format'] === 'minimal') {
collectedArtifacts = collectedArtifacts.map(func => {
- const fieldsToPick = [
- 'db_key',
- 'producer',
- 'size',
- 'target_path',
- 'framework',
- 'metrics'
- ]
+ const fieldsToPick = ['db_key', 'producer', 'size', 'target_path', 'framework', 'metrics']
const specFieldsToPick = fieldsToPick.map(fieldName => `spec.${fieldName}`)
- return pick(func, ['kind', 'metadata', 'status', 'project', ...specFieldsToPick, ...fieldsToPick])
+ return pick(func, [
+ 'kind',
+ 'metadata',
+ 'status',
+ 'project',
+ ...specFieldsToPick,
+ ...fieldsToPick
+ ])
})
}
@@ -1290,13 +1364,12 @@ function patchProjectsFeatureVectors(req, res) {
}
function getProjectsFeatureVector(req, res) {
- const featureVector = featureVectors.feature_vectors
- .find(
- item =>
- item.metadata.project === req.params.project &&
- item.metadata.name === req.params.name &&
- (item.metadata.uid === req.params.reference || item.metadata.tag === req.params.reference)
- )
+ const featureVector = featureVectors.feature_vectors.find(
+ item =>
+ item.metadata.project === req.params.project &&
+ item.metadata.name === req.params.name &&
+ (item.metadata.uid === req.params.reference || item.metadata.tag === req.params.reference)
+ )
if (featureVector) {
res.send(featureVector)
@@ -1330,6 +1403,7 @@ function getPipelines(req, res) {
if (req.params['project'] === '*') {
const pipelinesRun = pipelineIDs.map(pipeline => pipeline.run)
const filter = JSON.parse(req.query.filter)
+ const nameFilter = req.query['name-contains']
const predicates = filter.predicates
if (!predicates.length) {
@@ -1339,28 +1413,29 @@ function getPipelines(req, res) {
next_page_token: null
})
}
-
- let queryTimestampValue, queryStateValue
-
- if (predicates.length === 1) {
- queryTimestampValue = predicates[0].timestamp_value
- queryStateValue = predicates[0].string_values ? predicates[0].string_values.values : null
- } else {
- queryTimestampValue = predicates[1].timestamp_value
- queryStateValue = predicates[0].string_values.values
- }
+ const queryFromTimestampValue = predicates.find(
+ predicate => predicate.key === 'created_at' && predicate.op === 5
+ )?.timestamp_value
+ const queryToTimestampValue =
+ predicates.find(predicate => predicate.key === 'created_at' && predicate.op === 7)
+ ?.timestamp_value ?? new Date()
+ const queryStateValue = predicates.find(predicate => predicate.key === 'status')?.string_values
+ ?.values
const collectedMonitoringPipelines = pipelinesRun.filter(pipeline => {
const pipelineCreatedAt = new Date(pipeline.created_at)
const timestampMatch =
- !queryTimestampValue || pipelineCreatedAt >= new Date(queryTimestampValue)
+ !queryFromTimestampValue ||
+ (pipelineCreatedAt >= new Date(queryFromTimestampValue) &&
+ pipelineCreatedAt <= new Date(queryToTimestampValue))
const stateMatch = queryStateValue
? Array.isArray(queryStateValue)
? queryStateValue.includes(pipeline.status)
: pipeline.status === queryStateValue
: true
+ const nameMatch = nameFilter ? pipeline.name.includes(nameFilter) : true
- return timestampMatch && stateMatch
+ return timestampMatch && stateMatch && nameMatch
})
res.send({
@@ -1370,11 +1445,15 @@ function getPipelines(req, res) {
})
}
//get pipelines for Jobs and workflows page Monitor Workflows tab
- const collectedPipelines = { ...pipelines[req.params.project] }
+ const collectedPipelines = {
+ ...(pipelines[req.params.project] ?? { runs: [], total_size: 0, next_page_token: null })
+ }
if (req.query.filter) {
const nameFilter = JSON.parse(req.query.filter).predicates.find(item => item.key === 'name')
- const statusFilter = JSON.parse(req.query.filter).predicates.find(item => item.key === 'status')
+ const queryStateValue = JSON.parse(req.query.filter).predicates.find(
+ predicate => predicate.key === 'status'
+ )?.string_values?.values
if (nameFilter) {
collectedPipelines.runs = collectedPipelines.runs.filter(pipeline => {
@@ -1382,18 +1461,37 @@ function getPipelines(req, res) {
})
}
- if (statusFilter) {
+ if (queryStateValue) {
collectedPipelines.runs = collectedPipelines.runs.filter(pipeline => {
- return pipeline.status.includes(statusFilter.string_value)
+ return Array.isArray(queryStateValue)
+ ? queryStateValue.includes(pipeline.status)
+ : pipeline.status === queryStateValue
})
}
}
+ if (req.query['name-contains']) {
+ const nameFilter = req.query['name-contains']
+ collectedPipelines.runs = collectedPipelines.runs.filter(pipeline => {
+ return pipeline.name.includes(nameFilter)
+ })
+ }
+
res.send(collectedPipelines)
}
function getPipeline(req, res) {
- const collectedPipeline = pipelineIDs.find(item => item.run.id === req.params.pipelineID)
+ const collectedPipeline = pipelineIDs.find(
+ item => item.run.id === req.params.pipelineID && item.run.project === req.params.project
+ )
+
+ if (!collectedPipeline) {
+ res.statusCode = 404
+
+ return res.send({
+ detail: `"MLRunNotFoundError('Pipeline run with id ${req.params.pipelineID} is not of project ${req.params.project}')"`
+ })
+ }
res.send(collectedPipeline)
}
@@ -1510,6 +1608,10 @@ function postFunc(req, res) {
baseFunc.metadata.hash = hashPwd
baseFunc.status = {}
+ if (!baseFunc.metadata.tag) {
+ baseFunc.metadata.tag = 'latest'
+ }
+
funcs.funcs.push(baseFunc)
res.send({ hash_key: hashPwd })
@@ -1674,7 +1776,7 @@ function getFileStats(req, res) {
const { size } = fs.statSync(filePath)
const mimeType = mime.lookup(filePath)
- res.send({mimetype: mimeType, size, modified: Date.now()})
+ res.send({ mimetype: mimeType, size, modified: Date.now() })
}
function deleteSchedule(req, res) {
@@ -1854,7 +1956,8 @@ function putTags(req, res) {
return (
artifactMetaData?.project === req.params.project &&
- (artifact.kind === req.body.identifiers[0].kind || (!artifact.kind && req.body.identifiers[0].kind === 'artifact')) &&
+ (artifact.kind === req.body.identifiers[0].kind ||
+ (!artifact.kind && req.body.identifiers[0].kind === 'artifact')) &&
(artifactMetaData?.uid === req.body.identifiers[0].uid ||
artifactMetaData?.tree === req.body.identifiers[0].uid) &&
artifactSpecData?.db_key === req.body.identifiers[0].key
@@ -1984,6 +2087,36 @@ function postArtifact(req, res) {
artifactTemplate.spec.model_file = req.body.spec.model_file
}
+ const collectedArtifactsWithSameName = artifacts.artifacts.filter(artifact => {
+ return (
+ artifact.metadata?.project === req.body.metadata.project &&
+ ((artifact.spec && artifact.spec.db_key === req.body.spec.db_key) ||
+ artifact.metadata.key === req.body.metadata.key)
+ )
+ })
+
+ collectedArtifactsWithSameName.forEach(artifact => {
+ if (artifact.metadata?.tag === req.body.metadata.tag) {
+ // override existing artifact's tag in case when we create artifact with same tag
+ artifact.metadata.tag = null
+ } else if (artifact.metadata?.tag === 'latest') {
+ // when we post an artifact with custom tag we store 2 artifacts (custom and latest)
+ // so when we post another artifact with same name we have to delete artifact with 'latest' tag
+ // or we remove latest tag in case when we have only one object
+ if (
+ collectedArtifactsWithSameName.find(
+ searchedArtifact =>
+ searchedArtifact.metadata.uid === artifact.metadata.uid &&
+ searchedArtifact.metadata?.tag !== 'latest'
+ )
+ ) {
+ remove(artifacts.artifacts, artifact)
+ } else {
+ artifact.metadata.tag = null
+ }
+ }
+ })
+
if (artifactTag === 'latest') {
artifactTemplate.metadata['tag'] = artifactTag
artifacts.artifacts.push(artifactTemplate)
@@ -2052,6 +2185,24 @@ function deleteArtifact(req, res) {
res.send({})
}
+function deleteArtifacts(req, res) {
+ const collectedArtifacts = artifacts.artifacts.filter(artifact => {
+ const artifactMetaData = artifact.metadata ?? artifact
+ const artifactSpecData = artifact.spec ?? artifact
+
+ return (
+ artifactMetaData?.project === req.params.project &&
+ (artifactSpecData?.db_key === req.query.name || artifactMetaData.key === req.query.name)
+ )
+ })
+
+ if (collectedArtifacts?.length > 0) {
+ collectedArtifacts.forEach(collectedArtifact => remove(artifacts.artifacts, collectedArtifact))
+ }
+
+ res.send({})
+}
+
function getModelEndpoints(req, res) {
let collectedEndpoints = modelEndpoints.endpoints
.filter(endpoint => endpoint.metadata.project === req.params.project)
@@ -2064,7 +2215,9 @@ function getModelEndpoints(req, res) {
}
}))
if (req.query['label']) {
- collectedEndpoints = collectedEndpoints.filter(endpoint => filterByLabels(endpoint.metadata.labels, req.query['label']))
+ collectedEndpoints = collectedEndpoints.filter(endpoint =>
+ filterByLabels(endpoint.metadata.labels, req.query['label'])
+ )
}
res.send({ endpoints: collectedEndpoints })
@@ -2384,6 +2537,13 @@ function getIguazioJob(req, res) {
})
}
+// Helper request for AQA framework to fail all the requests
+app.post('/set-failure-condition', (req, res) => {
+ failAllRequests = req.body.shouldFail
+
+ res.send(`Failure condition set to ${failAllRequests}`)
+})
+
// REQUESTS
app.get(`${mlrunAPIIngress}/frontend-spec`, getFrontendSpec)
app.get(`${mlrunAPIIngress}/projects/:project/background-tasks/:taskId`, getProjectTask)
@@ -2445,6 +2605,7 @@ app.get(`${mlrunAPIIngressV2}/projects/:project/artifacts/:key`, getArtifact)
app.post(`${mlrunAPIIngressV2}/projects/:project/artifacts`, postArtifact)
app.put(`${mlrunAPIIngressV2}/projects/:project/artifacts/:key`, putArtifact)
app.delete(`${mlrunAPIIngressV2}/projects/:project/artifacts/:key`, deleteArtifact)
+app.delete(`${mlrunAPIIngressV2}/projects/:project/artifacts`, deleteArtifacts)
app.put(`${mlrunAPIIngress}/projects/:project/tags/:tag`, putTags)
app.delete(`${mlrunAPIIngress}/projects/:project/tags/:tag`, deleteTags)
@@ -2494,7 +2655,6 @@ app.post(`${mlrunAPIIngress}/build/function`, deployMLFunction)
app.get(`${mlrunAPIIngress}/projects/:project/files`, getFile)
app.get(`${mlrunAPIIngress}/projects/:project/filestat`, getFileStats)
-
app.get(`${mlrunAPIIngress}/log/:project/:uid`, getLog)
app.get(`${mlrunAPIIngress}/projects/:project/runtime-resources`, getRuntimeResources)