github.com/fastly/cli@v1.7.2-0.20240304164155-9d0f1d77c3bf/pkg/commands/service/delete.go (about)

     1  package service
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/fastly/go-fastly/v9/fastly"
     8  
     9  	"github.com/fastly/cli/pkg/argparser"
    10  	"github.com/fastly/cli/pkg/errors"
    11  	"github.com/fastly/cli/pkg/global"
    12  	"github.com/fastly/cli/pkg/manifest"
    13  	"github.com/fastly/cli/pkg/text"
    14  )
    15  
    16  // DeleteCommand calls the Fastly API to delete services.
    17  type DeleteCommand struct {
    18  	argparser.Base
    19  	Input       fastly.DeleteServiceInput
    20  	force       bool
    21  	serviceName argparser.OptionalServiceNameID
    22  }
    23  
    24  // NewDeleteCommand returns a usable command registered under the parent.
    25  func NewDeleteCommand(parent argparser.Registerer, g *global.Data) *DeleteCommand {
    26  	c := DeleteCommand{
    27  		Base: argparser.Base{
    28  			Globals: g,
    29  		},
    30  	}
    31  	c.CmdClause = parent.Command("delete", "Delete a Fastly service").Alias("remove")
    32  
    33  	// Optional.
    34  	c.CmdClause.Flag("force", "Force deletion of an active service").Short('f').BoolVar(&c.force)
    35  	c.RegisterFlag(argparser.StringFlagOpts{
    36  		Name:        argparser.FlagServiceIDName,
    37  		Description: argparser.FlagServiceIDDesc,
    38  		Dst:         &g.Manifest.Flag.ServiceID,
    39  		Short:       's',
    40  	})
    41  	c.RegisterFlag(argparser.StringFlagOpts{
    42  		Action:      c.serviceName.Set,
    43  		Name:        argparser.FlagServiceName,
    44  		Description: argparser.FlagServiceDesc,
    45  		Dst:         &c.serviceName.Value,
    46  	})
    47  	return &c
    48  }
    49  
    50  // Exec invokes the application logic for the command.
    51  func (c *DeleteCommand) Exec(_ io.Reader, out io.Writer) error {
    52  	serviceID, source, flag, err := argparser.ServiceID(c.serviceName, *c.Globals.Manifest, c.Globals.APIClient, c.Globals.ErrLog)
    53  	if err != nil {
    54  		return err
    55  	}
    56  	if c.Globals.Verbose() {
    57  		argparser.DisplayServiceID(serviceID, flag, source, out)
    58  	}
    59  
    60  	c.Input.ServiceID = serviceID
    61  
    62  	if c.force {
    63  		s, err := c.Globals.APIClient.GetServiceDetails(&fastly.GetServiceInput{
    64  			ServiceID: serviceID,
    65  		})
    66  		if err != nil {
    67  			c.Globals.ErrLog.AddWithContext(err, map[string]any{
    68  				"Service ID": serviceID,
    69  			})
    70  			return err
    71  		}
    72  
    73  		if s.ActiveVersion != nil && fastly.ToValue(s.ActiveVersion.Number) != 0 {
    74  			_, err := c.Globals.APIClient.DeactivateVersion(&fastly.DeactivateVersionInput{
    75  				ServiceID:      serviceID,
    76  				ServiceVersion: fastly.ToValue(s.ActiveVersion.Number),
    77  			})
    78  			if err != nil {
    79  				c.Globals.ErrLog.AddWithContext(err, map[string]any{
    80  					"Service ID":      serviceID,
    81  					"Service Version": fastly.ToValue(s.ActiveVersion.Number),
    82  				})
    83  				return err
    84  			}
    85  		}
    86  	}
    87  
    88  	if err := c.Globals.APIClient.DeleteService(&c.Input); err != nil {
    89  		c.Globals.ErrLog.AddWithContext(err, map[string]any{
    90  			"Service ID": serviceID,
    91  		})
    92  		return errors.RemediationError{
    93  			Inner:       err,
    94  			Remediation: fmt.Sprintf("Try %s\n", text.Bold("fastly service delete --force")),
    95  		}
    96  	}
    97  
    98  	// Ensure that VCL service users are unaffected by checking if the Service ID
    99  	// was acquired via the fastly.toml manifest.
   100  	if source == manifest.SourceFile {
   101  		if err := c.Globals.Manifest.File.Read(manifest.Filename); err != nil {
   102  			c.Globals.ErrLog.Add(err)
   103  			return fmt.Errorf("error reading fastly.toml: %w", err)
   104  		}
   105  		c.Globals.Manifest.File.ServiceID = ""
   106  		if err := c.Globals.Manifest.File.Write(manifest.Filename); err != nil {
   107  			c.Globals.ErrLog.Add(err)
   108  			return fmt.Errorf("error updating fastly.toml: %w", err)
   109  		}
   110  	}
   111  
   112  	text.Success(out, "Deleted service ID %s", c.Input.ServiceID)
   113  	return nil
   114  }