From 24a0a6b6bb05afa0790c361f60521c56d9472bb9 Mon Sep 17 00:00:00 2001 From: Drew Erny Date: Thu, 6 Apr 2017 11:55:54 -0700 Subject: [PATCH] Remove experimental from service logs Service logs API is now stable. Service logs now support all features, except retrieving details provided to the log driver. Signed-off-by: Drew Erny Upstream-commit: 306cfecc8c146ea8addb44dd35296808b25916a2 Component: engine --- .../engine/api/server/router/swarm/cluster.go | 4 ++-- components/engine/api/swagger.yaml | 10 +++++----- components/engine/cli/command/service/logs.go | 10 +++++++--- .../docs/reference/commandline/service_logs.md | 18 ++++++++++++------ components/engine/experimental/README.md | 1 - ...test.go => docker_cli_service_logs_test.go} | 11 ----------- 6 files changed, 26 insertions(+), 28 deletions(-) rename components/engine/integration-cli/{docker_cli_service_logs_experimental_test.go => docker_cli_service_logs_test.go} (97%) diff --git a/components/engine/api/server/router/swarm/cluster.go b/components/engine/api/server/router/swarm/cluster.go index 6f21cf1ee4..cda2eb7bdb 100644 --- a/components/engine/api/server/router/swarm/cluster.go +++ b/components/engine/api/server/router/swarm/cluster.go @@ -36,14 +36,14 @@ func (sr *swarmRouter) initRoutes() { router.NewPostRoute("/services/create", sr.createService), router.NewPostRoute("/services/{id}/update", sr.updateService), router.NewDeleteRoute("/services/{id}", sr.removeService), - router.Experimental(router.Cancellable(router.NewGetRoute("/services/{id}/logs", sr.getServiceLogs))), + router.Cancellable(router.NewGetRoute("/services/{id}/logs", sr.getServiceLogs)), router.NewGetRoute("/nodes", sr.getNodes), router.NewGetRoute("/nodes/{id}", sr.getNode), router.NewDeleteRoute("/nodes/{id}", sr.removeNode), router.NewPostRoute("/nodes/{id}/update", sr.updateNode), router.NewGetRoute("/tasks", sr.getTasks), router.NewGetRoute("/tasks/{id}", sr.getTask), - router.Experimental(router.Cancellable(router.NewGetRoute("/tasks/{id}/logs", sr.getTaskLogs))), + router.Cancellable(router.NewGetRoute("/tasks/{id}/logs", sr.getTaskLogs)), router.NewGetRoute("/secrets", sr.getSecrets), router.NewPostRoute("/secrets/create", sr.createSecret), router.NewDeleteRoute("/secrets/{id}", sr.removeSecret), diff --git a/components/engine/api/swagger.yaml b/components/engine/api/swagger.yaml index 2154e0cff3..f6e6fc628f 100644 --- a/components/engine/api/swagger.yaml +++ b/components/engine/api/swagger.yaml @@ -7729,12 +7729,12 @@ paths: schema: type: "string" 404: - description: "no such container" + description: "no such service" schema: $ref: "#/definitions/ErrorResponse" examples: application/json: - message: "No such container: c2ada9df5af8" + message: "No such service: c2ada9df5af8" 500: description: "server error" schema: @@ -7747,11 +7747,11 @@ paths: - name: "id" in: "path" required: true - description: "ID or name of the container" + description: "ID or name of the service" type: "string" - name: "details" in: "query" - description: "Show extra details provided to logs." + description: "Show service context and extra details provided to logs." type: "boolean" default: false - name: "follow" @@ -8008,7 +8008,7 @@ paths: type: "string" - name: "details" in: "query" - description: "Show extra details provided to logs." + description: "Show task context and extra details provided to logs." type: "boolean" default: false - name: "follow" diff --git a/components/engine/cli/command/service/logs.go b/components/engine/cli/command/service/logs.go index cfcb7ed105..30ed504cfa 100644 --- a/components/engine/cli/command/service/logs.go +++ b/components/engine/cli/command/service/logs.go @@ -42,20 +42,22 @@ func newLogsCommand(dockerCli *command.DockerCli) *cobra.Command { var opts logsOptions cmd := &cobra.Command{ - Use: "logs [OPTIONS] SERVICE", - Short: "Fetch the logs of a service", + Use: "logs [OPTIONS] SERVICE|TASK", + Short: "Fetch the logs of a service or task", Args: cli.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { opts.target = args[0] return runLogs(dockerCli, &opts) }, - Tags: map[string]string{"experimental": ""}, + Tags: map[string]string{"version": "1.29"}, } flags := cmd.Flags() + // options specific to service logs flags.BoolVar(&opts.noResolve, "no-resolve", false, "Do not map IDs to Names in output") flags.BoolVar(&opts.noTrunc, "no-trunc", false, "Do not truncate output") flags.BoolVar(&opts.noTaskIDs, "no-task-ids", false, "Do not include task IDs in output") + // options identical to container logs flags.BoolVarP(&opts.follow, "follow", "f", false, "Follow log output") flags.StringVar(&opts.since, "since", "", "Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)") flags.BoolVarP(&opts.timestamps, "timestamps", "t", false, "Show timestamps") @@ -94,6 +96,8 @@ func runLogs(dockerCli *command.DockerCli, opts *logsOptions) error { tty = task.Spec.ContainerSpec.TTY // TODO(dperny) hot fix until we get a nice details system squared away, // ignores details (including task context) if we have a TTY log + // if we don't do this, we'll vomit the huge context verbatim into the + // TTY log lines and that's Undesirable. if tty { options.Details = false } diff --git a/components/engine/docs/reference/commandline/service_logs.md b/components/engine/docs/reference/commandline/service_logs.md index 844a58e0cf..fd328d0f6d 100644 --- a/components/engine/docs/reference/commandline/service_logs.md +++ b/components/engine/docs/reference/commandline/service_logs.md @@ -1,8 +1,7 @@ --- -title: "service logs (experimental)" +title: "service logs" description: "The service logs command description and usage" -keywords: "service, logs" -advisory: "experimental" +keywords: "service, task, logs" ---