github.com/Azure/draft-classic@v0.16.0/cmd/draft/delete.go (about)

     1  package main
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/spf13/cobra"
     9  	"golang.org/x/net/context"
    10  	"google.golang.org/grpc"
    11  	"k8s.io/helm/pkg/helm"
    12  
    13  	"github.com/Azure/draft/pkg/local"
    14  	"github.com/Azure/draft/pkg/storage/kube/configmap"
    15  	"github.com/Azure/draft/pkg/tasks"
    16  )
    17  
    18  const deleteDesc = `This command deletes an application from your Kubernetes environment.`
    19  
    20  type deleteCmd struct {
    21  	appName string
    22  	out     io.Writer
    23  }
    24  
    25  func newDeleteCmd(out io.Writer) *cobra.Command {
    26  	var runningEnvironment string
    27  
    28  	dc := &deleteCmd{
    29  		out: out,
    30  	}
    31  
    32  	cmd := &cobra.Command{
    33  		Use:   "delete [app]",
    34  		Short: "delete an application",
    35  		Long:  deleteDesc,
    36  		RunE: func(cmd *cobra.Command, args []string) error {
    37  			if len(args) > 0 {
    38  				dc.appName = args[0]
    39  			}
    40  			return dc.run(runningEnvironment)
    41  		},
    42  	}
    43  
    44  	f := cmd.Flags()
    45  	f.StringVarP(&runningEnvironment, environmentFlagName, environmentFlagShorthand, defaultDraftEnvironment(), environmentFlagUsage)
    46  
    47  	return cmd
    48  }
    49  
    50  func (d *deleteCmd) run(runningEnvironment string) error {
    51  
    52  	var name string
    53  
    54  	if d.appName != "" {
    55  		name = d.appName
    56  	} else {
    57  		deployedApp, err := local.DeployedApplication(draftToml, runningEnvironment)
    58  		if err != nil {
    59  			return errors.New("Unable to detect app name\nPlease pass in the name of the application")
    60  
    61  		}
    62  
    63  		name = deployedApp.Name
    64  	}
    65  
    66  	//TODO: replace with serverside call
    67  	if err := Delete(name); err != nil {
    68  		return err
    69  	}
    70  
    71  	msg := "app '" + name + "' deleted"
    72  	fmt.Fprintln(d.out, msg)
    73  	return nil
    74  }
    75  
    76  // Delete uses the helm client to delete an app with the given name
    77  //
    78  // Returns an error if the command failed.
    79  func Delete(app string) error {
    80  	// set up helm client
    81  	client, config, err := getKubeClient(kubeContext)
    82  	if err != nil {
    83  		return fmt.Errorf("Could not get a kube client: %s", err)
    84  	}
    85  
    86  	// delete Draft storage for app
    87  	store := configmap.NewConfigMaps(client.CoreV1().ConfigMaps(tillerNamespace))
    88  	if _, err := store.DeleteBuilds(context.Background(), app); err != nil {
    89  		return err
    90  	}
    91  
    92  	helmClient, err := setupHelm(client, config, tillerNamespace)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	// delete helm release
    98  	_, err = helmClient.DeleteRelease(app, helm.DeletePurge(true))
    99  	if err != nil {
   100  		return errors.New(grpc.ErrorDesc(err))
   101  	}
   102  
   103  	taskList, err := tasks.Load(tasksTOMLFile)
   104  	if err != nil {
   105  		if err == tasks.ErrNoTaskFile {
   106  			debug(err.Error())
   107  		} else {
   108  			return err
   109  		}
   110  	} else {
   111  		if _, err = taskList.Run(tasks.DefaultRunner, tasks.PostDelete, ""); err != nil {
   112  			return err
   113  		}
   114  	}
   115  
   116  	return nil
   117  }