Skip to content

Commit 1fb5b0a

Browse files
committed
add config store: checkpoint 2
1 parent 7a0bdd8 commit 1fb5b0a

File tree

11 files changed

+629
-64
lines changed

11 files changed

+629
-64
lines changed

app/cdap/components/StudioV2/CreatePipelineView/useLeftPanel.tsx

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
import React, { useState, useEffect } from 'react';
1818
import { useSelector, useDispatch } from 'react-redux';
19+
import { useLocation } from 'react-router';
20+
import qs from 'query-string';
21+
import _isEqual from 'lodash/isEqual';
22+
1923
import { getPluginIcon, getPluginTypeDisplayName, orderPluginTypes } from '../utils/pluginUtils';
2024
import { ILabeledArtifactSummary } from '../types';
2125
import { fetchSystemArtifacts, setSelectedArtifact } from '../store/common/actions';
@@ -27,9 +31,8 @@ import { MyPipelineApi } from 'api/pipeline';
2731
import { fetchPlugins } from '../store/availablePlugins/actions';
2832
import { getCurrentNamespace } from 'services/NamespaceStore';
2933
import VersionStore from 'services/VersionStore';
30-
import { fetchPluginsDefaultVersions } from '../store/plugins/actions';
31-
import { useLocation } from 'react-router';
32-
import qs from 'query-string';
34+
import { fetchPluginsDefaultVersions, updatePluginDefaultVersion } from '../store/plugins/actions';
35+
3336

