From 9e6388aac3aee0bc249181d6fe5a30af707f79fd Mon Sep 17 00:00:00 2001 From: Navid Yaghoobi Date: Sun, 2 Mar 2025 13:16:08 +1100 Subject: [PATCH] Container create dialog secret option Signed-off-by: Navid Yaghoobi --- pdcs/containers/create.go | 6 +++++ test/005-container.bats | 6 ++--- ui/containers/cntdialogs/create.go | 32 ++++++++++++++++++++++++- ui/containers/cntdialogs/create_test.go | 5 ++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/pdcs/containers/create.go b/pdcs/containers/create.go index 75fca100a..595ae1c5b 100644 --- a/pdcs/containers/create.go +++ b/pdcs/containers/create.go @@ -28,6 +28,7 @@ type CreateOptions struct { Remove bool Privileged bool Timeout string + Secret []string WorkDir string EnvVars []string EnvFile []string @@ -211,6 +212,11 @@ func Create(opts CreateOptions) ([]string, error) { //nolint:cyclop,gocognit,goc createOptions.GroupEntry = opts.GroupEntry } + // add secrets + if len(opts.Secret) > 0 { + createOptions.Secrets = opts.Secret + } + // add healthcheck options if err := containerHealthOptions(&createOptions, opts); err != nil { return warningResponse, err diff --git a/test/005-container.bats b/test/005-container.bats index b065e3409..c558454dc 100644 --- a/test/005-container.bats +++ b/test/005-container.bats @@ -30,7 +30,7 @@ load helpers_tui podman_tui_select_item $image_index podman_tui_send_inputs "Enter" "Tab" "Tab" "Tab" podman_tui_send_inputs "Space" "Tab" "Space" "Tab" "$TEST_CONTAINER_TIMEOUT" - podman_tui_send_inputs "Tab" "Tab" + podman_tui_send_inputs "Tab" "Tab" "Tab" sleep 2 podman_tui_send_inputs "Enter" sleep 3 @@ -65,7 +65,7 @@ load helpers_tui podman_tui_send_inputs $TEST_CONTAINER_NAME "Tab" podman_tui_send_inputs "Down" podman_tui_select_item $image_index - podman_tui_send_inputs "Enter" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" + podman_tui_send_inputs "Enter" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" sleep 2 # switch to environmen page @@ -130,7 +130,7 @@ load helpers_tui podman_tui_send_inputs "Down" podman_tui_select_item $pod_index podman_tui_send_inputs "Enter" "Tab" - podman_tui_send_inputs $TEST_LABEL "Tab" "Tab" "Tab" "Tab" "Tab" + podman_tui_send_inputs $TEST_LABEL "Tab" "Tab" "Tab" "Tab" "Tab" "Tab" sleep 1 podman_tui_send_inputs "Tab" sleep 1 diff --git a/ui/containers/cntdialogs/create.go b/ui/containers/cntdialogs/create.go index 7db731e05..f8b5e9737 100644 --- a/ui/containers/cntdialogs/create.go +++ b/ui/containers/cntdialogs/create.go @@ -34,6 +34,7 @@ const ( createContainerRemoveFieldFocus createContainerPrivilegedFieldFocus createContainerTimeoutFieldFocus + createContainerSecretFieldFocus createContainerEnvHostFieldFocus createContainerEnvVarsFieldFocus createContainerEnvFileFieldFocus @@ -119,6 +120,7 @@ type ContainerCreateDialog struct { containerRemoveField *tview.Checkbox containerPrivilegedField *tview.Checkbox containerTimeoutField *tview.InputField + containerSecretField *tview.InputField containerWorkDirField *tview.InputField containerEnvHostField *tview.Checkbox containerEnvVarsField *tview.InputField @@ -202,6 +204,7 @@ func NewContainerCreateDialog() *ContainerCreateDialog { containerRemoveField: tview.NewCheckbox(), containerPrivilegedField: tview.NewCheckbox(), containerTimeoutField: tview.NewInputField(), + containerSecretField: tview.NewInputField(), containerWorkDirField: tview.NewInputField(), containerEnvHostField: tview.NewCheckbox(), containerEnvVarsField: tview.NewInputField(), @@ -375,6 +378,13 @@ func (d *ContainerCreateDialog) setupContainerInfoPageUI() { d.containerTimeoutField.SetLabelColor(style.DialogFgColor) d.containerTimeoutField.SetFieldBackgroundColor(inputFieldBgColor) + // secrets + d.containerSecretField.SetLabel("secret:") + d.containerSecretField.SetLabelWidth(cntInfoPageLabelWidth) + d.containerSecretField.SetBackgroundColor(bgColor) + d.containerSecretField.SetLabelColor(style.DialogFgColor) + d.containerSecretField.SetFieldBackgroundColor(inputFieldBgColor) + // layout labelPaddings := 4 checkBoxLayout := tview.NewFlex().SetDirection(tview.FlexColumn) @@ -395,6 +405,8 @@ func (d *ContainerCreateDialog) setupContainerInfoPageUI() { d.containerInfoPage.AddItem(d.containerLabelsField, 1, 0, true) d.containerInfoPage.AddItem(utils.EmptyBoxSpace(bgColor), 1, 0, true) d.containerInfoPage.AddItem(checkBoxLayout, 1, 0, true) + d.containerInfoPage.AddItem(utils.EmptyBoxSpace(bgColor), 1, 0, true) + d.containerInfoPage.AddItem(d.containerSecretField, 1, 0, true) d.containerInfoPage.SetBackgroundColor(bgColor) } @@ -997,6 +1009,8 @@ func (d *ContainerCreateDialog) Focus(delegate func(p tview.Primitive)) { //noli delegate(d.containerPrivilegedField) case createContainerTimeoutFieldFocus: delegate(d.containerTimeoutField) + case createContainerSecretFieldFocus: + delegate(d.containerSecretField) // environment options page case createContainerWorkDirFieldFocus: delegate(d.containerWorkDirField) @@ -1431,6 +1445,7 @@ func (d *ContainerCreateDialog) initData() { d.containerRemoveField.SetChecked(false) d.containerPrivilegedField.SetChecked(false) d.containerTimeoutField.SetText("") + d.containerSecretField.SetText("") // environment category d.containerWorkDirField.SetText("") @@ -1546,6 +1561,12 @@ func (d *ContainerCreateDialog) setContainerInfoPageNextFocus() { return } + if d.containerTimeoutField.HasFocus() { + d.focusElement = createContainerSecretFieldFocus + + return + } + d.focusElement = createContainerFormFocus } @@ -1770,7 +1791,7 @@ func (d *ContainerCreateDialog) setVolumeSettingsPageNextFocus() { } // ContainerCreateOptions returns new network options. -func (d *ContainerCreateDialog) ContainerCreateOptions() containers.CreateOptions { //nolint:cyclop,gocognit +func (d *ContainerCreateDialog) ContainerCreateOptions() containers.CreateOptions { //nolint:cyclop,gocognit,gocyclo var ( labels []string imageID string @@ -1787,6 +1808,7 @@ func (d *ContainerCreateDialog) ContainerCreateOptions() containers.CreateOption envMerge []string unsetEnv []string hostUsers []string + secret []string ) for _, label := range strings.Split(d.containerLabelsField.GetText(), " ") { @@ -1884,6 +1906,13 @@ func (d *ContainerCreateDialog) ContainerCreateOptions() containers.CreateOption } } + // secret + for _, sec := range strings.Split(d.containerSecretField.GetText(), " ") { + if sec != "" { + secret = append(secret, sec) + } + } + _, network := d.containerNetworkField.GetCurrentOption() opts := containers.CreateOptions{ Name: d.containerNameField.GetText(), @@ -1893,6 +1922,7 @@ func (d *ContainerCreateDialog) ContainerCreateOptions() containers.CreateOption Remove: d.containerRemoveField.IsChecked(), Privileged: d.containerPrivilegedField.IsChecked(), Timeout: d.containerTimeoutField.GetText(), + Secret: secret, WorkDir: d.containerWorkDirField.GetText(), EnvVars: envVars, EnvFile: envFile, diff --git a/ui/containers/cntdialogs/create_test.go b/ui/containers/cntdialogs/create_test.go index 21a8437e6..d48128cb1 100644 --- a/ui/containers/cntdialogs/create_test.go +++ b/ui/containers/cntdialogs/create_test.go @@ -240,6 +240,11 @@ var _ = Describe("container create", Ordered, func() { createDialog.setContainerInfoPageNextFocus() Expect(createDialog.focusElement).To(Equal(createContainerTimeoutFieldFocus)) + createDialogApp.SetFocus(createDialog) + createDialogApp.Draw() + createDialog.setContainerInfoPageNextFocus() + Expect(createDialog.focusElement).To(Equal(createContainerSecretFieldFocus)) + createDialogApp.SetFocus(createDialog) createDialogApp.Draw() createDialog.setContainerInfoPageNextFocus()