diff --git a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Table editor should display rich table editor #1.png b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Table editor should display rich table editor #1.png index 6af95639c9a..afee3ef83b9 100644 Binary files a/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Table editor should display rich table editor #1.png and b/designer/client/cypress/e2e/__image_snapshots__/electron/Linux/Table editor should display rich table editor #1.png differ diff --git a/designer/client/src/actions/nk/calculateProcessAfterChange.ts b/designer/client/src/actions/nk/calculateProcessAfterChange.ts index 54a39e88523..b7bc80c9b43 100644 --- a/designer/client/src/actions/nk/calculateProcessAfterChange.ts +++ b/designer/client/src/actions/nk/calculateProcessAfterChange.ts @@ -30,9 +30,12 @@ export function calculateProcessAfterChange( if (after.id !== before.id) { dispatch({ type: "PROCESS_RENAME", name: after.id }); } + + const { id, ...properties } = after; + return { processName: after.id, - scenarioGraph: { ...processWithNewFragmentSchema, properties: after }, + scenarioGraph: { ...processWithNewFragmentSchema, properties }, }; } diff --git a/designer/client/src/components/graph/NodeUtils.ts b/designer/client/src/components/graph/NodeUtils.ts index 7f4e5fc3089..7f3c178b37c 100644 --- a/designer/client/src/components/graph/NodeUtils.ts +++ b/designer/client/src/components/graph/NodeUtils.ts @@ -22,7 +22,7 @@ class NodeUtils { return !isEmpty(obj) && has(obj, "id") && has(obj, "type"); }; - nodeType = (node: NodeType) => { + nodeType = (node: UINodeType) => { return node.type ? node.type : "Properties"; }; @@ -31,7 +31,7 @@ class NodeUtils { return type === "Properties"; }; - nodeIsFragment = (node): node is FragmentNodeType => { + nodeIsFragment = (node: UINodeType): node is FragmentNodeType => { return this.nodeType(node) === "FragmentInput"; }; diff --git a/designer/client/src/components/graph/node-modal/DescriptionField.tsx b/designer/client/src/components/graph/node-modal/DescriptionField.tsx index ee722f1d589..9c3a8af38de 100644 --- a/designer/client/src/components/graph/node-modal/DescriptionField.tsx +++ b/designer/client/src/components/graph/node-modal/DescriptionField.tsx @@ -2,13 +2,13 @@ import { NodeField } from "./NodeField"; import { FieldType } from "./editors/field/Field"; import React from "react"; -import { NodeType, NodeValidationError } from "../../../types"; +import { NodeType, NodeValidationError, UINodeType } from "../../../types"; interface DescriptionFieldProps { autoFocus?: boolean; defaultValue?: string; isEditMode?: boolean; - node: NodeType; + node: UINodeType; readonly?: boolean; renderFieldLabel: (paramName: string) => React.ReactNode; setProperty: (property: K, newValue: NodeType[K], defaultValue?: NodeType[K]) => void; diff --git a/designer/client/src/components/graph/node-modal/IdField.tsx b/designer/client/src/components/graph/node-modal/IdField.tsx index fd6b8bb2bda..572f1168220 100644 --- a/designer/client/src/components/graph/node-modal/IdField.tsx +++ b/designer/client/src/components/graph/node-modal/IdField.tsx @@ -2,7 +2,7 @@ import { extendErrors, getValidationErrorsForField, uniqueScenarioValueValidator import Field, { FieldType } from "./editors/field/Field"; import React, { useMemo, useState } from "react"; import { useDiffMark } from "./PathsToMark"; -import { NodeType, NodeValidationError } from "../../../types"; +import { NodeType, NodeValidationError, UINodeType } from "../../../types"; import { useSelector } from "react-redux"; import { getProcessNodesIds } from "../../../reducers/selectors/graph"; import NodeUtils from "../NodeUtils"; @@ -10,7 +10,7 @@ import { isEmpty } from "lodash"; interface IdFieldProps { isEditMode?: boolean; - node: NodeType; + node: UINodeType; renderFieldLabel: (paramName: string) => React.ReactNode; setProperty?: (property: K, newValue: NodeType[K], defaultValue?: NodeType[K]) => void; showValidation?: boolean; diff --git a/designer/client/src/components/graph/node-modal/NodeField.tsx b/designer/client/src/components/graph/node-modal/NodeField.tsx index 2ee86dd080c..e36d1065d54 100644 --- a/designer/client/src/components/graph/node-modal/NodeField.tsx +++ b/designer/client/src/components/graph/node-modal/NodeField.tsx @@ -3,7 +3,7 @@ import { getValidationErrorsForField } from "./editors/Validators"; import { get, isEmpty } from "lodash"; import React from "react"; import { useDiffMark } from "./PathsToMark"; -import { NodeType, NodeValidationError } from "../../../types"; +import { NodeType, NodeValidationError, UINodeType } from "../../../types"; type NodeFieldProps = { autoFocus?: boolean; @@ -12,7 +12,7 @@ type NodeFieldProps = { fieldName: N; fieldType: FieldType; isEditMode?: boolean; - node: NodeType; + node: UINodeType; readonly?: boolean; renderFieldLabel: (paramName: string) => React.ReactNode; setProperty: (property: K, newValue: NodeType[K], defaultValue?: NodeType[K]) => void; diff --git a/designer/client/src/components/graph/node-modal/ScenarioProperty.tsx b/designer/client/src/components/graph/node-modal/ScenarioProperty.tsx index a0c54319008..39d0da273cb 100644 --- a/designer/client/src/components/graph/node-modal/ScenarioProperty.tsx +++ b/designer/client/src/components/graph/node-modal/ScenarioProperty.tsx @@ -17,7 +17,11 @@ interface Props { propertyName: string; propertyConfig: ScenarioPropertyConfig; editedNode: PropertiesType; - onChange: (property: K, newValue: PropertiesType[K], defaultValue?: PropertiesType[K]) => void; + onChange: ( + property: K, + newValue: PropertiesType["additionalFields"]["properties"][K], + defaultValue?: PropertiesType["additionalFields"]["properties"][K], + ) => void; renderFieldLabel: (paramName: string) => JSX.Element; readOnly: boolean; errors: NodeValidationError[]; diff --git a/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx b/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx index 08f8ce96fa5..6e169bdc36b 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/Table/TableEditor.tsx @@ -1,5 +1,4 @@ -import { EditorProps, ExtendedEditor } from "../Editor"; -import "@glideapps/glide-data-grid/dist/index.css"; +import { css } from "@emotion/css"; import DataEditor, { CompactSelection, DataEditorProps, @@ -13,22 +12,23 @@ import DataEditor, { Item, Rectangle, } from "@glideapps/glide-data-grid"; +import { Box } from "@mui/material"; +import { PopoverPosition } from "@mui/material/Popover/Popover"; +import i18next from "i18next"; import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; import ErrorBoundary from "../../../../../common/ErrorBoundary"; -import { Sizer } from "./Sizer"; -import { css } from "@emotion/css"; -import { useTypeOptions } from "../../../fragment-input-definition/FragmentInputDefinition"; -import { PopoverPosition } from "@mui/material/Popover/Popover"; import ValidationLabels from "../../../../../modals/ValidationLabels"; -import { useTableState } from "./state/tableState"; -import { TypesMenu } from "./TypesMenu"; +import { useTypeOptions } from "../../../fragment-input-definition/FragmentInputDefinition"; +import { EditorProps, ExtendedEditor } from "../Editor"; +import "@glideapps/glide-data-grid/dist/index.css"; import { CellMenu, DeleteColumnMenuItem, DeleteRowMenuItem, ResetColumnWidthMenuItem } from "./CellMenu"; -import { useTableTheme } from "./tableTheme"; -import i18next from "i18next"; -import { Box } from "@mui/material"; +import { useErrorHighlights } from "./errorHighlights"; +import { Sizer } from "./Sizer"; import { ActionTypes } from "./state/action"; import { longestRow } from "./state/helpers"; -import { useErrorHighlights } from "./errorHighlights"; +import { useTableState } from "./state/tableState"; +import { useTableTheme } from "./tableTheme"; +import { TypesMenu } from "./TypesMenu"; const SUPPORTED_TYPES = [ "java.lang.String", @@ -78,6 +78,11 @@ const RightElement = ({ onColumnAppend }: { onColumnAppend: () => void }) => { ); }; +const emptySelection = { + columns: CompactSelection.empty(), + rows: CompactSelection.empty(), +}; + export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: EditorProps) => { const tableDateContext = useTableState(expressionObj); const [{ rows, columns }, dispatch, rawExpression] = tableDateContext; @@ -155,10 +160,7 @@ export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: [dispatch], ); - const [selection, setSelection] = useState({ - columns: CompactSelection.empty(), - rows: CompactSelection.empty(), - }); + const [selection, setSelection] = useState(emptySelection); const pasteWithExpand: DataEditorProps["onPaste"] = useCallback<(target: Item, values: readonly (readonly string[])[]) => boolean>( ([column, row], input) => { @@ -352,6 +354,7 @@ export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: const rightElement = useMemo(() => , [onColumnAppend]); + const [hasFocus, setHasFocus] = useState(false); return ( <> setHasFocus(true)} + onBlur={(e) => { + if (e.currentTarget.contains(e.relatedTarget)) { + return; + } + setHasFocus(false); + }} > ({ @@ -387,7 +397,7 @@ export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: theme={tableTheme} width="100%" trailingRowOptions={trailingRowOptions} - gridSelection={selection} + gridSelection={hasFocus ? selection : emptySelection} onGridSelectionChange={(selection) => { setSelection(selection); toggleTooltip(selection); @@ -402,67 +412,67 @@ export const Table = ({ expressionObj, onValueChange, className, fieldErrors }: onItemHovered={toggleTooltip} drawCell={drawCell} /> + + + {cellMenuData?.column >= 0 && cellMenuData?.row < 0 ? ( + 0 ? selection.columns.toArray() : [cellMenuData?.column]} + onClick={(indexes) => { + dispatch({ + type: ActionTypes.resetColumnsSize, + columns: indexes, + }); + closeCellMenu(); + }} + /> + ) : null} + {cellMenuData?.column >= 0 ? ( + 0 + ? selection.columns.toArray() + : selection.current?.range + ? Array.from({ length: selection.current.range.width }, (_, i) => selection.current.range.x + i) + : [cellMenuData?.column] + } + onClick={(indexes) => { + dispatch({ + type: ActionTypes.deleteColumns, + columns: indexes, + }); + clearSelection(); + closeCellMenu(); + }} + /> + ) : null} + {cellMenuData?.row >= 0 ? ( + 0 + ? selection.rows.toArray() + : selection.current?.range + ? Array.from({ length: selection.current.range.height }, (_, i) => selection.current.range.y + i) + : [cellMenuData?.row] + } + onClick={(indexes) => { + dispatch({ + type: ActionTypes.deleteRows, + rows: indexes, + }); + clearSelection(); + closeCellMenu(); + }} + /> + ) : null} + {tooltipElement} - - - {cellMenuData?.column >= 0 && cellMenuData?.row < 0 ? ( - 0 ? selection.columns.toArray() : [cellMenuData?.column]} - onClick={(indexes) => { - dispatch({ - type: ActionTypes.resetColumnsSize, - columns: indexes, - }); - closeCellMenu(); - }} - /> - ) : null} - {cellMenuData?.column >= 0 ? ( - 0 - ? selection.columns.toArray() - : selection.current?.range - ? Array.from({ length: selection.current.range.width }, (_, i) => selection.current.range.x + i) - : [cellMenuData?.column] - } - onClick={(indexes) => { - dispatch({ - type: ActionTypes.deleteColumns, - columns: indexes, - }); - clearSelection(); - closeCellMenu(); - }} - /> - ) : null} - {cellMenuData?.row >= 0 ? ( - 0 - ? selection.rows.toArray() - : selection.current?.range - ? Array.from({ length: selection.current.range.height }, (_, i) => selection.current.range.y + i) - : [cellMenuData?.row] - } - onClick={(indexes) => { - dispatch({ - type: ActionTypes.deleteRows, - rows: indexes, - }); - clearSelection(); - closeCellMenu(); - }} - /> - ) : null} - ); }; diff --git a/designer/client/src/components/graph/node-modal/editors/expression/Table/errorHighlights.tsx b/designer/client/src/components/graph/node-modal/editors/expression/Table/errorHighlights.tsx index 473314832fa..952e646e1ff 100644 --- a/designer/client/src/components/graph/node-modal/editors/expression/Table/errorHighlights.tsx +++ b/designer/client/src/components/graph/node-modal/editors/expression/Table/errorHighlights.tsx @@ -69,12 +69,13 @@ export function useErrorHighlights(fieldErrors: FieldError[], columns: DataColum ); const toggleTooltip = useCallback( - (selection: GridMouseEventArgs | GridSelection) => { - const { cell, rect } = getSelectedCell(selection); - const error = getErrorForCell(cell); + (selection?: GridMouseEventArgs | GridSelection) => { + const selected = getSelectedCell(selection); + const error = getErrorForCell(selected?.cell); + setTooltipOpen(() => { - if (rect && error) { - positionRef.current = rect; + if (selected?.rect && error) { + positionRef.current = selected.rect; setTooltipMessage(error.errorMessage); return true; } else { diff --git a/designer/client/src/types/node.ts b/designer/client/src/types/node.ts index a2d2dced57d..1953506ab78 100644 --- a/designer/client/src/types/node.ts +++ b/designer/client/src/types/node.ts @@ -38,7 +38,7 @@ export type NodeType = { id: string; parameters?: $TodoType[]; }; - nodeType: string; + nodeType?: string; [key: string]: any; }; @@ -59,12 +59,13 @@ export interface Expression { expression: string; } -//TODO: Add other process properties... -export type PropertiesType = NodeType & { +export type PropertiesType = { + // FE applies fake id as name, but it's not send by/to BE + id?: string; type: "Properties"; additionalFields: ProcessAdditionalFields; }; export type NodeId = NodeType["id"]; -export type UINodeType = NodeType; +export type UINodeType = NodeType | PropertiesType; diff --git a/designer/server/src/main/scala/pl/touk/nussknacker/ui/services/UserApiHttpService.scala b/designer/server/src/main/scala/pl/touk/nussknacker/ui/services/UserApiHttpService.scala index 3b57f6c2863..c990b2f41bd 100644 --- a/designer/server/src/main/scala/pl/touk/nussknacker/ui/services/UserApiHttpService.scala +++ b/designer/server/src/main/scala/pl/touk/nussknacker/ui/services/UserApiHttpService.scala @@ -24,7 +24,7 @@ class UserApiHttpService( .serverLogic { user: LoggedUser => _ => Future( success( - DisplayableUser(user, categories.all(user).values) + DisplayableUser(user, categories.all(user).values.toList.distinct.sorted) ) ) } diff --git a/designer/server/src/test/resources/config/rich/basicauth-users.conf b/designer/server/src/test/resources/config/access-control-checking/basicauth-users.conf similarity index 100% rename from designer/server/src/test/resources/config/rich/basicauth-users.conf rename to designer/server/src/test/resources/config/access-control-checking/basicauth-users.conf diff --git a/designer/server/src/test/resources/config/rich/rich-streaming-use-case-designer.conf b/designer/server/src/test/resources/config/access-control-checking/multiple-category-designer.conf similarity index 96% rename from designer/server/src/test/resources/config/rich/rich-streaming-use-case-designer.conf rename to designer/server/src/test/resources/config/access-control-checking/multiple-category-designer.conf index 5cbc524cb4e..85b897ec9e3 100644 --- a/designer/server/src/test/resources/config/rich/rich-streaming-use-case-designer.conf +++ b/designer/server/src/test/resources/config/access-control-checking/multiple-category-designer.conf @@ -2,7 +2,7 @@ include "../common-designer.conf" authentication: { method: "BasicAuth" - usersFile: "designer/server/src/test/resources/config/rich/basicauth-users.conf" + usersFile: "designer/server/src/test/resources/config/access-control-checking/basicauth-users.conf" anonymousUserRole: "Demo" } diff --git a/designer/server/src/test/resources/config/simple/basicauth-users.conf b/designer/server/src/test/resources/config/business-cases/basicauth-users.conf similarity index 100% rename from designer/server/src/test/resources/config/simple/basicauth-users.conf rename to designer/server/src/test/resources/config/business-cases/basicauth-users.conf diff --git a/designer/server/src/test/resources/config/business-cases/category-used-more-than-once-designer.conf b/designer/server/src/test/resources/config/business-cases/category-used-more-than-once-designer.conf new file mode 100644 index 00000000000..dccd5cf8d91 --- /dev/null +++ b/designer/server/src/test/resources/config/business-cases/category-used-more-than-once-designer.conf @@ -0,0 +1,36 @@ +include "../common-designer.conf" + +authentication: { + method: "BasicAuth" + usersFile: "designer/server/src/test/resources/config/business-cases/basicauth-users.conf" +} + +baseModelConfig { + classPath: [ + "engine/flink/management/dev-model/target/scala-"${scala.major.version}"/devModel.jar", + "engine/flink/executor/target/scala-"${scala.major.version}"/flinkExecutor.jar" + ] +} + +scenarioTypes { + streaming1 { + deploymentConfig { + restUrl: "http://localhost:8081" + jobManagerTimeout: 1m + type: "flinkStreaming" + engineSetupName: "Flink 1" + } + modelConfig: ${baseModelConfig} + category: "Category1" + } + streaming2 { + deploymentConfig { + restUrl: "http://localhost:8082" + jobManagerTimeout: 1m + type: "flinkStreaming" + engineSetupName: "Flink 2" + } + modelConfig: ${baseModelConfig} + category: "Category1" + } +} diff --git a/designer/server/src/test/resources/config/simple/simple-streaming-use-case-designer.conf b/designer/server/src/test/resources/config/business-cases/simple-streaming-use-case-designer.conf similarity index 96% rename from designer/server/src/test/resources/config/simple/simple-streaming-use-case-designer.conf rename to designer/server/src/test/resources/config/business-cases/simple-streaming-use-case-designer.conf index 5933c69c2b9..087a1d85774 100644 --- a/designer/server/src/test/resources/config/simple/simple-streaming-use-case-designer.conf +++ b/designer/server/src/test/resources/config/business-cases/simple-streaming-use-case-designer.conf @@ -2,7 +2,7 @@ include "../common-designer.conf" authentication: { method: "BasicAuth" - usersFile: "designer/server/src/test/resources/config/simple/basicauth-users.conf" + usersFile: "designer/server/src/test/resources/config/business-cases/basicauth-users.conf" } baseModelConfig { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/test/base/it/WithRichConfigScenarioHelper.scala b/designer/server/src/test/scala/pl/touk/nussknacker/test/base/it/WithAccessControlCheckingConfigScenarioHelper.scala similarity index 87% rename from designer/server/src/test/scala/pl/touk/nussknacker/test/base/it/WithRichConfigScenarioHelper.scala rename to designer/server/src/test/scala/pl/touk/nussknacker/test/base/it/WithAccessControlCheckingConfigScenarioHelper.scala index c2721176bae..49552bffe70 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/test/base/it/WithRichConfigScenarioHelper.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/test/base/it/WithAccessControlCheckingConfigScenarioHelper.scala @@ -3,14 +3,14 @@ package pl.touk.nussknacker.test.base.it import pl.touk.nussknacker.engine.api.process.{ProcessId, ProcessName} import pl.touk.nussknacker.engine.canonicalgraph.CanonicalProcess import pl.touk.nussknacker.test.base.db.WithTestDb -import pl.touk.nussknacker.test.config.WithRichDesignerConfig -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory import pl.touk.nussknacker.test.utils.domain.ScenarioHelper import scala.concurrent.ExecutionContext.Implicits.global -trait WithRichConfigScenarioHelper { - this: WithTestDb with WithRichDesignerConfig => +trait WithAccessControlCheckingConfigScenarioHelper { + this: WithTestDb with WithAccessControlCheckingDesignerConfig => private val rawScenarioHelper = new ScenarioHelper(testDbRef, designerConfig) diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/ConfigWithScalaVersion.scala b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/ConfigWithScalaVersion.scala index b6d2beed8fa..192a64c9ec6 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/ConfigWithScalaVersion.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/ConfigWithScalaVersion.scala @@ -9,13 +9,13 @@ import pl.touk.nussknacker.test.config.WithSimplifiedDesignerConfig.TestProcessi object ConfigWithScalaVersion { val TestsConfig: Config = ScalaMajorVersionConfig.configWithScalaMajorVersion( - ConfigFactory.parseResources("config/simple/simple-streaming-use-case-designer.conf") + ConfigFactory.parseResources("config/business-cases/simple-streaming-use-case-designer.conf") ) // TODO: we should switch to lite-embedded in most places in tests, because it has lower performance overhead val TestsConfigWithEmbeddedEngine: Config = ScalaMajorVersionConfig.configWithScalaMajorVersion( ConfigFactory - .parseResources("config/simple/simple-streaming-use-case-designer.conf") + .parseResources("config/business-cases/simple-streaming-use-case-designer.conf") .withValue(s"scenarioTypes.${Streaming.stringify}.deploymentConfig.type", fromAnyRef("lite-embedded")) .withValue(s"scenarioTypes.${Streaming.stringify}.deploymentConfig.mode", fromAnyRef("streaming")) ) diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithRichDesignerConfig.scala b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithAccessControlCheckingDesignerConfig.scala similarity index 83% rename from designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithRichDesignerConfig.scala rename to designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithAccessControlCheckingDesignerConfig.scala index 7c3a4e85a49..533ebfb036e 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithRichDesignerConfig.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithAccessControlCheckingDesignerConfig.scala @@ -6,16 +6,17 @@ import io.restassured.specification.RequestSpecification import org.scalatest.Suite import pl.touk.nussknacker.engine.util.config.ScalaMajorVersionConfig import pl.touk.nussknacker.test.NuRestAssureExtensions -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory import pl.touk.nussknacker.test.utils.DesignerTestConfigValidator -trait WithRichDesignerConfig extends WithDesignerConfig { +// This trait shows setups with multiple categories allowing to verify cases such as access to some category but without access to another one +trait WithAccessControlCheckingDesignerConfig extends WithDesignerConfig { this: Suite => validateConsistency() override def designerConfig: Config = ScalaMajorVersionConfig.configWithScalaMajorVersion( - ConfigFactory.parseResources("config/rich/rich-streaming-use-case-designer.conf") + ConfigFactory.parseResources("config/access-control-checking/multiple-category-designer.conf") ) private def validateConsistency(): Unit = { @@ -27,7 +28,7 @@ trait WithRichDesignerConfig extends WithDesignerConfig { } -object WithRichDesignerConfig { +object WithAccessControlCheckingDesignerConfig { sealed trait TestProcessingType extends EnumEntry object TestProcessingType extends Enum[TestProcessingType] { @@ -77,7 +78,7 @@ object WithRichDesignerConfig { .apply(category) } - private[WithRichDesignerConfig] lazy val categoryByProcessingType = + private[WithAccessControlCheckingDesignerConfig] lazy val categoryByProcessingType = TestProcessingType.values.map { processingType => (processingType, TestProcessingType.categoryBy(processingType)) }.toMap @@ -86,8 +87,8 @@ object WithRichDesignerConfig { } -trait WithRichConfigRestAssuredUsersExtensions extends NuRestAssureExtensions { - this: WithRichDesignerConfig => +trait WithAccessControlCheckingConfigRestAssuredUsersExtensions extends NuRestAssureExtensions { + this: WithAccessControlCheckingDesignerConfig => implicit class UsersBasicAuth[T <: RequestSpecification](requestSpecification: T) { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithBusinessCaseRestAssuredUsersExtensions.scala b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithBusinessCaseRestAssuredUsersExtensions.scala new file mode 100644 index 00000000000..b916c1ef974 --- /dev/null +++ b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithBusinessCaseRestAssuredUsersExtensions.scala @@ -0,0 +1,22 @@ +package pl.touk.nussknacker.test.config + +import io.restassured.specification.RequestSpecification +import pl.touk.nussknacker.test.NuRestAssureExtensions + +// It enriches rest assure directives with user specified in /config/business-cases/basicauth-users.conf +// which is used among designer configuration inside the same directory +trait WithBusinessCaseRestAssuredUsersExtensions extends NuRestAssureExtensions { + + implicit class UsersBasicAuth[T <: RequestSpecification](requestSpecification: T) { + + def basicAuthAdmin(): RequestSpecification = + requestSpecification.preemptiveBasicAuth("admin", "admin") + + def basicAuthAllPermUser(): RequestSpecification = + requestSpecification.preemptiveBasicAuth("allpermuser", "allpermuser") + + def basicAuthUnknownUser(): RequestSpecification = + requestSpecification.preemptiveBasicAuth("unknownuser", "wrongcredentials") + } + +} diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithCategoryUsedMoreThanOnceDesignerConfig.scala b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithCategoryUsedMoreThanOnceDesignerConfig.scala new file mode 100644 index 00000000000..e174de6cefa --- /dev/null +++ b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithCategoryUsedMoreThanOnceDesignerConfig.scala @@ -0,0 +1,84 @@ +package pl.touk.nussknacker.test.config + +import com.typesafe.config.{Config, ConfigFactory} +import enumeratum.{Enum, EnumEntry} +import org.scalatest.Suite +import pl.touk.nussknacker.engine.util.config.ScalaMajorVersionConfig +import pl.touk.nussknacker.test.config.WithCategoryUsedMoreThanOnceDesignerConfig.TestCategory +import pl.touk.nussknacker.test.utils.DesignerTestConfigValidator + +trait WithCategoryUsedMoreThanOnceDesignerConfig extends WithDesignerConfig { this: Suite => + + validateConsistency() + + override def designerConfig: Config = ScalaMajorVersionConfig.configWithScalaMajorVersion( + ConfigFactory.parseResources("config/business-cases/category-used-more-than-once-designer.conf") + ) + + private def validateConsistency(): Unit = { + val configValidator = new DesignerTestConfigValidator(designerConfig) + val processingTypeWithCategories = + TestCategory.categoryByProcessingType.map { case (k, v) => (k.stringify, v.stringify) } + configValidator.validateTestDataWithDesignerConfFile(processingTypeWithCategories) + } + +} + +object WithCategoryUsedMoreThanOnceDesignerConfig { + + sealed trait TestProcessingType extends EnumEntry + + object TestProcessingType extends Enum[TestProcessingType] { + case object Streaming1 extends TestProcessingType + + case object Streaming2 extends TestProcessingType + + override val values = findValues + + implicit class ProcessingTypeStringify(processingType: TestProcessingType) { + + def stringify: String = processingType match { + case TestProcessingType.Streaming1 => "streaming1" + case TestProcessingType.Streaming2 => "streaming2" + } + + } + + def categoryBy(processingType: TestProcessingType): TestCategory = { + processingType match { + case TestProcessingType.Streaming1 => TestCategory.Category1 + case TestProcessingType.Streaming2 => TestCategory.Category1 + } + } + + } + + sealed trait TestCategory extends EnumEntry + + object TestCategory extends Enum[TestCategory] { + case object Category1 extends TestCategory + + override val values = findValues + + implicit class CategoryStringify(category: TestCategory) { + + def stringify: String = category match { + case Category1 => "Category1" + } + + } + + def processingTypeBy(category: TestCategory): TestProcessingType = { + categoryByProcessingType + .map(_.swap) + .apply(category) + } + + private[WithCategoryUsedMoreThanOnceDesignerConfig] lazy val categoryByProcessingType = + TestProcessingType.values.map { processingType => + (processingType, TestProcessingType.categoryBy(processingType)) + }.toMap + + } + +} diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithSimplifiedDesignerConfig.scala b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithSimplifiedDesignerConfig.scala index dcda256dd32..51c4d1c47c4 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithSimplifiedDesignerConfig.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/test/config/WithSimplifiedDesignerConfig.scala @@ -15,7 +15,7 @@ trait WithSimplifiedDesignerConfig extends WithDesignerConfig { validateConsistency() override def designerConfig: Config = ScalaMajorVersionConfig.configWithScalaMajorVersion( - ConfigFactory.parseResources("config/simple/simple-streaming-use-case-designer.conf") + ConfigFactory.parseResources("config/business-cases/simple-streaming-use-case-designer.conf") ) private def validateConsistency(): Unit = { @@ -80,20 +80,3 @@ object WithSimplifiedDesignerConfig { } } - -trait WithSimplifiedConfigRestAssuredUsersExtensions extends NuRestAssureExtensions { - this: WithSimplifiedDesignerConfig => - - implicit class UsersBasicAuth[T <: RequestSpecification](requestSpecification: T) { - - def basicAuthAdmin(): RequestSpecification = - requestSpecification.preemptiveBasicAuth("admin", "admin") - - def basicAuthAllPermUser(): RequestSpecification = - requestSpecification.preemptiveBasicAuth("allpermuser", "allpermuser") - - def basicAuthUnknownUser(): RequestSpecification = - requestSpecification.preemptiveBasicAuth("unknownuser", "wrongcredentials") - } - -} diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceBusinessSpec.scala index 23e068e2c9c..646a9881ca4 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceBusinessSpec.scala @@ -13,8 +13,8 @@ import pl.touk.nussknacker.engine.api.process.{ProcessName, VersionId} import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} import pl.touk.nussknacker.test.base.it.{NuItTest, WithSimplifiedConfigScenarioHelper} import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, WithMockableDeploymentManager, - WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig } @@ -24,7 +24,7 @@ class AppApiHttpServiceBusinessSpec with WithSimplifiedDesignerConfig with WithSimplifiedConfigScenarioHelper with WithMockableDeploymentManager - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceSecuritySpec.scala index 2cc24cf8707..2a9dd455221 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/AppApiHttpServiceSecuritySpec.scala @@ -11,21 +11,21 @@ import pl.touk.nussknacker.engine.api.deployment.simple.SimpleStateStatus import pl.touk.nussknacker.engine.api.deployment.simple.SimpleStateStatus.ProblemStateStatus import pl.touk.nussknacker.engine.api.process.{ProcessName, VersionId} import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} -import pl.touk.nussknacker.test.base.it.{NuItTest, WithRichConfigScenarioHelper} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.base.it.{NuItTest, WithAccessControlCheckingConfigScenarioHelper} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} import pl.touk.nussknacker.test.config.{ - WithMockableDeploymentManager, - WithRichConfigRestAssuredUsersExtensions, - WithRichDesignerConfig + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig, + WithMockableDeploymentManager } class AppApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigScenarioHelper + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigScenarioHelper with WithMockableDeploymentManager - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceBusinessSpec.scala index a290ff54a1a..d5943ff8ac0 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceBusinessSpec.scala @@ -19,8 +19,8 @@ import pl.touk.nussknacker.test.base.it.{NuItTest, WithSimplifiedConfigScenarioH import pl.touk.nussknacker.test.config.WithSimplifiedDesignerConfig.TestCategory.Category1 import pl.touk.nussknacker.test.config.WithSimplifiedDesignerConfig.TestProcessingType.Streaming import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, WithMockableDeploymentManager, - WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig } @@ -30,7 +30,7 @@ class ComponentApiHttpServiceBusinessSpec with WithSimplifiedDesignerConfig with WithSimplifiedConfigScenarioHelper with WithMockableDeploymentManager - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceSecuritySpec.scala index de10c74c2ea..a8e9bdca4a9 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ComponentApiHttpServiceSecuritySpec.scala @@ -9,10 +9,13 @@ import org.scalatest.matchers.must.Matchers.contain import pl.touk.nussknacker.engine.api.component.{ComponentId, ComponentType, DesignerWideComponentId} import pl.touk.nussknacker.engine.build.ScenarioBuilder import pl.touk.nussknacker.test.ProcessUtils.convertToAnyShouldWrapper -import pl.touk.nussknacker.test.base.it.{NuItTest, WithRichConfigScenarioHelper} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} -import pl.touk.nussknacker.test.config.{WithRichConfigRestAssuredUsersExtensions, WithRichDesignerConfig} +import pl.touk.nussknacker.test.base.it.{NuItTest, WithAccessControlCheckingConfigScenarioHelper} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.config.{ + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig +} import pl.touk.nussknacker.test.{ NuRestAssureExtensions, NuRestAssureMatchers, @@ -23,9 +26,9 @@ import pl.touk.nussknacker.test.{ class ComponentApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigScenarioHelper - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigScenarioHelper + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ManagementApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ManagementApiHttpServiceBusinessSpec.scala index dc8b544ee86..3134eab78f0 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ManagementApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ManagementApiHttpServiceBusinessSpec.scala @@ -9,8 +9,8 @@ import pl.touk.nussknacker.engine.build.ScenarioBuilder import pl.touk.nussknacker.engine.testmode.TestProcess.TestResults import pl.touk.nussknacker.test.base.it.{NuItTest, WithSimplifiedConfigScenarioHelper} import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, WithMockableDeploymentManager, - WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig } import pl.touk.nussknacker.test.{NuRestAssureExtensions, NuRestAssureMatchers, RestAssuredVerboseLogging} @@ -22,7 +22,7 @@ class ManagementApiHttpServiceBusinessSpec with WithSimplifiedDesignerConfig with WithSimplifiedConfigScenarioHelper with WithMockableDeploymentManager - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceBusinessSpec.scala index 92250f40ad9..ec6a07d3c34 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceBusinessSpec.scala @@ -8,8 +8,8 @@ import pl.touk.nussknacker.engine.build.ScenarioBuilder import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} import pl.touk.nussknacker.test.base.it.{NuItTest, WithSimplifiedConfigScenarioHelper} import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, WithMockableDeploymentManager, - WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig } @@ -19,7 +19,7 @@ class NodesApiHttpServiceBusinessSpec with WithSimplifiedDesignerConfig with WithSimplifiedConfigScenarioHelper with WithMockableDeploymentManager - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceSecuritySpec.scala index 2bce1054f68..97d3cf95aaa 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NodesApiHttpServiceSecuritySpec.scala @@ -6,22 +6,25 @@ import org.hamcrest.Matchers.equalTo import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.engine.build.ScenarioBuilder import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} -import pl.touk.nussknacker.test.base.it.{NuItTest, WithRichConfigScenarioHelper} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestProcessingType.{Streaming1, Streaming2} +import pl.touk.nussknacker.test.base.it.{NuItTest, WithAccessControlCheckingConfigScenarioHelper} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestProcessingType.{ + Streaming1, + Streaming2 +} import pl.touk.nussknacker.test.config.{ - WithMockableDeploymentManager, - WithRichConfigRestAssuredUsersExtensions, - WithRichDesignerConfig + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig, + WithMockableDeploymentManager } class NodesApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigScenarioHelper + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigScenarioHelper with WithMockableDeploymentManager - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceBusinessSpec.scala index dd746ae35d6..adba8dfb59f 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceBusinessSpec.scala @@ -7,8 +7,8 @@ import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.engine.api.process.ProcessName import pl.touk.nussknacker.test.base.it.{NuItTest, WithSimplifiedConfigScenarioHelper} import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, WithMockableDeploymentManager, - WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig } import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} @@ -19,7 +19,7 @@ class NotificationApiHttpServiceBusinessSpec with WithSimplifiedDesignerConfig with WithSimplifiedConfigScenarioHelper with WithMockableDeploymentManager - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceSecuritySpec.scala index 29010de8001..b776366d32e 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/NotificationApiHttpServiceSecuritySpec.scala @@ -5,22 +5,22 @@ import io.restassured.module.scala.RestAssuredSupport.AddThenToResponse import org.hamcrest.Matchers.equalTo import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.engine.api.process.ProcessName -import pl.touk.nussknacker.test.base.it.{NuItTest, WithRichConfigScenarioHelper} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.base.it.{NuItTest, WithAccessControlCheckingConfigScenarioHelper} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} import pl.touk.nussknacker.test.config.{ - WithMockableDeploymentManager, - WithRichConfigRestAssuredUsersExtensions, - WithRichDesignerConfig + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig, + WithMockableDeploymentManager } import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} class NotificationApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigScenarioHelper + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigScenarioHelper with WithMockableDeploymentManager - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ProcessesResourcesSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ProcessesResourcesSpec.scala index a5993412ce7..f71283729f5 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ProcessesResourcesSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ProcessesResourcesSpec.scala @@ -24,10 +24,13 @@ import pl.touk.nussknacker.restmodel.scenariodetails.ScenarioWithDetails import pl.touk.nussknacker.restmodel.validation.ValidationResults.ValidationResult import pl.touk.nussknacker.test.PatientScalaFutures import pl.touk.nussknacker.test.base.it._ -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestProcessingType.{Streaming1, Streaming2} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.{TestCategory, TestProcessingType} -import pl.touk.nussknacker.test.config.{WithMockableDeploymentManager, WithRichDesignerConfig} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestProcessingType.{ + Streaming1, + Streaming2 +} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.{TestCategory, TestProcessingType} +import pl.touk.nussknacker.test.config.{WithAccessControlCheckingDesignerConfig, WithMockableDeploymentManager} import pl.touk.nussknacker.test.utils.scalas.AkkaHttpExtensions.toRequestEntity import pl.touk.nussknacker.ui.config.scenariotoolbar.CategoriesScenarioToolbarsConfigParser import pl.touk.nussknacker.ui.config.scenariotoolbar.ToolbarButtonConfigType.{CustomLink, ProcessDeploy, ProcessSave} @@ -54,8 +57,8 @@ import scala.concurrent.Future class ProcessesResourcesSpec extends AnyFunSuite with NuItTest - with WithRichDesignerConfig - with WithRichConfigScenarioHelper + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigScenarioHelper with WithMockableDeploymentManager with ScalatestRouteTest with Matchers diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceBusinessSpec.scala index 8b4133d13c3..f2dd34d6dd5 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceBusinessSpec.scala @@ -8,8 +8,8 @@ import pl.touk.nussknacker.engine.build.ScenarioBuilder import pl.touk.nussknacker.test.{NuRestAssureExtensions, NuRestAssureMatchers, RestAssuredVerboseLogging} import pl.touk.nussknacker.test.base.it.{NuItTest, WithSimplifiedConfigScenarioHelper} import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, WithMockableDeploymentManager, - WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig } @@ -21,7 +21,7 @@ class ScenarioActivityApiHttpServiceBusinessSpec with WithSimplifiedDesignerConfig with WithSimplifiedConfigScenarioHelper with WithMockableDeploymentManager - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceSecuritySpec.scala index d83008ada9e..c45b57a1088 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioActivityApiHttpServiceSecuritySpec.scala @@ -5,21 +5,21 @@ import io.restassured.module.scala.RestAssuredSupport.AddThenToResponse import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.engine.build.ScenarioBuilder import pl.touk.nussknacker.test.{NuRestAssureMatchers, RestAssuredVerboseLogging} -import pl.touk.nussknacker.test.base.it.{NuItTest, WithRichConfigScenarioHelper} -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.base.it.{NuItTest, WithAccessControlCheckingConfigScenarioHelper} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} import pl.touk.nussknacker.test.config.{ - WithMockableDeploymentManager, - WithRichConfigRestAssuredUsersExtensions, - WithRichDesignerConfig + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig, + WithMockableDeploymentManager } class ScenarioActivityApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigScenarioHelper + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigScenarioHelper with WithMockableDeploymentManager - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceBusinessSpec.scala index fedd1cfeeee..1fe9757d178 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceBusinessSpec.scala @@ -4,14 +4,14 @@ import io.restassured.RestAssured.`given` import io.restassured.module.scala.RestAssuredSupport.AddThenToResponse import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.test.base.it.NuItTest -import pl.touk.nussknacker.test.config.{WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig} +import pl.touk.nussknacker.test.config.{WithBusinessCaseRestAssuredUsersExtensions, WithSimplifiedDesignerConfig} import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} class ScenarioParametersApiHttpServiceBusinessSpec extends AnyFreeSpecLike with NuItTest with WithSimplifiedDesignerConfig - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceSecuritySpec.scala index 81820931cd5..132bcd41f65 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/ScenarioParametersApiHttpServiceSecuritySpec.scala @@ -4,14 +4,17 @@ import io.restassured.RestAssured.`given` import io.restassured.module.scala.RestAssuredSupport.AddThenToResponse import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.test.base.it.NuItTest -import pl.touk.nussknacker.test.config.{WithRichConfigRestAssuredUsersExtensions, WithRichDesignerConfig} +import pl.touk.nussknacker.test.config.{ + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig +} import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} class ScenarioParametersApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceBusinessSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceBusinessSpec.scala index 1f35e8d6941..cdf3e1fca4c 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceBusinessSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceBusinessSpec.scala @@ -6,13 +6,13 @@ import org.hamcrest.Matchers.equalTo import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} import pl.touk.nussknacker.test.base.it.NuItTest -import pl.touk.nussknacker.test.config.{WithSimplifiedConfigRestAssuredUsersExtensions, WithSimplifiedDesignerConfig} +import pl.touk.nussknacker.test.config.{WithBusinessCaseRestAssuredUsersExtensions, WithSimplifiedDesignerConfig} class UserApiHttpServiceBusinessSpec extends AnyFreeSpecLike with NuItTest with WithSimplifiedDesignerConfig - with WithSimplifiedConfigRestAssuredUsersExtensions + with WithBusinessCaseRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceCategoryUsedMoreThanOnceConfigSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceCategoryUsedMoreThanOnceConfigSpec.scala new file mode 100644 index 00000000000..cd4337469a7 --- /dev/null +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceCategoryUsedMoreThanOnceConfigSpec.scala @@ -0,0 +1,44 @@ +package pl.touk.nussknacker.ui.api + +import io.restassured.RestAssured.given +import io.restassured.module.scala.RestAssuredSupport.AddThenToResponse +import org.scalatest.freespec.AnyFreeSpecLike +import pl.touk.nussknacker.test.base.it.NuItTest +import pl.touk.nussknacker.test.config.WithCategoryUsedMoreThanOnceDesignerConfig.TestCategory +import pl.touk.nussknacker.test.config.{ + WithBusinessCaseRestAssuredUsersExtensions, + WithCategoryUsedMoreThanOnceDesignerConfig +} +import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} + +class UserApiHttpServiceCategoryUsedMoreThanOnceConfigSpec + extends AnyFreeSpecLike + with NuItTest + with WithCategoryUsedMoreThanOnceDesignerConfig + with WithBusinessCaseRestAssuredUsersExtensions + with NuRestAssureMatchers + with RestAssuredVerboseLogging + with PatientScalaFutures { + + "In designer configured with multiple processing types using the same category" - { + "The endpoint for getting user info should" - { + "return not duplicated categories" in { + given() + .when() + .basicAuthAdmin() + .get(s"$nuDesignerHttpAddress/api/user") + .Then() + .statusCode(200) + .equalsJsonBody(s"""{ + | "id": "admin", + | "username": "admin", + | "isAdmin": true, + | "categories": ["${TestCategory.Category1}"], + | "categoryPermissions": {}, + | "globalPermissions": [] + |}""".stripMargin) + } + } + } + +} diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceSecuritySpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceSecuritySpec.scala index 7c26ada9047..23ecd9abed8 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceSecuritySpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/api/UserApiHttpServiceSecuritySpec.scala @@ -5,14 +5,17 @@ import io.restassured.module.scala.RestAssuredSupport.AddThenToResponse import org.hamcrest.Matchers.equalTo import org.scalatest.freespec.AnyFreeSpecLike import pl.touk.nussknacker.test.base.it.NuItTest -import pl.touk.nussknacker.test.config.{WithRichConfigRestAssuredUsersExtensions, WithRichDesignerConfig} +import pl.touk.nussknacker.test.config.{ + WithAccessControlCheckingConfigRestAssuredUsersExtensions, + WithAccessControlCheckingDesignerConfig +} import pl.touk.nussknacker.test.{NuRestAssureMatchers, PatientScalaFutures, RestAssuredVerboseLogging} class UserApiHttpServiceSecuritySpec extends AnyFreeSpecLike with NuItTest - with WithRichDesignerConfig - with WithRichConfigRestAssuredUsersExtensions + with WithAccessControlCheckingDesignerConfig + with WithAccessControlCheckingConfigRestAssuredUsersExtensions with NuRestAssureMatchers with RestAssuredVerboseLogging with PatientScalaFutures { diff --git a/designer/server/src/test/scala/pl/touk/nussknacker/ui/process/DBProcessServiceSpec.scala b/designer/server/src/test/scala/pl/touk/nussknacker/ui/process/DBProcessServiceSpec.scala index 13a656ef533..541d4311b3b 100644 --- a/designer/server/src/test/scala/pl/touk/nussknacker/ui/process/DBProcessServiceSpec.scala +++ b/designer/server/src/test/scala/pl/touk/nussknacker/ui/process/DBProcessServiceSpec.scala @@ -14,8 +14,8 @@ import pl.touk.nussknacker.security.Permission import pl.touk.nussknacker.test.PatientScalaFutures import pl.touk.nussknacker.test.utils.domain.TestProcessUtil.{createFragmentEntity, createScenarioEntity} import pl.touk.nussknacker.test.config.ConfigWithScalaVersion -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory -import pl.touk.nussknacker.test.config.WithRichDesignerConfig.TestCategory.{Category1, Category2} +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory +import pl.touk.nussknacker.test.config.WithAccessControlCheckingDesignerConfig.TestCategory.{Category1, Category2} import pl.touk.nussknacker.test.mock.MockFetchingProcessRepository import pl.touk.nussknacker.test.utils.domain.{ProcessTestData, TestFactory} import pl.touk.nussknacker.ui.NuDesignerError diff --git a/docs/developers_guide/Basics.md b/docs/developers_guide/Basics.md index fc8e8eb8b4e..c6869490f8b 100644 --- a/docs/developers_guide/Basics.md +++ b/docs/developers_guide/Basics.md @@ -34,7 +34,7 @@ To read more see [ComponentProvider API](./Components.md) The Designer uses [DeploymentManager](https://github.com/TouK/nussknacker/blob/staging/designer/deployment-manager-api/src/main/scala/pl/touk/nussknacker/engine/api/deployment/DeploymentManager.scala) interface to perform actions on scenarios (deploy / cancel / etc.). All providers that are available in distribution deployment are located in `managers` directory and are added to the Designer classpath. If you want to implement own `DeploymentManager`, you should implement this interface, package it, add to classpath and configure scenario type to use it. More info you can find on -[DeploymentManagerConfiguration page](../installation_configuration_guide/DeploymentManagerConfiguration.md) +[Scenario Deployment Configuration page](../installation_configuration_guide/ScenarioDeploymentConfiguration.md) ## Other SPIs for Nussknacker customization (documentation will follow soon...) diff --git a/docs/installation/Installation.md b/docs/installation/Installation.md index 4ff4f505c0a..ed20c62b812 100644 --- a/docs/installation/Installation.md +++ b/docs/installation/Installation.md @@ -31,7 +31,7 @@ If you want to see Nussknacker in action without Kafka, using embedded Request-R ```bash docker run -it -p 8080:8080 -p 8181:8181 touk/nussknacker:latest ``` -After it started go to http://localhost:8080 and login using credentials: admin/admin. +After it started go to [http://localhost:8080](http://localhost:8080) and login using credentials: admin/admin. REST endpoints of deployed scenarios will be exposed at `http://localhost:8181/scenario/`. Slug is defined in Properties, and by default it is scenario name. More information you can find at [Docker Hub](https://hub.docker.com/r/touk/nussknacker/) @@ -258,7 +258,7 @@ If you want to install them from the scratch or use already installed at your or - Telegraf's configuration - some metric tags and names need to be cleaned - Importing scenario dashboard to Grafana configuration - Flink savepoint configuration. To be able to use scenario verification - (see `shouldVerifyBeforeDeploy` property in [Deployment Manager documentation](../installation_configuration_guide/DeploymentManagerConfiguration.md)) + (see `shouldVerifyBeforeDeploy` property in [scenario deployment configuration](../installation_configuration_guide/ScenarioDeploymentConfiguration.md)) you have to make sure that savepoint location is available from Nussknacker designer (e.g. via NFS like in quickstart setup) diff --git a/docs/installation_configuration_guide/Common.md b/docs/installation_configuration_guide/Common.md index ab64897a8c1..1caf605d6de 100644 --- a/docs/installation_configuration_guide/Common.md +++ b/docs/installation_configuration_guide/Common.md @@ -19,11 +19,15 @@ Nussknacker configuration is divided into several configuration areas, each area * [Designer](/about/GLOSSARY#nussknacker-designer) configuration (web application ports, security, various UI settings, database), * Scenario Types configuration, comprising of: - * [Deployment Manager](/about/GLOSSARY#deployment-manager) configuration, * [Model](/about/GLOSSARY#model) configuration. - * [Category](/installation_configuration_guide/DesignerConfiguration/#scenario-type-categories) configuration + * [Scenario Deployment](./ScenarioDeploymentConfiguration.md) configuration, + * [Category](./DesignerConfiguration.md/#scenario-type-categories) configuration -The Scenario Type is a convenient umbrella term for a particular Deployment Manager configuration and the associated model configuration. Diagram below presents main relationships between configuration areas. +[Model](/about/GLOSSARY#model) configuration defines which components and which [Processing Mode](/about/ProcessingModes) will be available for the user. +[Scenario Deployment](./ScenarioDeploymentConfiguration.md) configuration defines how scenario using these components will be deployed on the [Engine](/about/engine). +[Category](./DesignerConfiguration.md/#scenario-type-categories) defines who has access to the given combination of [Model](/about/GLOSSARY#model) and [Scenario Deployment](./ScenarioDeploymentConfiguration.md). + +The Scenario Type is a convenient umbrella term that groups all these things. Diagram below presents main relationships between configuration areas. ![Configuration areas](img/configuration_areas.png "configuration areas") @@ -44,28 +48,28 @@ environment: "local"
# Each scenario type is configured here
scenarioTypes {"{"}
{" "} "scenario-type-1": {"{"}
-{" "} # Configuration of DeploymentManager (Flink used as example here)
+{" "} # Configuration of scenario deployment (Flink used as example here)
{" "} deploymentConfig: {"{"}
-{" "} type: "flinkStreaming"
-{" "} restUrl: "http://localhost:8081"
-{" "} }
+{" "} type: "flinkStreaming"
+{" "} restUrl: "http://localhost:8081"
+{" "} }
{" "} # Configuration of model
{" "} modelConfig: {"{"}
-{" "} classPath: ["model/defaultModel.jar", "model/flinkExecutor.jar", "components/flink"]
-{" "} restartStrategy.default.strategy: disable
-{" "} components {"{"}
+{" "} classPath: ["model/defaultModel.jar", "model/flinkExecutor.jar", "components/flink"]
+{" "} restartStrategy.default.strategy: disable
+{" "} components {"{"}
{" "} ...
-{" "} }
-{" "} }
-{" "} category: "Default"
-{" "} }
+{" "} }
+{" "} }
+{" "} category: "Default"
+{" "} }
}
-It is worth noting that one Nussknacker Designer instance may be used to work with multiple Scenario Types which: +It is worth noting that one Nussknacker Designer may be used to work with multiple Scenario Types and allow user: -* can be deployed with various Deployment Managers to e.g. different Flink clusters -* use different components and Model configurations +* To use different set of components depending on the category +* To deploy scenarios on different [Engines](/about/engine) See [development configuration](https://github.com/TouK/nussknacker/blob/staging/nussknacker-dist/src/universal/conf/dev-application.conf#L33) (used to test various Nussknacker features) for an example of configuration with more than one Scenario Type. diff --git a/docs/installation_configuration_guide/DesignerConfiguration.md b/docs/installation_configuration_guide/DesignerConfiguration.md index e7a104be65f..2fe4147ae71 100644 --- a/docs/installation_configuration_guide/DesignerConfiguration.md +++ b/docs/installation_configuration_guide/DesignerConfiguration.md @@ -104,7 +104,7 @@ with the settings presented below: Nussknacker Designer can be configured to replace certain values in comments to links that can point e.g. to external issue tracker like GitHub issues or Jira. For example, `MARKETING-555` will change to link `https://jira.organization.com/jira/browse/MARKETING-555`. -See [development configuration](https://github.com/TouK/nussknacker/blob/staging/nussknacker-dist/src/universal/conf/dev-application.conf#L104) for example configuration. +See [development configuration](https://github.com/TouK/nussknacker/blob/staging/nussknacker-dist/src/universal/conf/dev-application.conf#L329) for example configuration. | Parameter name | Importance | Type | Default value | Description | @@ -770,7 +770,7 @@ scenarioTypes { ``` Scenario type configuration consists of parts: -- `deploymentConfig` - [deployment manager configuration](./DeploymentManagerConfiguration.md) +- `deploymentConfig` - [scenario deployment configuration](./ScenarioDeploymentConfiguration.md) - `modelConfig` - [model configuration](./model/ModelConfiguration.md) - `category` - category handled by given scenario type diff --git a/docs/installation_configuration_guide/DeploymentManagerConfiguration.md b/docs/installation_configuration_guide/ScenarioDeploymentConfiguration.md similarity index 77% rename from docs/installation_configuration_guide/DeploymentManagerConfiguration.md rename to docs/installation_configuration_guide/ScenarioDeploymentConfiguration.md index 0d202e2f53f..62a4b9b933f 100644 --- a/docs/installation_configuration_guide/DeploymentManagerConfiguration.md +++ b/docs/installation_configuration_guide/ScenarioDeploymentConfiguration.md @@ -3,26 +3,32 @@ title: Deployment sidebar_position: 3 --- -# Deployment Manager configuration +# Scenario Deployment configuration -Deployment Manager deploys scenarios from the Designer to the engine on which scenarios are processed. -Check [configuration areas](./Common.md#configuration-areas) to understand where Deployment Manager configuration should be -placed in Nussknacker configuration. +In order to deploy scenario on the given [Engine](/about/engine), you need to configure the deployment. -Below you can find a snippet of Deployment Manager configuration. +Deployment of a scenario is managed by Designer's extension called [Deployment Manager](/about/GLOSSARY#deployment-manager). +To enable given [Deployment Manager](/about/GLOSSARY#deployment-manager) you need to place its jar package in the Designer's classpath. +Nussknacker is distributed with three default [Deployment Managers](/about/GLOSSARY#deployment-manager) (`flinkStreaming`, `lite-k8s`, `lite-embedded`). Their jars are located in the `managers` +directory. Depending on which [Deployment Manager](/about/GLOSSARY#deployment-manager) you've selected, you should provide parameters values for it specifically - see sections below to find out available parameters. + +Section with `deploymentConfig` needs to be placed in the correct place in the Designer's configuration. Check [configuration areas](./Common.md#configuration-areas) to understand the structure of the configuration. + +Below you can find a snippet of scenario deployment configuration. ``` deploymentConfig { type: "flinkStreaming" - restUrl: "http://localhost:8081" engineSetupName: "My Flink Cluster" - # additional configuration goes here + # Deployment Manager's specific parameters + restUrl: "http://localhost:8081" } ``` -`type` parameter determines engine to which the scenario is deployed. It is set in the [minimal configuration file](./Common.md#minimal-configuration-file) (docker image, binary distribution) and in the Helm chart - you will not need to set it on your own. -`engineSetupName` parameter is optional. It specifies how the engine will be displayed in the GUI. If not specified, default name will be used instead (e.g. `Flink` for `flinkStreaming` Deployment Manager). +Parameters: +- `type` parameter determines the type of the [Deployment Manager](/about/GLOSSARY#deployment-manager). Possible options are: `flinkStreaming`, `lite-k8s`, `lite-embedded` +- `engineSetupName` parameter is optional. It specifies how the engine will be displayed in the GUI. If not specified, default name will be used instead (e.g. `Flink` for `flinkStreaming` Deployment Manager). ## Kubernetes native Lite engine configuration @@ -38,25 +44,23 @@ The table below contains configuration options for the Lite engine. If you insta   If you install Designer outside the K8s cluster then the required changes should be applied under the `deploymentConfig` key as any other Nussknacker non K8s configuration. - - -| Parameter | Type | Default value | Description | -|-------------------------------|-----------------------------------------------------|-----------------------------------|------------------------------------------------------------------------------------------| -| mode | string | | Processing mode: either streaming or request-response | -| dockerImageName | string | touk/nussknacker-lite-runtime-app | Runtime image (please note that it's **not** touk/nussknacker - which is designer image) | -| dockerImageTag | string | current nussknacker version | | -| scalingConfig *(Streaming processing mode)*| {tasksPerReplica: int} | { tasksPerReplica: 4 } | see [below](#configuring-replicas-count) | -| scalingConfig *(Request - Response processing mode)*| {fixedReplicasCount: int} | { fixedReplicasCount: 2 } | see [below](#configuring-replicas-count) | -| configExecutionOverrides | config | {} | see [below](#overriding-configuration-passed-to-runtime) | -| k8sDeploymentConfig | config | {} | see [below](#customizing-k8s-deployment-resource-definition) | -| nussknackerInstanceName | string | {?NUSSKNACKER_INSTANCE_NAME} | see [below](#nussknacker-instance-name) | -| logbackConfigPath | string | {} | see [below](#configuring-runtime-logging) | -| commonConfigMapForLogback | string | {} | see [below](#configuring-runtime-logging) | -| ingress | config | {enabled: false} | (Request-Response only) see [below](#configuring-runtime-ingress) | -| servicePort | int | 80 | (Request-Response only) Port of service exposed | -| scenarioStateCaching.enabled | boolean | true | Enables scenario state caching in scenario list view | -| scenarioStateCaching.cacheTTL | duration | 10 seconds | TimeToLeave for scenario state cache entries | -| scenarioStateIdleTimeout | duration | 3 seconds | Idle timeout for fetching scenario state from K8s | +| Parameter | Type | Default value | Description | +|------------------------------------------------------|---------------------------|-----------------------------------|------------------------------------------------------------------------------------------| +| mode | string | | Processing mode: either streaming or request-response | +| dockerImageName | string | touk/nussknacker-lite-runtime-app | Runtime image (please note that it's **not** touk/nussknacker - which is designer image) | +| dockerImageTag | string | current nussknacker version | | +| scalingConfig *(Streaming processing mode)* | {tasksPerReplica: int} | { tasksPerReplica: 4 } | see [below](#configuring-replicas-count) | +| scalingConfig *(Request - Response processing mode)* | {fixedReplicasCount: int} | { fixedReplicasCount: 2 } | see [below](#configuring-replicas-count) | +| configExecutionOverrides | config | {} | see [below](#overriding-configuration-passed-to-runtime) | +| k8sDeploymentConfig | config | {} | see [below](#customizing-k8s-deployment-resource-definition) | +| nussknackerInstanceName | string | {?NUSSKNACKER_INSTANCE_NAME} | see [below](#nussknacker-instance-name) | +| logbackConfigPath | string | {} | see [below](#configuring-runtime-logging) | +| commonConfigMapForLogback | string | {} | see [below](#configuring-runtime-logging) | +| ingress | config | {enabled: false} | (Request-Response only) see [below](#configuring-runtime-ingress) | +| servicePort | int | 80 | (Request-Response only) Port of service exposed | +| scenarioStateCaching.enabled | boolean | true | Enables scenario state caching in scenario list view | +| scenarioStateCaching.cacheTTL | duration | 10 seconds | TimeToLeave for scenario state cache entries | +| scenarioStateIdleTimeout | duration | 3 seconds | Idle timeout for fetching scenario state from K8s | ### Customizing K8s deployment resource definition diff --git a/docs/installation_configuration_guide/img/configuration_areas.png b/docs/installation_configuration_guide/img/configuration_areas.png index 0ff5c3b73a7..baa90d3518f 100644 Binary files a/docs/installation_configuration_guide/img/configuration_areas.png and b/docs/installation_configuration_guide/img/configuration_areas.png differ diff --git a/docs/installation_configuration_guide/model/ModelConfiguration.md b/docs/installation_configuration_guide/model/ModelConfiguration.md index c076a293128..210f73f177a 100644 --- a/docs/installation_configuration_guide/model/ModelConfiguration.md +++ b/docs/installation_configuration_guide/model/ModelConfiguration.md @@ -5,7 +5,7 @@ sidebar_position: 1 # Model configuration Model definition is part of a scenario type definition. There can be multiple scenario types in one Nussknacker installation, consequently there will also be multiple model definitions in such a case. -Check [configuration areas](docs/installation_configuration_guide/Common.md#configuration-areas) to understand where Model configuration should be placed in the Nussknacker configuration. If you deploy to K8s using Nussknacker Helm chart, check [here](docs/installation_configuration_guide/DeploymentManagerConfiguration.md#overriding-configuration-passed-to-runtime) how to supply additional model configuration. +Check [configuration areas](docs/installation_configuration_guide/Common.md#configuration-areas) to understand where Model configuration should be placed in the Nussknacker configuration. If you deploy to K8s using Nussknacker Helm chart, check [here](docs/installation_configuration_guide/ScenarioDeploymentConfiguration.md#overriding-configuration-passed-to-runtime) how to supply additional model configuration. Model defines how to configure [components](/about/GLOSSARY#component) and certain runtime behavior (e.g. error handling) for a given scenario type. Model configuration is processed not only at the Designer but also passed to the execution engine (e.g. Flink), that’s why it’s parsed and processed a bit differently: diff --git a/docs/integration/OpenAPI.md b/docs/integration/OpenAPI.md index be3e688ff89..fa94fda2b40 100644 --- a/docs/integration/OpenAPI.md +++ b/docs/integration/OpenAPI.md @@ -89,4 +89,4 @@ Enricher level logging can be enabled: - in Flink TaskManager [configuration](https://github.com/TouK/nussknacker-quickstart/blob/main/docker/streaming/flink/log4j-console.properties) - in Lite - runtime [configuration](../installation_configuration_guide/DeploymentManagerConfiguration.md#configuring-runtime-logging) + runtime [configuration](../installation_configuration_guide/ScenarioDeploymentConfiguration.md#configuring-runtime-logging) diff --git a/docs/operations_guide/Lite.md b/docs/operations_guide/Lite.md index 60896e55036..3d71216cdfc 100644 --- a/docs/operations_guide/Lite.md +++ b/docs/operations_guide/Lite.md @@ -100,7 +100,7 @@ If you need more fine-grained control over logging in specific scenario deployme file which is being used by it, by overriding config map linked to your runtime container under `logback.xml` key. Please be aware, that modifications made to this config map are transient - every (re)deploy of scenario, creates config map from scratch with default (or configured in DeploymentManager - -see [docs](../installation_configuration_guide/DeploymentManagerConfiguration.md#configuring-runtime-logging) ) content. +see [docs](../installation_configuration_guide/ScenarioDeploymentConfiguration.md#configuring-runtime-logging) ) content. ### Managing lifecycle of scenario