3437
interface IStudioV2PageParams {
3538
namespace: string;
@@ -67,7 +70,7 @@ export function useLeftPanelController(): ILeftPanelController {
6770
const selectedArtifact = useSelector((state) => state.common.selectedArtifact);
6871

6972
const extensions = useSelector((state) => state.plugins.extensions);
70-
const pluginsList = useSelector((state) => state.plugins.pluginTypes);
73+
const pluginTypes = useSelector((state) => state.plugins.pluginTypes);
7174
const availablePluginsMap = useSelector((state) => state.availablePlugins.pluginsMap);
7275

7376
const location = useLocation();
@@ -86,7 +89,7 @@ export function useLeftPanelController(): ILeftPanelController {
8689
};
8790

8891
extensions.forEach((ext) => {
89-
const plugins = pluginsList[ext];
92+
const plugins = pluginTypes[ext];
9093
const fetchedPluginsMap = fetchPluginsFromMap(ext);
9194

9295
if (!fetchedPluginsMap.length) {
@@ -176,8 +179,92 @@ export function useLeftPanelController(): ILeftPanelController {
176179

177180
// TODO: add correct types for node
178181
async function addPluginToCanvas(event: React.MouseEvent<HTMLElement>, node: any) {
182+
const getMatchedPlugin = (plugin) => {
183+
if (plugin.pluginTemplate) {
184+
return plugin;
185+
}
186+
let item = [plugin];
187+
const plugins = pluginTypes[node.type];
188+
let matchedPlugin = plugins.filter((plug) => plug.name === node.name && !plug.pluginTemplate);
189+
if (matchedPlugin.length) {
190+
item = matchedPlugin[0].allArtifacts.filter((plug) => _isEqual(plug.artifact, plugin.defaultArtifact));
191+
}
192+
return item[0];
193+
};
179194

195+
let item;
196+
if (node.templateName) {
197+
item = node;
198+
} else {
199+
item = getMatchedPlugin(node);
200+
updatePluginDefaultVersion(item);
201+
}
202+
203+
///////////////////////////////
204+
this.hydratorNodeActions.resetSelectedNode();
205+
let name = item.name || item.pluginTemplate;
206+
const configProperties = {};
207+
let configurationGroups;
208+
let widgets;
209+
210+
if (!item.pluginTemplate) {
211+
let itemArtifact = item.artifact;
212+
let key = `${item.name}-${item.type}-${itemArtifact.name}-${itemArtifact.version}-${itemArtifact.scope}`;
213+
widgets = this.myHelpers.objectQuery(this.availablePluginMap, key, 'widgets');
214+
const displayName = this.myHelpers.objectQuery(widgets, 'display-name');
215+
configurationGroups = this.myHelpers.objectQuery(widgets, 'configuration-groups');
216+
if (configurationGroups && configurationGroups.length > 0) {
217+
configurationGroups.forEach(cg => {
218+
cg.properties.forEach(prop => {
219+
configProperties[prop.name] = this.myHelpers.objectQuery(prop, 'widget-attributes', 'default');
220+
});
221+
});
222+
}
223+
224+
name = displayName || name;
225+
}
226+
227+
let filteredNodes = this.HydratorPlusPlusConfigStore.getNodes()
228+
.filter( node => (node.plugin.label ? node.plugin.label.indexOf(name) !== -1 : false) );
229+
let config;
230+
231+
if (item.pluginTemplate) {
232+
config = {
233+
plugin: {
234+
label: (filteredNodes.length > 0 ? item.pluginTemplate + (filteredNodes.length+1) : item.pluginTemplate),
235+
name: item.pluginName,
236+
artifact: item.artifact,
237+
properties: item.properties,
238+
},
239+
icon: this.DAGPlusPlusFactory.getIcon(item.pluginName), // use getPluginIcon from utils
240+
type: item.pluginType,
241+
outputSchema: item.outputSchema,
242+
inputSchema: item.inputSchema,
243+
pluginTemplate: item.pluginTemplate,
244+
description: item.description,
245+
lock: item.lock,
246+
configGroups: configurationGroups,
247+
filters: widgets && widgets.filters
248+
};
249+
} else {
250+
config = {
251+
plugin: {
252+
label: (filteredNodes.length > 0 ? name + (filteredNodes.length+1) : name),
253+
artifact: item.artifact,
254+
name: item.name,
255+
properties: configProperties,
256+
},
257+
icon: item.icon,
258+
description: item.description,
259+
type: item.type,
260+
warning: true,
261+
configGroups: configurationGroups,
262+
filters: widgets && widgets.filters
263+
};
264+
}
265+
this.hydratorNodeActions.addNode(config);
180266
}
267+
181268

182269
return {
183270
artifacts,

app/cdap/components/StudioV2/store/config/actions.ts

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,65 @@
1414
* the License.
1515
*/
1616

17+
import _get from 'lodash/get';
18+
import _cloneDeep from 'lodash/cloneDeep';
19+
import _isEqual from 'lodash/isEqual';
20+
import _assign from 'lodash/assign';
21+
22+
import { IPipelineConfig } from 'components/StudioV2/types';
1723
import StudioV2Store from '..';
24+
import { IConfigState, configInitialState } from './reducer';
25+
import { setArtifact_mutating, setBatchInterval_mutating, setCheckpointDir_mutating, setCheckpointing_mutating, setClientResources_mutating, setComments_mutating, setDriverResources_mutating, setEngine_mutating, setGracefulStop_mutating, setInstrumentation_mutating, setMaxConcurrentRuns_mutating, setNodes_mutating, setNumRecordsPreview_mutating, setProperties_mutating, setRangeRecordsPreview_mutating, setResources_mutating, setServiceAccountPath_mutating, setStageLogging_mutating } from './mutations';
26+
import { GLOBALS } from 'services/global-constants';
1827

1928
const PREFIX = 'CONFIG_ACTIONS';
2029

2130
export const ConfigActions = {
22-
DUMMY_ACTION: `${PREFIX}/DUMMY_ACTION`,
31+
SET_STATE: `${PREFIX}/SET_STATE`,
2332
};
33+
34+
export function setConfigState(payload: IConfigState) {
35+
StudioV2Store.dispatch({
36+
type: ConfigActions.SET_STATE,
37+
payload,
38+
});
39+
}
40+
41+
export function initCofigStore(config?: any) {
42+
let stateCopy = _cloneDeep(configInitialState);
43+
if (config) {
44+
stateCopy = _assign(stateCopy, config);
45+
46+
setComments_mutating(stateCopy, stateCopy.config.comments);
47+
setArtifact_mutating(stateCopy, stateCopy.artifact);
48+
setProperties_mutating(stateCopy, stateCopy.config.properties);
49+
setDriverResources_mutating(stateCopy, stateCopy.config.driverResources);
50+
setResources_mutating(stateCopy, stateCopy.config.resources);
51+
setInstrumentation_mutating(stateCopy, stateCopy.config.processTimingEnabled);
52+
setStageLogging_mutating(stateCopy, stateCopy.config.stageLoggingEnabled);
53+
setNodes_mutating(stateCopy, stateCopy.config.stages || []);
54+
55+
if (stateCopy.artifact.name === GLOBALS.etlDataStreams) {
56+
setClientResources_mutating(stateCopy, stateCopy.config.clientResources);
57+
setCheckpointing_mutating(stateCopy, stateCopy.config.disableCheckpoints);
58+
setCheckpointDir_mutating(stateCopy, stateCopy.config.checkpointDir
59+
|| window.CDAP_CONFIG.hydrator.defaultCheckpointDir);
60+
setGracefulStop_mutating(stateCopy, stateCopy.config.stopGracefully);
61+
setBatchInterval_mutating(stateCopy, stateCopy.config.batchInterval);
62+
} else if (stateCopy.artifact.name === GLOBALS.eltSqlPipeline) {
63+
setServiceAccountPath_mutating(stateCopy, stateCopy.config.serviceAccountPath);
64+
} else {
65+
setEngine_mutating(stateCopy, stateCopy.config.engine);
66+
setRangeRecordsPreview_mutating(stateCopy, stateCopy.artifact.config || {});
67+
setNumRecordsPreview_mutating(stateCopy, stateCopy.config.numOfRecordsPreview);
68+
setMaxConcurrentRuns_mutating(stateCopy, stateCopy.config.maxConcurrentRuns);
69+
}
70+
}
71+
72+
stateCopy.__defaultState = _cloneDeep(stateCopy);
73+
setConfigState(stateCopy);
74+
}
75+
76+
export function onEngineChange() {
77+
78+
}

0 commit comments

Comments
 (0)