Skip to content

Commit

Permalink
feat(Query): default ACO [#436]
Browse files Browse the repository at this point in the history
  • Loading branch information
vitshev committed Oct 14, 2024
1 parent 67e6cc9 commit 7897917
Show file tree
Hide file tree
Showing 15 changed files with 176 additions and 39 deletions.
21 changes: 11 additions & 10 deletions packages/ui/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,17 @@ It is supposed that a user is developer on a cluster if he has `write` access to

Available flags (**default values** are highlighted in bold):

| Flag name | Allowed values | Description |
| :----------------------------------- | :----------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| enable_per_bundle_tablet_accounting | **true**, false | Allows editing of resources of tablets through BundleEditorDialog [YTFRONT-2851](https://nda.ya.ru/t/xnLq-3Dm6fPYPo) |
| enable_per_account_tablet_accounting | **false**, true | Allows editing of resources of tablets through AccountEditorDialog [YTFRONT-2851](https://nda.ya.ru/t/xnLq-3Dm6fPYPo) |
| per_bundle_accounting_help_link | **null**, url as string | Help link for resources of tablets to display from AccountEditorDialog about moving the resources to bundles [YTFRONT-2851](https://nda.ya.ru/t/xnLq-3Dm6fPYPo) |
| enable_maintenance_api_nodes | **null**, boolean | Allows to use `add_maintenance`/`remove_maintenance` commands from `Comopnents/Nodes` page [YTFRONT-3792](https://nda.ya.ru/t/RvueJLzN6fWx3h) |
| enable_maintenance_api_proxies | **null**, boolean | Allows to use `add_maintenance`/`remove_maintenance` commands from `Components/HTTP Proxies` and `Components/RPC Proxies` pages [YTFRONT-3792](https://nda.ya.ru/t/RvueJLzN6fWx3h) |
| chyt_controller_base_url | **null**, url as string | Base url for chyt-controller |
| livy_controller_base_url | **null**, url as string | Base url for spyt-controller |
| job_trace_url_template | **null**, `{title: string; url_template: string; enforce_for_trees?: Array<string>}` | If defined adds `Job trace` item to meta-table on `Job/Details` page for a job with `archive_features/has_trace == true` and for jobs from a tree in `enforce_for_trees`, example: `{title: 'Open im MyProfiling', url_template: 'https://my.profiling.service/{cluster}/{operationId}/{jobId}', enforce_for_trees: ['tree-with-traces'] }` |
| Flag name | Allowed values | Description |
|:---------------------------------------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| enable_per_bundle_tablet_accounting | **true**, false | Allows editing of resources of tablets through BundleEditorDialog [YTFRONT-2851](https://nda.ya.ru/t/xnLq-3Dm6fPYPo) |
| enable_per_account_tablet_accounting | **false**, true | Allows editing of resources of tablets through AccountEditorDialog [YTFRONT-2851](https://nda.ya.ru/t/xnLq-3Dm6fPYPo) |
| per_bundle_accounting_help_link | **null**, url as string | Help link for resources of tablets to display from AccountEditorDialog about moving the resources to bundles [YTFRONT-2851](https://nda.ya.ru/t/xnLq-3Dm6fPYPo) |
| enable_maintenance_api_nodes | **null**, boolean | Allows to use `add_maintenance`/`remove_maintenance` commands from `Comopnents/Nodes` page [YTFRONT-3792](https://nda.ya.ru/t/RvueJLzN6fWx3h) |
| enable_maintenance_api_proxies | **null**, boolean | Allows to use `add_maintenance`/`remove_maintenance` commands from `Components/HTTP Proxies` and `Components/RPC Proxies` pages [YTFRONT-3792](https://nda.ya.ru/t/RvueJLzN6fWx3h) |
| chyt_controller_base_url | **null**, url as string | Base url for chyt-controller |
| livy_controller_base_url | **null**, url as string | Base url for spyt-controller |
| job_trace_url_template | **null**, `{title: string; url_template: string; enforce_for_trees?: Array<string>}` | If defined adds `Job trace` item to meta-table on `Job/Details` page for a job with `archive_features/has_trace == true` and for jobs from a tree in `enforce_for_trees`, example: `{title: 'Open im MyProfiling', url_template: 'https://my.profiling.service/{cluster}/{operationId}/{jobId}', enforce_for_trees: ['tree-with-traces'] }` |
| query_tracker_default_aco | **null**, `{stage1: string; stage2: string; }` | Sets the default ACO in Query Tracker requests for each stage |

### Configuration

Expand Down
10 changes: 8 additions & 2 deletions packages/ui/src/shared/constants/settings-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ interface AccountsSettings {
}

type ClusterName = string;
type Stage = string;

interface QueryTrackerSettings {
'global::queryTracker::queriesListSidebarVisibilityMode': boolean;
Expand All @@ -81,7 +82,11 @@ interface ChytSettings {
}

type QueryTrackerLastSelectedACOsSettings = {
[key in `local::${ClusterName}::queryTracker::lastSelectedACOs`]: string[];
[key in `qt-stage::${ClusterName}::queryTracker::${Stage}::lastSelectedACOs`]: string[];
};

type QueryTrackerUserDefaultACOSettings = {
[key in `qt-stage::${ClusterName}::queryTracker::${Stage}::defaultACO`]: string;
};

interface OtherSettings {
Expand Down Expand Up @@ -113,7 +118,8 @@ type DescribedSettings = GlobalSettings &
AccountsSettings &
QueryTrackerSettings &
ChytSettings &
QueryTrackerLastSelectedACOsSettings;
QueryTrackerLastSelectedACOsSettings &
QueryTrackerUserDefaultACOSettings;

export type Settings = DescribedSettings & OtherSettings;

Expand Down
1 change: 1 addition & 0 deletions packages/ui/src/shared/yt-types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export interface ClusterUiConfig {
enable_maintenance_api_proxies?: boolean;
chyt_controller_base_url?: string;
livy_controller_base_url?: string;
query_tracker_default_aco?: Record<string, string>;
job_trace_url_template?: {
title: string;
url_template: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import Link from '../../components/Link/Link';
import Button from '../../components/Button/Button';
import {AddTokenForm, VcsList} from '../../pages/query-tracker/Vcs/SettingsMenu';
import {selectIsVcsVisible, selectVcsConfig} from '../../pages/query-tracker/module/vcs/selectors';
import {QueryACOSettingsMenuForm} from '../../pages/query-tracker/QueryACO/QueryACOSettingsMenu';

export interface SettingsPage {
title: string;
Expand Down Expand Up @@ -511,6 +512,12 @@ function useSettings(cluster: string, isAdmin: boolean): Array<SettingsPage> {
]),
),

makePage(
'Query ACO',
undefined,
compact_([makeItem('Default ACO', undefined, <QueryACOSettingsMenuForm />)]),
),

makePage(
'About',
infoIcon,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.query-aco-settings-menu-form {
&__item {
display: flex;
align-items: center;

margin-bottom: 12px;

&-header {
margin: 0 8px 0 0;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import React, {FC, useEffect, useMemo} from 'react';
import {Item, SelectSingle} from '../../../../components/Select/Select';
import {useDispatch, useSelector} from 'react-redux';
import cn from 'bem-cn-lite';
import {getDefaultQueryACO, selectAvailableAco} from '../../module/query_aco/selectors';
import {getQueryACO, setUserDefaultACO} from '../../module/query_aco/actions';

import './QueryACOSettingsMenuForm.scss';

const block = cn('query-aco-settings-menu-form');

export const QueryACOSettingsMenuForm: FC = () => {
const dispatch = useDispatch();
const defaultUserACO = useSelector(getDefaultQueryACO);
const ACOList = useSelector(selectAvailableAco);

useEffect(() => {
dispatch(getQueryACO());
}, [dispatch]);

const items = useMemo(() => {
return ACOList.reduce<Item[]>((acc, item) => {
acc.push({value: item, text: item});
return acc;
}, []);
}, [ACOList]);

const handleACOChange = (value?: string) => {
if (value) {
dispatch(setUserDefaultACO(value));
}
};

return (
<div className={block()}>
<SelectSingle
value={defaultUserACO}
items={items}
onChange={handleACOChange}
placeholder="ACO"
/>
</div>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './QueryACOSettingsMenuForm';
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ import {useDispatch, useSelector} from 'react-redux';
import {QueriesPoolingContext} from '../../hooks/QueriesPooling/context';

import {getCurrentQuery} from '../../module/query/selectors';
import {getDefaultQueryACO} from '../../module/query_aco/selectors';
import {isQueryProgress} from '../../utils/query';
import {QueryItem} from '../../module/api';
import {prepareQueryPlanIds} from '../../module/query/utills';
import {UPDATE_QUERY} from '../../../../pages/query-tracker/module/query-tracker-contants';

export function useCurrentQuery() {
const query = useSelector(getCurrentQuery);
const defaultQueryACO = useSelector(getDefaultQueryACO);
const pollingContext = useContext(QueriesPoolingContext);

const dispatch = useDispatch();
Expand All @@ -19,10 +21,10 @@ export function useCurrentQuery() {
([item]: QueryItem[]) => {
dispatch({
type: UPDATE_QUERY,
data: prepareQueryPlanIds(item),
data: prepareQueryPlanIds(item, defaultQueryACO),
});
},
[dispatch],
[dispatch, defaultQueryACO],
);

useEffect(
Expand Down
11 changes: 6 additions & 5 deletions packages/ui/src/ui/pages/query-tracker/module/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import {getClusterConfigByName, getClusterProxy} from '../../../store/selectors/
import {generateQuerySettings, generateQueryText} from '../utils/query_generate';
import {RootState} from '../../../store/reducers';
import {makeDirectDownloadPath} from '../../../utils/navigation';
import {DEFAULT_QUERY_ACO, getQueryTrackerRequestOptions} from './query/selectors';
import {QueriesHistoryCursorDirection, UPDATE_QUERIES_LIST} from './query-tracker-contants';
import {getCurrentStage, getQueryTrackerRequestOptions} from './query/selectors';
import {AnyAction} from 'redux';
import {QueryEngine} from './engines';
import {getLastSelectedACONamespaces, selectIsMultipleAco} from './query_aco/selectors';
Expand Down Expand Up @@ -212,7 +212,7 @@ export type QueriesListRequestParams = {

export async function generateQueryFromTable(
engine: QueryEngine,
{cluster, path}: {cluster: string; path: string},
{cluster, path, defaultQueryACO}: {cluster: string; path: string; defaultQueryACO: string},
): Promise<DraftQuery | undefined> {
const selectedCluster = getClusterConfigByName(cluster);
const node = await ytApiV3.get({
Expand All @@ -239,8 +239,8 @@ export async function generateQueryFromTable(
}),
files: [],
annotations: {},
access_control_object: DEFAULT_QUERY_ACO,
access_control_objects: [DEFAULT_QUERY_ACO],
access_control_object: defaultQueryACO,
access_control_objects: [defaultQueryACO],
settings: generateQuerySettings(engine, cluster),
};
}
Expand Down Expand Up @@ -573,9 +573,10 @@ export function addACOToLastSelected(
const state = getState();
const cluster = state.global.cluster;
const lastSelectedACONamespaces = getLastSelectedACONamespaces(state);
const stage = getCurrentStage(state);

await dispatch(
setSettingByKey(`local::${cluster}::queryTracker::lastSelectedACOs`, [
setSettingByKey(`qt-stage::${cluster}::queryTracker::${stage}::lastSelectedACOs`, [
...aco,
...lastSelectedACONamespaces.filter((item) => !aco.includes(item)).slice(0, 9),
]),
Expand Down
24 changes: 16 additions & 8 deletions packages/ui/src/ui/pages/query-tracker/module/query/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import {
} from '../api';
import {requestQueriesList} from '../queries_list/actions';
import {
DEFAULT_QUERY_ACO,
SHARED_QUERY_ACO,
getCurrentQuery,
getQueryDraft,
Expand All @@ -37,8 +36,8 @@ import {wrapApiPromiseByToaster} from '../../../../utils/utils';
import {prepareQueryPlanIds} from './utills';
import {chytApiAction, spytApiAction} from '../../../../utils/strawberryControllerApi';
import guid from '../../../../common/hammer/guid';
import {selectIsMultipleAco} from '../query_aco/selectors';
import {getSettingQueryTrackerStage} from '../../../../store/selectors/settings-ts';
import {getDefaultQueryACO, selectIsMultipleAco} from '../query_aco/selectors';

import {
REQUEST_QUERY,
Expand Down Expand Up @@ -128,7 +127,8 @@ export function loadQuery(
});

query.files = query.files.map((file) => ({...file, id: guid()}));
const queryItem = prepareQueryPlanIds(query);
const defaultQueryACO = getDefaultQueryACO(state);
const queryItem = prepareQueryPlanIds(query, defaultQueryACO);

if (config?.dontReplaceQueryText) {
queryItem.query = state.queryTracker.query.draft.query;
Expand Down Expand Up @@ -168,11 +168,13 @@ export function createQueryFromTablePath(
| UpdateQueryAction
| SetQueryReadyAction
> {
return async (dispatch) => {
return async (dispatch, getState) => {
dispatch({type: REQUEST_QUERY});
try {
const state = getState();
const defaultQueryACO = getDefaultQueryACO(state);
const draft = await wrapApiPromiseByToaster(
generateQueryFromTable(engine, {cluster, path}),
generateQueryFromTable(engine, {cluster, path, defaultQueryACO}),
{
toasterName: 'load_query',
skipSuccessToast: true,
Expand Down Expand Up @@ -208,11 +210,16 @@ export function createEmptyQuery(
query?: string,
settings?: Record<string, string>,
): ThunkAction<any, RootState, any, SetQueryAction> {
return (dispatch) => {
return (dispatch, getState) => {
const state = getState();
const defaultQueryACO = getDefaultQueryACO(state);

dispatch({
type: SET_QUERY,
data: {
initialQuery: {
access_control_object: defaultQueryACO,
access_control_objects: [defaultQueryACO],
query: query || '',
engine,
settings: settings || {},
Expand Down Expand Up @@ -335,11 +342,12 @@ export const toggleShareQuery =
const query = selectQuery(state);
if (!query) return;

let aco = query.access_control_objects || [DEFAULT_QUERY_ACO];
const defaultQueryACO = getDefaultQueryACO(state);
let aco = query.access_control_objects || [defaultQueryACO];

if (aco.includes(SHARED_QUERY_ACO)) {
aco = aco.filter((i) => i !== SHARED_QUERY_ACO);
if (!aco.length) aco = [DEFAULT_QUERY_ACO];
if (!aco.length) aco = [defaultQueryACO];
} else {
aco = [...aco, SHARED_QUERY_ACO];
}
Expand Down
Loading

0 comments on commit 7897917

Please sign in to comment.