func/kubectl/remover.go

61 lines
1.3 KiB
Go

package kubectl
import (
"bytes"
"errors"
"fmt"
"os"
"os/exec"
"github.com/boson-project/faas"
"github.com/boson-project/faas/k8s"
)
// Remover implemented using the kubectl binary.
type Remover struct {
// Verbose logging.
Verbose bool
}
// NewRemover creates an instance of the kubectl-based deployer.
func NewRemover() *Remover {
return &Remover{}
}
// Remove the named service.
// Name is expected
func (d *Remover) Remove(name string) (err error) {
// assert kubectl
if _, err = exec.LookPath("kubectl"); err != nil {
err = errors.New("please install 'kubectl'")
return
}
// Convert the project name proper (a valid domain) to how it is being
// represented: as a kubernetes and docker valid name (RFC1035 label)
serviceName, err := k8s.ToSubdomain(name)
if err != nil {
return
}
// Command to run
cmd := exec.Command("kubectl", "delete", "kservice", serviceName, "--namespace", faas.DefaultNamespace)
// If verbose logging is enabled, echo appsody's chatty stdout.
if d.Verbose {
fmt.Println(cmd)
cmd.Stdout = os.Stdout
}
// Capture stderr for echoing on failure.
var stderr bytes.Buffer
cmd.Stderr = &stderr
// Run the command, echoing captured stderr as well as the cmd internal error.
err = cmd.Run()
if err != nil {
err = fmt.Errorf("%v. %v", stderr.String(), err.Error())
}
return
}