Skip to content

Commit a06dbbb

Browse files
[domain-deletion]Add domain delete CLI command (#6908)
* [domain-deletion]Add domain delete CLI command * Update tests & make security token required flag * Add test case for deletion cancelled * Update tests
1 parent e3c3fcc commit a06dbbb

File tree

5 files changed

+184
-0
lines changed

5 files changed

+184
-0
lines changed

tools/cli/admin.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,17 @@ func newAdminDomainCommands() []*cli.Command {
403403
})
404404
},
405405
},
406+
{
407+
Name: "delete",
408+
Aliases: []string{"del"},
409+
Usage: "Delete existing workflow domain",
410+
Flags: adminDeleteDomainFlags,
411+
Action: func(c *cli.Context) error {
412+
return withDomainClient(c, true, func(dc *domainCLIImpl) error {
413+
return dc.DeleteDomain(c)
414+
})
415+
},
416+
},
406417
{
407418
Name: "deprecate",
408419
Aliases: []string{"dep"},

tools/cli/app_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,73 @@ var describeDomainResponseServer = &types.DescribeDomainResponse{
200200
},
201201
}
202202

203+
// This is used to mock the domain deletion confirmation
204+
func (s *cliAppSuite) mockStdinInput(input string) func() {
205+
oldStdin := os.Stdin
206+
r, w, err := os.Pipe()
207+
s.Require().NoError(err)
208+
os.Stdin = r
209+
210+
go func() {
211+
_, wrErr := w.Write([]byte(input + "\n"))
212+
s.Require().NoError(wrErr)
213+
err = w.Close()
214+
s.Require().NoError(err)
215+
}()
216+
217+
return func() {
218+
os.Stdin = oldStdin
219+
r.Close()
220+
}
221+
}
222+
223+
func (s *cliAppSuite) TestDomainDelete() {
224+
resp := describeDomainResponseServer
225+
s.serverFrontendClient.EXPECT().DescribeDomain(gomock.Any(), gomock.Any()).Return(resp, nil)
226+
s.serverFrontendClient.EXPECT().DeleteDomain(gomock.Any(), gomock.Any()).Return(nil)
227+
228+
defer s.mockStdinInput("Yes")()
229+
err := s.app.Run([]string{"", "--do", domainName, "domain", "delete", "--st", "test-token"})
230+
s.Nil(err)
231+
}
232+
233+
func (s *cliAppSuite) TestDomainDelete_DomainNotExist() {
234+
s.serverFrontendClient.EXPECT().DescribeDomain(gomock.Any(), gomock.Any()).Return(nil, &types.EntityNotExistsError{})
235+
s.Error(s.app.Run([]string{"", "--do", domainName, "domain", "delete", "--st", "test-token"}))
236+
}
237+
238+
func (s *cliAppSuite) TestDomainDelete_Failed() {
239+
resp := describeDomainResponseServer
240+
s.serverFrontendClient.EXPECT().DescribeDomain(gomock.Any(), gomock.Any()).Return(resp, nil)
241+
s.serverFrontendClient.EXPECT().DeleteDomain(gomock.Any(), gomock.Any()).Return(&types.BadRequestError{"mock error"})
242+
243+
defer s.mockStdinInput("Yes")()
244+
s.Error(s.app.Run([]string{"", "--do", domainName, "domain", "delete", "--st", "test-token"}))
245+
}
246+
247+
func (s *cliAppSuite) TestDomainDelete_Cancelled() {
248+
resp := describeDomainResponseServer
249+
s.serverFrontendClient.EXPECT().DescribeDomain(gomock.Any(), gomock.Any()).Return(resp, nil)
250+
251+
oldStdout := os.Stdout
252+
r, w, _ := os.Pipe()
253+
os.Stdout = w
254+
255+
defer func() {
256+
os.Stdout = oldStdout
257+
}()
258+
259+
defer s.mockStdinInput("No")()
260+
err := s.app.Run([]string{"", "--do", domainName, "domain", "delete", "--st", "test-token"})
261+
s.Nil(err)
262+
263+
w.Close()
264+
var stdoutBuf bytes.Buffer
265+
io.Copy(&stdoutBuf, r)
266+
267+
s.Contains(stdoutBuf.String(), "Domain deletion cancelled")
268+
}
269+
203270
func (s *cliAppSuite) TestDomainDeprecate() {
204271
s.serverFrontendClient.EXPECT().StartWorkflowExecution(gomock.Any(), gomock.Any()).Return(&types.StartWorkflowExecutionResponse{
205272
RunID: "run-id-example",

tools/cli/domain.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,21 @@ func newDomainCommands() []*cli.Command {
8787
})
8888
},
8989
},
90+
{
91+
Name: "delete",
92+
Aliases: []string{"del"},
93+
Usage: "Delete existing workflow domain",
94+
Flags: deleteDomainFlags,
95+
Action: func(c *cli.Context) error {
96+
err := checkNoAdditionalArgsPassed(c)
97+
if err != nil {
98+
return err
99+
}
100+
return withDomainClient(c, false, func(dc *domainCLIImpl) error {
101+
return dc.DeleteDomain(c)
102+
})
103+
},
104+
},
90105
{
91106
Name: "deprecate",
92107
Aliases: []string{"dep"},

tools/cli/domain_commands.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
package cli
2222

2323
import (
24+
"bufio"
2425
"context"
2526
"encoding/json"
2627
"errors"
2728
"fmt"
29+
"os"
2830
"strconv"
2931
"strings"
3032
"time"
@@ -304,6 +306,70 @@ func (d *domainCLIImpl) UpdateDomain(c *cli.Context) error {
304306
return nil
305307
}
306308

309+
func (d *domainCLIImpl) DeleteDomain(c *cli.Context) error {
310+
domainName, err := getRequiredOption(c, FlagDomain)
311+
if err != nil {
312+
return commoncli.Problem("Required flag not found: ", err)
313+
}
314+
securityToken, err := getRequiredOption(c, FlagSecurityToken)
315+
if err != nil {
316+
return commoncli.Problem("Required flag not provided: ", err)
317+
}
318+
319+
ctx, cancel, err := newContext(c)
320+
defer cancel()
321+
if err != nil {
322+
return commoncli.Problem("Error in creating context: ", err)
323+
}
324+
325+
// First describe the domain to show its details
326+
describeRequest := &types.DescribeDomainRequest{
327+
Name: &domainName,
328+
}
329+
resp, err := d.describeDomain(ctx, describeRequest)
330+
if err != nil {
331+
if _, ok := err.(*types.EntityNotExistsError); !ok {
332+
return commoncli.Problem("Operation DescribeDomain failed.", err)
333+
}
334+
return commoncli.Problem(fmt.Sprintf("Domain %s does not exist.", domainName), err)
335+
}
336+
337+
if err := Render(c, newDomainRow(resp), RenderOptions{
338+
DefaultTemplate: templateDomain,
339+
Color: true,
340+
Border: true,
341+
PrintDateTime: true,
342+
}); err != nil {
343+
return fmt.Errorf("failed to render domain details: %w", err)
344+
}
345+
346+
fmt.Print("Do you want to delete this domain? \n")
347+
reader := bufio.NewReader(os.Stdin)
348+
for {
349+
fmt.Print("Please confirm[Yes/No]:")
350+
text, err := reader.ReadString('\n')
351+
if err != nil {
352+
return commoncli.Problem("Failed to get confirmation for domain deletion", err)
353+
}
354+
if strings.EqualFold(strings.TrimSpace(text), "yes") {
355+
break
356+
} else {
357+
fmt.Println("Domain deletion cancelled")
358+
return nil
359+
}
360+
}
361+
362+
err = d.deleteDomain(ctx, &types.DeleteDomainRequest{
363+
Name: domainName,
364+
SecurityToken: securityToken,
365+
})
366+
if err != nil {
367+
return commoncli.Problem("Operation Delete domain failed.", err)
368+
}
369+
fmt.Printf("Domain %s successfully deleted.\n", domainName)
370+
return nil
371+
}
372+
307373
func (d *domainCLIImpl) DeprecateDomain(c *cli.Context) error {
308374
domainName, err := getRequiredOption(c, FlagDomain)
309375
if err != nil {
@@ -753,6 +819,18 @@ func (d *domainCLIImpl) updateDomain(
753819
return d.domainHandler.UpdateDomain(ctx, request)
754820
}
755821

822+
func (d *domainCLIImpl) deleteDomain(
823+
ctx context.Context,
824+
request *types.DeleteDomainRequest,
825+
) error {
826+
827+
if d.frontendClient != nil {
828+
return d.frontendClient.DeleteDomain(ctx, request)
829+
}
830+
831+
return d.domainHandler.DeleteDomain(ctx, request)
832+
}
833+
756834
func (d *domainCLIImpl) describeDomain(
757835
ctx context.Context,
758836
request *types.DescribeDomainRequest,

tools/cli/domain_utils.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,14 @@ var (
197197
},
198198
}
199199

200+
deleteDomainFlags = []cli.Flag{
201+
&cli.StringFlag{
202+
Name: FlagSecurityToken,
203+
Aliases: []string{"st"},
204+
Usage: "Optional token for security check",
205+
},
206+
}
207+
200208
deprecateDomainFlags = []cli.Flag{
201209
&cli.StringFlag{
202210
Name: FlagSecurityToken,
@@ -258,6 +266,11 @@ var (
258266
adminDomainCommonFlags...,
259267
)
260268

269+
adminDeleteDomainFlags = append(
270+
deleteDomainFlags,
271+
adminDomainCommonFlags...,
272+
)
273+
261274
adminDeprecateDomainFlags = append(
262275
deprecateDomainFlags,
263276
adminDomainCommonFlags...,

0 commit comments

Comments
 (0)