Skip to content

Commit

Permalink
Add steps to configure secrets in forms
Browse files Browse the repository at this point in the history
  • Loading branch information
deadlycoconuts committed Feb 19, 2025
1 parent 99af479 commit fe8fe8d
Show file tree
Hide file tree
Showing 10 changed files with 255 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { DockerDeploymentPanel } from "./DockerDeploymentPanel";
import { DockerEnsembler } from "../../../../../services/ensembler";
import { DockerRegistriesContextProvider } from "../../../../../providers/docker/context";
import { EnvVariablesPanel } from "./EnvVariablesPanel";
import { SecretsPanel } from "./SecretsPanel";
import { ResourcesPanel } from "../ResourcesPanel";
import { SecretsContextProvider } from "../../../../../providers/secrets/context";
import { useOnChangeHandler } from "../../../../../components/form/hooks/useOnChangeHandler";
Expand All @@ -30,8 +31,8 @@ export const DockerConfigFormGroup = ({
return (
!!dockerConfig && (
<Fragment>
<EuiFlexItem>
<SecretsContextProvider projectId={projectId}>
<SecretsContextProvider projectId={projectId}>
<EuiFlexItem>
<DockerRegistriesContextProvider>
<DockerDeploymentPanel
projectId={projectId}
Expand All @@ -40,33 +41,41 @@ export const DockerConfigFormGroup = ({
errors={errors}
/>
</DockerRegistriesContextProvider>
</SecretsContextProvider>
</EuiFlexItem>
</EuiFlexItem>

<EuiFlexItem>
<EnvVariablesPanel
variables={dockerConfig.env}
onChangeHandler={onChange("env")}
errors={errors.env}
/>
</EuiFlexItem>
<EuiFlexItem>
<EnvVariablesPanel
variables={dockerConfig.env}
onChangeHandler={onChange("env")}
errors={errors.env}
/>
</EuiFlexItem>

<EuiFlexItem>
<ResourcesPanel
resourcesConfig={dockerConfig.resource_request}
onChangeHandler={onChange("resource_request")}
errors={errors.resource_request}
maxAllowedReplica={maxAllowedReplica}
/>
</EuiFlexItem>
<EuiFlexItem>
<SecretsPanel
variables={dockerConfig.secrets}
onChangeHandler={onChange("secrets")}
errors={errors.secrets}
/>
</EuiFlexItem>

<EuiFlexItem>
<AutoscalingPolicyPanel
autoscalingPolicyConfig={dockerConfig.autoscaling_policy}
onChangeHandler={onChange("autoscaling_policy")}
errors={errors.autoscaling_policy}
/>
</EuiFlexItem>
<EuiFlexItem>
<ResourcesPanel
resourcesConfig={dockerConfig.resource_request}
onChangeHandler={onChange("resource_request")}
errors={errors.resource_request}
maxAllowedReplica={maxAllowedReplica}
/>
</EuiFlexItem>

<EuiFlexItem>
<AutoscalingPolicyPanel
autoscalingPolicyConfig={dockerConfig.autoscaling_policy}
onChangeHandler={onChange("autoscaling_policy")}
errors={errors.autoscaling_policy}
/>
</EuiFlexItem>
</SecretsContextProvider>
</Fragment>
)
);
Expand Down
119 changes: 119 additions & 0 deletions ui/src/router/components/form/components/docker_config/SecretsPanel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import React, { useContext, useEffect, useState } from "react";
import { EuiButtonIcon, EuiFieldText, EuiSpacer, EuiSuperSelect } from "@elastic/eui";
import { Panel } from "../Panel";
import { InMemoryTableForm } from "../../../../../components/form/in_memory_table_form/InMemoryTableForm";
import { useOnChangeHandler } from "../../../../../components/form/hooks/useOnChangeHandler";
import SecretsContext from "../../../../../providers/secrets/context";
import "./SecretsPanel.scss"

export const SecretsPanel = ({
variables,
onChangeHandler,
errors = {},
}) => {
const secrets = useContext(SecretsContext);
const { onChange } = useOnChangeHandler(onChangeHandler);

const items = [
...variables.map((v, idx) => ({ idx, ...v })),
{ idx: variables.length },
];

const onDeleteVariable = (idx) => () => {
variables.splice(idx, 1);
onChangeHandler(variables);
};

const getRowProps = (item) => {
const { idx } = item;
const isInvalid = !!errors[idx];
return {
className: isInvalid ? "euiTableRow--isInvalid" : "",
"data-test-subj": `row-${idx}`,
};
};

const [options, setOptions] = useState([]);

useEffect(() => {
if (secrets) {
const options = [];
secrets
.sort((a, b) => (a.name > b.name ? -1 : 1))
.forEach((secret) => {
options.push({
value: secret.name,
inputDisplay: secret.name,
textwrap: "truncate",
});
});
setOptions(options);
}
}, [secrets]);

const columns = [
{
name: "MLP Secret Name",
field: "mlp_secret_name",
width: "45%",
textOnly: false,
render: (name, item) => (
<EuiSuperSelect
placeholder={"Select MLP secret"}
compressed={true}
options={options}
valueOfSelected={name}
onChange={(e) => onChange(`${item.idx}.mlp_secret_name`)(e)}
hasDividers
/>
),
},
{
name: "Environment Variable Name",
field: "env_var_name",
width: "45%",
render: (value, item) => (
<EuiFieldText
controlOnly
className="inlineTableInput"
placeholder="Environment Variable Name"
value={value || ""}
onChange={(e) => onChange(`${item.idx}.env_var_name`)(e.target.value)}
/>
),
},
{
width: "10%",
actions: [
{
render: (item) => {
return item.idx < items.length - 1 ? (
<EuiButtonIcon
size="s"
color="danger"
iconType="trash"
onClick={onDeleteVariable(item.idx)}
aria-label="Remove variable"
/>
) : (
<div />
);
},
},
],
},
];

return (
<Panel title="Secrets">
<EuiSpacer size="xs" />
<InMemoryTableForm
columns={columns}
rowProps={getRowProps}
items={items}
errors={errors}
renderErrorHeader={(key) => `Row ${parseInt(key) + 1}`}
/>
</Panel>
);
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.euiBasicTable--inMemoryFormTable {
.euiTableRowCell > .euiTableCellContent {
display: block;
overflow: hidden;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { PyFuncEnsembler } from "../../../../../services/ensembler";
import { PyFuncDeploymentPanel } from "./PyFuncDeploymentPanel";
import { EnsemblersContextProvider } from "../../../../../providers/ensemblers/context";
import { EnvVariablesPanel } from "../docker_config/EnvVariablesPanel";
import { SecretsPanel } from "../docker_config/SecretsPanel";
import { AutoscalingPolicyPanel } from "../autoscaling_policy/AutoscalingPolicyPanel";

export const PyFuncConfigFormGroup = ({
Expand All @@ -31,8 +32,8 @@ export const PyFuncConfigFormGroup = ({
return (
!!pyfuncConfig && (
<Fragment>
<EuiFlexItem>
<SecretsContextProvider projectId={projectId}>
<SecretsContextProvider projectId={projectId}>
<EuiFlexItem>
<EnsemblersContextProvider
projectId={projectId}
ensemblerType={"pyfunc"}>
Expand All @@ -42,33 +43,41 @@ export const PyFuncConfigFormGroup = ({
errors={errors}
/>
</EnsemblersContextProvider>
</SecretsContextProvider>
</EuiFlexItem>
</EuiFlexItem>

<EuiFlexItem>
<EnvVariablesPanel
variables={pyfuncConfig.env}
onChangeHandler={onChange("env")}
errors={errors.env}
/>
</EuiFlexItem>
<EuiFlexItem>
<EnvVariablesPanel
variables={pyfuncConfig.env}
onChangeHandler={onChange("env")}
errors={errors.env}
/>
</EuiFlexItem>

<EuiFlexItem>
<ResourcesPanel
resourcesConfig={pyfuncConfig.resource_request}
onChangeHandler={onChange("resource_request")}
errors={errors.resource_request}
maxAllowedReplica={maxAllowedReplica}
/>
</EuiFlexItem>
<EuiFlexItem>
<SecretsPanel
variables={pyfuncConfig.secrets}
onChangeHandler={onChange("secrets")}
errors={errors.secrets}
/>
</EuiFlexItem>

<EuiFlexItem>
<AutoscalingPolicyPanel
autoscalingPolicyConfig={pyfuncConfig.autoscaling_policy}
onChangeHandler={onChange("autoscaling_policy")}
errors={errors.autoscaling_policy}
/>
</EuiFlexItem>
<EuiFlexItem>
<ResourcesPanel
resourcesConfig={pyfuncConfig.resource_request}
onChangeHandler={onChange("resource_request")}
errors={errors.resource_request}
maxAllowedReplica={maxAllowedReplica}
/>
</EuiFlexItem>

<EuiFlexItem>
<AutoscalingPolicyPanel
autoscalingPolicyConfig={pyfuncConfig.autoscaling_policy}
onChangeHandler={onChange("autoscaling_policy")}
errors={errors.autoscaling_policy}
/>
</EuiFlexItem>
</SecretsContextProvider>
</Fragment>
)
);
Expand Down
61 changes: 35 additions & 26 deletions ui/src/router/components/form/steps/EnricherStep.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import React, { Fragment, useContext } from "react";
import { FormContext, FormValidationContext } from "@caraml-dev/ui-lib";
import { AutoscalingPolicyPanel } from "../components/autoscaling_policy/AutoscalingPolicyPanel";
import { EnvVariablesPanel } from "../components/docker_config/EnvVariablesPanel";
import { SecretsPanel } from "../components/docker_config/SecretsPanel";
import { EnricherTypePanel } from "../components/enricher_config/EnricherTypePanel";
import { DockerDeploymentPanel } from "../components/docker_config/DockerDeploymentPanel";
import { DockerRegistriesContextProvider } from "../../../../providers/docker/context";
Expand Down Expand Up @@ -42,8 +43,8 @@ export const EnricherStep = ({ projectId }) => {

{enricher.type === "docker" && (
<Fragment>
<EuiFlexItem>
<SecretsContextProvider projectId={projectId}>
<SecretsContextProvider projectId={projectId}>
<EuiFlexItem>
<DockerRegistriesContextProvider>
<DockerDeploymentPanel
projectId={projectId}
Expand All @@ -52,33 +53,41 @@ export const EnricherStep = ({ projectId }) => {
errors={get(errors, "config.enricher")}
/>
</DockerRegistriesContextProvider>
</SecretsContextProvider>
</EuiFlexItem>
</EuiFlexItem>

<EuiFlexItem>
<EnvVariablesPanel
variables={enricher.env}
onChangeHandler={onChange("config.enricher.env")}
errors={get(errors, "config.enricher.env")}
/>
</EuiFlexItem>
<EuiFlexItem>
<EnvVariablesPanel
variables={enricher.env}
onChangeHandler={onChange("config.enricher.env")}
errors={get(errors, "config.enricher.env")}
/>
</EuiFlexItem>

<EuiFlexItem>
<ResourcesPanel
resourcesConfig={enricher.resource_request}
onChangeHandler={onChange("config.enricher.resource_request")}
maxAllowedReplica={maxAllowedReplica}
errors={get(errors, "config.enricher.resource_request")}
/>
</EuiFlexItem>
<EuiFlexItem>
<SecretsPanel
variables={enricher.secrets}
onChangeHandler={onChange("config.enricher.secrets")}
errors={get(errors, "config.enricher.secrets")}
/>
</EuiFlexItem>

<EuiFlexItem>
<AutoscalingPolicyPanel
autoscalingPolicyConfig={enricher.autoscaling_policy}
onChangeHandler={onChange("config.enricher.autoscaling_policy")}
errors={get(errors, "config.enricher.autoscaling_policy")}
/>
</EuiFlexItem>
<EuiFlexItem>
<ResourcesPanel
resourcesConfig={enricher.resource_request}
onChangeHandler={onChange("config.enricher.resource_request")}
maxAllowedReplica={maxAllowedReplica}
errors={get(errors, "config.enricher.resource_request")}
/>
</EuiFlexItem>

<EuiFlexItem>
<AutoscalingPolicyPanel
autoscalingPolicyConfig={enricher.autoscaling_policy}
onChangeHandler={onChange("config.enricher.autoscaling_policy")}
errors={get(errors, "config.enricher.autoscaling_policy")}
/>
</EuiFlexItem>
</SecretsContextProvider>
</Fragment>
)}
</EuiFlexGroup>
Expand Down
Loading

0 comments on commit fe8fe8d

Please sign in to comment.