diff --git a/cluster/gce/util.sh b/cluster/gce/util.sh index 3a51cc9c2fc..ddf4b5151b7 100755 --- a/cluster/gce/util.sh +++ b/cluster/gce/util.sh @@ -571,7 +571,7 @@ function kube-up { local kubectl="${KUBE_ROOT}/cluster/kubectl.sh" local context="${PROJECT}_${INSTANCE_PREFIX}" - local user="${INSTANCE_PREFIX}-admin" + local user="${context}-admin" local config_dir="${HOME}/.kube/${context}" # TODO: generate ADMIN (and KUBELET) tokens and put those in the master's diff --git a/docs/kubectl.md b/docs/kubectl.md index aed7f84b542..ad5a919ae37 100644 --- a/docs/kubectl.md +++ b/docs/kubectl.md @@ -416,7 +416,7 @@ Additional help topics: kubectl rollingupdate Perform a rolling update of the given ReplicationController. kubectl resize Set a new size for a Replication Controller. kubectl run-container Run a particular image on the cluster. - kubectl stop Gracefully shut down a resource. + kubectl stop Gracefully shut down a resource by id or filename. kubectl expose Take a replicated application and expose it as Kubernetes Service kubectl label Update the labels on a resource @@ -986,7 +986,7 @@ Global Flags: ``` #### stop -Gracefully shut down a resource. +Gracefully shut down a resource by id or filename. Attempts to shut down and delete a resource that supports graceful termination. If the resource is resizable it will be resized to 0 before deletion. @@ -996,10 +996,18 @@ Examples: // Shut down foo. $ kubectl stop replicationcontroller foo + // Shut down the service defined in service.json + $ kubectl stop -f service.json + + // Shut down all resources in the path/to/resources directory + $ kubectl stop -f path/to/resources + Usage: ``` - kubectl stop [flags] + kubectl stop ( |-f filename) [flags] +Flags: + -f, --filename=[]: Filename, directory, or URL to file of resource(s) to be stopped Global Flags: --alsologtostderr=false: log to standard error as well as files diff --git a/hack/e2e-suite/guestbook.sh b/hack/e2e-suite/guestbook.sh index 274194fc373..b784c39b90e 100755 --- a/hack/e2e-suite/guestbook.sh +++ b/hack/e2e-suite/guestbook.sh @@ -37,8 +37,9 @@ prepare-e2e GUESTBOOK="${KUBE_ROOT}/examples/guestbook" +echo "WARNING: this test is a no op that only attempts to launch guestbook resources." # Launch the guestbook example -${KUBECTL} create -f "${GUESTBOOK}" +${KUBECTL} create -f "${GUESTBOOK}" sleep 15 @@ -48,9 +49,7 @@ echo "Pods running: ${POD_LIST_1}" # TODO make this an actual test. Open up a firewall and use curl to post and # read a message via the frontend -${KUBECTL} stop rc redis-slave-controller -${KUBECTL} delete services redis-master -${KUBECTL} delete pods redis-master +${KUBECTL} stop -f "${GUESTBOOK}" POD_LIST_2=$(${KUBECTL} get pods -o template '--template={{range.items}}{{.id}} {{end}}') echo "Pods running after shutdown: ${POD_LIST_2}" diff --git a/hack/e2e-suite/services.sh b/hack/e2e-suite/services.sh index 4e8c5162fe7..375be36dc14 100755 --- a/hack/e2e-suite/services.sh +++ b/hack/e2e-suite/services.sh @@ -59,7 +59,6 @@ function join() { svcs_to_clean=() function do_teardown() { local svc - return for svc in "${svcs_to_clean[@]:+${svcs_to_clean[@]}}"; do stop_service "${svc}" done @@ -284,7 +283,7 @@ function verify_from_container() { fi } -trap "do_teardown" EXIT +trap do_teardown EXIT # Get node IP addresses and pick one as our test point. detect-minions diff --git a/pkg/kubectl/cmd/stop.go b/pkg/kubectl/cmd/stop.go index 7515aa839e9..ef3f78f2067 100644 --- a/pkg/kubectl/cmd/stop.go +++ b/pkg/kubectl/cmd/stop.go @@ -20,15 +20,19 @@ import ( "fmt" "io" - "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util" + "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource" + "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/spf13/cobra" ) func (f *Factory) NewCmdStop(out io.Writer) *cobra.Command { + flags := &struct { + Filenames util.StringList + }{} cmd := &cobra.Command{ - Use: "stop ", - Short: "Gracefully shut down a resource.", - Long: `Gracefully shut down a resource. + Use: "stop ( |-f filename)", + Short: "Gracefully shut down a resource by id or filename.", + Long: `Gracefully shut down a resource by id or filename. Attempts to shut down and delete a resource that supports graceful termination. If the resource is resizable it will be resized to 0 before deletion. @@ -36,22 +40,38 @@ If the resource is resizable it will be resized to 0 before deletion. Examples: // Shut down foo. - $ kubectl stop replicationcontroller foo`, + $ kubectl stop replicationcontroller foo + + // Shut down the service defined in service.json + $ kubectl stop -f service.json + + // Shut down all resources in the path/to/resources directory + $ kubectl stop -f path/to/resources`, Run: func(cmd *cobra.Command, args []string) { - if len(args) != 2 { - usageError(cmd, " ") - } cmdNamespace, err := f.DefaultNamespace(cmd) - mapper, _ := f.Object(cmd) - mapping, namespace, name := util.ResourceFromArgs(cmd, args, mapper, cmdNamespace) - - reaper, err := f.Reaper(cmd, mapping) checkErr(err) + mapper, typer := f.Object(cmd) + r := resource.NewBuilder(mapper, typer, f.ClientMapperForCommand(cmd)). + ContinueOnError(). + NamespaceParam(cmdNamespace).RequireNamespace(). + ResourceTypeOrNameArgs(false, args...). + FilenameParam(flags.Filenames...). + Flatten(). + Do() + checkErr(r.Err()) - s, err := reaper.Stop(namespace, name) - checkErr(err) - fmt.Fprintf(out, "%s\n", s) + r.Visit(func(info *resource.Info) error { + reaper, err := f.Reaper(cmd, info.Mapping) + checkErr(err) + s, err := reaper.Stop(info.Namespace, info.Name) + if err != nil { + return err + } + fmt.Fprintf(out, "%s\n", s) + return nil + }) }, } + cmd.Flags().VarP(&flags.Filenames, "filename", "f", "Filename, directory, or URL to file of resource(s) to be stopped") return cmd }