diff --git a/.circleci/config.yml b/.circleci/config.yml index 6510b1961..63bc14e6f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -61,8 +61,6 @@ workflows: test_packages: "./client/fingerprint" goarch: "386" <<: *IGNORE_FOR_UI_BRANCHES - - test-rkt: - <<: *IGNORE_FOR_UI_BRANCHES - test-e2e: <<: *IGNORE_FOR_UI_BRANCHES - test-ui @@ -178,32 +176,6 @@ jobs: - checkout - run: make test-website - test-rkt: - executor: go-machine-recent - environment: - <<: *COMMON_ENVS - GOTEST_PKGS: "./drivers/rkt" - GOPATH: /home/circleci/go - RKT_VERSION: 1.29.0 - steps: - - checkout - - install-golang - - install-protoc - - run: - name: install rkt - command: | - gpg --recv-key 18AD5014C99EF7E3BA5F6CE950BDD3E0FC8A365E - wget https://github.com/rkt/rkt/releases/download/v$RKT_VERSION/rkt_$RKT_VERSION-1_amd64.deb - wget https://github.com/rkt/rkt/releases/download/v$RKT_VERSION/rkt_$RKT_VERSION-1_amd64.deb.asc - gpg --verify rkt_$RKT_VERSION-1_amd64.deb.asc - sudo dpkg -i rkt_$RKT_VERSION-1_amd64.deb - - run: PATH="$GOPATH/bin:/usr/local/go/bin:$PATH" make bootstrap - - run-tests - - store_test_results: - path: /tmp/test-reports - - store_artifacts: - path: /tmp/test-reports - test-machine: executor: "<< parameters.executor >>" parameters: @@ -326,7 +298,7 @@ commands: parameters: version: type: string - default: 1.0.0 + default: 1.2.3 steps: - run: name: Install Vault << parameters.version >> diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 407a32c3b..1d4b00868 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,3 +1,5 @@ +For reporting security vulnerabilities [please refer to the website.](https://www.nomadproject.io/security.html) + If you have a question, prepend your issue with `[question]` or preferably use the [nomad mailing list](https://www.nomadproject.io/community.html). If filing a bug please include the following: diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 000000000..cb9e95a7e --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,3 @@ +# Security Policy + +Please see https://www.nomadproject.io/security.html diff --git a/.gitignore b/.gitignore index 25e622ddf..8efd757c2 100644 --- a/.gitignore +++ b/.gitignore @@ -86,6 +86,8 @@ rkt-* /ui/libpeerconnection.log /ui/npm-debug.log* /ui/testem.log +/ui/.env* +/ui/.pnp* .ignore # ember-try diff --git a/CHANGELOG.md b/CHANGELOG.md index 99a5320fc..6c7a2c8f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ## 0.10.2 (Unreleased) +IMPROVEMENTS: + * client: Enable setting tags on Consul Connect sidecar service + +BUG FIXES: + + * cli: Make scoring column orders consistent `nomad alloc status` [[GH-6609](https://github.com/hashicorp/nomad/issues/6609)] + ## 0.10.1 (November 4, 2019) BUG FIXES: @@ -46,6 +53,8 @@ BUG FIXES: * client: Fixed failure to start if another client is already running with the same data directory [[GH-6348](https://github.com/hashicorp/nomad/pull/6348)] * devices: Fixed a bug causing CPU usage spike when a device is detected [[GH-6201](https://github.com/hashicorp/nomad/issues/6201)] * drivers/docker: Set gc image_delay default to 3 minutes [[GH-6078](https://github.com/hashicorp/nomad/pull/6078)] + * ui: Fixed a bug where the allocation log viewer would render HTML or hide content that matched XML syntax [[GH-6048](https://github.com/hashicorp/nomad/issues/6048)] + * ui: Fixed a bug where allocation log viewer doesn't show all content in Firefox [[GH-6466](https://github.com/hashicorp/nomad/issues/6466)] * ui: Fixed navigation via clicking recent allocation row [[GH-6087](https://github.com/hashicorp/nomad/pull/6087)] * ui: Fixed a bug where the allocation log viewer would render HTML or hide content that matched XML syntax [[GH-6048](https://github.com/hashicorp/nomad/issues/6048)] * ui: Fixed a bug where allocation log viewer doesn't show all content in Firefox [[GH-6466](https://github.com/hashicorp/nomad/issues/6466)] diff --git a/GNUmakefile b/GNUmakefile index 84e7cff97..849f7c138 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -6,7 +6,7 @@ GIT_COMMIT := $(shell git rev-parse HEAD) GIT_DIRTY := $(if $(shell git status --porcelain),+CHANGES) GO_LDFLAGS := "-X github.com/hashicorp/nomad/version.GitCommit=$(GIT_COMMIT)$(GIT_DIRTY)" -GO_TAGS ?= +GO_TAGS ?= codegen_generated GO_TEST_CMD = $(if $(shell which gotestsum),gotestsum --,go test) @@ -147,6 +147,7 @@ deps: ## Install build and development dependencies go get -u github.com/a8m/tree/cmd/tree go get -u github.com/magiconair/vendorfmt/cmd/vendorfmt go get -u gotest.tools/gotestsum + go get -u github.com/fatih/hclfmt @bash -C "$(PROJECT_ROOT)/scripts/install-codecgen.sh" @bash -C "$(PROJECT_ROOT)/scripts/install-protoc-gen-go.sh" @@ -224,21 +225,30 @@ generate-examples: command/job_init.bindata_assetfs.go command/job_init.bindata_assetfs.go: command/assets/* go-bindata-assetfs -pkg command -o command/job_init.bindata_assetfs.go ./command/assets/... +.PHONY: vendorfmt vendorfmt: @echo "--> Formatting vendor/vendor.json" test -x $(GOPATH)/bin/vendorfmt || go get -u github.com/magiconair/vendorfmt/cmd/vendorfmt vendorfmt + +.PHONY: changelogfmt changelogfmt: @echo "--> Making [GH-xxxx] references clickable..." @sed -E 's|([^\[])\[GH-([0-9]+)\]|\1[[GH-\2](https://github.com/hashicorp/nomad/issues/\2)]|g' CHANGELOG.md > changelog.tmp && mv changelog.tmp CHANGELOG.md +## We skip the terraform directory as there are templated hcl configurations +## that do not successfully compile without rendering +.PHONY: hclfmt +hclfmt: + @echo "--> Formatting HCL" + @find . -path ./terraform -prune -o -name 'upstart.nomad' -prune -o \( -name '*.nomad' -o -name '*.hcl' \) -exec hclfmt -w {} + .PHONY: dev dev: GOOS=$(shell go env GOOS) dev: GOARCH=$(shell go env GOARCH) dev: GOPATH=$(shell go env GOPATH) dev: DEV_TARGET=pkg/$(GOOS)_$(GOARCH)/nomad -dev: vendorfmt changelogfmt ## Build for the current development platform +dev: vendorfmt changelogfmt hclfmt ## Build for the current development platform @echo "==> Removing old development build..." @rm -f $(PROJECT_ROOT)/$(DEV_TARGET) @rm -f $(PROJECT_ROOT)/bin/nomad @@ -252,11 +262,11 @@ dev: vendorfmt changelogfmt ## Build for the current development platform @cp $(PROJECT_ROOT)/$(DEV_TARGET) $(GOPATH)/bin .PHONY: prerelease -prerelease: GO_TAGS=ui release +prerelease: GO_TAGS=ui codegen_generated release prerelease: generate-all ember-dist static-assets ## Generate all the static assets for a Nomad release .PHONY: release -release: GO_TAGS=ui release +release: GO_TAGS=ui codegen_generated release release: clean $(foreach t,$(ALL_TARGETS),pkg/$(t).zip) ## Build all release packages which can be built on this platform. @echo "==> Results:" @tree --dirsfirst $(PROJECT_ROOT)/pkg @@ -283,6 +293,7 @@ test-nomad: dev ## Run Nomad test suites $(if $(ENABLE_RACE),-race) $(if $(VERBOSE),-v) \ -cover \ -timeout=15m \ + -tags "$(GO_TAGS)" \ $(GOTEST_PKGS) $(if $(VERBOSE), >test.log ; echo $$? > exit-code) @if [ $(VERBOSE) ] ; then \ bash -C "$(PROJECT_ROOT)/scripts/test_check.sh" ; \ @@ -295,6 +306,7 @@ e2e-test: dev ## Run the Nomad e2e test suite $(if $(ENABLE_RACE),-race) $(if $(VERBOSE),-v) \ -cover \ -timeout=900s \ + -tags "$(GO_TAGS)" \ github.com/hashicorp/nomad/e2e/vault/ \ -integration diff --git a/README.md b/README.md index 697abef4e..d2b28ff2a 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ Who Uses Nomad * [Nomad at Target: Scaling Microservices Across Public and Private Clouds](https://www.hashicorp.com/resources/nomad-scaling-target-microservices-across-cloud) * [Playing with Nomad from HashiCorp](https://danielparker.me/nomad/hashicorp/schedulers/nomad/) * Trivago - * [Maybe You Don’t Need Kubernetes](https://matthias-endler.de/2019/maybe-you-dont-need-kubernetes/) + * [Maybe You Don’t Need Kubernetes](https://endler.dev/2019/maybe-you-dont-need-kubernetes/) * [Nomad - Our Experiences and Best Practices](https://tech.trivago.com/2019/01/25/nomad-our-experiences-and-best-practices/) * Roblox * [How Roblox runs a platform for 70 million gamers on HashiCorp Nomad](https://portworx.com/architects-corner-roblox-runs-platform-70-million-gamers-hashicorp-nomad/) @@ -123,8 +123,6 @@ Who Uses Nomad * [Tech at N26 - The Bank in the Cloud](https://medium.com/insiden26/tech-at-n26-the-bank-in-the-cloud-e5ff818b528b) * Elsevier * [Eslevier’s Container Framework with Nomad, Terraform, and Consul](https://www.hashicorp.com/resources/elsevier-nomad-container-framework-demo) -* Palantir - * [Enterprise Security at Palantir with the HashiCorp stack](https://www.hashicorp.com/resources/enterprise-security-hashicorp-stack) * Graymeta * [Backend Batch Processing At Scale with Nomad](https://www.hashicorp.com/resources/backend-batch-processing-nomad) * NIH NCBI diff --git a/api/allocations.go b/api/allocations.go index 3a22af78e..05892a77e 100644 --- a/api/allocations.go +++ b/api/allocations.go @@ -210,12 +210,7 @@ func (a *Allocations) Exec(ctx context.Context, func (a *Allocations) execFrames(ctx context.Context, alloc *Allocation, task string, tty bool, command []string, errCh chan<- error, q *QueryOptions) (sendFn func(*ExecStreamingInput) error, output <-chan *ExecStreamingOutput) { - - nodeClient, err := a.client.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) - if err != nil { - errCh <- err - return nil, nil - } + nodeClient, _ := a.client.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) if q == nil { q = &QueryOptions{} @@ -236,15 +231,17 @@ func (a *Allocations) execFrames(ctx context.Context, alloc *Allocation, task st reqPath := fmt.Sprintf("/v1/client/allocation/%s/exec", alloc.ID) - conn, _, err := nodeClient.websocket(reqPath, q) - if err != nil { - // There was an error talking directly to the client. Non-network - // errors are fatal, but network errors can attempt to route via RPC. - if _, ok := err.(net.Error); !ok { + var conn *websocket.Conn + + if nodeClient != nil { + conn, _, err = nodeClient.websocket(reqPath, q) + if _, ok := err.(net.Error); err != nil && !ok { errCh <- err return nil, nil } + } + if conn == nil { conn, _, err = a.client.websocket(reqPath, q) if err != nil { errCh <- err diff --git a/api/fs.go b/api/fs.go index b769236f7..e5340c966 100644 --- a/api/fs.go +++ b/api/fs.go @@ -92,72 +92,24 @@ func (a *AllocFS) Stat(alloc *Allocation, path string, q *QueryOptions) (*AllocF // ReadAt is used to read bytes at a given offset until limit at the given path // in an allocation directory. If limit is <= 0, there is no limit. func (a *AllocFS) ReadAt(alloc *Allocation, path string, offset int64, limit int64, q *QueryOptions) (io.ReadCloser, error) { - nodeClient, err := a.client.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) - if err != nil { - return nil, err - } - - if q == nil { - q = &QueryOptions{} - } - if q.Params == nil { - q.Params = make(map[string]string) - } - - q.Params["path"] = path - q.Params["offset"] = strconv.FormatInt(offset, 10) - q.Params["limit"] = strconv.FormatInt(limit, 10) - reqPath := fmt.Sprintf("/v1/client/fs/readat/%s", alloc.ID) - r, err := nodeClient.rawQuery(reqPath, q) - if err != nil { - // There was a networking error when talking directly to the client. - if _, ok := err.(net.Error); !ok { - return nil, err - } - // Try via the server - r, err = a.client.rawQuery(reqPath, q) - if err != nil { - return nil, err - } - } - - return r, nil + return queryClientNode(a.client, alloc, reqPath, q, + func(q *QueryOptions) { + q.Params["path"] = path + q.Params["offset"] = strconv.FormatInt(offset, 10) + q.Params["limit"] = strconv.FormatInt(limit, 10) + }) } // Cat is used to read contents of a file at the given path in an allocation // directory func (a *AllocFS) Cat(alloc *Allocation, path string, q *QueryOptions) (io.ReadCloser, error) { - nodeClient, err := a.client.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) - if err != nil { - return nil, err - } - - if q == nil { - q = &QueryOptions{} - } - if q.Params == nil { - q.Params = make(map[string]string) - } - - q.Params["path"] = path reqPath := fmt.Sprintf("/v1/client/fs/cat/%s", alloc.ID) - r, err := nodeClient.rawQuery(reqPath, q) - if err != nil { - // There was a networking error when talking directly to the client. - if _, ok := err.(net.Error); !ok { - return nil, err - } - - // Try via the server - r, err = a.client.rawQuery(reqPath, q) - if err != nil { - return nil, err - } - } - - return r, nil + return queryClientNode(a.client, alloc, reqPath, q, + func(q *QueryOptions) { + q.Params["path"] = path + }) } // Stream streams the content of a file blocking on EOF. @@ -172,40 +124,19 @@ func (a *AllocFS) Stream(alloc *Allocation, path, origin string, offset int64, cancel <-chan struct{}, q *QueryOptions) (<-chan *StreamFrame, <-chan error) { errCh := make(chan error, 1) - nodeClient, err := a.client.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) + + reqPath := fmt.Sprintf("/v1/client/fs/stream/%s", alloc.ID) + r, err := queryClientNode(a.client, alloc, reqPath, q, + func(q *QueryOptions) { + q.Params["path"] = path + q.Params["offset"] = strconv.FormatInt(offset, 10) + q.Params["origin"] = origin + }) if err != nil { errCh <- err return nil, errCh } - if q == nil { - q = &QueryOptions{} - } - if q.Params == nil { - q.Params = make(map[string]string) - } - - q.Params["path"] = path - q.Params["offset"] = strconv.FormatInt(offset, 10) - q.Params["origin"] = origin - - reqPath := fmt.Sprintf("/v1/client/fs/stream/%s", alloc.ID) - r, err := nodeClient.rawQuery(reqPath, q) - if err != nil { - // There was a networking error when talking directly to the client. - if _, ok := err.(net.Error); !ok { - errCh <- err - return nil, errCh - } - - // Try via the server - r, err = a.client.rawQuery(reqPath, q) - if err != nil { - errCh <- err - return nil, errCh - } - } - // Create the output channel frames := make(chan *StreamFrame, 10) @@ -244,6 +175,40 @@ func (a *AllocFS) Stream(alloc *Allocation, path, origin string, offset int64, return frames, errCh } +func queryClientNode(c *Client, alloc *Allocation, reqPath string, q *QueryOptions, customizeQ func(*QueryOptions)) (io.ReadCloser, error) { + nodeClient, _ := c.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) + + if q == nil { + q = &QueryOptions{} + } + if q.Params == nil { + q.Params = make(map[string]string) + } + if customizeQ != nil { + customizeQ(q) + } + + var r io.ReadCloser + var err error + + if nodeClient != nil { + r, err = nodeClient.rawQuery(reqPath, q) + if _, ok := err.(net.Error); err != nil && !ok { + // found a non networking error talking to client directly + return nil, err + } + + } + + // failed to query node, access through server directly + // or network error when talking to the client directly + if r == nil { + return c.rawQuery(reqPath, q) + } + + return r, err +} + // Logs streams the content of a tasks logs blocking on EOF. // The parameters are: // * allocation: the allocation to stream from. @@ -264,42 +229,20 @@ func (a *AllocFS) Logs(alloc *Allocation, follow bool, task, logType, origin str errCh := make(chan error, 1) - nodeClient, err := a.client.GetNodeClientWithTimeout(alloc.NodeID, ClientConnTimeout, q) + reqPath := fmt.Sprintf("/v1/client/fs/logs/%s", alloc.ID) + r, err := queryClientNode(a.client, alloc, reqPath, q, + func(q *QueryOptions) { + q.Params["follow"] = strconv.FormatBool(follow) + q.Params["task"] = task + q.Params["type"] = logType + q.Params["origin"] = origin + q.Params["offset"] = strconv.FormatInt(offset, 10) + }) if err != nil { errCh <- err return nil, errCh } - if q == nil { - q = &QueryOptions{} - } - if q.Params == nil { - q.Params = make(map[string]string) - } - - q.Params["follow"] = strconv.FormatBool(follow) - q.Params["task"] = task - q.Params["type"] = logType - q.Params["origin"] = origin - q.Params["offset"] = strconv.FormatInt(offset, 10) - - reqPath := fmt.Sprintf("/v1/client/fs/logs/%s", alloc.ID) - r, err := nodeClient.rawQuery(reqPath, q) - if err != nil { - // There was a networking error when talking directly to the client. - if _, ok := err.(net.Error); !ok { - errCh <- err - return nil, errCh - } - - // Try via the server - r, err = a.client.rawQuery(reqPath, q) - if err != nil { - errCh <- err - return nil, errCh - } - } - // Create the output channel frames := make(chan *StreamFrame, 10) diff --git a/api/services.go b/api/services.go index dbe0fcfe2..8630126ce 100644 --- a/api/services.go +++ b/api/services.go @@ -143,6 +143,7 @@ type ConsulConnect struct { // ConsulSidecarService represents a Consul Connect SidecarService jobspec // stanza. type ConsulSidecarService struct { + Tags []string Port string Proxy *ConsulProxy } diff --git a/api/tasks.go b/api/tasks.go index 9c017887a..578188cc2 100644 --- a/api/tasks.go +++ b/api/tasks.go @@ -370,12 +370,28 @@ type VolumeRequest struct { ReadOnly bool `mapstructure:"read_only"` } +const ( + VolumeMountPropagationPrivate = "private" + VolumeMountPropagationHostToTask = "host-to-task" + VolumeMountPropagationBidirectional = "bidirectional" +) + // VolumeMount represents the relationship between a destination path in a task // and the task group volume that should be mounted there. type VolumeMount struct { - Volume string - Destination string - ReadOnly bool `mapstructure:"read_only"` + Volume *string + Destination *string + ReadOnly *bool `mapstructure:"read_only"` + PropagationMode *string `mapstructure:"propagation_mode"` +} + +func (vm *VolumeMount) Canonicalize() { + if vm.PropagationMode == nil { + vm.PropagationMode = stringToPtr(VolumeMountPropagationPrivate) + } + if vm.ReadOnly == nil { + vm.ReadOnly = boolToPtr(false) + } } // TaskGroup is the unit of scheduling. @@ -632,6 +648,9 @@ func (t *Task) Canonicalize(tg *TaskGroup, job *Job) { for _, a := range t.Affinities { a.Canonicalize() } + for _, vm := range t.VolumeMounts { + vm.Canonicalize() + } } // TaskArtifact is used to download artifacts before running a task. diff --git a/api/tasks_test.go b/api/tasks_test.go index 29d9cf691..f83a91e24 100644 --- a/api/tasks_test.go +++ b/api/tasks_test.go @@ -368,6 +368,14 @@ func TestTask_Artifact(t *testing.T) { } } +func TestTask_VolumeMount(t *testing.T) { + t.Parallel() + vm := &VolumeMount{} + vm.Canonicalize() + require.NotNil(t, vm.PropagationMode) + require.Equal(t, *vm.PropagationMode, "private") +} + // Ensures no regression on https://github.com/hashicorp/nomad/issues/3132 func TestTaskGroup_Canonicalize_Update(t *testing.T) { // Job with an Empty() Update diff --git a/client/allocrunner/interfaces/task_lifecycle.go b/client/allocrunner/interfaces/task_lifecycle.go index 680c0d9c2..ee99a507b 100644 --- a/client/allocrunner/interfaces/task_lifecycle.go +++ b/client/allocrunner/interfaces/task_lifecycle.go @@ -89,7 +89,7 @@ type TaskPrestartHook interface { // Prestart is called before the task is started including after every // restart. Prestart is not called if the allocation is terminal. // - // The context is cancelled if the task is killed. + // The context is cancelled if the task is killed or shutdown. Prestart(context.Context, *TaskPrestartRequest, *TaskPrestartResponse) error } diff --git a/client/allocrunner/taskrunner/task_runner_hooks.go b/client/allocrunner/taskrunner/task_runner_hooks.go index 25d1b59bc..374f29f42 100644 --- a/client/allocrunner/taskrunner/task_runner_hooks.go +++ b/client/allocrunner/taskrunner/task_runner_hooks.go @@ -6,6 +6,7 @@ import ( "sync" "time" + "github.com/LK4D4/joincontext" multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/nomad/client/allocrunner/interfaces" "github.com/hashicorp/nomad/client/allocrunner/taskrunner/state" @@ -192,8 +193,11 @@ func (tr *TaskRunner) prestart() error { } // Run the prestart hook + // use a joint context to allow any blocking pre-start hooks + // to be canceled by either killCtx or shutdownCtx + joinedCtx, _ := joincontext.Join(tr.killCtx, tr.shutdownCtx) var resp interfaces.TaskPrestartResponse - if err := pre.Prestart(tr.killCtx, &req, &resp); err != nil { + if err := pre.Prestart(joinedCtx, &req, &resp); err != nil { tr.emitHookError(err, name) return structs.WrapRecoverable(fmt.Sprintf("prestart hook %q failed: %v", name, err), err) } diff --git a/client/allocrunner/taskrunner/task_runner_test.go b/client/allocrunner/taskrunner/task_runner_test.go index 8a6ab8cf5..25124c3fd 100644 --- a/client/allocrunner/taskrunner/task_runner_test.go +++ b/client/allocrunner/taskrunner/task_runner_test.go @@ -1742,6 +1742,69 @@ func TestTaskRunner_Template_Artifact(t *testing.T) { require.NoErrorf(t, err, "%v not rendered", f2) } +// TestTaskRunner_Template_BlockingPreStart asserts that a template +// that fails to render in PreStart can gracefully be shutdown by +// either killCtx or shutdownCtx +func TestTaskRunner_Template_BlockingPreStart(t *testing.T) { + t.Parallel() + + alloc := mock.BatchAlloc() + task := alloc.Job.TaskGroups[0].Tasks[0] + task.Templates = []*structs.Template{ + { + EmbeddedTmpl: `{{ with secret "foo/secret" }}{{ .Data.certificate }}{{ end }}`, + DestPath: "local/test", + ChangeMode: structs.TemplateChangeModeNoop, + }, + } + + task.Vault = &structs.Vault{Policies: []string{"default"}} + + conf, cleanup := testTaskRunnerConfig(t, alloc, task.Name) + defer cleanup() + + tr, err := NewTaskRunner(conf) + require.NoError(t, err) + go tr.Run() + defer tr.Shutdown() + + testutil.WaitForResult(func() (bool, error) { + ts := tr.TaskState() + + if len(ts.Events) == 0 { + return false, fmt.Errorf("no events yet") + } + + for _, e := range ts.Events { + if e.Type == "Template" && strings.Contains(e.DisplayMessage, "vault.read(foo/secret)") { + return true, nil + } + } + + return false, fmt.Errorf("no missing vault secret template event yet: %#v", ts.Events) + + }, func(err error) { + require.NoError(t, err) + }) + + shutdown := func() <-chan bool { + finished := make(chan bool) + go func() { + tr.Shutdown() + finished <- true + }() + + return finished + } + + select { + case <-shutdown(): + // it shut down like it should have + case <-time.After(10 * time.Second): + require.Fail(t, "timeout shutting down task") + } +} + // TestTaskRunner_Template_NewVaultToken asserts that a new vault token is // created when rendering template and that it is revoked on alloc completion func TestTaskRunner_Template_NewVaultToken(t *testing.T) { diff --git a/client/allocwatcher/alloc_watcher_unix_test.go b/client/allocwatcher/alloc_watcher_unix_test.go index 21f95cdf9..aa75ab8ea 100644 --- a/client/allocwatcher/alloc_watcher_unix_test.go +++ b/client/allocwatcher/alloc_watcher_unix_test.go @@ -76,6 +76,10 @@ func TestPrevAlloc_StreamAllocDir_Ok(t *testing.T) { tw := tar.NewWriter(buf) walkFn := func(path string, fileInfo os.FileInfo, err error) error { + // filepath.Walk passes in an error + if err != nil { + return fmt.Errorf("error from filepath.Walk(): %s", err) + } // Include the path of the file name relative to the alloc dir // so that we can put the files in the right directories link := "" diff --git a/client/structs/structs.go b/client/structs/structs.go index 169cf824c..eff8ceaf3 100644 --- a/client/structs/structs.go +++ b/client/structs/structs.go @@ -1,6 +1,6 @@ package structs -//go:generate codecgen -d 102 -o structs.generated.go structs.go +//go:generate codecgen -d 102 -t codec_generated -o structs.generated.go structs.go import ( "errors" diff --git a/client/vaultclient/vaultclient.go b/client/vaultclient/vaultclient.go index 5e47358d3..df6e0f4a0 100644 --- a/client/vaultclient/vaultclient.go +++ b/client/vaultclient/vaultclient.go @@ -45,14 +45,6 @@ type VaultClient interface { // StopRenewToken removes the token from the min-heap, stopping its // renewal. StopRenewToken(string) error - - // RenewLease renews a vault secret's lease and adds the lease - // identifier to the min-heap for periodic renewal. - RenewLease(string, int) (<-chan error, error) - - // StopRenewLease removes a secret's lease ID from the min-heap, - // stopping its renewal. - StopRenewLease(string) error } // Implementation of VaultClient interface to interact with vault and perform @@ -325,44 +317,6 @@ func (c *vaultClient) RenewToken(token string, increment int) (<-chan error, err return errCh, nil } -// RenewLease renews the supplied lease identifier for a supplied duration (in -// seconds) and adds it to the min-heap so that it gets renewed periodically by -// the renewal loop. Any error returned during renewal will be written to a -// buffered channel and the channel is returned instead of an actual error. -// This helps the caller be notified of a renewal failure asynchronously for -// appropriate actions to be taken. The caller of this function need not have -// to close the error channel. -func (c *vaultClient) RenewLease(leaseId string, increment int) (<-chan error, error) { - if leaseId == "" { - err := fmt.Errorf("missing lease ID") - return nil, err - } - - if increment < 1 { - err := fmt.Errorf("increment cannot be less than 1") - return nil, err - } - - // Create a buffered error channel - errCh := make(chan error, 1) - - // Create a renewal request using the supplied lease and duration - renewalReq := &vaultClientRenewalRequest{ - errCh: errCh, - id: leaseId, - increment: increment, - } - - // Renew the secret and send any error to the dedicated error channel - if err := c.renew(renewalReq); err != nil { - c.logger.Error("error during renewal of lease", "error", err) - metrics.IncrCounter([]string{"client", "vault", "renew_lease_error"}, 1) - return nil, err - } - - return errCh, nil -} - // renew is a common method to handle renewal of both tokens and secret leases. // It invokes a token renewal or a secret's lease renewal. If renewal is // successful, min-heap is updated based on the duration after which it needs @@ -558,12 +512,6 @@ func (c *vaultClient) StopRenewToken(token string) error { return c.stopRenew(token) } -// StopRenewLease removes the item from the heap which represents the given -// lease identifier. -func (c *vaultClient) StopRenewLease(leaseId string) error { - return c.stopRenew(leaseId) -} - // stopRenew removes the given identifier from the heap and signals the renewal // loop to compute the next best candidate for renewal. func (c *vaultClient) stopRenew(id string) error { diff --git a/client/vaultclient/vaultclient_testing.go b/client/vaultclient/vaultclient_testing.go index ed99f4cc4..fea31a31d 100644 --- a/client/vaultclient/vaultclient_testing.go +++ b/client/vaultclient/vaultclient_testing.go @@ -111,10 +111,6 @@ func (vc *MockVaultClient) StopRenewToken(token string) error { return nil } -func (vc *MockVaultClient) RenewLease(leaseId string, interval int) (<-chan error, error) { - return nil, nil -} -func (vc *MockVaultClient) StopRenewLease(leaseId string) error { return nil } func (vc *MockVaultClient) Start() {} func (vc *MockVaultClient) Stop() {} func (vc *MockVaultClient) GetConsulACL(string, string) (*vaultapi.Secret, error) { return nil, nil } diff --git a/command/agent/command.go b/command/agent/command.go index 63accc431..49aa738a1 100644 --- a/command/agent/command.go +++ b/command/agent/command.go @@ -278,14 +278,14 @@ func (c *Command) readConfig() *Config { config.PluginDir = filepath.Join(config.DataDir, "plugins") } - if !c.isValidConfig(config) { + if !c.isValidConfig(config, cmdConfig) { return nil } return config } -func (c *Command) isValidConfig(config *Config) bool { +func (c *Command) isValidConfig(config, cmdConfig *Config) bool { // Check that the server is running in at least one mode. if !(config.Server.Enabled || config.Client.Enabled) { @@ -361,11 +361,12 @@ func (c *Command) isValidConfig(config *Config) bool { } // Check the bootstrap flags - if config.Server.BootstrapExpect > 0 && !config.Server.Enabled { + if !config.Server.Enabled && cmdConfig.Server.BootstrapExpect > 0 { + // report an error if BootstrapExpect is set in CLI but server is disabled c.Ui.Error("Bootstrap requires server mode to be enabled") return false } - if config.Server.BootstrapExpect == 1 { + if config.Server.Enabled && config.Server.BootstrapExpect == 1 { c.Ui.Error("WARNING: Bootstrap mode enabled! Potentially unsafe operation.") } @@ -391,28 +392,58 @@ func (c *Command) setupLoggers(config *Config) (*gatedwriter.Writer, *logWriter, return nil, nil, nil } + // Create a log writer, and wrap a logOutput around it + logWriter := NewLogWriter(512) + writers := []io.Writer{c.logFilter, logWriter} + // Check if syslog is enabled - var syslog io.Writer if config.EnableSyslog { l, err := gsyslog.NewLogger(gsyslog.LOG_NOTICE, config.SyslogFacility, "nomad") if err != nil { c.Ui.Error(fmt.Sprintf("Syslog setup failed: %v", err)) return nil, nil, nil } - syslog = &SyslogWrapper{l, c.logFilter} + writers = append(writers, &SyslogWrapper{l, c.logFilter}) } - // Create a log writer, and wrap a logOutput around it - logWriter := NewLogWriter(512) - var logOutput io.Writer - if syslog != nil { - logOutput = io.MultiWriter(c.logFilter, logWriter, syslog) - } else { - logOutput = io.MultiWriter(c.logFilter, logWriter) + // Check if file logging is enabled + if config.LogFile != "" { + dir, fileName := filepath.Split(config.LogFile) + + // if a path is provided, but has no filename, then a default is used. + if fileName == "" { + fileName = "nomad.log" + } + + // Try to enter the user specified log rotation duration first + var logRotateDuration time.Duration + if config.LogRotateDuration != "" { + duration, err := time.ParseDuration(config.LogRotateDuration) + if err != nil { + c.Ui.Error(fmt.Sprintf("Failed to parse log rotation duration: %v", err)) + return nil, nil, nil + } + logRotateDuration = duration + } else { + // Default to 24 hrs if no rotation period is specified + logRotateDuration = 24 * time.Hour + } + + logFile := &logFile{ + logFilter: c.logFilter, + fileName: fileName, + logPath: dir, + duration: logRotateDuration, + MaxBytes: config.LogRotateBytes, + MaxFiles: config.LogRotateMaxFiles, + } + + writers = append(writers, logFile) } - c.logOutput = logOutput - log.SetOutput(logOutput) - return logGate, logWriter, logOutput + + c.logOutput = io.MultiWriter(writers...) + log.SetOutput(c.logOutput) + return logGate, logWriter, c.logOutput } // setupAgent is used to start the agent and various interfaces diff --git a/command/agent/config.go b/command/agent/config.go index 0767b98f9..39259abb2 100644 --- a/command/agent/config.go +++ b/command/agent/config.go @@ -57,6 +57,18 @@ type Config struct { // LogJson enables log output in a JSON format LogJson bool `hcl:"log_json"` + // LogFile enables logging to a file + LogFile string `hcl:"log_file"` + + // LogRotateDuration is the time period that logs should be rotated in + LogRotateDuration string `hcl:"log_rotate_duration"` + + // LogRotateBytes is the max number of bytes that should be written to a file + LogRotateBytes int `hcl:"log_rotate_bytes"` + + // LogRotateMaxFiles is the max number of log files to keep + LogRotateMaxFiles int `hcl:"log_rotate_max_files"` + // BindAddr is the address on which all of nomad's services will // be bound. If not specified, this defaults to 127.0.0.1. BindAddr string `hcl:"bind_addr"` @@ -898,6 +910,18 @@ func (c *Config) Merge(b *Config) *Config { if b.LogJson { result.LogJson = true } + if b.LogFile != "" { + result.LogFile = b.LogFile + } + if b.LogRotateDuration != "" { + result.LogRotateDuration = b.LogRotateDuration + } + if b.LogRotateBytes != 0 { + result.LogRotateBytes = b.LogRotateBytes + } + if b.LogRotateMaxFiles != 0 { + result.LogRotateMaxFiles = b.LogRotateMaxFiles + } if b.BindAddr != "" { result.BindAddr = b.BindAddr } diff --git a/command/agent/config_parse_test.go b/command/agent/config_parse_test.go index 362bddb92..51368fd5d 100644 --- a/command/agent/config_parse_test.go +++ b/command/agent/config_parse_test.go @@ -19,6 +19,7 @@ var basicConfig = &Config{ NodeName: "my-web", DataDir: "/tmp/nomad", PluginDir: "/tmp/nomad-plugins", + LogFile: "/var/log/nomad.log", LogLevel: "ERR", LogJson: true, BindAddr: "192.168.0.1", @@ -409,14 +410,10 @@ func TestConfig_Parse(t *testing.T) { t.Run(tc.File, func(t *testing.T) { require := require.New(t) path, err := filepath.Abs(filepath.Join("./testdata", tc.File)) - if err != nil { - t.Fatalf("file: %s\n\n%s", tc.File, err) - } + require.NoError(err) actual, err := ParseConfigFile(path) - if (err != nil) != tc.Err { - t.Fatalf("file: %s\n\n%s", tc.File, err) - } + require.NoError(err) // ParseConfig used to re-merge defaults for these three objects, // despite them already being merged in LoadConfig. The test structs diff --git a/command/agent/consul/client.go b/command/agent/consul/client.go index b84e0316c..cfa219d82 100644 --- a/command/agent/consul/client.go +++ b/command/agent/consul/client.go @@ -1480,6 +1480,7 @@ func newConnect(serviceName string, nc *structs.ConsulConnect, networks structs. // Advertise host IP:port cc.SidecarService = &api.AgentServiceRegistration{ + Tags: helper.CopySliceString(nc.SidecarService.Tags), Address: net.IP, Port: port.Value, diff --git a/command/agent/fs_endpoint.go b/command/agent/fs_endpoint.go index f36f3be8e..4a99a2531 100644 --- a/command/agent/fs_endpoint.go +++ b/command/agent/fs_endpoint.go @@ -17,12 +17,12 @@ import ( ) var ( - allocIDNotPresentErr = fmt.Errorf("must provide a valid alloc id") - fileNameNotPresentErr = fmt.Errorf("must provide a file name") - taskNotPresentErr = fmt.Errorf("must provide task name") - logTypeNotPresentErr = fmt.Errorf("must provide log type (stdout/stderr)") - clientNotRunning = fmt.Errorf("node is not running a Nomad Client") - invalidOrigin = fmt.Errorf("origin must be start or end") + allocIDNotPresentErr = CodedError(400, "must provide a valid alloc id") + fileNameNotPresentErr = CodedError(400, "must provide a file name") + taskNotPresentErr = CodedError(400, "must provide task name") + logTypeNotPresentErr = CodedError(400, "must provide log type (stdout/stderr)") + clientNotRunning = CodedError(400, "node is not running a Nomad Client") + invalidOrigin = CodedError(400, "origin must be start or end") ) func (s *HTTPServer) FsRequest(resp http.ResponseWriter, req *http.Request) (interface{}, error) { @@ -273,13 +273,13 @@ func (s *HTTPServer) Logs(resp http.ResponseWriter, req *http.Request) (interfac if followStr := q.Get("follow"); followStr != "" { if follow, err = strconv.ParseBool(followStr); err != nil { - return nil, fmt.Errorf("failed to parse follow field to boolean: %v", err) + return nil, CodedError(400, fmt.Sprintf("failed to parse follow field to boolean: %v", err)) } } if plainStr := q.Get("plain"); plainStr != "" { if plain, err = strconv.ParseBool(plainStr); err != nil { - return nil, fmt.Errorf("failed to parse plain field to boolean: %v", err) + return nil, CodedError(400, fmt.Sprintf("failed to parse plain field to boolean: %v", err)) } } @@ -295,7 +295,7 @@ func (s *HTTPServer) Logs(resp http.ResponseWriter, req *http.Request) (interfac if offsetString != "" { var err error if offset, err = strconv.ParseInt(offsetString, 10, 64); err != nil { - return nil, fmt.Errorf("error parsing offset: %v", err) + return nil, CodedError(400, fmt.Sprintf("error parsing offset: %v", err)) } } @@ -388,10 +388,13 @@ func (s *HTTPServer) fsStreamImpl(resp http.ResponseWriter, decoder.Reset(httpPipe) if err := res.Error; err != nil { + code := 500 if err.Code != nil { - errCh <- CodedError(int(*err.Code), err.Error()) - return + code = int(*err.Code) } + + errCh <- CodedError(code, err.Error()) + return } if _, err := io.Copy(output, bytes.NewReader(res.Payload)); err != nil { diff --git a/command/agent/fs_endpoint_test.go b/command/agent/fs_endpoint_test.go index e131c990a..67cda129f 100644 --- a/command/agent/fs_endpoint_test.go +++ b/command/agent/fs_endpoint_test.go @@ -3,7 +3,6 @@ package agent import ( "encoding/base64" "fmt" - "io" "io/ioutil" "net/http" "net/http/httptest" @@ -12,6 +11,7 @@ import ( "time" cstructs "github.com/hashicorp/nomad/client/structs" + "github.com/hashicorp/nomad/helper/uuid" "github.com/hashicorp/nomad/nomad/mock" "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/testutil" @@ -189,25 +189,26 @@ func TestHTTP_FS_Stream_MissingParams(t *testing.T) { require := require.New(t) httpTest(t, nil, func(s *TestAgent) { req, err := http.NewRequest("GET", "/v1/client/fs/stream/", nil) - require.Nil(err) + require.NoError(err) respW := httptest.NewRecorder() _, err = s.Server.Stream(respW, req) require.EqualError(err, allocIDNotPresentErr.Error()) req, err = http.NewRequest("GET", "/v1/client/fs/stream/foo", nil) - require.Nil(err) + require.NoError(err) respW = httptest.NewRecorder() _, err = s.Server.Stream(respW, req) require.EqualError(err, fileNameNotPresentErr.Error()) req, err = http.NewRequest("GET", "/v1/client/fs/stream/foo?path=/path/to/file", nil) - require.Nil(err) + require.NoError(err) respW = httptest.NewRecorder() _, err = s.Server.Stream(respW, req) - require.Nil(err) + require.Error(err) + require.Contains(err.Error(), "alloc lookup failed") }) } @@ -219,38 +220,39 @@ func TestHTTP_FS_Logs_MissingParams(t *testing.T) { httpTest(t, nil, func(s *TestAgent) { // AllocID Not Present req, err := http.NewRequest("GET", "/v1/client/fs/logs/", nil) - require.Nil(err) + require.NoError(err) respW := httptest.NewRecorder() s.Server.mux.ServeHTTP(respW, req) require.Equal(respW.Body.String(), allocIDNotPresentErr.Error()) - require.Equal(500, respW.Code) // 500 for backward compat + require.Equal(400, respW.Code) // Task Not Present req, err = http.NewRequest("GET", "/v1/client/fs/logs/foo", nil) - require.Nil(err) + require.NoError(err) respW = httptest.NewRecorder() s.Server.mux.ServeHTTP(respW, req) require.Equal(respW.Body.String(), taskNotPresentErr.Error()) - require.Equal(500, respW.Code) // 500 for backward compat + require.Equal(400, respW.Code) // Log Type Not Present req, err = http.NewRequest("GET", "/v1/client/fs/logs/foo?task=foo", nil) - require.Nil(err) + require.NoError(err) respW = httptest.NewRecorder() s.Server.mux.ServeHTTP(respW, req) require.Equal(respW.Body.String(), logTypeNotPresentErr.Error()) - require.Equal(500, respW.Code) // 500 for backward compat + require.Equal(400, respW.Code) - // Ok + // case where all parameters are set but alloc isn't found req, err = http.NewRequest("GET", "/v1/client/fs/logs/foo?task=foo&type=stdout", nil) - require.Nil(err) + require.NoError(err) respW = httptest.NewRecorder() s.Server.mux.ServeHTTP(respW, req) - require.Equal(200, respW.Code) + require.Equal(500, respW.Code) + require.Contains(respW.Body.String(), "alloc lookup failed") }) } @@ -354,8 +356,7 @@ func TestHTTP_FS_Stream_NoFollow(t *testing.T) { path := fmt.Sprintf("/v1/client/fs/stream/%s?path=alloc/logs/web.stdout.0&offset=%d&origin=end&follow=false", a.ID, offset) - p, _ := io.Pipe() - req, err := http.NewRequest("GET", path, p) + req, err := http.NewRequest("GET", path, nil) require.Nil(err) respW := testutil.NewResponseRecorder() doneCh := make(chan struct{}) @@ -383,8 +384,6 @@ func TestHTTP_FS_Stream_NoFollow(t *testing.T) { case <-time.After(1 * time.Second): t.Fatal("should close but did not") } - - p.Close() }) } @@ -401,9 +400,7 @@ func TestHTTP_FS_Stream_Follow(t *testing.T) { path := fmt.Sprintf("/v1/client/fs/stream/%s?path=alloc/logs/web.stdout.0&offset=%d&origin=end", a.ID, offset) - p, _ := io.Pipe() - - req, err := http.NewRequest("GET", path, p) + req, err := http.NewRequest("GET", path, nil) require.Nil(err) respW := httptest.NewRecorder() doneCh := make(chan struct{}) @@ -431,8 +428,6 @@ func TestHTTP_FS_Stream_Follow(t *testing.T) { t.Fatal("shouldn't close") case <-time.After(1 * time.Second): } - - p.Close() }) } @@ -448,8 +443,7 @@ func TestHTTP_FS_Logs(t *testing.T) { path := fmt.Sprintf("/v1/client/fs/logs/%s?type=stdout&task=web&offset=%d&origin=end&plain=true", a.ID, offset) - p, _ := io.Pipe() - req, err := http.NewRequest("GET", path, p) + req, err := http.NewRequest("GET", path, nil) require.Nil(err) respW := testutil.NewResponseRecorder() go func() { @@ -469,8 +463,6 @@ func TestHTTP_FS_Logs(t *testing.T) { }, func(err error) { t.Fatal(err) }) - - p.Close() }) } @@ -486,8 +478,7 @@ func TestHTTP_FS_Logs_Follow(t *testing.T) { path := fmt.Sprintf("/v1/client/fs/logs/%s?type=stdout&task=web&offset=%d&origin=end&plain=true&follow=true", a.ID, offset) - p, _ := io.Pipe() - req, err := http.NewRequest("GET", path, p) + req, err := http.NewRequest("GET", path, nil) require.Nil(err) respW := testutil.NewResponseRecorder() errCh := make(chan error) @@ -514,7 +505,23 @@ func TestHTTP_FS_Logs_Follow(t *testing.T) { t.Fatalf("shouldn't exit: %v", err) case <-time.After(1 * time.Second): } - - p.Close() + }) +} + +func TestHTTP_FS_Logs_PropagatesErrors(t *testing.T) { + t.Parallel() + httpTest(t, nil, func(s *TestAgent) { + path := fmt.Sprintf("/v1/client/fs/logs/%s?type=stdout&task=web&offset=0&origin=end&plain=true", + uuid.Generate()) + + req, err := http.NewRequest("GET", path, nil) + require.NoError(t, err) + respW := testutil.NewResponseRecorder() + + _, err = s.Server.Logs(respW, req) + require.Error(t, err) + + _, ok := err.(HTTPCodedError) + require.Truef(t, ok, "expected a coded error but found: %#+v", err) }) } diff --git a/command/agent/job_endpoint.go b/command/agent/job_endpoint.go index 7e7f206b9..710c94ec3 100644 --- a/command/agent/job_endpoint.go +++ b/command/agent/job_endpoint.go @@ -812,9 +812,10 @@ func ApiTaskToStructsTask(apiTask *api.Task, structsTask *structs.Task) { structsTask.VolumeMounts = make([]*structs.VolumeMount, l) for i, mount := range apiTask.VolumeMounts { structsTask.VolumeMounts[i] = &structs.VolumeMount{ - Volume: mount.Volume, - Destination: mount.Destination, - ReadOnly: mount.ReadOnly, + Volume: *mount.Volume, + Destination: *mount.Destination, + ReadOnly: *mount.ReadOnly, + PropagationMode: *mount.PropagationMode, } } } @@ -1062,6 +1063,7 @@ func ApiConsulConnectToStructs(in *api.ConsulConnect) *structs.ConsulConnect { if in.SidecarService != nil { out.SidecarService = &structs.ConsulSidecarService{ + Tags: helper.CopySliceString(in.SidecarService.Tags), Port: in.SidecarService.Port, } diff --git a/command/agent/job_endpoint_test.go b/command/agent/job_endpoint_test.go index e1934e29e..88deda125 100644 --- a/command/agent/job_endpoint_test.go +++ b/command/agent/job_endpoint_test.go @@ -1537,6 +1537,13 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { TaskName: "task1", }, }, + Connect: &api.ConsulConnect{ + Native: false, + SidecarService: &api.ConsulSidecarService{ + Tags: []string{"f", "g"}, + Port: "9000", + }, + }, }, }, Tasks: []*api.Task{ @@ -1877,6 +1884,13 @@ func TestJobs_ApiJobToStructsJob(t *testing.T) { TaskName: "task1", }, }, + Connect: &structs.ConsulConnect{ + Native: false, + SidecarService: &structs.ConsulSidecarService{ + Tags: []string{"f", "g"}, + Port: "9000", + }, + }, }, }, Tasks: []*structs.Task{ diff --git a/command/agent/log_file.go b/command/agent/log_file.go new file mode 100644 index 000000000..bad3c6c17 --- /dev/null +++ b/command/agent/log_file.go @@ -0,0 +1,146 @@ +package agent + +import ( + "fmt" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "sync" + "time" + + "github.com/hashicorp/logutils" +) + +var ( + now = time.Now +) + +// logFile is used to setup a file based logger that also performs log rotation +type logFile struct { + // Log level Filter to filter out logs that do not matcch LogLevel criteria + logFilter *logutils.LevelFilter + + //Name of the log file + fileName string + + //Path to the log file + logPath string + + //Duration between each file rotation operation + duration time.Duration + + //LastCreated represents the creation time of the latest log + LastCreated time.Time + + //FileInfo is the pointer to the current file being written to + FileInfo *os.File + + //MaxBytes is the maximum number of desired bytes for a log file + MaxBytes int + + //BytesWritten is the number of bytes written in the current log file + BytesWritten int64 + + // Max rotated files to keep before removing them. + MaxFiles int + + //acquire is the mutex utilized to ensure we have no concurrency issues + acquire sync.Mutex +} + +func (l *logFile) fileNamePattern() string { + // Extract the file extension + fileExt := filepath.Ext(l.fileName) + // If we have no file extension we append .log + if fileExt == "" { + fileExt = ".log" + } + // Remove the file extension from the filename + return strings.TrimSuffix(l.fileName, fileExt) + "-%s" + fileExt +} + +func (l *logFile) openNew() error { + fileNamePattern := l.fileNamePattern() + // New file name has the format : filename-timestamp.extension + createTime := now() + newfileName := fmt.Sprintf(fileNamePattern, strconv.FormatInt(createTime.UnixNano(), 10)) + newfilePath := filepath.Join(l.logPath, newfileName) + // Try creating a file. We truncate the file because we are the only authority to write the logs + filePointer, err := os.OpenFile(newfilePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0640) + if err != nil { + return err + } + + l.FileInfo = filePointer + // New file, new bytes tracker, new creation time :) + l.LastCreated = createTime + l.BytesWritten = 0 + return nil +} + +func (l *logFile) rotate() error { + // Get the time from the last point of contact + timeElapsed := time.Since(l.LastCreated) + // Rotate if we hit the byte file limit or the time limit + if (l.BytesWritten >= int64(l.MaxBytes) && (l.MaxBytes > 0)) || timeElapsed >= l.duration { + l.FileInfo.Close() + if err := l.pruneFiles(); err != nil { + return err + } + return l.openNew() + } + return nil +} + +func (l *logFile) pruneFiles() error { + if l.MaxFiles == 0 { + return nil + } + pattern := l.fileNamePattern() + //get all the files that match the log file pattern + globExpression := filepath.Join(l.logPath, fmt.Sprintf(pattern, "*")) + matches, err := filepath.Glob(globExpression) + if err != nil { + return err + } + + // Stort the strings as filepath.Glob does not publicly guarantee that files + // are sorted, so here we add an extra defensive sort. + sort.Strings(matches) + + // Prune if there are more files stored than the configured max + stale := len(matches) - l.MaxFiles + for i := 0; i < stale; i++ { + if err := os.Remove(matches[i]); err != nil { + return err + } + } + return nil +} + +// Write is used to implement io.Writer +func (l *logFile) Write(b []byte) (int, error) { + // Filter out log entries that do not match log level criteria + if !l.logFilter.Check(b) { + return 0, nil + } + + l.acquire.Lock() + defer l.acquire.Unlock() + //Create a new file if we have no file to write to + if l.FileInfo == nil { + if err := l.openNew(); err != nil { + return 0, err + } + } + // Check for the last contact and rotate if necessary + if err := l.rotate(); err != nil { + return 0, err + } + + n, err := l.FileInfo.Write(b) + l.BytesWritten += int64(n) + return n, err +} diff --git a/command/agent/log_file_test.go b/command/agent/log_file_test.go new file mode 100644 index 000000000..12777784d --- /dev/null +++ b/command/agent/log_file_test.go @@ -0,0 +1,171 @@ +package agent + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + "time" + + "github.com/hashicorp/logutils" + "github.com/stretchr/testify/require" +) + +const ( + testFileName = "Nomad.log" + testDuration = 2 * time.Second + testBytes = 10 +) + +func TestLogFile_timeRotation(t *testing.T) { + t.Parallel() + require := require.New(t) + + tempDir, err := ioutil.TempDir("", "LogWriterTimeTest") + require.NoError(err) + + defer os.Remove(tempDir) + + filt := LevelFilter() + logFile := logFile{ + logFilter: filt, + fileName: testFileName, + logPath: tempDir, + duration: testDuration, + } + logFile.Write([]byte("Hello World")) + time.Sleep(2 * time.Second) + logFile.Write([]byte("Second File")) + want := 2 + if got, _ := ioutil.ReadDir(tempDir); len(got) != want { + t.Errorf("Expected %d files, got %v file(s)", want, len(got)) + } +} + +func TestLogFile_openNew(t *testing.T) { + t.Parallel() + require := require.New(t) + + tempDir, err := ioutil.TempDir("", "LogWriterOpenTest") + require.NoError(err) + defer os.Remove(tempDir) + + logFile := logFile{fileName: testFileName, logPath: tempDir, duration: testDuration} + require.NoError(logFile.openNew()) + + _, err = ioutil.ReadFile(logFile.FileInfo.Name()) + require.NoError(err) +} + +func TestLogFile_byteRotation(t *testing.T) { + t.Parallel() + require := require.New(t) + + tempDir, err := ioutil.TempDir("", "LogWriterByteTest") + require.NoError(err) + defer os.Remove(tempDir) + + filt := LevelFilter() + filt.MinLevel = logutils.LogLevel("INFO") + logFile := logFile{ + logFilter: filt, + fileName: testFileName, + logPath: tempDir, + MaxBytes: testBytes, + duration: 24 * time.Hour, + } + logFile.Write([]byte("Hello World")) + logFile.Write([]byte("Second File")) + want := 2 + tempFiles, _ := ioutil.ReadDir(tempDir) + require.Equal(want, len(tempFiles)) +} + +func TestLogFile_logLevelFiltering(t *testing.T) { + t.Parallel() + require := require.New(t) + + tempDir, err := ioutil.TempDir("", "LogWriterFilterTest") + require.NoError(err) + defer os.Remove(tempDir) + filt := LevelFilter() + logFile := logFile{ + logFilter: filt, + fileName: testFileName, + logPath: tempDir, + MaxBytes: testBytes, + duration: testDuration, + } + logFile.Write([]byte("[INFO] This is an info message")) + logFile.Write([]byte("[DEBUG] This is a debug message")) + logFile.Write([]byte("[ERR] This is an error message")) + want := 2 + tempFiles, _ := ioutil.ReadDir(tempDir) + require.Equal(want, len(tempFiles)) +} + +func TestLogFile_deleteArchives(t *testing.T) { + t.Parallel() + require := require.New(t) + + tempDir, err := ioutil.TempDir("", "LogWriterDeleteArchivesTest") + require.NoError(err) + defer os.Remove(tempDir) + + filt := LevelFilter() + filt.MinLevel = logutils.LogLevel("INFO") + logFile := logFile{ + logFilter: filt, + fileName: testFileName, + logPath: tempDir, + MaxBytes: testBytes, + duration: 24 * time.Hour, + MaxFiles: 1, + } + logFile.Write([]byte("[INFO] Hello World")) + logFile.Write([]byte("[INFO] Second File")) + logFile.Write([]byte("[INFO] Third File")) + want := 2 + tempFiles, _ := ioutil.ReadDir(tempDir) + + require.Equal(want, len(tempFiles)) + + for _, tempFile := range tempFiles { + var bytes []byte + var err error + path := filepath.Join(tempDir, tempFile.Name()) + if bytes, err = ioutil.ReadFile(path); err != nil { + t.Errorf(err.Error()) + return + } + contents := string(bytes) + + require.NotEqual("[INFO] Hello World", contents, "oldest log should have been deleted") + } +} + +func TestLogFile_deleteArchivesDisabled(t *testing.T) { + t.Parallel() + + require := require.New(t) + tempDir, err := ioutil.TempDir("", "LogWriterDeleteArchivesDisabledTest") + require.NoError(err) + defer os.Remove(tempDir) + + filt := LevelFilter() + filt.MinLevel = logutils.LogLevel("INFO") + logFile := logFile{ + logFilter: filt, + fileName: testFileName, + logPath: tempDir, + MaxBytes: testBytes, + duration: 24 * time.Hour, + MaxFiles: 0, + } + logFile.Write([]byte("[INFO] Hello World")) + logFile.Write([]byte("[INFO] Second File")) + logFile.Write([]byte("[INFO] Third File")) + want := 3 + tempFiles, _ := ioutil.ReadDir(tempDir) + require.Equal(want, len(tempFiles)) +} diff --git a/command/agent/testdata/basic.hcl b/command/agent/testdata/basic.hcl index 03ce1c749..0f569b487 100644 --- a/command/agent/testdata/basic.hcl +++ b/command/agent/testdata/basic.hcl @@ -13,6 +13,8 @@ log_level = "ERR" log_json = true +log_file = "/var/log/nomad.log" + bind_addr = "192.168.0.1" enable_debug = true diff --git a/command/agent/testdata/basic.json b/command/agent/testdata/basic.json index 6eedcb85f..22bb3a36c 100644 --- a/command/agent/testdata/basic.json +++ b/command/agent/testdata/basic.json @@ -143,6 +143,7 @@ ], "leave_on_interrupt": true, "leave_on_terminate": true, + "log_file": "/var/log/nomad.log", "log_json": true, "log_level": "ERR", "name": "my-web", diff --git a/command/alloc_status.go b/command/alloc_status.go index 202237998..1184534c6 100644 --- a/command/alloc_status.go +++ b/command/alloc_status.go @@ -234,7 +234,7 @@ func formatAllocBasicInfo(alloc *api.Allocation, client *api.Client, uuidLength } basic := []string{ - fmt.Sprintf("ID|%s", limit(alloc.ID, uuidLength)), + fmt.Sprintf("ID|%s", alloc.ID), fmt.Sprintf("Eval ID|%s", limit(alloc.EvalID, uuidLength)), fmt.Sprintf("Name|%s", alloc.Name), fmt.Sprintf("Node ID|%s", limit(alloc.NodeID, uuidLength)), diff --git a/command/alloc_status_test.go b/command/alloc_status_test.go index b3c7fef20..0c0bf38e9 100644 --- a/command/alloc_status_test.go +++ b/command/alloc_status_test.go @@ -286,6 +286,9 @@ func TestAllocStatusCommand_ScoreMetrics(t *testing.T) { require.Contains(out, "Placement Metrics") require.Contains(out, mockNode1.ID) require.Contains(out, mockNode2.ID) + + // assert we sort headers alphabetically + require.Contains(out, "binpack node-affinity") require.Contains(out, "final score") } diff --git a/command/monitor.go b/command/monitor.go index 52cee4b80..c7f0f9d55 100644 --- a/command/monitor.go +++ b/command/monitor.go @@ -2,6 +2,7 @@ package command import ( "fmt" + "sort" "strings" "sync" "time" @@ -380,7 +381,16 @@ func formatAllocMetrics(metrics *api.AllocationMetric, scores bool, prefix strin // Add header as first row if i == 0 { scoreOutput[0] = "Node|" - for scorerName := range scoreMeta.Scores { + + // sort scores alphabetically + scores := make([]string, 0, len(scoreMeta.Scores)) + for score := range scoreMeta.Scores { + scores = append(scores, score) + } + sort.Strings(scores) + + // build score header output + for _, scorerName := range scores { scoreOutput[0] += fmt.Sprintf("%v|", scorerName) scorerNames = append(scorerNames, scorerName) } diff --git a/command/node_status.go b/command/node_status.go index 2084af2a6..4bbf443b9 100644 --- a/command/node_status.go +++ b/command/node_status.go @@ -333,7 +333,7 @@ func formatDrain(n *api.Node) string { func (c *NodeStatusCommand) formatNode(client *api.Client, node *api.Node) int { // Format the header output basic := []string{ - fmt.Sprintf("ID|%s", limit(node.ID, c.length)), + fmt.Sprintf("ID|%s", node.ID), fmt.Sprintf("Name|%s", node.Name), fmt.Sprintf("Class|%s", node.NodeClass), fmt.Sprintf("DC|%s", node.Datacenter), diff --git a/command/node_status_test.go b/command/node_status_test.go index 500c18a3a..4aa7f550c 100644 --- a/command/node_status_test.go +++ b/command/node_status_test.go @@ -137,11 +137,8 @@ func TestNodeStatusCommand_Run(t *testing.T) { if !strings.Contains(out, "mynode") { t.Fatalf("expect to find mynode, got: %s", out) } - if strings.Contains(out, nodeID) { - t.Fatalf("expected truncated node id, got: %s", out) - } - if !strings.Contains(out, nodeID[:8]) { - t.Fatalf("expected node id %q, got: %s", nodeID[:8], out) + if !strings.Contains(out, nodeID) { + t.Fatalf("expected node id %q, got: %s", nodeID, out) } ui.OutputWriter.Reset() diff --git a/command/quota_apply.go b/command/quota_apply.go index 0dee1519d..80b05c6a4 100644 --- a/command/quota_apply.go +++ b/command/quota_apply.go @@ -13,6 +13,7 @@ import ( "github.com/hashicorp/hcl/hcl/ast" "github.com/hashicorp/nomad/api" "github.com/hashicorp/nomad/helper" + "github.com/hashicorp/nomad/jobspec" "github.com/mitchellh/mapstructure" "github.com/posener/complete" ) @@ -261,6 +262,7 @@ func parseQuotaResource(result *api.Resources, list *ast.ObjectList) error { valid := []string{ "cpu", "memory", + "network", } if err := helper.CheckHCLKeys(listVal, valid); err != nil { return multierror.Prefix(err, "resources ->") @@ -275,5 +277,20 @@ func parseQuotaResource(result *api.Resources, list *ast.ObjectList) error { return err } + // Find the network ObjectList, parse it + nw := listVal.Filter("network") + if len(nw.Items) > 0 { + rl, err := jobspec.ParseNetwork(nw) + if err != nil { + return multierror.Prefix(err, "resources ->") + } + if rl != nil { + if rl.Mode != "" || rl.HasPorts() { + return fmt.Errorf("resources -> network only allows mbits") + } + result.Networks = []*api.NetworkResource{rl} + } + } + return nil } diff --git a/command/quota_apply_test.go b/command/quota_apply_test.go index d2211f0bf..6c689a9fd 100644 --- a/command/quota_apply_test.go +++ b/command/quota_apply_test.go @@ -8,8 +8,10 @@ import ( "strings" "testing" + "github.com/hashicorp/nomad/api" "github.com/mitchellh/cli" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestQuotaApplyCommand_Implements(t *testing.T) { @@ -97,3 +99,42 @@ func TestQuotaApplyCommand_Good_JSON(t *testing.T) { assert.Nil(t, err) assert.Len(t, quotas, 1) } + +func TestQuotaApplyNetwork(t *testing.T) { + t.Parallel() + + mbits := 20 + + cases := []struct { + hcl string + q *api.QuotaSpec + err string + }{{ + hcl: `limit {region = "global", region_limit {network {mbits = 20}}}`, + q: &api.QuotaSpec{ + Limits: []*api.QuotaLimit{{ + Region: "global", + RegionLimit: &api.Resources{ + Networks: []*api.NetworkResource{{ + MBits: &mbits, + }}, + }, + }}, + }, + err: "", + }, { + hcl: `limit {region = "global", region_limit {network { mbits = 20, device = "eth0"}}}`, + q: nil, + err: "1 error(s) occurred:\n\n* limit -> region_limit -> resources -> network -> invalid key: device", + }} + + for _, c := range cases { + t.Run(c.hcl, func(t *testing.T) { + q, err := parseQuotaSpec([]byte(c.hcl)) + require.Equal(t, c.q, q) + if c.err != "" { + require.EqualError(t, err, c.err) + } + }) + } +} diff --git a/contributing/README.md b/contributing/README.md index 555861b85..cf0c1c7b4 100644 --- a/contributing/README.md +++ b/contributing/README.md @@ -3,8 +3,8 @@ This directory contains some documentation about the Nomad codebase, aimed at readers who are interested in making code contributions. -If you're looking for information on _using_ using, please instead refer -to [the main Nomad website](https://nomadproject.io). +If you're looking for information on _using_ Nomad, please instead refer +to the [Nomad website](https://nomadproject.io). ## Architecture @@ -38,3 +38,4 @@ developers and reviewers confidence that the proper changes have been made: * [New `jobspec` entry](checklist-jobspec.md) * [New CLI command](checklist-command.md) +* [New RPC endpoint](checklist-rpc-endpoint.md) diff --git a/contributing/checklist-jobspec.md b/contributing/checklist-jobspec.md index 195cb0cb6..19e33521c 100644 --- a/contributing/checklist-jobspec.md +++ b/contributing/checklist-jobspec.md @@ -20,6 +20,7 @@ * [ ] Changelog * [ ] Jobspec entry https://www.nomadproject.io/docs/job-specification/index.html +* [ ] Jobspec sidebar entry https://github.com/hashicorp/nomad/blob/master/website/source/layouts/docs.erb * [ ] Job JSON API entry https://www.nomadproject.io/api/json-jobs.html * [ ] Sample Response output in API https://www.nomadproject.io/api/jobs.html * [ ] Consider if it needs a guide https://www.nomadproject.io/guides/index.html diff --git a/demo/vagrant/Vagrantfile b/demo/vagrant/Vagrantfile index 3953a4e59..b602b3f5b 100644 --- a/demo/vagrant/Vagrantfile +++ b/demo/vagrant/Vagrantfile @@ -24,7 +24,7 @@ sudo docker --version sudo apt-get install unzip curl vim -y echo "Installing Nomad..." -NOMAD_VERSION=0.8.6 +NOMAD_VERSION=0.10.0 cd /tmp/ curl -sSL https://releases.hashicorp.com/nomad/${NOMAD_VERSION}/nomad_${NOMAD_VERSION}_linux_amd64.zip -o nomad.zip unzip nomad.zip @@ -34,7 +34,7 @@ sudo chmod a+w /etc/nomad.d echo "Installing Consul..." -CONSUL_VERSION=1.4.0 +CONSUL_VERSION=1.6.1 curl -sSL https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip > consul.zip unzip /tmp/consul.zip sudo install consul /usr/bin/consul @@ -68,7 +68,7 @@ nomad -autocomplete-install SCRIPT Vagrant.configure(2) do |config| - config.vm.box = "bento/ubuntu-16.04" # 16.04 LTS + config.vm.box = "bento/ubuntu-18.04" # 18.04 LTS config.vm.hostname = "nomad" config.vm.provision "shell", inline: $script, privileged: false diff --git a/drivers/docker/config.go b/drivers/docker/config.go index b18f00cbf..34eb46d60 100644 --- a/drivers/docker/config.go +++ b/drivers/docker/config.go @@ -134,6 +134,25 @@ var ( Name: pluginName, } + danglingContainersBlock = hclspec.NewObject(map[string]*hclspec.Spec{ + "enabled": hclspec.NewDefault( + hclspec.NewAttr("enabled", "bool", false), + hclspec.NewLiteral(`true`), + ), + "period": hclspec.NewDefault( + hclspec.NewAttr("period", "string", false), + hclspec.NewLiteral(`"5m"`), + ), + "creation_grace": hclspec.NewDefault( + hclspec.NewAttr("creation_grace", "string", false), + hclspec.NewLiteral(`"5m"`), + ), + "dry_run": hclspec.NewDefault( + hclspec.NewAttr("dry_run", "bool", false), + hclspec.NewLiteral(`false`), + ), + }) + // configSpec is the hcl specification returned by the ConfigSchema RPC // and is used to parse the contents of the 'plugin "docker" {...}' block. // Example: @@ -195,9 +214,22 @@ var ( hclspec.NewAttr("container", "bool", false), hclspec.NewLiteral("true"), ), + "dangling_containers": hclspec.NewDefault( + hclspec.NewBlock("dangling_containers", false, danglingContainersBlock), + hclspec.NewLiteral(`{ + enabled = true + period = "5m" + creation_grace = "5m" + }`), + ), })), hclspec.NewLiteral(`{ image = true container = true + dangling_containers = { + enabled = true + period = "5m" + creation_grace = "5m" + } }`)), // docker volume options @@ -491,6 +523,28 @@ type DockerVolumeDriverConfig struct { Options hclutils.MapStrStr `codec:"options"` } +// ContainerGCConfig controls the behavior of the GC reconciler to detects +// dangling nomad containers that aren't tracked due to docker/nomad bugs +type ContainerGCConfig struct { + // Enabled controls whether container reconciler is enabled + Enabled bool `codec:"enabled"` + + // DryRun indicates that reconciler should log unexpectedly running containers + // if found without actually killing them + DryRun bool `codec:"dry_run"` + + // PeriodStr controls the frequency of scanning containers + PeriodStr string `codec:"period"` + period time.Duration `codec:"-"` + + // CreationGraceStr is the duration allowed for a newly created container + // to live without being registered as a running task in nomad. + // A container is treated as leaked if it lived more than grace duration + // and haven't been registered in tasks. + CreationGraceStr string `codec:"creation_grace"` + CreationGrace time.Duration `codec:"-"` +} + type DriverConfig struct { Endpoint string `codec:"endpoint"` Auth AuthConfig `codec:"auth"` @@ -519,6 +573,8 @@ type GCConfig struct { ImageDelay string `codec:"image_delay"` imageDelayDuration time.Duration `codec:"-"` Container bool `codec:"container"` + + DanglingContainers ContainerGCConfig `codec:"dangling_containers"` } type VolumeConfig struct { @@ -534,6 +590,8 @@ func (d *Driver) ConfigSchema() (*hclspec.Spec, error) { return configSpec, nil } +const danglingContainersCreationGraceMinimum = 1 * time.Minute + func (d *Driver) SetConfig(c *base.Config) error { var config DriverConfig if len(c.PluginConfig) != 0 { @@ -551,6 +609,25 @@ func (d *Driver) SetConfig(c *base.Config) error { d.config.GC.imageDelayDuration = dur } + if len(d.config.GC.DanglingContainers.PeriodStr) > 0 { + dur, err := time.ParseDuration(d.config.GC.DanglingContainers.PeriodStr) + if err != nil { + return fmt.Errorf("failed to parse 'period' duration: %v", err) + } + d.config.GC.DanglingContainers.period = dur + } + + if len(d.config.GC.DanglingContainers.CreationGraceStr) > 0 { + dur, err := time.ParseDuration(d.config.GC.DanglingContainers.CreationGraceStr) + if err != nil { + return fmt.Errorf("failed to parse 'creation_grace' duration: %v", err) + } + if dur < danglingContainersCreationGraceMinimum { + return fmt.Errorf("creation_grace is less than minimum, %v", danglingContainersCreationGraceMinimum) + } + d.config.GC.DanglingContainers.CreationGrace = dur + } + if c.AgentConfig != nil { d.clientConfig = c.AgentConfig.Driver } @@ -568,6 +645,8 @@ func (d *Driver) SetConfig(c *base.Config) error { d.coordinator = newDockerCoordinator(coordinatorConfig) + d.reconciler = newReconciler(d) + return nil } diff --git a/drivers/docker/config_test.go b/drivers/docker/config_test.go index 35506b672..452844371 100644 --- a/drivers/docker/config_test.go +++ b/drivers/docker/config_test.go @@ -423,3 +423,63 @@ config { require.EqualValues(t, expected, tc) } + +// TestConfig_DriverConfig_DanglingContainers asserts that dangling_containers is parsed +// and populated with defaults as expected +func TestConfig_DriverConfig_DanglingContainers(t *testing.T) { + cases := []struct { + name string + config string + expected ContainerGCConfig + }{ + { + name: "pure default", + config: `{}`, + expected: ContainerGCConfig{Enabled: true, PeriodStr: "5m", CreationGraceStr: "5m"}, + }, + { + name: "partial gc", + config: `{ gc { } }`, + expected: ContainerGCConfig{Enabled: true, PeriodStr: "5m", CreationGraceStr: "5m"}, + }, + { + name: "partial gc", + config: `{ gc { dangling_containers { } } }`, + expected: ContainerGCConfig{Enabled: true, PeriodStr: "5m", CreationGraceStr: "5m"}, + }, + { + name: "partial dangling_containers", + config: `{ gc { dangling_containers { enabled = false } } }`, + expected: ContainerGCConfig{Enabled: false, PeriodStr: "5m", CreationGraceStr: "5m"}, + }, + { + name: "incomplete dangling_containers 2", + config: `{ gc { dangling_containers { period = "10m" } } }`, + expected: ContainerGCConfig{Enabled: true, PeriodStr: "10m", CreationGraceStr: "5m"}, + }, + { + name: "full default", + config: `{ gc { dangling_containers { + enabled = false + dry_run = true + period = "10m" + creation_grace = "20m" + }}}`, + expected: ContainerGCConfig{ + Enabled: false, + DryRun: true, + PeriodStr: "10m", + CreationGraceStr: "20m", + }, + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + var tc DriverConfig + hclutils.NewConfigParser(configSpec).ParseHCL(t, "config "+c.config, &tc) + require.EqualValues(t, c.expected, tc.GC.DanglingContainers) + + }) + } +} diff --git a/drivers/docker/driver.go b/drivers/docker/driver.go index 5f5784a7e..c6d448619 100644 --- a/drivers/docker/driver.go +++ b/drivers/docker/driver.go @@ -66,6 +66,10 @@ var ( nvidiaVisibleDevices = "NVIDIA_VISIBLE_DEVICES" ) +const ( + dockerLabelAllocID = "com.hashicorp.nomad.alloc_id" +) + type Driver struct { // eventer is used to handle multiplexing of TaskEvents calls such that an // event can be broadcast to all callers @@ -108,6 +112,8 @@ type Driver struct { // for use during fingerprinting. detected bool detectedLock sync.RWMutex + + reconciler *containerReconciler } // NewDockerDriver returns a docker implementation of a driver plugin @@ -309,6 +315,10 @@ CREATE: // the container is started runningContainer, err := client.InspectContainer(container.ID) if err != nil { + client.RemoveContainer(docker.RemoveContainerOptions{ + ID: container.ID, + Force: true, + }) msg := "failed to inspect started container" d.logger.Error(msg, "error", err) client.RemoveContainer(docker.RemoveContainerOptions{ @@ -642,6 +652,15 @@ func (d *Driver) containerBinds(task *drivers.TaskConfig, driverConfig *TaskConf return binds, nil } +var userMountToUnixMount = map[string]string{ + // Empty string maps to `rprivate` for backwards compatibility in restored + // older tasks, where mount propagation will not be present. + "": "rprivate", + nstructs.VolumeMountPropagationPrivate: "rprivate", + nstructs.VolumeMountPropagationHostToTask: "rslave", + nstructs.VolumeMountPropagationBidirectional: "rshared", +} + func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *TaskConfig, imageID string) (docker.CreateContainerOptions, error) { @@ -833,13 +852,24 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T hostConfig.Mounts = append(hostConfig.Mounts, hm) } + for _, m := range task.Mounts { - hostConfig.Mounts = append(hostConfig.Mounts, docker.HostMount{ + hm := docker.HostMount{ Type: "bind", Target: m.TaskPath, Source: m.HostPath, ReadOnly: m.Readonly, - }) + } + + // MountPropagation is only supported by Docker on Linux: + // https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation + if runtime.GOOS == "linux" { + hm.BindOptions = &docker.BindOptions{ + Propagation: userMountToUnixMount[m.PropagationMode], + } + } + + hostConfig.Mounts = append(hostConfig.Mounts, hm) } // set DNS search domains and extra hosts @@ -882,7 +912,6 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T // Setup port mapping and exposed ports if len(task.Resources.NomadResources.Networks) == 0 { - logger.Debug("no network interfaces are available") if len(driverConfig.PortMap) > 0 { return c, fmt.Errorf("Trying to map ports but no network interface is available") } @@ -957,9 +986,16 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T if len(driverConfig.Labels) > 0 { config.Labels = driverConfig.Labels - logger.Debug("applied labels on the container", "labels", config.Labels) } + labels := make(map[string]string, len(driverConfig.Labels)+1) + for k, v := range driverConfig.Labels { + labels[k] = v + } + labels[dockerLabelAllocID] = task.AllocID + config.Labels = labels + logger.Debug("applied labels on the container", "labels", config.Labels) + config.Env = task.EnvList() containerName := fmt.Sprintf("%s-%s", strings.Replace(task.Name, "/", "_", -1), task.AllocID) diff --git a/drivers/docker/driver_test.go b/drivers/docker/driver_test.go index a100aa743..ebcc80ea2 100644 --- a/drivers/docker/driver_test.go +++ b/drivers/docker/driver_test.go @@ -905,7 +905,8 @@ func TestDockerDriver_Labels(t *testing.T) { t.Fatalf("err: %v", err) } - require.Equal(t, 2, len(container.Config.Labels)) + // expect to see 1 additional standard labels + require.Equal(t, len(cfg.Labels)+1, len(container.Config.Labels)) for k, v := range cfg.Labels { require.Equal(t, v, container.Config.Labels[k]) } @@ -1008,6 +1009,56 @@ func TestDockerDriver_CreateContainerConfig(t *testing.T) { require.Equal(t, containerName, c.Name) } +func TestDockerDriver_CreateContainerConfig_User(t *testing.T) { + t.Parallel() + + task, cfg, _ := dockerTask(t) + task.User = "random-user-1" + + require.NoError(t, task.EncodeConcreteDriverConfig(cfg)) + + dh := dockerDriverHarness(t, nil) + driver := dh.Impl().(*Driver) + + c, err := driver.createContainerConfig(task, cfg, "org/repo:0.1") + require.NoError(t, err) + + require.Equal(t, task.User, c.Config.User) +} + +func TestDockerDriver_CreateContainerConfig_Labels(t *testing.T) { + t.Parallel() + + task, cfg, _ := dockerTask(t) + task.AllocID = uuid.Generate() + task.JobName = "redis-demo-job" + + cfg.Labels = map[string]string{ + "user_label": "user_value", + + // com.hashicorp.nomad. labels are reserved and + // cannot be overridden + "com.hashicorp.nomad.alloc_id": "bad_value", + } + + require.NoError(t, task.EncodeConcreteDriverConfig(cfg)) + + dh := dockerDriverHarness(t, nil) + driver := dh.Impl().(*Driver) + + c, err := driver.createContainerConfig(task, cfg, "org/repo:0.1") + require.NoError(t, err) + + expectedLabels := map[string]string{ + // user provided labels + "user_label": "user_value", + // default labels + "com.hashicorp.nomad.alloc_id": task.AllocID, + } + + require.Equal(t, expectedLabels, c.Config.Labels) +} + func TestDockerDriver_CreateContainerConfig_Logging(t *testing.T) { t.Parallel() diff --git a/drivers/docker/driver_unix_test.go b/drivers/docker/driver_unix_test.go index 9faa95326..6f312a1ec 100644 --- a/drivers/docker/driver_unix_test.go +++ b/drivers/docker/driver_unix_test.go @@ -7,6 +7,7 @@ import ( "io" "os" "path/filepath" + "runtime" "sort" "strconv" "strings" @@ -598,22 +599,32 @@ func TestDockerDriver_CreateContainerConfig_MountsCombined(t *testing.T) { c, err := driver.createContainerConfig(task, cfg, "org/repo:0.1") require.NoError(t, err) - expectedMounts := []docker.HostMount{ { - Type: "bind", - Source: "/tmp/cfg-mount", - Target: "/container/tmp/cfg-mount", - ReadOnly: false, - BindOptions: &docker.BindOptions{}, + Type: "bind", + Source: "/tmp/cfg-mount", + Target: "/container/tmp/cfg-mount", + ReadOnly: false, + BindOptions: &docker.BindOptions{ + Propagation: "", + }, }, { Type: "bind", Source: "/tmp/task-mount", Target: "/container/tmp/task-mount", ReadOnly: true, + BindOptions: &docker.BindOptions{ + Propagation: "rprivate", + }, }, } + + if runtime.GOOS != "linux" { + expectedMounts[0].BindOptions = &docker.BindOptions{} + expectedMounts[1].BindOptions = &docker.BindOptions{} + } + foundMounts := c.HostConfig.Mounts sort.Slice(foundMounts, func(i, j int) bool { return foundMounts[i].Target < foundMounts[j].Target diff --git a/drivers/docker/fingerprint.go b/drivers/docker/fingerprint.go index 694a8ce33..e6ffabc5c 100644 --- a/drivers/docker/fingerprint.go +++ b/drivers/docker/fingerprint.go @@ -13,6 +13,10 @@ import ( ) func (d *Driver) Fingerprint(ctx context.Context) (<-chan *drivers.Fingerprint, error) { + // start reconciler when we start fingerprinting + // this is the only method called when driver is launched properly + d.reconciler.Start() + ch := make(chan *drivers.Fingerprint) go d.handleFingerprint(ctx, ch) return ch, nil diff --git a/drivers/docker/reconciler.go b/drivers/docker/reconciler.go new file mode 100644 index 000000000..16750fde6 --- /dev/null +++ b/drivers/docker/reconciler.go @@ -0,0 +1,228 @@ +package docker + +import ( + "context" + "fmt" + "regexp" + "sync" + "time" + + docker "github.com/fsouza/go-dockerclient" + hclog "github.com/hashicorp/go-hclog" +) + +// containerReconciler detects and kills unexpectedly running containers. +// +// Due to Docker architecture and network based communication, it is +// possible for Docker to start a container successfully, but have the +// creation API call fail with a network error. containerReconciler +// scans for these untracked containers and kill them. +type containerReconciler struct { + ctx context.Context + config *ContainerGCConfig + client *docker.Client + logger hclog.Logger + + isDriverHealthy func() bool + trackedContainers func() map[string]bool + isNomadContainer func(c docker.APIContainers) bool + + once sync.Once +} + +func newReconciler(d *Driver) *containerReconciler { + return &containerReconciler{ + ctx: d.ctx, + config: &d.config.GC.DanglingContainers, + client: client, + logger: d.logger, + + isDriverHealthy: func() bool { return d.previouslyDetected() && d.fingerprintSuccessful() }, + trackedContainers: d.trackedContainers, + isNomadContainer: isNomadContainer, + } +} + +func (r *containerReconciler) Start() { + if !r.config.Enabled { + r.logger.Debug("skipping dangling containers handling; is disabled") + return + } + + r.once.Do(func() { + go r.removeDanglingContainersGoroutine() + }) +} + +func (r *containerReconciler) removeDanglingContainersGoroutine() { + period := r.config.period + + lastIterSucceeded := true + + // ensure that we wait for at least a period or creation timeout + // for first container GC iteration + // The initial period is a grace period for restore allocation + // before a driver may kill containers launched by an earlier nomad + // process. + initialDelay := period + if r.config.CreationGrace > initialDelay { + initialDelay = r.config.CreationGrace + } + + timer := time.NewTimer(initialDelay) + for { + select { + case <-timer.C: + if r.isDriverHealthy() { + err := r.removeDanglingContainersIteration() + if err != nil && lastIterSucceeded { + r.logger.Warn("failed to remove dangling containers", "error", err) + } + lastIterSucceeded = (err == nil) + } + + timer.Reset(period) + case <-r.ctx.Done(): + return + } + } +} + +func (r *containerReconciler) removeDanglingContainersIteration() error { + cutoff := time.Now().Add(-r.config.CreationGrace) + tracked := r.trackedContainers() + untracked, err := r.untrackedContainers(tracked, cutoff) + if err != nil { + return fmt.Errorf("failed to find untracked containers: %v", err) + } + + if len(untracked) == 0 { + return nil + } + + if r.config.DryRun { + r.logger.Info("detected untracked containers", "container_ids", untracked) + return nil + } + + for _, id := range untracked { + ctx, cancel := r.dockerAPIQueryContext() + err := client.RemoveContainer(docker.RemoveContainerOptions{ + Context: ctx, + ID: id, + Force: true, + }) + cancel() + if err != nil { + r.logger.Warn("failed to remove untracked container", "container_id", id, "error", err) + } else { + r.logger.Info("removed untracked container", "container_id", id) + } + } + + return nil +} + +// untrackedContainers returns the ids of containers that suspected +// to have been started by Nomad but aren't tracked by this driver +func (r *containerReconciler) untrackedContainers(tracked map[string]bool, cutoffTime time.Time) ([]string, error) { + result := []string{} + + ctx, cancel := r.dockerAPIQueryContext() + defer cancel() + + cc, err := client.ListContainers(docker.ListContainersOptions{ + Context: ctx, + All: false, // only reconcile running containers + }) + if err != nil { + return nil, fmt.Errorf("failed to list containers: %v", err) + } + + cutoff := cutoffTime.Unix() + + for _, c := range cc { + if tracked[c.ID] { + continue + } + + if c.Created > cutoff { + continue + } + + if !r.isNomadContainer(c) { + continue + } + + result = append(result, c.ID) + } + + return result, nil +} + +// dockerAPIQueryTimeout returns a context for docker API response with an appropriate timeout +// to protect against wedged locked-up API call. +// +// We'll try hitting Docker API on subsequent iteration. +func (r *containerReconciler) dockerAPIQueryContext() (context.Context, context.CancelFunc) { + // use a reasoanble floor to avoid very small limit + timeout := 30 * time.Second + + if timeout < r.config.period { + timeout = r.config.period + } + + return context.WithTimeout(context.Background(), timeout) +} + +func isNomadContainer(c docker.APIContainers) bool { + if _, ok := c.Labels[dockerLabelAllocID]; ok { + return true + } + + // pre-0.10 containers aren't tagged or labeled in any way, + // so use cheap heuristic based on mount paths + // before inspecting container details + if !hasMount(c, "/alloc") || + !hasMount(c, "/local") || + !hasMount(c, "/secrets") || + !hasNomadName(c) { + return false + } + + return true +} + +func hasMount(c docker.APIContainers, p string) bool { + for _, m := range c.Mounts { + if m.Destination == p { + return true + } + } + + return false +} + +var nomadContainerNamePattern = regexp.MustCompile(`\/.*-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}`) + +func hasNomadName(c docker.APIContainers) bool { + for _, n := range c.Names { + if nomadContainerNamePattern.MatchString(n) { + return true + } + } + + return false +} + +func (d *Driver) trackedContainers() map[string]bool { + d.tasks.lock.RLock() + defer d.tasks.lock.RUnlock() + + r := make(map[string]bool, len(d.tasks.store)) + for _, h := range d.tasks.store { + r[h.containerID] = true + } + + return r +} diff --git a/drivers/docker/reconciler_test.go b/drivers/docker/reconciler_test.go new file mode 100644 index 000000000..71221464a --- /dev/null +++ b/drivers/docker/reconciler_test.go @@ -0,0 +1,202 @@ +package docker + +import ( + "encoding/json" + "os" + "testing" + "time" + + docker "github.com/fsouza/go-dockerclient" + "github.com/hashicorp/nomad/client/testutil" + "github.com/hashicorp/nomad/helper/uuid" + "github.com/stretchr/testify/require" +) + +func fakeContainerList(t *testing.T) (nomadContainer, nonNomadContainer docker.APIContainers) { + path := "./test-resources/docker/reconciler_containers_list.json" + + f, err := os.Open(path) + if err != nil { + t.Fatalf("failed to open file: %v", err) + } + + var sampleContainerList []docker.APIContainers + err = json.NewDecoder(f).Decode(&sampleContainerList) + if err != nil { + t.Fatalf("failed to decode container list: %v", err) + } + + return sampleContainerList[0], sampleContainerList[1] +} + +func Test_HasMount(t *testing.T) { + nomadContainer, nonNomadContainer := fakeContainerList(t) + + require.True(t, hasMount(nomadContainer, "/alloc")) + require.True(t, hasMount(nomadContainer, "/data")) + require.True(t, hasMount(nomadContainer, "/secrets")) + require.False(t, hasMount(nomadContainer, "/random")) + + require.False(t, hasMount(nonNomadContainer, "/alloc")) + require.False(t, hasMount(nonNomadContainer, "/data")) + require.False(t, hasMount(nonNomadContainer, "/secrets")) + require.False(t, hasMount(nonNomadContainer, "/random")) +} + +func Test_HasNomadName(t *testing.T) { + nomadContainer, nonNomadContainer := fakeContainerList(t) + + require.True(t, hasNomadName(nomadContainer)) + require.False(t, hasNomadName(nonNomadContainer)) +} + +// TestDanglingContainerRemoval asserts containers without corresponding tasks +// are removed after the creation grace period. +func TestDanglingContainerRemoval(t *testing.T) { + testutil.DockerCompatible(t) + + // start two containers: one tracked nomad container, and one unrelated container + task, cfg, _ := dockerTask(t) + require.NoError(t, task.EncodeConcreteDriverConfig(cfg)) + + client, d, handle, cleanup := dockerSetup(t, task) + defer cleanup() + require.NoError(t, d.WaitUntilStarted(task.ID, 5*time.Second)) + + nonNomadContainer, err := client.CreateContainer(docker.CreateContainerOptions{ + Name: "mytest-image-" + uuid.Generate(), + Config: &docker.Config{ + Image: cfg.Image, + Cmd: append([]string{cfg.Command}, cfg.Args...), + }, + }) + require.NoError(t, err) + defer client.RemoveContainer(docker.RemoveContainerOptions{ + ID: nonNomadContainer.ID, + Force: true, + }) + + err = client.StartContainer(nonNomadContainer.ID, nil) + require.NoError(t, err) + + untrackedNomadContainer, err := client.CreateContainer(docker.CreateContainerOptions{ + Name: "mytest-image-" + uuid.Generate(), + Config: &docker.Config{ + Image: cfg.Image, + Cmd: append([]string{cfg.Command}, cfg.Args...), + Labels: map[string]string{ + dockerLabelAllocID: uuid.Generate(), + }, + }, + }) + require.NoError(t, err) + defer client.RemoveContainer(docker.RemoveContainerOptions{ + ID: untrackedNomadContainer.ID, + Force: true, + }) + + err = client.StartContainer(untrackedNomadContainer.ID, nil) + require.NoError(t, err) + + dd := d.Impl().(*Driver) + + reconciler := newReconciler(dd) + trackedContainers := map[string]bool{handle.containerID: true} + + tf := reconciler.trackedContainers() + require.Contains(t, tf, handle.containerID) + require.NotContains(t, tf, untrackedNomadContainer) + require.NotContains(t, tf, nonNomadContainer.ID) + + // assert tracked containers should never be untracked + untracked, err := reconciler.untrackedContainers(trackedContainers, time.Now()) + require.NoError(t, err) + require.NotContains(t, untracked, handle.containerID) + require.NotContains(t, untracked, nonNomadContainer.ID) + require.Contains(t, untracked, untrackedNomadContainer.ID) + + // assert we recognize nomad containers with appropriate cutoff + untracked, err = reconciler.untrackedContainers(map[string]bool{}, time.Now()) + require.NoError(t, err) + require.Contains(t, untracked, handle.containerID) + require.Contains(t, untracked, untrackedNomadContainer.ID) + require.NotContains(t, untracked, nonNomadContainer.ID) + + // but ignore if creation happened before cutoff + untracked, err = reconciler.untrackedContainers(map[string]bool{}, time.Now().Add(-1*time.Minute)) + require.NoError(t, err) + require.NotContains(t, untracked, handle.containerID) + require.NotContains(t, untracked, untrackedNomadContainer.ID) + require.NotContains(t, untracked, nonNomadContainer.ID) + + // a full integration tests to assert that containers are removed + prestineDriver := dockerDriverHarness(t, nil).Impl().(*Driver) + prestineDriver.config.GC.DanglingContainers = ContainerGCConfig{ + Enabled: true, + period: 1 * time.Second, + CreationGrace: 0 * time.Second, + } + nReconciler := newReconciler(prestineDriver) + + require.NoError(t, nReconciler.removeDanglingContainersIteration()) + + _, err = client.InspectContainer(nonNomadContainer.ID) + require.NoError(t, err) + + _, err = client.InspectContainer(handle.containerID) + require.Error(t, err) + require.Contains(t, err.Error(), NoSuchContainerError) + + _, err = client.InspectContainer(untrackedNomadContainer.ID) + require.Error(t, err) + require.Contains(t, err.Error(), NoSuchContainerError) +} + +// TestDanglingContainerRemoval_Stopped asserts stopped containers without +// corresponding tasks are not removed even if after creation grace period. +func TestDanglingContainerRemoval_Stopped(t *testing.T) { + testutil.DockerCompatible(t) + + _, cfg, _ := dockerTask(t) + + client := newTestDockerClient(t) + container, err := client.CreateContainer(docker.CreateContainerOptions{ + Name: "mytest-image-" + uuid.Generate(), + Config: &docker.Config{ + Image: cfg.Image, + Cmd: append([]string{cfg.Command}, cfg.Args...), + Labels: map[string]string{ + dockerLabelAllocID: uuid.Generate(), + }, + }, + }) + require.NoError(t, err) + defer client.RemoveContainer(docker.RemoveContainerOptions{ + ID: container.ID, + Force: true, + }) + + err = client.StartContainer(container.ID, nil) + require.NoError(t, err) + + err = client.StopContainer(container.ID, 60) + require.NoError(t, err) + + dd := dockerDriverHarness(t, nil).Impl().(*Driver) + reconciler := newReconciler(dd) + + // assert nomad container is tracked, and we ignore stopped one + tf := reconciler.trackedContainers() + require.NotContains(t, tf, container.ID) + + untracked, err := reconciler.untrackedContainers(map[string]bool{}, time.Now()) + require.NoError(t, err) + require.NotContains(t, untracked, container.ID) + + // if we start container again, it'll be marked as untracked + require.NoError(t, client.StartContainer(container.ID, nil)) + + untracked, err = reconciler.untrackedContainers(map[string]bool{}, time.Now()) + require.NoError(t, err) + require.Contains(t, untracked, container.ID) +} diff --git a/drivers/docker/test-resources/docker/reconciler_containers_list.json b/drivers/docker/test-resources/docker/reconciler_containers_list.json new file mode 100644 index 000000000..50e3086b7 --- /dev/null +++ b/drivers/docker/test-resources/docker/reconciler_containers_list.json @@ -0,0 +1,116 @@ +[ + { + "Id": "eb23be71498c2dc0254c029f32b360a000caf33157d1c93e226f4c1a4c9d2218", + "Names": [ + "/redis-72bfa388-024e-a903-45b8-2bc28b74ed69" + ], + "Image": "redis:3.2", + "ImageID": "sha256:87856cc39862cec77541d68382e4867d7ccb29a85a17221446c857ddaebca916", + "Command": "docker-entrypoint.sh redis-server", + "Created": 1568383081, + "Ports": [ + { + "PrivatePort": 6379, + "Type": "tcp" + } + ], + "Labels": {}, + "State": "running", + "Status": "Up 9 seconds", + "HostConfig": { + "NetworkMode": "default" + }, + "NetworkSettings": { + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "NetworkID": "6715ed501c1cef14545cd6680f54b4971373ee4441aec2300fff1031c8dbf3a4", + "EndpointID": "ed830b4f2f33ab4134aea941611b00b9e576b35a4325d52bacfedd1e2e1ba213", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "MacAddress": "02:42:ac:11:00:03", + "DriverOpts": null + } + } + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/private/var/folders/r6/346cfqyn76b_lx1nrcl5278c0000gp/T/NomadClient831122597/72bfa388-024e-a903-45b8-2bc28b74ed69/alloc", + "Destination": "/alloc", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "volume", + "Name": "d5d7f0f9a3326414257c57cfca01db96c53a424b43e251516511694554309681", + "Source": "", + "Destination": "/data", + "Driver": "local", + "Mode": "", + "RW": true, + "Propagation": "" + }, + { + "Type": "bind", + "Source": "/private/var/folders/r6/346cfqyn76b_lx1nrcl5278c0000gp/T/NomadClient831122597/72bfa388-024e-a903-45b8-2bc28b74ed69/redis/local", + "Destination": "/local", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/private/var/folders/r6/346cfqyn76b_lx1nrcl5278c0000gp/T/NomadClient831122597/72bfa388-024e-a903-45b8-2bc28b74ed69/redis/secrets", + "Destination": "/secrets", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ] + }, + { + "Id": "99c49fbe999f6df7b7d6a891d69fe57d7b771a30d5d2899a922b44698084e5c9", + "Names": [ + "/serene_keller" + ], + "Image": "ubuntu:16.04", + "ImageID": "sha256:9361ce633ff193349d54bed380a5afe86043b09fd6ea8da7549dbbedfc2a7077", + "Command": "/bin/bash", + "Created": 1567795217, + "Ports": [], + "Labels": {}, + "State": "running", + "Status": "Up 6 days", + "HostConfig": { + "NetworkMode": "default" + }, + "NetworkSettings": { + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "NetworkID": "6715ed501c1cef14545cd6680f54b4971373ee4441aec2300fff1031c8dbf3a4", + "EndpointID": "fab83a0d4089ca9944ca53c882bdf40ad310c6fda30dda0092731feb9bc9fab6", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "MacAddress": "02:42:ac:11:00:02", + "DriverOpts": null + } + } + }, + "Mounts": [] + } +] diff --git a/drivers/shared/executor/executor_linux.go b/drivers/shared/executor/executor_linux.go index df5c5a6b3..f81090a56 100644 --- a/drivers/shared/executor/executor_linux.go +++ b/drivers/shared/executor/executor_linux.go @@ -813,6 +813,15 @@ func cmdDevices(devices []*drivers.DeviceConfig) ([]*lconfigs.Device, error) { return r, nil } +var userMountToUnixMount = map[string]int{ + // Empty string maps to `rprivate` for backwards compatibility in restored + // older tasks, where mount propagation will not be present. + "": unix.MS_PRIVATE | unix.MS_REC, // rprivate + structs.VolumeMountPropagationPrivate: unix.MS_PRIVATE | unix.MS_REC, // rprivate + structs.VolumeMountPropagationHostToTask: unix.MS_SLAVE | unix.MS_REC, // rslave + structs.VolumeMountPropagationBidirectional: unix.MS_SHARED | unix.MS_REC, // rshared +} + // cmdMounts converts a list of driver.MountConfigs into excutor.Mounts. func cmdMounts(mounts []*drivers.MountConfig) []*lconfigs.Mount { if len(mounts) == 0 { @@ -826,11 +835,13 @@ func cmdMounts(mounts []*drivers.MountConfig) []*lconfigs.Mount { if m.Readonly { flags |= unix.MS_RDONLY } + r[i] = &lconfigs.Mount{ - Source: m.HostPath, - Destination: m.TaskPath, - Device: "bind", - Flags: flags, + Source: m.HostPath, + Destination: m.TaskPath, + Device: "bind", + Flags: flags, + PropagationFlags: []int{userMountToUnixMount[m.PropagationMode]}, } } diff --git a/drivers/shared/executor/executor_linux_test.go b/drivers/shared/executor/executor_linux_test.go index c8e07370b..1861ea5ae 100644 --- a/drivers/shared/executor/executor_linux_test.go +++ b/drivers/shared/executor/executor_linux_test.go @@ -467,16 +467,18 @@ func TestExecutor_cmdMounts(t *testing.T) { expected := []*lconfigs.Mount{ { - Source: "/host/path-ro", - Destination: "/task/path-ro", - Flags: unix.MS_BIND | unix.MS_RDONLY, - Device: "bind", + Source: "/host/path-ro", + Destination: "/task/path-ro", + Flags: unix.MS_BIND | unix.MS_RDONLY, + Device: "bind", + PropagationFlags: []int{unix.MS_PRIVATE | unix.MS_REC}, }, { - Source: "/host/path-rw", - Destination: "/task/path-rw", - Flags: unix.MS_BIND, - Device: "bind", + Source: "/host/path-rw", + Destination: "/task/path-rw", + Flags: unix.MS_BIND, + Device: "bind", + PropagationFlags: []int{unix.MS_PRIVATE | unix.MS_REC}, }, } diff --git a/e2e/affinities/input/anti_affinities.nomad b/e2e/affinities/input/anti_affinities.nomad index 6a005f871..97f327d8c 100644 --- a/e2e/affinities/input/anti_affinities.nomad +++ b/e2e/affinities/input/anti_affinities.nomad @@ -1,20 +1,24 @@ job "test1" { datacenters = ["dc1", "dc2"] - type = "service" + type = "service" + affinity { - attribute ="${meta.rack}" - operator = "=" - value = "r1" - weight = -50 + attribute = "${meta.rack}" + operator = "=" + value = "r1" + weight = -50 } + group "test1" { count = 4 + affinity { - attribute ="${node.datacenter}" - operator = "=" - value = "dc1" - weight = -50 + attribute = "${node.datacenter}" + operator = "=" + value = "dc1" + weight = -50 } + task "test" { driver = "raw_exec" @@ -24,4 +28,4 @@ job "test1" { } } } -} \ No newline at end of file +} diff --git a/e2e/affinities/input/multiple_affinities.nomad b/e2e/affinities/input/multiple_affinities.nomad index fbc04334a..94a913a2a 100644 --- a/e2e/affinities/input/multiple_affinities.nomad +++ b/e2e/affinities/input/multiple_affinities.nomad @@ -1,20 +1,24 @@ job "test1" { datacenters = ["dc1", "dc2"] - type = "service" + type = "service" + affinity { - attribute ="${meta.rack}" - operator = "=" - value = "r1" - weight = 100 + attribute = "${meta.rack}" + operator = "=" + value = "r1" + weight = 100 } + group "test1" { count = 4 + affinity { - attribute ="${node.datacenter}" - operator = "=" - value = "dc1" - weight = 100 + attribute = "${node.datacenter}" + operator = "=" + value = "dc1" + weight = 100 } + task "test" { driver = "raw_exec" @@ -24,4 +28,4 @@ job "test1" { } } } -} \ No newline at end of file +} diff --git a/e2e/affinities/input/single_affinity.nomad b/e2e/affinities/input/single_affinity.nomad index 758f0dbb2..58e373660 100644 --- a/e2e/affinities/input/single_affinity.nomad +++ b/e2e/affinities/input/single_affinity.nomad @@ -1,15 +1,17 @@ job "test1" { datacenters = ["dc1", "dc2"] - type = "service" + type = "service" group "test1" { count = 5 + affinity { - attribute ="${node.datacenter}" - operator = "=" - value = "dc1" - weight = 100 + attribute = "${node.datacenter}" + operator = "=" + value = "dc1" + weight = 100 } + task "test" { driver = "raw_exec" @@ -19,4 +21,4 @@ job "test1" { } } } -} \ No newline at end of file +} diff --git a/e2e/allocstats/input/raw_exec.nomad b/e2e/allocstats/input/raw_exec.nomad index 7c158c4d0..c88959f8b 100644 --- a/e2e/allocstats/input/raw_exec.nomad +++ b/e2e/allocstats/input/raw_exec.nomad @@ -3,15 +3,15 @@ job "test_raw" { type = "service" group "test" { - count = 1 + count = 1 task "test1" { driver = "raw_exec" config { command = "bash" - args = ["-c", "var=10000;while true; do a=$(awk -v x=$var 'BEGIN{print sqrt(x)}'); ((var++)); done" ] - } + args = ["-c", "var=10000;while true; do a=$(awk -v x=$var 'BEGIN{print sqrt(x)}'); ((var++)); done"] + } } -} + } } diff --git a/e2e/clientstate/restarter.nomad b/e2e/clientstate/restarter.nomad index bf139707a..02e2fcc63 100644 --- a/e2e/clientstate/restarter.nomad +++ b/e2e/clientstate/restarter.nomad @@ -4,13 +4,16 @@ job "restarter" { datacenters = ["dc1"] + group "restarter" { restart { attempts = 100 delay = "3s" } + task "restarter" { driver = "raw_exec" + config { command = "/bin/bash" args = ["-c", "echo $$ >> pid && sleep 1 && exit 99"] diff --git a/e2e/clientstate/sleeper.nomad b/e2e/clientstate/sleeper.nomad index 9ae04f0f7..c45e12356 100644 --- a/e2e/clientstate/sleeper.nomad +++ b/e2e/clientstate/sleeper.nomad @@ -3,8 +3,10 @@ job "sleeper" { datacenters = ["dc1"] + task "sleeper" { driver = "raw_exec" + config { command = "/bin/bash" args = ["-c", "echo $$ >> pid && sleep 999999"] diff --git a/e2e/consul/input/canary_tags.nomad b/e2e/consul/input/canary_tags.nomad index da98db490..eb48e1d7a 100644 --- a/e2e/consul/input/canary_tags.nomad +++ b/e2e/consul/input/canary_tags.nomad @@ -13,8 +13,8 @@ job "consul_canary_test" { } service { - name = "canarytest" - tags = ["foo", "bar"] + name = "canarytest" + tags = ["foo", "bar"] canary_tags = ["foo", "canary"] } } diff --git a/e2e/consul/input/consul_example.nomad b/e2e/consul/input/consul_example.nomad index 243abc1c9..18b02be7c 100644 --- a/e2e/consul/input/consul_example.nomad +++ b/e2e/consul/input/consul_example.nomad @@ -1,30 +1,31 @@ job "consul-example" { datacenters = ["dc1"] - type = "service" + type = "service" update { - max_parallel = 1 - min_healthy_time = "10s" - healthy_deadline = "3m" + max_parallel = 1 + min_healthy_time = "10s" + healthy_deadline = "3m" progress_deadline = "10m" - auto_revert = false - canary = 0 + auto_revert = false + canary = 0 } migrate { - max_parallel = 1 - health_check = "checks" + max_parallel = 1 + health_check = "checks" min_healthy_time = "10s" healthy_deadline = "5m" } + group "cache" { count = 3 restart { attempts = 2 interval = "30m" - delay = "15s" - mode = "fail" + delay = "15s" + mode = "fail" } ephemeral_disk { @@ -33,18 +34,22 @@ job "consul-example" { task "redis" { driver = "docker" + config { image = "redis:3.2" + port_map { db = 6379 } } + resources { cpu = 500 # 500 MHz memory = 256 # 256MB + network { mbits = 10 - port "db" {} + port "db" {} } } @@ -52,6 +57,7 @@ job "consul-example" { name = "redis-cache" tags = ["global", "cache"] port = "db" + check { name = "alive" type = "tcp" @@ -61,4 +67,4 @@ job "consul-example" { } } } -} \ No newline at end of file +} diff --git a/e2e/deployment/input/deployment_auto0.nomad b/e2e/deployment/input/deployment_auto0.nomad index 454a818b9..403d500d0 100644 --- a/e2e/deployment/input/deployment_auto0.nomad +++ b/e2e/deployment/input/deployment_auto0.nomad @@ -7,21 +7,22 @@ job "deployment_auto.nomad" { update { max_parallel = 3 auto_promote = true - canary = 2 + canary = 2 } task "one" { driver = "raw_exec" config { - command = "/bin/sleep" - # change args to update the job, the only changes - args = ["1000000"] + command = "/bin/sleep" + + # change args to update the job, the only changes + args = ["1000000"] } resources { - cpu = 20 - memory = 20 + cpu = 20 + memory = 20 } } } @@ -30,9 +31,9 @@ job "deployment_auto.nomad" { count = 3 update { - max_parallel = 2 - auto_promote = true - canary = 2 + max_parallel = 2 + auto_promote = true + canary = 2 min_healthy_time = "2s" } @@ -40,14 +41,15 @@ job "deployment_auto.nomad" { driver = "raw_exec" config { - command = "/bin/sleep" - # change args to update the job, the only changes - args = ["2000000"] + command = "/bin/sleep" + + # change args to update the job, the only changes + args = ["2000000"] } resources { - cpu = 20 - memory = 20 + cpu = 20 + memory = 20 } } } diff --git a/e2e/deployment/input/deployment_auto1.nomad b/e2e/deployment/input/deployment_auto1.nomad index 415e26e32..597c32b79 100644 --- a/e2e/deployment/input/deployment_auto1.nomad +++ b/e2e/deployment/input/deployment_auto1.nomad @@ -7,21 +7,22 @@ job "deployment_auto.nomad" { update { max_parallel = 3 auto_promote = true - canary = 2 + canary = 2 } task "one" { driver = "raw_exec" config { - command = "/bin/sleep" - # change args to update the job, the only changes - args = ["1000001"] + command = "/bin/sleep" + + # change args to update the job, the only changes + args = ["1000001"] } resources { - cpu = 20 - memory = 20 + cpu = 20 + memory = 20 } } } @@ -30,9 +31,9 @@ job "deployment_auto.nomad" { count = 3 update { - max_parallel = 2 - auto_promote = true - canary = 2 + max_parallel = 2 + auto_promote = true + canary = 2 min_healthy_time = "2s" } @@ -40,14 +41,15 @@ job "deployment_auto.nomad" { driver = "raw_exec" config { - command = "/bin/sleep" - # change args to update the job, the only changes - args = ["2000001"] + command = "/bin/sleep" + + # change args to update the job, the only changes + args = ["2000001"] } resources { - cpu = 20 - memory = 20 + cpu = 20 + memory = 20 } } } diff --git a/e2e/fabio/fabio.nomad b/e2e/fabio/fabio.nomad index 238ac5546..c9e7cf283 100644 --- a/e2e/fabio/fabio.nomad +++ b/e2e/fabio/fabio.nomad @@ -1,23 +1,27 @@ job "fabio" { datacenters = ["dc1", "dc2"] - type = "system" + type = "system" group "fabio" { task "fabio" { driver = "docker" + config { - image = "fabiolb/fabio" + image = "fabiolb/fabio" network_mode = "host" } resources { cpu = 100 memory = 64 + network { mbits = 20 + port "lb" { static = 9999 } + port "ui" { static = 9998 } diff --git a/e2e/metrics/input/cpustress.nomad b/e2e/metrics/input/cpustress.nomad index 1c0eef793..b4ea68c18 100644 --- a/e2e/metrics/input/cpustress.nomad +++ b/e2e/metrics/input/cpustress.nomad @@ -1,27 +1,33 @@ job "cpustress" { datacenters = ["dc1", "dc2"] - type = "batch" + type = "batch" + group "cpustress" { count = 1 + restart { - mode = "fail" + mode = "fail" attempts = 0 } + reschedule { - attempts = 3 - interval = "10m" + attempts = 3 + interval = "10m" unlimited = false } + task "cpustress" { driver = "docker" config { image = "progrium/stress" - args = [ - "-c", "4", - "-t", "600" - ] + args = [ + "-c", + "4", + "-t", + "600", + ] } resources { @@ -30,4 +36,4 @@ job "cpustress" { } } } -} \ No newline at end of file +} diff --git a/e2e/metrics/input/diskstress.nomad b/e2e/metrics/input/diskstress.nomad index b937efb7e..b3c3af048 100644 --- a/e2e/metrics/input/diskstress.nomad +++ b/e2e/metrics/input/diskstress.nomad @@ -1,32 +1,39 @@ job "diskstress" { datacenters = ["dc1", "dc2"] - type = "batch" + type = "batch" + group "diskstress" { count = 1 + restart { - mode = "fail" + mode = "fail" attempts = 0 } + reschedule { - attempts = 3 - interval = "10m" + attempts = 3 + interval = "10m" unlimited = false } + task "diskstress" { driver = "docker" config { image = "progrium/stress" - args = [ - "-d", "2", - "-t", "30" - ] + args = [ + "-d", + "2", + "-t", + "30", + ] } + resources { cpu = 4096 memory = 256 } } } -} \ No newline at end of file +} diff --git a/e2e/metrics/input/helloworld.nomad b/e2e/metrics/input/helloworld.nomad index 8b7630fd1..bd8cfb443 100644 --- a/e2e/metrics/input/helloworld.nomad +++ b/e2e/metrics/input/helloworld.nomad @@ -2,13 +2,12 @@ job "hello" { datacenters = ["dc1"] update { - max_parallel = 1 + max_parallel = 1 min_healthy_time = "15s" - auto_revert = true + auto_revert = true } group "hello" { - count = 3 task "hello" { @@ -19,17 +18,18 @@ job "hello" { } artifact { - source = "https://nomad-community-demo.s3.amazonaws.com/hellov1" + source = "https://nomad-community-demo.s3.amazonaws.com/hellov1" destination = "local/hello" - mode = "file" + mode = "file" } resources { cpu = 500 memory = 256 + network { mbits = 10 - port "web" {} + port "web" {} } } @@ -37,6 +37,7 @@ job "hello" { name = "hello" tags = ["urlprefix-hello/"] port = "web" + check { name = "alive" type = "http" diff --git a/e2e/metrics/input/memstress.nomad b/e2e/metrics/input/memstress.nomad index 6a051a869..f276bdf72 100644 --- a/e2e/metrics/input/memstress.nomad +++ b/e2e/metrics/input/memstress.nomad @@ -1,32 +1,39 @@ job "memstress" { datacenters = ["dc1", "dc2"] - type = "batch" + type = "batch" + group "memstress" { count = 1 + restart { - mode = "fail" + mode = "fail" attempts = 0 } + reschedule { - attempts = 3 - interval = "10m" + attempts = 3 + interval = "10m" unlimited = false } + task "memstress" { driver = "docker" config { image = "progrium/stress" - args = [ - "-m", "2", - "-t", "120" - ] + args = [ + "-m", + "2", + "-t", + "120", + ] } + resources { cpu = 4096 memory = 1024 } } } -} \ No newline at end of file +} diff --git a/e2e/metrics/input/redis.nomad b/e2e/metrics/input/redis.nomad index 3587e8f34..27d8a5d84 100644 --- a/e2e/metrics/input/redis.nomad +++ b/e2e/metrics/input/redis.nomad @@ -3,26 +3,31 @@ job "redis" { group "cache" { count = 4 + update { - max_parallel = 1 - min_healthy_time = "5s" - healthy_deadline = "30s" + max_parallel = 1 + min_healthy_time = "5s" + healthy_deadline = "30s" progress_deadline = "1m" } + restart { - mode = "fail" + mode = "fail" attempts = 0 } + reschedule { - attempts = 3 - interval = "10m" + attempts = 3 + interval = "10m" unlimited = false } + task "redis" { driver = "docker" config { image = "redis:4.0" + port_map { db = 6379 } @@ -31,9 +36,10 @@ job "redis" { resources { cpu = 500 memory = 256 + network { mbits = 10 - port "db" {} + port "db" {} } } @@ -41,6 +47,7 @@ job "redis" { name = "redis-cache" tags = ["global", "cache"] port = "db" + check { name = "alive" type = "tcp" @@ -50,4 +57,4 @@ job "redis" { } } } -} \ No newline at end of file +} diff --git a/e2e/metrics/input/simpleweb.nomad b/e2e/metrics/input/simpleweb.nomad index c1ffcbd71..352f89bb0 100644 --- a/e2e/metrics/input/simpleweb.nomad +++ b/e2e/metrics/input/simpleweb.nomad @@ -1,9 +1,8 @@ job "nginx" { datacenters = ["dc1"] - type = "system" + type = "system" group "simpleweb" { - update { stagger = "5s" max_parallel = 1 @@ -29,8 +28,7 @@ job "nginx" { network { mbits = 1 - port "http" { - } + port "http"{} } } @@ -49,4 +47,3 @@ job "nginx" { } } } - diff --git a/e2e/nomad09upgrade/docker.nomad b/e2e/nomad09upgrade/docker.nomad index 00c15291f..5d63c7923 100644 --- a/e2e/nomad09upgrade/docker.nomad +++ b/e2e/nomad09upgrade/docker.nomad @@ -16,4 +16,3 @@ job "sleep" { } } } - diff --git a/e2e/nomad09upgrade/exec.nomad b/e2e/nomad09upgrade/exec.nomad index 046e3a9fa..73e09d9e5 100644 --- a/e2e/nomad09upgrade/exec.nomad +++ b/e2e/nomad09upgrade/exec.nomad @@ -7,7 +7,7 @@ job "sleep" { config { command = "sleep" - args = ["10000"] + args = ["10000"] } resources { @@ -17,4 +17,3 @@ job "sleep" { } } } - diff --git a/e2e/nomad09upgrade/rawexec.nomad b/e2e/nomad09upgrade/rawexec.nomad index 75fd5aefa..0d8e89657 100644 --- a/e2e/nomad09upgrade/rawexec.nomad +++ b/e2e/nomad09upgrade/rawexec.nomad @@ -7,7 +7,7 @@ job "sleep" { config { command = "sleep" - args = ["10000"] + args = ["10000"] } resources { @@ -17,4 +17,3 @@ job "sleep" { } } } - diff --git a/e2e/nomadexec/testdata/docker.nomad b/e2e/nomadexec/testdata/docker.nomad index acf3dc9c9..f25273151 100644 --- a/e2e/nomadexec/testdata/docker.nomad +++ b/e2e/nomadexec/testdata/docker.nomad @@ -6,9 +6,9 @@ job "nomadexec-docker" { driver = "docker" config { - image = "busybox:1.29.2" + image = "busybox:1.29.2" command = "/bin/sleep" - args = ["1000"] + args = ["1000"] } resources { @@ -17,4 +17,4 @@ job "nomadexec-docker" { } } } -} \ No newline at end of file +} diff --git a/e2e/prometheus/prometheus.nomad b/e2e/prometheus/prometheus.nomad index b9878a344..c32d45d33 100644 --- a/e2e/prometheus/prometheus.nomad +++ b/e2e/prometheus/prometheus.nomad @@ -1,15 +1,17 @@ job "prometheus" { datacenters = ["dc1", "dc2"] - type = "service" + type = "service" group "monitoring" { count = 1 + restart { attempts = 2 interval = "30m" - delay = "15s" - mode = "fail" + delay = "15s" + mode = "fail" } + ephemeral_disk { size = 300 } @@ -18,6 +20,7 @@ job "prometheus" { template { change_mode = "noop" destination = "local/prometheus.yml" + data = < consul.zip -sudo unzip consul.zip -d /usr/local/bin +curl -L -o /tmp/consul.zip $CONSULDOWNLOAD +sudo unzip /tmp/consul.zip -d /usr/local/bin sudo chmod 0755 /usr/local/bin/consul sudo chown root:root /usr/local/bin/consul @@ -54,8 +60,8 @@ sudo mkdir -p $CONSULDIR sudo chmod 755 $CONSULDIR echo "Install Vault" -curl -L $VAULTDOWNLOAD > vault.zip -sudo unzip vault.zip -d /usr/local/bin +curl -L -o /tmp/vault.zip $VAULTDOWNLOAD +sudo unzip /tmp/vault.zip -d /usr/local/bin sudo chmod 0755 /usr/local/bin/vault sudo chown root:root /usr/local/bin/vault @@ -66,8 +72,8 @@ sudo mkdir -p $VAULTDIR sudo chmod 755 $VAULTDIR echo "Install Nomad" -curl -L $NOMADDOWNLOAD > nomad.zip -sudo unzip nomad.zip -d /usr/local/bin +curl -L -o /tmp/nomad.zip $NOMADDOWNLOAD +sudo unzip /tmp/nomad.zip -d /usr/local/bin sudo chmod 0755 /usr/local/bin/nomad sudo chown root:root /usr/local/bin/nomad diff --git a/e2e/terraform/packer/packer.json b/e2e/terraform/packer/packer.json new file mode 100644 index 000000000..da828c17d --- /dev/null +++ b/e2e/terraform/packer/packer.json @@ -0,0 +1,25 @@ +{ + "builders": [ + { + "type": "amazon-ebs", + "region": "us-east-1", + "source_ami": "ami-80861296", + "instance_type": "t2.medium", + "ssh_username": "ubuntu", + "iam_instance_profile": "packer-builder", + "ami_name": "nomad-e2e-{{timestamp}}", + "ami_groups": [ + "all" + ], + "tags": { + "OS": "Ubuntu" + } + } + ], + "provisioners": [ + { + "type": "shell", + "script": "./linux/setup.sh" + } + ] +} diff --git a/e2e/terraform/shared/README.md b/e2e/terraform/shared/README.md new file mode 100644 index 000000000..899aaba3a --- /dev/null +++ b/e2e/terraform/shared/README.md @@ -0,0 +1,10 @@ +# Terraform Provisioning + +These scripts are copied up to instances via Terraform provisioning and executed after launch. This allows us to update the Nomad configurations for features that land on master without having to re-bake AMIs. + +## What goes here? + +* steps that are specific to a given Nomad build: ex. all Nomad configuration files. +* steps that are specific to a given EC2 instance: configuring IP addresses. + +These scripts *should* be idempotent: copy configurations from `/ops/shared` to their destinations where the services expect them to be, rather than moving them. diff --git a/e2e/terraform/shared/config/provision-client.sh b/e2e/terraform/shared/config/provision-client.sh new file mode 100644 index 000000000..ad5a645b0 --- /dev/null +++ b/e2e/terraform/shared/config/provision-client.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# installs and configures the desired build of Nomad as a server +set -o errexit +set -o nounset + +CONFIGDIR=/ops/shared/config + +HADOOP_VERSION=hadoop-2.7.7 +HADOOPCONFIGDIR=/usr/local/$HADOOP_VERSION/etc/hadoop +HOME_DIR=ubuntu + +IP_ADDRESS=$(/usr/local/bin/sockaddr eval 'GetPrivateIP') +DOCKER_BRIDGE_IP_ADDRESS=$(/usr/local/bin/sockaddr eval 'GetInterfaceIP "docker0"') + +CLOUD="$1" +NOMAD_SHA="$2" +NOMAD_CONFIG="$3" + +# Consul +CONSUL_SRC=/ops/shared/consul +CONSUL_DEST=/etc/consul.d + +sudo cp "$CONSUL_SRC/base.json" "$CONSUL_DEST/" +sudo cp "$CONSUL_SRC/retry_$CLOUD.json" "$CONSUL_DEST/" +sudo cp "$CONSUL_SRC/consul_$CLOUD.service" /etc/systemd/system/consul.service + +sudo systemctl enable consul.service +sudo systemctl start consul.service +sleep 10 + +# Add hostname to /etc/hosts +echo "127.0.0.1 $(hostname)" | sudo tee --append /etc/hosts + +# Add Docker bridge network IP to /etc/resolv.conf (at the top) +echo "nameserver $DOCKER_BRIDGE_IP_ADDRESS" | sudo tee /etc/resolv.conf.new +cat /etc/resolv.conf | sudo tee --append /etc/resolv.conf.new +sudo mv /etc/resolv.conf.new /etc/resolv.conf + +# Hadoop config file to enable HDFS CLI +sudo cp $CONFIGDIR/core-site.xml $HADOOPCONFIGDIR + +# Move examples directory to $HOME +sudo mv /ops/examples /home/$HOME_DIR +sudo chown -R $HOME_DIR:$HOME_DIR /home/$HOME_DIR/examples +sudo chmod -R 775 /home/$HOME_DIR/examples + +# Set env vars for tool CLIs +echo "export NOMAD_ADDR=http://$IP_ADDRESS:4646" | sudo tee --append /home/$HOME_DIR/.bashrc +echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre" | sudo tee --append /home/$HOME_DIR/.bashrc + +# Update PATH +echo "export PATH=$PATH:/usr/local/bin/spark/bin:/usr/local/$HADOOP_VERSION/bin" | sudo tee --append /home/$HOME_DIR/.bashrc + +# Nomad + +NOMAD_SRC=/ops/shared/nomad +NOMAD_DEST=/etc/nomad.d +NOMAD_CONFIG_FILENAME=$(basename "$NOMAD_CONFIG") + +# download +aws s3 cp "s3://nomad-team-test-binary/builds-oss/nomad_linux_amd64_${NOMAD_SHA}.tar.gz" nomad.tar.gz + +# unpack and install +sudo tar -zxvf nomad.tar.gz -C /usr/local/bin/ +sudo chmod 0755 /usr/local/bin/nomad +sudo chown root:root /usr/local/bin/nomad + +sudo cp "$NOMAD_SRC/base.hcl" "$NOMAD_DEST/" +sudo cp "$NOMAD_SRC/$NOMAD_CONFIG" "$NOMAD_DEST/$NOMAD_CONFIG_FILENAME" + +# Setup Host Volumes +sudo mkdir /tmp/data + +# Install CNI plugins +sudo mkdir -p /opt/cni/bin +wget -q -O - \ + https://github.com/containernetworking/plugins/releases/download/v0.8.2/cni-plugins-linux-amd64-v0.8.2.tgz \ + | sudo tar -C /opt/cni/bin -xz + +# enable as a systemd service +sudo cp "$NOMAD_SRC/nomad.service" /etc/systemd/system/nomad.service +sudo systemctl enable nomad.service +sudo systemctl start nomad.service diff --git a/e2e/terraform/shared/config/provision-server.sh b/e2e/terraform/shared/config/provision-server.sh new file mode 100644 index 000000000..56eb33b20 --- /dev/null +++ b/e2e/terraform/shared/config/provision-server.sh @@ -0,0 +1,96 @@ +#!/bin/bash +# installs and configures the desired build of Nomad as a server +set -o errexit +set -o nounset + +CONFIGDIR=/ops/shared/config + +HADOOP_VERSION=hadoop-2.7.7 +HADOOPCONFIGDIR=/usr/local/$HADOOP_VERSION/etc/hadoop +HOME_DIR=ubuntu + +IP_ADDRESS=$(/usr/local/bin/sockaddr eval 'GetPrivateIP') +DOCKER_BRIDGE_IP_ADDRESS=$(/usr/local/bin/sockaddr eval 'GetInterfaceIP "docker0"') + +CLOUD="$1" +SERVER_COUNT="$2" +NOMAD_SHA="$3" +NOMAD_CONFIG="$4" + +# Consul +CONSUL_SRC=/ops/shared/consul +CONSUL_DEST=/etc/consul.d + +sed "s/SERVER_COUNT/$SERVER_COUNT/g" "$CONSUL_SRC/server.json" > /tmp/server.json +sudo mv /tmp/server.json "$CONSUL_DEST/server.json" +sudo cp "$CONSUL_SRC/base.json" "$CONSUL_DEST/" +sudo cp "$CONSUL_SRC/retry_$CLOUD.json" "$CONSUL_DEST/" +sudo cp "$CONSUL_SRC/consul_$CLOUD.service" /etc/systemd/system/consul.service + +sudo systemctl enable consul.service +sudo systemctl start consul.service +sleep 10 +export CONSUL_HTTP_ADDR=$IP_ADDRESS:8500 +export CONSUL_RPC_ADDR=$IP_ADDRESS:8400 + +# Vault +VAULT_SRC=/ops/shared/vault +VAULT_DEST=/etc/vault.d + +sudo cp "$VAULT_SRC/vault.hcl" "$VAULT_DEST" +sudo cp "$VAULT_SRC/vault.service" /etc/systemd/system/vault.service + +sudo systemctl enable vault.service +sudo systemctl start vault.service + +# Add hostname to /etc/hosts +echo "127.0.0.1 $(hostname)" | sudo tee --append /etc/hosts + +# Add Docker bridge network IP to /etc/resolv.conf (at the top) + +echo "nameserver $DOCKER_BRIDGE_IP_ADDRESS" | sudo tee /etc/resolv.conf.new +cat /etc/resolv.conf | sudo tee --append /etc/resolv.conf.new +sudo mv /etc/resolv.conf.new /etc/resolv.conf + +# Hadoop +sudo cp $CONFIGDIR/core-site.xml $HADOOPCONFIGDIR + +# Move examples directory to $HOME +sudo mv /ops/examples /home/$HOME_DIR +sudo chown -R $HOME_DIR:$HOME_DIR /home/$HOME_DIR/examples +sudo chmod -R 775 /home/$HOME_DIR/examples + +# Set env vars for tool CLIs +echo "export CONSUL_RPC_ADDR=$IP_ADDRESS:8400" | sudo tee --append /home/$HOME_DIR/.bashrc +echo "export CONSUL_HTTP_ADDR=$IP_ADDRESS:8500" | sudo tee --append /home/$HOME_DIR/.bashrc +echo "export VAULT_ADDR=http://$IP_ADDRESS:8200" | sudo tee --append /home/$HOME_DIR/.bashrc +echo "export NOMAD_ADDR=http://$IP_ADDRESS:4646" | sudo tee --append /home/$HOME_DIR/.bashrc +echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre" | sudo tee --append /home/$HOME_DIR/.bashrc + +# Update PATH +echo "export PATH=$PATH:/usr/local/bin/spark/bin:/usr/local/$HADOOP_VERSION/bin" | sudo tee --append /home/$HOME_DIR/.bashrc + +# Nomad + +NOMAD_SRC=/ops/shared/nomad +NOMAD_DEST=/etc/nomad.d +NOMAD_CONFIG_FILENAME=$(basename "$NOMAD_CONFIG") + +# download +aws s3 cp "s3://nomad-team-test-binary/builds-oss/nomad_linux_amd64_${NOMAD_SHA}.tar.gz" nomad.tar.gz + +# unpack and install +sudo tar -zxvf nomad.tar.gz -C /usr/local/bin/ +sudo chmod 0755 /usr/local/bin/nomad +sudo chown root:root /usr/local/bin/nomad + +sudo cp "$NOMAD_SRC/base.hcl" "$NOMAD_DEST/" + +sed "s/3 # SERVER_COUNT/$SERVER_COUNT/g" "$NOMAD_SRC/$NOMAD_CONFIG" \ + > "/tmp/$NOMAD_CONFIG_FILENAME" +sudo mv "/tmp/$NOMAD_CONFIG_FILENAME" "$NOMAD_DEST/$NOMAD_CONFIG_FILENAME" + +# enable as a systemd service +sudo cp "$NOMAD_SRC/nomad.service" /etc/systemd/system/nomad.service +sudo systemctl enable nomad.service +sudo systemctl start nomad.service diff --git a/e2e/terraform/shared/config/vault.hcl b/e2e/terraform/shared/config/vault.hcl deleted file mode 100644 index eaaa4dfcb..000000000 --- a/e2e/terraform/shared/config/vault.hcl +++ /dev/null @@ -1,12 +0,0 @@ -backend "consul" { - path = "vault/" - address = "IP_ADDRESS:8500" - cluster_addr = "https://IP_ADDRESS:8201" - redirect_addr = "http://IP_ADDRESS:8200" -} - -listener "tcp" { - address = "IP_ADDRESS:8200" - cluster_address = "IP_ADDRESS:8201" - tls_disable = 1 -} diff --git a/e2e/terraform/shared/consul/base.json b/e2e/terraform/shared/consul/base.json new file mode 100644 index 000000000..763eb06ad --- /dev/null +++ b/e2e/terraform/shared/consul/base.json @@ -0,0 +1,13 @@ +{ + "log_level": "INFO", + "data_dir": "/opt/consul/data", + "bind_addr": "0.0.0.0", + "client_addr": "0.0.0.0", + "advertise_addr": "{{ GetPrivateIP }}", + "connect": { + "enabled": true + }, + "ports": { + "grpc": 8502 + } +} diff --git a/e2e/terraform/shared/config/consul.json b/e2e/terraform/shared/consul/consul.json similarity index 88% rename from e2e/terraform/shared/config/consul.json rename to e2e/terraform/shared/consul/consul.json index 7edf0b153..dd432350f 100644 --- a/e2e/terraform/shared/config/consul.json +++ b/e2e/terraform/shared/consul/consul.json @@ -5,7 +5,7 @@ "data_dir": "/opt/consul/data", "bind_addr": "0.0.0.0", "client_addr": "0.0.0.0", - "advertise_addr": "IP_ADDRESS", + "advertise_addr": "{{ GetPrivateIP }}", "bootstrap_expect": SERVER_COUNT, "service": { "name": "consul" diff --git a/e2e/terraform/shared/config/consul_aws.service b/e2e/terraform/shared/consul/consul_aws.service similarity index 100% rename from e2e/terraform/shared/config/consul_aws.service rename to e2e/terraform/shared/consul/consul_aws.service diff --git a/e2e/terraform/shared/config/consul_azure.service b/e2e/terraform/shared/consul/consul_azure.service similarity index 100% rename from e2e/terraform/shared/config/consul_azure.service rename to e2e/terraform/shared/consul/consul_azure.service diff --git a/e2e/terraform/shared/config/consul_client.json b/e2e/terraform/shared/consul/consul_client.json similarity index 84% rename from e2e/terraform/shared/config/consul_client.json rename to e2e/terraform/shared/consul/consul_client.json index a261b5a5d..8deed32f0 100644 --- a/e2e/terraform/shared/config/consul_client.json +++ b/e2e/terraform/shared/consul/consul_client.json @@ -4,7 +4,7 @@ "data_dir": "/opt/consul/data", "bind_addr": "0.0.0.0", "client_addr": "0.0.0.0", - "advertise_addr": "IP_ADDRESS", + "advertise_addr": "{{ GetPrivateIP }}", "retry_join": ["RETRY_JOIN"], "connect": { "enabled": true diff --git a/e2e/terraform/shared/consul/retry_aws.json b/e2e/terraform/shared/consul/retry_aws.json new file mode 100644 index 000000000..a080caf7a --- /dev/null +++ b/e2e/terraform/shared/consul/retry_aws.json @@ -0,0 +1,3 @@ +{ + "retry_join": ["provider=aws tag_key=ConsulAutoJoin tag_value=auto-join"] +} diff --git a/e2e/terraform/shared/consul/retry_azure.json b/e2e/terraform/shared/consul/retry_azure.json new file mode 100644 index 000000000..9b1a3ea04 --- /dev/null +++ b/e2e/terraform/shared/consul/retry_azure.json @@ -0,0 +1,3 @@ +{ + "retry_join": ["provider=azure tag_key=ConsulAutoJoin tag_value=auto-join"] +} diff --git a/e2e/terraform/shared/consul/server.json b/e2e/terraform/shared/consul/server.json new file mode 100644 index 000000000..670a5c5e5 --- /dev/null +++ b/e2e/terraform/shared/consul/server.json @@ -0,0 +1,8 @@ +{ + "server": true, + "ui": true, + "bootstrap_expect": SERVER_COUNT, + "service": { + "name": "consul" + } +} diff --git a/e2e/terraform/configs/indexed/client-1.hcl b/e2e/terraform/shared/nomad/base.hcl similarity index 56% rename from e2e/terraform/configs/indexed/client-1.hcl rename to e2e/terraform/shared/nomad/base.hcl index fcd1a1ffa..00eee928c 100644 --- a/e2e/terraform/configs/indexed/client-1.hcl +++ b/e2e/terraform/shared/nomad/base.hcl @@ -6,29 +6,10 @@ data_dir = "/opt/nomad/data" bind_addr = "0.0.0.0" -# Enable the client -client { - enabled = true - - options { - "driver.raw_exec.enable" = "1" - "docker.privileged.enabled" = "true" - } - - meta { - "rack" = "r2" - } -} - consul { address = "127.0.0.1:8500" } -vault { - enabled = true - address = "http://active.vault.service.consul:8200" -} - telemetry { collection_interval = "1s" disable_hostname = true diff --git a/e2e/terraform/configs/client.hcl b/e2e/terraform/shared/nomad/client.hcl similarity index 52% rename from e2e/terraform/configs/client.hcl rename to e2e/terraform/shared/nomad/client.hcl index 60189ea0c..9b20cffb4 100644 --- a/e2e/terraform/configs/client.hcl +++ b/e2e/terraform/shared/nomad/client.hcl @@ -1,12 +1,3 @@ -enable_debug = true - -log_level = "DEBUG" - -data_dir = "/opt/nomad/data" - -bind_addr = "0.0.0.0" - -# Enable the client client { enabled = true @@ -26,19 +17,7 @@ client { } } -consul { - address = "127.0.0.1:8500" -} - vault { enabled = true address = "http://active.vault.service.consul:8200" } - -telemetry { - collection_interval = "1s" - disable_hostname = true - prometheus_metrics = true - publish_allocation_metrics = true - publish_node_metrics = true -} diff --git a/e2e/terraform/shared/nomad/indexed/client-0.hcl b/e2e/terraform/shared/nomad/indexed/client-0.hcl new file mode 100644 index 000000000..127272508 --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/client-0.hcl @@ -0,0 +1,22 @@ +# Enable the client +client { + enabled = true + + options { + "driver.raw_exec.enable" = "1" + "docker.privileged.enabled" = "true" + } + + meta { + "rack" = "r1" + } + + host_volume "shared_data" { + path = "/tmp/data" + } +} + +vault { + enabled = true + address = "http://active.vault.service.consul:8200" +} diff --git a/e2e/terraform/shared/nomad/indexed/client-1.hcl b/e2e/terraform/shared/nomad/indexed/client-1.hcl new file mode 100644 index 000000000..ddc9e0bbd --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/client-1.hcl @@ -0,0 +1,17 @@ +client { + enabled = true + + options { + "driver.raw_exec.enable" = "1" + "docker.privileged.enabled" = "true" + } + + meta { + "rack" = "r2" + } +} + +vault { + enabled = true + address = "http://active.vault.service.consul:8200" +} diff --git a/e2e/terraform/shared/nomad/indexed/client-2.hcl b/e2e/terraform/shared/nomad/indexed/client-2.hcl new file mode 100644 index 000000000..3501dc79a --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/client-2.hcl @@ -0,0 +1,19 @@ +datacenter = "dc2" + +client { + enabled = true + + options { + "driver.raw_exec.enable" = "1" + "docker.privileged.enabled" = "true" + } + + meta { + "rack" = "r1" + } +} + +vault { + enabled = true + address = "http://active.vault.service.consul:8200" +} diff --git a/e2e/terraform/shared/nomad/indexed/client-3.hcl b/e2e/terraform/shared/nomad/indexed/client-3.hcl new file mode 100644 index 000000000..627265b39 --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/client-3.hcl @@ -0,0 +1,19 @@ +datacenter = "dc2" + +client { + enabled = true + + options { + "driver.raw_exec.enable" = "1" + "docker.privileged.enabled" = "true" + } + + meta { + "rack" = "r2" + } +} + +vault { + enabled = true + address = "http://active.vault.service.consul:8200" +} diff --git a/e2e/terraform/shared/nomad/indexed/server-0.hcl b/e2e/terraform/shared/nomad/indexed/server-0.hcl new file mode 100644 index 000000000..a3cf54410 --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/server-0.hcl @@ -0,0 +1,14 @@ +server { + enabled = true + + # this value will be overwritten during provisioning + bootstrap_expect = 3 # SERVER_COUNT +} + +vault { + enabled = false + address = "http://active.vault.service.consul:8200" + task_token_ttl = "1h" + create_from_role = "nomad-cluster" + token = "" +} diff --git a/e2e/terraform/shared/nomad/indexed/server-1.hcl b/e2e/terraform/shared/nomad/indexed/server-1.hcl new file mode 100644 index 000000000..a3cf54410 --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/server-1.hcl @@ -0,0 +1,14 @@ +server { + enabled = true + + # this value will be overwritten during provisioning + bootstrap_expect = 3 # SERVER_COUNT +} + +vault { + enabled = false + address = "http://active.vault.service.consul:8200" + task_token_ttl = "1h" + create_from_role = "nomad-cluster" + token = "" +} diff --git a/e2e/terraform/shared/nomad/indexed/server-2.hcl b/e2e/terraform/shared/nomad/indexed/server-2.hcl new file mode 100644 index 000000000..a3cf54410 --- /dev/null +++ b/e2e/terraform/shared/nomad/indexed/server-2.hcl @@ -0,0 +1,14 @@ +server { + enabled = true + + # this value will be overwritten during provisioning + bootstrap_expect = 3 # SERVER_COUNT +} + +vault { + enabled = false + address = "http://active.vault.service.consul:8200" + task_token_ttl = "1h" + create_from_role = "nomad-cluster" + token = "" +} diff --git a/e2e/terraform/shared/config/nomad.service b/e2e/terraform/shared/nomad/nomad.service similarity index 100% rename from e2e/terraform/shared/config/nomad.service rename to e2e/terraform/shared/nomad/nomad.service diff --git a/e2e/terraform/shared/nomad/server.hcl b/e2e/terraform/shared/nomad/server.hcl new file mode 100644 index 000000000..b739d08a7 --- /dev/null +++ b/e2e/terraform/shared/nomad/server.hcl @@ -0,0 +1,12 @@ +server { + enabled = true + bootstrap_expect = 3 +} + +vault { + enabled = false + address = "http://active.vault.service.consul:8200" + task_token_ttl = "1h" + create_from_role = "nomad-cluster" + token = "" +} diff --git a/e2e/terraform/shared/scripts/README.md b/e2e/terraform/shared/scripts/README.md deleted file mode 100644 index b0ab5c528..000000000 --- a/e2e/terraform/shared/scripts/README.md +++ /dev/null @@ -1 +0,0 @@ -Scripts used by Packer to create base images diff --git a/e2e/terraform/shared/scripts/client.sh b/e2e/terraform/shared/scripts/client.sh deleted file mode 100644 index ebb53e004..000000000 --- a/e2e/terraform/shared/scripts/client.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -set -e - -CONFIGDIR=/ops/shared/config - -CONSULCONFIGDIR=/etc/consul.d -NOMADCONFIGDIR=/etc/nomad.d -HADOOP_VERSION=hadoop-2.7.6 -HADOOPCONFIGDIR=/usr/local/$HADOOP_VERSION/etc/hadoop -HOME_DIR=ubuntu - -# Wait for network -sleep 15 - -# IP_ADDRESS=$(curl http://instance-data/latest/meta-data/local-ipv4) -IP_ADDRESS="$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')" -DOCKER_BRIDGE_IP_ADDRESS=(`ifconfig docker0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`) -CLOUD=$1 -RETRY_JOIN=$2 - -# Consul -sed -i "s/IP_ADDRESS/$IP_ADDRESS/g" $CONFIGDIR/consul_client.json -sed -i "s/RETRY_JOIN/$RETRY_JOIN/g" $CONFIGDIR/consul_client.json -sudo cp $CONFIGDIR/consul_client.json $CONSULCONFIGDIR/consul.json -sudo cp $CONFIGDIR/consul_$CLOUD.service /etc/systemd/system/consul.service - -sudo systemctl enable consul.service -sudo systemctl start consul.service -sleep 10 - -export NOMAD_ADDR=http://$IP_ADDRESS:4646 - -# Add hostname to /etc/hosts -echo "127.0.0.1 $(hostname)" | sudo tee --append /etc/hosts - -# Add Docker bridge network IP to /etc/resolv.conf (at the top) -echo "nameserver $DOCKER_BRIDGE_IP_ADDRESS" | sudo tee /etc/resolv.conf.new -cat /etc/resolv.conf | sudo tee --append /etc/resolv.conf.new -sudo mv /etc/resolv.conf.new /etc/resolv.conf - -# Hadoop config file to enable HDFS CLI -sudo cp $CONFIGDIR/core-site.xml $HADOOPCONFIGDIR - -# Move examples directory to $HOME -sudo mv /ops/examples /home/$HOME_DIR -sudo chown -R $HOME_DIR:$HOME_DIR /home/$HOME_DIR/examples -sudo chmod -R 775 /home/$HOME_DIR/examples - -# Set env vars for tool CLIs -echo "export VAULT_ADDR=http://$IP_ADDRESS:8200" | sudo tee --append /home/$HOME_DIR/.bashrc -echo "export NOMAD_ADDR=http://$IP_ADDRESS:4646" | sudo tee --append /home/$HOME_DIR/.bashrc -echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre" | sudo tee --append /home/$HOME_DIR/.bashrc - -# Update PATH -echo "export PATH=$PATH:/usr/local/bin/spark/bin:/usr/local/$HADOOP_VERSION/bin" | sudo tee --append /home/$HOME_DIR/.bashrc diff --git a/e2e/terraform/shared/scripts/server.sh b/e2e/terraform/shared/scripts/server.sh deleted file mode 100644 index 172052967..000000000 --- a/e2e/terraform/shared/scripts/server.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -set -e - -CONFIGDIR=/ops/shared/config - -CONSULCONFIGDIR=/etc/consul.d -VAULTCONFIGDIR=/etc/vault.d -NOMADCONFIGDIR=/etc/nomad.d -HADOOP_VERSION=hadoop-2.7.6 -HADOOPCONFIGDIR=/usr/local/$HADOOP_VERSION/etc/hadoop -HOME_DIR=ubuntu - -# Wait for network -sleep 15 - -# IP_ADDRESS=$(curl http://instance-data/latest/meta-data/local-ipv4) -IP_ADDRESS="$(/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}')" -DOCKER_BRIDGE_IP_ADDRESS=(`ifconfig docker0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`) -CLOUD=$1 -SERVER_COUNT=$2 -RETRY_JOIN=$3 - -# Consul -sed -i "s/IP_ADDRESS/$IP_ADDRESS/g" $CONFIGDIR/consul.json -sed -i "s/SERVER_COUNT/$SERVER_COUNT/g" $CONFIGDIR/consul.json -sed -i "s/RETRY_JOIN/$RETRY_JOIN/g" $CONFIGDIR/consul.json -sudo cp $CONFIGDIR/consul.json $CONSULCONFIGDIR -sudo cp $CONFIGDIR/consul_$CLOUD.service /etc/systemd/system/consul.service - -sudo systemctl enable consul.service -sudo systemctl start consul.service -sleep 10 -export CONSUL_HTTP_ADDR=$IP_ADDRESS:8500 -export CONSUL_RPC_ADDR=$IP_ADDRESS:8400 - -# Vault -sed -i "s/IP_ADDRESS/$IP_ADDRESS/g" $CONFIGDIR/vault.hcl -sudo cp $CONFIGDIR/vault.hcl $VAULTCONFIGDIR -sudo cp $CONFIGDIR/vault.service /etc/systemd/system/vault.service - -sudo systemctl enable vault.service -sudo systemctl start vault.service - -export NOMAD_ADDR=http://$IP_ADDRESS:4646 - -# Add hostname to /etc/hosts -echo "127.0.0.1 $(hostname)" | sudo tee --append /etc/hosts - -# Add Docker bridge network IP to /etc/resolv.conf (at the top) - -echo "nameserver $DOCKER_BRIDGE_IP_ADDRESS" | sudo tee /etc/resolv.conf.new -cat /etc/resolv.conf | sudo tee --append /etc/resolv.conf.new -sudo mv /etc/resolv.conf.new /etc/resolv.conf - -# Hadoop -sudo cp $CONFIGDIR/core-site.xml $HADOOPCONFIGDIR - -# Move examples directory to $HOME -sudo mv /ops/examples /home/$HOME_DIR -sudo chown -R $HOME_DIR:$HOME_DIR /home/$HOME_DIR/examples -sudo chmod -R 775 /home/$HOME_DIR/examples - -# Set env vars for tool CLIs -echo "export CONSUL_RPC_ADDR=$IP_ADDRESS:8400" | sudo tee --append /home/$HOME_DIR/.bashrc -echo "export CONSUL_HTTP_ADDR=$IP_ADDRESS:8500" | sudo tee --append /home/$HOME_DIR/.bashrc -echo "export VAULT_ADDR=http://$IP_ADDRESS:8200" | sudo tee --append /home/$HOME_DIR/.bashrc -echo "export NOMAD_ADDR=http://$IP_ADDRESS:4646" | sudo tee --append /home/$HOME_DIR/.bashrc -echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre" | sudo tee --append /home/$HOME_DIR/.bashrc - -# Update PATH -echo "export PATH=$PATH:/usr/local/bin/spark/bin:/usr/local/$HADOOP_VERSION/bin" | sudo tee --append /home/$HOME_DIR/.bashrc diff --git a/e2e/terraform/shared/vault/vault.hcl b/e2e/terraform/shared/vault/vault.hcl new file mode 100644 index 000000000..b831da022 --- /dev/null +++ b/e2e/terraform/shared/vault/vault.hcl @@ -0,0 +1,12 @@ +backend "consul" { + path = "vault/" + address = "{{ GetPrivateIP }}:8500" + cluster_addr = "https://{{ GetPrivateIP }}:8201" + redirect_addr = "http://{{ GetPrivateIP }}:8200" +} + +listener "tcp" { + address = "{{ GetPrivateIP }}:8200" + cluster_address = "{{ GetPrivateIP }}:8201" + tls_disable = 1 +} diff --git a/e2e/terraform/shared/config/vault.service b/e2e/terraform/shared/vault/vault.service similarity index 100% rename from e2e/terraform/shared/config/vault.service rename to e2e/terraform/shared/vault/vault.service diff --git a/e2e/terraform/user-data-client.sh b/e2e/terraform/user-data-client.sh deleted file mode 100644 index 74933f00d..000000000 --- a/e2e/terraform/user-data-client.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e - -exec > >(sudo tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 -sudo bash /ops/shared/scripts/client.sh "aws" "${retry_join}" diff --git a/e2e/terraform/user-data-server.sh b/e2e/terraform/user-data-server.sh deleted file mode 100644 index 0199b405b..000000000 --- a/e2e/terraform/user-data-server.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e - -exec > >(sudo tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1 -sudo bash /ops/shared/scripts/server.sh "aws" "${server_count}" "${retry_join}" diff --git a/e2e/terraform/versions.tf b/e2e/terraform/versions.tf new file mode 100644 index 000000000..ac97c6ac8 --- /dev/null +++ b/e2e/terraform/versions.tf @@ -0,0 +1,4 @@ + +terraform { + required_version = ">= 0.12" +} diff --git a/jobspec/parse_group.go b/jobspec/parse_group.go index 28e4acd1c..39ebb292c 100644 --- a/jobspec/parse_group.go +++ b/jobspec/parse_group.go @@ -114,7 +114,7 @@ func parseGroups(result *api.Job, list *ast.ObjectList) error { // Parse network if o := listVal.Filter("network"); len(o.Items) > 0 { - networks, err := parseNetwork(o) + networks, err := ParseNetwork(o) if err != nil { return err } diff --git a/jobspec/parse_network.go b/jobspec/parse_network.go index b47844540..6cd2ca6cb 100644 --- a/jobspec/parse_network.go +++ b/jobspec/parse_network.go @@ -12,7 +12,8 @@ import ( "github.com/mitchellh/mapstructure" ) -func parseNetwork(o *ast.ObjectList) (*api.NetworkResource, error) { +// ParseNetwork parses a collection containing exactly one NetworkResource +func ParseNetwork(o *ast.ObjectList) (*api.NetworkResource, error) { if len(o.Items) > 1 { return nil, fmt.Errorf("only one 'network' resource allowed") } diff --git a/jobspec/parse_service.go b/jobspec/parse_service.go index 2100953c5..783b006bc 100644 --- a/jobspec/parse_service.go +++ b/jobspec/parse_service.go @@ -193,6 +193,7 @@ func parseSidecarService(o *ast.ObjectItem) (*api.ConsulSidecarService, error) { valid := []string{ "port", "proxy", + "tags", } if err := helper.CheckHCLKeys(o.Val, valid); err != nil { @@ -216,7 +217,7 @@ func parseSidecarService(o *ast.ObjectItem) (*api.ConsulSidecarService, error) { return nil, err } if err := dec.Decode(m); err != nil { - return nil, fmt.Errorf("foo: %v", err) + return nil, fmt.Errorf("sidecar_service: %v", err) } var proxyList *ast.ObjectList diff --git a/jobspec/parse_task.go b/jobspec/parse_task.go index 7edccb430..a8fd6687c 100644 --- a/jobspec/parse_task.go +++ b/jobspec/parse_task.go @@ -440,7 +440,7 @@ func parseResources(result *api.Resources, list *ast.ObjectList) error { // Parse the network resources if o := listVal.Filter("network"); len(o.Items) > 0 { - r, err := parseNetwork(o) + r, err := ParseNetwork(o) if err != nil { return fmt.Errorf("resource, %v", err) } @@ -522,6 +522,7 @@ func parseVolumeMounts(out *[]*api.VolumeMount, list *ast.ObjectList) error { "volume", "read_only", "destination", + "propagation_mode", } if err := helper.CheckHCLKeys(item.Val, valid); err != nil { return err diff --git a/jobspec/parse_test.go b/jobspec/parse_test.go index cd3857388..95a2b6cdc 100644 --- a/jobspec/parse_test.go +++ b/jobspec/parse_test.go @@ -197,8 +197,8 @@ func TestParse(t *testing.T) { }, VolumeMounts: []*api.VolumeMount{ { - Volume: "foo", - Destination: "/mnt/foo", + Volume: helper.StringToPtr("foo"), + Destination: helper.StringToPtr("/mnt/foo"), }, }, Affinities: []*api.Affinity{ @@ -943,6 +943,7 @@ func TestParse(t *testing.T) { PortLabel: "1234", Connect: &api.ConsulConnect{ SidecarService: &api.ConsulSidecarService{ + Tags: []string{"side1", "side2"}, Proxy: &api.ConsulProxy{ Upstreams: []*api.ConsulUpstream{ { diff --git a/jobspec/test-fixtures/basic.hcl b/jobspec/test-fixtures/basic.hcl index 2d32878ef..cbbd5d349 100644 --- a/jobspec/test-fixtures/basic.hcl +++ b/jobspec/test-fixtures/basic.hcl @@ -130,7 +130,7 @@ job "binstore-storagelocker" { driver = "docker" user = "bob" leader = true - kind = "connect-proxy:test" + kind = "connect-proxy:test" affinity { attribute = "${meta.foo}" diff --git a/jobspec/test-fixtures/multi-vault.hcl b/jobspec/test-fixtures/multi-vault.hcl index c5266548c..2745fdbab 100644 --- a/jobspec/test-fixtures/multi-vault.hcl +++ b/jobspec/test-fixtures/multi-vault.hcl @@ -18,8 +18,10 @@ job "binstore-storagelocker" { vault { policies = ["foo", "bar"] } + vault { policies = ["1", "2"] } } + } } diff --git a/jobspec/test-fixtures/overlapping-ports.hcl b/jobspec/test-fixtures/overlapping-ports.hcl index a07ef2262..29f43d63d 100644 --- a/jobspec/test-fixtures/overlapping-ports.hcl +++ b/jobspec/test-fixtures/overlapping-ports.hcl @@ -61,12 +61,11 @@ job "binstore-storagelocker" { static = 3 } - port "Http"{ - } - port "http"{ - } - port "HTTP"{ - } + port "Http" {} + + port "http" {} + + port "HTTP" {} } } } diff --git a/jobspec/test-fixtures/parameterized_job.hcl b/jobspec/test-fixtures/parameterized_job.hcl index 70c3ddae4..87eeb3d4f 100644 --- a/jobspec/test-fixtures/parameterized_job.hcl +++ b/jobspec/test-fixtures/parameterized_job.hcl @@ -1,15 +1,17 @@ job "parameterized_job" { - parameterized { - payload = "required" - meta_required = ["foo", "bar"] - meta_optional = ["baz", "bam"] - } - group "foo" { - task "bar" { - driver = "docker" - dispatch_payload { - file = "foo/bar" - } - } + parameterized { + payload = "required" + meta_required = ["foo", "bar"] + meta_optional = ["baz", "bam"] + } + + group "foo" { + task "bar" { + driver = "docker" + + dispatch_payload { + file = "foo/bar" + } } + } } diff --git a/jobspec/test-fixtures/periodic-cron.hcl b/jobspec/test-fixtures/periodic-cron.hcl index e97711546..dc6eddf55 100644 --- a/jobspec/test-fixtures/periodic-cron.hcl +++ b/jobspec/test-fixtures/periodic-cron.hcl @@ -1,7 +1,7 @@ job "foo" { - periodic { - cron = "*/5 * * *" - prohibit_overlap = true - time_zone = "Europe/Minsk" - } + periodic { + cron = "*/5 * * *" + prohibit_overlap = true + time_zone = "Europe/Minsk" + } } diff --git a/jobspec/test-fixtures/regexp-constraint.hcl b/jobspec/test-fixtures/regexp-constraint.hcl index dfdb4ce20..057311aa4 100644 --- a/jobspec/test-fixtures/regexp-constraint.hcl +++ b/jobspec/test-fixtures/regexp-constraint.hcl @@ -1,6 +1,6 @@ job "foo" { - constraint { - attribute = "$attr.kernel.version" - regexp = "[0-9.]+" - } + constraint { + attribute = "$attr.kernel.version" + regexp = "[0-9.]+" + } } diff --git a/jobspec/test-fixtures/reschedule-job-unlimited.hcl b/jobspec/test-fixtures/reschedule-job-unlimited.hcl index c51be506a..038cccb49 100644 --- a/jobspec/test-fixtures/reschedule-job-unlimited.hcl +++ b/jobspec/test-fixtures/reschedule-job-unlimited.hcl @@ -1,19 +1,23 @@ job "foo" { datacenters = ["dc1"] - type = "batch" + type = "batch" + reschedule { - delay = "10s", + delay = "10s" delay_function = "exponential" - max_delay="120s" - unlimited = true + max_delay = "120s" + unlimited = true } + group "bar" { count = 3 + task "bar" { driver = "raw_exec" + config { - command = "bash" - args = ["-c", "echo hi"] + command = "bash" + args = ["-c", "echo hi"] } } } diff --git a/jobspec/test-fixtures/reschedule-job.hcl b/jobspec/test-fixtures/reschedule-job.hcl index b29d36c23..3182851d4 100644 --- a/jobspec/test-fixtures/reschedule-job.hcl +++ b/jobspec/test-fixtures/reschedule-job.hcl @@ -1,19 +1,23 @@ job "foo" { datacenters = ["dc1"] - type = "batch" + type = "batch" + reschedule { - attempts = 15 - interval = "30m" - delay = "10s", - delay_function = "constant" + attempts = 15 + interval = "30m" + delay = "10s" + delay_function = "constant" } + group "bar" { count = 3 + task "bar" { driver = "raw_exec" + config { - command = "bash" - args = ["-c", "echo hi"] + command = "bash" + args = ["-c", "echo hi"] } } } diff --git a/jobspec/test-fixtures/service-check-bad-header-2.hcl b/jobspec/test-fixtures/service-check-bad-header-2.hcl index c566925b3..ba7c75e8a 100644 --- a/jobspec/test-fixtures/service-check-bad-header-2.hcl +++ b/jobspec/test-fixtures/service-check-bad-header-2.hcl @@ -1,28 +1,28 @@ job "check_bad_header" { - type = "service" - group "group" { - count = 1 + type = "service" - task "task" { - service { - tags = ["bar"] - port = "http" + group "group" { + count = 1 - check { - name = "check-name" - type = "http" - path = "/" - method = "POST" - interval = "10s" - timeout = "2s" - initial_status = "passing" + task "task" { + service { + tags = ["bar"] + port = "http" - header { - Authorization = ["ok", 840] - } - } + check { + name = "check-name" + type = "http" + path = "/" + method = "POST" + interval = "10s" + timeout = "2s" + initial_status = "passing" + + header { + Authorization = ["ok", 840] } } + } } + } } - diff --git a/jobspec/test-fixtures/service-check-bad-header.hcl b/jobspec/test-fixtures/service-check-bad-header.hcl index 6ad3f13ce..2bdd01446 100644 --- a/jobspec/test-fixtures/service-check-bad-header.hcl +++ b/jobspec/test-fixtures/service-check-bad-header.hcl @@ -1,28 +1,28 @@ job "check_bad_header" { - type = "service" - group "group" { - count = 1 + type = "service" - task "task" { - service { - tags = ["bar"] - port = "http" + group "group" { + count = 1 - check { - name = "check-name" - type = "http" - path = "/" - method = "POST" - interval = "10s" - timeout = "2s" - initial_status = "passing" + task "task" { + service { + tags = ["bar"] + port = "http" - header { - Authorization = "Should be a []string!" - } - } + check { + name = "check-name" + type = "http" + path = "/" + method = "POST" + interval = "10s" + timeout = "2s" + initial_status = "passing" + + header { + Authorization = "Should be a []string!" } } + } } + } } - diff --git a/jobspec/test-fixtures/service-check-driver-address.hcl b/jobspec/test-fixtures/service-check-driver-address.hcl index a9fa88d42..8a3d20f43 100644 --- a/jobspec/test-fixtures/service-check-driver-address.hcl +++ b/jobspec/test-fixtures/service-check-driver-address.hcl @@ -1,38 +1,38 @@ job "address_mode_driver" { - type = "service" - group "group" { - task "task" { - service { - name = "http-service" - port = "http" + type = "service" - address_mode = "auto" + group "group" { + task "task" { + service { + name = "http-service" + port = "http" - check { - name = "http-check" - type = "http" - path = "/" - port = "http" + address_mode = "auto" - address_mode = "driver" - } - } + check { + name = "http-check" + type = "http" + path = "/" + port = "http" - service { - name = "random-service" - port = "9000" - - address_mode = "driver" - - check { - name = "random-check" - type = "tcp" - port = "9001" - - address_mode = "driver" - } - } + address_mode = "driver" } - } -} + } + service { + name = "random-service" + port = "9000" + + address_mode = "driver" + + check { + name = "random-check" + type = "tcp" + port = "9001" + + address_mode = "driver" + } + } + } + } +} diff --git a/jobspec/test-fixtures/service-check-initial-status.hcl b/jobspec/test-fixtures/service-check-initial-status.hcl index e275001be..84a7eb0d1 100644 --- a/jobspec/test-fixtures/service-check-initial-status.hcl +++ b/jobspec/test-fixtures/service-check-initial-status.hcl @@ -1,28 +1,28 @@ job "check_initial_status" { - type = "service" - group "group" { - count = 1 + type = "service" - task "task" { - service { - tags = ["foo", "bar"] - port = "http" + group "group" { + count = 1 - check { - name = "check-name" - type = "http" - path = "/" - method = "POST" - interval = "10s" - timeout = "2s" - initial_status = "passing" + task "task" { + service { + tags = ["foo", "bar"] + port = "http" - header { - Authorization = ["Basic ZWxhc3RpYzpjaGFuZ2VtZQ=="] - } - } + check { + name = "check-name" + type = "http" + path = "/" + method = "POST" + interval = "10s" + timeout = "2s" + initial_status = "passing" + + header { + Authorization = ["Basic ZWxhc3RpYzpjaGFuZ2VtZQ=="] } } + } } + } } - diff --git a/jobspec/test-fixtures/service-check-restart.hcl b/jobspec/test-fixtures/service-check-restart.hcl index d34f70003..985726d34 100644 --- a/jobspec/test-fixtures/service-check-restart.hcl +++ b/jobspec/test-fixtures/service-check-restart.hcl @@ -1,21 +1,23 @@ job "service_check_restart" { - type = "service" - group "group" { - task "task" { - service { - name = "http-service" - check_restart { - limit = 3 - grace = "10s" - ignore_warnings = true - } - check { - name = "random-check" - type = "tcp" - port = "9001" - } - } - } - } -} + type = "service" + group "group" { + task "task" { + service { + name = "http-service" + + check_restart { + limit = 3 + grace = "10s" + ignore_warnings = true + } + + check { + name = "random-check" + type = "tcp" + port = "9001" + } + } + } + } +} diff --git a/jobspec/test-fixtures/service-meta.hcl b/jobspec/test-fixtures/service-meta.hcl index abf87e2a4..8595ad76f 100644 --- a/jobspec/test-fixtures/service-meta.hcl +++ b/jobspec/test-fixtures/service-meta.hcl @@ -1,14 +1,15 @@ job "service_meta" { - type = "service" - group "group" { - task "task" { - service { - name = "http-service" - meta { - foo = "bar" - } - } - } - } -} + type = "service" + group "group" { + task "task" { + service { + name = "http-service" + + meta { + foo = "bar" + } + } + } + } +} diff --git a/jobspec/test-fixtures/set-contains-constraint.hcl b/jobspec/test-fixtures/set-contains-constraint.hcl index 170f72118..cbb8e3dcc 100644 --- a/jobspec/test-fixtures/set-contains-constraint.hcl +++ b/jobspec/test-fixtures/set-contains-constraint.hcl @@ -1,6 +1,6 @@ job "foo" { - constraint { - attribute = "$meta.data" - set_contains = "foo,bar,baz" - } + constraint { + attribute = "$meta.data" + set_contains = "foo,bar,baz" + } } diff --git a/jobspec/test-fixtures/specify-job.hcl b/jobspec/test-fixtures/specify-job.hcl index 24d70b60f..2b4620693 100644 --- a/jobspec/test-fixtures/specify-job.hcl +++ b/jobspec/test-fixtures/specify-job.hcl @@ -1,4 +1,4 @@ job "default" { - id = "job1" - name = "My Job" + id = "job1" + name = "My Job" } diff --git a/jobspec/test-fixtures/tg-network.hcl b/jobspec/test-fixtures/tg-network.hcl index 08a65b095..dadf7eccc 100644 --- a/jobspec/test-fixtures/tg-network.hcl +++ b/jobspec/test-fixtures/tg-network.hcl @@ -21,6 +21,8 @@ job "foo" { connect { sidecar_service { + tags = ["side1", "side2"] + proxy { local_service_port = 8080 diff --git a/jobspec/test-fixtures/tg-service-check.hcl b/jobspec/test-fixtures/tg-service-check.hcl index 78a47851a..c0d97b91b 100644 --- a/jobspec/test-fixtures/tg-service-check.hcl +++ b/jobspec/test-fixtures/tg-service-check.hcl @@ -1,5 +1,4 @@ job "group_service_check_script" { - group "group" { count = 1 @@ -7,8 +6,8 @@ job "group_service_check_script" { mode = "bridge" port "http" { - static = 80 - to = 8080 + static = 80 + to = 8080 } } diff --git a/jobspec/test-fixtures/vault_inheritance.hcl b/jobspec/test-fixtures/vault_inheritance.hcl index b45e2d38e..18d83d9f5 100644 --- a/jobspec/test-fixtures/vault_inheritance.hcl +++ b/jobspec/test-fixtures/vault_inheritance.hcl @@ -1,22 +1,24 @@ job "example" { + vault { + policies = ["job"] + } + + group "cache" { vault { - policies = ["job"] + policies = ["group"] } - group "cache" { - vault { - policies = ["group"] - } - task "redis" { } + task "redis" {} - task "redis2" { - vault { - policies = ["task"] - env = false - } - } - } - group "cache2" { - task "redis" { } - } + task "redis2" { + vault { + policies = ["task"] + env = false + } + } + } + + group "cache2" { + task "redis" {} + } } diff --git a/jobspec/test-fixtures/version-constraint.hcl b/jobspec/test-fixtures/version-constraint.hcl index 3ba755272..71cc75755 100644 --- a/jobspec/test-fixtures/version-constraint.hcl +++ b/jobspec/test-fixtures/version-constraint.hcl @@ -1,6 +1,6 @@ job "foo" { - constraint { - attribute = "$attr.kernel.version" - version = "~> 3.2" - } + constraint { + attribute = "$attr.kernel.version" + version = "~> 3.2" + } } diff --git a/nomad/job_endpoint.go b/nomad/job_endpoint.go index 6c7c3ad28..a89d94e34 100644 --- a/nomad/job_endpoint.go +++ b/nomad/job_endpoint.go @@ -110,6 +110,7 @@ func (j *Job) Register(args *structs.JobRegisterRequest, reply *structs.JobRegis if !aclObj.AllowNsOp(args.RequestNamespace(), acl.NamespaceCapabilitySubmitJob) { return structs.ErrPermissionDenied } + // Validate Volume Permsissions for _, tg := range args.Job.TaskGroups { for _, vol := range tg.Volumes { @@ -131,6 +132,16 @@ func (j *Job) Register(args *structs.JobRegisterRequest, reply *structs.JobRegis } } } + + for _, t := range tg.Tasks { + for _, vm := range t.VolumeMounts { + vol := tg.Volumes[vm.Volume] + if vm.PropagationMode == structs.VolumeMountPropagationBidirectional && + !aclObj.AllowHostVolumeOperation(vol.Source, acl.HostVolumeCapabilityMountReadWrite) { + return structs.ErrPermissionDenied + } + } + } } // Check if override is set and we do not have permissions diff --git a/nomad/plan_queue_test.go b/nomad/plan_queue_test.go index beead5dd4..933bd1f39 100644 --- a/nomad/plan_queue_test.go +++ b/nomad/plan_queue_test.go @@ -39,10 +39,15 @@ func TestPlanQueue_Enqueue_Dequeue(t *testing.T) { } resCh := make(chan *structs.PlanResult, 1) + errCh := make(chan error) go func() { + defer close(errCh) + defer close(resCh) + res, err := future.Wait() if err != nil { - t.Fatalf("err: %v", err) + errCh <- err + return } resCh <- res }() @@ -65,6 +70,10 @@ func TestPlanQueue_Enqueue_Dequeue(t *testing.T) { pending.respond(result, nil) select { + case err := <-errCh: + if err != nil { + t.Fatalf("error in anonymous goroutine: %s", err) + } case r := <-resCh: if r != result { t.Fatalf("Bad: %#v", r) diff --git a/nomad/structs/generate.sh b/nomad/structs/generate.sh index 04141c34a..c0409e707 100755 --- a/nomad/structs/generate.sh +++ b/nomad/structs/generate.sh @@ -2,4 +2,4 @@ set -e FILES="$(ls ./*.go | grep -v -e _test.go -e .generated.go | tr '\n' ' ')" -codecgen -d 100 -o structs.generated.go ${FILES} +codecgen -d 100 -t codec_generated -o structs.generated.go ${FILES} diff --git a/nomad/structs/services.go b/nomad/structs/services.go index 1b310d48f..abc79256e 100644 --- a/nomad/structs/services.go +++ b/nomad/structs/services.go @@ -597,6 +597,10 @@ func (c *ConsulConnect) Validate() error { // ConsulSidecarService represents a Consul Connect SidecarService jobspec // stanza. type ConsulSidecarService struct { + // Tags are optional service tags that get registered with the sidecar service + // in Consul. If unset, the sidecar service inherits the parent service tags. + Tags []string + // Port is the service's port that the sidecar will connect to. May be // a port label or a literal port number. Port string @@ -613,6 +617,7 @@ func (s *ConsulSidecarService) HasUpstreams() bool { // Copy the stanza recursively. Returns nil if nil. func (s *ConsulSidecarService) Copy() *ConsulSidecarService { return &ConsulSidecarService{ + Tags: helper.CopySliceString(s.Tags), Port: s.Port, Proxy: s.Proxy.Copy(), } @@ -628,6 +633,10 @@ func (s *ConsulSidecarService) Equals(o *ConsulSidecarService) bool { return false } + if !helper.CompareSliceSetString(s.Tags, o.Tags) { + return false + } + return s.Proxy.Equals(o.Proxy) } diff --git a/nomad/structs/services_test.go b/nomad/structs/services_test.go index ddd5d23d5..9e92a7d5d 100644 --- a/nomad/structs/services_test.go +++ b/nomad/structs/services_test.go @@ -34,6 +34,7 @@ func TestConsulConnect_CopyEquals(t *testing.T) { c := &ConsulConnect{ SidecarService: &ConsulSidecarService{ + Tags: []string{"tag1", "tag2"}, Port: "9001", Proxy: &ConsulProxy{ LocalServiceAddress: "127.0.0.1", diff --git a/nomad/structs/structs.go b/nomad/structs/structs.go index 8462cbdab..376ac570d 100644 --- a/nomad/structs/structs.go +++ b/nomad/structs/structs.go @@ -5549,6 +5549,14 @@ func (t *Task) Validate(ephemeralDisk *EphemeralDisk, jobType string, tgServices mErr.Errors = append(mErr.Errors, serviceErr) } } + + // Validation for volumes + for idx, vm := range t.VolumeMounts { + if !MountPropagationModeIsValid(vm.PropagationMode) { + mErr.Errors = append(mErr.Errors, fmt.Errorf("Volume Mount (%d) has an invalid propagation mode: \"%s\"", idx, vm.PropagationMode)) + } + } + return mErr.ErrorOrNil() } diff --git a/nomad/structs/volumes.go b/nomad/structs/volumes.go index 8d750fdc3..fe44e4830 100644 --- a/nomad/structs/volumes.go +++ b/nomad/structs/volumes.go @@ -4,6 +4,21 @@ const ( VolumeTypeHost = "host" ) +const ( + VolumeMountPropagationPrivate = "private" + VolumeMountPropagationHostToTask = "host-to-task" + VolumeMountPropagationBidirectional = "bidirectional" +) + +func MountPropagationModeIsValid(propagationMode string) bool { + switch propagationMode { + case "", VolumeMountPropagationPrivate, VolumeMountPropagationHostToTask, VolumeMountPropagationBidirectional: + return true + default: + return false + } +} + // ClientHostVolumeConfig is used to configure access to host paths on a Nomad Client type ClientHostVolumeConfig struct { Name string `hcl:",key"` @@ -103,9 +118,10 @@ func CopyMapVolumeRequest(s map[string]*VolumeRequest) map[string]*VolumeRequest // VolumeMount represents the relationship between a destination path in a task // and the task group volume that should be mounted there. type VolumeMount struct { - Volume string - Destination string - ReadOnly bool + Volume string + Destination string + ReadOnly bool + PropagationMode string } func (v *VolumeMount) Copy() *VolumeMount { diff --git a/nomad/vault.go b/nomad/vault.go index 44a61973e..2c58e7e59 100644 --- a/nomad/vault.go +++ b/nomad/vault.go @@ -10,11 +10,11 @@ import ( "sync/atomic" "time" - "gopkg.in/tomb.v2" + tomb "gopkg.in/tomb.v2" - "github.com/armon/go-metrics" + metrics "github.com/armon/go-metrics" log "github.com/hashicorp/go-hclog" - "github.com/hashicorp/go-multierror" + multierror "github.com/hashicorp/go-multierror" "github.com/hashicorp/nomad/nomad/structs" "github.com/hashicorp/nomad/nomad/structs/config" vapi "github.com/hashicorp/vault/api" @@ -883,6 +883,7 @@ func (v *vaultClient) validateRole(role string) error { ExplicitMaxTtl int `mapstructure:"explicit_max_ttl"` Orphan bool Period int + TokenPeriod int `mapstructure:"token_period"` Renewable bool } if err := mapstructure.WeakDecode(rsecret.Data, &data); err != nil { @@ -899,7 +900,7 @@ func (v *vaultClient) validateRole(role string) error { multierror.Append(&mErr, fmt.Errorf("Role can not use an explicit max ttl. Token must be periodic.")) } - if data.Period == 0 { + if data.Period == 0 && data.TokenPeriod == 0 { multierror.Append(&mErr, fmt.Errorf("Role must have a non-zero period to make tokens periodic.")) } @@ -1012,7 +1013,7 @@ func (v *vaultClient) CreateToken(ctx context.Context, a *structs.Allocation, ta validationErr = fmt.Errorf("Vault returned WrapInfo without WrappedAccessor. Secret warnings: %v", secret.Warnings) } if validationErr != nil { - v.logger.Warn("ailed to CreateToken", "error", err) + v.logger.Warn("failed to CreateToken", "error", validationErr) return nil, structs.NewRecoverableError(validationErr, true) } diff --git a/nomad/vault_test.go b/nomad/vault_test.go index 0664ac26b..1df1a95a3 100644 --- a/nomad/vault_test.go +++ b/nomad/vault_test.go @@ -305,9 +305,8 @@ func TestVaultClient_ValidateRole(t *testing.T) { logger := testlog.HCLogger(t) v.Config.ConnectionRetryIntv = 100 * time.Millisecond client, err := NewVaultClient(v.Config, logger, nil) - if err != nil { - t.Fatalf("failed to build vault client: %v", err) - } + require.NoError(t, err) + defer client.Stop() // Wait for an error @@ -325,13 +324,102 @@ func TestVaultClient_ValidateRole(t *testing.T) { return true, nil }, func(err error) { - t.Fatalf("bad: %v", err) + require.NoError(t, err) }) - errStr := connErr.Error() - if !strings.Contains(errStr, "explicit max ttl") { - t.Fatalf("Expect explicit max ttl error") + require.Contains(t, connErr.Error(), "explicit max ttl") +} + +// TestVaultClient_ValidateRole_Success asserts that a valid token role +// gets marked as valid +func TestVaultClient_ValidateRole_Success(t *testing.T) { + t.Parallel() + v := testutil.NewTestVault(t) + defer v.Stop() + + // Set the configs token in a new test role + vaultPolicies := map[string]string{ + "nomad-role-create": nomadRoleCreatePolicy, + "nomad-role-management": nomadRoleManagementPolicy, } + data := map[string]interface{}{ + "allowed_policies": "default,root", + "orphan": true, + "renewable": true, + "token_period": 1000, + } + v.Config.Token = testVaultRoleAndToken(v, t, vaultPolicies, data, nil) + + logger := testlog.HCLogger(t) + v.Config.ConnectionRetryIntv = 100 * time.Millisecond + client, err := NewVaultClient(v.Config, logger, nil) + require.NoError(t, err) + + defer client.Stop() + + // Wait for an error + var conn bool + var connErr error + testutil.WaitForResult(func() (bool, error) { + conn, connErr = client.ConnectionEstablished() + if !conn { + return false, fmt.Errorf("Should connect") + } + + if connErr != nil { + return false, connErr + } + + return true, nil + }, func(err error) { + require.NoError(t, err) + }) +} + +// TestVaultClient_ValidateRole_Deprecated_Success asserts that a valid token +// role gets marked as valid, even if it uses deprecated field, period +func TestVaultClient_ValidateRole_Deprecated_Success(t *testing.T) { + t.Parallel() + v := testutil.NewTestVault(t) + defer v.Stop() + + // Set the configs token in a new test role + vaultPolicies := map[string]string{ + "nomad-role-create": nomadRoleCreatePolicy, + "nomad-role-management": nomadRoleManagementPolicy, + } + data := map[string]interface{}{ + "allowed_policies": "default,root", + "orphan": true, + "renewable": true, + "period": 1000, + } + v.Config.Token = testVaultRoleAndToken(v, t, vaultPolicies, data, nil) + + logger := testlog.HCLogger(t) + v.Config.ConnectionRetryIntv = 100 * time.Millisecond + client, err := NewVaultClient(v.Config, logger, nil) + require.NoError(t, err) + + defer client.Stop() + + // Wait for an error + var conn bool + var connErr error + testutil.WaitForResult(func() (bool, error) { + conn, connErr = client.ConnectionEstablished() + if !conn { + return false, fmt.Errorf("Should connect") + } + + if connErr != nil { + return false, connErr + } + + return true, nil + }, func(err error) { + require.NoError(t, err) + }) } func TestVaultClient_ValidateRole_NonExistant(t *testing.T) { diff --git a/plugins/drivers/driver.go b/plugins/drivers/driver.go index 4c127393d..a4259a6f8 100644 --- a/plugins/drivers/driver.go +++ b/plugins/drivers/driver.go @@ -357,15 +357,17 @@ func (d *DeviceConfig) Copy() *DeviceConfig { } type MountConfig struct { - TaskPath string - HostPath string - Readonly bool + TaskPath string + HostPath string + Readonly bool + PropagationMode string } func (m *MountConfig) IsEqual(o *MountConfig) bool { return m.TaskPath == o.TaskPath && m.HostPath == o.HostPath && - m.Readonly == o.Readonly + m.Readonly == o.Readonly && + m.PropagationMode == o.PropagationMode } func (m *MountConfig) Copy() *MountConfig { diff --git a/scripts/screenshots/src/index.js b/scripts/screenshots/src/index.js index 0660e52fb..c065268f5 100644 --- a/scripts/screenshots/src/index.js +++ b/scripts/screenshots/src/index.js @@ -31,7 +31,7 @@ const ANSI_YELLOW = "\x1b[33m%s\x1b[0m"; const page = await browser.newPage(); // Make sure the page is 4K is high-dpi scaling - page.setViewport({ width: 1920, height: 1080, deviceScaleFactor: 2 }); + page.setViewport({ width: 1440, height: 900, deviceScaleFactor: 2 }); console.log("Loading Nomad UI..."); console.log( ANSI_YELLOW, diff --git a/terraform/aws/env/us-east/main.tf b/terraform/aws/env/us-east/main.tf index 448995039..c0ff3cfc3 100644 --- a/terraform/aws/env/us-east/main.tf +++ b/terraform/aws/env/us-east/main.tf @@ -1,64 +1,3 @@ -variable "name" { - description = "Used to name various infrastructure components" -} - -variable "whitelist_ip" { - description = "IP to whitelist for the security groups (set 0.0.0.0/0 for world)" -} - -variable "region" { - description = "The AWS region to deploy to." - default = "us-east-1" -} - -variable "ami" { -} - -variable "server_instance_type" { - description = "The AWS instance type to use for servers." - default = "t2.medium" -} - -variable "client_instance_type" { - description = "The AWS instance type to use for clients." - default = "t2.medium" -} - -variable "root_block_device_size" { - description = "The volume size of the root block device." - default = 16 -} - -variable "key_name" { - description = "Name of the SSH key used to provision EC2 instances." -} - -variable "server_count" { - description = "The number of servers to provision." - default = "3" -} - -variable "client_count" { - description = "The number of clients to provision." - default = "4" -} - -variable "retry_join" { - description = "Used by Consul to automatically form a cluster." - type = map(string) - - default = { - provider = "aws" - tag_key = "ConsulAutoJoin" - tag_value = "auto-join" - } -} - -variable "nomad_binary" { - description = "Used to replace the machine image installed Nomad binary." - default = "none" -} - provider "aws" { region = var.region } @@ -79,38 +18,3 @@ module "hashistack" { root_block_device_size = var.root_block_device_size whitelist_ip = var.whitelist_ip } - -output "IP_Addresses" { - value = < !Ember.testing), + enablePolling: overridable(() => !Ember.testing), stats: computed('allocation', 'allocation.isRunning', function() { if (!this.get('allocation.isRunning')) return; diff --git a/ui/app/components/freestyle/sg-distribution-bar.js b/ui/app/components/freestyle/sg-distribution-bar.js index f4e2f8043..f67e18757 100644 --- a/ui/app/components/freestyle/sg-distribution-bar.js +++ b/ui/app/components/freestyle/sg-distribution-bar.js @@ -1,17 +1,18 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { on } from '@ember/object/evented'; export default Component.extend({ timerTicks: 0, - startTimer: function() { + startTimer: on('init', function() { this.set( 'timer', setInterval(() => { this.incrementProperty('timerTicks'); }, 500) ); - }.on('init'), + }), willDestroy() { clearInterval(this.timer); diff --git a/ui/app/components/freestyle/sg-line-chart.js b/ui/app/components/freestyle/sg-line-chart.js index a5c246658..f1dbe10b5 100644 --- a/ui/app/components/freestyle/sg-line-chart.js +++ b/ui/app/components/freestyle/sg-line-chart.js @@ -1,11 +1,12 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { on } from '@ember/object/evented'; import d3TimeFormat from 'd3-time-format'; export default Component.extend({ timerTicks: 0, - startTimer: function() { + startTimer: on('init', function() { this.set( 'timer', setInterval(() => { @@ -18,7 +19,7 @@ export default Component.extend({ } }, 500) ); - }.on('init'), + }), willDestroy() { clearInterval(this.timer); diff --git a/ui/app/components/freestyle/sg-progress-bar.js b/ui/app/components/freestyle/sg-progress-bar.js index 9748dd603..97e76b186 100644 --- a/ui/app/components/freestyle/sg-progress-bar.js +++ b/ui/app/components/freestyle/sg-progress-bar.js @@ -1,17 +1,18 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { on } from '@ember/object/evented'; export default Component.extend({ timerTicks: 0, - startTimer: function() { + startTimer: on('init', function() { this.set( 'timer', setInterval(() => { this.incrementProperty('timerTicks'); }, 1000) ); - }.on('init'), + }), willDestroy() { clearInterval(this.timer); diff --git a/ui/app/components/job-deployments-stream.js b/ui/app/components/job-deployments-stream.js index 4679117b9..7a5e3d5d5 100644 --- a/ui/app/components/job-deployments-stream.js +++ b/ui/app/components/job-deployments-stream.js @@ -1,12 +1,13 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import moment from 'moment'; export default Component.extend({ tagName: 'ol', classNames: ['timeline'], - deployments: computed(() => []), + deployments: overridable(() => []), sortedDeployments: computed('deployments.@each.versionSubmitTime', function() { return this.deployments diff --git a/ui/app/components/job-page/parts/recent-allocations.js b/ui/app/components/job-page/parts/recent-allocations.js index 9729eb47c..005c5a4ba 100644 --- a/ui/app/components/job-page/parts/recent-allocations.js +++ b/ui/app/components/job-page/parts/recent-allocations.js @@ -11,7 +11,7 @@ export default Component.extend({ sortProperty: 'modifyIndex', sortDescending: true, sortedAllocations: computed('job.allocations.@each.modifyIndex', function() { - return new PromiseArray({ + return PromiseArray.create({ promise: this.get('job.allocations').then(allocations => allocations .sortBy('modifyIndex') diff --git a/ui/app/components/job-versions-stream.js b/ui/app/components/job-versions-stream.js index 5d2f0d43e..3fc938ea0 100644 --- a/ui/app/components/job-versions-stream.js +++ b/ui/app/components/job-versions-stream.js @@ -1,12 +1,13 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import moment from 'moment'; export default Component.extend({ tagName: 'ol', classNames: ['timeline'], - versions: computed(() => []), + versions: overridable(() => []), // Passes through to the job-diff component verbose: true, diff --git a/ui/app/components/line-chart.js b/ui/app/components/line-chart.js index d09d2d1a5..138d8d60d 100644 --- a/ui/app/components/line-chart.js +++ b/ui/app/components/line-chart.js @@ -1,5 +1,6 @@ import Component from '@ember/component'; import { computed, observer } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { guidFor } from '@ember/object/internals'; import { run } from '@ember/runloop'; import d3 from 'd3-selection'; @@ -184,7 +185,7 @@ export default Component.extend(WindowResizable, { return axis && axis.getBBox().width; }), - xAxisOffset: computed('height', 'xAxisHeight', function() { + xAxisOffset: overridable('height', 'xAxisHeight', function() { return this.height - this.xAxisHeight; }), diff --git a/ui/app/components/list-accordion.js b/ui/app/components/list-accordion.js index 852c112b9..5f83b5ee0 100644 --- a/ui/app/components/list-accordion.js +++ b/ui/app/components/list-accordion.js @@ -1,11 +1,12 @@ import Component from '@ember/component'; import { computed, get } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; export default Component.extend({ classNames: ['accordion'], key: 'id', - source: computed(() => []), + source: overridable(() => []), onToggle(/* item, isOpen */) {}, startExpanded: false, @@ -30,5 +31,5 @@ export default Component.extend({ // When source updates come in, the state cache is used to preserve // open/close state. - stateCache: computed(() => []), + stateCache: overridable(() => []), }); diff --git a/ui/app/components/list-pagination.js b/ui/app/components/list-pagination.js index 36f372041..322a7db27 100644 --- a/ui/app/components/list-pagination.js +++ b/ui/app/components/list-pagination.js @@ -1,8 +1,9 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; export default Component.extend({ - source: computed(() => []), + source: overridable(() => []), size: 25, page: 1, spread: 2, diff --git a/ui/app/components/list-table.js b/ui/app/components/list-table.js index 1bf0999b9..439f1d6a4 100644 --- a/ui/app/components/list-table.js +++ b/ui/app/components/list-table.js @@ -1,11 +1,12 @@ import Component from '@ember/component'; import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; export default Component.extend({ tagName: 'table', classNames: ['table'], - source: computed(() => []), + source: overridable(() => []), // Plan for a future with metadata (e.g., isSelected) decoratedSource: computed('source.[]', function() { diff --git a/ui/app/components/multi-select-dropdown.js b/ui/app/components/multi-select-dropdown.js index d837b0ef8..3bd9febcc 100644 --- a/ui/app/components/multi-select-dropdown.js +++ b/ui/app/components/multi-select-dropdown.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { run } from '@ember/runloop'; const TAB = 9; @@ -11,8 +11,8 @@ const ARROW_DOWN = 40; export default Component.extend({ classNames: ['dropdown'], - options: computed(() => []), - selection: computed(() => []), + options: overridable(() => []), + selection: overridable(() => []), onSelect() {}, diff --git a/ui/app/components/reschedule-event-row.js b/ui/app/components/reschedule-event-row.js index 8072ea29a..6fc566051 100644 --- a/ui/app/components/reschedule-event-row.js +++ b/ui/app/components/reschedule-event-row.js @@ -1,5 +1,5 @@ import Component from '@ember/component'; -import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { inject as service } from '@ember/service'; export default Component.extend({ @@ -10,7 +10,7 @@ export default Component.extend({ allocationId: null, // An allocation can also be provided directly - allocation: computed('allocationId', function() { + allocation: overridable('allocationId', function() { return this.store.findRecord('allocation', this.allocationId); }), diff --git a/ui/app/components/streaming-file.js b/ui/app/components/streaming-file.js index 9a85d41a1..5885c2bc8 100644 --- a/ui/app/components/streaming-file.js +++ b/ui/app/components/streaming-file.js @@ -82,14 +82,16 @@ export default Component.extend(WindowResizable, { }); // Follow the log if the scroll position is near the bottom of the cli window - this.logger.on('tick', () => { - run.scheduleOnce('afterRender', () => this.synchronizeScrollPosition()); - }); + this.logger.on('tick', this, 'scheduleScrollSynchronization'); yield this.logger.startStreaming(); - this.logger.off('tick'); + this.logger.off('tick', this, 'scheduleScrollSynchronization'); }), + scheduleScrollSynchronization() { + run.scheduleOnce('afterRender', () => this.synchronizeScrollPosition()); + }, + willDestroy() { this.logger.stop(); }, diff --git a/ui/app/controllers/allocations/allocation/index.js b/ui/app/controllers/allocations/allocation/index.js index ec7332781..caec2d8ae 100644 --- a/ui/app/controllers/allocations/allocation/index.js +++ b/ui/app/controllers/allocations/allocation/index.js @@ -1,6 +1,7 @@ import Controller from '@ember/controller'; import { inject as service } from '@ember/service'; import { computed, observer } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { alias } from '@ember/object/computed'; import { task } from 'ember-concurrency'; import Sortable from 'nomad-ui/mixins/sortable'; @@ -24,7 +25,7 @@ export default Controller.extend(Sortable, { // Set in the route preempter: null, - error: computed(() => { + error: overridable(() => { // { title, description } return null; }), diff --git a/ui/app/controllers/allocations/allocation/task/index.js b/ui/app/controllers/allocations/allocation/task/index.js index ce1d3f847..9a8733d92 100644 --- a/ui/app/controllers/allocations/allocation/task/index.js +++ b/ui/app/controllers/allocations/allocation/task/index.js @@ -1,5 +1,6 @@ import Controller from '@ember/controller'; import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { alias } from '@ember/object/computed'; import { task } from 'ember-concurrency'; @@ -22,7 +23,7 @@ export default Controller.extend({ .sortBy('name'); }), - error: computed(() => { + error: overridable(() => { // { title, description } return null; }), diff --git a/ui/app/mixins/window-resizable.js b/ui/app/mixins/window-resizable.js index 5a473f3c1..808143538 100644 --- a/ui/app/mixins/window-resizable.js +++ b/ui/app/mixins/window-resizable.js @@ -1,6 +1,7 @@ import Mixin from '@ember/object/mixin'; import { run } from '@ember/runloop'; import { assert } from '@ember/debug'; +import { on } from '@ember/object/evented'; import $ from 'jquery'; export default Mixin.create({ @@ -8,14 +9,14 @@ export default Mixin.create({ assert('windowResizeHandler needs to be overridden in the Component', false); }, - setupWindowResize: function() { + setupWindowResize: on('didInsertElement', function() { run.scheduleOnce('afterRender', this, () => { this.set('_windowResizeHandler', this.windowResizeHandler.bind(this)); $(window).on('resize', this._windowResizeHandler); }); - }.on('didInsertElement'), + }), - removeWindowResize: function() { + removeWindowResize: on('willDestroyElement', function() { $(window).off('resize', this._windowResizeHandler); - }.on('willDestroyElement'), + }), }); diff --git a/ui/app/mixins/with-component-visibility-detection.js b/ui/app/mixins/with-component-visibility-detection.js index 3022d4d36..2645ed2c8 100644 --- a/ui/app/mixins/with-component-visibility-detection.js +++ b/ui/app/mixins/with-component-visibility-detection.js @@ -1,22 +1,23 @@ import Ember from 'ember'; import Mixin from '@ember/object/mixin'; import { assert } from '@ember/debug'; +import { on } from '@ember/object/evented'; export default Mixin.create({ visibilityHandler() { assert('visibilityHandler needs to be overridden in the Component', false); }, - setupDocumentVisibility: function() { + setupDocumentVisibility: on('init', function() { if (!Ember.testing) { this.set('_visibilityHandler', this.visibilityHandler.bind(this)); document.addEventListener('visibilitychange', this._visibilityHandler); } - }.on('init'), + }), - removeDocumentVisibility: function() { + removeDocumentVisibility: on('init', function() { if (!Ember.testing) { document.removeEventListener('visibilitychange', this._visibilityHandler); } - }.on('willDestroy'), + }), }); diff --git a/ui/app/mixins/with-route-visibility-detection.js b/ui/app/mixins/with-route-visibility-detection.js index 4b7b05c24..8f58102c6 100644 --- a/ui/app/mixins/with-route-visibility-detection.js +++ b/ui/app/mixins/with-route-visibility-detection.js @@ -1,22 +1,23 @@ import Ember from 'ember'; import Mixin from '@ember/object/mixin'; import { assert } from '@ember/debug'; +import { on } from '@ember/object/evented'; export default Mixin.create({ visibilityHandler() { assert('visibilityHandler needs to be overridden in the Route', false); }, - setupDocumentVisibility: function() { + setupDocumentVisibility: on('activate', function() { if (!Ember.testing) { this.set('_visibilityHandler', this.visibilityHandler.bind(this)); document.addEventListener('visibilitychange', this._visibilityHandler); } - }.on('activate'), + }), - removeDocumentVisibility: function() { + removeDocumentVisibility: on('deactivate', function() { if (!Ember.testing) { document.removeEventListener('visibilitychange', this._visibilityHandler); } - }.on('deactivate'), + }), }); diff --git a/ui/app/models/job.js b/ui/app/models/job.js index c41046276..f3afec1dc 100644 --- a/ui/app/models/job.js +++ b/ui/app/models/job.js @@ -144,9 +144,7 @@ export default Model.extend({ }), hasBlockedEvaluation: computed('evaluations.@each.isBlocked', function() { - return this.evaluations - .toArray() - .some(evaluation => evaluation.get('isBlocked')); + return this.evaluations.toArray().some(evaluation => evaluation.get('isBlocked')); }), hasPlacementFailures: and('latestFailureEvaluation', 'hasBlockedEvaluation'), @@ -246,7 +244,7 @@ export default Model.extend({ const id = payload.Name; this.set('plainId', id); - this.set('id', JSON.stringify([id, namespace])); + this.set('_idBeforeSaving', JSON.stringify([id, namespace])); const namespaceRecord = this.store.peekRecord('namespace', namespace); if (namespaceRecord) { diff --git a/ui/app/models/node-attributes.js b/ui/app/models/node-attributes.js index 6a6998272..11c199c65 100644 --- a/ui/app/models/node-attributes.js +++ b/ui/app/models/node-attributes.js @@ -6,10 +6,10 @@ import flat from 'flat'; const { unflatten } = flat; export default Fragment.extend({ - attributes: attr(), + nodeAttributes: attr(), - attributesStructured: computed('attributes', function() { - const original = this.attributes; + attributesStructured: computed('nodeAttributes', function() { + const original = this.nodeAttributes; if (!original) { return; @@ -30,6 +30,8 @@ export default Fragment.extend({ // // ex: nodeAttrs.get('driver.docker') // [ "1", { version: "17.05.0-ce", volumes: { enabled: "1" } } ] - return get(this.attributesStructured, key); + if (this.attributesStructured) { + return get(this.attributesStructured, key); + } }, }); diff --git a/ui/app/routes/application.js b/ui/app/routes/application.js index dbc9baa35..62ba8ef0b 100644 --- a/ui/app/routes/application.js +++ b/ui/app/routes/application.js @@ -1,7 +1,7 @@ import { inject as service } from '@ember/service'; import { next } from '@ember/runloop'; import Route from '@ember/routing/route'; -import { AbortError } from 'ember-data/adapters/errors'; +import { AbortError } from '@ember-data/adapter/error'; import RSVP from 'rsvp'; export default Route.extend({ @@ -26,7 +26,7 @@ export default Route.extend({ promises => { if (!this.get('system.shouldShowRegions')) return promises; - const queryParam = transition.queryParams.region; + const queryParam = transition.to.queryParams.region; const defaultRegion = this.get('system.defaultRegion.region'); const currentRegion = this.get('system.activeRegion') || defaultRegion; diff --git a/ui/app/routes/jobs.js b/ui/app/routes/jobs.js index 9748013b7..08bbb26f9 100644 --- a/ui/app/routes/jobs.js +++ b/ui/app/routes/jobs.js @@ -22,7 +22,7 @@ export default Route.extend(WithForbiddenState, { beforeModel(transition) { return this.get('system.namespaces').then(namespaces => { - const queryParam = transition.queryParams.namespace; + const queryParam = transition.to.queryParams.namespace; this.set('system.activeNamespace', queryParam || 'default'); return namespaces; @@ -30,9 +30,7 @@ export default Route.extend(WithForbiddenState, { }, model() { - return this.store - .findAll('job', { reload: true }) - .catch(notifyForbidden(this)); + return this.store.findAll('job', { reload: true }).catch(notifyForbidden(this)); }, actions: { diff --git a/ui/app/routes/jobs/job.js b/ui/app/routes/jobs/job.js index 8685c9ac0..70f323049 100644 --- a/ui/app/routes/jobs/job.js +++ b/ui/app/routes/jobs/job.js @@ -15,7 +15,7 @@ export default Route.extend({ }, model(params, transition) { - const namespace = transition.queryParams.namespace || this.get('system.activeNamespace.id'); + const namespace = transition.to.queryParams.namespace || this.get('system.activeNamespace.id'); const name = params.job_name; const fullId = JSON.stringify([name, namespace || 'default']); return this.store diff --git a/ui/app/serializers/agent.js b/ui/app/serializers/agent.js index f99134f15..5cbe4c3ad 100644 --- a/ui/app/serializers/agent.js +++ b/ui/app/serializers/agent.js @@ -1,5 +1,5 @@ import ApplicationSerializer from './application'; -import { AdapterError } from 'ember-data/adapters/errors'; +import AdapterError from '@ember-data/adapter/error'; export default ApplicationSerializer.extend({ attrs: { diff --git a/ui/app/serializers/node-attributes.js b/ui/app/serializers/node-attributes.js index 6e4be279f..458c81f15 100644 --- a/ui/app/serializers/node-attributes.js +++ b/ui/app/serializers/node-attributes.js @@ -2,6 +2,6 @@ import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ normalize(typeHash, hash) { - return this._super(typeHash, { Attributes: hash }); + return this._super(typeHash, { NodeAttributes: hash }); }, }); diff --git a/ui/app/services/stats-trackers-registry.js b/ui/app/services/stats-trackers-registry.js index 37cbb228a..5a603d016 100644 --- a/ui/app/services/stats-trackers-registry.js +++ b/ui/app/services/stats-trackers-registry.js @@ -18,6 +18,8 @@ export default Service.extend({ token: service(), init() { + this._super(...arguments); + // The LRUMap limits the number of trackers tracked by making room for // new entries beyond the limit by removing the least recently used entry. registry = new LRUMap(MAX_STAT_TRACKERS); diff --git a/ui/app/services/watch-list.js b/ui/app/services/watch-list.js index 1b669dd0c..f75a8bdb8 100644 --- a/ui/app/services/watch-list.js +++ b/ui/app/services/watch-list.js @@ -10,6 +10,7 @@ export default Service.extend({ }), init() { + this._super(...arguments); list = {}; }, diff --git a/ui/app/templates/clients/index.hbs b/ui/app/templates/clients/index.hbs index 6d842a884..e7245c1bc 100644 --- a/ui/app/templates/clients/index.hbs +++ b/ui/app/templates/clients/index.hbs @@ -35,38 +35,40 @@ - {{#list-pagination - source=sortedNodes - size=pageSize - page=currentPage as |p|}} - {{#list-table - source=p.list - sortProperty=sortProperty - sortDescending=sortDescending - class="with-foot" as |t|}} - {{#t.head}} - - {{#t.sort-by prop="id"}}ID{{/t.sort-by}} - {{#t.sort-by class="is-200px is-truncatable" prop="name"}}Name{{/t.sort-by}} - {{#t.sort-by prop="status"}}State{{/t.sort-by}} - Address - {{#t.sort-by prop="datacenter"}}Datacenter{{/t.sort-by}} - # Allocs - {{/t.head}} - {{#t.body as |row|}} - {{client-node-row data-test-client-node-row node=row.model onClick=(action "gotoNode" row.model)}} - {{/t.body}} - {{/list-table}} -
- -
+ {{#if sortedNodes}} + {{#list-pagination + source=sortedNodes + size=pageSize + page=currentPage as |p|}} + {{#list-table + source=p.list + sortProperty=sortProperty + sortDescending=sortDescending + class="with-foot" as |t|}} + {{#t.head}} + + {{#t.sort-by prop="id"}}ID{{/t.sort-by}} + {{#t.sort-by class="is-200px is-truncatable" prop="name"}}Name{{/t.sort-by}} + {{#t.sort-by prop="status"}}State{{/t.sort-by}} + Address + {{#t.sort-by prop="datacenter"}}Datacenter{{/t.sort-by}} + # Allocs + {{/t.head}} + {{#t.body as |row|}} + {{client-node-row data-test-client-node-row node=row.model onClick=(action "gotoNode" row.model)}} + {{/t.body}} + {{/list-table}} +
+ +
+ {{/list-pagination}} {{else}}
{{#if (eq nodes.length 0)}} @@ -84,6 +86,6 @@

No clients match the term {{searchTerm}}

{{/if}}
- {{/list-pagination}} + {{/if}} {{/if}} diff --git a/ui/app/templates/components/freestyle/sg-dropdown.hbs b/ui/app/templates/components/freestyle/sg-dropdown.hbs index c15239eb7..361fb1635 100644 --- a/ui/app/templates/components/freestyle/sg-dropdown.hbs +++ b/ui/app/templates/components/freestyle/sg-dropdown.hbs @@ -4,7 +4,7 @@ selected=selectedOption searchField="name" searchEnabled=(gt options.length 10) - onchange=(action (mut selectedOption)) + onChange=(action (mut selectedOption)) as |option|}} {{option.name}} {{/power-select}} @@ -22,7 +22,7 @@ selected=selectedOption2 searchField="name" searchEnabled=(gt options.length 10) - onchange=(action (mut selectedOption2)) + onChange=(action (mut selectedOption2)) as |option|}} {{option.name}} {{/power-select}} @@ -42,7 +42,7 @@ selected=selectedOption3 searchField="name" searchEnabled=(gt manyOptions.length 10) - onchange=(action (mut selectedOption3)) + onChange=(action (mut selectedOption3)) as |option|}} {{option.name}} {{/power-select}} diff --git a/ui/app/templates/components/freestyle/sg-gutter-menu.hbs b/ui/app/templates/components/freestyle/sg-gutter-menu.hbs index 8ccc3e759..001dfe524 100644 --- a/ui/app/templates/components/freestyle/sg-gutter-menu.hbs +++ b/ui/app/templates/components/freestyle/sg-gutter-menu.hbs @@ -37,7 +37,7 @@ {{#power-select selected=(or selection "One") options=(array "One" "Two" "Three") - onchange=(action (mut selection)) + onChange=(action (mut selection)) as |option|}} {{option}} {{/power-select}} diff --git a/ui/app/templates/components/gutter-menu.hbs b/ui/app/templates/components/gutter-menu.hbs index 4c182af6f..a4ba2aa23 100644 --- a/ui/app/templates/components/gutter-menu.hbs +++ b/ui/app/templates/components/gutter-menu.hbs @@ -36,7 +36,7 @@ selected=system.activeNamespace searchField="name" searchEnabled=(gt sortedNamespaces.length 10) - onchange=(action gotoJobsForNamespace) + onChange=(action gotoJobsForNamespace) tagName="div" class="namespace-switcher" as |namespace|}} diff --git a/ui/app/templates/components/job-page/parts/children.hbs b/ui/app/templates/components/job-page/parts/children.hbs index 944168f1b..906eb30b3 100644 --- a/ui/app/templates/components/job-page/parts/children.hbs +++ b/ui/app/templates/components/job-page/parts/children.hbs @@ -2,41 +2,43 @@ Job Launches
- {{#list-pagination - source=sortedChildren - size=pageSize - page=currentPage as |p|}} - {{#list-table - source=p.list - sortProperty=sortProperty - sortDescending=sortDescending - class="with-foot" as |t|}} - {{#t.head}} - {{#t.sort-by prop="name"}}Name{{/t.sort-by}} - {{#t.sort-by prop="status"}}Status{{/t.sort-by}} - {{#t.sort-by prop="type"}}Type{{/t.sort-by}} - {{#t.sort-by prop="priority"}}Priority{{/t.sort-by}} - Groups - Summary - {{/t.head}} - {{#t.body key="model.id" as |row|}} - {{job-row data-test-job-row job=row.model onClick=(action gotoJob row.model)}} - {{/t.body}} - {{/list-table}} -
- -
+ {{#if sortedChildren}} + {{#list-pagination + source=sortedChildren + size=pageSize + page=currentPage as |p|}} + {{#list-table + source=p.list + sortProperty=sortProperty + sortDescending=sortDescending + class="with-foot" as |t|}} + {{#t.head}} + {{#t.sort-by prop="name"}}Name{{/t.sort-by}} + {{#t.sort-by prop="status"}}Status{{/t.sort-by}} + {{#t.sort-by prop="type"}}Type{{/t.sort-by}} + {{#t.sort-by prop="priority"}}Priority{{/t.sort-by}} + Groups + Summary + {{/t.head}} + {{#t.body key="model.id" as |row|}} + {{job-row data-test-job-row job=row.model onClick=(action gotoJob row.model)}} + {{/t.body}} + {{/list-table}} +
+ +
+ {{/list-pagination}} {{else}}

No Job Launches

No remaining living job launches.

- {{/list-pagination}} + {{/if}}
diff --git a/ui/app/templates/components/list-pagination.hbs b/ui/app/templates/components/list-pagination.hbs index e42c7fc62..ce74865a0 100644 --- a/ui/app/templates/components/list-pagination.hbs +++ b/ui/app/templates/components/list-pagination.hbs @@ -10,7 +10,5 @@ startsAt=startsAt endsAt=endsAt list=list -)}} -{{else}} - {{yield to="inverse"}} + )}} {{/if}} diff --git a/ui/app/templates/components/multi-select-dropdown.hbs b/ui/app/templates/components/multi-select-dropdown.hbs index f7b48e149..b2e4c89fb 100644 --- a/ui/app/templates/components/multi-select-dropdown.hbs +++ b/ui/app/templates/components/multi-select-dropdown.hbs @@ -1,36 +1,43 @@ -{{#basic-dropdown - horizontalPosition="left" - onOpen=(action (queue - (action (mut isOpen) true) - (action capture) - )) - onClose=(action (mut isOpen) false) - as |dd|}} - {{#dd.trigger data-test-dropdown-trigger class="dropdown-trigger" onKeyDown=(action "openOnArrowDown")}} - + + + - {{/dd.trigger}} - {{#dd.content class="dropdown-options"}} + +
    {{#each options key="key" as |option|}} - {{else}} - No options + + No options + {{/each}}
- {{/dd.content}} -{{/basic-dropdown}} \ No newline at end of file +
+
\ No newline at end of file diff --git a/ui/app/templates/components/region-switcher.hbs b/ui/app/templates/components/region-switcher.hbs index df2da1870..7cd46037a 100644 --- a/ui/app/templates/components/region-switcher.hbs +++ b/ui/app/templates/components/region-switcher.hbs @@ -6,7 +6,7 @@ options=sortedRegions selected=system.activeRegion searchEnabled=false - onchange=(action gotoRegion) as |region|}} + onChange=(action gotoRegion) as |region|}} Region: {{region}} {{/power-select}} {{/if}} diff --git a/ui/app/templates/jobs/index.hbs b/ui/app/templates/jobs/index.hbs index 79baa065f..417aeaaa0 100644 --- a/ui/app/templates/jobs/index.hbs +++ b/ui/app/templates/jobs/index.hbs @@ -52,40 +52,42 @@ {{/if}} - {{#list-pagination - source=sortedJobs - size=pageSize - page=currentPage as |p|}} - {{#list-table - source=p.list - sortProperty=sortProperty - sortDescending=sortDescending - class="with-foot" as |t|}} - {{#t.head}} - {{#t.sort-by prop="name"}}Name{{/t.sort-by}} - {{#t.sort-by prop="status"}}Status{{/t.sort-by}} - {{#t.sort-by prop="type"}}Type{{/t.sort-by}} - {{#t.sort-by prop="priority"}}Priority{{/t.sort-by}} - Groups - Summary - {{/t.head}} - {{#t.body key="model.id" as |row|}} - {{job-row data-test-job-row=row.model.plainId job=row.model onClick=(action "gotoJob" row.model)}} - {{/t.body}} - {{/list-table}} -
- -
+ {{#if sortedJobs}} + {{#list-pagination + source=sortedJobs + size=pageSize + page=currentPage as |p|}} + {{#list-table + source=p.list + sortProperty=sortProperty + sortDescending=sortDescending + class="with-foot" as |t|}} + {{#t.head}} + {{#t.sort-by prop="name"}}Name{{/t.sort-by}} + {{#t.sort-by prop="status"}}Status{{/t.sort-by}} + {{#t.sort-by prop="type"}}Type{{/t.sort-by}} + {{#t.sort-by prop="priority"}}Priority{{/t.sort-by}} + Groups + Summary + {{/t.head}} + {{#t.body key="model.id" as |row|}} + {{job-row data-test-job-row=row.model.plainId job=row.model onClick=(action "gotoJob" row.model)}} + {{/t.body}} + {{/list-table}} +
+ +
+ {{/list-pagination}} {{else}}
{{#if (eq visibleJobs.length 0)}} @@ -103,6 +105,6 @@

No jobs match the term {{searchTerm}}

{{/if}}
- {{/list-pagination}} + {{/if}} {{/if}} diff --git a/ui/app/templates/jobs/job/allocations.hbs b/ui/app/templates/jobs/job/allocations.hbs index 062a43b30..893117490 100644 --- a/ui/app/templates/jobs/job/allocations.hbs +++ b/ui/app/templates/jobs/job/allocations.hbs @@ -11,46 +11,48 @@ placeholder="Search allocations..."}} - {{#list-pagination - source=sortedAllocations - size=pageSize - page=currentPage - class="allocations" as |p|}} - {{#list-table - source=p.list - sortProperty=sortProperty - sortDescending=sortDescending - class="with-foot" as |t|}} - {{#t.head}} - - {{#t.sort-by prop="shortId"}}ID{{/t.sort-by}} - {{#t.sort-by prop="taskGroupName"}}Task Group{{/t.sort-by}} - {{#t.sort-by prop="createIndex" title="Create Index"}}Created{{/t.sort-by}} - {{#t.sort-by prop="modifyIndex" title="Modify Index"}}Modified{{/t.sort-by}} - {{#t.sort-by prop="statusIndex"}}Status{{/t.sort-by}} - {{#t.sort-by prop="jobVersion"}}Version{{/t.sort-by}} - {{#t.sort-by prop="node.shortId"}}Client{{/t.sort-by}} - CPU - Memory - {{/t.head}} - {{#t.body as |row|}} - {{allocation-row - data-test-allocation=row.model.id - allocation=row.model - context="job" - onClick=(action "gotoAllocation" row.model)}} - {{/t.body}} - {{/list-table}} -
- -
+ {{#if sortedAllocations}} + {{#list-pagination + source=sortedAllocations + size=pageSize + page=currentPage + class="allocations" as |p|}} + {{#list-table + source=p.list + sortProperty=sortProperty + sortDescending=sortDescending + class="with-foot" as |t|}} + {{#t.head}} + + {{#t.sort-by prop="shortId"}}ID{{/t.sort-by}} + {{#t.sort-by prop="taskGroupName"}}Task Group{{/t.sort-by}} + {{#t.sort-by prop="createIndex" title="Create Index"}}Created{{/t.sort-by}} + {{#t.sort-by prop="modifyIndex" title="Modify Index"}}Modified{{/t.sort-by}} + {{#t.sort-by prop="statusIndex"}}Status{{/t.sort-by}} + {{#t.sort-by prop="jobVersion"}}Version{{/t.sort-by}} + {{#t.sort-by prop="node.shortId"}}Client{{/t.sort-by}} + CPU + Memory + {{/t.head}} + {{#t.body as |row|}} + {{allocation-row + data-test-allocation=row.model.id + allocation=row.model + context="job" + onClick=(action "gotoAllocation" row.model)}} + {{/t.body}} + {{/list-table}} +
+ +
+ {{/list-pagination}} {{else}}
@@ -58,7 +60,7 @@

No allocations match the term {{searchTerm}}

- {{/list-pagination}} + {{/if}} {{else}}
diff --git a/ui/app/templates/jobs/job/task-group.hbs b/ui/app/templates/jobs/job/task-group.hbs index c74461a8e..d3d104ec2 100644 --- a/ui/app/templates/jobs/job/task-group.hbs +++ b/ui/app/templates/jobs/job/task-group.hbs @@ -52,41 +52,43 @@ inputClass="is-compact"}}
- {{#list-pagination - source=sortedAllocations - size=pageSize - page=currentPage - class="allocations" as |p|}} - {{#list-table - source=p.list - sortProperty=sortProperty - sortDescending=sortDescending - class="with-foot" as |t|}} - {{#t.head}} - - {{#t.sort-by prop="shortId"}}ID{{/t.sort-by}} - {{#t.sort-by prop="createIndex" title="Create Index"}}Created{{/t.sort-by}} - {{#t.sort-by prop="modifyIndex" title="Modify Index"}}Modified{{/t.sort-by}} - {{#t.sort-by prop="statusIndex"}}Status{{/t.sort-by}} - {{#t.sort-by prop="jobVersion"}}Version{{/t.sort-by}} - {{#t.sort-by prop="node.shortId"}}Client{{/t.sort-by}} - CPU - Memory - {{/t.head}} - {{#t.body as |row|}} - {{allocation-row data-test-allocation=row.model.id allocation=row.model context="taskGroup" onClick=(action "gotoAllocation" row.model)}} - {{/t.body}} - {{/list-table}} -
- -
+ {{#if sortedAllocations}} + {{#list-pagination + source=sortedAllocations + size=pageSize + page=currentPage + class="allocations" as |p|}} + {{#list-table + source=p.list + sortProperty=sortProperty + sortDescending=sortDescending + class="with-foot" as |t|}} + {{#t.head}} + + {{#t.sort-by prop="shortId"}}ID{{/t.sort-by}} + {{#t.sort-by prop="createIndex" title="Create Index"}}Created{{/t.sort-by}} + {{#t.sort-by prop="modifyIndex" title="Modify Index"}}Modified{{/t.sort-by}} + {{#t.sort-by prop="statusIndex"}}Status{{/t.sort-by}} + {{#t.sort-by prop="jobVersion"}}Version{{/t.sort-by}} + {{#t.sort-by prop="node.shortId"}}Client{{/t.sort-by}} + CPU + Memory + {{/t.head}} + {{#t.body as |row|}} + {{allocation-row data-test-allocation=row.model.id allocation=row.model context="taskGroup" onClick=(action "gotoAllocation" row.model)}} + {{/t.body}} + {{/list-table}} +
+ +
+ {{/list-pagination}} {{else}} {{#if allocations.length}}
@@ -103,7 +105,7 @@
{{/if}} - {{/list-pagination}} + {{/if}}
diff --git a/ui/app/utils/classes/abstract-logger.js b/ui/app/utils/classes/abstract-logger.js index 574669ea1..d90b785c1 100644 --- a/ui/app/utils/classes/abstract-logger.js +++ b/ui/app/utils/classes/abstract-logger.js @@ -1,6 +1,7 @@ import { assert } from '@ember/debug'; import Mixin from '@ember/object/mixin'; import { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { assign } from '@ember/polyfills'; import queryString from 'query-string'; @@ -8,7 +9,7 @@ const MAX_OUTPUT_LENGTH = 50000; export default Mixin.create({ url: '', - params: computed(() => ({})), + params: overridable(() => ({})), logFetch() { assert('Loggers need a logFetch method, which should have an interface like window.fetch'); }, @@ -22,7 +23,7 @@ export default Mixin.create({ : { origin: 'end', offset: MAX_OUTPUT_LENGTH }; }), - additionalParams: computed(() => ({})), + additionalParams: overridable(() => ({})), fullUrl: computed('url', 'params', 'offsetParams', 'additionalParams', function() { const queryParams = queryString.stringify( diff --git a/ui/app/utils/classes/log.js b/ui/app/utils/classes/log.js index 597dfdc88..c1ebb6763 100644 --- a/ui/app/utils/classes/log.js +++ b/ui/app/utils/classes/log.js @@ -3,6 +3,7 @@ import { assert } from '@ember/debug'; import { htmlSafe } from '@ember/template'; import Evented from '@ember/object/evented'; import EmberObject, { computed } from '@ember/object'; +import { computed as overridable } from 'ember-overridable-computed'; import { assign } from '@ember/polyfills'; import queryString from 'query-string'; import { task } from 'ember-concurrency'; @@ -20,7 +21,7 @@ const Log = EmberObject.extend(Evented, { // Parameters url: '', - params: computed(() => ({})), + params: overridable(() => ({})), plainText: false, logFetch() { assert('Log objects need a logFetch method, which should have an interface like window.fetch'); diff --git a/ui/app/utils/no-leader-error.js b/ui/app/utils/no-leader-error.js index cf29a8119..7b70918db 100644 --- a/ui/app/utils/no-leader-error.js +++ b/ui/app/utils/no-leader-error.js @@ -1,4 +1,4 @@ -import { AdapterError } from 'ember-data/adapters/errors'; +import AdapterError from '@ember-data/adapter/error'; export const NO_LEADER = 'No cluster leader'; diff --git a/ui/config/deprecation-workflow.js b/ui/config/deprecation-workflow.js index 7082caeb4..7521a2d3c 100644 --- a/ui/config/deprecation-workflow.js +++ b/ui/config/deprecation-workflow.js @@ -8,5 +8,6 @@ self.deprecationWorkflow.config = { // Only used in ivy-codemirror. // PR open: https://github.com/IvyApp/ivy-codemirror/pull/40/files { handler: 'log', matchId: 'ember-component.send-action' }, + { handler: 'log', matchId: 'ember-test-helpers.rendering-context.jquery-element' }, ], }; diff --git a/ui/config/environment.js b/ui/config/environment.js index 56f9179f0..cb63b9f71 100644 --- a/ui/config/environment.js +++ b/ui/config/environment.js @@ -15,8 +15,7 @@ module.exports = function(environment) { EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build - // e.g. 'with-controller': true - 'ember-routing-router-service': true, + // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, EXTEND_PROTOTYPES: { // Prevent Ember Data from overriding Date.parse. diff --git a/ui/lib/bulma/package.json b/ui/lib/bulma/package.json index 5dc02af6c..77b1ab90e 100644 --- a/ui/lib/bulma/package.json +++ b/ui/lib/bulma/package.json @@ -2,5 +2,9 @@ "name": "bulma", "keywords": [ "ember-addon" - ] + ], + "devDependencies": { + "broccoli-funnel": "^2.0.1", + "bulma": "0.6.1" + } } diff --git a/ui/package.json b/ui/package.json index 0fcd03dea..48c61f5c0 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,15 +21,21 @@ } }, "lint-staged": { - "{app,tests,config,lib,mirage}/**/*.js": ["prettier --write", "git add"], - "app/styles/**/*.*": ["prettier --write", "git add"] + "{app,tests,config,lib,mirage}/**/*.js": [ + "prettier --write", + "git add" + ], + "app/styles/**/*.*": [ + "prettier --write", + "git add" + ] }, "devDependencies": { - "anser": "^1.4.8", "@babel/plugin-proposal-object-rest-spread": "^7.4.3", "@ember/jquery": "^0.6.0", "@ember/optional-features": "^0.7.0", "@hashicorp/structure-icons": "^1.3.0", + "anser": "^1.4.8", "broccoli-asset-rev": "^3.0.0", "bulma": "0.6.1", "core-js": "^2.4.1", @@ -43,48 +49,50 @@ "d3-transition": "^1.1.0", "ember-ajax": "^5.0.0", "ember-auto-import": "^1.2.21", - "ember-cli": "~3.4.4", - "ember-cli-babel": "^7.1.2", + "ember-cli": "~3.12.0", + "ember-cli-babel": "^7.7.3", "ember-cli-clipboard": "^0.13.0", - "ember-cli-dependency-checker": "^3.0.0", + "ember-cli-dependency-checker": "^3.1.0", "ember-cli-deprecation-workflow": "^1.0.1", "ember-cli-eslint": "^5.1.0", "ember-cli-funnel": "^0.6.1", - "ember-cli-htmlbars": "^3.0.0", - "ember-cli-htmlbars-inline-precompile": "^1.0.3", + "ember-cli-htmlbars": "^3.0.1", + "ember-cli-htmlbars-inline-precompile": "^2.1.0", "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-mirage": "^1.1.2", "ember-cli-moment-shim": "^3.5.0", "ember-cli-page-object": "^1.15.1", - "ember-cli-qunit": "^4.3.2", "ember-cli-sass": "^10.0.0", "ember-cli-sri": "^2.1.1", "ember-cli-string-helpers": "^1.5.0", "ember-cli-template-lint": "^1.0.0-beta.1", "ember-cli-uglify": "^2.1.0", "ember-composable-helpers": "^2.0.3", - "ember-concurrency": "^0.9.0", + "ember-concurrency": "^1.0.0", "ember-copy": "^1.0.0", - "ember-data": "~3.4.0", - "ember-data-model-fragments": "3.3.0", + "ember-data": "~3.12.0", + "ember-data-model-fragments": "4.0.0", "ember-export-application-global": "^2.0.0", "ember-fetch": "^6.5.0", "ember-freestyle": "~0.10.0", "ember-inflector": "^3.0.0", - "ember-inline-svg": "^0.2.1", - "ember-load-initializers": "^1.1.0", + "ember-inline-svg": "^0.3.0", + "ember-load-initializers": "^2.0.0", "ember-maybe-import-regenerator": "^0.1.6", "ember-moment": "^7.8.1", + "ember-overridable-computed": "^1.0.0", "ember-page-title": "^5.0.2", - "ember-power-select": "^2.2.3", + "ember-power-select": "^3.0.4", + "ember-qunit": "^4.4.1", "ember-qunit-nice-errors": "^1.2.0", "ember-resolver": "^5.0.1", - "ember-responsive": "^3.0.0", - "ember-sinon": "^2.2.0", - "ember-source": "~3.4.0", + "ember-responsive": "^3.0.4", + "ember-sinon": "^4.0.0", + "ember-source": "~3.12.0", "ember-test-selectors": "^2.1.0", "ember-truth-helpers": "^2.0.0", "eslint": "^5.16.0", + "eslint-plugin-node": "^9.0.1", "faker": "^4.1.0", "flat": "^4.0.0", "fuse.js": "^3.4.4", @@ -101,11 +109,13 @@ "sass": "^1.17.3" }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "8.* || >= 10.*" }, "private": true, "ember-addon": { - "paths": ["lib/bulma"] + "paths": [ + "lib/bulma" + ] }, "dependencies": { "lru_map": "^0.3.3" diff --git a/ui/tests/integration/attributes-table-test.js b/ui/tests/integration/attributes-table-test.js index cc95f80a0..34044dd51 100644 --- a/ui/tests/integration/attributes-table-test.js +++ b/ui/tests/integration/attributes-table-test.js @@ -32,7 +32,7 @@ module('Integration | Component | attributes table', function(hooks) { const rowsCount = Object.keys(flatten(commonAttributes)).length; assert.equal( - this.$('[data-test-attributes-section]').has('[data-test-value]').length, + this.element.querySelectorAll('[data-test-attributes-section] [data-test-value]').length, rowsCount, `Table has ${rowsCount} rows with values` ); diff --git a/ui/tests/integration/list-pagination-test.js b/ui/tests/integration/list-pagination-test.js index 94c12788d..d6a48d0e4 100644 --- a/ui/tests/integration/list-pagination-test.js +++ b/ui/tests/integration/list-pagination-test.js @@ -160,35 +160,6 @@ module('Integration | Component | list pagination', function(hooks) { ); }); - // when there are no items in source - test('when there are no items in source', async function(assert) { - this.set('source', []); - await render(hbs` - {{#list-pagination source=source as |p|}} - {{p.currentPage}} of {{p.totalPages}} - {{#p.first}}first{{/p.first}} - {{#p.prev}}prev{{/p.prev}} - {{#each p.pageLinks as |link|}} - {{link.pageNumber}} - {{/each}} - {{#p.next}}next{{/p.next}} - {{#p.last}}last{{/p.last}} - - {{#each p.list as |item|}} -
{{item}}
- {{/each}} - {{else}} -
Empty State
- {{/list-pagination}} - `); - - assert.ok( - !findAll('.page-info, .first, .prev, .link, .next, .last, .item').length, - 'Nothing in the yield renders' - ); - assert.ok(findAll('.empty-state').length, 'Empty state is rendered'); - }); - // when there is less pages than the total spread amount test('when there is less pages than the total spread amount', async function(assert) { this.setProperties({ diff --git a/ui/tests/integration/list-table-test.js b/ui/tests/integration/list-table-test.js index 5d8f23c1e..be1b835b4 100644 --- a/ui/tests/integration/list-table-test.js +++ b/ui/tests/integration/list-table-test.js @@ -59,31 +59,10 @@ module('Integration | Component | list table', function(hooks) { // list-table is not responsible for sorting, only dispatching sort events. The table is still // rendered in index-order. this.get('source').forEach((item, index) => { - const $item = this.$(`.item:eq(${index})`); - assert.equal( - $item - .find('td:eq(0)') - .text() - .trim(), - item.firstName, - 'First name' - ); - assert.equal( - $item - .find('td:eq(1)') - .text() - .trim(), - item.lastName, - 'Last name' - ); - assert.equal( - $item - .find('td:eq(2)') - .text() - .trim(), - item.age, - 'Age' - ); + const $item = this.element.querySelectorAll('.item')[index]; + assert.equal($item.querySelectorAll('td')[0].innerHTML.trim(), item.firstName, 'First name'); + assert.equal($item.querySelectorAll('td')[1].innerHTML.trim(), item.lastName, 'Last name'); + assert.equal($item.querySelectorAll('td')[2].innerHTML.trim(), item.age, 'Age'); }); }); diff --git a/ui/tests/unit/adapters/job-test.js b/ui/tests/unit/adapters/job-test.js index 6c7c94503..d2710f9be 100644 --- a/ui/tests/unit/adapters/job-test.js +++ b/ui/tests/unit/adapters/job-test.js @@ -57,6 +57,7 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), [`/v1/job/${jobName}`], @@ -75,6 +76,7 @@ module('Unit | Adapter | Job', function(hooks) { const jobId = JSON.stringify([jobName, jobNamespace]); this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), @@ -94,6 +96,7 @@ module('Unit | Adapter | Job', function(hooks) { const jobId = JSON.stringify([jobName, jobNamespace]); this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), @@ -111,6 +114,7 @@ module('Unit | Adapter | Job', function(hooks) { const jobId = JSON.stringify([jobName, jobNamespace]); this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), @@ -126,6 +130,7 @@ module('Unit | Adapter | Job', function(hooks) { const jobId = JSON.stringify(['job-1', 'default']); this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); assert.notOk( pretender.handledRequests.mapBy('requestHeaders').some(headers => headers['X-Nomad-Token']), @@ -142,6 +147,7 @@ module('Unit | Adapter | Job', function(hooks) { this.subject().set('token.secret', secret); this.subject().findRecord(null, { modelName: 'job' }, jobId); + await settled(); assert.ok( pretender.handledRequests @@ -242,6 +248,8 @@ module('Unit | Adapter | Job', function(hooks) { await settled(); this.subject().reloadRelationship(mockModel, 'summary', { watch: true }); + await settled(); + assert.equal( pretender.handledRequests[1].url, '/v1/job/job-1/summary?index=2', @@ -377,6 +385,7 @@ module('Unit | Adapter | Job', function(hooks) { await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); this.subject().findAll(null, { modelName: 'job' }, null); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), @@ -399,6 +408,7 @@ module('Unit | Adapter | Job', function(hooks) { await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); this.subject().findAll(null, { modelName: 'job' }, null); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), @@ -420,6 +430,7 @@ module('Unit | Adapter | Job', function(hooks) { await settled(); this.subject().findRecord(null, { modelName: 'job' }, jobId); this.subject().findAll(null, { modelName: 'job' }, null); + await settled(); assert.deepEqual( pretender.handledRequests.mapBy('url'), diff --git a/ui/yarn.lock b/ui/yarn.lock index 8b5bbec3a..9ed59c38c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -56,12 +56,42 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" - integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== +"@babel/core@^7.4.3": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91" + integrity sha512-l8zto/fuoZIbncm+01p8zPSDZu/VuuJhAfA7d/AbzM09WR7iVhavvfNDYCNpo1VvLk6E6xgAoP9P+/EMJHuRkQ== dependencies: - "@babel/types" "^7.4.0" + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.2" + "@babel/helpers" "^7.6.2" + "@babel/parser" "^7.6.2" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.4.0", "@babel/generator@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.2.tgz#dac8a3c2df118334c2a29ff3446da1636a8f8c03" + integrity sha512-j8iHaIW4gGPnViaIHI7e9t/Hl8qLjERI6DcV9kEpAIDJsAOrcnXqRS7t+QbhL76pwbtqP+QCQLL0z1CyVmtjjQ== + dependencies: + "@babel/types" "^7.6.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + +"@babel/generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.0.tgz#f20e4b7a91750ee8b63656073d843d2a736dca4a" + integrity sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA== + dependencies: + "@babel/types" "^7.5.0" jsesc "^2.5.1" lodash "^4.17.11" source-map "^0.5.0" @@ -93,34 +123,34 @@ "@babel/helper-explode-assignable-expression" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-call-delegate@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz#f308eabe0d44f451217853aedf4dea5f6fe3294f" - integrity sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ== +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== dependencies: - "@babel/helper-hoist-variables" "^7.4.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" -"@babel/helper-create-class-features-plugin@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.0.tgz#30fd090e059d021995c1762a5b76798fa0b51d82" - integrity sha512-2K8NohdOT7P6Vyp23QH4w2IleP8yG3UJsbRKwA4YP6H8fErcLkFuuEEqbF2/BYBKSNci/FWJiqm6R3VhM/QHgw== +"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.0.tgz#02edb97f512d44ba23b3227f1bf2ed43454edac5" + integrity sha512-EAoMc3hE5vE5LNhMqDOwB1usHvmRjCDAnH8CD4PVkX9/Yr3W/tcz8xE8QvdZxfsFBDICwZnF2UTHIqslRpvxmA== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" -"@babel/helper-define-map@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz#cbfd8c1b2f12708e262c26f600cd16ed6a3bc6c9" - integrity sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA== +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== dependencies: "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.4.0" + "@babel/types" "^7.4.4" lodash "^4.17.11" "@babel/helper-explode-assignable-expression@^7.1.0": @@ -147,12 +177,12 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-hoist-variables@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz#25b621399ae229869329730a62015bbeb0a6fbd6" - integrity sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw== +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== dependencies: - "@babel/types" "^7.4.0" + "@babel/types" "^7.4.4" "@babel/helper-member-expression-to-functions@^7.0.0": version "7.0.0" @@ -168,17 +198,17 @@ dependencies: "@babel/types" "^7.0.0" -"@babel/helper-module-transforms@^7.1.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" - integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== +"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" - "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/template" "^7.2.2" - "@babel/types" "^7.2.2" - lodash "^4.17.10" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" @@ -192,12 +222,12 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== -"@babel/helper-regex@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" - integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== dependencies: - lodash "^4.17.10" + lodash "^4.17.11" "@babel/helper-remap-async-to-generator@^7.1.0": version "7.1.0" @@ -210,15 +240,15 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz#4f56adb6aedcd449d2da9399c2dcf0545463b64c" - integrity sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg== +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== dependencies: "@babel/helper-member-expression-to-functions" "^7.0.0" "@babel/helper-optimise-call-expression" "^7.0.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" "@babel/helper-simple-access@^7.1.0": version "7.1.0" @@ -228,14 +258,7 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" - integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== - dependencies: - "@babel/types" "^7.4.0" - -"@babel/helper-split-export-declaration@^7.4.4": +"@babel/helper-split-export-declaration@^7.4.0", "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== @@ -252,14 +275,14 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.0": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.2.tgz#3bdfa46a552ca77ef5a0f8551be5f0845ae989be" - integrity sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg== +"@babel/helpers@^7.4.0", "@babel/helpers@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" + integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== dependencies: - "@babel/template" "^7.4.0" - "@babel/traverse" "^7.4.0" - "@babel/types" "^7.4.0" + "@babel/template" "^7.6.0" + "@babel/traverse" "^7.6.2" + "@babel/types" "^7.6.0" "@babel/helpers@^7.5.5": version "7.5.5" @@ -271,9 +294,9 @@ "@babel/types" "^7.5.5" "@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== dependencies: chalk "^2.0.0" esutils "^2.0.2" @@ -284,10 +307,15 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g== -"@babel/parser@^7.4.0": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.2.tgz#b4521a400cb5a871eab3890787b4bc1326d38d91" - integrity sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g== +"@babel/parser@^7.4.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" + integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== + +"@babel/parser@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.0.tgz#3e0713dff89ad6ae37faec3b29dcfc5c979770b7" + integrity sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA== "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" @@ -298,23 +326,31 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@^7.3.4": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz#d70db61a2f1fd79de927eea91f6411c964e084b8" - integrity sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg== +"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.3.4": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.0.tgz#5bc6a0537d286fcb4fd4e89975adbca334987007" + integrity sha512-9L/JfPCT+kShiiTTzcnBJ8cOwdKVmlC1RcCf9F0F9tERVrM4iWtWnXtjWCRqNm2la2BxO1MPArWNsU9zsSJWSQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-create-class-features-plugin" "^7.5.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-decorators@^7.3.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz#8e1bfd83efa54a5f662033afcc2b8e701f4bb3a9" - integrity sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0" + integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.0" + "@babel/helper-create-class-features-plugin" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-decorators" "^7.2.0" +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506" + integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -323,18 +359,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.0.tgz#e4960575205eadf2a1ab4e0c79f9504d5b82a97f" - integrity sha512-uTNi8pPYyUH2eWHyYWWSYJKwKg34hhgl4/dbejEjL+64OhbHjTX7wEVWMQl82tEmdDsGeu77+s8HHLS627h6OQ== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.4.3": - version "7.4.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz#be27cd416eceeba84141305b93c282f5de23bbb4" - integrity sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g== +"@babel/plugin-proposal-object-rest-spread@^7.4.3", "@babel/plugin-proposal-object-rest-spread@^7.5.4": + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.4.tgz#250de35d867ce8260a31b1fdac6c4fc1baa99331" + integrity sha512-KCx0z3y7y8ipZUMAEEJOyNi11lMb/FOPUjjB113tfowgw0c16EGYos7worCKBcUAh2oG+OBnoUhsnTSoLpV9uA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" @@ -347,13 +375,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz#202d91ee977d760ef83f4f416b280d568be84623" - integrity sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w== +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78" + integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" + "@babel/helper-regex" "^7.4.4" regexpu-core "^4.5.4" "@babel/plugin-syntax-async-generators@^7.2.0": @@ -398,6 +426,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-arrow-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" @@ -405,10 +440,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz#234fe3e458dce95865c0d152d256119b237834b0" - integrity sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g== +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" + integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -421,26 +456,34 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz#164df3bb41e3deb954c4ca32ffa9fcaa56d30bcb" - integrity sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ== +"@babel/plugin-transform-block-scoping@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.11" -"@babel/plugin-transform-classes@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.0.tgz#e3428d3c8a3d01f33b10c529b998ba1707043d4d" - integrity sha512-XGg1Mhbw4LDmrO9rSTNe+uI79tQPdGs0YASlxgweYRLZqo/EQktjaOV4tchL/UZbM0F+/94uOipmdNGoaGOEYg== +"@babel/plugin-transform-block-scoping@^7.5.5": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.2.tgz#96c33ab97a9ae500cc6f5b19e04a7e6553360a79" + integrity sha512-zZT8ivau9LOQQaOGC7bQLQOT4XPkPXgN2ERfUgk1X8ql+mVkLc4E8eKk+FO3o0154kxzqenWCorfmEXpEZcrSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.13" + +"@babel/plugin-transform-classes@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.4.0" + "@babel/helper-define-map" "^7.4.4" "@babel/helper-function-name" "^7.1.0" "@babel/helper-optimise-call-expression" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.4.0" - "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -450,26 +493,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.0.tgz#acbb9b2418d290107db333f4d6cd8aa6aea00343" - integrity sha512-HySkoatyYTY3ZwLI8GGvkRWCFrjAGXUHur5sMecmCIdIharnlcWWivOqDJI76vvmVZfzwb6G08NREsrY96RhGQ== +"@babel/plugin-transform-destructuring@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a" + integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" - integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== +"@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3" + integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" -"@babel/plugin-transform-duplicate-keys@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" - integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== +"@babel/plugin-transform-duplicate-keys@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" + integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -481,17 +524,17 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-for-of@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.0.tgz#56c8c36677f5d4a16b80b12f7b768de064aaeb5f" - integrity sha512-vWdfCEYLlYSxbsKj5lGtzA49K3KANtb8qCPQ1em07txJzsBwY+cKJzBHizj5fl3CCx7vt+WPdgDLTHmydkbQSQ== +"@babel/plugin-transform-for-of@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-function-name@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" - integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== +"@babel/plugin-transform-function-name@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== dependencies: "@babel/helper-function-name" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -503,30 +546,40 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.2.0": +"@babel/plugin-transform-member-expression-literals@^7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" - integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.0.0", "@babel/plugin-transform-modules-amd@^7.2.0", "@babel/plugin-transform-modules-amd@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" + integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== dependencies: "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.0.tgz#3b8ec61714d3b75d20c5ccfa157f2c2e087fd4ca" - integrity sha512-iWKAooAkipG7g1IY0eah7SumzfnIT3WNhT4uYB2kIsvHnNSB6MDYVa5qyICSwaTBDBY2c4SnJ3JtEa6ltJd6Jw== +"@babel/plugin-transform-modules-commonjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74" + integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ== dependencies: - "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-module-transforms" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-simple-access" "^7.1.0" + babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz#c2495e55528135797bc816f5d50f851698c586a1" - integrity sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ== +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" + integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== dependencies: - "@babel/helper-hoist-variables" "^7.4.0" + "@babel/helper-hoist-variables" "^7.4.4" "@babel/helper-plugin-utils" "^7.0.0" + babel-plugin-dynamic-import-node "^2.3.0" "@babel/plugin-transform-modules-umd@^7.2.0": version "7.2.0" @@ -536,17 +589,17 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.2": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz#800391136d6cbcc80728dbdba3c1c6e46f86c12e" - integrity sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106" + integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg== dependencies: - regexp-tree "^0.1.0" + regexp-tree "^0.1.6" -"@babel/plugin-transform-new-target@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz#67658a1d944edb53c8d4fa3004473a0dd7838150" - integrity sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw== +"@babel/plugin-transform-new-target@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5" + integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -558,26 +611,40 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.1.0" -"@babel/plugin-transform-parameters@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.0.tgz#a1309426fac4eecd2a9439a4c8c35124a11a48a9" - integrity sha512-Xqv6d1X+doyiuCGDoVJFtlZx0onAX0tnc3dY8w71pv/O0dODAbusVv2Ale3cGOwfiyi895ivOBhYa9DhAM8dUA== +"@babel/plugin-transform-parameters@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== dependencies: - "@babel/helper-call-delegate" "^7.4.0" + "@babel/helper-call-delegate" "^7.4.4" "@babel/helper-get-function-arity" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-regenerator@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.0.tgz#0780e27ee458cc3fdbad18294d703e972ae1f6d1" - integrity sha512-SZ+CgL4F0wm4npojPU6swo/cK4FcbLgxLd4cWpHaNXY/NJ2dpahODCqBbAwb2rDmVszVb3SSjnk9/vik3AYdBw== +"@babel/plugin-transform-property-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== dependencies: - regenerator-transform "^0.13.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-reserved-words@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634" + integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-runtime@^7.2.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.0.tgz#b4d8c925ed957471bc57e0b9da53408ebb1ed457" - integrity sha512-1uv2h9wnRj98XX3g0l4q+O3jFM6HfayKup7aIu4pnnlzGz0H+cYckGBC74FZIWJXJSXAmeJ9Yu5Gg2RQpS4hWg== + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.5.0.tgz#45242c2c9281158c5f06d25beebac63e498a284e" + integrity sha512-LmPIZOAgTLl+86gR9KjLXex6P/lRz1fWEjTz6V6QZMmKie51ja3tvzdwORqhHc4RWR8TcZ5pClpRWs0mlaA2ng== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -606,10 +673,10 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" -"@babel/plugin-transform-template-literals@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" - integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== +"@babel/plugin-transform-template-literals@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== dependencies: "@babel/helper-annotate-as-pure" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -621,73 +688,86 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-unicode-regex@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" - integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== +"@babel/plugin-transform-typescript@~7.4.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" + integrity sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.0.0" - regexpu-core "^4.1.3" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-unicode-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" "@babel/polyfill@^7.0.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.0.tgz#90f9d68ae34ac42ab4b4aa03151848f536960218" - integrity sha512-bVsjsrtsDflIHp5I6caaAa2V25Kzn50HKPL6g3X0P0ni1ks+58cPB8Mz6AOKVuRPgaVdq/OwEUc/1vKqX+Mo4A== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893" + integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.2" "@babel/preset-env@^7.0.0": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.2.tgz#2f5ba1de2daefa9dcca653848f96c7ce2e406676" - integrity sha512-OEz6VOZaI9LW08CWVS3d9g/0jZA6YCn1gsKIy/fut7yZCJti5Lm1/Hi+uo/U+ODm7g4I6gULrCP+/+laT8xAsA== + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.5.4.tgz#64bc15041a3cbb0798930319917e70fcca57713d" + integrity sha512-hFnFnouyRNiH1rL8YkX1ANCNAUVC8Djwdqfev8i1415tnAG+7hlA5zhZ0Q/3Q5gkop4HioIPbCEWAalqcbxRoQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.0" + "@babel/plugin-proposal-object-rest-spread" "^7.5.4" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.0" + "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.0" - "@babel/plugin-transform-classes" "^7.4.0" + "@babel/plugin-transform-block-scoping" "^7.4.4" + "@babel/plugin-transform-classes" "^7.4.4" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.0" - "@babel/plugin-transform-dotall-regex" "^7.2.0" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.5.0" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" - "@babel/plugin-transform-for-of" "^7.4.0" - "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.4.4" + "@babel/plugin-transform-function-name" "^7.4.4" "@babel/plugin-transform-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.0" - "@babel/plugin-transform-modules-systemjs" "^7.4.0" + "@babel/plugin-transform-member-expression-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.5.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.2" - "@babel/plugin-transform-new-target" "^7.4.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-new-target" "^7.4.4" "@babel/plugin-transform-object-super" "^7.2.0" - "@babel/plugin-transform-parameters" "^7.4.0" - "@babel/plugin-transform-regenerator" "^7.4.0" + "@babel/plugin-transform-parameters" "^7.4.4" + "@babel/plugin-transform-property-literals" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.4.5" + "@babel/plugin-transform-reserved-words" "^7.2.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" "@babel/plugin-transform-spread" "^7.2.0" "@babel/plugin-transform-sticky-regex" "^7.2.0" - "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.2.0" - "@babel/types" "^7.4.0" - browserslist "^4.4.2" - core-js-compat "^3.0.0" + "@babel/plugin-transform-unicode-regex" "^7.4.4" + "@babel/types" "^7.5.0" + browserslist "^4.6.0" + core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" - semver "^5.3.0" + semver "^5.5.0" "@babel/runtime@7.0.0": version "7.0.0" @@ -697,22 +777,13 @@ regenerator-runtime "^0.12.0" "@babel/runtime@^7.2.0": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" - integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== + version "7.5.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.4.tgz#cb7d1ad7c6d65676e66b47186577930465b5271b" + integrity sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q== dependencies: regenerator-runtime "^0.13.2" -"@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.0": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" - integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.4.0" - "@babel/types" "^7.4.0" - -"@babel/template@^7.4.4": +"@babel/template@^7.1.0", "@babel/template@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== @@ -721,7 +792,16 @@ "@babel/parser" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6", "@babel/traverse@^7.4.0": +"@babel/template@^7.4.0", "@babel/template@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6" + integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.0" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" integrity sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA== @@ -751,7 +831,37 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.4.0": +"@babel/traverse@^7.4.0", "@babel/traverse@^7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.2.tgz#b0e2bfd401d339ce0e6c05690206d1e11502ce2c" + integrity sha512-8fRE76xNwNttVEF2TwxJDGBLWthUkHWSldmfuBzVRmEDWOtu4XdINTgN7TDWzuLg4bbeIMLvfMFD9we5YcWkRQ== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.6.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.6.2" + "@babel/types" "^7.6.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.4.4": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.0.tgz#4216d6586854ef5c3c4592dab56ec7eb78485485" + integrity sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.5.0" + "@babel/types" "^7.5.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== @@ -769,17 +879,140 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@ember/jquery@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.0.tgz#5fe9d39b15c9d47fe495302b2a6176059a6267cd" - integrity sha512-O81+JslKE7bsV+5wrhXEmBU1Bpte2u9bm6MLIoRYePvWDo50l7llDW1RM38l1KkeSj/s7iXTsviZ4uunhIcKow== +"@babel/types@^7.4.0", "@babel/types@^7.6.0": + version "7.6.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648" + integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g== dependencies: - broccoli-funnel "^2.0.1" + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.0.tgz#e47d43840c2e7f9105bc4d3a2c371b4d0c7832ab" + integrity sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@ember-data/-build-infra@3.12.4": + version "3.12.4" + resolved "https://registry.yarnpkg.com/@ember-data/-build-infra/-/-build-infra-3.12.4.tgz#891304b39a39768c81c1beef55f6b39c862a5868" + integrity sha512-+2ICbMg7QxVMb+asXInG0VIGV08CsSHVdDL1Sw6zkSMtAChGFij1anV160J97vRN/iUyHktkNgmaKUeooVCTPw== + dependencies: + "@babel/plugin-transform-block-scoping" "^7.5.5" + babel-plugin-debug-macros "^0.3.2" + babel-plugin-feature-flags "^0.3.1" + babel-plugin-filter-imports "^3.0.0" + babel6-plugin-strip-class-callcheck "^6.0.0" + broccoli-debug "^0.6.5" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.2" - ember-cli-babel "^7.4.0" - ember-cli-version-checker "^3.0.0" - jquery "^3.3.1" - resolve "^1.10.0" + broccoli-rollup "^4.1.1" + calculate-cache-key-for-tree "^2.0.0" + chalk "^2.4.1" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-version-checker "^3.1.2" + esm "^3.2.25" + git-repo-info "^2.0.0" + glob "^7.1.4" + npm-git-info "^1.0.3" + rimraf "^2.6.2" + rsvp "^4.8.5" + silent-error "^1.1.1" + +"@ember-data/adapter@3.12.4": + version "3.12.4" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.12.4.tgz#7bcab0f3775d088b978c27e085e0d6906ee944cf" + integrity sha512-uPLEs9ms8dgF3OLaqntH0fh4DfLKT5BcLNqni//xBt2zcDiWnnkTjk6MC1JmfdAgcKlO8T33keKWVFWF+202sg== + dependencies: + "@ember-data/-build-infra" "3.12.4" + ember-cli-babel "^7.8.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^2.0.2" + +"@ember-data/canary-features@3.12.4": + version "3.12.4" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.12.4.tgz#056075faf9bf6cc81a5e46a4f5936903fb5de196" + integrity sha512-BcmytO4nWHnXQWNA/VPVADTqSo7P+/WA+RUFXQ1FYO/DW++69Ukwm18tZconQvtq/vWeZ4jogSRNWrtpFxbsrw== + dependencies: + ember-cli-babel "^7.8.0" + +"@ember-data/model@3.12.4": + version "3.12.4" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.12.4.tgz#055270e5eabdc483eabde3459fa272f74093dff6" + integrity sha512-pX42qM+Nw9wx0QOpENczj7lcoCFuAfam6iP/us4WfuD9OeakjZQ1xIhe0igGneYBZRejPwJFliG4AzDli+swpA== + dependencies: + "@ember-data/-build-infra" "3.12.4" + "@ember-data/store" "3.12.4" + ember-cli-babel "^7.8.0" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^2.0.2" + inflection "1.12.0" + +"@ember-data/serializer@3.12.4": + version "3.12.4" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.12.4.tgz#e3ae7143f0cd736722daa3a640e11dc07c8aef5a" + integrity sha512-63QuQp01AELhsjl558Un/5C3IzgMDGnqPoh9S4FkftNoiZL8mmMOaCvCOJwGlmg2msEmn55ziBLHMwu4jdvByw== + dependencies: + "@ember-data/-build-infra" "3.12.4" + "@ember-data/store" "3.12.4" + ember-cli-babel "^7.8.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^2.0.2" + +"@ember-data/store@3.12.4": + version "3.12.4" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.12.4.tgz#031930a761bfa5a6d70a6f10525a675f6d6b04a4" + integrity sha512-5mpgiO+uNjZqJDDpCqx3S+f0E6lNi3c8Ec08/GRBZFItEaxU+esjKPmbNlM2bvcD2IGnBGeIJ6qze8ldri/jTw== + dependencies: + "@ember-data/-build-infra" "3.12.4" + "@ember-data/adapter" "3.12.4" + "@ember-data/canary-features" "3.12.4" + ember-cli-babel "^7.8.0" + ember-cli-path-utils "^1.0.0" + ember-cli-typescript "^2.0.2" + heimdalljs "^0.3.0" + +"@ember-decorators/component@^6.1.0": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@ember-decorators/component/-/component-6.1.1.tgz#b360dc4fa8e576ee1c840879399ef1745fd96e06" + integrity sha512-Cj8tY/c0MC/rsipqsiWLh3YVN72DK92edPYamD/HzvftwzC6oDwawWk8RmStiBnG9PG/vntAt41l3S7HSSA+1Q== + dependencies: + "@ember-decorators/utils" "^6.1.1" + ember-cli-babel "^7.1.3" + +"@ember-decorators/utils@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@ember-decorators/utils/-/utils-6.1.1.tgz#6b619814942b4fb3747cfa9f540c9f05283d7c5e" + integrity sha512-0KqnoeoLKb6AyoSU65TRF5T85wmS4uDn06oARddwNPxxf/lt5jQlh41uX3W7V/fWL9tPu8x1L1Vvpc80MN1+YA== + dependencies: + ember-cli-babel "^7.1.3" + +"@ember/jquery@^0.6.0": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@ember/jquery/-/jquery-0.6.1.tgz#eef89ebc8d7b49bddc176f2a646746c8f5d93978" + integrity sha512-XMgfUYag97YOYLsC0Ys4/H6mHO2U2wra/92eVIug+5eYBloYSDhv2MY/iq/ocwXVSB2dQaphJx5pFXqdrjEzWQ== + dependencies: + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + ember-cli-babel "^7.7.3" + ember-cli-version-checker "^3.1.3" + jquery "^3.4.1" + resolve "^1.11.1" "@ember/optional-features@^0.7.0": version "0.7.0" @@ -795,7 +1028,7 @@ silent-error "^1.1.0" util.promisify "^1.0.0" -"@ember/ordered-set@^2.0.0": +"@ember/ordered-set@^2.0.3": version "2.0.3" resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== @@ -803,15 +1036,25 @@ ember-cli-babel "^6.16.0" ember-compatibility-helpers "^1.1.1" -"@ember/test-helpers@^0.7.26": - version "0.7.27" - resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-0.7.27.tgz#c622cabd0cbb95b34efc1e1b6274ab5a14edc138" - integrity sha512-AQESk0FTFxRY6GyZ8PharR4SC7Fju0rXqNkfNYIntAjzefZ8xEqEM4iXDj5h7gAvfx/8dA69AQ9+p7ubc+KvJg== +"@ember/render-modifiers@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-1.0.1.tgz#a85e746e4bb9fd51302cc43e726e2c641261a7c2" + integrity sha512-HHZwL84jCVAaIDFtPZHAnM41aB8XgvDiutD1tKnll43fw7/rhejGj/LDWdB1jrPF+vryFSSQwSJ85gk4J7W86g== dependencies: - broccoli-funnel "^2.0.1" - ember-assign-polyfill "~2.4.0" - ember-cli-babel "^6.12.0" - ember-cli-htmlbars-inline-precompile "^1.0.0" + ember-cli-babel "^7.10.0" + ember-modifier-manager-polyfill "^1.1.0" + +"@ember/test-helpers@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.6.1.tgz#5eb0b58486524c54f1b617a83e4ab327b7c62f07" + integrity sha512-gXLXR0XdZKfyXHFP+QLpG55TlrDtvrZI6TMQVQxdZwsz589kN8idmc01rDjyy53jx430tZTEsdhJvC2LrHXPwg== + dependencies: + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.2" + ember-assign-polyfill "^2.6.0" + ember-cli-babel "^7.7.3" + ember-cli-htmlbars-inline-precompile "^2.1.0" + ember-test-waiters "^1.0.0" "@embroider/core@0.4.3", "@embroider/core@^0.4.3": version "0.4.3" @@ -874,6 +1117,11 @@ resolved "https://registry.yarnpkg.com/@glimmer/di/-/di-0.2.1.tgz#5286b6b32040232b751138f6d006130c728d4b3d" integrity sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ== +"@glimmer/env@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@glimmer/env/-/env-0.1.7.tgz#fd2d2b55a9029c6b37a6c935e8c8871ae70dfa07" + integrity sha1-/S0rVakCnGs3psk16MiHGucN+gc= + "@glimmer/interfaces@^0.38.1": version "0.38.1" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.38.1.tgz#5b1c174363396b99d6a6bddb35538151e4c4c989" @@ -978,14 +1226,19 @@ resolved "https://registry.yarnpkg.com/@simple-dom/interface/-/interface-1.4.0.tgz#e8feea579232017f89b0138e2726facda6fbb71f" integrity sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA== -"@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2": +"@sindresorhus/is@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" + integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78" integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw== dependencies: type-detect "4.0.8" -"@sinonjs/formatio@^3.0.0", "@sinonjs/formatio@^3.1.0": +"@sinonjs/formatio@^3.1.0", "@sinonjs/formatio@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== @@ -993,15 +1246,10 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^3.1.0" -"@sinonjs/samsam@^2.1.2": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-2.1.3.tgz#62cf2a9b624edc795134135fe37fc2ae8ea36be3" - integrity sha512-8zNeBkSKhU9a5cRNbpCKau2WWPfan+Q2zDlcXvXyhn9EsMqgYs4qzo0XHNVlXC6ABQL8fT6nV+zzo5RTHJzyXw== - -"@sinonjs/samsam@^3.1.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.1.tgz#e88c53fbd9d91ad9f0f2b0140c16c7c107fe0d07" - integrity sha512-wRSfmyd81swH0hA1bxJZJ57xr22kC07a1N4zuIL47yTS04bDk6AoCkczcqHEjcRPmJ+FruGJ9WBQiJwMtIElFw== +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.1": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.2.tgz#63942e3d5eb0b79f6de3bef9abfad15fb4b6401b" + integrity sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA== dependencies: "@sinonjs/commons" "^1.0.2" array-from "^2.1.1" @@ -1019,6 +1267,11 @@ dependencies: "@types/estree" "*" +"@types/broccoli-plugin@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" + integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== + "@types/estree@*", "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" @@ -1029,14 +1282,7 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== -"@types/fs-extra@^5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-5.0.5.tgz#080d90a792f3fa2c5559eb44bd8ef840aae9104b" - integrity sha512-w7iqhDH9mN8eLClQOYTkhdYUOSpp25eXxfc6VbFOGtzxW34JcvctH2bKjj4jD4++z4R5iO5D+pg48W2e03I65A== - dependencies: - "@types/node" "*" - -"@types/glob@*", "@types/glob@^7.1.1": +"@types/glob@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== @@ -1056,23 +1302,15 @@ integrity sha512-rx29MMkRdVmzunmiA4lzBYJNnXsW/PhG4kMBy2ATsYaDjGGR75dCFEVVROKpNwlVdcUX3xxlghKQOeDPBJobng== "@types/node@^9.6.0": - version "9.6.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.47.tgz#655b4a1cc52c8ab08f48cc055061990d6846bc97" - integrity sha512-56wEJWXZs+3XXoTe/OCpdZ6czrONhy+6hT0GdPOb7HvudLTMJ1T5tuZPs37K5cPR5t+J9+vLPFDQgUQ8NWJE1w== + version "9.6.49" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.49.tgz#ab4df6e505db088882c8ce5417ae0bc8cbb7a8a6" + integrity sha512-YY0Okyn4QXC4ugJI+Kng5iWjK8A6eIHiQVaGIhJkyn0YL6Iqo0E0tBC8BuhvYcBK87vykBijM5FtMnCqaa5anA== "@types/q@^1.5.1": version "1.5.2" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== -"@types/rimraf@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.2.tgz#7f0fc3cf0ff0ad2a99bb723ae1764f30acaf8b6e" - integrity sha512-Hm/bnWq0TCy7jmjeN5bKYij9vw5GrDFWME4IuxV08278NtU/VdGbzsBohcCUJ7+QMqmUq5hpRKB39HeQWJjztQ== - dependencies: - "@types/glob" "*" - "@types/node" "*" - "@types/symlink-or-copy@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@types/symlink-or-copy/-/symlink-or-copy-1.2.0.tgz#4151a81b4052c80bc2becbae09f3a9ec010a9c7a" @@ -1241,7 +1479,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abortcontroller-polyfill@^1.2.5: +abortcontroller-polyfill@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.3.0.tgz#de69af32ae926c210b7efbcc29bf644ee4838b00" integrity sha512-lbWQgf+eRvku3va8poBlDBO12FigTQr9Zb7NIjXrePrhxWVKdCP2wbDl1tLDaYa18PWTom3UEWwdH13S46I+yA== @@ -1254,6 +1492,14 @@ accepts@~1.3.4, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" +accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" @@ -1294,6 +1540,11 @@ acorn@^6.0.7: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -1305,11 +1556,21 @@ ajv-errors@^1.0.0: integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" - integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.5.5, ajv@^6.9.1: +ajv@^6.1.0: + version "6.10.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.1.tgz#ebf8d3af22552df9dd049bfbe50cc2390e823593" + integrity sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.5.5, ajv@^6.9.1: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -1326,7 +1587,7 @@ amd-name-resolver@1.2.0: dependencies: ensure-posix-path "^1.0.1" -amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1: +amd-name-resolver@^1.2.0, amd-name-resolver@^1.2.1, amd-name-resolver@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.3.1.tgz#ffe71c683c6e7191fc4ae1bb3aaed15abea135d9" integrity sha512-26qTEWqZQ+cxSYygZ4Cf8tsjDBLceJahhtewxtKZA3SRa4PluuqYCuheemDQD+7Mf5B7sr+zhTDWAHDh02a1Dw== @@ -1344,16 +1605,16 @@ anser@^1.4.8: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.8.tgz#19a3bfc5f0e31c49efaea38f58fd0d136597f2a3" integrity sha512-tVHucTCKIt9VRrpQKzPtOlwm/3AmyQ7J+QE29ixFnvuE2hm83utEVrN7jJapYkHV6hI0HOHkEX9TOMCzHtwvuA== -ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= - ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== +ansi-html@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1381,6 +1642,13 @@ ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-to-html@^0.6.6: + version "0.6.11" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.11.tgz#5093fc4962186c0e9343dec572a4f71abdc93439" + integrity sha512-88XZtrcwrfkyn6fGstHnkaF1kl7hGtNCYh4vSmItgEV+6JnQHryDBf7udF4f2RhTRQmYvJvPcTtqgaqrxzc9oA== + dependencies: + entities "^1.1.1" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" @@ -1527,10 +1795,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== dependencies: + object-assign "^4.1.1" util "0.10.3" assign-symbols@^1.0.0: @@ -1567,9 +1836,9 @@ async-disk-cache@^1.2.1: username-sync "^1.0.2" async-each@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" - integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== async-foreach@^0.1.3: version "0.1.3" @@ -1581,7 +1850,15 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async-promise-queue@^1.0.3, async-promise-queue@^1.0.4: +async-promise-queue@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.5.tgz#cb23bce9fce903a133946a700cc85f27f09ea49d" + integrity sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw== + dependencies: + async "^2.4.1" + debug "^2.6.8" + +async-promise-queue@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.4.tgz#308baafbc74aff66a0bb6e7f4a18d4fe8434440c" integrity sha512-GQ5X3DT+TefYuFPHdvIPXFTlKnh39U7dwtl+aUBGeKjMea9nBpv3c91DXgeyBQmY07vQ97f3Sr9XHqkamEameQ== @@ -1594,7 +1871,7 @@ async@^1.5.2: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.4.1, async@^2.5.0: +async@^2.4.1: version "2.6.2" resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== @@ -1826,20 +2103,34 @@ babel-plugin-debug-macros@^0.2.0, babel-plugin-debug-macros@^0.2.0-beta.6: semver "^5.3.0" babel-plugin-debug-macros@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.0.tgz#7a025944faef0777804ef3518c54e8b040197397" - integrity sha512-D6qYBI/3+FvcKVnRnH6FBUwXPp/5o/jnJNVFKqVaZpYAWx88+R8jNNyaEX7iQFs7UfCib6rcY/9+ICR4jhjFCQ== + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.2.tgz#b536a29386fac76f525bf1b73c4f74cd5281c5fa" + integrity sha512-CslqMZ3RGUvlEERuKr+wrXcHqQGvQ9ALLrbcOt8aSEp4ySfNCHAQbuGQYKZYw3P30/VGkPaR0Begch+dbqgEpg== dependencies: semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.8.0.tgz#70244800f750bf1c9f380910c1b2eed1db80ab4a" - integrity sha512-3dlBH92qx8so2pRoks73+gwnuX97d0ajirOr96GwTZMnZxFzVR02c/PQbKWBcxpPqoL8CJSE2onuWM8PWezhOQ== +babel-plugin-debug-macros@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.3.3.tgz#29c3449d663f61c7385f5b8c72d8015b069a5cb7" + integrity sha512-E+NI8TKpxJDBbVkdWkwHrKgJi696mnRL8XYrOPYw82veNHPDORM9WIQifl6TpIo8PNy2tU2skPqbfkmHXrHKQA== dependencies: - ember-rfc176-data "^0.3.8" + semver "^5.3.0" -babel-plugin-ember-modules-api-polyfill@^2.9.0: +babel-plugin-dynamic-import-node@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" + integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== + dependencies: + object.assign "^4.1.0" + +babel-plugin-ember-modules-api-polyfill@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.12.0.tgz#a5e703205ba4e625a7fab9bb1aea64ef3222cf75" + integrity sha512-ZQU4quX0TJ1yYyosPy5PFigKdCFEVHJ6H0b3hwjxekIP9CDwzk0OhQuKhCOPti+d52VWjjCjxu2BrXEih29mFw== + dependencies: + ember-rfc176-data "^0.3.12" + +babel-plugin-ember-modules-api-polyfill@^2.6.0, babel-plugin-ember-modules-api-polyfill@^2.8.0, babel-plugin-ember-modules-api-polyfill@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.9.0.tgz#8503e7b4192aeb336b00265e6235258ff6b754aa" integrity sha512-c03h50291phJ2gQxo/aIOvFQE2c6glql1A7uagE3XbPXpKVAJOUxtVDjvWG6UAB6BC5ynsJfMWvY0w4TPRKIHQ== @@ -1851,17 +2142,20 @@ babel-plugin-feature-flags@^0.3.1: resolved "https://registry.yarnpkg.com/babel-plugin-feature-flags/-/babel-plugin-feature-flags-0.3.1.tgz#9c827cf9a4eb9a19f725ccb239e85cab02036fc1" integrity sha1-nIJ8+aTrmhn3JcyyOehcqwIDb8E= -babel-plugin-filter-imports@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-0.3.1.tgz#e7859b56886b175dd2616425d277b219e209ea8b" - integrity sha1-54WbVohrF13SYWQl0neyGeIJ6os= +babel-plugin-filter-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11" + integrity sha512-p/chjzVTgCxUqyLM0q/pfWVZS7IJTwGQMwNg0LOvuQpKiTftQgZDtkGB8XvETnUw19rRcL7bJCTopSwibTN2tA== + dependencies: + "@babel/types" "^7.4.0" + lodash "^4.17.11" -babel-plugin-htmlbars-inline-precompile@^0.2.5: - version "0.2.6" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.2.6.tgz#c00b8a3f4b32ca04bf0f0d5169fcef3b5a66d69d" - integrity sha512-H4H75TKGUFij8ukwEYWEERAgrUf16R8NSK1uDPe3QwxT8mnE1K8+/s6DVjUqbM5Pv6lSIcE4XufXdlSX+DTB6g== +babel-plugin-htmlbars-inline-precompile@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" + integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== -babel-plugin-module-resolver@^3.1.1: +babel-plugin-module-resolver@^3.1.1, babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== @@ -1915,7 +2209,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.26.0: +babel-plugin-transform-es2015-block-scoping@^6.23.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= @@ -2222,11 +2516,6 @@ babel6-plugin-strip-class-callcheck@^6.0.0: resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= -babel6-plugin-strip-heimdall@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/babel6-plugin-strip-heimdall/-/babel6-plugin-strip-heimdall-6.0.1.tgz#35f80eddec1f7fffdc009811dfbd46d9965072b6" - integrity sha1-NfgO3ewff//cAJgR371G2ZZQcrY= - babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -2330,11 +2619,16 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.1.1, bluebird@^3.4.6, bluebird@^3.5.3: +bluebird@^3.1.1, bluebird@^3.4.6: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== +bluebird@^3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" + integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" @@ -2356,6 +2650,22 @@ body-parser@1.18.3: raw-body "2.3.3" type-is "~1.6.16" +body-parser@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + body@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069" @@ -2371,7 +2681,7 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bower-config@^1.3.0: +bower-config@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.1.tgz#85fd9df367c2b8dbbd0caa4c5f2bad40cd84c2cc" integrity sha1-hf2d82fCuNu9DKpMXyutQM2Ewsw= @@ -2411,10 +2721,10 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -broccoli-amd-funnel@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-1.3.0.tgz#c4426b4fce976e44295bd74f34725f53bdeb08e3" - integrity sha512-QLjCWblDW//a/5/ivDikVPRHiA+d/1K45meHZA6lAlpHC1c216rcZQYpdlo9PiOJiI4T3tKqDaaM1CDeFDCoVQ== +broccoli-amd-funnel@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-2.0.1.tgz#dbdbfd28841731342d538126567c25bea3f15310" + integrity sha512-VRE+0PYAN4jQfkIq3GKRj4U/4UV9rVpLan5ll6fVYV4ziVg4OEfR5GUnILEg++QtR4xSaugRxCPU5XJLDy3bNQ== dependencies: broccoli-plugin "^1.3.0" symlink-or-copy "^1.2.0" @@ -2471,6 +2781,23 @@ broccoli-babel-transpiler@^7.1.2: rsvp "^4.8.4" workerpool "^3.1.1" +broccoli-babel-transpiler@^7.2.0, broccoli-babel-transpiler@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.3.0.tgz#a0ad3a37dbf74469664bbca403d652070c2c1317" + integrity sha512-tsXNvDf3gp6g8rGkz234AhbaIRUsCdd6CM3ikfkJVB0EpC8ZAczGsFKTjENLy1etx4s7FkruW/QjI7Wfdhx6Ng== + dependencies: + "@babel/core" "^7.3.3" + "@babel/polyfill" "^7.0.0" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.2.1" + clone "^2.1.2" + hash-for-dep "^1.4.7" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.4" + workerpool "^3.1.1" + broccoli-builder@^0.18.14: version "0.18.14" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.14.tgz#4b79e2f844de11a4e1b816c3f49c6df4776c312d" @@ -2518,7 +2845,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2, broccoli-concat@^3.5.1, broccoli-concat@^3.7.1: +broccoli-concat@^3.2.2, broccoli-concat@^3.7.1, broccoli-concat@^3.7.3: version "3.7.3" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.3.tgz#0dca01311567ffb13180e6b4eb111824628e4885" integrity sha512-2Ma9h81EJ0PRb9n4sW0i8KZlcnpTQfKxcj87zvi5DFe1fd8CTDEdseHDotK2beuA2l+LbgVPfd8EHaBJKm/Y8g== @@ -2609,6 +2936,25 @@ broccoli-funnel-reducer@^1.0.0: resolved "https://registry.yarnpkg.com/broccoli-funnel-reducer/-/broccoli-funnel-reducer-1.0.0.tgz#11365b2a785aec9b17972a36df87eef24c5cc0ea" integrity sha1-ETZbKnha7JsXlyo234fu8kxcwOo= +broccoli-funnel@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + integrity sha512-C8Lnp9TVsSSiZMGEF16C0dCiNg2oJqUKwuZ1K4kVC6qRPG/2Cj/rtB5kRCC9qEbwqhX71bDbfHROx0L3J7zXQg== + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz#cddc3afc5ff1685a8023488fff74ce6fb5a51296" @@ -2739,6 +3085,11 @@ broccoli-node-info@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-1.1.0.tgz#3aa2e31e07e5bdb516dd25214f7c45ba1c459412" integrity sha1-OqLjHgflvbUW3SUhT3xFuhxFlBI= +broccoli-node-info@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-2.1.0.tgz#ca84560e8570ff78565bea1699866ddbf58ad644" + integrity sha512-l6qDuboJThHfRVVWQVaTs++bFdrFTP0gJXgsWenczc1PavRVUmL1Eyb2swTAXXMpDOnr2zhNOBLx4w9AxkqbPQ== + broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-persistent-filter@^1.4.3: version "1.4.6" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz#80762d19000880a77da33c34373299c0f6a3e615" @@ -2758,7 +3109,7 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1: +broccoli-persistent-filter@^2.1.0: version "2.2.2" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.2.2.tgz#e0180e75ede5dd05d4c702f24f6c049e93fba915" integrity sha512-PW12RD1yY+x5SASUADuUMJce+dVSmjBO3pV1rLNHmT1C31rp1P++TvX7AgUObFmGhL7qlwviSdhMbBkY1v3G2w== @@ -2777,7 +3128,7 @@ broccoli-persistent-filter@^2.1.0, broccoli-persistent-filter@^2.1.1, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^1.0.0" -broccoli-persistent-filter@^2.2.2: +broccoli-persistent-filter@^2.1.1, broccoli-persistent-filter@^2.2.1, broccoli-persistent-filter@^2.2.2, broccoli-persistent-filter@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-2.3.1.tgz#4a052e0e0868b344c3a2977e35a3d497aa9eca72" integrity sha512-hVsmIgCDrl2NFM+3Gs4Cr2TA6UPaIZip99hN8mtkaUPgM8UeVnCbxelCvBjUBHo0oaaqP5jzqqnRVvb568Yu5g== @@ -2817,6 +3168,16 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" +broccoli-plugin@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" + integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== + dependencies: + promise-map-series "^0.2.1" + quick-temp "^0.1.3" + rimraf "^2.3.4" + symlink-or-copy "^1.1.8" + broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" @@ -2834,6 +3195,21 @@ broccoli-rollup@^2.1.1: symlink-or-copy "^1.1.8" walk-sync "^0.3.1" +broccoli-rollup@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-4.1.1.tgz#7531a24d88ddab9f1bace1c6ee6e6ca74a38d36f" + integrity sha512-hkp0dB5chiemi32t6hLe5bJvxuTOm1TU+SryFlZIs95KT9+94uj0C8w6k6CsZ2HuIdIZg6D252t4gwOlcTXrpA== + dependencies: + "@types/broccoli-plugin" "^1.3.0" + broccoli-plugin "^2.0.0" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.6" + node-modules-path "^1.0.1" + rollup "^1.12.0" + rollup-pluginutils "^2.8.1" + symlink-or-copy "^1.2.0" + walk-sync "^1.1.3" + broccoli-sass-source-maps@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-2.2.0.tgz#1f1a0794136152b096188638b59b42b17a4bdc68" @@ -2900,7 +3276,7 @@ broccoli-stew@^1.5.0: symlink-or-copy "^1.2.0" walk-sync "^0.3.0" -broccoli-stew@^2.0.0: +broccoli-stew@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-stew/-/broccoli-stew-2.1.0.tgz#ba73add17fda3b9b01d8cfb343a8b613b7136a0a" integrity sha512-tgCkuTWYl4uf7k7ib2D79KFEj2hCgnTUNPMnrCoAha0/4bywcNccmaZVWtL9Ex37yX5h5eAbnM/ak2ULoMwSSw== @@ -2956,6 +3332,34 @@ broccoli-uglify-sourcemap@^2.1.1: walk-sync "^0.3.2" workerpool "^2.3.0" +broccoli@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-3.2.0.tgz#6b5a89b8d6d0c733d39aa23ac5b43d85f56fafab" + integrity sha512-n58yqAbV2Zbg+HXmBGBOUoDOgbCM0hMJtqvnPDF89Jwk3ZBVhD5/UKW0diY6l3DbB5+j92NCDQVd9HqO+WYFYA== + dependencies: + ansi-html "^0.0.7" + broccoli-node-info "^2.1.0" + broccoli-slow-trees "^3.0.1" + broccoli-source "^1.1.0" + commander "^2.15.1" + connect "^3.6.6" + console-ui "^3.0.4" + esm "^3.2.4" + findup-sync "^2.0.0" + handlebars "^4.0.11" + heimdalljs "^0.2.6" + heimdalljs-logger "^0.1.9" + https "^1.0.0" + mime-types "^2.1.19" + promise.prototype.finally "^3.1.0" + resolve-path "^1.4.0" + rimraf "^2.6.2" + sane "^4.0.0" + tmp "0.0.33" + tree-sync "^1.2.2" + underscore.string "^3.2.2" + watch-detector "^0.1.0" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -3033,14 +3437,14 @@ browserslist@^3.1.1, browserslist@^3.2.6: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" -browserslist@^4.0.0, browserslist@^4.4.2, browserslist@^4.5.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.3.tgz#969495c410314bc89f14e748505e58be968080f1" - integrity sha512-Tx/Jtrmh6vFg24AelzLwCaCq1IUJiMDM1x/LPzqbmbktF8Zo7F9ONUpOWsFK6TtdON95mSMaQUWqi0ilc8xM6g== +browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.2: + version "4.6.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.4.tgz#fd0638b3f8867fec2c604ed0ed9300379f8ec7c2" + integrity sha512-ErJT8qGfRt/VWHSr1HeqZzz50DvxHtr1fVL1m5wf20aGrG8e1ce8fpZ2EjZEfs09DDZYSvtRaDlMpWslBf8Low== dependencies: - caniuse-lite "^1.0.30000955" - electron-to-chromium "^1.3.122" - node-releases "^1.1.12" + caniuse-lite "^1.0.30000981" + electron-to-chromium "^1.3.188" + node-releases "^1.1.25" bser@^2.0.0: version "2.0.0" @@ -3111,22 +3515,27 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -cacache@^11.0.2: - version "11.3.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" - integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +cacache@^11.3.2: + version "11.3.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc" + integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA== dependencies: - bluebird "^3.5.3" + bluebird "^3.5.5" chownr "^1.1.1" figgy-pudding "^3.5.1" - glob "^7.1.3" + glob "^7.1.4" graceful-fs "^4.1.15" lru-cache "^5.1.1" mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" - rimraf "^2.6.2" + rimraf "^2.6.3" ssri "^6.0.1" unique-filename "^1.1.1" y18n "^4.0.0" @@ -3146,6 +3555,19 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +cacheable-request@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d" + integrity sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0= + dependencies: + clone-response "1.0.2" + get-stream "3.0.0" + http-cache-semantics "3.8.1" + keyv "3.0.0" + lowercase-keys "1.0.0" + normalize-url "2.0.1" + responselike "1.0.2" + calculate-cache-key-for-tree@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-1.2.3.tgz#5a5e4fcfa2d374a63e47fe967593f179e8282825" @@ -3153,6 +3575,13 @@ calculate-cache-key-for-tree@^1.1.0: dependencies: json-stable-stringify "^1.0.1" +calculate-cache-key-for-tree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-2.0.0.tgz#7ac57f149a4188eacb0a45b210689215d3fef8d6" + integrity sha512-Quw8a6y8CPmRd6eU+mwypktYCwUcf8yVFIRbNZ6tPQEckX9yd+EBVEPC/GSZZrMWH9e7Vz4pT7XhpmyApRByLQ== + dependencies: + json-stable-stringify "^1.0.1" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -3227,17 +3656,17 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000955: - version "1.0.30000955" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000955.tgz#360fdb9a1e41d6dd996130411334e44a39e4446d" - integrity sha512-6AwmIKgqCYfDWWadRkAuZSHMQP4Mmy96xAXEdRBlN/luQhlRYOKgwOlZ9plpCOsVbBuqbTmGqDK3JUM/nlr8CA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000981: + version "1.0.30000983" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000983.tgz#ab3c70061ca2a3467182a10ac75109b199b647f8" + integrity sha512-/llD1bZ6qwNkt41AsvjsmwNOoA4ZB+8iqmf5LVyeSXuBODT/hAMFNVOh84NdUzoiYiSKqo5vQ3ZzeYHSi/olDQ== -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== dependencies: - rsvp "^3.3.3" + rsvp "^4.8.4" cardinal@^1.0.0: version "1.0.0" @@ -3294,7 +3723,7 @@ charm@^1.0.0: dependencies: inherits "^2.0.1" -chokidar@^2.0.0, chokidar@^2.0.2: +chokidar@^2.0.0: version "2.1.5" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== @@ -3313,23 +3742,37 @@ chokidar@^2.0.0, chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.7" +chokidar@^2.0.2: + version "2.1.6" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5" + integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chownr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" - integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" + integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== dependencies: tslib "^1.9.0" -ci-info@^1.1.3: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -3380,13 +3823,6 @@ clean-up-path@^1.0.0: resolved "https://registry.yarnpkg.com/clean-up-path/-/clean-up-path-1.0.0.tgz#de9e8196519912e749c9eaf67c13d64fac72a3e5" integrity sha512-PHGlEF0Z6976qQyN6gM7kKH6EH0RdfZcc8V+QhFe36eRxV0SMH5OUBZG7Bxa9YcreNzyNbK63cGiZxdSZgosRw== -cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= - dependencies: - restore-cursor "^1.0.1" - cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" @@ -3394,10 +3830,10 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" - integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== +cli-spinners@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.2.0.tgz#e8b988d9206c692302d8ee834e7a85c0144d8f77" + integrity sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ== cli-table@^0.3.1: version "0.3.1" @@ -3446,6 +3882,13 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +clone-response@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -3461,7 +3904,7 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -coa@~2.0.1: +coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== @@ -3505,11 +3948,6 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= - combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" @@ -3529,11 +3967,16 @@ commander@2.8.x: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.14.1, commander@^2.19.0, commander@^2.6.0, commander@^2.9.0, commander@~2.19.0: +commander@^2.14.1, commander@^2.6.0, commander@^2.9.0: version "2.19.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +commander@^2.15.1, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + common-tags@^1.4.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -3549,11 +3992,16 @@ component-bind@1.0.0: resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@1.2.1, component-emitter@^1.2.1: +component-emitter@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" @@ -3566,7 +4014,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.38.0 < 2" -compression@^1.7.3: +compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -3584,7 +4032,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.7, concat-stream@^1.5.0: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3606,6 +4054,16 @@ configstore@^4.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +connect@^3.6.6: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -3618,17 +4076,16 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-2.2.3.tgz#134b92e632f2c0088f78e52b20f1ca22a95b9a91" - integrity sha512-aZm49rntsv264Fw/DM56Z2ehLg1DDxrqof2jFcZOgC03S0nRGSYFIVPx5TbGssrgBhgCvGBY+9mmk0+t/nWXEA== +console-ui@^3.0.2, console-ui@^3.0.4: + version "3.1.1" + resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-3.1.1.tgz#681a0414e8b0a23ed679d0a2802e39d920801171" + integrity sha512-22y+uk4AGq9quz6kofKQjkeCIAm86+MTxT/RZMFm8fMArP2lAkzxjUjNyrw7S6wXnnB+qRnC+/2ANMTke68RTQ== dependencies: chalk "^2.1.0" - inquirer "^2" + inquirer "^6" json-stable-stringify "^1.0.1" - ora "^2.0.0" - through "^2.3.8" - user-info "^1.0.0" + ora "^3.4.0" + through2 "^3.0.1" consolidate@^0.15.1: version "0.15.1" @@ -3647,6 +4104,13 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" @@ -3674,6 +4138,11 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -3696,32 +4165,31 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.0.0.tgz#cd9810b8000742535a4a43773866185e310bd4f7" - integrity sha512-W/Ppz34uUme3LmXWjMgFlYyGnbo1hd9JvA0LNQ4EmieqVjg2GPYbj3H6tcdP2QGPGWdRKUqZVbVKLNIFVs/HiA== +core-js-compat@^3.1.1: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.4.tgz#e4d0c40fbd01e65b1d457980fe4112d4358a7408" + integrity sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg== dependencies: - browserslist "^4.5.1" - core-js "3.0.0" - core-js-pure "3.0.0" - semver "^5.6.0" + browserslist "^4.6.2" + core-js-pure "3.1.4" + semver "^6.1.1" -core-js-pure@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.0.0.tgz#a5679adb4875427c8c0488afc93e6f5b7125859b" - integrity sha512-yPiS3fQd842RZDgo/TAKGgS0f3p2nxssF1H65DIZvZv0Od5CygP8puHXn3IQiM/39VAvgCbdaMQpresrbGgt9g== +core-js-pure@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.4.tgz#5fa17dc77002a169a3566cc48dc774d2e13e3769" + integrity sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA== core-js@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" integrity sha1-TekR5mew6ukSTjQlS1OupvxhjT4= -core-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.0.tgz#a8dbfa978d29bfc263bfb66c556d0ca924c28957" - integrity sha512-WBmxlgH2122EzEJ6GH8o9L/FeoUKxxxZ6q6VUxoTlsE4EvbTWKJb447eyVxTEuq0LpXjlq/kCB2qgBvsYRkLvQ== +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== -core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.6.5: +core-js@^2.4.1: version "2.6.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== @@ -3829,20 +4297,28 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= -css-select-base-adapter@~0.1.0: +css-select-base-adapter@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== -css-select@~1.3.0-rc0: - version "1.3.0-rc0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231" - integrity sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE= +css-select@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" + integrity sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ== dependencies: boolbase "^1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "^1.0.1" + css-what "^2.1.2" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-tree@1.0.0-alpha.28: + version "1.0.0-alpha.28" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f" + integrity sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" css-tree@1.0.0-alpha.29: version "1.0.0-alpha.29" @@ -3852,25 +4328,17 @@ css-tree@1.0.0-alpha.29: mdn-data "~1.1.0" source-map "^0.5.3" -css-tree@1.0.0-alpha25: - version "1.0.0-alpha25" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597" - integrity sha512-XC6xLW/JqIGirnZuUWHXCHRaAjje2b3OIB0Vj5RIJo6mIi/AdJo30quQl5LxUl0gkXDIrTrFGbMlcZjyFplz1A== - dependencies: - mdn-data "^1.0.0" - source-map "^0.5.3" - css-url-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= -css-what@2.1: +css-what@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -csso@^3.5.0: +csso@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b" integrity sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg== @@ -4040,7 +4508,7 @@ date-time@^2.1.0: dependencies: time-zone "^1.0.0" -debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4054,7 +4522,7 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@~4.1.0: +debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -4078,6 +4546,13 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -4201,6 +4676,11 @@ diff@^3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -4249,10 +4729,10 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== dependencies: dom-serializer "0" domelementtype "1" @@ -4264,6 +4744,11 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + duplexify@^3.4.2, duplexify@^3.6.0: version "3.7.1" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" @@ -4292,10 +4777,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.122, electron-to-chromium@^1.3.47: - version "1.3.122" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.122.tgz#b32a0805f48557bd3c3b8104eadc7fa511b14a9a" - integrity sha512-3RKoIyCN4DhP2dsmleuFvpJAIDOseWH88wFYBzb22CSwoFDSWRc4UAMfrtc9h8nBdJjTNIN3rogChgOy6eFInw== +electron-to-chromium@^1.3.188, electron-to-chromium@^1.3.47: + version "1.3.189" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.189.tgz#aa84055eb36d364a68852ad2d25e1315a1d06196" + integrity sha512-C26Kv6/rLNmGDaPR5HORMtTQat9aWBBKjQk9aFtN1Bk6cQBSw8cYdsel/mcrQlNlMMjt1sAKsTYqf77+sK2uTw== elegant-spinner@^1.0.1: version "1.0.1" @@ -4303,9 +4788,9 @@ elegant-spinner@^1.0.1: integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.5.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.0.tgz#2b8ed4c891b7de3200e14412a5b8248c7af505ca" + integrity sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -4323,15 +4808,15 @@ ember-ajax@^5.0.0: ember-cli-babel "^7.5.0" najax "^1.0.3" -ember-assign-polyfill@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.4.0.tgz#acb00466f7d674b3e6b030acfe255b3b1f6472e1" - integrity sha512-0SnGQb9CenRqbZdIa1KFsEjT+1ijGWfAbCSaDbg5uVa5l6HPdppuTzOXK6sfEQMsd2nbrp27QWFy7W5VX6l4Ag== +ember-assign-polyfill@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.6.0.tgz#07847e3357ee35b33f886a0b5fbec6873f6860eb" + integrity sha512-Y8NzOmHI/g4PuJ+xC14eTYiQbigNYddyHB8FY2kuQMxThTEIDE7SJtgttJrYYcPciOu0Tnb5ff36iO46LeiXkw== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^6.16.0" ember-cli-version-checker "^2.0.0" -ember-auto-import@^1.2.19: +ember-auto-import@^1.2.19, ember-auto-import@^1.2.21: version "1.5.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.5.2.tgz#e97ed96b600caa6090ffed83e4611c3e7ec9bad7" integrity sha512-skVQpfdc6G5OVRsyemDn3vI1nj/iBBgnoqRLRka0ZbDT2GqelmyJ86bp+Bd/ztJe45Le3we+LXbR7T54RU5A9w== @@ -4365,51 +4850,25 @@ ember-auto-import@^1.2.19: walk-sync "^0.3.3" webpack "~4.28" -ember-auto-import@^1.2.21: - version "1.2.21" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.2.21.tgz#e02ded183844faba66c3f2af97028ef35175b837" - integrity sha512-coHnqO3mRnlj/JAQSQBEqzX2wL8rH5YrfEJMzk1102X9MdSX1CWeaUYBcyjvI/pG8fHUhv+4VsD6rQuhTUyZUQ== +ember-basic-dropdown@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-2.0.5.tgz#72a8a9c1196d5f84f6b849aa21c3cf8ea7830668" + integrity sha512-wG7v9uk5uIozLFx919Wa40xmLXE5jL1d+HKkUxWQJ1vqZCh8S7MjmYIAuluxNFfegEnCtLd+9iDSdZzEEwTtPg== dependencies: - "@babel/core" "^7.1.6" - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.1.6" - babel-core "^6.26.3" - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-template "^6.26.0" - babylon "^6.18.0" - broccoli-debug "^0.6.4" - broccoli-plugin "^1.3.0" - debug "^3.1.0" - ember-cli-babel "^6.6.0" - enhanced-resolve "^4.0.0" - fs-extra "^6.0.1" - fs-tree-diff "^1.0.0" - handlebars "~4.0.13" - js-string-escape "^1.0.1" - lodash "^4.17.10" - mkdirp "^0.5.1" - pkg-up "^2.0.0" - resolve "^1.7.1" - rimraf "^2.6.2" - symlink-or-copy "^1.2.0" - walk-sync "^0.3.3" - webpack "~4.28" + "@ember-decorators/component" "^6.1.0" + "@ember/render-modifiers" "^1.0.0" + ember-cli-babel "^7.11.0" + ember-cli-htmlbars "^3.1.0" + ember-element-helper "^0.1.1" + ember-maybe-in-element "^0.4.0" + ember-truth-helpers "2.1.0" -ember-basic-dropdown@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ember-basic-dropdown/-/ember-basic-dropdown-1.1.2.tgz#6558eb2aa34d2feeb66e9de1feea560d46edc697" - integrity sha512-l38MNIUOI1nAKxSUlDI1wrP52a55HxN2dikDUwJOqx7NytK0/woPyy3uVUe7gfT2gJ4HCbRlL/7y0csvP0iMPg== - dependencies: - ember-cli-babel "^7.2.0" - ember-cli-htmlbars "^3.0.1" - ember-maybe-in-element "^0.2.0" - -ember-cli-babel-plugin-helpers@^1.1.0: +ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.0.tgz#de3baedd093163b6c2461f95964888c1676325ac" integrity sha512-Zr4my8Xn+CzO0gIuFNXji0eTRml5AxZUTDQz/wsNJ5AJAtyFWCY4QtKdoELNNbiCVGt1lq5yLiwTm4scGKu6xA== -ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-babel@^6.12.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.18.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: +ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-beta.7, ember-cli-babel@^6.11.0, ember-cli-babel@^6.16.0, ember-cli-babel@^6.18.0, ember-cli-babel@^6.3.0, ember-cli-babel@^6.6.0, ember-cli-babel@^6.7.2, ember-cli-babel@^6.8.0, ember-cli-babel@^6.8.1, ember-cli-babel@^6.8.2, ember-cli-babel@^6.9.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -4428,34 +4887,7 @@ ember-cli-babel@^6.0.0, ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.0.0-be ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.0, ember-cli-babel@^7.1.2, ember-cli-babel@^7.2.0, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0: - version "7.7.3" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" - integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== - dependencies: - "@babel/core" "^7.0.0" - "@babel/plugin-proposal-class-properties" "^7.3.4" - "@babel/plugin-proposal-decorators" "^7.3.0" - "@babel/plugin-transform-modules-amd" "^7.0.0" - "@babel/plugin-transform-runtime" "^7.2.0" - "@babel/polyfill" "^7.0.0" - "@babel/preset-env" "^7.0.0" - "@babel/runtime" "^7.2.0" - amd-name-resolver "^1.2.1" - babel-plugin-debug-macros "^0.3.0" - babel-plugin-ember-modules-api-polyfill "^2.8.0" - babel-plugin-module-resolver "^3.1.1" - broccoli-babel-transpiler "^7.1.2" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" - broccoli-source "^1.1.0" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.0" - ember-cli-version-checker "^2.1.2" - ensure-posix-path "^1.0.2" - semver "^5.5.0" - -ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.0, ember-cli-babel@^7.7.3: version "7.8.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.8.0.tgz#e596500eca0f5a7c9aaee755f803d1542f578acf" integrity sha512-xUBgJQ81fqd7k/KIiGU+pjpoXhrmmRf9pUrqLenNSU5N+yeNFT5a1+w0b+p1F7oBphfXVwuxApdZxrmAHOdA3Q== @@ -4482,16 +4914,70 @@ ember-cli-babel@^7.7.3: ensure-posix-path "^1.0.2" semver "^5.5.0" -ember-cli-broccoli-sane-watcher@^2.1.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-2.2.2.tgz#9bb1b04ddeb2c086aecd8693cbaeca1d88dc160c" - integrity sha512-9OLy8x3pdNKC/6xR00IjTL8XyiQU3rb2HLyQSAqHuaZpZcSTKkbAse2ERTsELSINoo/zi/W7qPP5vd5SsHsraw== +ember-cli-babel@^7.1.2, ember-cli-babel@^7.5.0: + version "7.7.3" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.7.3.tgz#f94709f6727583d18685ca6773a995877b87b8a0" + integrity sha512-/LWwyKIoSlZQ7k52P+6agC7AhcOBqPJ5C2u27qXHVVxKvCtg6ahNuRk/KmfZmV4zkuw4EjTZxfJE1PzpFyHkXg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.3.4" + "@babel/plugin-proposal-decorators" "^7.3.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.2.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + "@babel/runtime" "^7.2.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-modules-api-polyfill "^2.8.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.1.2" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.0" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + +ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.7.0, ember-cli-babel@^7.8.0: + version "7.12.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.12.0.tgz#064997d199384be8c88d251f30ef67953d3bddc5" + integrity sha512-+EGQsbPvh19nNXHCm6rVBx2CdlxQlzxMyhey5hsGViDPriDI4PFYXYaFWdGizDrmZoDcG/Ywpeph3hl0NxGQTg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.3.4" + "@babel/plugin-proposal-decorators" "^7.3.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.2.0" + "@babel/polyfill" "^7.0.0" + "@babel/preset-env" "^7.0.0" + "@babel/runtime" "^7.2.0" + amd-name-resolver "^1.2.1" + babel-plugin-debug-macros "^0.3.0" + babel-plugin-ember-modules-api-polyfill "^2.12.0" + babel-plugin-module-resolver "^3.1.1" + broccoli-babel-transpiler "^7.3.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.1" + broccoli-source "^1.1.0" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.0" + ember-cli-version-checker "^2.1.2" + ensure-posix-path "^1.0.2" + semver "^5.5.0" + +ember-cli-broccoli-sane-watcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-broccoli-sane-watcher/-/ember-cli-broccoli-sane-watcher-3.0.0.tgz#dc1812c047e1ceec4413d3c41b51a9ffc61b4cfe" + integrity sha512-sLn+wy6FJpGMHtSwAGUjQK3nJFvw2b6H8bR2EgMIXxkUI3DYFLi6Xnyxm02XlMTcfTxF10yHFhHJe0O+PcJM7A== dependencies: broccoli-slow-trees "^3.0.1" heimdalljs "^0.2.1" heimdalljs-logger "^0.1.7" rsvp "^3.0.18" - sane "^2.4.1" + sane "^4.0.0" ember-cli-clipboard@^0.13.0: version "0.13.0" @@ -4504,10 +4990,10 @@ ember-cli-clipboard@^0.13.0: ember-cli-htmlbars "^3.0.1" fastboot-transform "^0.1.3" -ember-cli-dependency-checker@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.1.0.tgz#b39c6b537a1457d77892edf5ddcfa025cd1401e2" - integrity sha512-Y/V2senOyIjQnZohYeZeXs59rWHI2m8KRF9IesMv1ypLRSc/h/QS6UX51wAyaZnxcgU6ljFXpqL5x38UxM3XzA== +ember-cli-dependency-checker@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" + integrity sha512-dkSmcJ/jY/2ms/S6ph2jXSfOW5VfOpLfg5DFEbra0SaMNgYkNDFF1o0U4OdTsG37L5h/AXWNuVtnOa4TMabz9Q== dependencies: chalk "^2.3.0" find-yarn-workspace-root "^1.1.0" @@ -4555,12 +5041,12 @@ ember-cli-head@^0.4.0: ember-cli-babel "^6.11.0" ember-cli-htmlbars "^2.0.3" -ember-cli-htmlbars-inline-precompile@^1.0.0, ember-cli-htmlbars-inline-precompile@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-1.0.5.tgz#312e050c9e3dd301c55fb399fd706296cd0b1d6a" - integrity sha512-/CNEqPxroIcbY6qejrt704ZaghHLCntZKYLizFfJ2esirXoJx6fuYKBY1YyJ8GOgjfbHHKjBZuK4vFFJpkGqkQ== +ember-cli-htmlbars-inline-precompile@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-2.1.0.tgz#61b91ff1879d44ae504cadb46fb1f2604995ae08" + integrity sha512-BylIHduwQkncPhnj0ZyorBuljXbTzLgRo6kuHf1W+IHFxThFl2xG+r87BVwsqx4Mn9MTgW9SE0XWjwBJcSWd6Q== dependencies: - babel-plugin-htmlbars-inline-precompile "^0.2.5" + babel-plugin-htmlbars-inline-precompile "^1.0.0" ember-cli-version-checker "^2.1.2" hash-for-dep "^1.2.3" heimdalljs-logger "^0.1.9" @@ -4576,14 +5062,14 @@ ember-cli-htmlbars@^2.0.3: json-stable-stringify "^1.0.0" strip-bom "^3.0.0" -ember-cli-htmlbars@^3.0.0, ember-cli-htmlbars@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.0.1.tgz#01e21f0fd05e0a6489154f26614b1041769e3e58" - integrity sha512-pyyB2s52vKTXDC5svU3IjU7GRLg2+5O81o9Ui0ZSiBS14US/bZl46H2dwcdSJAK+T+Za36ZkQM9eh1rNwOxfoA== +ember-cli-htmlbars@^3.0.1, ember-cli-htmlbars@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-3.1.0.tgz#87806c2a0bca2ab52d4fb8af8e2215c1ca718a99" + integrity sha512-cgvRJM73IT0aePUG7oQ/afB7vSRBV3N0wu9BrWhHX2zkR7A7cUBI7KC9VPk6tbctCXoM7BRGsCC4aIjF7yrfXA== dependencies: - broccoli-persistent-filter "^1.4.3" - hash-for-dep "^1.2.3" - json-stable-stringify "^1.0.0" + broccoli-persistent-filter "^2.3.1" + hash-for-dep "^1.5.1" + json-stable-stringify "^1.0.1" strip-bom "^3.0.0" ember-cli-import-polyfill@^0.2.0: @@ -4662,9 +5148,9 @@ ember-cli-normalize-entity-name@^1.0.0: silent-error "^1.0.0" ember-cli-page-object@^1.15.1: - version "1.15.2" - resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.2.tgz#24d0ee60f64d9ae34fb8fa5bec9df46b62654c72" - integrity sha512-uUlUWeIkBCmqO2/PWInQgNu9I7YXj/Vfd566ddTRE5VHErM4B9XaNE2dRBM9J0ub1JKeWZaBByqP/hDNADRxxQ== + version "1.15.3" + resolved "https://registry.yarnpkg.com/ember-cli-page-object/-/ember-cli-page-object-1.15.3.tgz#4b1814e270367a455353aeb81019fb8d8c641886" + integrity sha512-wGZqQnsyFHcJilf0xcWa53my/bprtZWHXg7m6wZPbWbnJCXNf1aAouj9uwH77r3PnE+/uYt0MIKMfX3Cnd607g== dependencies: broccoli-file-creator "^2.1.1" broccoli-merge-trees "^2.0.0" @@ -4680,7 +5166,7 @@ ember-cli-path-utils@^1.0.0: resolved "https://registry.yarnpkg.com/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz#4e39af8b55301cddc5017739b77a804fba2071ed" integrity sha1-Tjmvi1UwHN3FAXc5t3qAT7ogce0= -ember-cli-preprocess-registry@^3.1.2: +ember-cli-preprocess-registry@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-3.3.0.tgz#685837a314fbe57224bd54b189f4b9c23907a2de" integrity sha512-60GYpw7VPeB7TvzTLZTuLTlHdOXvayxjAQ+IxM2T04Xkfyu75O2ItbWlftQW7NZVGkaCsXSRAmn22PG03VpLMA== @@ -4690,14 +5176,6 @@ ember-cli-preprocess-registry@^3.1.2: debug "^3.0.1" process-relative-require "^1.0.0" -ember-cli-qunit@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ember-cli-qunit/-/ember-cli-qunit-4.4.0.tgz#0edd7d651001d0d7ea200b9236a4733a5b7420f1" - integrity sha512-+gkx380AV4WXYjQeIuQi675STL9K12fHFtxs8B9u3EFbw45vJKrnYR4Vph3FujxhE/1pr/Je8kZEPAuezZAVLw== - dependencies: - ember-cli-babel "^6.11.0" - ember-qunit "^3.5.0" - ember-cli-sass@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ember-cli-sass/-/ember-cli-sass-10.0.0.tgz#700094ebaf348896111756c2644f1e444b05323c" @@ -4787,6 +5265,24 @@ ember-cli-test-loader@^2.2.0: dependencies: ember-cli-babel "^6.8.1" +ember-cli-typescript@^2.0.0, ember-cli-typescript@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-2.0.2.tgz#464984131fbdc05655eb61d1c3cdd911d3137f0d" + integrity sha512-7I5azCTxOgRDN8aSSnJZIKSqr+MGnT+jLTUbBYqF8wu6ojs2DUnTePxUcQMcvNh3Q3B1ySv7Q/uZFSjdU9gSjA== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.1.0" + "@babel/plugin-transform-typescript" "~7.4.0" + ansi-to-html "^0.6.6" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^1.0.0" + fs-extra "^7.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.0.0" + stagehand "^1.0.0" + walk-sync "^1.0.0" + ember-cli-uglify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-2.1.0.tgz#4a0641fe4768d7ab7d4807aca9924cc77c544184" @@ -4795,13 +5291,6 @@ ember-cli-uglify@^2.1.0: broccoli-uglify-sourcemap "^2.1.1" lodash.defaultsdeep "^4.6.0" -ember-cli-valid-component-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ember-cli-valid-component-name/-/ember-cli-valid-component-name-1.0.0.tgz#71550ce387e0233065f30b30b1510aa2dfbe87ef" - integrity sha1-cVUM44fgIzBl8wswsVEKot++h+8= - dependencies: - silent-error "^1.0.0" - ember-cli-version-checker@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz#0bc2d134c830142da64bf9627a0eded10b61ae72" @@ -4817,7 +5306,7 @@ ember-cli-version-checker@^2.0.0, ember-cli-version-checker@^2.1.0, ember-cli-ve resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -4825,98 +5314,103 @@ ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2: resolve-package-path "^1.2.6" semver "^5.6.0" -ember-cli@~3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.4.4.tgz#8d25b223b2ef3b863310099192da92ab1feeef6b" - integrity sha512-opbdqt9AbNRPr/amemwqi9ENbx/HcqcprxJAW/y8nZAV1gAku+xPY4WNBF6KuClVEKkddbNi4jITLU59rlJcDA== +ember-cli@~3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.12.0.tgz#e6d27e4c57fc44eb7963fe4611b3b0cfb9d9558d" + integrity sha512-hON3/thKAIcwzHX9SWIvf+UR2sQTWyXzyECYw20NDvUSydZMVtggK4GQncu7LSiUs+5zIxT8ZPzanpUZMINuCg== dependencies: - amd-name-resolver "^1.2.0" - babel-plugin-transform-es2015-modules-amd "^6.24.1" - bower-config "^1.3.0" + "@babel/core" "^7.4.3" + "@babel/plugin-transform-modules-amd" "^7.2.0" + amd-name-resolver "^1.3.1" + babel-plugin-module-resolver "^3.2.0" + bower-config "^1.4.1" bower-endpoint-parser "0.2.2" - broccoli-amd-funnel "^1.3.0" - broccoli-babel-transpiler "^6.5.0" + broccoli "^3.1.1" + broccoli-amd-funnel "^2.0.1" + broccoli-babel-transpiler "^7.2.0" broccoli-builder "^0.18.14" - broccoli-concat "^3.5.1" + broccoli-concat "^3.7.3" broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.1" + broccoli-debug "^0.6.5" + broccoli-funnel "^2.0.2" broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^3.0.0" + broccoli-merge-trees "^3.0.2" broccoli-middleware "^2.0.1" broccoli-module-normalizer "^1.3.0" broccoli-module-unification-reexporter "^1.0.0" + broccoli-slow-trees "^3.0.1" broccoli-source "^1.1.0" - broccoli-stew "^2.0.0" - calculate-cache-key-for-tree "^1.1.0" - capture-exit "^1.2.0" - chalk "^2.4.1" - ci-info "^1.1.3" + broccoli-stew "^2.1.0" + calculate-cache-key-for-tree "^2.0.0" + capture-exit "^2.0.0" + chalk "^2.4.2" + ci-info "^2.0.0" clean-base-url "^1.0.0" - compression "^1.7.3" + compression "^1.7.4" configstore "^4.0.0" - console-ui "^2.2.2" + console-ui "^3.0.2" core-object "^3.1.5" dag-map "^2.0.2" - diff "^3.5.0" - ember-cli-broccoli-sane-watcher "^2.1.1" + diff "^4.0.1" + ember-cli-broccoli-sane-watcher "^3.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" - ember-cli-preprocess-registry "^3.1.2" + ember-cli-preprocess-registry "^3.3.0" ember-cli-string-utils "^1.1.0" + ember-source-channel-url "^1.1.0" ensure-posix-path "^1.0.2" - execa "^0.10.0" + execa "^1.0.0" exit "^0.1.2" - express "^4.16.3" - filesize "^3.6.1" + express "^4.16.4" + filesize "^4.1.2" find-up "^3.0.0" - find-yarn-workspace-root "^1.1.0" - fixturify-project "^1.5.3" - fs-extra "^7.0.0" - fs-tree-diff "^0.5.7" - get-caller-file "^1.0.0" - git-repo-info "^2.0.0" - glob "^7.1.2" - heimdalljs "^0.2.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.1" + get-caller-file "^2.0.5" + git-repo-info "^2.1.0" + glob "^7.1.4" + heimdalljs "^0.2.6" heimdalljs-fs-monitor "^0.2.2" - heimdalljs-graph "^0.3.4" - heimdalljs-logger "^0.1.9" + heimdalljs-graph "^0.3.5" + heimdalljs-logger "^0.1.10" http-proxy "^1.17.0" inflection "^1.12.0" is-git-url "^1.0.0" isbinaryfile "^3.0.3" - js-yaml "^3.12.0" + js-yaml "^3.13.1" json-stable-stringify "^1.0.1" leek "0.0.24" lodash.template "^4.4.0" markdown-it "^8.4.2" markdown-it-terminal "0.1.0" minimatch "^3.0.4" - morgan "^1.9.0" - node-modules-path "^1.0.1" + morgan "^1.9.1" nopt "^3.0.6" npm-package-arg "^6.1.0" - portfinder "^1.0.15" + p-defer "^2.1.0" + portfinder "^1.0.20" promise-map-series "^0.2.3" + promise.prototype.finally "^3.1.0" quick-temp "^0.1.8" - resolve "^1.8.1" - rsvp "^4.8.3" - sane "^3.0.0" - semver "^5.5.0" - silent-error "^1.1.0" - sort-package-json "^1.15.0" + resolve "^1.10.1" + resolve-package-path "^1.2.7" + rsvp "^4.8.4" + sane "^4.1.0" + semver "^6.0.0" + silent-error "^1.1.1" + sort-package-json "^1.22.1" symlink-or-copy "^1.2.0" - temp "0.8.3" - testem "^2.9.2" + temp "0.9.0" + testem "^2.14.0" tiny-lr "^1.1.1" - tree-sync "^1.2.2" + tree-sync "^1.4.0" uuid "^3.3.2" - validate-npm-package-name "^3.0.0" - walk-sync "^0.3.2" + walk-sync "^1.1.3" watch-detector "^0.1.0" - yam "^0.0.24" + yam "^1.0.0" ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.2.0: version "1.2.0" @@ -4928,17 +5422,19 @@ ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.2.0: semver "^5.4.1" ember-composable-helpers@^2.0.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.2.0.tgz#a03984eaddf65ee08cb9ff554a24b0d671651af3" - integrity sha512-VWFYfxPLkgmEoL5aplh8dEwzAhmERfPzIGZeb+O7PhT0of5SYtJeOJFbIIXV2NkVHcDothwUu3IEALsWBsES8A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-2.3.1.tgz#db98ad8b55d053e2ac216b9da091c9e7a3b9f453" + integrity sha512-Eltj5yt2CtHhBMrdsjKQTP1zFyfEXQ5/v85ObV2zh0eIJZa1t/gImHN+GIHHuJ+9xOrCUAy60/2TJZjadpoPBQ== dependencies: - broccoli-funnel "^1.0.1" + "@babel/core" "^7.0.0" + broccoli-funnel "2.0.1" ember-cli-babel "^7.1.0" + resolve "^1.10.0" -ember-concurrency@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-0.9.0.tgz#0016652ff780fb665842e7f47815ee0601122ea1" - integrity sha512-JDjvwSlZBUQwv1+qUj6YUqXXe0Y0/to4ppUTNXQ1EEiEAopkHJXQUn0ZcFOiQpEinrYp34Vg6+lUNskoJFL2Vg== +ember-concurrency@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-concurrency/-/ember-concurrency-1.0.0.tgz#3b650672fdd5dc1d45007626119135829076c2b6" + integrity sha512-76aKC0lo2LAPoQYz7vMRlpolWTIQerszr8PPf3JMM5cTOzPwXUtzDcjfso3JAEDdhyUF9fkv2V1DmHagFbC2YQ== dependencies: babel-core "^6.24.1" ember-cli-babel "^6.8.2" @@ -4952,10 +5448,10 @@ ember-copy@1.0.0, ember-copy@^1.0.0: dependencies: ember-cli-babel "^6.6.0" -ember-data-model-fragments@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-3.3.0.tgz#93e3ddba6fab2150435f995e07d25a4d88694886" - integrity sha512-fzBGYCSooaF7sqhxrv08TqG7okye7btYjefGq0ATucaAqSVMkjDkmM9/304nQYHWbKpzWeAzX/qJKSMYaWpN6g== +ember-data-model-fragments@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-data-model-fragments/-/ember-data-model-fragments-4.0.0.tgz#8570d8b6bef12e8a3518279af01478ef8818a44f" + integrity sha512-DcRRQAWrrfRQBW8+v6takQdS2hNJ9rKWU/uHjnPY6+Vg/y6TxyPU8mo0PF2z0DYAeXwoIQ05iYTJT0sqFPEo+w== dependencies: broccoli-file-creator "^2.1.1" broccoli-merge-trees "^3.0.0" @@ -4965,43 +5461,34 @@ ember-data-model-fragments@3.3.0: git-repo-info "^2.0.0" npm-git-info "^1.0.3" -ember-data@~3.4.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.4.4.tgz#a201c2db1d7ca2cbe59a23ddf3cb96281fce216f" - integrity sha512-5DE1CxR1Eobue0y2WCkGSRUaOuE8ebktNElhcyPUcrksbnILxniPsKPVRq15X+5wLjaEb+XiscH68NLBGbjUvQ== +ember-data@~3.12.0: + version "3.12.4" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.12.4.tgz#09433e9c270eb4aad023e1e0ed5a8db31b356fd1" + integrity sha512-PWHCKYZKht2h6nqG4Vr6sjsQndRbx23eFS7VtzEfTD3qJf5Aa2fG5Ur9T8ZX9U75KxrDLoV/LfnUe1FU5fXI8w== dependencies: - "@ember/ordered-set" "^2.0.0" - babel-plugin-feature-flags "^0.3.1" - babel-plugin-filter-imports "^0.3.1" - babel-plugin-transform-es2015-block-scoping "^6.26.0" - babel6-plugin-strip-class-callcheck "^6.0.0" - babel6-plugin-strip-heimdall "^6.0.1" - broccoli-debug "^0.6.4" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^3.0.0" - broccoli-rollup "^2.1.1" - calculate-cache-key-for-tree "^1.1.0" - chalk "^2.4.1" - ember-cli-babel "^6.16.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-version-checker "^2.1.2" - ember-inflector "^3.0.0" - git-repo-info "^2.0.0" - heimdalljs "^0.3.0" - inflection "^1.12.0" - npm-git-info "^1.0.3" - resolve "^1.8.1" - semver "^5.5.0" - silent-error "^1.1.0" + "@ember-data/-build-infra" "3.12.4" + "@ember-data/adapter" "3.12.4" + "@ember-data/model" "3.12.4" + "@ember-data/serializer" "3.12.4" + "@ember-data/store" "3.12.4" + "@ember/ordered-set" "^2.0.3" + "@glimmer/env" "^0.1.7" + ember-cli-babel "^7.8.0" + ember-cli-typescript "^2.0.2" + ember-inflector "^3.0.1" ember-debug-handlers-polyfill@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ember-debug-handlers-polyfill/-/ember-debug-handlers-polyfill-1.1.1.tgz#e9ae0a720271a834221179202367421b580002ef" integrity sha512-lO7FBAqJjzbL+IjnWhVfQITypPOJmXdZngZR/Vdn513W4g/Q6Sjicao/mDzeDCb48Y70C4Facwk0LjdIpSZkRg== +ember-element-helper@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ember-element-helper/-/ember-element-helper-0.1.1.tgz#ffd2a0566b22a13c0e7780ae96443f4ffda2e63d" + integrity sha512-MfES7MbZ5UcHTo1lutJCcz6hI+/CadurWcOR3kOQl0jKcBKdAWyYIJXK4u0FDXzlgKczX9vL3R2eJUtnGe144w== + dependencies: + ember-cli-babel "^6.16.0" + ember-export-application-global@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.0.tgz#8d6d7619ac8a1a3f8c43003549eb21ebed685bd2" @@ -5017,21 +5504,21 @@ ember-factory-for-polyfill@^1.3.1: ember-cli-version-checker "^2.1.0" ember-fetch@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.5.0.tgz#efed80b3dd2259b52efce7498659e9125235bfb7" - integrity sha512-B9KSeeO3xDNMQ22JqNwbmgnOprBzc8kNVfQMtzkAmugMb2aCmBZohAlQlwUUX5ODz8fHq2xfuZXDHD81Dzb0vg== + version "6.7.0" + resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-6.7.0.tgz#c219f820e40f7918147391617a5940c67d293319" + integrity sha512-lB9G+XDKOc84Dr3THJs+l/KmtzUus7nv12Z0xOP54J917HmjnAsSZ9OHTp+X8ClxlAm35/v9l+sFd7IlB9Baqw== dependencies: - abortcontroller-polyfill "^1.2.5" + abortcontroller-polyfill "^1.3.0" broccoli-concat "^3.2.2" broccoli-debug "^0.6.5" broccoli-merge-trees "^3.0.0" broccoli-rollup "^2.1.1" - broccoli-stew "^2.0.0" + broccoli-stew "^2.1.0" broccoli-templater "^2.0.1" - calculate-cache-key-for-tree "^1.1.0" + calculate-cache-key-for-tree "^2.0.0" caniuse-api "^3.0.0" ember-cli-babel "^6.8.2" - node-fetch "^2.3.0" + node-fetch "^2.6.0" whatwg-fetch "^3.0.0" ember-freestyle@~0.10.0: @@ -5064,7 +5551,7 @@ ember-getowner-polyfill@^2.0.1, ember-getowner-polyfill@^2.2.0: ember-cli-version-checker "^2.1.0" ember-factory-for-polyfill "^1.3.1" -"ember-inflector@^2.0.0 || ^3.0.0": +"ember-inflector@^2.0.0 || ^3.0.0", ember-inflector@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== @@ -5078,28 +5565,29 @@ ember-inflector@^3.0.0: dependencies: ember-cli-babel "^6.6.0" -ember-inline-svg@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ember-inline-svg/-/ember-inline-svg-0.2.1.tgz#091f3fc27836e5ee0df1482c9e4a1a8adc9113f3" - integrity sha512-R7LsMZo1CrXbDgCX6sMnzUg+ggeosOwq8HTilWnNUpH11mb9pbMoG5s/Qm9iRMVW2iMesiCMnCaLsEkTiY8Yhw== +ember-inline-svg@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ember-inline-svg/-/ember-inline-svg-0.3.0.tgz#14e305446e832c116210d5f0cb2aae8343879980" + integrity sha512-CH7+bOUCDfDo27mJO2NQqcDpnOz258iXzdiWmG6hftIBZ97Q64Qo0/Hm38ShWY40r2cw3jwior19miH6/e7amg== dependencies: broccoli-caching-writer "^3.0.3" broccoli-flatiron "~0.1.3" broccoli-funnel "^2.0.1" broccoli-merge-trees "^3.0.0" ember-cli-babel "^6.16.0" - merge "^1.2.0" + merge "^1.2.1" mkdirp "^0.5.1" promise-map-series "^0.2.1" - svgo "~1.0.5" + svgo "~1.2.2" walk-sync "^0.3.1" -ember-load-initializers@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-1.1.0.tgz#4edacc0f3a14d9f53d241ac3e5561804c8377978" - integrity sha512-WiciFi8IXOqjyJ65M4iBNIthqcy4uXXQq5n3WxeMMhvJVk5JNSd9hynNECNz3nqfEYuZQ9c04UWkmFIQXRfl4Q== +ember-load-initializers@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ember-load-initializers/-/ember-load-initializers-2.1.0.tgz#b402815ab9c823ff48a1369b52633721987e72d4" + integrity sha512-zvcq35U2EPyjonCPdDBISZbeuxP3OXf+asmj2bNucFwo1ej7gYJCJacy6N8oABEG2EmrU/8jMDoZndWIAGn0cQ== dependencies: - ember-cli-babel "^6.6.0" + ember-cli-babel "^7.10.0" + ember-cli-typescript "^2.0.0" ember-macro-helpers@^2.1.0: version "2.2.0" @@ -5121,13 +5609,22 @@ ember-maybe-import-regenerator@^0.1.5, ember-maybe-import-regenerator@^0.1.6: ember-cli-babel "^6.0.0-beta.4" regenerator-runtime "^0.9.5" -ember-maybe-in-element@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-0.2.0.tgz#9ac51cbbd9d83d6230ad996c11e33f0eca3032e0" - integrity sha512-R5e6N8yDbfNbA/3lMZsFs2KEzv/jt80TsATiKMCqdqKuSG82KrD25cRdU5VkaE8dTQbziyBeuJs90bBiqOnakQ== +ember-maybe-in-element@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/ember-maybe-in-element/-/ember-maybe-in-element-0.4.0.tgz#fe1994c60ee64527d2b2f3b4479ebf8806928bd8" + integrity sha512-ADQ9jewz46Y2MWiTAKrheIukHiU6p0QHn3xqz1BBDDOmubW1WdAjSrvtkEWsJQ08DyxIn3RdMuNDzAUo6HN6qw== dependencies: ember-cli-babel "^7.1.0" +ember-modifier-manager-polyfill@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-modifier-manager-polyfill/-/ember-modifier-manager-polyfill-1.2.0.tgz#cf4444e11a42ac84f5c8badd85e635df57565dda" + integrity sha512-bnaKF1LLKMkBNeDoetvIJ4vhwRPKIIumWr6dbVuW6W6p4QV8ZiO+GdF8J7mxDNlog9CeL9Z/7wam4YS86G8BYA== + dependencies: + ember-cli-babel "^7.10.0" + ember-cli-version-checker "^2.1.2" + ember-compatibility-helpers "^1.2.0" + ember-moment@^7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/ember-moment/-/ember-moment-7.8.1.tgz#6f77cf941d1a92e231b2f4b810e113b2fae50c5f" @@ -5145,6 +5642,13 @@ ember-native-dom-helpers@^0.5.3: broccoli-funnel "^1.1.0" ember-cli-babel "^6.6.0" +ember-overridable-computed@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-overridable-computed/-/ember-overridable-computed-1.0.0.tgz#4fb4a5acc9ec9ed7421586a5a8b4014f5bdb04f7" + integrity sha512-0uuJZDEpq0LzNGQAtAf1PhcFVbkaHKd5ilT81k1aU4ZgCo5cwkxU65R5evokweq2dQwIaGTSs0MndCG+qI8BXA== + dependencies: + ember-cli-babel "^7.7.3" + ember-page-title@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/ember-page-title/-/ember-page-title-5.0.2.tgz#ab5a60c16318ba7f5e66cd41f580c9831ce3b612" @@ -5155,15 +5659,16 @@ ember-page-title@^5.0.2: ember-cli-htmlbars "^3.0.1" ember-copy "^1.0.0" -ember-power-select@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-2.3.0.tgz#f9f2d242381f715f860c76f168d63c6ff2688ae7" - integrity sha512-LSLAt3WiljlbXelWLgna6cnnvhapltzK/yYoRbQ2iyawIQA1yU/HD4Sc2s3flrGI5IpAIbG+MFYKq0CpfJWQMQ== +ember-power-select@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ember-power-select/-/ember-power-select-3.0.4.tgz#52700ecaa2053b0a20b4e5d0a6e63802346e52ad" + integrity sha512-+KS8GnKUuqsC725Ncv3NDz/fbVSYBFkRHPXYTtGSWUtpTkaY2ncSwBr6mIFPDNOr7isBvtUArXHvHCnz5O9xaQ== dependencies: - ember-basic-dropdown "^1.1.0" - ember-cli-babel "^7.2.0" - ember-cli-htmlbars "^3.0.1" - ember-concurrency "^0.9.0" + "@ember-decorators/component" "^6.1.0" + ember-basic-dropdown "^2.0.5" + ember-cli-babel "^7.11.0" + ember-cli-htmlbars "^3.1.0" + ember-concurrency "^1.0.0" ember-text-measurer "^0.5.0" ember-truth-helpers "^2.1.0" @@ -5177,18 +5682,18 @@ ember-qunit-nice-errors@^1.2.0: ember-cli-babel "^6.6.0" recast "^0.13.0" -ember-qunit@^3.5.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-3.5.3.tgz#bfd0bff8298c78c77e870cca43fe0826e78a0d09" - integrity sha512-FmXsI1bGsZ5th25x4KEle2fLCVURTptsQODfBt+Pg8tk9rX7y79cqny91PrhtkhE+giZ8p029tnq94SdpJ4ojg== +ember-qunit@^4.4.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-4.5.1.tgz#dc4b0a794fbeb6702a02f28bf19091de0f90fd5a" + integrity sha512-fOxXQLFdellP0yiMd9f3n7pIGggiDo8kBuswdGvsCrqTKq5aB1Cb49eeoNyBDQYGlhcxY0pOGUe+xElppChDBA== dependencies: - "@ember/test-helpers" "^0.7.26" - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" + "@ember/test-helpers" "^1.6.0" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" common-tags "^1.4.0" - ember-cli-babel "^6.8.2" + ember-cli-babel "^7.8.0" ember-cli-test-loader "^2.2.0" - qunit "~2.6.0" + qunit "^2.9.2" ember-resolver@^5.0.1: version "5.1.3" @@ -5203,17 +5708,17 @@ ember-resolver@^5.0.1: ember-cli-version-checker "^3.0.0" resolve "^1.10.0" -ember-responsive@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.0.tgz#03791da324299a8c8cb461e541a5e1aeca887881" - integrity sha512-5JQ+REBu37M7NNDJOnTjzp5eQzg4cX7VtPcD19V3nBcntRuDwf7N6TndLxmw4Kt3JXuzQL4PkDE2SgVKuNTdWQ== +ember-responsive@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ember-responsive/-/ember-responsive-3.0.4.tgz#1980ae6393b3b6ebedf1c7cda1cd70eeb64ea85b" + integrity sha512-jnybZXFwJqz61Tgj4o8uGwKEMBm3N6o9VQJpLlg0MpMVcm1OAemftQpkfs+687Q1SgKFSuN1rwumx+xx7H5Umw== dependencies: ember-cli-babel "^6.6.0" -ember-rfc176-data@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.8.tgz#d46bbef9a0d57c803217b258cfd2e90d8e191848" - integrity sha512-SQup3iG7SDLZNuf7nMMx5BC5truO8AYKRi80gApeQ07NsbuXV4LH75i5eOaxF0i8l9+H1tzv34kGe6rEh0C1NQ== +ember-rfc176-data@^0.3.12: + version "0.3.12" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.12.tgz#90d82878e69e2ac9a5438e8ce14d12c6031c5bd2" + integrity sha512-g9HeZj/gU5bfIIrGXkP7MhS2b3Vu5DfNUrYr14hy99TgIvtZETO+96QF4WOEUXGjIJdfTRjerVnQlqngPQSv1g== ember-rfc176-data@^0.3.9: version "0.3.9" @@ -5235,35 +5740,42 @@ ember-runtime-enumerable-includes-polyfill@^2.0.0: ember-cli-babel "^6.9.0" ember-cli-version-checker "^2.1.0" -ember-sinon@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-2.2.0.tgz#acb628dec695d6817bd17fd6c25a4d70821851e9" - integrity sha512-BgjHsgy8rli8FaJ1MWkscIKRpoFmzYhNkDtwBWQrUCzQx1bp3+irVpseAPqBnuEB4FPFGGQV5ahDpFcckmIsAw== +ember-sinon@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-sinon/-/ember-sinon-4.0.0.tgz#bb9bc43b68cc4500457261606a47c7b6ef8c30a3" + integrity sha512-SF6+ak/8yTyD2R8ylz9HYzoziiJCCB6bh/QG/ly4aqAf9eXL+ldQE91IljzEDh6B8feMUpUCGGajbrs9svwhQA== dependencies: broccoli-funnel "^2.0.0" broccoli-merge-trees "^3.0.0" - ember-cli-babel "^6.6.0" - sinon "^6.0.1" + ember-cli-babel "^7.7.3" + sinon "^7.3.2" -ember-source@~3.4.0: - version "3.4.8" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.4.8.tgz#68677bf9bd222aff865100b241004649c3d3dda7" - integrity sha512-uiRqAzzFKvZ0P5zf5eOv2BrhBUNFJOnsUrri6dN8Ci7pxBkj/fyKVxwIu/+juQh4E/QRgrfze/+Cueq0FNf6rQ== +ember-source-channel-url@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.2.0.tgz#77eb9d0889e5f5370e6c70fcb2696c63ff4a34a1" + integrity sha512-CLClcHzVf+8GoFk4176R16nwXoel70bd7DKVAY6D8M0m5fJJhbTrAPYpDA0lY8A60HZo9j/s8A8LWiGh1YmdZg== dependencies: - broccoli-funnel "^2.0.1" - broccoli-merge-trees "^2.0.0" - chalk "^2.3.0" + got "^8.0.1" + +ember-source@~3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.12.0.tgz#92f72894836d4497e704901c1d061c61b066bddf" + integrity sha512-4iA2BgYmNLWysifLyt2LCQgU9ux/NiTR/MT7KTt9HUyTDJyivcdyKNtfrUQst/1InUvn+MxuQ0ZsbQICJkX6yA== + dependencies: + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + chalk "^2.4.2" + ember-cli-babel "^7.7.0" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-valid-component-name "^1.0.0" - ember-cli-version-checker "^2.1.0" + ember-cli-version-checker "^3.1.3" ember-router-generator "^1.2.3" inflection "^1.12.0" - jquery "^3.3.1" - resolve "^1.6.0" + jquery "^3.4.1" + resolve "^1.11.1" ember-template-lint@^1.0.0-beta.5: version "1.1.0" @@ -5285,6 +5797,13 @@ ember-test-selectors@^2.1.0: ember-cli-babel "^6.8.2" ember-cli-version-checker "^3.1.2" +ember-test-waiters@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ember-test-waiters/-/ember-test-waiters-1.1.1.tgz#7df6e7a47e0fdca814aa351f7f7f9a006e15fdcd" + integrity sha512-ra71ZWTGBGLeDPa308aeAg9+/nYxv2fk4OEzmXdhvbSa5Dtbei94sr5pbLXx2IiK3Re2gDAvDzxg9PVhLy9fig== + dependencies: + ember-cli-babel "^7.1.2" + ember-text-measurer@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/ember-text-measurer/-/ember-text-measurer-0.5.0.tgz#b907aeb8cbc04560e5070dc0347cdd35d0040d0d" @@ -5292,7 +5811,7 @@ ember-text-measurer@^0.5.0: dependencies: ember-cli-babel "^7.1.0" -ember-truth-helpers@^2.0.0, ember-truth-helpers@^2.1.0: +ember-truth-helpers@2.1.0, ember-truth-helpers@^2.0.0, ember-truth-helpers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-2.1.0.tgz#d4dab4eee7945aa2388126485977baeb33ca0798" integrity sha512-BQlU8aTNl1XHKTYZ243r66yqtR9JU7XKWQcmMA+vkqfkE/c9WWQ9hQZM8YABihCmbyxzzZsngvldokmeX5GhAw== @@ -5411,7 +5930,7 @@ error@^7.0.0: string-template "~0.2.1" xtend "~4.0.0" -es-abstract@^1.12.0, es-abstract@^1.5.1: +es-abstract@^1.12.0, es-abstract@^1.5.1, es-abstract@^1.9.0: version "1.13.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== @@ -5454,6 +5973,26 @@ escodegen@^1.11.0: optionalDependencies: source-map "~0.6.1" +eslint-plugin-es@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz#12acae0f4953e76ba444bfd1b2271081ac620998" + integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== + dependencies: + eslint-utils "^1.4.2" + regexpp "^2.0.1" + +eslint-plugin-node@^9.0.1: + version "9.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-9.2.0.tgz#b1911f111002d366c5954a6d96d3cd5bf2a3036a" + integrity sha512-2abNmzAH/JpxI4gEOwd6K8wZIodK3BmHbTxz4s79OIYwwIt2gkpEXlAouJXu4H1c9ySTnRso0tsuthSOZbUMlA== + dependencies: + eslint-plugin-es "^1.4.1" + eslint-utils "^1.4.2" + ignore "^5.1.1" + minimatch "^3.0.4" + resolve "^1.10.1" + semver "^6.1.0" + eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -5467,6 +6006,13 @@ eslint-utils@^1.3.1: resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== +eslint-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" @@ -5514,6 +6060,11 @@ eslint@^5.16.0, eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" +esm@^3.2.25, esm@^3.2.4: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" @@ -5562,10 +6113,10 @@ estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estree-walker@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" - integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== esutils@^2.0.2: version "2.0.2" @@ -5600,34 +6151,10 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -exec-file-sync@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/exec-file-sync/-/exec-file-sync-2.0.2.tgz#58d441db46e40de6d1f30de5be022785bd89e328" - integrity sha1-WNRB20bkDebR8w3lvgInhb2J4yg= - dependencies: - is-obj "^1.0.0" - object-assign "^4.0.1" - spawn-sync "^1.0.11" - -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" - -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== execa@^0.7.0: version "0.7.0" @@ -5655,21 +6182,11 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exists-stat@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/exists-stat/-/exists-stat-1.0.0.tgz#0660e3525a2e89d9e446129440c272edfa24b529" - integrity sha1-BmDjUlouidnkRhKUQMJy7foktSk= - exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" integrity sha1-l0TCxCjMA7AQYNtFTUsS8O88iHk= -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -5695,7 +6212,7 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express@^4.10.7, express@^4.16.3: +express@^4.10.7: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== @@ -5731,6 +6248,42 @@ express@^4.10.7, express@^4.16.3: utils-merge "1.0.1" vary "~1.1.2" +express@^4.16.4: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -5746,20 +6299,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" - integrity sha1-Etew24UPf/fnCBuvQAVwAGDEYAs= - dependencies: - extend "^3.0.0" - spawn-sync "^1.0.15" - tmp "^0.0.29" - external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" @@ -5909,11 +6453,6 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -filesize@^3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317" - integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg== - filesize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.1.2.tgz#fcd570af1353cea97897be64f56183adb995994b" @@ -5942,6 +6481,19 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + find-babel-config@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2" @@ -5991,7 +6543,7 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-yarn-workspace-root@^1.1.0: +find-yarn-workspace-root@^1.1.0, find-yarn-workspace-root@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== @@ -5999,7 +6551,7 @@ find-yarn-workspace-root@^1.1.0: fs-extra "^4.0.3" micromatch "^3.1.4" -findup-sync@2.0.0: +findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= @@ -6020,25 +6572,6 @@ fireworm@^0.7.0: lodash.flatten "^3.0.2" minimatch "^3.0.2" -fixturify-project@^1.5.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-1.8.1.tgz#c0a95a801538bcdd502cbe6a1950f663c1e077a4" - integrity sha512-kq1rX8SlHzfR5Okhj4gatm/XJDv2ELzHiW9S5zFoZygHMrCRhoWcW/Ktl8zzpmJn/dsz8Rrm7addq62G3wmCNw== - dependencies: - fixturify "^1.2.0" - tmp "^0.0.33" - -fixturify@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fixturify/-/fixturify-1.2.0.tgz#abe8c52dd27dbbfdb874a02893781c93425663ea" - integrity sha512-b5CMQmBZKsGR6HGqdSrLOGYGHIqrR0CUrcGU/lDL0mYy+DtGm5cnb61Z0UiIUqMVZIoV0CbN+u9/Gwjj+ICg0A== - dependencies: - "@types/fs-extra" "^5.0.5" - "@types/minimatch" "^3.0.3" - "@types/rimraf" "^2.0.2" - fs-extra "^7.0.1" - matcher-collection "^2.0.0" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -6116,7 +6649,7 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.0: +from2@^2.1.0, from2@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -6171,9 +6704,9 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: universalify "^0.1.0" fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== dependencies: minipass "^2.2.1" @@ -6197,7 +6730,7 @@ fs-tree-diff@^1.0.0, fs-tree-diff@^1.0.2: path-posix "^1.0.0" symlink-or-copy "^1.1.8" -fs-tree-diff@^2.0.0: +fs-tree-diff@^2.0.0, fs-tree-diff@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz#343e4745ab435ec39ebac5f9059ad919cd034afa" integrity sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A== @@ -6234,13 +6767,13 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.3, fsevents@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== +fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" + nan "^2.12.1" + node-pre-gyp "^0.12.0" fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" @@ -6263,9 +6796,9 @@ functional-red-black-tree@^1.0.1: integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= fuse.js@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.4.tgz#f98f55fcb3b595cf6a3e629c5ffaf10982103e95" - integrity sha512-pyLQo/1oR5Ywf+a/tY8z4JygnIglmRxVUOiyFAbd11o9keUDpUJSMGRWJngcnkURj30kDHPmhoKY8ChJiz3EpQ== + version "3.4.5" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.4.5.tgz#8954fb43f9729bd5dbcb8c08f251db552595a7a6" + integrity sha512-s9PGTaQIkT69HaeoTVjwGsLfb8V8ScJLx5XGFcKHg0MqLUH/UZ4EKOtqtXX9k7AFqCGxD1aJmYb8Q5VYDibVRQ== g-status@^2.0.2: version "2.0.2" @@ -6297,11 +6830,16 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" -get-caller-file@^1.0.0, get-caller-file@^1.0.1: +get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-own-enumerable-property-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz#b877b49a5c16aefac3655f2ed2ea5b684df8d203" @@ -6317,7 +6855,7 @@ get-stdin@^6.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== -get-stream@^3.0.0: +get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= @@ -6341,7 +6879,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-repo-info@^2.0.0: +git-repo-info@^2.0.0, git-repo-info@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== @@ -6370,7 +6908,7 @@ glob@^5.0.10: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -6382,6 +6920,18 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.4, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -6402,7 +6952,12 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^11.7.0: version "11.11.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== @@ -6453,6 +7008,29 @@ good-listener@^1.2.2: dependencies: delegate "^3.1.2" +got@^8.0.1: + version "8.3.2" + resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" + integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw== + dependencies: + "@sindresorhus/is" "^0.7.0" + cacheable-request "^2.1.1" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + into-stream "^3.1.0" + is-retry-allowed "^1.1.0" + isurl "^1.0.0-alpha5" + lowercase-keys "^1.0.0" + mimic-response "^1.0.0" + p-cancelable "^0.4.0" + p-timeout "^2.0.1" + pify "^3.0.0" + safe-buffer "^5.1.1" + timed-out "^4.0.1" + url-parse-lax "^3.0.0" + url-to-options "^1.0.1" + graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" @@ -6490,17 +7068,6 @@ handlebars@^4.0.4, handlebars@^4.0.6: optionalDependencies: uglify-js "^3.1.4" -handlebars@~4.0.13: - version "4.0.13" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.13.tgz#89fc17bf26f46fd7f6f99d341d92efaae64f997d" - integrity sha512-uydY0jy4Z3wy/iGXsi64UtLD4t1fFJe16c/NFxsYE4WdQis8ZCzOXUZaPQNG0e5bgtLQV41QTfqBindhEjnpyQ== - dependencies: - async "^2.5.0" - optimist "^0.6.1" - source-map "^0.6.1" - optionalDependencies: - uglify-js "^3.1.4" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -6538,11 +7105,23 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-symbol-support-x@^1.4.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" + integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== + has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= +has-to-string-tag-x@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw== + dependencies: + has-symbol-support-x "^1.4.1" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -6594,7 +7173,7 @@ hash-base@^3.0.0: inherits "^2.0.1" safe-buffer "^5.0.1" -hash-for-dep@^1.0.2, hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0: +hash-for-dep@^1.0.2, hash-for-dep@^1.2.3, hash-for-dep@^1.4.7, hash-for-dep@^1.5.0, hash-for-dep@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.5.1.tgz#497754b39bee2f1c4ade4521bfd2af0a7c1196e3" integrity sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw== @@ -6622,12 +7201,12 @@ heimdalljs-fs-monitor@^0.2.2: heimdalljs "^0.2.3" heimdalljs-logger "^0.1.7" -heimdalljs-graph@^0.3.4: +heimdalljs-graph@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/heimdalljs-graph/-/heimdalljs-graph-0.3.5.tgz#420fbbc8fc3aec5963ddbbf1a5fb47921c4a5927" integrity sha512-szOy9WZUc7eUInEBQEsoa1G2d+oYHrn6ndZPf76eh8A9ID1zWUCEEsxP3F+CvQx9+EDrg1srdyLUmfVAr8EB4g== -heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: +heimdalljs-logger@^0.1.10, heimdalljs-logger@^0.1.7, heimdalljs-logger@^0.1.9: version "0.1.10" resolved "https://registry.yarnpkg.com/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz#90cad58aabb1590a3c7e640ddc6a4cd3a43faaf7" integrity sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g== @@ -6685,6 +7264,11 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +http-cache-semantics@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -6695,6 +7279,28 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-parser-js@>=0.4.0: version "0.5.0" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" @@ -6723,6 +7329,11 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" + integrity sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q= + husky@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/husky/-/husky-1.3.1.tgz#26823e399300388ca2afff11cfa8a86b0033fae0" @@ -6775,6 +7386,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.1: + version "5.1.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" + integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -6828,7 +7444,7 @@ inflected@^2.0.4: resolved "https://registry.yarnpkg.com/inflected/-/inflected-2.0.4.tgz#323770961ccbe992a98ea930512e9a82d3d3ef77" integrity sha512-HQPzFLTTUvwfeUH6RAGjD8cHS069mBqXG5n4qaxX7sJXBhVQrsGgF+0ZJGkSuN6a8pcUWB/GXStta11kKi/WvA== -inflection@^1.12.0: +inflection@1.12.0, inflection@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= @@ -6841,16 +7457,21 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3, inherits@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -6867,26 +7488,6 @@ inline-source-map-comment@^1.0.5: sum-up "^1.0.1" xtend "^4.0.0" -inquirer@^2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-2.0.0.tgz#e1351687b90d150ca403ceaa3cefb1e3065bef4b" - integrity sha1-4TUWh7kNFQykA86qPO+x4wZb70s= - dependencies: - ansi-escapes "^1.1.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - external-editor "^1.1.0" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.6" - pinkie-promise "^2.0.0" - run-async "^2.2.0" - rx "^4.1.0" - string-width "^2.0.0" - strip-ansi "^3.0.0" - through "^2.3.6" - inquirer@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" @@ -6907,6 +7508,25 @@ inquirer@^3.3.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6: + version "6.5.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" + integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + inquirer@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" @@ -6926,6 +7546,14 @@ inquirer@^6.2.2: strip-ansi "^5.0.0" through "^2.3.6" +into-stream@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6" + integrity sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY= + dependencies: + from2 "^2.1.1" + p-is-promise "^1.1.0" + invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6948,6 +7576,11 @@ ipaddr.js@1.8.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= +ipaddr.js@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -7112,6 +7745,11 @@ is-obj@^1.0.0, is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + is-observable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" @@ -7138,7 +7776,12 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -7151,9 +7794,9 @@ is-promise@^2.1.0: integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-reference@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.2.tgz#01cf91517d21db66a34642287ed6e70d53dcbe5c" - integrity sha512-Kn5g8c7XHKejFOpTf2QN9YjiHHKl5xRj+2uAZf9iM2//nkBNi/NNeB5JMoun28nEaUVHyPUzqzhfRlfAirEjXg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.1.3.tgz#e99059204b66fdbe09305cfca715a29caa5c8a51" + integrity sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw== dependencies: "@types/estree" "0.0.39" @@ -7169,6 +7812,11 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= +is-retry-allowed@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -7261,6 +7909,14 @@ istextorbinary@2.1.0: editions "^1.1.1" textextensions "1 || 2" +isurl@^1.0.0-alpha5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" + integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== + dependencies: + has-to-string-tag-x "^1.2.0" + is-object "^1.0.1" + ivy-codemirror@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ivy-codemirror/-/ivy-codemirror-2.1.0.tgz#c06f1606c375610bf62b007a21a9e63f5854175e" @@ -7275,10 +7931,10 @@ jquery-deferred@^0.3.0: resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= -jquery@^3.2.1, jquery@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" - integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== +jquery@^3.2.1, jquery@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" + integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== js-base64@^2.1.8: version "2.5.1" @@ -7310,7 +7966,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7: +js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7: version "3.13.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.0.tgz#38ee7178ac0eea2c97ff6d96fff4b18c7d8cf98e" integrity sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ== @@ -7318,10 +7974,10 @@ js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.2.5, js-yaml@^3.2.7: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -7382,6 +8038,11 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -7467,6 +8128,13 @@ just-extend@^4.0.2: resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== +keyv@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373" + integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA== + dependencies: + json-buffer "3.0.0" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -7618,7 +8286,7 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -7772,16 +8440,16 @@ lodash._objecttypes@~2.3.0: resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.3.0.tgz#6a3ea3987dd6eeb8021b2d5c9c303549cc2bae1e" integrity sha1-aj6jmH3W7rgCGy1cnDA1Scwrrh4= +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + lodash._reinterpolate@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.3.0.tgz#03ee9d85c0e55cbd590d71608a295bdda51128ec" integrity sha1-A+6dhcDlXL1ZDXFgiilb3aURKOw= -lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - lodash._renative@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/lodash._renative/-/lodash._renative-2.3.0.tgz#77d8edd4ced26dd5971f9e15a5f772e4e317fbd3" @@ -8047,7 +8715,12 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.3.1, lodash.merge@^4.6.0: +lodash.merge@^4.3.1: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== @@ -8095,11 +8768,11 @@ lodash.support@~2.3.0: lodash._renative "~2.3.0" lodash.template@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" - integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" lodash.templatesettings "^4.0.0" lodash.template@~2.3.x: @@ -8116,11 +8789,11 @@ lodash.template@~2.3.x: lodash.values "~2.3.0" lodash.templatesettings@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" - integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== dependencies: - lodash._reinterpolate "~3.0.0" + lodash._reinterpolate "^3.0.0" lodash.templatesettings@~2.3.0: version "2.3.0" @@ -8152,11 +8825,16 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.5.1, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.3.0, lodash@~4.17.10: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.4, lodash@^4.5.1: + version "4.17.14" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.14.tgz#9ce487ae66c96254fe20b599f21b6816028078ba" + integrity sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw== + lodash@^4.17.13: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" @@ -8185,10 +8863,10 @@ log-update@^2.3.0: cli-cursor "^2.0.0" wrap-ansi "^3.0.1" -lolex@^2.3.2, lolex@^2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q== +lolex@^4.0.1, lolex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.1.0.tgz#ecdd7b86539391d8237947a3419aa8ac975f0fe1" + integrity sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw== loose-envify@^1.0.0: version "1.4.0" @@ -8205,6 +8883,16 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lowercase-keys@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= + +lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -8300,14 +8988,6 @@ matcher-collection@^1.0.0, matcher-collection@^1.0.5, matcher-collection@^1.1.1: dependencies: minimatch "^3.0.2" -matcher-collection@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-2.0.0.tgz#470ae263c793e897b3f1e72c695016b7aea355c4" - integrity sha512-wSi4BgQGTFfBN5J+pIaS78rEKk4qIkjrw+NfJYdHsd2cRVIQsbDi3BZtNAXTFA2WHvlbS9kLGtTjv3cPJKuRSw== - dependencies: - "@types/minimatch" "^3.0.3" - minimatch "^3.0.2" - matcher@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" @@ -8336,11 +9016,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdn-data@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.2.0.tgz#eadd28b0f2d307cf27e71524609bfb749ebfc0b6" - integrity sha512-esDqNvsJB2q5V28+u7NdtdMg6Rmg4khQmAVSjUiX7BY/7haIv0K2yWM43hYp0or+3nvG7+UaTF1JHz31hgU1TA== - mdn-data@~1.1.0: version "1.1.4" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" @@ -8378,7 +9053,7 @@ memory-streams@^0.1.3: dependencies: readable-stream "~1.0.2" -meow@^3.4.0, meow@^3.7.0: +meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -8424,7 +9099,7 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5" integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA== -merge@^1.2.0: +merge@^1.2.0, merge@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== @@ -8461,6 +9136,11 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.40.0: + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + "mime-db@>= 1.38.0 < 2", mime-db@~1.38.0: version "1.38.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" @@ -8473,16 +9153,33 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.18, mime-types@~2.1.19: dependencies: mime-db "~1.38.0" +mime-types@^2.1.19, mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -8493,7 +9190,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -8515,7 +9212,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.4: +minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -8523,7 +9220,7 @@ minipass@^2.2.0, minipass@^2.2.1, minipass@^2.3.4: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.1: +minizlib@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== @@ -8547,9 +9244,9 @@ mississippi@^3.0.0: through2 "^2.0.0" mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -8583,7 +9280,7 @@ moment-timezone@^0.5.13: resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== -morgan@^1.9.0: +morgan@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== @@ -8616,21 +9313,21 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mustache@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.0.1.tgz#873855f23aa8a95b150fb96d9836edbc5a1d248a" integrity sha512-jFI/4UVRsRYdUbuDTKT7KzfOp7FiD5WzYmmwNwXyUVypC0xjoTL78Fqc0jHUPIvvGD+6DQSPHIt1NE7D1ArsqA== -mute-stream@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" - integrity sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s= - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -8645,11 +9342,16 @@ najax@^1.0.3: lodash.defaultsdeep "^4.6.0" qs "^6.2.0" -nan@^2.10.0, nan@^2.9.2: +nan@^2.10.0: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8673,11 +9375,11 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= needle@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== dependencies: - debug "^2.1.2" + debug "^3.2.6" iconv-lite "^0.4.4" sax "^1.2.4" @@ -8686,7 +9388,17 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= -neo-async@^2.5.0, neo-async@^2.6.0: +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +neo-async@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== @@ -8696,21 +9408,21 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^1.4.5: - version "1.4.10" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.4.10.tgz#ae46a09a26436fae91a38a60919356ae6db143b6" - integrity sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA== +nise@^1.4.10: + version "1.5.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.0.tgz#d03ea0e6c1b75c638015aa3585eddc132949a50d" + integrity sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww== dependencies: "@sinonjs/formatio" "^3.1.0" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" - lolex "^2.3.2" + lolex "^4.1.0" path-to-regexp "^1.7.0" -node-fetch@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" - integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== +node-fetch@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== node-gyp@^3.8.0: version "3.8.0" @@ -8736,9 +9448,9 @@ node-int64@^0.4.0: integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -8750,7 +9462,7 @@ node-libs-browser@^2.0.0: events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -8762,7 +9474,7 @@ node-libs-browser@^2.0.0: tty-browserify "0.0.0" url "^0.11.0" util "^0.11.0" - vm-browserify "0.0.4" + vm-browserify "^1.0.1" node-modules-path@^1.0.0, node-modules-path@^1.0.1: version "1.0.2" @@ -8780,10 +9492,10 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -8796,10 +9508,10 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.12.tgz#1d6baf544316b5422fcd35efe18708370a4e7637" - integrity sha512-Y+AQ1xdjcgaEzpL65PBEF3fnl1FNKnDh9Zm+AUQLIlyyqtSc4u93jyMN4zrjMzdwKQ10RTr3tgY1x7qpsfF/xg== +node-releases@^1.1.25: + version "1.1.25" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.25.tgz#0c2d7dbc7fed30fbe02a9ee3007b8c90bf0133d3" + integrity sha512-fI5BXuk83lKEoZDdH3gRhtsNgh05/wZacuXkgbiYkceE7+QIMXOg98n9ZV7mz27B+kFHnqHcUpscZZlGRSmTpQ== dependencies: semver "^5.3.0" @@ -8828,6 +9540,11 @@ node-sass@^4.7.2: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +node-watch@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.0.tgz#ab0703b60cd270783698e57a428faa0010ed8fd0" + integrity sha512-XAgTL05z75ptd7JSVejH1a2Dm1zmXYhuDr9l230Qk6Z7/7GPcnAs/UyJJ4ggsXSvWil8iOzwQLW0zuGUvHpG8g== + "nopt@2 || 3", nopt@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -8865,6 +9582,15 @@ normalize-path@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== + dependencies: + prepend-http "^2.0.0" + query-string "^5.0.1" + sort-keys "^2.0.0" + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -8886,9 +9612,9 @@ npm-package-arg@^6.1.0: validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + version "1.4.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.4.tgz#866224233850ac534b63d1a6e76050092b5d2f44" + integrity sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -8926,7 +9652,7 @@ npm-which@^3.0.1: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@^1.0.1: +nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== @@ -8948,7 +9674,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -8977,10 +9703,10 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-keys@^1.0.12: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" - integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== +object-keys@^1.0.11, object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object-visit@^1.0.0: version "1.0.1" @@ -8989,6 +9715,16 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -9004,7 +9740,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.0.4: +object.values@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.0.tgz#bf6810ef5da3e5325790eaaa2be213ea84624da9" integrity sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg== @@ -9033,11 +9769,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= - onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -9065,16 +9796,16 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ora@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b" - integrity sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA== +ora@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318" + integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg== dependencies: - chalk "^2.3.1" + chalk "^2.4.2" cli-cursor "^2.1.0" - cli-spinners "^1.1.0" + cli-spinners "^2.0.0" log-symbols "^2.2.0" - strip-ansi "^4.0.0" + strip-ansi "^5.2.0" wcwidth "^1.0.1" os-browserify@^0.3.0: @@ -9082,7 +9813,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -9103,11 +9834,6 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" - integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= - os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -9121,11 +9847,26 @@ osenv@0, osenv@^0.1.3, osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-cancelable@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== + +p-defer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-2.1.0.tgz#d9c97b40f8fb5c256a70b4aabec3c1c8c42f1fae" + integrity sha512-xMwL9id1bHn/UfNGFEMFwlULOprQUEOg6vhqSfr6oKxPFB0oSh0zhGq/9/tPSE+cyij2+RW6H8+0Ke4xsPdZ7Q== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -9164,6 +9905,13 @@ p-map@^2.0.0: resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -9256,22 +10004,20 @@ parseurl@~1.3.2: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -passwd-user@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/passwd-user/-/passwd-user-1.2.1.tgz#a01a5dc639ef007dc56364b8178569080ad3a7b8" - integrity sha1-oBpdxjnvAH3FY2S4F4VpCArTp7g= - dependencies: - exec-file-sync "^2.0.0" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" @@ -9290,7 +10036,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -9305,7 +10051,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5, path-parse@^1.0.6: +path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -9424,10 +10170,10 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== -portfinder@^1.0.15: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== +portfinder@^1.0.20: + version "1.0.24" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.24.tgz#11efbc6865f12f37624b6531ead1d809ed965cfa" + integrity sha512-ekRl7zD2qxYndYflwiryJwMioBI7LI7rVXg3EnLK3sjkouT5eOuhS3gS255XxBksa30VG8UPZYZCdgfGOfkSUg== dependencies: async "^1.5.2" debug "^2.2.0" @@ -9443,6 +10189,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + pretender@3.0.2, pretender@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.0.2.tgz#1e9123914c4e4bd1b553ca78a401120d300d265f" @@ -9453,9 +10204,9 @@ pretender@3.0.2, pretender@^3.0.1: whatwg-fetch "^3.0.0" prettier@^1.4.4: - version "1.16.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" - integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== + version "1.18.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" + integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== pretty-ms@^3.1.0: version "3.2.0" @@ -9475,9 +10226,9 @@ private@^0.1.6, private@^0.1.8, private@~0.1.5: integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== process-relative-require@^1.0.0: version "1.0.0" @@ -9508,6 +10259,15 @@ promise-map-series@^0.2.1, promise-map-series@^0.2.3: dependencies: rsvp "^3.0.14" +promise.prototype.finally@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e" + integrity sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ== + dependencies: + define-properties "^1.1.2" + es-abstract "^1.9.0" + function-bind "^1.1.1" + property-expr@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-1.5.1.tgz#22e8706894a0c8e28d58735804f6ba3a3673314f" @@ -9521,6 +10281,14 @@ proxy-addr@~2.0.4: forwarded "~0.1.2" ipaddr.js "1.8.0" +proxy-addr@~2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34" + integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.0" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -9603,12 +10371,12 @@ qs@6.5.2, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -qs@^6.2.0, qs@^6.4.0: +qs@6.7.0, qs@^6.2.0, qs@^6.4.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -query-string@^5.0.0: +query-string@^5.0.0, query-string@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== @@ -9644,18 +10412,16 @@ qunit-dom@^0.9.0: broccoli-funnel "^2.0.2" broccoli-merge-trees "^3.0.1" -qunit@~2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.6.2.tgz#551210c5cf857258a4fe39a7fe15d9e14dfef22c" - integrity sha512-PHbKulmd4rrDhFto7iHicIstDTX7oMRvAcI7loHstvU8J7AOGwzcchONmy+EG4KU8HDk0K90o7vO0GhlYyKlOg== +qunit@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.9.2.tgz#97919440c9c0ae838bcd3c33a2ee42f35c5ef4a0" + integrity sha512-wTOYHnioWHcx5wa85Wl15IE7D6zTZe2CQlsodS14yj7s2FZ3MviRnQluspBZsueIDEO7doiuzKlv05yfky1R7w== dependencies: commander "2.12.2" - exists-stat "1.0.0" - findup-sync "2.0.0" js-reporters "1.2.1" - resolve "1.5.0" - sane "^2.5.2" - walk-sync "0.3.2" + minimatch "3.0.4" + node-watch "0.6.0" + resolve "1.9.0" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" @@ -9677,6 +10443,11 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + raw-body@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" @@ -9687,6 +10458,16 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + raw-body@~1.1.0: version "1.1.7" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425" @@ -9744,6 +10525,15 @@ read-pkg@^4.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" +"readable-stream@2 || 3": + version "3.4.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" + integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.2: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -9799,9 +10589,9 @@ redeyed@~1.0.0: esprima "~3.0.0" regenerate-unicode-properties@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz#7b38faa296252376d363558cfbda90c9ce709662" - integrity sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ== + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== dependencies: regenerate "^1.4.0" @@ -9844,10 +10634,10 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" -regenerator-transform@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" - integrity sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A== +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== dependencies: private "^0.1.6" @@ -9859,10 +10649,10 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp-tree@^0.1.0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.5.tgz#7cd71fca17198d04b4176efd79713f2998009397" - integrity sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ== +regexp-tree@^0.1.6: + version "0.1.11" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3" + integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg== regexpp@^2.0.1: version "2.0.1" @@ -9878,7 +10668,7 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" -regexpu-core@^4.1.3, regexpu-core@^4.5.4: +regexpu-core@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== @@ -10021,15 +10811,7 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-package-path@^1.0.11, resolve-package-path@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.6.tgz#48f5d69a5b3a0ea68f7b9c7398459dd4125807c7" - integrity sha512-He6cGWU74tJ6wLYSKrbvWOfIXf2tUu5RcBWqX/2K9Ju00CncF5WRdCOJQisqCtaULcqIqpLvMtz8ZjfpwlBwqg== - dependencies: - path-root "^0.1.1" - resolve "^1.10.0" - -resolve-package-path@^1.2.2: +resolve-package-path@^1.0.11, resolve-package-path@^1.2.2, resolve-package-path@^1.2.6, resolve-package-path@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-1.2.7.tgz#2a7bc37ad96865e239330e3102c31322847e652e" integrity sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q== @@ -10037,32 +10819,53 @@ resolve-package-path@^1.2.2: path-root "^0.1.1" resolve "^1.10.0" +resolve-path@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" + integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc= + dependencies: + http-errors "~1.6.2" + path-is-absolute "1.0.1" + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== +resolve@1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06" + integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" -resolve@^1.1.3, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.7.1, resolve@^1.8.1: +resolve@^1.1.3, resolve@^1.5.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.7.1, resolve@^1.8.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" + integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" + path-parse "^1.0.6" + +resolve@^1.10.1: + version "1.12.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6" + integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w== + dependencies: + path-parse "^1.0.6" + +responselike@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" @@ -10077,18 +10880,13 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" - integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -10098,12 +10896,18 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" rollup-pluginutils@^2.0.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.5.0.tgz#23be0f05ac3972ea7b08fc7870cb91fde5b23a09" - integrity sha512-9Muh1H+XB5f5ONmKMayUoTYR1EZwHbwJJ9oZLrKT5yuTf/RLIQ5mYIGsrERquVucJmjmaAW0Y7+6Qo1Ep+5w3Q== + version "2.8.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz#8fa6dd0697344938ef26c2c09d2488ce9e33ce97" + integrity sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg== dependencies: - estree-walker "^0.6.0" - micromatch "^3.1.10" + estree-walker "^0.6.1" + +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" rollup@^0.57.1: version "0.57.1" @@ -10122,21 +10926,35 @@ rollup@^0.57.1: signal-exit "^3.0.2" sourcemap-codec "^1.4.1" +rollup@^1.12.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.22.0.tgz#a5b2672c0eebe9f2b6454220f785dbc09b64b4bc" + integrity sha512-x4l4ZrV/Mr/x/jvFTmwROdEAhbZjx16yDRTVSKWh/i4oJDuW2dVEbECT853mybYCz7BAitU8ElGlhx7dNjw3qQ== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + route-recognizer@^0.3.3: version "0.3.4" resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3" integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g== -rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0, rsvp@^3.3.3: +rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4: +rsvp@^4.6.1, rsvp@^4.8.3: version "4.8.4" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== +rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.4, rsvp@^4.8.5: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + rsvp@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.2.1.tgz#07cb4a5df25add9e826ebc67dcc9fd89db27d84a" @@ -10173,11 +10991,6 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= -rx@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= - rxjs@^6.3.3, rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" @@ -10185,11 +10998,16 @@ rxjs@^6.3.3, rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" + integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" @@ -10207,38 +11025,20 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^2.4.1, sane@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.2.tgz#b4dc1861c21b427e929507a3e751e2a2cb8ab3fa" - integrity sha1-tNwYYcIbQn6SlQej51HiosuKs/o= +sane@^4.0.0, sane@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== dependencies: + "@cnakazawa/watch" "^1.0.3" anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sane@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" - integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" execa "^1.0.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" sass-graph@^2.2.4: version "2.2.4" @@ -10309,6 +11109,16 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +semver@^6.0.0, semver@^6.1.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" + integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== + +semver@^6.1.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -10333,10 +11143,29 @@ send@0.16.2: range-parser "~1.2.0" statuses "~1.4.0" -serialize-javascript@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" - integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-javascript@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" + integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== serve-static@1.13.2: version "1.13.2" @@ -10348,25 +11177,25 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -10383,6 +11212,11 @@ setprototypeof@1.1.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -10420,7 +11254,7 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0: +silent-error@^1.0.0, silent-error@^1.0.1, silent-error@^1.1.0, silent-error@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" integrity sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw== @@ -10439,20 +11273,18 @@ simple-html-tokenizer@^0.5.6: resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.7.tgz#8eca336ecfbe2b3c6166cbb31b2682088de79f40" integrity sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg== -sinon@^6.0.1: - version "6.3.5" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-6.3.5.tgz#0f6d6a5b4ebaad1f6e8e019395542d1d02c144a0" - integrity sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ== +sinon@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28" + integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA== dependencies: - "@sinonjs/commons" "^1.0.2" - "@sinonjs/formatio" "^3.0.0" - "@sinonjs/samsam" "^2.1.2" + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.1" diff "^3.5.0" - lodash.get "^4.4.2" - lolex "^2.7.5" - nise "^1.4.5" + lolex "^4.0.1" + nise "^1.4.10" supports-color "^5.5.0" - type-detect "^4.0.8" slash@^1.0.0: version "1.0.0" @@ -10554,12 +11386,19 @@ socket.io@^2.1.0: socket.io-client "2.2.0" socket.io-parser "~3.3.0" +sort-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" + integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + dependencies: + is-plain-obj "^1.0.0" + sort-object-keys@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.2.tgz#d3a6c48dc2ac97e6bc94367696e03f6d09d37952" integrity sha1-06bEjcKsl+a8lDZ2luA/bQnTeVI= -sort-package-json@^1.15.0: +sort-package-json@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.22.1.tgz#384ce7a098cd13be4109800d5ce2f0cf7826052e" integrity sha512-uVINQraFQvnlzNHFnQOT4MYy0qonIEzKwhrI2yrTiQjNo5QF4h3ffrnCk7a95QAwoK/RdkO/w8W9tJIcaOWC7g== @@ -10590,10 +11429,10 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@~0.5.10: - version "0.5.11" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2" - integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ== +source-map-support@~0.5.10, source-map-support@~0.5.12: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -10633,9 +11472,9 @@ source-map@~0.1.x: amdefine ">=0.0.4" sourcemap-codec@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" - integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== + version "1.4.6" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz#e30a74f0402bad09807640d39e971090a08ce1e9" + integrity sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg== sourcemap-validator@^1.1.0: version "1.1.0" @@ -10652,14 +11491,6 @@ spawn-args@^0.2.0: resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" integrity sha1-+30L0dcP1DFr2ePew4nmX51jYbs= -spawn-sync@^1.0.11, spawn-sync@^1.0.15: - version "1.0.15" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" - integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= - dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" - spdx-correct@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" @@ -10730,7 +11561,7 @@ ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -stable@~0.1.6: +stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== @@ -10740,6 +11571,13 @@ staged-git-files@1.1.2: resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== +stagehand@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stagehand/-/stagehand-1.0.0.tgz#79515e2ad3a02c63f8720c7df9b6077ae14276d9" + integrity sha512-zrXl0QixAtSHFyN1iv04xOBgplbT4HgC8T7g+q8ESZbDNi5uZbMtxLukFVXPJ5Nl7zCYvYcrT3Mj24WYCH93hw== + dependencies: + debug "^4.1.0" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -10748,7 +11586,7 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.4.0 < 2": +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= @@ -10848,7 +11686,7 @@ string_decoder@0.10, string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -string_decoder@^1.0.0: +string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== @@ -10885,7 +11723,7 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -10945,23 +11783,23 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -svgo@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a" - integrity sha512-nYrifviB77aNKDNKKyuay3M9aYiK6Hv5gJVDdjj2ZXTQmI8WZc8+UPLR5IpVlktJfSu3co/4XcWgrgI6seGBPg== +svgo@~1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316" + integrity sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA== dependencies: - coa "~2.0.1" - colors "~1.1.2" - css-select "~1.3.0-rc0" - css-select-base-adapter "~0.1.0" - css-tree "1.0.0-alpha25" + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.28" css-url-regex "^1.1.0" - csso "^3.5.0" - js-yaml "~3.10.0" + csso "^3.5.1" + js-yaml "^3.13.1" mkdirp "~0.5.1" - object.values "^1.0.4" + object.values "^1.1.0" sax "~1.2.4" - stable "~0.1.6" + stable "^0.1.8" unquote "~1.1.1" util.promisify "~1.0.0" @@ -11016,9 +11854,9 @@ tap-parser@^7.0.0: minipass "^2.2.0" tapable@^1.0.0, tapable@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" - integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^2.0.0: version "2.2.1" @@ -11030,41 +11868,42 @@ tar@^2.0.0: inherits "2" tar@^4: - version "4.4.8" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" - integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== dependencies: chownr "^1.1.1" fs-minipass "^1.2.5" - minipass "^2.3.4" - minizlib "^1.1.1" + minipass "^2.3.5" + minizlib "^1.2.1" mkdirp "^0.5.0" safe-buffer "^5.1.2" - yallist "^3.0.2" + yallist "^3.0.3" -temp@0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" - integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= +temp@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.0.tgz#61391795a11bd9738d4c4d7f55f012cb8f55edaa" + integrity sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ== dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + rimraf "~2.6.2" terser-webpack-plugin@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" - integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4" + integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg== dependencies: - cacache "^11.0.2" + cacache "^11.3.2" find-cache-dir "^2.0.0" + is-wsl "^1.1.0" + loader-utils "^1.2.3" schema-utils "^1.0.0" - serialize-javascript "^1.4.0" + serialize-javascript "^1.7.0" source-map "^0.6.1" - terser "^3.16.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" + terser "^4.0.0" + webpack-sources "^1.3.0" + worker-farm "^1.7.0" -terser@^3.16.1, terser@^3.7.5: +terser@^3.7.5: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== @@ -11073,15 +11912,25 @@ terser@^3.16.1, terser@^3.7.5: source-map "~0.6.1" source-map-support "~0.5.10" -testem@^2.9.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/testem/-/testem-2.14.0.tgz#418a9a15843f68381659c6a486abb4ea48d06c29" - integrity sha512-tldpNPCzXfibmxOoTMGOfr8ztUiHf9292zSXCu7SitBx9dCK83k7vEoa77qJBS9t3RGCQCRF+GNMUuiFw//Mbw== +terser@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.2.tgz#b2656c8a506f7ce805a3f300a2ff48db022fa391" + integrity sha512-jvNoEQSPXJdssFwqPSgWjsOrb+ELoE+ILpHPKXC83tIxOlh2U75F1KuB2luLD/3a6/7K3Vw5pDn+hvu0C4AzSw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +testem@^2.14.0: + version "2.17.0" + resolved "https://registry.yarnpkg.com/testem/-/testem-2.17.0.tgz#1cb4a2a90524a088803dfe52fbf197a6fd73c883" + integrity sha512-PLkIlT523w5rTJPWwR4TL1EiAEa941ECV7d4pMqsB0YdnH+sCTz0loWMKCUSdhR+VijveAZ6anE/JHehE7KqMQ== dependencies: backbone "^1.1.2" bluebird "^3.4.6" charm "^1.0.0" commander "^2.6.0" + compression "^1.7.4" consolidate "^0.15.1" execa "^1.0.0" express "^4.10.7" @@ -11125,7 +11974,14 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8: +through2@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" + integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + dependencies: + readable-stream "2 || 3" + +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11135,6 +11991,11 @@ time-zone@^1.0.0: resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" @@ -11173,13 +12034,6 @@ tmp@0.0.33, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.0.29: - version "0.0.29" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" - integrity sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA= - dependencies: - os-tmpdir "~1.0.1" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" @@ -11230,6 +12084,11 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + toposort@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" @@ -11258,7 +12117,7 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -tree-sync@^1.2.2: +tree-sync@^1.2.2, tree-sync@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/tree-sync/-/tree-sync-1.4.0.tgz#314598d13abaf752547d9335b8f95d9a137100d6" integrity sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ== @@ -11287,9 +12146,9 @@ trim-right@^1.0.1: glob "^7.1.2" tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== tty-browserify@0.0.0: version "0.0.0" @@ -11315,7 +12174,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@4.0.8, type-detect@^4.0.8: +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -11328,6 +12187,14 @@ type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -11346,14 +12213,14 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.5.3" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.5.3.tgz#d490bb5347f23025f0c1bc0dee901d98e4d6b063" - integrity sha512-rIQPT2UMDnk4jRX+w4WO84/pebU2jiLsjgIyrCktYgSvx28enOE3iYQMr+BD1rHiitWnDmpu0cY/LfIEpKcjcw== + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== dependencies: - commander "~2.19.0" + commander "~2.20.0" source-map "~0.6.1" -underscore.string@~3.3.4: +underscore.string@^3.2.2, underscore.string@~3.3.4: version "3.3.5" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023" integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg== @@ -11390,14 +12257,14 @@ unicode-property-aliases-ecmascript@^1.0.4: integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" - set-value "^0.4.3" + set-value "^2.0.1" unique-filename@^1.1.1: version "1.1.1" @@ -11407,9 +12274,9 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== dependencies: imurmurhash "^0.1.4" @@ -11467,6 +12334,18 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-to-options@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" + integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -11480,28 +12359,12 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/user-info/-/user-info-1.0.0.tgz#81c82b7ed63e674c2475667653413b3c76fde239" - integrity sha1-gcgrftY+Z0wkdWZ2U0E7PHb94jk= - dependencies: - os-homedir "^1.0.1" - passwd-user "^1.2.1" - username "^1.0.1" - username-sync@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.2.tgz#0a3697909fb7b5768d29e2921f573acfdd427592" integrity sha512-ayNkOJdoNSGNDBE46Nkc+l6IXmeugbzahZLSMkwvgRWv5y5ZqNY2IrzcgmkR4z32sj1W3tM3TuTUMqkqBzO+RA== -username@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/username/-/username-1.0.1.tgz#e1f72295e3e58e06f002c6327ce06897a99cd67f" - integrity sha1-4fcilePljgbwAsYyfOBol6mc1n8= - dependencies: - meow "^3.4.0" - -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -11567,12 +12430,10 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" + integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== w3c-hr-time@^1.0.1: version "1.0.1" @@ -11581,14 +12442,6 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" -walk-sync@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.3.2.tgz#4827280afc42d0e035367c4a4e31eeac0d136f75" - integrity sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ== - dependencies: - ensure-posix-path "^1.0.0" - matcher-collection "^1.0.0" - walk-sync@^0.2.5: version "0.2.7" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-0.2.7.tgz#b49be4ee6867657aeb736978b56a29d10fa39969" @@ -11605,16 +12458,7 @@ walk-sync@^0.3.0, walk-sync@^0.3.1, walk-sync@^0.3.2, walk-sync@^0.3.3: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walk-sync@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.3.tgz#3b7b6468f068b5eba2278c931c57db3d39092969" - integrity sha512-23ivbET0Q/389y3EHpiIgxx881AS2mwdXA7iBqUDNSymoTPYb2jWlF3gkuuAP1iLgdNXmiHw/kZ/wZwrELU6Ag== - dependencies: - "@types/minimatch" "^3.0.3" - ensure-posix-path "^1.1.0" - matcher-collection "^1.1.1" - -walk-sync@^1.1.3: +walk-sync@^1.0.0, walk-sync@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-1.1.4.tgz#81049f3d8095479b49574cfa5f558d7a252b127d" integrity sha512-nowc9thB/Jg0KW4TgxoRjLLYRPvl3DB/98S89r4ZcJqq2B0alNcKDh6pzLkBSkPMzRSMsJghJHQi79qw0YWEkA== @@ -11641,14 +12485,6 @@ watch-detector@^0.1.0: semver "^5.4.1" silent-error "^1.1.0" -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" @@ -11670,7 +12506,7 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-sources@^1.1.0, webpack-sources@^1.3.0: +webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -11781,10 +12617,10 @@ wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== dependencies: errno "~0.1.7" @@ -11880,7 +12716,12 @@ xmlhttprequest-ssl@~1.5.4: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= -xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -11900,15 +12741,15 @@ yallist@^2.1.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.0, yallist@^3.0.2: +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yam@^0.0.24: - version "0.0.24" - resolved "https://registry.yarnpkg.com/yam/-/yam-0.0.24.tgz#11e9630444735f66a561d29221407de6d037cd95" - integrity sha512-llPF60oFLV8EQimNPR6+KorSaj59L32C4c1db4cr72GaWVWapnhTS2VZeK2K2xLyEOveWtRcNa+dLJBW7EfhYQ== +yam@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yam/-/yam-1.0.0.tgz#7f6c91dc0f5de75a031e6da6b3907c3d25ab0de5" + integrity sha512-Hv9xxHtsJ9228wNhk03xnlDReUuWVvHwM4rIbjdAXYvHLs17xjuyF50N6XXFMN6N0omBaqgOok/MCK3At9fTAg== dependencies: fs-extra "^4.0.2" lodash.merge "^4.6.0" diff --git a/vendor/github.com/hashicorp/go-plugin/client.go b/vendor/github.com/hashicorp/go-plugin/client.go index 42de0fc50..a6def2a70 100644 --- a/vendor/github.com/hashicorp/go-plugin/client.go +++ b/vendor/github.com/hashicorp/go-plugin/client.go @@ -21,7 +21,6 @@ import ( "sync" "sync/atomic" "time" - "unicode" hclog "github.com/hashicorp/go-hclog" ) @@ -88,6 +87,10 @@ type Client struct { // goroutines. clientWaitGroup sync.WaitGroup + // stderrWaitGroup is used to prevent the command's Wait() function from + // being called before we've finished reading from the stderr pipe. + stderrWaitGroup sync.WaitGroup + // processKilled is used for testing only, to flag when the process was // forcefully killed. processKilled bool @@ -591,6 +594,12 @@ func (c *Client) Start() (addr net.Addr, err error) { // Create a context for when we kill c.doneCtx, c.ctxCancel = context.WithCancel(context.Background()) + // Start goroutine that logs the stderr + c.clientWaitGroup.Add(1) + c.stderrWaitGroup.Add(1) + // logStderr calls Done() + go c.logStderr(cmdStderr) + c.clientWaitGroup.Add(1) go func() { // ensure the context is cancelled when we're done @@ -603,6 +612,10 @@ func (c *Client) Start() (addr net.Addr, err error) { pid := c.process.Pid path := cmd.Path + // wait to finish reading from stderr since the stderr pipe reader + // will be closed by the subsequent call to cmd.Wait(). + c.stderrWaitGroup.Wait() + // Wait for the command to end. err := cmd.Wait() @@ -625,11 +638,6 @@ func (c *Client) Start() (addr net.Addr, err error) { c.exited = true }() - // Start goroutine that logs the stderr - c.clientWaitGroup.Add(1) - // logStderr calls Done() - go c.logStderr(cmdStderr) - // Start a goroutine that is going to be reading the lines // out of stdout linesCh := make(chan string) @@ -780,7 +788,10 @@ func (c *Client) reattach() (net.Addr, error) { // Verify the process still exists. If not, then it is an error p, err := os.FindProcess(c.config.Reattach.Pid) if err != nil { - return nil, err + // On Unix systems, FindProcess never returns an error. + // On Windows, for non-existent pids it returns: + // os.SyscallError - 'OpenProcess: the paremter is incorrect' + return nil, ErrProcessNotFound } // Attempt to connect to the addr since on Unix systems FindProcess @@ -933,21 +944,64 @@ func (c *Client) dialer(_ string, timeout time.Duration) (net.Conn, error) { return conn, nil } +var stdErrBufferSize = 64 * 1024 + func (c *Client) logStderr(r io.Reader) { defer c.clientWaitGroup.Done() - - scanner := bufio.NewScanner(r) + defer c.stderrWaitGroup.Done() l := c.logger.Named(filepath.Base(c.config.Cmd.Path)) - for scanner.Scan() { - line := scanner.Text() - c.config.Stderr.Write([]byte(line + "\n")) - line = strings.TrimRightFunc(line, unicode.IsSpace) + reader := bufio.NewReaderSize(r, stdErrBufferSize) + // continuation indicates the previous line was a prefix + continuation := false + + for { + line, isPrefix, err := reader.ReadLine() + switch { + case err == io.EOF: + return + case err != nil: + l.Error("reading plugin stderr", "error", err) + return + } + + c.config.Stderr.Write(line) + + // The line was longer than our max token size, so it's likely + // incomplete and won't unmarshal. + if isPrefix || continuation { + l.Debug(string(line)) + + // if we're finishing a continued line, add the newline back in + if !isPrefix { + c.config.Stderr.Write([]byte{'\n'}) + } + + continuation = isPrefix + continue + } + + c.config.Stderr.Write([]byte{'\n'}) entry, err := parseJSON(line) // If output is not JSON format, print directly to Debug if err != nil { - l.Debug(line) + // Attempt to infer the desired log level from the commonly used + // string prefixes + switch line := string(line); { + case strings.HasPrefix(line, "[TRACE]"): + l.Trace(line) + case strings.HasPrefix(line, "[DEBUG]"): + l.Debug(line) + case strings.HasPrefix(line, "[INFO]"): + l.Info(line) + case strings.HasPrefix(line, "[WARN]"): + l.Warn(line) + case strings.HasPrefix(line, "[ERROR]"): + l.Error(line) + default: + l.Debug(line) + } } else { out := flattenKVPairs(entry.KVPairs) @@ -963,11 +1017,12 @@ func (c *Client) logStderr(r io.Reader) { l.Warn(entry.Message, out...) case hclog.Error: l.Error(entry.Message, out...) + default: + // if there was no log level, it's likely this is unexpected + // json from something other than hclog, and we should output + // it verbatim. + l.Debug(string(line)) } } } - - if err := scanner.Err(); err != nil { - l.Error("reading plugin stderr", "error", err) - } } diff --git a/vendor/github.com/hashicorp/go-plugin/go.mod b/vendor/github.com/hashicorp/go-plugin/go.mod index 20112852c..f3ddf44e4 100644 --- a/vendor/github.com/hashicorp/go-plugin/go.mod +++ b/vendor/github.com/hashicorp/go-plugin/go.mod @@ -1,12 +1,16 @@ module github.com/hashicorp/go-plugin require ( + github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/protobuf v1.2.0 github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 github.com/oklog/run v1.0.0 + github.com/stretchr/testify v1.3.0 // indirect golang.org/x/net v0.0.0-20180826012351-8a410e7b638d + golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect + golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc // indirect golang.org/x/text v0.3.0 // indirect google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 // indirect google.golang.org/grpc v1.14.0 diff --git a/vendor/github.com/hashicorp/go-plugin/go.sum b/vendor/github.com/hashicorp/go-plugin/go.sum index 9ae0bec8e..21b14e998 100644 --- a/vendor/github.com/hashicorp/go-plugin/go.sum +++ b/vendor/github.com/hashicorp/go-plugin/go.sum @@ -1,3 +1,7 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd h1:rNuUHR+CvK1IS89MMtcF0EpcVMZtjKfPRp4MEmt/aTs= @@ -8,8 +12,17 @@ github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 h1: github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d h1:g9qWBGx4puODJTMVyoPrpoxPFgVGd+z1DZwjfRu4d0I= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc h1:WiYx1rIFmx8c0mXAFtv5D/mHyKe1+jmuP7PViuwqwuQ= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= diff --git a/vendor/github.com/hashicorp/go-plugin/grpc_broker.go b/vendor/github.com/hashicorp/go-plugin/grpc_broker.go index 1a13780bc..daf142d17 100644 --- a/vendor/github.com/hashicorp/go-plugin/grpc_broker.go +++ b/vendor/github.com/hashicorp/go-plugin/grpc_broker.go @@ -11,7 +11,7 @@ import ( "sync/atomic" "time" - "github.com/hashicorp/go-plugin/internal/proto" + "github.com/hashicorp/go-plugin/internal/plugin" "github.com/oklog/run" "google.golang.org/grpc" @@ -21,14 +21,14 @@ import ( // streamer interface is used in the broker to send/receive connection // information. type streamer interface { - Send(*proto.ConnInfo) error - Recv() (*proto.ConnInfo, error) + Send(*plugin.ConnInfo) error + Recv() (*plugin.ConnInfo, error) Close() } // sendErr is used to pass errors back during a send. type sendErr struct { - i *proto.ConnInfo + i *plugin.ConnInfo ch chan error } @@ -40,7 +40,7 @@ type gRPCBrokerServer struct { send chan *sendErr // recv is used to receive connection info from the gRPC stream. - recv chan *proto.ConnInfo + recv chan *plugin.ConnInfo // quit closes down the stream. quit chan struct{} @@ -52,7 +52,7 @@ type gRPCBrokerServer struct { func newGRPCBrokerServer() *gRPCBrokerServer { return &gRPCBrokerServer{ send: make(chan *sendErr), - recv: make(chan *proto.ConnInfo), + recv: make(chan *plugin.ConnInfo), quit: make(chan struct{}), } } @@ -60,7 +60,7 @@ func newGRPCBrokerServer() *gRPCBrokerServer { // StartStream implements the GRPCBrokerServer interface and will block until // the quit channel is closed or the context reports Done. The stream will pass // connection information to/from the client. -func (s *gRPCBrokerServer) StartStream(stream proto.GRPCBroker_StartStreamServer) error { +func (s *gRPCBrokerServer) StartStream(stream plugin.GRPCBroker_StartStreamServer) error { doneCh := stream.Context().Done() defer s.Close() @@ -99,7 +99,7 @@ func (s *gRPCBrokerServer) StartStream(stream proto.GRPCBroker_StartStreamServer // Send is used by the GRPCBroker to pass connection information into the stream // to the client. -func (s *gRPCBrokerServer) Send(i *proto.ConnInfo) error { +func (s *gRPCBrokerServer) Send(i *plugin.ConnInfo) error { ch := make(chan error) defer close(ch) @@ -117,7 +117,7 @@ func (s *gRPCBrokerServer) Send(i *proto.ConnInfo) error { // Recv is used by the GRPCBroker to pass connection information that has been // sent from the client from the stream to the broker. -func (s *gRPCBrokerServer) Recv() (*proto.ConnInfo, error) { +func (s *gRPCBrokerServer) Recv() (*plugin.ConnInfo, error) { select { case <-s.quit: return nil, errors.New("broker closed") @@ -138,13 +138,13 @@ func (s *gRPCBrokerServer) Close() { // streamer interfaces. type gRPCBrokerClientImpl struct { // client is the underlying GRPC client used to make calls to the server. - client proto.GRPCBrokerClient + client plugin.GRPCBrokerClient // send is used to send connection info to the gRPC stream. send chan *sendErr // recv is used to receive connection info from the gRPC stream. - recv chan *proto.ConnInfo + recv chan *plugin.ConnInfo // quit closes down the stream. quit chan struct{} @@ -155,9 +155,9 @@ type gRPCBrokerClientImpl struct { func newGRPCBrokerClient(conn *grpc.ClientConn) *gRPCBrokerClientImpl { return &gRPCBrokerClientImpl{ - client: proto.NewGRPCBrokerClient(conn), + client: plugin.NewGRPCBrokerClient(conn), send: make(chan *sendErr), - recv: make(chan *proto.ConnInfo), + recv: make(chan *plugin.ConnInfo), quit: make(chan struct{}), } } @@ -209,7 +209,7 @@ func (s *gRPCBrokerClientImpl) StartStream() error { // Send is used by the GRPCBroker to pass connection information into the stream // to the plugin. -func (s *gRPCBrokerClientImpl) Send(i *proto.ConnInfo) error { +func (s *gRPCBrokerClientImpl) Send(i *plugin.ConnInfo) error { ch := make(chan error) defer close(ch) @@ -227,7 +227,7 @@ func (s *gRPCBrokerClientImpl) Send(i *proto.ConnInfo) error { // Recv is used by the GRPCBroker to pass connection information that has been // sent from the plugin to the broker. -func (s *gRPCBrokerClientImpl) Recv() (*proto.ConnInfo, error) { +func (s *gRPCBrokerClientImpl) Recv() (*plugin.ConnInfo, error) { select { case <-s.quit: return nil, errors.New("broker closed") @@ -268,7 +268,7 @@ type GRPCBroker struct { } type gRPCBrokerPending struct { - ch chan *proto.ConnInfo + ch chan *plugin.ConnInfo doneCh chan struct{} } @@ -290,7 +290,7 @@ func (b *GRPCBroker) Accept(id uint32) (net.Listener, error) { return nil, err } - err = b.streamer.Send(&proto.ConnInfo{ + err = b.streamer.Send(&plugin.ConnInfo{ ServiceId: id, Network: listener.Addr().Network(), Address: listener.Addr().String(), @@ -365,7 +365,7 @@ func (b *GRPCBroker) Close() error { // Dial opens a connection by ID. func (b *GRPCBroker) Dial(id uint32) (conn *grpc.ClientConn, err error) { - var c *proto.ConnInfo + var c *plugin.ConnInfo // Open the stream p := b.getStream(id) @@ -435,7 +435,7 @@ func (m *GRPCBroker) getStream(id uint32) *gRPCBrokerPending { } m.streams[id] = &gRPCBrokerPending{ - ch: make(chan *proto.ConnInfo, 1), + ch: make(chan *plugin.ConnInfo, 1), doneCh: make(chan struct{}), } return m.streams[id] diff --git a/vendor/github.com/hashicorp/go-plugin/grpc_client.go b/vendor/github.com/hashicorp/go-plugin/grpc_client.go index e81f6bd60..d0d0d8e20 100644 --- a/vendor/github.com/hashicorp/go-plugin/grpc_client.go +++ b/vendor/github.com/hashicorp/go-plugin/grpc_client.go @@ -3,10 +3,11 @@ package plugin import ( "crypto/tls" "fmt" + "math" "net" "time" - "github.com/hashicorp/go-plugin/internal/proto" + "github.com/hashicorp/go-plugin/internal/plugin" "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -32,6 +33,11 @@ func dialGRPCConn(tls *tls.Config, dialer func(string, time.Duration) (net.Conn, credentials.NewTLS(tls))) } + opts = append(opts, + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)), + grpc.WithDefaultCallOptions(grpc.MaxCallSendMsgSize(math.MaxInt32))) + + // Connect. Note the first parameter is unused because we use a custom // dialer that has the state to see the address. conn, err := grpc.Dial("unused", opts...) @@ -61,7 +67,7 @@ func newGRPCClient(doneCtx context.Context, c *Client) (*GRPCClient, error) { Plugins: c.config.Plugins, doneCtx: doneCtx, broker: broker, - controller: proto.NewGRPCControllerClient(conn), + controller: plugin.NewGRPCControllerClient(conn), } return cl, nil @@ -75,13 +81,13 @@ type GRPCClient struct { doneCtx context.Context broker *GRPCBroker - controller proto.GRPCControllerClient + controller plugin.GRPCControllerClient } // ClientProtocol impl. func (c *GRPCClient) Close() error { c.broker.Close() - c.controller.Shutdown(c.doneCtx, &proto.Empty{}) + c.controller.Shutdown(c.doneCtx, &plugin.Empty{}) return c.Conn.Close() } diff --git a/vendor/github.com/hashicorp/go-plugin/grpc_controller.go b/vendor/github.com/hashicorp/go-plugin/grpc_controller.go index aa4c38114..1a8a8e70e 100644 --- a/vendor/github.com/hashicorp/go-plugin/grpc_controller.go +++ b/vendor/github.com/hashicorp/go-plugin/grpc_controller.go @@ -3,7 +3,7 @@ package plugin import ( "context" - "github.com/hashicorp/go-plugin/internal/proto" + "github.com/hashicorp/go-plugin/internal/plugin" ) // GRPCControllerServer handles shutdown calls to terminate the server when the @@ -14,8 +14,8 @@ type grpcControllerServer struct { // Shutdown stops the grpc server. It first will attempt a graceful stop, then a // full stop on the server. -func (s *grpcControllerServer) Shutdown(ctx context.Context, _ *proto.Empty) (*proto.Empty, error) { - resp := &proto.Empty{} +func (s *grpcControllerServer) Shutdown(ctx context.Context, _ *plugin.Empty) (*plugin.Empty, error) { + resp := &plugin.Empty{} // TODO: figure out why GracefullStop doesn't work. s.server.Stop() diff --git a/vendor/github.com/hashicorp/go-plugin/grpc_server.go b/vendor/github.com/hashicorp/go-plugin/grpc_server.go index 60df4a43d..d3dbf1ced 100644 --- a/vendor/github.com/hashicorp/go-plugin/grpc_server.go +++ b/vendor/github.com/hashicorp/go-plugin/grpc_server.go @@ -9,7 +9,7 @@ import ( "net" hclog "github.com/hashicorp/go-hclog" - "github.com/hashicorp/go-plugin/internal/proto" + "github.com/hashicorp/go-plugin/internal/plugin" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/health" @@ -75,7 +75,7 @@ func (s *GRPCServer) Init() error { // Register the broker service brokerServer := newGRPCBrokerServer() - proto.RegisterGRPCBrokerServer(s.server, brokerServer) + plugin.RegisterGRPCBrokerServer(s.server, brokerServer) s.broker = newGRPCBroker(brokerServer, s.TLS) go s.broker.Run() @@ -83,7 +83,7 @@ func (s *GRPCServer) Init() error { controllerServer := &grpcControllerServer{ server: s, } - proto.RegisterGRPCControllerServer(s.server, controllerServer) + plugin.RegisterGRPCControllerServer(s.server, controllerServer) // Register all our plugins onto the gRPC server. for k, raw := range s.Plugins { diff --git a/vendor/github.com/hashicorp/go-plugin/internal/proto/gen.go b/vendor/github.com/hashicorp/go-plugin/internal/plugin/gen.go similarity index 86% rename from vendor/github.com/hashicorp/go-plugin/internal/proto/gen.go rename to vendor/github.com/hashicorp/go-plugin/internal/plugin/gen.go index 294ea4313..aa2fdc813 100644 --- a/vendor/github.com/hashicorp/go-plugin/internal/proto/gen.go +++ b/vendor/github.com/hashicorp/go-plugin/internal/plugin/gen.go @@ -1,3 +1,3 @@ //go:generate protoc -I ./ ./grpc_broker.proto ./grpc_controller.proto --go_out=plugins=grpc:. -package proto +package plugin diff --git a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_broker.pb.go b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_broker.pb.go similarity index 82% rename from vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_broker.pb.go rename to vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_broker.pb.go index 39522f336..b6850aa59 100644 --- a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_broker.pb.go +++ b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_broker.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: grpc_broker.proto -package proto +package plugin import ( fmt "fmt" @@ -78,24 +78,24 @@ func (m *ConnInfo) GetAddress() string { } func init() { - proto.RegisterType((*ConnInfo)(nil), "proto.ConnInfo") + proto.RegisterType((*ConnInfo)(nil), "plugin.ConnInfo") } func init() { proto.RegisterFile("grpc_broker.proto", fileDescriptor_802e9beed3ec3b28) } var fileDescriptor_802e9beed3ec3b28 = []byte{ - // 164 bytes of a gzipped FileDescriptorProto + // 175 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4c, 0x2f, 0x2a, 0x48, - 0x8e, 0x4f, 0x2a, 0xca, 0xcf, 0x4e, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x05, - 0x53, 0x4a, 0xb1, 0x5c, 0x1c, 0xce, 0xf9, 0x79, 0x79, 0x9e, 0x79, 0x69, 0xf9, 0x42, 0xb2, 0x5c, - 0x5c, 0xc5, 0xa9, 0x45, 0x65, 0x99, 0xc9, 0xa9, 0xf1, 0x99, 0x29, 0x12, 0x8c, 0x0a, 0x8c, 0x1a, - 0xbc, 0x41, 0x9c, 0x50, 0x11, 0xcf, 0x14, 0x21, 0x09, 0x2e, 0xf6, 0xbc, 0xd4, 0x92, 0xf2, 0xfc, - 0xa2, 0x6c, 0x09, 0x26, 0x05, 0x46, 0x0d, 0xce, 0x20, 0x18, 0x17, 0x24, 0x93, 0x98, 0x92, 0x52, - 0x94, 0x5a, 0x5c, 0x2c, 0xc1, 0x0c, 0x91, 0x81, 0x72, 0x8d, 0x1c, 0xb9, 0xb8, 0xdc, 0x83, 0x02, - 0x9c, 0x9d, 0xc0, 0x36, 0x0b, 0x19, 0x73, 0x71, 0x07, 0x97, 0x24, 0x16, 0x95, 0x04, 0x97, 0x14, - 0xa5, 0x26, 0xe6, 0x0a, 0xf1, 0x43, 0x9c, 0xa2, 0x07, 0x73, 0x80, 0x14, 0xba, 0x80, 0x06, 0xa3, - 0x01, 0x63, 0x12, 0x1b, 0x58, 0xcc, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xda, 0xd5, 0x84, - 0xc4, 0x00, 0x00, 0x00, + 0x8e, 0x4f, 0x2a, 0xca, 0xcf, 0x4e, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x2b, + 0xc8, 0x29, 0x4d, 0xcf, 0xcc, 0x53, 0x8a, 0xe5, 0xe2, 0x70, 0xce, 0xcf, 0xcb, 0xf3, 0xcc, 0x4b, + 0xcb, 0x17, 0x92, 0xe5, 0xe2, 0x2a, 0x4e, 0x2d, 0x2a, 0xcb, 0x4c, 0x4e, 0x8d, 0xcf, 0x4c, 0x91, + 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0d, 0xe2, 0x84, 0x8a, 0x78, 0xa6, 0x08, 0x49, 0x70, 0xb1, 0xe7, + 0xa5, 0x96, 0x94, 0xe7, 0x17, 0x65, 0x4b, 0x30, 0x29, 0x30, 0x6a, 0x70, 0x06, 0xc1, 0xb8, 0x20, + 0x99, 0xc4, 0x94, 0x94, 0xa2, 0xd4, 0xe2, 0x62, 0x09, 0x66, 0x88, 0x0c, 0x94, 0x6b, 0xe4, 0xcc, + 0xc5, 0xe5, 0x1e, 0x14, 0xe0, 0xec, 0x04, 0xb6, 0x5a, 0xc8, 0x94, 0x8b, 0x3b, 0xb8, 0x24, 0xb1, + 0xa8, 0x24, 0xb8, 0xa4, 0x28, 0x35, 0x31, 0x57, 0x48, 0x40, 0x0f, 0xe2, 0x08, 0x3d, 0x98, 0x0b, + 0xa4, 0x30, 0x44, 0x34, 0x18, 0x0d, 0x18, 0x9d, 0x38, 0xa2, 0xa0, 0xae, 0x4d, 0x62, 0x03, 0x3b, + 0xde, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x10, 0x15, 0x39, 0x47, 0xd1, 0x00, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -122,7 +122,7 @@ func NewGRPCBrokerClient(cc *grpc.ClientConn) GRPCBrokerClient { } func (c *gRPCBrokerClient) StartStream(ctx context.Context, opts ...grpc.CallOption) (GRPCBroker_StartStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_GRPCBroker_serviceDesc.Streams[0], "/proto.GRPCBroker/StartStream", opts...) + stream, err := c.cc.NewStream(ctx, &_GRPCBroker_serviceDesc.Streams[0], "/plugin.GRPCBroker/StartStream", opts...) if err != nil { return nil, err } @@ -188,7 +188,7 @@ func (x *gRPCBrokerStartStreamServer) Recv() (*ConnInfo, error) { } var _GRPCBroker_serviceDesc = grpc.ServiceDesc{ - ServiceName: "proto.GRPCBroker", + ServiceName: "plugin.GRPCBroker", HandlerType: (*GRPCBrokerServer)(nil), Methods: []grpc.MethodDesc{}, Streams: []grpc.StreamDesc{ diff --git a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_broker.proto b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_broker.proto similarity index 81% rename from vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_broker.proto rename to vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_broker.proto index 7d978d274..3fa79e8ac 100644 --- a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_broker.proto +++ b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_broker.proto @@ -1,5 +1,6 @@ syntax = "proto3"; -package proto; +package plugin; +option go_package = "plugin"; message ConnInfo { uint32 service_id = 1; diff --git a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_controller.pb.go b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_controller.pb.go similarity index 84% rename from vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_controller.pb.go rename to vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_controller.pb.go index bb780d7ff..38b420432 100644 --- a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_controller.pb.go +++ b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_controller.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // source: grpc_controller.proto -package proto +package plugin import ( fmt "fmt" @@ -54,20 +54,20 @@ func (m *Empty) XXX_DiscardUnknown() { var xxx_messageInfo_Empty proto.InternalMessageInfo func init() { - proto.RegisterType((*Empty)(nil), "proto.Empty") + proto.RegisterType((*Empty)(nil), "plugin.Empty") } func init() { proto.RegisterFile("grpc_controller.proto", fileDescriptor_23c2c7e42feab570) } var fileDescriptor_23c2c7e42feab570 = []byte{ - // 97 bytes of a gzipped FileDescriptorProto + // 108 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0x2f, 0x2a, 0x48, 0x8e, 0x4f, 0xce, 0xcf, 0x2b, 0x29, 0xca, 0xcf, 0xc9, 0x49, 0x2d, 0xd2, 0x2b, 0x28, 0xca, 0x2f, - 0xc9, 0x17, 0x62, 0x05, 0x53, 0x4a, 0xec, 0x5c, 0xac, 0xae, 0xb9, 0x05, 0x25, 0x95, 0x46, 0x16, - 0x5c, 0x7c, 0xee, 0x41, 0x01, 0xce, 0xce, 0x70, 0x75, 0x42, 0x6a, 0x5c, 0x1c, 0xc1, 0x19, 0xa5, - 0x25, 0x29, 0xf9, 0xe5, 0x79, 0x42, 0x3c, 0x10, 0x5d, 0x7a, 0x60, 0xb5, 0x52, 0x28, 0xbc, 0x24, - 0x36, 0x30, 0xc7, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x69, 0xa1, 0xad, 0x79, 0x69, 0x00, 0x00, - 0x00, + 0xc9, 0x17, 0x62, 0x2b, 0xc8, 0x29, 0x4d, 0xcf, 0xcc, 0x53, 0x62, 0xe7, 0x62, 0x75, 0xcd, 0x2d, + 0x28, 0xa9, 0x34, 0xb2, 0xe2, 0xe2, 0x73, 0x0f, 0x0a, 0x70, 0x76, 0x86, 0x2b, 0x14, 0xd2, 0xe0, + 0xe2, 0x08, 0xce, 0x28, 0x2d, 0x49, 0xc9, 0x2f, 0xcf, 0x13, 0xe2, 0xd5, 0x83, 0xa8, 0xd7, 0x03, + 0x2b, 0x96, 0x42, 0xe5, 0x3a, 0x71, 0x44, 0x41, 0x8d, 0x4b, 0x62, 0x03, 0x9b, 0x6e, 0x0c, 0x08, + 0x00, 0x00, 0xff, 0xff, 0xab, 0x7c, 0x27, 0xe5, 0x76, 0x00, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -95,7 +95,7 @@ func NewGRPCControllerClient(cc *grpc.ClientConn) GRPCControllerClient { func (c *gRPCControllerClient) Shutdown(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/proto.GRPCController/Shutdown", in, out, opts...) + err := c.cc.Invoke(ctx, "/plugin.GRPCController/Shutdown", in, out, opts...) if err != nil { return nil, err } @@ -121,7 +121,7 @@ func _GRPCController_Shutdown_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/proto.GRPCController/Shutdown", + FullMethod: "/plugin.GRPCController/Shutdown", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(GRPCControllerServer).Shutdown(ctx, req.(*Empty)) @@ -130,7 +130,7 @@ func _GRPCController_Shutdown_Handler(srv interface{}, ctx context.Context, dec } var _GRPCController_serviceDesc = grpc.ServiceDesc{ - ServiceName: "proto.GRPCController", + ServiceName: "plugin.GRPCController", HandlerType: (*GRPCControllerServer)(nil), Methods: []grpc.MethodDesc{ { diff --git a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_controller.proto b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_controller.proto similarity index 80% rename from vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_controller.proto rename to vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_controller.proto index ecdf4e6e0..345d0a1c1 100644 --- a/vendor/github.com/hashicorp/go-plugin/internal/proto/grpc_controller.proto +++ b/vendor/github.com/hashicorp/go-plugin/internal/plugin/grpc_controller.proto @@ -1,5 +1,6 @@ syntax = "proto3"; -package proto; +package plugin; +option go_package = "plugin"; message Empty { } diff --git a/vendor/github.com/hashicorp/go-plugin/log_entry.go b/vendor/github.com/hashicorp/go-plugin/log_entry.go index 2996c14c3..fb2ef930c 100644 --- a/vendor/github.com/hashicorp/go-plugin/log_entry.go +++ b/vendor/github.com/hashicorp/go-plugin/log_entry.go @@ -32,11 +32,11 @@ func flattenKVPairs(kvs []*logEntryKV) []interface{} { } // parseJSON handles parsing JSON output -func parseJSON(input string) (*logEntry, error) { +func parseJSON(input []byte) (*logEntry, error) { var raw map[string]interface{} entry := &logEntry{} - err := json.Unmarshal([]byte(input), &raw) + err := json.Unmarshal(input, &raw) if err != nil { return nil, err } diff --git a/vendor/github.com/hashicorp/go-plugin/server.go b/vendor/github.com/hashicorp/go-plugin/server.go index fc9f05a9f..4c230e3ab 100644 --- a/vendor/github.com/hashicorp/go-plugin/server.go +++ b/vendor/github.com/hashicorp/go-plugin/server.go @@ -363,14 +363,34 @@ func serverListener() (net.Listener, error) { } func serverListener_tcp() (net.Listener, error) { - minPort, err := strconv.ParseInt(os.Getenv("PLUGIN_MIN_PORT"), 10, 32) - if err != nil { - return nil, err + envMinPort := os.Getenv("PLUGIN_MIN_PORT") + envMaxPort := os.Getenv("PLUGIN_MAX_PORT") + + var minPort, maxPort int64 + var err error + + switch { + case len(envMinPort) == 0: + minPort = 0 + default: + minPort, err = strconv.ParseInt(envMinPort, 10, 32) + if err != nil { + return nil, fmt.Errorf("Couldn't get value from PLUGIN_MIN_PORT: %v", err) + } } - maxPort, err := strconv.ParseInt(os.Getenv("PLUGIN_MAX_PORT"), 10, 32) - if err != nil { - return nil, err + switch { + case len(envMaxPort) == 0: + maxPort = 0 + default: + maxPort, err = strconv.ParseInt(envMaxPort, 10, 32) + if err != nil { + return nil, fmt.Errorf("Couldn't get value from PLUGIN_MAX_PORT: %v", err) + } + } + + if minPort > maxPort { + return nil, fmt.Errorf("ENV_MIN_PORT value of %d is greater than PLUGIN_MAX_PORT value of %d", minPort, maxPort) } for port := minPort; port <= maxPort; port++ { diff --git a/vendor/github.com/hashicorp/go-plugin/testing.go b/vendor/github.com/hashicorp/go-plugin/testing.go index 8a8d11560..2cf2c26cc 100644 --- a/vendor/github.com/hashicorp/go-plugin/testing.go +++ b/vendor/github.com/hashicorp/go-plugin/testing.go @@ -7,9 +7,9 @@ import ( "net" "net/rpc" - hclog "github.com/hashicorp/go-hclog" - "github.com/hashicorp/go-plugin/internal/proto" "github.com/mitchellh/go-testing-interface" + hclog "github.com/hashicorp/go-hclog" + "github.com/hashicorp/go-plugin/internal/plugin" "google.golang.org/grpc" ) @@ -173,7 +173,7 @@ func TestPluginGRPCConn(t testing.T, ps map[string]Plugin) (*GRPCClient, *GRPCSe Plugins: ps, broker: broker, doneCtx: context.Background(), - controller: proto.NewGRPCControllerClient(conn), + controller: plugin.NewGRPCControllerClient(conn), } return client, server diff --git a/vendor/vendor.json b/vendor/vendor.json index 74c00bebe..fe000cbfc 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -214,7 +214,8 @@ {"path":"github.com/hashicorp/go-memdb","checksumSHA1":"FMAvwDar2bQyYAW4XMFhAt0J5xA=","revision":"20ff6434c1cc49b80963d45bf5c6aa89c78d8d57","revisionTime":"2017-08-31T20:15:40Z"}, {"path":"github.com/hashicorp/go-msgpack/codec","checksumSHA1":"CKGYNUDKre3Z2g4hHNVfp5nTcfA=","revision":"23165f7bc3c2dda1891434ebb9da1511a7bafc1c","revisionTime":"2019-09-27T12:33:13Z","version":"upstream-08f7b40","versionExact":"upstream-08f7b40"}, {"path":"github.com/hashicorp/go-multierror","checksumSHA1":"lrSl49G23l6NhfilxPM0XFs5rZo=","revision":"d30f09973e19c1dfcd120b2d9c4f168e68d6b5d5"}, - {"path":"github.com/hashicorp/go-plugin","checksumSHA1":"IFwYSAmxxM+fV0w9LwdWKqFOCgg=","revision":"f444068e8f5a19853177f7aa0aea7e7d95b5b528","revisionTime":"2018-12-12T15:08:38Z"}, + {"path":"github.com/hashicorp/go-plugin","checksumSHA1":"Nwod22KYiOycjys2ITllhNE9mtE=","revision":"809113480b559c989ea9cfcff62e9d387961f60b","revisionTime":"2019-10-04T17:18:45Z"}, + {"path":"github.com/hashicorp/go-plugin/internal/plugin","checksumSHA1":"uTvnRQ5UWn/bhRxbW/UCfYFseSc=","revision":"809113480b559c989ea9cfcff62e9d387961f60b","revisionTime":"2019-10-04T17:18:45Z"}, {"path":"github.com/hashicorp/go-plugin/internal/proto","checksumSHA1":"Ikbb1FngsPR79bHhr2UmKk4CblI=","revision":"f444068e8f5a19853177f7aa0aea7e7d95b5b528","revisionTime":"2018-12-12T15:08:38Z"}, {"path":"github.com/hashicorp/go-retryablehttp","checksumSHA1":"9SqwC2BzFbsWulQuBG2+QEliTpo=","revision":"73489d0a1476f0c9e6fb03f9c39241523a496dfd","revisionTime":"2019-01-26T20:33:39Z"}, {"path":"github.com/hashicorp/go-rootcerts","checksumSHA1":"A1PcINvF3UiwHRKn8UcgARgvGRs=","revision":"6bb64b370b90e7ef1fa532be9e591a81c3493e00","revisionTime":"2016-05-03T14:34:40Z"}, diff --git a/version/version.go b/version/version.go index 2f1196384..782ad77aa 100644 --- a/version/version.go +++ b/version/version.go @@ -16,7 +16,7 @@ var ( // A pre-release marker for the version. If this is "" (empty string) // then it means that it is a final release. Otherwise, this is a pre-release // such as "dev" (in development), "beta", "rc1", etc. - VersionPrerelease = "" + VersionPrerelease = "dev" // VersionMetadata is metadata further describing the build type. VersionMetadata = "" diff --git a/website/config.rb b/website/config.rb index 89d572222..f29c5feed 100644 --- a/website/config.rb +++ b/website/config.rb @@ -2,10 +2,13 @@ set :base_url, "https://www.nomadproject.io/" activate :hashicorp do |h| h.name = "nomad" - h.version = "0.9.6" + h.version = "0.10.0" h.github_slug = "hashicorp/nomad" end +# Netlify redirects/headers +proxy '_redirects', 'redirects.txt', ignore: true + helpers do # Returns a segment tracking ID such that local development is not # tracked to production systems. diff --git a/website/scripts/deploy.sh b/website/scripts/deploy.sh index df1b7125d..6716be659 100755 --- a/website/scripts/deploy.sh +++ b/website/scripts/deploy.sh @@ -5,6 +5,37 @@ PROJECT="nomad" PROJECT_URL="www.nomadproject.io" FASTLY_SERVICE_ID="7GrxRJP3PVBuqQbyxYQ0MV" FASTLY_DICTIONARY_ID="4OEpQ4S6HbEu7wkfTvrWUG" +REDIRECTS_FILE="./source/redirects.txt" +EXTERNAL_REDIRECTS_DICT_ID="7CPeY9SLVGuOfSkPgmBr93" +RELATIVE_REDIRECTS_DICT_ID="3tBkC2O6iOHqTuxxUtAdS1" + +# This function posts a dictionary of key-value pairs for redirects to Fastly +function post_redirects { + # Arguments: + # $1 - jq_query + # $2 - dictionary_id + # $3 - jq_args + # + # Returns: + # 0 - success + # * - failure + + declare -a arr=("${!3}") + + # Do not post empty items (the API gets sad) + if [ "${#arr[@]}" -ne 0 ]; then + json="$(jq "${arr[@]}" "$1" <<<'{"items": []}')" + + # Post the JSON body + curl \ + --request "PATCH" \ + --header "Fastly-Key: $FASTLY_API_KEY" \ + --header "Content-type: application/json" \ + --header "Accept: application/json" \ + --data "$json"\ + "https://api.fastly.com/service/$FASTLY_SERVICE_ID/dictionary/$2/items" + fi +} # Ensure the proper AWS environment variables are set if [ -z "$AWS_ACCESS_KEY_ID" ]; then @@ -95,7 +126,9 @@ if [ -z "$NO_UPLOAD" ]; then fi # Add redirects if they exist -if [ -z "$NO_REDIRECTS" ] || [ ! test -f "./redirects.txt" ]; then +# By default, the redirects file is in the source/ directory + +if [ -z "$NO_REDIRECTS" ] || [ ! test -f "$REDIRECTS_FILE" ]; then echo "Adding redirects..." fields=() while read -r line; do @@ -105,7 +138,7 @@ if [ -z "$NO_REDIRECTS" ] || [ ! test -f "./redirects.txt" ]; then # Read fields IFS=" " read -ra parts <<<"$line" fields+=("${parts[@]}") - done < "./redirects.txt" + done < "$REDIRECTS_FILE" # Check we have pairs if [ $((${#fields[@]} % 2)) -ne 0 ]; then @@ -126,41 +159,37 @@ if [ -z "$NO_REDIRECTS" ] || [ ! test -f "./redirects.txt" ]; then echo "'$field' is > 256 characters!" exit 1 fi - - if [ "${field:0:1}" != "/" ]; then - echo "'$field' does not start with /!" - exit 1 - fi done # Build the payload for single-request updates. - jq_args=() - jq_query="." + jq_args_external=() + jq_query_external="." + jq_args_relative=() + jq_query_relative="." for (( i=0; i<${#fields[@]}; i+=2 )); do - original="${fields[i]}" - redirect="${fields[i+1]}" - echo "Redirecting ${original} -> ${redirect}" - jq_args+=(--arg "key$((i/2))" "${original}") - jq_args+=(--arg "value$((i/2))" "${redirect}") - jq_query+="| .items |= (. + [{op: \"upsert\", item_key: \$key$((i/2)), item_value: \$value$((i/2))}])" + # if the redirect is external, add the entries to the external list + if [[ "${fields[i+1]}" =~ http[s]*:\/\/ ]]; then + external_original="${fields[i]}" + external_redirect="${fields[i+1]}" + echo "Redirecting external ${external_original} -> ${external_redirect}" + # The key and value indexes are for the whole redirects file so it may not be contiguous + # This doesn't matter at the end as long as the query matches the same key/value items + jq_args_external+=(--arg "key$((i/2))" "${external_original}") + jq_args_external+=(--arg "value$((i/2))" "${external_redirect}") + jq_query_external+="| .items |= (. + [{op: \"upsert\", item_key: \$key$((i/2)), item_value: \$value$((i/2))}])" + else + relative_original="${fields[i]}" + relative_redirect="${fields[i+1]}" + echo "Redirecting relative ${relative_original} -> ${relative_redirect}" + # The key and value indexes are for the whole redirects file so it may not be contiguous + # This doesn't matter at the end as long as the query matches the same key/value items + jq_args_relative+=(--arg "key$((i/2))" "${relative_original}") + jq_args_relative+=(--arg "value$((i/2))" "${relative_redirect}") + jq_query_relative+="| .items |= (. + [{op: \"upsert\", item_key: \$key$((i/2)), item_value: \$value$((i/2))}])" + fi done - - # Do not post empty items (the API gets sad) - if [ "${#jq_args[@]}" -ne 0 ]; then - json="$(jq "${jq_args[@]}" "${jq_query}" <<<'{"items": []}')" - - # Post the JSON body - curl \ - --fail \ - --silent \ - --output /dev/null \ - --request "PATCH" \ - --header "Fastly-Key: $FASTLY_API_KEY" \ - --header "Content-type: application/json" \ - --header "Accept: application/json" \ - --data "$json"\ - "https://api.fastly.com/service/$FASTLY_SERVICE_ID/dictionary/$FASTLY_DICTIONARY_ID/items" - fi + post_redirects "$jq_query_external" $EXTERNAL_REDIRECTS_DICT_ID jq_args_external[@] + post_redirects "$jq_query_relative" $RELATIVE_REDIRECTS_DICT_ID jq_args_relative[@] fi # Perform a purge of the surrogate key. diff --git a/website/source/api/acl-policies.html.md b/website/source/api/acl-policies.html.md index 04ba0d5c2..45dfd68aa 100644 --- a/website/source/api/acl-policies.html.md +++ b/website/source/api/acl-policies.html.md @@ -28,6 +28,10 @@ The table below shows this endpoint's support for | ---------------- | ----------------- | ------------ | | `YES` | `all` | `management` for all policies.
Output when given a non-management token will be limited to the policies on the token itself | +### Parameters + +- `prefix` `(string: "")` - Specifies a string to filter ACL policies based on + a name prefix. This is specified as a query string parameter. ### Sample Request @@ -36,6 +40,11 @@ $ curl \ https://localhost:4646/v1/acl/policies ``` +```text +$ curl \ + https://localhost:4646/v1/acl/policies?prefix=prod +``` + ### Sample Response ```json diff --git a/website/source/api/acl-tokens.html.md b/website/source/api/acl-tokens.html.md index 51eacbf62..65ad80460 100644 --- a/website/source/api/acl-tokens.html.md +++ b/website/source/api/acl-tokens.html.md @@ -70,6 +70,12 @@ The table below shows this endpoint's support for | ---------------- | ----------------- | ------------ | | `YES` | `all` | `management` | +### Parameters + +- `prefix` `(string: "")` - Specifies a string to filter ACL tokens based on an + accessor ID prefix. Because the value is decoded to bytes, the prefix must + have an even number of hexadecimal characters (0-9a-f). This is specified as + a query string parameter. ### Sample Request @@ -78,6 +84,12 @@ $ curl \ https://localhost:4646/v1/acl/tokens ``` +```text +$ curl \ + --request POST \ + https://localhost:4646/v1/acl/tokens?prefix=3da2ed52 +``` + ### Sample Response ```json diff --git a/website/source/api/allocations.html.md b/website/source/api/allocations.html.md index 8bbe0f9fa..f30b97772 100644 --- a/website/source/api/allocations.html.md +++ b/website/source/api/allocations.html.md @@ -28,8 +28,10 @@ The table below shows this endpoint's support for ### Parameters -- `prefix` `(string: "")`- Specifies a string to filter allocations on based on - an index prefix. This is specified as a query string parameter. +- `prefix` `(string: "")`- Specifies a string to filter allocations based on an + ID prefix. Because the value is decoded to bytes, the prefix must have an + even number of hexadecimal characters (0-9a-f). This is specified as a query + string parameter. ### Sample Request diff --git a/website/source/api/deployments.html.md b/website/source/api/deployments.html.md index 0400752f3..24e2ace1a 100644 --- a/website/source/api/deployments.html.md +++ b/website/source/api/deployments.html.md @@ -29,7 +29,9 @@ The table below shows this endpoint's support for ### Parameters - `prefix` `(string: "")`- Specifies a string to filter deployments based on - an index prefix. This is specified as a query string parameter. + an ID prefix. Because the value is decoded to bytes, the prefix must have an + even number of hexadecimal characters (0-9a-f) .This is specified as a query + string parameter. ### Sample Request diff --git a/website/source/api/evaluations.html.md b/website/source/api/evaluations.html.md index cdcbf9a6e..5ad71ef56 100644 --- a/website/source/api/evaluations.html.md +++ b/website/source/api/evaluations.html.md @@ -28,8 +28,10 @@ The table below shows this endpoint's support for ### Parameters -- `prefix` `(string: "")`- Specifies a string to filter evaluations on based on - an index prefix. This is specified as a query string parameter. +- `prefix` `(string: "")`- Specifies a string to filter evaluations based on an + ID prefix. Because the value is decoded to bytes, the prefix must have an + even number of hexadecimal characters (0-9a-f). This is specified as a query + string parameter. ### Sample Request @@ -40,7 +42,7 @@ $ curl \ ```text $ curl \ - https://localhost:4646/v1/evaluations?prefix=25ba81c + https://localhost:4646/v1/evaluations?prefix=25ba81 ``` ### Sample Response diff --git a/website/source/api/nodes.html.md b/website/source/api/nodes.html.md index 8d15d25f9..fafae336d 100644 --- a/website/source/api/nodes.html.md +++ b/website/source/api/nodes.html.md @@ -28,8 +28,10 @@ The table below shows this endpoint's support for ### Parameters -- `prefix` `(string: "")`- Specifies a string to filter nodes on based on an - index prefix. This is specified as a query string parameter. +- `prefix` `(string: "")`- Specifies a string to filter nodes based on an ID + prefix. Because the value is decoded to bytes, the prefix must have an even + number of hexadecimal characters (0-9a-f). This is specified as a query + string parameter. ### Sample Request @@ -40,7 +42,7 @@ $ curl \ ```text $ curl \ - http://localhost:4646/v1/nodes?prefix=prod + http://localhost:4646/v1/nodes?prefix=f7476465 ``` ### Sample Response diff --git a/website/source/assets/images/guide-ui-acl-token-set.png b/website/source/assets/images/guide-ui-acl-token-set.png new file mode 100644 index 000000000..fce2fa673 Binary files /dev/null and b/website/source/assets/images/guide-ui-acl-token-set.png differ diff --git a/website/source/assets/images/guide-ui-acl-token.png b/website/source/assets/images/guide-ui-acl-token.png new file mode 100644 index 000000000..f5224c77e Binary files /dev/null and b/website/source/assets/images/guide-ui-acl-token.png differ diff --git a/website/source/assets/images/guide-ui-acl-tokens.png b/website/source/assets/images/guide-ui-acl-tokens.png deleted file mode 100644 index 22fc82e0d..000000000 Binary files a/website/source/assets/images/guide-ui-acl-tokens.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-active-job-deployment.png b/website/source/assets/images/guide-ui-active-job-deployment.png deleted file mode 100644 index 015da9931..000000000 Binary files a/website/source/assets/images/guide-ui-active-job-deployment.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-allocation-detail.png b/website/source/assets/images/guide-ui-allocation-detail.png deleted file mode 100644 index 038b5b9bb..000000000 Binary files a/website/source/assets/images/guide-ui-allocation-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-allocation-stats.png b/website/source/assets/images/guide-ui-allocation-stats.png deleted file mode 100644 index 242219367..000000000 Binary files a/website/source/assets/images/guide-ui-allocation-stats.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-client-detail.png b/website/source/assets/images/guide-ui-client-detail.png deleted file mode 100644 index 915e568ea..000000000 Binary files a/website/source/assets/images/guide-ui-client-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-clients-list.png b/website/source/assets/images/guide-ui-clients-list.png deleted file mode 100644 index e7340cdfa..000000000 Binary files a/website/source/assets/images/guide-ui-clients-list.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-img-alloc-preempted.png b/website/source/assets/images/guide-ui-img-alloc-preempted.png new file mode 100644 index 000000000..86ec0f0a9 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-preempted.png differ diff --git a/website/source/assets/images/guide-ui-img-alloc-preempter.png b/website/source/assets/images/guide-ui-img-alloc-preempter.png new file mode 100644 index 000000000..90fb8fcc8 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-preempter.png differ diff --git a/website/source/assets/images/guide-ui-img-alloc-reschedule-details.png b/website/source/assets/images/guide-ui-img-alloc-reschedule-details.png new file mode 100644 index 000000000..68660996b Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-reschedule-details.png differ diff --git a/website/source/assets/images/guide-ui-img-alloc-reschedule-icon.png b/website/source/assets/images/guide-ui-img-alloc-reschedule-icon.png new file mode 100644 index 000000000..ae3572dab Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-reschedule-icon.png differ diff --git a/website/source/assets/images/guide-ui-img-alloc-resource-utilization.png b/website/source/assets/images/guide-ui-img-alloc-resource-utilization.png new file mode 100644 index 000000000..47ad33381 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-resource-utilization.png differ diff --git a/website/source/assets/images/guide-ui-img-alloc-stop-restart.png b/website/source/assets/images/guide-ui-img-alloc-stop-restart.png new file mode 100644 index 000000000..2b9154459 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-stop-restart.png differ diff --git a/website/source/assets/images/guide-ui-img-alloc-unhealthy-driver.png b/website/source/assets/images/guide-ui-img-alloc-unhealthy-driver.png new file mode 100644 index 000000000..d2db47c00 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-alloc-unhealthy-driver.png differ diff --git a/website/source/assets/images/guide-ui-img-client-allocations.png b/website/source/assets/images/guide-ui-img-client-allocations.png new file mode 100644 index 000000000..94e40f21f Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-allocations.png differ diff --git a/website/source/assets/images/guide-ui-img-client-attributes.png b/website/source/assets/images/guide-ui-img-client-attributes.png new file mode 100644 index 000000000..c3af9cc47 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-attributes.png differ diff --git a/website/source/assets/images/guide-ui-img-client-detail.png b/website/source/assets/images/guide-ui-img-client-detail.png new file mode 100644 index 000000000..f460cda2f Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-detail.png differ diff --git a/website/source/assets/images/guide-ui-img-client-drain.png b/website/source/assets/images/guide-ui-img-client-drain.png new file mode 100644 index 000000000..8cdccde5d Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-drain.png differ diff --git a/website/source/assets/images/guide-ui-img-client-driver-status.png b/website/source/assets/images/guide-ui-img-client-driver-status.png new file mode 100644 index 000000000..772dd2806 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-driver-status.png differ diff --git a/website/source/assets/images/guide-ui-img-client-events.png b/website/source/assets/images/guide-ui-img-client-events.png new file mode 100644 index 000000000..d43875913 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-events.png differ diff --git a/website/source/assets/images/guide-ui-img-client-resource-utilization.png b/website/source/assets/images/guide-ui-img-client-resource-utilization.png new file mode 100644 index 000000000..47da43c28 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-client-resource-utilization.png differ diff --git a/website/source/assets/images/guide-ui-img-clients-filters.png b/website/source/assets/images/guide-ui-img-clients-filters.png new file mode 100644 index 000000000..de8ee506a Binary files /dev/null and b/website/source/assets/images/guide-ui-img-clients-filters.png differ diff --git a/website/source/assets/images/guide-ui-img-clients-list.png b/website/source/assets/images/guide-ui-img-clients-list.png new file mode 100644 index 000000000..abaae06d0 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-clients-list.png differ diff --git a/website/source/assets/images/guide-ui-img-job-allocations.png b/website/source/assets/images/guide-ui-img-job-allocations.png new file mode 100644 index 000000000..761536af0 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-allocations.png differ diff --git a/website/source/assets/images/guide-ui-img-job-definition-edit.png b/website/source/assets/images/guide-ui-img-job-definition-edit.png new file mode 100644 index 000000000..4ddd053cd Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-definition-edit.png differ diff --git a/website/source/assets/images/guide-ui-img-job-definition.png b/website/source/assets/images/guide-ui-img-job-definition.png new file mode 100644 index 000000000..9ff6f6f21 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-definition.png differ diff --git a/website/source/assets/images/guide-ui-img-job-deployment-canary.png b/website/source/assets/images/guide-ui-img-job-deployment-canary.png new file mode 100644 index 000000000..53526b7d6 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-deployment-canary.png differ diff --git a/website/source/assets/images/guide-ui-img-job-deployments.png b/website/source/assets/images/guide-ui-img-job-deployments.png new file mode 100644 index 000000000..58ece86bb Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-deployments.png differ diff --git a/website/source/assets/images/guide-ui-img-job-evaluations.png b/website/source/assets/images/guide-ui-img-job-evaluations.png new file mode 100644 index 000000000..1ba9fa80d Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-evaluations.png differ diff --git a/website/source/assets/images/guide-ui-img-job-filters.png b/website/source/assets/images/guide-ui-img-job-filters.png new file mode 100644 index 000000000..fcfde0259 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-filters.png differ diff --git a/website/source/assets/images/guide-ui-img-job-overview-system.png b/website/source/assets/images/guide-ui-img-job-overview-system.png new file mode 100644 index 000000000..5ba9205ed Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-overview-system.png differ diff --git a/website/source/assets/images/guide-ui-img-job-plan-placement-failures.png b/website/source/assets/images/guide-ui-img-job-plan-placement-failures.png new file mode 100644 index 000000000..e2ba16d14 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-plan-placement-failures.png differ diff --git a/website/source/assets/images/guide-ui-img-job-plan-preemptions.png b/website/source/assets/images/guide-ui-img-job-plan-preemptions.png new file mode 100644 index 000000000..87f9c7ed1 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-plan-preemptions.png differ diff --git a/website/source/assets/images/guide-ui-img-job-plan.png b/website/source/assets/images/guide-ui-img-job-plan.png new file mode 100644 index 000000000..8463c1d80 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-plan.png differ diff --git a/website/source/assets/images/guide-ui-img-job-run.png b/website/source/assets/images/guide-ui-img-job-run.png new file mode 100644 index 000000000..7efe9558d Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-run.png differ diff --git a/website/source/assets/images/guide-ui-img-job-stop.png b/website/source/assets/images/guide-ui-img-job-stop.png new file mode 100644 index 000000000..3838147c5 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-stop.png differ diff --git a/website/source/assets/images/guide-ui-img-job-versions.png b/website/source/assets/images/guide-ui-img-job-versions.png new file mode 100644 index 000000000..a1f2a6684 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-job-versions.png differ diff --git a/website/source/assets/images/guide-ui-img-periodic-force.png b/website/source/assets/images/guide-ui-img-periodic-force.png new file mode 100644 index 000000000..87f7b4502 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-periodic-force.png differ diff --git a/website/source/assets/images/guide-ui-img-server-detail.png b/website/source/assets/images/guide-ui-img-server-detail.png new file mode 100644 index 000000000..1dac50be0 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-server-detail.png differ diff --git a/website/source/assets/images/guide-ui-img-servers-list.png b/website/source/assets/images/guide-ui-img-servers-list.png new file mode 100644 index 000000000..6b831d7a4 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-servers-list.png differ diff --git a/website/source/assets/images/guide-ui-img-task-events.png b/website/source/assets/images/guide-ui-img-task-events.png new file mode 100644 index 000000000..fb2a9434b Binary files /dev/null and b/website/source/assets/images/guide-ui-img-task-events.png differ diff --git a/website/source/assets/images/guide-ui-img-task-logs.png b/website/source/assets/images/guide-ui-img-task-logs.png new file mode 100644 index 000000000..d2a898903 Binary files /dev/null and b/website/source/assets/images/guide-ui-img-task-logs.png differ diff --git a/website/source/assets/images/guide-ui-job-definition.png b/website/source/assets/images/guide-ui-job-definition.png deleted file mode 100644 index 7a88e487c..000000000 Binary files a/website/source/assets/images/guide-ui-job-definition.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-job-deployment-detail.png b/website/source/assets/images/guide-ui-job-deployment-detail.png deleted file mode 100644 index 6ebfd3b88..000000000 Binary files a/website/source/assets/images/guide-ui-job-deployment-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-job-deployments.png b/website/source/assets/images/guide-ui-job-deployments.png deleted file mode 100644 index 1bfebe17d..000000000 Binary files a/website/source/assets/images/guide-ui-job-deployments.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-job-detail.png b/website/source/assets/images/guide-ui-job-detail.png deleted file mode 100644 index bcae7e6be..000000000 Binary files a/website/source/assets/images/guide-ui-job-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-job-version-diff.png b/website/source/assets/images/guide-ui-job-version-diff.png deleted file mode 100644 index f0cdeda09..000000000 Binary files a/website/source/assets/images/guide-ui-job-version-diff.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-job-versions.png b/website/source/assets/images/guide-ui-job-versions.png deleted file mode 100644 index 00bfabde8..000000000 Binary files a/website/source/assets/images/guide-ui-job-versions.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-jobs-list-unauthorized.png b/website/source/assets/images/guide-ui-jobs-list-unauthorized.png new file mode 100644 index 000000000..05a5059f0 Binary files /dev/null and b/website/source/assets/images/guide-ui-jobs-list-unauthorized.png differ diff --git a/website/source/assets/images/guide-ui-jobs-list.png b/website/source/assets/images/guide-ui-jobs-list.png index 4025a905a..1ac1d7831 100644 Binary files a/website/source/assets/images/guide-ui-jobs-list.png and b/website/source/assets/images/guide-ui-jobs-list.png differ diff --git a/website/source/assets/images/guide-ui-jobs-row-detail.png b/website/source/assets/images/guide-ui-jobs-row-detail.png deleted file mode 100644 index bbefa06ad..000000000 Binary files a/website/source/assets/images/guide-ui-jobs-row-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-parameterized-dispatch-payload.png b/website/source/assets/images/guide-ui-parameterized-dispatch-payload.png deleted file mode 100644 index 79c8951e8..000000000 Binary files a/website/source/assets/images/guide-ui-parameterized-dispatch-payload.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-periodic-force-launch-button.png b/website/source/assets/images/guide-ui-periodic-force-launch-button.png deleted file mode 100644 index 98e9cb79a..000000000 Binary files a/website/source/assets/images/guide-ui-periodic-force-launch-button.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-periodic-job-detail.png b/website/source/assets/images/guide-ui-periodic-job-detail.png deleted file mode 100644 index 7244a9173..000000000 Binary files a/website/source/assets/images/guide-ui-periodic-job-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-server-detail.png b/website/source/assets/images/guide-ui-server-detail.png deleted file mode 100644 index e6149e4bc..000000000 Binary files a/website/source/assets/images/guide-ui-server-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-task-group-detail.png b/website/source/assets/images/guide-ui-task-group-detail.png deleted file mode 100644 index 30c8edfe1..000000000 Binary files a/website/source/assets/images/guide-ui-task-group-detail.png and /dev/null differ diff --git a/website/source/assets/images/guide-ui-task-logs.png b/website/source/assets/images/guide-ui-task-logs.png deleted file mode 100644 index 5556d4ef2..000000000 Binary files a/website/source/assets/images/guide-ui-task-logs.png and /dev/null differ diff --git a/website/source/assets/images/haproxy_ui.png b/website/source/assets/images/haproxy_ui.png new file mode 100644 index 000000000..4ceffbeab Binary files /dev/null and b/website/source/assets/images/haproxy_ui.png differ diff --git a/website/source/assets/images/traefik_ui.png b/website/source/assets/images/traefik_ui.png new file mode 100644 index 000000000..0c3a6cb8d Binary files /dev/null and b/website/source/assets/images/traefik_ui.png differ diff --git a/website/source/assets/stylesheets/_alert.css b/website/source/assets/stylesheets/_alert.css new file mode 100644 index 000000000..e15946d9b --- /dev/null +++ b/website/source/assets/stylesheets/_alert.css @@ -0,0 +1,72 @@ +.g-alert{ + display:inline-flex; + align-items:flex-start; + background-color: white; +} +.g-alert:hover{ + opacity:0.8; +} +.g-alert.dark span, .g-alert.dark p{ + color:#0f1013; +} + +.g-alert.nomad-green span{ + border-color:#00bc7f; +} +.g-alert.nomad-green svg line{ + stroke:#00bc7f; + } +.g-alert.nomad-green svg path{ + fill:#00bc7f; + } + +.g-alert span{ + font-size: 16px; + background-color: white; + text-transform:uppercase; + padding:3px 10px; + border:1px solid #1563ff; + border-radius:3px; + font-weight:600; + font-size:1.25rem; + line-height:16px; + margin-right:12px; + color:black; + white-space:nowrap; + vertical-align: middle; + } +.g-alert p{ + font-size: 16px; + background-color: white; + color:black; + font-size:16px; + line-height:23px; + margin:0; + vertical-align: middle; + } +.g-alert svg{ + margin-left:12px + } +.g-alert svg line{ + stroke:#1563ff; + } +.g-alert svg path{ + fill:#1563ff; + } + +.g-alert-banner{ + background:linear-gradient(90deg, #1563ff 1.56%, #08368b 100%); + color:#ffffff; + display:none; + font-weight:600; + overflow:hidden; + position:relative; + transition:height 0.3s ease-out +} + +.g-alert-banner.nomad{ + background:linear-gradient(90deg, #00bc7f 1.56%, #005738 100%) + } +.g-alert-banner.nomad svg path{ + stroke:#6bd8b4; +} diff --git a/website/source/assets/stylesheets/_inner.scss b/website/source/assets/stylesheets/_inner.scss index 363702ce1..6bcabfd52 100644 --- a/website/source/assets/stylesheets/_inner.scss +++ b/website/source/assets/stylesheets/_inner.scss @@ -1,5 +1,7 @@ #inner { - p, li, .alert { + p, + li, + .alert { font-size: $font-size; font-family: $font-family-open-sans; font-weight: $font-weight-reg; @@ -52,9 +54,9 @@ img { display: block; margin: 25px auto; - max-width: 650px; + max-width: 95%; height: auto; - width: 90%; + width: auto; } h1, @@ -76,7 +78,7 @@ h2 > code, h3 > code, h4 > code, - h5 > code + h5 > code, h6 > code, li code, table code, diff --git a/website/source/assets/stylesheets/application.scss b/website/source/assets/stylesheets/application.scss index 22a6c8c88..7b46bc0fb 100755 --- a/website/source/assets/stylesheets/application.scss +++ b/website/source/assets/stylesheets/application.scss @@ -32,3 +32,4 @@ @import '_docs'; @import '_downloads'; @import '_api'; +@import '_alert'; diff --git a/website/source/docs/commands/acl.html.md.erb b/website/source/docs/commands/acl.html.md similarity index 60% rename from website/source/docs/commands/acl.html.md.erb rename to website/source/docs/commands/acl.html.md index 05b1c2485..8559db5a7 100644 --- a/website/source/docs/commands/acl.html.md.erb +++ b/website/source/docs/commands/acl.html.md @@ -17,16 +17,16 @@ Usage: `nomad acl [options]` Run `nomad acl -h` for help on that subcommand. The following subcommands are available: -* [`acl bootstrap`][bootstrap] - Bootstrap the initial ACL token -* [`acl policy apply`][policyapply] - Create or update ACL policies -* [`acl policy delete`][policydelete] - Delete an existing ACL policies -* [`acl policy info`][policyinfo] - Fetch information on an existing ACL policy -* [`acl policy list`][policylist] - List available ACL policies -* [`acl token create`][tokencreate] - Create new ACL token -* [`acl token delete`][tokendelete] - Delete an existing ACL token -* [`acl token info`][tokeninfo] - Get info on an existing ACL token -* [`acl token self`][tokenself] - Get info on self ACL token -* [`acl token update`][tokenupdate] - Update existing ACL token +- [`acl bootstrap`][bootstrap] - Bootstrap the initial ACL token +- [`acl policy apply`][policyapply] - Create or update ACL policies +- [`acl policy delete`][policydelete] - Delete an existing ACL policies +- [`acl policy info`][policyinfo] - Fetch information on an existing ACL policy +- [`acl policy list`][policylist] - List available ACL policies +- [`acl token create`][tokencreate] - Create new ACL token +- [`acl token delete`][tokendelete] - Delete an existing ACL token +- [`acl token info`][tokeninfo] - Get info on an existing ACL token +- [`acl token self`][tokenself] - Get info on self ACL token +- [`acl token update`][tokenupdate] - Update existing ACL token [bootstrap]: /docs/commands/acl/bootstrap.html [policyapply]: /docs/commands/acl/policy-apply.html diff --git a/website/source/docs/commands/acl/bootstrap.html.md.erb b/website/source/docs/commands/acl/bootstrap.html.md.erb index 2934753a4..76c257067 100644 --- a/website/source/docs/commands/acl/bootstrap.html.md.erb +++ b/website/source/docs/commands/acl/bootstrap.html.md.erb @@ -12,7 +12,7 @@ The `acl bootstrap` command is used to bootstrap the initial ACL token. ## Usage -``` +```plaintext nomad acl bootstrap [options] ``` @@ -26,7 +26,7 @@ The `acl bootstrap` command requires no arguments. Bootstrap the initial token: -``` +```shell $ nomad acl bootstrap Accessor ID = 5b7fd453-d3f7-6814-81dc-fcfe6daedea5 Secret ID = 9184ec35-65d4-9258-61e3-0c066d0a45c5 diff --git a/website/source/docs/commands/acl/policy-apply.html.md.erb b/website/source/docs/commands/acl/policy-apply.html.md.erb index f0d44428c..6e6a7c65a 100644 --- a/website/source/docs/commands/acl/policy-apply.html.md.erb +++ b/website/source/docs/commands/acl/policy-apply.html.md.erb @@ -12,12 +12,12 @@ The `acl policy apply` command is used to create or update ACL policies. ## Usage -``` +```plaintext nomad acl policy apply [options] ``` -The `acl policy apply` command requires two arguments, the policy name and path to file. -The policy can be read from stdin by setting the path to "-". +The `acl policy apply` command requires two arguments, the policy name and path +to file. The policy can be read from stdin by setting the path to "-". ## General Options @@ -25,13 +25,13 @@ The policy can be read from stdin by setting the path to "-". ## Apply Options -* `-description`: Sets the human readable description for the ACL policy. +- `-description`: Sets the human readable description for the ACL policy. ## Examples Create a new ACL Policy: -``` +```shell $ nomad acl policy apply my-policy my-policy.json Successfully wrote 'my-policy' ACL policy! ``` diff --git a/website/source/docs/commands/acl/policy-delete.html.md.erb b/website/source/docs/commands/acl/policy-delete.html.md.erb index 1e7c8018e..7fecc34be 100644 --- a/website/source/docs/commands/acl/policy-delete.html.md.erb +++ b/website/source/docs/commands/acl/policy-delete.html.md.erb @@ -12,7 +12,7 @@ The `acl policy delete` command is used to delete an existing ACL policies. ## Usage -``` +```plaintext nomad acl policy delete ``` @@ -26,7 +26,7 @@ The `acl policy delete` command requires the policy name as an argument. Delete an ACL Policy: -``` +```shell $ nomad acl policy delete my-policy Successfully deleted 'my-policy' ACL policy! ``` diff --git a/website/source/docs/commands/acl/policy-info.html.md.erb b/website/source/docs/commands/acl/policy-info.html.md.erb index 4a809ebd3..4092bc069 100644 --- a/website/source/docs/commands/acl/policy-info.html.md.erb +++ b/website/source/docs/commands/acl/policy-info.html.md.erb @@ -14,7 +14,7 @@ policy. ## Usage -``` +```plaintext nomad acl policy info ``` @@ -28,7 +28,7 @@ The `acl policy info` command requires the policy name. Fetch information on an existing ACL Policy: -``` +```shell $ nomad acl policy info my-policy Name = my-policy Description = diff --git a/website/source/docs/commands/acl/policy-list.html.md.erb b/website/source/docs/commands/acl/policy-list.html.md.erb index b2247094e..00c55bcbe 100644 --- a/website/source/docs/commands/acl/policy-list.html.md.erb +++ b/website/source/docs/commands/acl/policy-list.html.md.erb @@ -12,25 +12,24 @@ The `acl policy list` command is used to list available ACL policies. ## Usage -``` +```plaintext nomad acl policy list ``` ## General Options <%= partial "docs/commands/_general_options" %> -# + ## List Options -* `-json` : Output the policies in their JSON format. - -* `-t` : Format and display the policies using a Go template. +- `-json` : Output the policies in their JSON format. +- `-t` : Format and display the policies using a Go template. ## Examples List all ACL policies: -``` +```shell $ nomad acl policy list Name Description policy-1 The first policy diff --git a/website/source/docs/commands/acl/token-create.html.md.erb b/website/source/docs/commands/acl/token-create.html.md.erb index ac0066ec1..51cb15218 100644 --- a/website/source/docs/commands/acl/token-create.html.md.erb +++ b/website/source/docs/commands/acl/token-create.html.md.erb @@ -12,7 +12,7 @@ The `acl token create` command is used to create new ACL tokens. ## Usage -``` +```plaintext nomad acl token create [options] ``` @@ -24,20 +24,22 @@ The `acl token create` command requires no arguments. ## Create Options -* `-name`: Sets the human readable name for the ACL token. +- `-name`: Sets the human readable name for the ACL token. -* `-type`: Sets the type of token. Must be one of "client" (default), or "management". +- `-type`: Sets the type of token. Must be one of "client" (default), or + "management". -* `-global`: Toggles the global mode of the token. Global tokens are replicated to all regions. Defaults false. +- `-global`: Toggles the global mode of the token. Global tokens are replicated + to all regions. Defaults false. -* `-policy`: Specifies a policy to associate with the token. Can be specified multiple times, - but only with client type tokens. +- `-policy`: Specifies a policy to associate with the token. Can be specified + multiple times, but only with client type tokens. ## Examples Create a new ACL token: -``` +```shell $ nomad acl token create -name="my token" -policy=foo -policy=bar Accessor ID = d532c40a-30f1-695c-19e5-c35b882b0efd Secret ID = 85310d07-9afa-ef53-0933-0c043cd673c7 diff --git a/website/source/docs/commands/acl/token-delete.html.md.erb b/website/source/docs/commands/acl/token-delete.html.md.erb index f9877a8eb..3bee359a5 100644 --- a/website/source/docs/commands/acl/token-delete.html.md.erb +++ b/website/source/docs/commands/acl/token-delete.html.md.erb @@ -12,7 +12,7 @@ The `acl token delete` command is used to delete existing ACL tokens. ## Usage -``` +```plaintext nomad acl token delete ``` @@ -26,7 +26,7 @@ The `acl token delete` command requires an existing token's AccessorID. Delete an existing ACL token: -``` +```shell $ nomad acl token delete d532c40a-30f1-695c-19e5-c35b882b0efd Token d532c40a-30f1-695c-19e5-c35b882b0efd successfully deleted diff --git a/website/source/docs/commands/acl/token-info.html.md.erb b/website/source/docs/commands/acl/token-info.html.md.erb index af43d9261..39e44bd52 100644 --- a/website/source/docs/commands/acl/token-info.html.md.erb +++ b/website/source/docs/commands/acl/token-info.html.md.erb @@ -12,7 +12,7 @@ The `acl token info` command is used to fetch information about an existing ACL ## Usage -``` +```plaintext nomad acl token info ``` @@ -26,7 +26,7 @@ The `acl token info` command requires an existing token's AccessorID. Fetch information about an existing ACL token: -``` +```shell $ nomad acl token info d532c40a-30f1-695c-19e5-c35b882b0efd Accessor ID = d532c40a-30f1-695c-19e5-c35b882b0efd Secret ID = 85310d07-9afa-ef53-0933-0c043cd673c7 diff --git a/website/source/docs/commands/acl/token-list.html.md.erb b/website/source/docs/commands/acl/token-list.html.md.erb index 45a9ce7bd..10862850a 100644 --- a/website/source/docs/commands/acl/token-list.html.md.erb +++ b/website/source/docs/commands/acl/token-list.html.md.erb @@ -12,25 +12,24 @@ The `acl token list` command is used to list existing ACL tokens. ## Usage -``` +```plaintext nomad acl token list ``` ## General Options <%= partial "docs/commands/_general_options" %> -# + ## List Options -* `-json` : Output the tokens in their JSON format. - -* `-t` : Format and display the tokens using a Go template. +- `-json` : Output the tokens in their JSON format. +- `-t` : Format and display the tokens using a Go template. ## Examples List all ACL tokens: -``` +```shell $ nomad acl token list Name Type Global Accessor ID Bootstrap Token management true 32b61154-47f1-3694-1430-a5544bafcd3e diff --git a/website/source/docs/commands/acl/token-self.html.md.erb b/website/source/docs/commands/acl/token-self.html.md.erb index 4ca40247b..03df83ecf 100644 --- a/website/source/docs/commands/acl/token-self.html.md.erb +++ b/website/source/docs/commands/acl/token-self.html.md.erb @@ -9,11 +9,12 @@ description: > # Command: acl token self -The `acl token self` command is used to fetch information about the currently set ACL token. +The `acl token self` command is used to fetch information about the currently +set ACL token. ## Usage -``` +```plaintext nomad acl token self ``` @@ -25,7 +26,7 @@ nomad acl token self Fetch information about an existing ACL token: -``` +```shell $ export NOMAD_TOKEN=d532c40a-30f1-695c-19e5-c35b882b0efd $ nomad acl token self diff --git a/website/source/docs/commands/acl/token-update.html.md.erb b/website/source/docs/commands/acl/token-update.html.md.erb index c1d18737f..4d803e465 100644 --- a/website/source/docs/commands/acl/token-update.html.md.erb +++ b/website/source/docs/commands/acl/token-update.html.md.erb @@ -12,7 +12,7 @@ The `acl token update` command is used to update existing ACL tokens. ## Usage -``` +```plaintext nomad acl token update [options] ``` @@ -24,20 +24,22 @@ The `acl token update` command requires an existing token's accessor ID. ## Create Options -* `-name`: Sets the human readable name for the ACL token. +- `-name`: Sets the human readable name for the ACL token. -* `-type`: Sets the type of token. Must be one of "client" (default), or "management". +- `-type`: Sets the type of token. Must be one of "client" (default), or + "management". -* `-global`: Toggles the global mode of the token. Global tokens are replicated to all regions. Defaults false. +- `-global`: Toggles the global mode of the token. Global tokens are replicated + to all regions. Defaults false. -* `-policy`: Specifies a policy to associate with the token. Can be specified multiple times, - but only with client type tokens. +- `-policy`: Specifies a policy to associate with the token. Can be specified + multiple times, but only with client type tokens. ## Examples Update an existing ACL token: -``` +```shell $ nomad acl token update -name="my updated token" -policy=foo -policy=bar d532c40a-30f1-695c-19e5-c35b882b0efd Accessor ID = d532c40a-30f1-695c-19e5-c35b882b0efd Secret ID = 85310d07-9afa-ef53-0933-0c043cd673c7 diff --git a/website/source/docs/commands/agent-info.html.md.erb b/website/source/docs/commands/agent-info.html.md.erb index d4eef9353..9961ea573 100644 --- a/website/source/docs/commands/agent-info.html.md.erb +++ b/website/source/docs/commands/agent-info.html.md.erb @@ -14,7 +14,7 @@ is connected to. This is useful for troubleshooting and performance monitoring. ## Usage -``` +```plaintext nomad agent-info [options] ``` @@ -27,15 +27,15 @@ nomad agent-info [options] Depending on the agent queried, information from different subsystems is returned. These subsystems are described below: -* client - Status of the local Nomad client -* nomad - Status of the local Nomad server -* serf - Gossip protocol metrics and information -* raft - Status information about the Raft consensus protocol -* runtime - Various metrics from the runtime environment +- client - Status of the local Nomad client +- nomad - Status of the local Nomad server +- serf - Gossip protocol metrics and information +- raft - Status information about the Raft consensus protocol +- runtime - Various metrics from the runtime environment ## Examples -``` +```shell $ nomad agent-info raft commit_index = 0 diff --git a/website/source/docs/commands/agent.html.md b/website/source/docs/commands/agent.html.md new file mode 100644 index 000000000..fb751eca8 --- /dev/null +++ b/website/source/docs/commands/agent.html.md @@ -0,0 +1,226 @@ +--- +layout: "docs" +page_title: "Commands: agent" +sidebar_current: "docs-commands-_agent" # Use "_" to break prefix match +description: > + The agent command is the main entrypoint to running a Nomad client + or server. +--- + +# Command: agent + +The agent command is the heart of Nomad: it runs the agent that handles client +or server functionality, including exposing interfaces for client consumption +and running jobs. + +Due to the power and flexibility of this command, the Nomad agent is documented +in its own section. See the [Nomad Agent] guide and the [Configuration] +documentation section for more information on how to use this command and the +options it has. + +## Command-line Options + +A subset of the available Nomad agent configuration can optionally be passed in +via CLI arguments. The `agent` command accepts the following arguments: + +- `-alloc-dir=`: Equivalent to the Client [alloc_dir] config + option. + +- `-acl-enabled`: Equivalent to the ACL [enabled] config option. + +- `-acl-replication-token`: Equivalent to the ACL [replication_token] config + option. + +- `-bind=
`: Equivalent to the [bind_addr] config option. + +- `-bootstrap-expect=`: Equivalent to the + [bootstrap_expect] config option. + +- `-client`: Enable client mode on the local agent. + +- `-config=`: Specifies the path to a configuration file or a directory of + configuration files to load. Can be specified multiple times. + +- `-consul-address=`: Equivalent to the [address] config option. + +- `-consul-auth=`: Equivalent to the [auth] config option. + +- `-consul-auto-advertise`: Equivalent to the [auto_advertise] config option. + +- `-consul-ca-file=`: Equivalent to the [ca_file] config option. + +- `-consul-cert-file=`: Equivalent to the [cert_file] config option. + +- `-consul-checks-use-advertise`: Equivalent to the [checks_use_advertise] + config option. + +- `-consul-client-auto-join`: Equivalent to the [client_auto_join] config + option. + +- `-consul-client-service-name=`: Equivalent to the [client_service_name] + config option. + +- `-consul-client-http-check-name=`: Equivalent to the + [client_http_check_name] config option. + +- `-consul-key-file=`: Equivalent to the [key_file] config option. + +- `-consul-server-service-name=`: Equivalent to the [server_service_name] + config option. + +- `-consul-server-http-check-name=`: Equivalent to the + [server_http_check_name] config option. + +- `-consul-server-serf-check-name=`: Equivalent to the + [server_serf_check_name] config option. + +- `-consul-server-rpc-check-name=`: Equivalent to the + [server_rpc_check_name] config option. + +- `-consul-server-auto-join`: Equivalent to the [server_auto_join] config + option. + +- `-consul-ssl`: Equivalent to the [ssl] config option. + +- `-consul-token=`: Equivalent to the [token] config option. + +- `-consul-verify-ssl`: Equivalent to the [verify_ssl] config option. + +- `-data-dir=`: Equivalent to the [data_dir] config option. + +- `-dc=`: Equivalent to the [datacenter] config option. + +- `-dev`: Start the agent in development mode. This enables a pre-configured + dual-role agent (client + server) which is useful for developing or testing + Nomad. No other configuration is required to start the agent in this mode, + but you may pass an optional comma-separated list of mode configurations: + +- `-dev-connect`: Start the agent in development mode, but bind to a public + network interface rather than localhost for using Consul Connect. This mode + is supported only on Linux as root. + +- `-encrypt`: Set the Serf encryption key. See the [Encryption Overview] for + more details. + +- `-join=
`: Address of another agent to join upon starting up. This can + be specified multiple times to specify multiple agents to join. + +- `-log-level=`: Equivalent to the [log_level] config option. + +- `-log-json`: Equivalent to the [log_json] config option. + +- `-meta=`: Equivalent to the Client [meta] config option. + +- `-network-interface=`: Equivalent to the Client + [network_interface] config option. + +- `-network-speed=`: Equivalent to the Client + [network_speed] config option. + +- `-node=`: Equivalent to the [name] config option. + +- `-node-class=`: Equivalent to the Client [node_class] + config option. + +- `-plugin-dir=`: Equivalent to the [plugin_dir] config option. + +- `-region=`: Equivalent to the [region] config option. + +- `-rejoin`: Equivalent to the [rejoin_after_leave] config option. + +- `-retry-interval`: Equivalent to the [retry_interval] config option. + +- `-retry-join`: Similar to `-join` but allows retrying a join if the first + attempt fails. + + ```sh + $ nomad agent -retry-join "127.0.0.1:4648" + ``` + + `retry-join` can be defined as a command line flag only for servers. Clients + can configure `retry-join` only in configuration files. + +- `-retry-max`: Similar to the [retry_max] config option. + +- `-server`: Enable server mode on the local agent. + +- `-servers=`: Equivalent to the Client [servers] config + option. + +- `-state-dir=`: Equivalent to the Client [state_dir] config + option. + +- `-vault-enabled`: Whether to enable or disabled Vault integration. + +- `-vault-address=`: The address to communicate with Vault. + +- `-vault-token=`: The Vault token used to derive tokens. Only needs to + be set on Servers. Overrides the Vault token read from the VAULT_TOKEN + environment variable. + +- `-vault-create-from-role=`: The role name to create tokens for tasks + from. + +- `-vault-ca-file=`: Path to a PEM-encoded CA cert file used to verify the + Vault server SSL certificate. + +- `-vault-ca-path=`: Path to a directory of PEM-encoded CA cert files used + to verify the Vault server SSL certificate.Whether to enable or disabled Vault + integration. + +- `vault-cert-file=`: The path to the certificate for Vault communication. + +- `vault-key-file=`: The path to the private key for Vault communication. + +- `vault-namespace=`: The Vault namespace used for the integration. + Required for servers and clients. Overrides the Vault namespace read from the + VAULT_NAMESPACE environment variable. + +- `vault-tls-skip-verify`: A boolean that determines whether to skip SSL + certificate verification. + +- `vault-tls-server-name=`: Used to set the SNI host when connecting to + Vault over TLS. + +[address]: /docs/configuration/consul.html#address +[alloc_dir]: #alloc_dir +[auth]: /docs/configuration/consul.html#auth +[auto_advertise]: /docs/configuration/consul.html#auto_advertise +[bind_addr]: #bind_addr +[bootstrap_expect]: #bootstrap_expect +[ca_file]: /docs/configuration/consul.html#ca_file +[cert_file]: /docs/configuration/consul.html#cert_file +[checks_use_advertise]: /docs/configuration/consul.html#checks_use_advertise +[client_auto_join]: /docs/configuration/consul.html#client_auto_join +[client_http_check_name]: /docs/configuration/consul.html#client_http_check_name +[client_service_name]: /docs/configuration/consul.html#client_service_name +[Configuration]: /docs/configuration/index.html +[data_dir]: /docs/configuration/index.html#data_dir +[datacenter]: #datacenter +[enabled]: /docs/configuration/acl.html#enabled +[Encryption Overview]: /guides/security/encryption.html +[key_file]: /docs/configuration/consul.html#key_file +[log_json]: /docs/configuration/index.html#log_json +[log_level]: /docs/configuration/index.html#log_level +[meta]: #meta +[name]: #name +[network_interface]: #network_interface +[network_speed]: #network_speed +[node_class]: #node_class +[Nomad Agent]: /guides/install/production/nomad-agent.html +[plugin_dir]: /docs/configuration/index.html#plugin_dir +[region]: #region +[rejoin_after_leave]: #rejoin_after_leave +[replication_token]: /docs/configuration/acl.html#replication_token +[retry_interval]: #retry_interval +[retry_max]: #retry_max +[server_auto_join]: /docs/configuration/consul.html#server_auto_join +[server_http_check_name]: /docs/configuration/consul.html#server_http_check_name +[server_rpc_check_name]: /docs/configuration/consul.html#server_rpc_check_name +[server_serf_check_name]: /docs/configuration/consul.html#server_serf_check_name +[server_service_name]: /docs/configuration/consul.html#server_service_name +[servers]: #servers +[ssl]: /docs/configuration/consul.html#ssl +[state_dir]: #state_dir +[token]: /docs/configuration/consul.html#token +[verify_ssl]: /docs/configuration/consul.html#verify_ssl diff --git a/website/source/docs/commands/agent.html.md.erb b/website/source/docs/commands/agent.html.md.erb deleted file mode 100644 index 524692f8a..000000000 --- a/website/source/docs/commands/agent.html.md.erb +++ /dev/null @@ -1,114 +0,0 @@ ---- -layout: "docs" -page_title: "Commands: agent" -sidebar_current: "docs-commands-_agent" # Use "_" to break prefix match -description: > - The agent command is the main entrypoint to running a Nomad client - or server. ---- - -# Command: agent - -The agent command is the heart of Nomad: it runs the agent that handles client -or server functionality, including exposing interfaces for client consumption -and running jobs. - -Due to the power and flexibility of this command, the Nomad agent is documented -in its own section. See the [Nomad Agent](/guides/install/production/nomad-agent.html) -guide and the [Configuration](/docs/configuration/index.html) documentation section for -more information on how to use this command and the options it has. - -## Command-line Options - -A subset of the available Nomad agent configuration can optionally be passed in -via CLI arguments. The `agent` command accepts the following arguments: - -* `-alloc-dir=`: Equivalent to the Client [alloc_dir](#alloc_dir) config - option. -* `-acl-enabled`: Equivalent to the ACL [enabled](/docs/configuration/acl.html#enabled) config option. -* `-acl-replication-token`: Equivalent to the ACL [replication_token](/docs/configuration/acl.html#replication_token) config option. -* `-bind=
`: Equivalent to the [bind_addr](#bind_addr) config option. -* `-bootstrap-expect=`: Equivalent to the - [bootstrap_expect](#bootstrap_expect) config option. -* `-client`: Enable client mode on the local agent. -* `-config=`: Specifies the path to a configuration file or a directory of - configuration files to load. Can be specified multiple times. -* `-consul-address=`: Equivalent to the [address](/docs/configuration/consul.html#address) config option. -* `-consul-auth=`: Equivalent to the [auth](/docs/configuration/consul.html#auth) config option. -* `-consul-auto-advertise`: Equivalent to the [auto_advertise](/docs/configuration/consul.html#auto_advertise) config option. -* `-consul-ca-file=`: Equivalent to the [ca_file](/docs/configuration/consul.html#ca_file) config option. -* `-consul-cert-file=`: Equivalent to the [cert_file](/docs/configuration/consul.html#cert_file) config option. -* `-consul-checks-use-advertise`: Equivalent to the [checks_use_advertise](/docs/configuration/consul.html#checks_use_advertise) config option. -* `-consul-client-auto-join`: Equivalent to the [client_auto_join](/docs/configuration/consul.html#client_auto_join) config option. -* `-consul-client-service-name=`: Equivalent to the [client_service_name](/docs/configuration/consul.html#client_service_name) config option. -* `-consul-client-http-check-name=`: Equivalent to the [client_http_check_name](/docs/configuration/consul.html#client_http_check_name) config option. -* `-consul-key-file=`: Equivalent to the [key_file](/docs/configuration/consul.html#key_file) config option. -* `-consul-server-service-name=`: Equivalent to the [server_service_name](/docs/configuration/consul.html#server_service_name) config option. -* `-consul-server-http-check-name=`: Equivalent to the [server_http_check_name](/docs/configuration/consul.html#server_http_check_name) config option. -* `-consul-server-serf-check-name=`: Equivalent to the [server_serf_check_name](/docs/configuration/consul.html#server_serf_check_name) config option. -* `-consul-server-rpc-check-name=`: Equivalent to the [server_rpc_check_name](/docs/configuration/consul.html#server_rpc_check_name) config option. -* `-consul-server-auto-join`: Equivalent to the [server_auto_join](/docs/configuration/consul.html#server_auto_join) config option. -* `-consul-ssl`: Equivalent to the [ssl](/docs/configuration/consul.html#ssl) config option. -* `-consul-token=`: Equivalent to the [token](/docs/configuration/consul.html#token) config option. -* `-consul-verify-ssl`: Equivalent to the [verify_ssl](/docs/configuration/consul.html#verify_ssl) config option. -* `-data-dir=`: Equivalent to the [data_dir](/docs/configuration/index.html#data_dir) config option. -* `-dc=`: Equivalent to the [datacenter](#datacenter) config option. -* `-dev`: Start the agent in development mode. This enables a pre-configured - dual-role agent (client + server) which is useful for developing or testing - Nomad. No other configuration is required to start the agent in this mode, - but you may pass an optional comma-separated list of mode configurations: -* `-dev-connect`: Start the agent in development mode, but bind to a public - network interface rather than localhost for using Consul Connect. This mode - is supported only on Linux as root. -* `-encrypt`: Set the Serf encryption key. See the [Encryption Overview](/guides/security/encryption.html) for more details. -* `-join=
`: Address of another agent to join upon starting up. This can - be specified multiple times to specify multiple agents to join. -* `-log-level=`: Equivalent to the [log_level](/docs/configuration/index.html#log_level) config option. -* `-log-json`: Equivalent to the [log_json](/docs/configuration/index.html#log_json) config option. -* `-meta=`: Equivalent to the Client [meta](#meta) config option. -* `-network-interface=`: Equivalent to the Client - [network_interface](#network_interface) config option. -* `-network-speed=`: Equivalent to the Client - [network_speed](#network_speed) config option. -* `-node=`: Equivalent to the [name](#name) config option. -* `-node-class=`: Equivalent to the Client [node_class](#node_class) - config option. -* `-plugin-dir=`: Equivalent to the [plugin_dir](/docs/configuration/index.html#plugin_dir) config option. -* `-region=`: Equivalent to the [region](#region) config option. -* `-rejoin`: Equivalent to the [rejoin_after_leave](#rejoin_after_leave) config option. -* `-retry-interval`: Equivalent to the [retry_interval](#retry_interval) config option. -* `-retry-join`: Similar to `-join` but allows retrying a join if the first attempt fails. - - ```sh - $ nomad agent -retry-join "127.0.0.1:4648" - ``` - - `retry-join` can be defined as a command line flag only for servers. Clients - can configure `retry-join` only in configuration files. - -* `-retry-max`: Similar to the [retry_max](#retry_max) config option. -* `-server`: Enable server mode on the local agent. -* `-servers=`: Equivalent to the Client [servers](#servers) config - option. -* `-state-dir=`: Equivalent to the Client [state_dir](#state_dir) config - option. -* `-vault-enabled`: Whether to enable or disabled Vault integration. -* `-vault-address=`: The address to communicate with Vault. -* `-vault-token=`: The Vault token used to derive tokens. Only needs to - be set on Servers. Overrides the Vault token read from the VAULT_TOKEN - environment variable. -* `-vault-create-from-role=`: The role name to create tokens for tasks from. -* `-vault-ca-file=`: Path to a PEM-encoded CA cert file used to verify the - Vault server SSL certificate. -* `-vault-ca-path=`: Path to a directory of PEM-encoded CA cert files used - to verify the Vault server SSL certificate.Whether to enable or disabled Vault - integration. -* `vault-cert-file=`: The path to the certificate for Vault communication. -* `vault-key-file=`: The path to the private key for Vault communication. -* `vault-namespace=`: The Vault namespace used for the integration. - Required for servers and clients. Overrides the Vault namespace read from the - VAULT_NAMESPACE environment variable. -* `vault-tls-skip-verify`: A boolean that determines whether to skip SSL - certificate verification. -* `vault-tls-server-name=`: Used to set the SNI host when connecting to - Vault over TLS. diff --git a/website/source/docs/commands/alloc.html.md.erb b/website/source/docs/commands/alloc.html.md similarity index 71% rename from website/source/docs/commands/alloc.html.md.erb rename to website/source/docs/commands/alloc.html.md index 180f58675..70f05f114 100644 --- a/website/source/docs/commands/alloc.html.md.erb +++ b/website/source/docs/commands/alloc.html.md @@ -7,7 +7,7 @@ description: > --- # Command: alloc - + The `alloc` command is used to interact with allocations. ## Usage @@ -17,12 +17,12 @@ Usage: `nomad alloc [options]` Run `nomad alloc -h` for help on that subcommand. The following subcommands are available: -* [`alloc fs`][fs] - Inspect the contents of an allocation directory -* [`alloc logs`][logs] - Streams the logs of a task -* [`alloc restart`][restart] - Restart a running allocation or task -* [`alloc signal`][signal] - Signal a running allocation -* [`alloc status`][status] - Display allocation status information and metadata -* [`alloc stop`][stop] - Stop and reschedule a running allocation +- [`alloc fs`][fs] - Inspect the contents of an allocation directory +- [`alloc logs`][logs] - Streams the logs of a task +- [`alloc restart`][restart] - Restart a running allocation or task +- [`alloc signal`][signal] - Signal a running allocation +- [`alloc status`][status] - Display allocation status information and metadata +- [`alloc stop`][stop] - Stop and reschedule a running allocation [fs]: /docs/commands/alloc/fs.html "Inspect the contents of an allocation directory" [logs]: /docs/commands/alloc/logs.html "Streams the logs of a task" diff --git a/website/source/docs/commands/alloc/exec.html.md.erb b/website/source/docs/commands/alloc/exec.html.md.erb index 2668ca0e5..9a7c552aa 100644 --- a/website/source/docs/commands/alloc/exec.html.md.erb +++ b/website/source/docs/commands/alloc/exec.html.md.erb @@ -7,17 +7,17 @@ description: > --- # Command: alloc exec + **Alias: `nomad exec`** The `alloc exec` command runs a command in a running allocation. ## Usage -``` +```plaintext nomad alloc exec [options] [...] ``` - The nomad exec command can be use to run commands inside a running task/allocation. Use cases are for inspecting container state, debugging a failed application @@ -34,29 +34,28 @@ the given job will be chosen. ## Exec Options -* `-task`: Sets the task to exec command in. Defaults to first task. +- `-task`: Sets the task to exec command in. Defaults to first task. -* `-job`: Use a random allocation from the specified job ID. +- `-job`: Use a random allocation from the specified job ID. -* `-i`: Pass stdin to the container, defaults to true. -Pass `-i=false` to disable explicitly. +- `-i`: Pass stdin to the container, defaults to true. Pass `-i=false` to + disable explicitly. -* `-t`: Allocate a pseudo-tty, defaults to true if stdin is detected to be a tty session. -Pass `-t=false` to disable explicitly. - -* `-e` : Sets the escape character for sessions with a pty -(default: '~'). The escape character is only recognized at the beginning of a -line. The escape character followed by a dot ('.') closes the connection. -Setting the character to 'none' disables any escapes and makes the session fully -transparent. +- `-t`: Allocate a pseudo-tty, defaults to true if stdin is detected to be a tty + session. Pass `-t=false` to disable explicitly. +- `-e` : Sets the escape character for sessions with a pty + (default: '~'). The escape character is only recognized at the beginning of a + line. The escape character followed by a dot ('.') closes the connection. + Setting the character to 'none' disables any escapes and makes the session + fully transparent. ## Examples To start an interactive debugging session in a particular alloc, invoke exec command with your desired shell available inside the task: -``` +```shell $ nomad alloc exec eb17e557 /bin/bash root@eb17e557:/data# # now run any debugging commands inside container root@eb17e557:/data# # ps -ef @@ -65,9 +64,10 @@ root@eb17e557:/data# # ps -ef To run a command and stream results without starting an interactive shell, you can pass the command and its arguments to exec directly: -``` +```shell $ # run commands without starting an interactive session $ nomad alloc exec eb17e557 cat /etc/resolv.conf +... ``` When passing command arguments to be evaluated in task, you may need to ensure @@ -75,14 +75,15 @@ that your host shell doesn't interpolate values before invoking `exec` command. For example, the following command would return the environment variable on operator shell rather than task containers: -``` +```shell $ nomad alloc exec eb17e557 echo $NOMAD_ALLOC_ID # wrong +... ``` Here, we must start a shell in task to interpolate `$NOMAD_ALLOC_ID`, and quote command or use the [heredoc syntax][heredoc] -``` +```shell $ # by quoting argument $ nomad alloc exec eb17e557 /bin/sh -c 'echo $NOMAD_ALLOC_ID' eb17e557-443e-4c51-c049-5bba7a9850bc @@ -97,38 +98,42 @@ eb17e557-443e-4c51-c049-5bba7a9850bc This technique applies when aiming to run a shell pipeline without streaming intermediate command output across the network: -``` +```shell $ # e.g. find top appearing lines in some output $ nomad alloc exec eb17e557 /bin/sh -c 'cat /output | sort | uniq -c | sort -rn | head -n 5' +... ``` -[heredoc]: http://tldp.org/LDP/abs/html/here-docs.html - ## Using Job ID instead of Allocation ID Setting the `-job` flag causes a random allocation of the specified job to be selected. -``` +```plaintext nomad alloc exec -job [...] ``` - Choosing a specific allocation is useful for debugging issues with a specific instance of a service. For other operations using the `-job` flag may be more convenient than looking up an allocation ID to use. ## Disabling remote execution -`alloc exec` is enabled by default to aid with debugging. Operators can disable the feature by setting [`disable_remote_exec` client config option][disable_remote_exec_flag] on all clients, or a subset of clients that run sensitive workloads. - -[disable_remote_exec_flag]: /docs/configuration/client.html#disable_remote_exec +`alloc exec` is enabled by default to aid with debugging. Operators can disable +the feature by setting [`disable_remote_exec` client config +option][disable_remote_exec_flag] on all clients, or a subset of clients that +run sensitive workloads. ## Exec targeting a specific task -When trying to `alloc exec` for a job that has more than one task associated with it, you may want to target a specific task. +When trying to `alloc exec` for a job that has more than one task associated +with it, you may want to target a specific task. -``` +```shell # open a shell session in one of your allocation's tasks $ nomad alloc exec -i -t -task mytask a1827f93 /bin/bash +a1827f93$ ``` + +[heredoc]: http://tldp.org/LDP/abs/html/here-docs.html +[disable_remote_exec_flag]: /docs/configuration/client.html#disable_remote_exec diff --git a/website/source/docs/commands/alloc/fs.html.md.erb b/website/source/docs/commands/alloc/fs.html.md.erb index 2cf1844f8..a0fa62a62 100644 --- a/website/source/docs/commands/alloc/fs.html.md.erb +++ b/website/source/docs/commands/alloc/fs.html.md.erb @@ -7,30 +7,34 @@ description: > --- # Command: alloc fs + **Alias: `nomad fs`** The `alloc fs` command allows a user to navigate an allocation directory on a Nomad client. The following functionalities are available - `cat`, `tail`, `ls` and `stat`. -* `cat`: If the target path is a file, Nomad will `cat` the file. -* `tail`: If the target path is a file and `-tail` flag is specified, Nomad will - `tail` the file. -* `ls`: If the target path is a directory, Nomad displays the name of a file and - directories and their associated information. -* `stat`: If the `-stat` flag is used, Nomad will display information about a - file. +- `cat`: If the target path is a file, Nomad will `cat` the file. + +- `tail`: If the target path is a file and `-tail` flag is specified, Nomad will + `tail` the file. + +- `ls`: If the target path is a directory, Nomad displays the name of a file and + directories and their associated information. + +- `stat`: If the `-stat` flag is used, Nomad will display information about a + file. ## Usage -``` +```plaintext nomad alloc fs [options] ``` -This command accepts a single allocation ID (unless the `-job` flag is specified, -in which case an allocation is chosen from the given job) and a path. The path is -relative to the root of the allocation directory. The path is optional and it -defaults to `/` of the allocation directory. +This command accepts a single allocation ID (unless the `-job` flag is +specified, in which case an allocation is chosen from the given job) and a path. +The path is relative to the root of the allocation directory. The path is +optional and it defaults to `/` of the allocation directory. ## General Options @@ -38,30 +42,30 @@ defaults to `/` of the allocation directory. ## Fs Options -* `-H`: Machine friendly output. +- `-H`: Machine friendly output. -* `-verbose`: Display verbose output. +- `-verbose`: Display verbose output. -* `-job`: Use a random allocation from the specified job, preferring a running -allocation. +- `-job`: Use a random allocation from the specified job, preferring a running + allocation. -* `-stat`: Show stat information instead of displaying the file, or listing the -directory. +- `-stat`: Show stat information instead of displaying the file, or listing the + directory. -* `-f`: Causes the output to not stop when the end of the file is reached, but -rather to wait for additional output. +- `-f`: Causes the output to not stop when the end of the file is reached, but + rather to wait for additional output. -* `-tail`: Show the files contents with offsets relative to the end of the file. -If no offset is given, -n is defaulted to 10. +- `-tail`: Show the files contents with offsets relative to the end of the file. + If no offset is given, -n is defaulted to 10. -* `-n`: Sets the tail location in best-efforted number of lines relative to the -end of the file. +- `-n`: Sets the tail location in best-efforted number of lines relative to the + end of the file. -* `-c`: Sets the tail location in number of bytes relative to the end of the file. +- `-c`: Sets the tail location in number of bytes relative to the end of the file. ## Examples -``` +```shell $ nomad alloc fs eb17e557 Mode Size Modified Time Name drwxrwxr-x 4096 28 Jan 16 05:39 UTC alloc/ @@ -98,10 +102,9 @@ selected. Nomad will prefer to select a running allocation ID for the job, but if no running allocations for the job are found, Nomad will use a dead allocation. -``` +```plaintext nomad alloc fs -job ``` - -This can be useful for debugging a job that has multiple allocations, and it's -not really required to use a specific allocation ID. +This can be useful for debugging a job that has multiple allocations, and it is +not required to observe a specific allocation. diff --git a/website/source/docs/commands/alloc/logs.html.md.erb b/website/source/docs/commands/alloc/logs.html.md.erb index 91b38c86c..b7e2234ee 100644 --- a/website/source/docs/commands/alloc/logs.html.md.erb +++ b/website/source/docs/commands/alloc/logs.html.md.erb @@ -7,13 +7,14 @@ description: > --- # Command: alloc logs + **Alias: `nomad logs`** The `alloc logs` command displays the log of a given task. ## Usage -``` +```plaintext nomad alloc logs [options] ``` @@ -21,34 +22,35 @@ This command streams the logs of the given task in the allocation. If the allocation is only running a single task, the task name can be omitted. Optionally, the `-job` option may be used in which case a random allocation from the given job will be chosen. -# + ## General Options <%= partial "docs/commands/_general_options" %> ## Logs Options -* `-stderr`: Display stderr logs. +- `-stderr`: Display stderr logs. -* `-verbose`: Display verbose output. +- `-verbose`: Display verbose output. -* `-job`: Use a random allocation from the specified job, preferring a running -allocation. +- `-job`: Use a random allocation from the specified job, preferring a running + allocation. -* `-f`: Causes the output to not stop when the end of the logs are reached, but -rather to wait for additional output. +- `-f`: Causes the output to not stop when the end of the logs are reached, but + rather to wait for additional output. -* `-tail`: Show the logs contents with offsets relative to the end of the logs. -If no offset is given, -n is defaulted to 10. +- `-tail`: Show the logs contents with offsets relative to the end of the logs. + If no offset is given, -n is defaulted to 10. -* `-n`: Sets the tail location in best-efforted number of lines relative to the -end of the logs. +- `-n`: Sets the tail location in best-efforted number of lines relative to the + end of the logs. -* `-c`: Sets the tail location in number of bytes relative to the end of the logs. +- `-c`: Sets the tail location in number of bytes relative to the end of the + logs. ## Examples -``` +```shell $ nomad alloc logs eb17e557 redis foobar baz @@ -80,11 +82,10 @@ selected. Nomad will prefer to select a running allocation ID for the job, but if no running allocations for the job are found, Nomad will use a dead allocation. -``` +```plaintext nomad alloc logs -job ``` - Choosing a specific allocation is useful for debugging issues with a specific instance of a service. For other operations using the `-job` flag may be more convenient than looking up an allocation ID to use. diff --git a/website/source/docs/commands/alloc/restart.html.md.erb b/website/source/docs/commands/alloc/restart.html.md.erb index 4cbd05193..1546eba44 100644 --- a/website/source/docs/commands/alloc/restart.html.md.erb +++ b/website/source/docs/commands/alloc/restart.html.md.erb @@ -13,7 +13,7 @@ an entire allocation or individual task. ## Usage -``` +```plaintext nomad alloc restart [options] ``` @@ -27,11 +27,11 @@ is optional and if omitted every task in the allocation will be restarted. ## Restart Options -* `-verbose`: Display verbose output. +- `-verbose`: Display verbose output. ## Examples -``` +```shell $ nomad alloc restart eb17e557 $ nomad alloc restart eb17e557 foo @@ -39,4 +39,3 @@ Could not find task named: foo, found: * test ``` - diff --git a/website/source/docs/commands/alloc/signal.html.md.erb b/website/source/docs/commands/alloc/signal.html.md.erb index fcc2bd141..76459ccf5 100644 --- a/website/source/docs/commands/alloc/signal.html.md.erb +++ b/website/source/docs/commands/alloc/signal.html.md.erb @@ -13,7 +13,7 @@ an entire allocation or individual task. ## Usage -``` +```plaintext nomad alloc signal [options] ``` @@ -27,13 +27,12 @@ is optional and if omitted every task in the allocation will be signaled. ## Signal Options -* `-s`: Signal to send to the tasks. Valid options depend on the driver. - -* `-verbose`: Display verbose output. +- `-s`: Signal to send to the tasks. Valid options depend on the driver. +- `-verbose`: Display verbose output. ## Examples -``` +```shell $ nomad alloc signal eb17e557 $ nomad alloc signal eb17e557 foo @@ -41,4 +40,3 @@ Could not find task named: foo, found: * test ``` - diff --git a/website/source/docs/commands/alloc/status.html.md.erb b/website/source/docs/commands/alloc/status.html.md.erb index 6432d96ba..ba847069d 100644 --- a/website/source/docs/commands/alloc/status.html.md.erb +++ b/website/source/docs/commands/alloc/status.html.md.erb @@ -11,13 +11,13 @@ description: > The `alloc status` command displays status information and metadata about an existing allocation and its tasks. It can be useful while debugging to reveal the underlying reasons for scheduling decisions or failures, as well as the -current state of its tasks. As of Nomad 0.7.1, alloc status also shows allocation -modification time in addition to create time. As of Nomad 0.8, alloc status shows -information about reschedule attempts. +current state of its tasks. As of Nomad 0.7.1, alloc status also shows +allocation modification time in addition to create time. As of Nomad 0.8, alloc +status shows information about reschedule attempts. ## Usage -``` +```plaintext nomad alloc status [options] ``` @@ -31,16 +31,16 @@ allocations and information will be displayed. ## Alloc Status Options -* `-short`: Display short output. Shows only the most recent task event. -* `-verbose`: Show full information. -* `-json` : Output the allocation in its JSON format. -* `-t` : Format and display the allocation using a Go template. +- `-short`: Display short output. Shows only the most recent task event. +- `-verbose`: Show full information. +- `-json` : Output the allocation in its JSON format. +- `-t` : Format and display the allocation using a Go template. ## Examples Short status of an alloc: -``` +```shell $ nomad alloc status --short 0af996ed ID = 0af996ed Eval ID = be9bde98 @@ -64,7 +64,7 @@ web running Started 07/25/17 16:12:49 UTC Full status of an alloc, which shows one of the tasks dying and then being restarted: -``` +```shell $ nomad alloc status 0af996ed ID = 0af996ed Eval ID = be9bde98 @@ -119,7 +119,7 @@ Recent Events: Verbose status can also be accessed: -``` +```shell $ nomad alloc status -verbose 0af996ed ID = 0af996ed-aff4-8ddb-a566-e55ebf8969c9 Eval ID = be9bde98-0490-1beb-ced0-012d10ddf22e diff --git a/website/source/docs/commands/alloc/stop.html.md.erb b/website/source/docs/commands/alloc/stop.html.md.erb index eaf018698..068816e7b 100644 --- a/website/source/docs/commands/alloc/stop.html.md.erb +++ b/website/source/docs/commands/alloc/stop.html.md.erb @@ -13,7 +13,7 @@ entire allocation or individual task. ## Usage -``` +```plaintext nomad alloc stop [options] ``` @@ -32,16 +32,16 @@ down. It is safe to exit the monitor early with ctrl-c. ## Stop Options -* `-detach`: Return immediately instead of entering monitor mode. After the +- `-detach`: Return immediately instead of entering monitor mode. After the stop command is submitted, a new evaluation ID is printed to the screen, which can be used to examine the rescheduling evaluation using the - [eval status](/docs/commands/eval-status.html) command. + [eval status] command. -* `-verbose`: Display verbose output. +- `-verbose`: Display verbose output. ## Examples -``` +```shell $ nomad alloc stop c1488bb5 ==> Monitoring evaluation "26172081" Evaluation triggered by job "example" @@ -54,3 +54,4 @@ $ nomad alloc stop -detach eb17e557 8a91f0f3-9d6b-ac83-479a-5aa186ab7795 ``` +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/deployment.html.md.erb b/website/source/docs/commands/deployment.html.md similarity index 72% rename from website/source/docs/commands/deployment.html.md.erb rename to website/source/docs/commands/deployment.html.md index dd0abb502..f39edcc78 100644 --- a/website/source/docs/commands/deployment.html.md.erb +++ b/website/source/docs/commands/deployment.html.md @@ -7,7 +7,7 @@ description: > --- # Command: deployment - + The `deployment` command is used to interact with deployments. ## Usage @@ -17,12 +17,12 @@ Usage: `nomad deployment [options]` Run `nomad deployment -h` for help on that subcommand. The following subcommands are available: -* [`deployment fail`][fail] - Manually fail a deployment -* [`deployment list`][list] - List all deployments -* [`deployment pause`][pause] - Pause a deployment -* [`deployment promote`][promote] - Promote canaries in a deployment -* [`deployment resume`][resume] - Resume a paused deployment -* [`deployment status`][status] - Display the status of a deployment +- [`deployment fail`][fail] - Manually fail a deployment +- [`deployment list`][list] - List all deployments +- [`deployment pause`][pause] - Pause a deployment +- [`deployment promote`][promote] - Promote canaries in a deployment +- [`deployment resume`][resume] - Resume a paused deployment +- [`deployment status`][status] - Display the status of a deployment [fail]: /docs/commands/deployment/fail.html "Manually fail a deployment" [list]: /docs/commands/deployment/list.html "List all deployments" diff --git a/website/source/docs/commands/deployment/fail.html.md.erb b/website/source/docs/commands/deployment/fail.html.md.erb index 7b447f9f5..0984646df 100644 --- a/website/source/docs/commands/deployment/fail.html.md.erb +++ b/website/source/docs/commands/deployment/fail.html.md.erb @@ -15,12 +15,12 @@ roll back to a stable version. ## Usage -``` +```plaintext nomad deployment fail [options] ``` The `deployment fail` command requires a single argument, a deployment ID or -prefix. +prefix. ## General Options @@ -28,17 +28,17 @@ prefix. ## Fail Options -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command. + [eval status] command. -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Manually mark an ongoing deployment as failed: -``` +```shell $ nomad deployment fail 8990cfbc Deployment "8990cfbc-28c0-cb28-ca31-856cf691b987" failed @@ -59,3 +59,5 @@ Deployed Task Group Desired Placed Healthy Unhealthy cache 3 2 1 0 ``` + +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/deployment/list.html.md.erb b/website/source/docs/commands/deployment/list.html.md.erb index 683a2d19d..775a506a5 100644 --- a/website/source/docs/commands/deployment/list.html.md.erb +++ b/website/source/docs/commands/deployment/list.html.md.erb @@ -12,7 +12,7 @@ The `deployment list` command is used list all deployments. ## Usage -``` +```plaintext nomad deployment list [options] ``` @@ -24,17 +24,15 @@ The `deployment list` command requires no arguments. ## List Options -* `-json` : Output the deployments in their JSON format. - -* `-t` : Format and display the deployments using a Go template. - -* `-verbose`: Show full information. +- `-json` : Output the deployments in their JSON format. +- `-t` : Format and display the deployments using a Go template. +- `-verbose`: Show full information. ## Examples List all tracked deployments: -``` +```shell $ nomad deployment list ID Job ID Job Version Status Description 8990cfbc example 2 failed Deployment marked as failed diff --git a/website/source/docs/commands/deployment/pause.html.md.erb b/website/source/docs/commands/deployment/pause.html.md.erb index f218b924e..0aa60f0a8 100644 --- a/website/source/docs/commands/deployment/pause.html.md.erb +++ b/website/source/docs/commands/deployment/pause.html.md.erb @@ -15,12 +15,12 @@ deployment. ## Usage -``` +```plaintext nomad deployment pause [options] ``` The `deployment pause` command requires a single argument, a deployment ID or -prefix. +prefix. ## General Options @@ -28,13 +28,13 @@ prefix. ## Pause Options -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Manually pause a deployment: -``` +```shell $ nomad deployment pause 2f14ba55 Deployment "2f14ba55-acfb-cb31-821c-facf1b9b0830" paused ``` diff --git a/website/source/docs/commands/deployment/promote.html.md.erb b/website/source/docs/commands/deployment/promote.html.md.erb index d3d42b316..3efcd120a 100644 --- a/website/source/docs/commands/deployment/promote.html.md.erb +++ b/website/source/docs/commands/deployment/promote.html.md.erb @@ -14,12 +14,12 @@ and those canaries have been deemed healthy. When a task group is promoted, the rolling upgrade of the remaining allocations is unblocked. If the canaries are found to be unhealthy, the deployment may either be failed using the "nomad deployment fail" command, the job can be failed forward by submitting a new -version or failed backwards by reverting to an older version using the [`job -revert`](/docs/commands/job/revert.html) command. +version or failed backwards by reverting to an older version using the +[`job revert`] command. ## Usage -``` +```plaintext nomad deployment promote [options] ``` @@ -34,21 +34,21 @@ select particular groups to promote. ## Promote Options -* `-group`: Group may be specified many times and is used to promote that +- `-group`: Group may be specified many times and is used to promote that particular group. If no specific groups are specified, all groups are promoted. -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Promote canaries in all groups: -``` +```shell # Have two task groups waiting for promotion. $ nomad status example ID = example @@ -136,7 +136,7 @@ f2409f7d a8dcce2d web 0 stop complete 07/25/17 18:31:34 UT Promote canaries in a particular group: -``` +```shell # Have two task groups waiting for promotion. $ nomad status example ID = example @@ -219,3 +219,6 @@ cee52788 6240eed6 web 0 run running 07/25/17 18:37:08 UT ee8f972e 6240eed6 web 0 run running 07/25/17 18:37:08 UTC 0ee7800c 6240eed6 cache 0 stop complete 07/25/17 18:37:08 UTC ``` + +[`job revert`]: /docs/commands/job/revert.html +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/deployment/resume.html.md.erb b/website/source/docs/commands/deployment/resume.html.md.erb index db59c4f5a..347f5d7dd 100644 --- a/website/source/docs/commands/deployment/resume.html.md.erb +++ b/website/source/docs/commands/deployment/resume.html.md.erb @@ -14,12 +14,12 @@ rolling deployment. ## Usage -``` +```plaintext nomad deployment resume [options] ``` The `deployment resume` command requires a single argument, a deployment ID or -prefix. +prefix. ## General Options @@ -27,17 +27,17 @@ prefix. ## Resume Options -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Manually resume a deployment: -``` +```shell $ nomad deployment resume c848972e Deployment "c848972e-dcd3-7354-e0d2-39d86642cdb1" resumed @@ -50,3 +50,5 @@ Deployment "c848972e-dcd3-7354-e0d2-39d86642cdb1" resumed Evaluation status changed: "pending" -> "complete" ==> Evaluation "5e266d42" finished with status "complete" ``` + +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/deployment/status.html.md.erb b/website/source/docs/commands/deployment/status.html.md.erb index 5990d5dc6..9f362f79d 100644 --- a/website/source/docs/commands/deployment/status.html.md.erb +++ b/website/source/docs/commands/deployment/status.html.md.erb @@ -10,16 +10,16 @@ description: > The `deployment status` command is used to display the status of a deployment. The status will display the number of desired changes as well as the currently -applied changes. +applied changes. ## Usage -``` +```plaintext nomad deployment status [options] ``` The `deployment status` command requires a single argument, a deployment ID or -prefix. +prefix. ## General Options @@ -27,17 +27,15 @@ prefix. ## Status Options -* `-json` : Output the deployment in its JSON format. - -* `-t` : Format and display the deployment using a Go template. - -* `-verbose`: Show full information. +- `-json` : Output the deployment in its JSON format. +- `-t` : Format and display the deployment using a Go template. +- `-verbose`: Show full information. ## Examples Inspect the status of a complete deployment: -``` +```shell $ nomad deployment status 06ca68a2 ID = 06ca68a2 Job ID = example @@ -53,7 +51,7 @@ web 2 2 2 0 Inspect the status of a deployment that is waiting for canary promotion: -``` +```shell $ nomad deployment status 0b ID = 0b23b149 Job ID = example diff --git a/website/source/docs/commands/eval-status.html.md.erb b/website/source/docs/commands/eval-status.html.md.erb index b28ee5ab3..87463ccff 100644 --- a/website/source/docs/commands/eval-status.html.md.erb +++ b/website/source/docs/commands/eval-status.html.md.erb @@ -20,7 +20,7 @@ evaluation reaches a terminal state. ## Usage -``` +```plaintext nomad eval status [options] ``` @@ -44,19 +44,16 @@ indicated by exit code 1. ## Eval Status Options -* `-monitor`: Monitor an outstanding evaluation - -* `-verbose`: Show full information. - -* `-json` : Output the evaluation in its JSON format. - -* `-t` : Format and display evaluation using a Go template. +- `-monitor`: Monitor an outstanding evaluation +- `-verbose`: Show full information. +- `-json` : Output the evaluation in its JSON format. +- `-t` : Format and display evaluation using a Go template. ## Examples Show the status of an evaluation that has placement failures -``` +```shell $ nomad eval status 2ae0e6a5 ID = 2ae0e6a5 Status = complete @@ -78,7 +75,7 @@ Evaluation "67493a64" waiting for additional capacity to place remainder Monitor an existing evaluation -``` +```shell $ nomad eval status -monitor 8262bc83 ==> Monitoring evaluation "8262bc83" Allocation "bd6bd0de" created: node "6f299da5", group "group1" diff --git a/website/source/docs/commands/index.html.md.erb b/website/source/docs/commands/index.html.md similarity index 95% rename from website/source/docs/commands/index.html.md.erb rename to website/source/docs/commands/index.html.md index b25db2bca..6732f952f 100644 --- a/website/source/docs/commands/index.html.md.erb +++ b/website/source/docs/commands/index.html.md @@ -10,7 +10,7 @@ description: > # Nomad Commands (CLI) Nomad is controlled via a very easy to use command-line interface (CLI). -Nomad is only a single command-line application: `nomad`, which +Nomad is only a single command-line application: `nomad`, which takes a subcommand such as "agent" or "status". The complete list of subcommands is in the navigation to the left. @@ -25,17 +25,17 @@ with the `-h` argument. Each command has been conveniently documented on this website. Links to each command can be found on the left. -### Autocomplete +## Autocomplete Nomad's CLI supports command autocomplete. Autocomplete can be installed or uninstalled by running the following on bash or zsh shells: -``` +```shell $ nomad -autocomplete-install $ nomad -autocomplete-uninstall ``` -### Command Contexts +## Command Contexts Nomad's CLI commands have implied contexts in their naming convention. Because the CLI is most commonly used to manipulate or query jobs, you can assume that @@ -55,7 +55,7 @@ local machine does not have a running Nomad agent. To do so, set the `NOMAD_ADDR` environment variable or use the `-address=` flag when running commands. -``` +```shell $ NOMAD_ADDR=https://remote-address:4646 nomad status $ nomad status -address=https://remote-address:4646 ``` diff --git a/website/source/docs/commands/job.html.md.erb b/website/source/docs/commands/job.html.md similarity index 68% rename from website/source/docs/commands/job.html.md.erb rename to website/source/docs/commands/job.html.md index acaccf7a1..462b7e160 100644 --- a/website/source/docs/commands/job.html.md.erb +++ b/website/source/docs/commands/job.html.md @@ -7,7 +7,7 @@ description: > --- # Command: job - + The `job` command is used to interact with jobs. ## Usage @@ -17,13 +17,13 @@ Usage: `nomad job [options]` Run `nomad job -h` for help on that subcommand. The following subcommands are available: -* [`job deployments`][deployments] - List deployments for a job -* [`job dispatch`][dispatch] - Dispatch an instance of a parameterized job -* [`job eval`][eval] - Force an evaluation for a job -* [`job history`][history] - Display all tracked versions of a job -* [`job promote`][promote] - Promote a job's canaries -* [`job revert`][revert] - Revert to a prior version of the job -* [`job status`][status] - Display status information about a job +- [`job deployments`][deployments] - List deployments for a job +- [`job dispatch`][dispatch] - Dispatch an instance of a parameterized job +- [`job eval`][eval] - Force an evaluation for a job +- [`job history`][history] - Display all tracked versions of a job +- [`job promote`][promote] - Promote a job's canaries +- [`job revert`][revert] - Revert to a prior version of the job +- [`job status`][status] - Display status information about a job [deployments]: /docs/commands/job/deployments.html "List deployments for a job" [dispatch]: /docs/commands/job/dispatch.html "Dispatch an instance of a parameterized job" diff --git a/website/source/docs/commands/job/deployments.html.md.erb b/website/source/docs/commands/job/deployments.html.md.erb index 96e3264a3..c2919e31a 100644 --- a/website/source/docs/commands/job/deployments.html.md.erb +++ b/website/source/docs/commands/job/deployments.html.md.erb @@ -13,12 +13,12 @@ particular job. ## Usage -``` +```plaintext nomad job deployments [options] ``` -The `job deployments` command requires a single argument, the job ID or an ID prefix -of a job to display the list of deployments for. +The `job deployments` command requires a single argument, the job ID or an ID +prefix of a job to display the list of deployments for. ## General Options @@ -26,25 +26,24 @@ of a job to display the list of deployments for. ## Deployment Options -* `-latest`: Display the latest deployment only. +- `-latest`: Display the latest deployment only. -* `-json` : Output the deployment in its JSON format. +- `-json` : Output the deployment in its JSON format. -* `-t` : Format and display the deployment using a Go template. +- `-t` : Format and display the deployment using a Go template. -* `-verbose`: Show full information. +- `-verbose`: Show full information. -* `-all`: Display all deployments matching the job ID, even those from an - older instance of the job. +- `-all`: Display all deployments matching the job ID, even those from an + older instance of the job. ## Examples List the deployment for a particular job: -``` +```shell $ nomad job deployments example ID Job ID Job Version Status Description 0b23b149 example 1 running Deployment is running but requires manual promotion 06ca68a2 example 0 successful Deployment completed successfully ``` - diff --git a/website/source/docs/commands/job/dispatch.html.md.erb b/website/source/docs/commands/job/dispatch.html.md.erb index dcd8410f1..0a16db2fa 100644 --- a/website/source/docs/commands/job/dispatch.html.md.erb +++ b/website/source/docs/commands/job/dispatch.html.md.erb @@ -20,7 +20,7 @@ programming languages. ## Usage -``` +```plaintext nomad job dispatch [options] [input source] ``` @@ -46,24 +46,24 @@ client connection issues or internal errors, are indicated by exit code 1. ## Dispatch Options -* `-meta`: Meta takes a key/value pair separated by "=". The metadata key will +- `-meta`: Meta takes a key/value pair separated by "=". The metadata key will be merged into the job's metadata. The job may define a default value for the key which is overridden when dispatching. The flag can be provided more than once to inject multiple metadata key/value pairs. Arbitrary keys are not allowed. The parameterized job must allow the key to be merged. -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Dispatch against a parameterized job with the ID "video-encode" and passing in a configuration payload via stdin: -``` +```shell $ cat << EOF | nomad job dispatch video-encode - { "s3-input": "https://video-bucket.s3-us-west-1.amazonaws.com/cb31dabb1", @@ -86,7 +86,7 @@ Evaluation ID = 31199841 Dispatch against a parameterized job with the ID "video-encode" and passing in a configuration payload via a file: -``` +```shell $ nomad job dispatch video-encode video-config.json Dispatched Job ID = video-encode/dispatch-1485379325-cb38d00d Evaluation ID = 31199841 @@ -101,10 +101,11 @@ Evaluation ID = 31199841 Dispatch against a parameterized job with the ID "video-encode" using the detach flag: -``` +```shell $ nomad job dispatch -detach video-encode video-config.json Dispatched Job ID = example/dispatch-1485380684-c37b3dba Evaluation ID = d9034c4e ``` +[eval status]: /docs/commands/eval-status.html [parameterized job]: /docs/job-specification/parameterized.html "Nomad parameterized Job Specification" diff --git a/website/source/docs/commands/job/eval.html.md.erb b/website/source/docs/commands/job/eval.html.md.erb index 8ede561c1..ae1c37adc 100644 --- a/website/source/docs/commands/job/eval.html.md.erb +++ b/website/source/docs/commands/job/eval.html.md.erb @@ -8,17 +8,18 @@ description: > # Command: job eval -The `job eval` command is used to force an evaluation of a job, given the job ID. +The `job eval` command is used to force an evaluation of a job, given the job +ID. ## Usage -``` +```plaintext nomad job eval [options] ``` -The `job eval` command requires a single argument, specifying the job ID to evaluate. -If there is an exact match based on the provided job ID, then -the job will be evaluated, forcing a scheduler run. +The `job eval` command requires a single argument, specifying the job ID to +evaluate. If there is an exact match based on the provided job ID, then the job +will be evaluated, forcing a scheduler run. ## General Options @@ -26,22 +27,23 @@ the job will be evaluated, forcing a scheduler run. ## Eval Options -* `-force-reschedule`: `force-reschedule` is used to force placement of failed allocations. -If this is set, failed allocations that are past their reschedule limit, and those that are -scheduled to be replaced at a future time are placed immediately. This option only places failed -allocations if the task group has rescheduling enabled. +- `-force-reschedule`: `force-reschedule` is used to force placement of failed + allocations. If this is set, failed allocations that are past their reschedule + limit, and those that are scheduled to be replaced at a future time are placed + immediately. This option only places failed allocations if the task group has + rescheduling enabled. -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command. -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Evaluate the job with ID "job1": -``` +```shell $ nomad job eval job1 ==> Monitoring evaluation "0f3bc0f3" Evaluation triggered by job "test" @@ -52,18 +54,20 @@ $ nomad job eval job1 Evaluate the job with ID "job1" and return immediately: -``` +```shell $ nomad job eval -detach job1 Created eval ID: "4947e728" ``` Evaluate the job with ID "job1", and reschedule any eligible failed allocations: -``` +```shell $ nomad job eval -force-reschedule job1 ==> Monitoring evaluation "0f3bc0f3" Evaluation triggered by job "test" Evaluation within deployment: "51baf5c8" Evaluation status changed: "pending" -> "complete" ==> Evaluation "0f3bc0f3" finished with status "complete" -``` \ No newline at end of file +``` + +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/job/history.html.md.erb b/website/source/docs/commands/job/history.html.md.erb index 1ff827d21..4bf68561b 100644 --- a/website/source/docs/commands/job/history.html.md.erb +++ b/website/source/docs/commands/job/history.html.md.erb @@ -15,7 +15,7 @@ versions to revert to. ## Usage -``` +```plaintext nomad job history [options] ``` @@ -28,21 +28,17 @@ of a job to display the history for. ## History Options -* `-p`: Display the differences between each job and its predecessor. - -* `-full`: Display the full job definition for each version. - -* `-version`: Display only the history for the given version. - -* `-json` : Output the job versions in its JSON format. - -* `-t` : Format and display the job versions using a Go template. +- `-p`: Display the differences between each job and its predecessor. +- `-full`: Display the full job definition for each version. +- `-version`: Display only the history for the given version. +- `-json` : Output the job versions in its JSON format. +- `-t` : Format and display the job versions using a Go template. ## Examples Display the history showing differences between versions: -``` +```shell $ nomad job history -p e Version = 2 Stable = false @@ -73,7 +69,7 @@ Submit Date = 07/25/17 20:35:28 UTC Display the memory ask across submitted job versions: -``` +```shell $ nomad job history -t "{{range .}}\ v{{.Version}}: {{with index .TaskGroups 0}}{{with index .Tasks 0}}{{.Resources.MemoryMB}}{{end}}{{end}}\ diff --git a/website/source/docs/commands/job/init.html.md.erb b/website/source/docs/commands/job/init.html.md.erb index 4603773fb..2973c8ada 100644 --- a/website/source/docs/commands/job/init.html.md.erb +++ b/website/source/docs/commands/job/init.html.md.erb @@ -7,27 +7,35 @@ description: > --- # Command: job init + **Alias: `nomad init`** The `job init` command creates an example [job specification][jobspec] in the current directory that demonstrates some common configurations for tasks, task groups, runtime constraints, and resource allocation. -Please refer to the [jobspec][] and [drivers](/docs/drivers/index.html) -pages to learn how to customize the template. +Please refer to the [jobspec] and [drivers] pages to learn how to customize the +template. + +## Usage + +```plaintext +nomad job init [options] +``` ## Init Options - * `-short`: If set, a minimal jobspec without comments is emitted. - * `-connect`: If set, the jobspec includes Consul Connect integration. +- `-short`: If set, a minimal jobspec without comments is emitted. +- `-connect`: If set, the jobspec includes Consul Connect integration. ## Examples Generate an example job file: -```text +```shell $ nomad job init Example job file written to example.nomad ``` [jobspec]: /docs/job-specification/index.html "Nomad Job Specification" +[drivers]: /docs/drivers/index.html diff --git a/website/source/docs/commands/job/inspect.html.md.erb b/website/source/docs/commands/job/inspect.html.md.erb index abe842e44..4dff74483 100644 --- a/website/source/docs/commands/job/inspect.html.md.erb +++ b/website/source/docs/commands/job/inspect.html.md.erb @@ -7,20 +7,21 @@ description: > --- # Command: job inspect + **Alias: `nomad inspect`** The `job inspect` command is used to inspect the content of a submitted job. ## Usage -``` +```plaintext nomad job inspect [options] ``` The `job inspect` command requires a single argument, a submitted job's name, and will retrieve the JSON version of the job. This JSON is valid to be submitted to -the [Job HTTP API](/api/jobs.html). This command is useful to inspect what -version of a job Nomad is running. +the [Job HTTP API]. This command is useful to inspect what version of a job +Nomad is running. ## General Options @@ -28,17 +29,15 @@ version of a job Nomad is running. ## Inspect Options -* `-version`: Display only the job at the given job version. - -* `-json` : Output the job in its JSON format. - -* `-t` : Format and display the job using a Go template. +- `-version`: Display only the job at the given job version. +- `-json` : Output the job in its JSON format. +- `-t` : Format and display the job using a Go template. ## Examples Inspect a submitted job: -``` +```shell $ nomad job inspect redis { "Job": { @@ -153,3 +152,5 @@ $ nomad job inspect redis } } ``` + +[Job HTTP API]: /api/jobs.html diff --git a/website/source/docs/commands/job/periodic-force.html.md.erb b/website/source/docs/commands/job/periodic-force.html.md.erb index 106713e7d..b35c9f59e 100644 --- a/website/source/docs/commands/job/periodic-force.html.md.erb +++ b/website/source/docs/commands/job/periodic-force.html.md.erb @@ -8,23 +8,23 @@ description: > # Command: job periodic force -The `job periodic force` command is used to [force the evaluation](/api/jobs.html#force-new-periodic-instance) -of a [periodic job](/docs/job-specification/periodic.html). +The `job periodic force` command is used to [force the evaluation] of a +[periodic job]. ## Usage -``` +```plaintext nomad job periodic force [options] ``` -The `job periodic force` command requires a single argument, specifying the ID of the -job. This job must be a periodic job. This is used to immediately run a periodic job, -even if it violates the job's `prohibit_overlap` setting. +The `job periodic force` command requires a single argument, specifying the ID +of the job. This job must be a periodic job. This is used to immediately run a +periodic job, even if it violates the job's `prohibit_overlap` setting. -By default, on successful job submission the command will enter an -interactive monitor and display log information detailing the scheduling -decisions and placement information for the forced evaluation. The monitor will -exit after scheduling has finished or failed. +By default, on successful job submission the command will enter an interactive +monitor and display log information detailing the scheduling decisions and +placement information for the forced evaluation. The monitor will exit after +scheduling has finished or failed. ## General Options @@ -32,17 +32,17 @@ exit after scheduling has finished or failed. ## Run Options -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command. -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Force the evaluation of the job `example`, monitoring placement: -``` +```shell $ nomad job periodic force example ==> Monitoring evaluation "54b2d6d9" Evaluation triggered by job "example/periodic-1555094493" @@ -54,8 +54,12 @@ $ nomad job periodic force example Force the evaluation of the job `example` and return immediately: -``` +```shell $ nomad job periodic force -detach example Force periodic successful Evaluation ID: 0865fbf3-30de-5f53-0811-821e73e63178 ``` + +[eval status]: /docs/commands/eval-status.html +[force the evaluation]: /api/jobs.html#force-new-periodic-instance +[periodic job]: /docs/job-specification/periodic.html diff --git a/website/source/docs/commands/job/plan.html.md.erb b/website/source/docs/commands/job/plan.html.md.erb index 6b157dc47..4c5b4a710 100644 --- a/website/source/docs/commands/job/plan.html.md.erb +++ b/website/source/docs/commands/job/plan.html.md.erb @@ -7,27 +7,25 @@ description: > --- # Command: job plan + **Alias: `nomad plan`** -The `job plan` command can be used to invoke the scheduler in a dry-run mode with -new jobs or when updating existing jobs to determine what would happen if the -job is submitted. Job files must conform to the [job -specification](/docs/job-specification/index.html) format. +The `job plan` command can be used to invoke the scheduler in a dry-run mode +with new jobs or when updating existing jobs to determine what would happen if +the job is submitted. Job files must conform to the [job specification] format. ## Usage -``` +```plaintext nomad job plan [options] ``` The `job plan` command requires a single argument, specifying the path to a file -containing a [HCL job specification](/docs/job-specification/index.html). This -file will be read and the resulting parsed job will be validated. If the -supplied path is "-", the job file is read from STDIN. Otherwise it is read -from the file at the supplied path or downloaded and read from URL specified. -Nomad downloads the job file using -[`go-getter`](https://github.com/hashicorp/go-getter) -and supports `go-getter` syntax. +containing an HCL [job specification]. This file will be read and the resulting +parsed job will be validated. If the supplied path is "-", the job file is read +from STDIN. Otherwise it is read from the file at the supplied path or +downloaded and read from URL specified. Nomad downloads the job file using +[`go-getter`] and supports `go-getter` syntax. Plan invokes a dry-run of the scheduler to determine the effects of submitting either a new or updated version of a job. The plan will not result in any @@ -35,9 +33,8 @@ changes to the cluster but gives insight into whether the job could be run successfully and how it would affect existing allocations. A job modify index is returned with the plan. This value can be used when -submitting the job using [`nomad job run --check-index`](/docs/commands/job/run.html#check-index), which will check that the -job was not modified between the plan and run command before invoking the +submitting the job using [`nomad job run -check-index`], which will check that +the job was not modified between the plan and run command before invoking the scheduler. This ensures the job has not been modified since the plan. A structured diff between the local and remote job is displayed to @@ -48,9 +45,9 @@ environment variable are overridden and the job's region is used. Plan will return one of the following exit codes: - * 0: No allocations created or destroyed. - * 1: Allocations created or destroyed. - * 255: Error determining plan results. +- 0: No allocations created or destroyed. +- 1: Allocations created or destroyed. +- 255: Error determining plan results. ## General Options @@ -58,18 +55,19 @@ Plan will return one of the following exit codes: ## Plan Options -* `-diff`: Determines whether the diff between the remote job and planned job is +- `-diff`: Determines whether the diff between the remote job and planned job is shown. Defaults to true. -* `-policy-override`: Sets the flag to force override any soft mandatory Sentinel policies. +- `-policy-override`: Sets the flag to force override any soft mandatory + Sentinel policies. -* `-verbose`: Increase diff verbosity. +- `-verbose`: Increase diff verbosity. ## Examples Plan a new job that has not been previously submitted: -``` +```shell $ nomad job plan job1.nomad nomad job plan example.nomad + Job: "example" @@ -90,10 +88,9 @@ changed, another user has modified the job and the plan's results are potentially invalid. ``` - Increase the count of an existing without sufficient cluster capacity: -``` +```shell $ nomad job plan example.nomad +/- Job: "example" +/- Task Group: "cache" (7 create, 1 in-place update) @@ -119,7 +116,7 @@ potentially invalid. Update an existing job such that it would cause a rolling update: -``` +```shell $ nomad job plan example.nomad +/- Job: "example" +/- Task Group: "cache" (3 create/destroy update) @@ -146,7 +143,7 @@ potentially invalid. Add a task to the task group using verbose mode: -``` +```shell $ nomad job plan -verbose example.nomad +/- Job: "example" +/- Task Group: "cache" (3 create/destroy update) @@ -201,3 +198,8 @@ server side version matches the job modify index returned. If the index has changed, another user has modified the job and the plan's results are potentially invalid. ``` + +[job specification]: /docs/job-specification/index.html +[HCL job specification]: /docs/job-specification/index.html +[`go-getter`]: https://github.com/hashicorp/go-getter +[`nomad job run -check-index`] :/docs/commands/job/run.html#check-index diff --git a/website/source/docs/commands/job/promote.html.md.erb b/website/source/docs/commands/job/promote.html.md.erb index df19080ee..9d2c0d411 100644 --- a/website/source/docs/commands/job/promote.html.md.erb +++ b/website/source/docs/commands/job/promote.html.md.erb @@ -15,11 +15,11 @@ When a task group is promoted, the rolling upgrade of the remaining allocations is unblocked. If the canaries are found to be unhealthy, the deployment may either be failed using the "nomad deployment fail" command, the job can be failed forward by submitting a new version or failed backwards by reverting to -an older version using the [job revert](/docs/commands/job/revert.html) command. +an older version using the [job revert] command. ## Usage -``` +```plaintext nomad job promote [options] ``` @@ -34,21 +34,21 @@ select particular groups to promote. ## Promote Options -* `-group`: Group may be specified many times and is used to promote that +- `-group`: Group may be specified many times and is used to promote that particular group. If no specific groups are specified, all groups are promoted. -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command. -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Promote canaries in all groups: -``` +```shell # Have two task groups waiting for promotion. $ nomad status example ID = example @@ -136,7 +136,7 @@ f2409f7d a8dcce2d web 0 stop complete 07/25/17 18:31:34 UT Promote canaries in a particular group: -``` +```shell # Have two task groups waiting for promotion. $ nomad status example ID = example @@ -219,3 +219,6 @@ cee52788 6240eed6 web 0 run running 07/25/17 18:37:08 UT ee8f972e 6240eed6 web 0 run running 07/25/17 18:37:08 UTC 0ee7800c 6240eed6 cache 0 stop complete 07/25/17 18:37:08 UTC ``` + +[job revert]: /docs/commands/job/revert.html +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/job/revert.html.md.erb b/website/source/docs/commands/job/revert.html.md.erb index dc44b3e75..a42812577 100644 --- a/website/source/docs/commands/job/revert.html.md.erb +++ b/website/source/docs/commands/job/revert.html.md.erb @@ -9,25 +9,24 @@ description: > # Command: job revert The `job revert` command is used to revert a job to a prior version of the -job. The available versions to revert to can be found using [`job -history`](/docs/commands/job/history.html) command. +job. The available versions to revert to can be found using [`job history`] +command. The revert command will use a Vault token with the following preference: first the `-vault-token` flag, then the `$VAULT_TOKEN` environment variable. -Because the vault token used to [run](/docs/commands/job/run.html) the targeted -job version was not persisted, it must be provided to revert if the targeted -job version includes Vault policies and the Nomad servers were -[configured](/docs/configuration/vault.html#allow_unauthenticated) -to require authentication. +Because the vault token used to [run] the targeted job version was not +persisted, it must be provided to revert if the targeted job version includes +Vault policies and the Nomad servers were configured to +[require authentication]. ## Usage -``` +```plaintext nomad job revert [options] ``` -The `job revert` command requires two inputs, the job ID and the version of that job -to revert to. +The `job revert` command requires two inputs, the job ID and the version of that +job to revert to. ## General Options @@ -35,21 +34,21 @@ to revert to. ## Revert Options -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command. -* `-vault-token`: If set, the passed Vault token is sent along with the revert request - to the Nomad servers. This overrides the token found in the $VAULT_TOKEN environment - variable. +- `-vault-token`: If set, the passed Vault token is sent along with the revert + request to the Nomad servers. This overrides the token found in the + $VAULT_TOKEN environment variable. -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Revert to an older version of a job: -``` +```shell $ nomad job history -p example Version = 1 Stable = false @@ -104,3 +103,8 @@ Version = 0 Stable = false Submit Date = 07/25/17 21:27:18 UTC ``` + +[`job history`]: /docs/commands/job/history.html +[eval status]: /docs/commands/eval-status.html +[require authentication]: /docs/configuration/vault.html#allow_unauthenticated +[run]: /docs/commands/job/run.html diff --git a/website/source/docs/commands/job/run.html.md.erb b/website/source/docs/commands/job/run.html.md.erb index 9764db294..d9fad43ae 100644 --- a/website/source/docs/commands/job/run.html.md.erb +++ b/website/source/docs/commands/job/run.html.md.erb @@ -7,25 +7,24 @@ description: > --- # Command: job run + **Alias: `nomad run`** The `job run` command is used to submit new jobs to Nomad or to update existing -jobs. Job files must conform to the [job specification](/docs/job-specification/index.html) -format. +jobs. Job files must conform to the [job specification] format. ## Usage -``` +```plaintext nomad job run [options] ``` The `job run` command requires a single argument, specifying the path to a file -containing a valid [job specification](/docs/job-specification/index.html). This file -will be read and the job will be submitted to Nomad for scheduling. If the -supplied path is "-", the job file is read from STDIN. Otherwise it is read -from the file at the supplied path or downloaded and read from URL specified. -Nomad downloads the job file using [`go-getter`](https://github.com/hashicorp/go-getter) -and supports `go-getter` syntax. +containing a valid [job specification]. This file will be read and the job will +be submitted to Nomad for scheduling. If the supplied path is "-", the job file +is read from STDIN. Otherwise it is read from the file at the supplied path or +downloaded and read from URL specified. Nomad downloads the job file using +[`go-getter`] and supports `go-getter` syntax. By default, on successful job submission the run command will enter an interactive monitor and display log information detailing the scheduling @@ -50,34 +49,35 @@ precedence, going from highest to lowest: the `-vault-token` flag, the ## Run Options -* `-check-index`: If set, the job is only registered or +- `-check-index`: If set, the job is only registered or updated if the passed job modify index matches the server side version. If a check-index value of zero is passed, the job is only registered if it does not yet exist. If a non-zero value is passed, it ensures that the job is being updated from a known state. The use of this flag is most common in conjunction - with [`job plan` command](/docs/commands/job/plan.html). + with [`job plan` command]. -* `-detach`: Return immediately instead of monitoring. A new evaluation ID +- `-detach`: Return immediately instead of monitoring. A new evaluation ID will be output, which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command + [eval status] command. -* `-output`: Output the JSON that would be submitted to the HTTP API without +- `-output`: Output the JSON that would be submitted to the HTTP API without submitting the job. -* `-policy-override`: Sets the flag to force override any soft mandatory Sentinel policies. +- `-policy-override`: Sets the flag to force override any soft mandatory + Sentinel policies. -* `-vault-token`: If set, the passed Vault token is stored in the job before +- `-vault-token`: If set, the passed Vault token is stored in the job before sending to the Nomad servers. This allows passing the Vault token without storing it in the job file. This overrides the token found in the $VAULT_TOKEN environment variable and that found in the job. -* `-verbose`: Show full information. +- `-verbose`: Show full information. ## Examples Schedule the job contained in the file `job1.nomad`, monitoring placement: -``` +```shell $ nomad job run job1.nomad ==> Monitoring evaluation "52dee78a" Evaluation triggered by job "example" @@ -90,7 +90,7 @@ $ nomad job run job1.nomad Update the job using `check-index`: -``` +```shell $ nomad job run -check-index 5 example.nomad Enforcing job modify index 5: job exists with conflicting job modify index: 6 Job not updated @@ -106,7 +106,7 @@ $ nomad job run -check-index 6 example.nomad Schedule the job contained in `job1.nomad` and return immediately: -``` +```shell $ nomad job run -detach job1.nomad 4947e728 ``` @@ -114,7 +114,7 @@ $ nomad job run -detach job1.nomad Schedule a job which cannot be successfully placed. This results in a scheduling failure and the specifics of the placement are printed: -``` +```shell $ nomad job run failing.nomad ==> Monitoring evaluation "2ae0e6a5" Evaluation triggered by job "example" @@ -125,3 +125,8 @@ $ nomad job run failing.nomad * Constraint "${attr.kernel.name} = linux" filtered 1 nodes Evaluation "67493a64" waiting for additional capacity to place remainder ``` + +[`go-getter`]: https://github.com/hashicorp/go-getter +[`job plan` command]: /docs/commands/job/plan.html +[eval status]: /docs/commands/eval-status.html +[job specification]: /docs/job-specification/index.html diff --git a/website/source/docs/commands/job/status.html.md.erb b/website/source/docs/commands/job/status.html.md.erb index c6315f941..e70c91cfc 100644 --- a/website/source/docs/commands/job/status.html.md.erb +++ b/website/source/docs/commands/job/status.html.md.erb @@ -12,19 +12,20 @@ The `job status` command displays status information for a job. ## Usage -``` +```plaintext nomad job status [options] [job] ``` This command accepts an optional job ID or prefix as the sole argument. If there is an exact match based on the provided job ID or prefix, then information about -the specific job is queried and displayed. Otherwise, a list of matching jobs and -information will be displayed. +the specific job is queried and displayed. Otherwise, a list of matching jobs +and information will be displayed. -If the ID is omitted, the command lists out all of the existing jobs and a few of -the most useful status fields for each. As of Nomad 0.7.1, alloc status also shows allocation -modification time in addition to create time. When the `-verbose` flag is not set, allocation -creation and modify times are shown in a shortened relative time format like `5m ago`. +If the ID is omitted, the command lists out all of the existing jobs and a few +of the most useful status fields for each. As of Nomad 0.7.1, alloc status also +shows allocation modification time in addition to create time. When the +`-verbose` flag is not set, allocation creation and modify times are shown in a +shortened relative time format like `5m ago`. ## General Options @@ -32,21 +33,22 @@ creation and modify times are shown in a shortened relative time format like `5m ## Status Options -* `-all-allocs`: Display all allocations matching the job ID, even those from an +- `-all-allocs`: Display all allocations matching the job ID, even those from an older instance of the job. -* `-evals`: Display the evaluations associated with the job. +- `-evals`: Display the evaluations associated with the job. -* `-short`: Display short output. Used only when a single node is being queried. +- `-short`: Display short output. Used only when a single node is being queried. Drops verbose node allocation data from the output. -* `-verbose`: Show full information. Allocation create and modify times are shown in `yyyy/mm/dd hh:mm:ss` format. +- `-verbose`: Show full information. Allocation create and modify times are + shown in `yyyy/mm/dd hh:mm:ss` format. ## Examples List of all jobs: -``` +```shell $ nomad job status ID Type Priority Status Submit Date job1 service 80 running 07/25/17 15:47:11 UTC @@ -56,7 +58,7 @@ job3 service 50 dead (stopped) 07/22/17 16:34:48 UTC Short view of a specific job: -``` +```shell $ nomad job status -short job1 ID = job1 Name = Test Job @@ -71,7 +73,7 @@ Parameterized = false Full status information of a job: -``` +```shell $ nomad job status example ID = example Name = example @@ -103,7 +105,7 @@ ID Node ID Task Group Version Desired Status Created Modified Full status information of a periodic job: -``` +```shell $ nomad job status example ID = example Name = example @@ -129,7 +131,7 @@ example/periodic-1500998420 running Full status information of a parameterized job: -``` +```shell $ nomad job status example ID = example Name = example @@ -158,7 +160,7 @@ example/dispatch-1485411499-fa2ee40e running Full status information of a job with placement failures: -``` +```shell $ nomad job status example ID = example Name = example @@ -198,9 +200,9 @@ a17b7d3d 3f38ecb4 cache 0 run running 5m ago 5m ago Full status information showing evaluations with a placement failure. The in progress evaluation denotes that Nomad is blocked waiting for resources to -become availables so that it can place the remaining allocations. +become available so that it can place the remaining allocations. -``` +```shell $ nomad job status -evals example ID = example Name = example diff --git a/website/source/docs/commands/job/stop.html.md.erb b/website/source/docs/commands/job/stop.html.md.erb index b44d3ec9a..8abd01ad4 100644 --- a/website/source/docs/commands/job/stop.html.md.erb +++ b/website/source/docs/commands/job/stop.html.md.erb @@ -7,6 +7,7 @@ description: > --- # Command: job stop + **Alias: `nomad stop`** The `job stop` command is used to stop a running job and signals the scheduler @@ -14,14 +15,14 @@ to cancel all of the running allocations. ## Usage -``` +```plaintext nomad job stop [options] ``` -The `job stop` command requires a single argument, specifying the job ID or prefix to -cancel. If there is an exact match based on the provided job ID or prefix, then -the job will be cancelled. Otherwise, a list of matching jobs and information -will be displayed. +The `job stop` command requires a single argument, specifying the job ID or +prefix to cancel. If there is an exact match based on the provided job ID or +prefix, then the job will be cancelled. Otherwise, a list of matching jobs and +information will be displayed. Stop will issue a request to deregister the matched job and then invoke an interactive monitor that exits automatically once the scheduler has processed @@ -33,25 +34,23 @@ the request. It is safe to exit the monitor early using ctrl+c. ## Stop Options -* `-detach`: Return immediately instead of entering monitor mode. After the +- `-detach`: Return immediately instead of entering monitor mode. After the deregister command is submitted, a new evaluation ID is printed to the screen, - which can be used to examine the evaluation using the - [eval status](/docs/commands/eval-status.html) command. + which can be used to examine the evaluation using the [eval status] command. -* `-verbose`: Show full information. +- `-verbose`: Show full information. -* `-yes`: Automatic yes to prompts. +- `-yes`: Automatic yes to prompts. -* `-purge`: Purge is used to stop the job and purge it from the system. If not +- `-purge`: Purge is used to stop the job and purge it from the system. If not set, the job will still be queryable and will be purged by the garbage collector. - ## Examples Stop the job with ID "job1": -``` +```shell $ nomad job stop job1 ==> Monitoring evaluation "43bfe672" Evaluation status changed: "pending" -> "complete" @@ -60,7 +59,9 @@ $ nomad job stop job1 Stop the job with ID "job1" and return immediately: -``` +```shell $ nomad job stop -detach job1 507d26cb ``` + +[eval status]: /docs/commands/eval-status.html diff --git a/website/source/docs/commands/job/validate.html.md.erb b/website/source/docs/commands/job/validate.html.md.erb index 1da8a62c8..2a990fec0 100644 --- a/website/source/docs/commands/job/validate.html.md.erb +++ b/website/source/docs/commands/job/validate.html.md.erb @@ -7,24 +7,24 @@ description: > --- # Command: job validate + **Alias: `nomad validate`** -The `job validate` command is used to check a [HCL job specification](/docs/job-specification/index.html) -for any syntax errors or validation problems. +The `job validate` command is used to check an HCL [job specification] for any +syntax errors or validation problems. ## Usage -``` +```plaintext nomad job validate ``` -The `job validate` command requires a single argument, specifying the path to a file -containing a [HCL job specification](/docs/job-specification/index.html). This file -will be read and the job checked for any problems. If the -supplied path is "-", the job file is read from STDIN. Otherwise it is read -from the file at the supplied path or downloaded and read from URL specified. -Nomad downloads the job file using [`go-getter`](https://github.com/hashicorp/go-getter) -and supports `go-getter` syntax. +The `job validate` command requires a single argument, specifying the path to a +file containing an HCL [job specification]. This file will be read and the job +checked for any problems. If the supplied path is "-", the job file is read from +STDIN. Otherwise it is read from the file at the supplied path or downloaded and +read from URL specified. Nomad downloads the job file using [`go-getter`] and +supports `go-getter` syntax. On successful validation, exit code 0 will be returned, otherwise an exit code of 1 indicates an error. @@ -33,7 +33,7 @@ of 1 indicates an error. Validate a job with invalid syntax: -``` +```shell $ nomad job validate example.nomad Job validation errors: 1 error(s) occurred: @@ -45,7 +45,7 @@ Job validation errors: Validate a job that has a configuration that causes warnings: -``` +```shell $ nomad job validate example.nomad Job Warnings: 1 warning(s): @@ -56,3 +56,6 @@ Job Warnings: Job validation successful ``` + +[`go-getter`]: https://github.com/hashicorp/go-getter +[job specification]: /docs/job-specification/index.html diff --git a/website/source/docs/commands/namespace.html.md.erb b/website/source/docs/commands/namespace.html.md similarity index 75% rename from website/source/docs/commands/namespace.html.md.erb rename to website/source/docs/commands/namespace.html.md index ccb90ebcc..88058718a 100644 --- a/website/source/docs/commands/namespace.html.md.erb +++ b/website/source/docs/commands/namespace.html.md @@ -20,11 +20,11 @@ Usage: `nomad namespace [options]` Run `nomad namespace -h` for help on that subcommand. The following subcommands are available: -* [`namespace apply`][apply] - Create or update a namespace -* [`namespace delete`][delete] - Delete a namespace -* [`namespace inspect`][inspect] - Inspect a namespace -* [`namespace list`][list] - List available namespaces -* [`namespace status`][status] - Display a namespace's status +- [`namespace apply`][apply] - Create or update a namespace +- [`namespace delete`][delete] - Delete a namespace +- [`namespace inspect`][inspect] - Inspect a namespace +- [`namespace list`][list] - List available namespaces +- [`namespace status`][status] - Display a namespace's status [apply]: /docs/commands/namespace/apply.html "Create or update a namespace" [delete]: /docs/commands/namespace/delete.html "Delete a namespace" diff --git a/website/source/docs/commands/namespace/apply.html.md.erb b/website/source/docs/commands/namespace/apply.html.md.erb index c97e64dfb..f05869163 100644 --- a/website/source/docs/commands/namespace/apply.html.md.erb +++ b/website/source/docs/commands/namespace/apply.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad namespace apply [options] ``` @@ -28,15 +28,15 @@ or updated. ## Apply Options -* `-quota` : An optional quota to apply to the namespace. +- `-quota` : An optional quota to apply to the namespace. -* `-description` : An optional human readable description for the namespace. +- `-description` : An optional human readable description for the namespace. ## Examples Create a namespace with a quota -``` -$ nomad namespace apply -description "Prod API servers" -quota prod api-prod +```shell +$ nomad namespace apply -description "Prod API servers" -quota prod api-prod Successfully applied namespace "api-prod"! ``` diff --git a/website/source/docs/commands/namespace/delete.html.md.erb b/website/source/docs/commands/namespace/delete.html.md.erb index 8a16681f7..9d18e5e69 100644 --- a/website/source/docs/commands/namespace/delete.html.md.erb +++ b/website/source/docs/commands/namespace/delete.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad namespace delete [options] ``` @@ -29,7 +29,7 @@ The `namespace delete` command requires the name of the namespace to be deleted. Delete a namespace -``` +```shell $ nomad namespace delete api-prod Successfully deleted namespace "api-prod"! ``` diff --git a/website/source/docs/commands/namespace/inspect.html.md.erb b/website/source/docs/commands/namespace/inspect.html.md.erb index e24ba498b..93fc1263f 100644 --- a/website/source/docs/commands/namespace/inspect.html.md.erb +++ b/website/source/docs/commands/namespace/inspect.html.md.erb @@ -17,7 +17,7 @@ Enterprise. ## Usage -``` +```plaintext nomad namespace inspect [options] ``` @@ -27,13 +27,13 @@ nomad namespace inspect [options] ## Inspect Options -* `-t` : Format and display the namespace using a Go template. +- `-t` : Format and display the namespace using a Go template. ## Examples Inspect a namespace: -``` +```shell $ nomad namespace inspect default { "CreateIndex": 5, diff --git a/website/source/docs/commands/namespace/list.html.md.erb b/website/source/docs/commands/namespace/list.html.md.erb index e5dc1d7ee..430d2d618 100644 --- a/website/source/docs/commands/namespace/list.html.md.erb +++ b/website/source/docs/commands/namespace/list.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad namespace list [options] ``` @@ -27,15 +27,15 @@ The `namespace list` command requires no arguments. ## List Options -* `-json` : Output the namespaces in their JSON format. +- `-json` : Output the namespaces in their JSON format. -* `-t` : Format and display the namespaces using a Go template. +- `-t` : Format and display the namespaces using a Go template. ## Examples List all namespaces: -``` +```shell $ nomad namespace list Name Description default Default shared namespace diff --git a/website/source/docs/commands/namespace/status.html.md.erb b/website/source/docs/commands/namespace/status.html.md.erb index ce26d90ec..9c7490336 100644 --- a/website/source/docs/commands/namespace/status.html.md.erb +++ b/website/source/docs/commands/namespace/status.html.md.erb @@ -17,7 +17,7 @@ Enterprise. ## Usage -``` +```plaintext nomad namespace status [options] ``` @@ -29,7 +29,7 @@ nomad namespace status [options] View the status of a namespace: -``` +```shell $ nomad namespace status default Name = default Description = Default shared namespace diff --git a/website/source/docs/commands/node.html.md.erb b/website/source/docs/commands/node.html.md similarity index 72% rename from website/source/docs/commands/node.html.md.erb rename to website/source/docs/commands/node.html.md index 658bb45dc..1e37b55df 100644 --- a/website/source/docs/commands/node.html.md.erb +++ b/website/source/docs/commands/node.html.md @@ -7,7 +7,7 @@ description: > --- # Command: node - + The `node` command is used to interact with nodes. ## Usage @@ -17,10 +17,14 @@ Usage: `nomad node [options]` Run `nomad node -h` for help on that subcommand. The following subcommands are available: -* [`node config`][config] - View or modify client configuration details -* [`node drain`][drain] - Set drain mode on a given node -* [`node eligibility`][eligibility] - Toggle scheduling eligibility on a given node -* [`node status`][status] - Display status information about nodes +- [`node config`][config] - View or modify client configuration details + +- [`node drain`][drain] - Set drain mode on a given node + +- [`node eligibility`][eligibility] - Toggle scheduling eligibility on a given + node + +- [`node status`][status] - Display status information about nodes [config]: /docs/commands/node/config.html "View or modify client configuration details" [drain]: /docs/commands/node/drain.html "Set drain mode on a given node" diff --git a/website/source/docs/commands/node/config.html.md.erb b/website/source/docs/commands/node/config.html.md.erb index f81b88d55..aad7a761c 100644 --- a/website/source/docs/commands/node/config.html.md.erb +++ b/website/source/docs/commands/node/config.html.md.erb @@ -14,7 +14,7 @@ the running client configurations it supports. ## Usage -``` +```plaintext nomad node config [options] ``` @@ -27,13 +27,12 @@ description below for specific usage information and requirements. ## Node Config Options -* `-servers`: List the client's known servers. Client nodes do not participate +- `-servers`: List the client's known servers. Client nodes do not participate in the gossip pool, and instead register with these servers periodically over the network. The initial value of this list may come from configuration files - using the [`servers`](/docs/configuration/client.html#servers) - configuration option in the client block. + using the [`servers`] configuration option in the client block. -* `-update-servers`: Updates the client's server list using the provided +- `-update-servers`: Updates the client's server list using the provided arguments. Multiple server addresses may be passed using multiple arguments. When updating the servers list, you must specify ALL of the server nodes you wish to configure. The set is updated atomically. It is an error to specify @@ -44,7 +43,7 @@ description below for specific usage information and requirements. Query the currently known servers: -``` +```shell $ nomad node config -servers server1:4647 server2:4647 @@ -52,6 +51,8 @@ server2:4647 Update the list of servers: -``` +```shell $ nomad node config -update-servers server1:4647 server2:4647 server3:4647 server4 ``` + +[`servers`]: /docs/configuration/client.html#servers diff --git a/website/source/docs/commands/node/drain.html.md.erb b/website/source/docs/commands/node/drain.html.md.erb index e26fb1b5c..e196f35f3 100644 --- a/website/source/docs/commands/node/drain.html.md.erb +++ b/website/source/docs/commands/node/drain.html.md.erb @@ -25,15 +25,14 @@ eligibility -disable` on all of their node IDs, and then run `node drain -enable`. This will ensure allocations drained from the first node are not placed on another node about to be drained. -The [node status](/docs/commands/node/status.html) command compliments this -nicely by providing the current drain status of a given node. +The [node status] command compliments this nicely by providing the current drain +status of a given node. -See the [Workload Migration guide](/guides/operations/node-draining.html) for detailed -examples of node draining. +See the [Workload Migration guide] for detailed examples of node draining. ## Usage -``` +```plaintext nomad node drain [options] ``` @@ -51,30 +50,40 @@ operation is desired. ## Drain Options -* `-enable`: Enable node drain mode. -* `-disable`: Disable node drain mode. -* `-deadline`: Set the deadline by which all allocations must be moved off the +- `-enable`: Enable node drain mode. + +- `-disable`: Disable node drain mode. + +- `-deadline`: Set the deadline by which all allocations must be moved off the node. Remaining allocations after the deadline are force removed from the node. Defaults to 1 hour. -* `-detach`: Return immediately instead of entering monitor mode. -* `-monitor`: Enter monitor mode directly without modifying the drain status. -* `-force`: Force remove allocations off the node immediately. -* `-no-deadline`: No deadline allows the allocations to drain off the node + +- `-detach`: Return immediately instead of entering monitor mode. + +- `-monitor`: Enter monitor mode directly without modifying the drain status. + +- `-force`: Force remove allocations off the node immediately. + +- `-no-deadline`: No deadline allows the allocations to drain off the node without being force stopped after a certain deadline. -* `-ignore-system`: Ignore system allows the drain to complete without stopping + +- `-ignore-system`: Ignore system allows the drain to complete without stopping system job allocations. By default system jobs are stopped last. -* `-keep-ineligible`: Keep ineligible will maintain the node's scheduling + +- `-keep-ineligible`: Keep ineligible will maintain the node's scheduling ineligibility even if the drain is being disabled. This is useful when an existing drain is being cancelled but additional scheduling on the node is not desired. -* `-self`: Drain the local node. -* `-yes`: Automatic yes to prompts. + +- `-self`: Drain the local node. + +- `-yes`: Automatic yes to prompts. ## Examples Enable drain mode on node with ID prefix "4d2ba53b": -``` +```shell $ nomad node drain -enable f4e8a9e5 Are you sure you want to enable drain mode for node "f4e8a9e5-30d8-3536-1e6f-cda5c869c35e"? [y/N] y 2018-03-30T23:13:16Z: Ctrl-C to stop monitoring: will not cancel the node drain @@ -94,14 +103,14 @@ Are you sure you want to enable drain mode for node "f4e8a9e5-30d8-3536-1e6f-cda Enable drain mode on the local node: -``` +```shell $ nomad node drain -enable -self ... ``` Enable drain mode but do not stop system jobs: -``` +```shell $ nomad node drain -enable -ignore-system 4d2ba53b ... ``` @@ -110,14 +119,14 @@ Disable drain mode but keep the node ineligible for scheduling. Useful for inspecting the current state of a misbehaving node without Nomad trying to start or migrate allocations: -``` +```shell $ nomad node drain -disable -keep-ineligible 4d2ba53b ... ``` Enable drain mode and detach from monitoring, then reattach later: -``` +```shell $ nomad node drain -enable -detach -self ... $ nomad node drain -self -monitor @@ -126,3 +135,5 @@ $ nomad node drain -self -monitor [eligibility]: /docs/commands/node/eligibility.html [migrate]: /docs/job-specification/migrate.html +[node status]: /docs/commands/node/status.html +[Workload Migration guide]: /guides/operations/node-draining.html diff --git a/website/source/docs/commands/node/eligibility.html.md.erb b/website/source/docs/commands/node/eligibility.html.md.erb index 7917bbbc5..a47a4444a 100644 --- a/website/source/docs/commands/node/eligibility.html.md.erb +++ b/website/source/docs/commands/node/eligibility.html.md.erb @@ -28,7 +28,7 @@ without the risk of additional work being assigned to it. ## Usage -``` +```plaintext nomad node eligibility [options] ``` @@ -46,26 +46,25 @@ operation is desired. ## Drain Options -* `-enable`: Enable scheduling eligbility. -* `-disable`: Disable scheduling eligibility. -* `-self`: Set eligibility for the local node. -* `-yes`: Automatic yes to prompts. +- `-enable`: Enable scheduling eligibility. +- `-disable`: Disable scheduling eligibility. +- `-self`: Set eligibility for the local node. +- `-yes`: Automatic yes to prompts. ## Examples Enable scheduling eligibility on node with ID prefix "574545c5": -``` +```shell $ nomad node eligibility -enable 574545c5 Node "574545c5-c2d7-e352-d505-5e2cb9fe169f" scheduling eligibility set: eligible for scheduling ``` Disable scheduling eligibility on the local node: -``` +```shell $ nomad node eligibility -disable -self Node "574545c5-c2d7-e352-d505-5e2cb9fe169f" scheduling eligibility set: ineligible for scheduling ``` - [drain]: /docs/commands/node/drain.html diff --git a/website/source/docs/commands/node/status.html.md.erb b/website/source/docs/commands/node/status.html.md.erb index 888cd72ed..8e63403d0 100644 --- a/website/source/docs/commands/node/status.html.md.erb +++ b/website/source/docs/commands/node/status.html.md.erb @@ -14,7 +14,7 @@ output. ## Usage -``` +```plaintext nomad node status [options] [node] ``` @@ -26,7 +26,7 @@ If there is an exact match based on the provided node ID or prefix, then that particular node will be queried, and detailed information will be displayed, including resource usage statistics. Otherwise, a list of matching nodes and information will be displayed. If running the command on a Nomad Client, the --self flag is useful to quickly access the status of the local node. +`-self` flag is useful to quickly access the status of the local node. ## General Options @@ -34,27 +34,26 @@ information will be displayed. If running the command on a Nomad Client, the ## Status Options -* `-self`: Query the status of the local node. +- `-self`: Query the status of the local node. -* `-stats`: Display detailed resource usage statistics. +- `-stats`: Display detailed resource usage statistics. -* `-allocs`: When a specific node is not being queried, shows the number of +- `-allocs`: When a specific node is not being queried, shows the number of running allocations per node. -* `-short`: Display short output. Used only when querying a single node. +- `-short`: Display short output. Used only when querying a single node. -* `-verbose`: Show full information. +- `-verbose`: Show full information. -* `-json` : Output the node in its JSON format. - -* `-t` : Format and display node using a Go template. +- `-json` : Output the node in its JSON format. +- `-t` : Format and display node using a Go template. ## Examples List view: -``` +```shell $ nomad node status ID DC Name Class Drain Eligibility Status a72dfba2 dc1 node1 false eligible ready @@ -63,7 +62,7 @@ a72dfba2 dc1 node1 false eligible ready List view, with running allocations: -``` +```shell $ nomad node status -allocs ID DC Name Class Drain Eligibility Status Running Allocs 4d2ba53b dc1 node1 false eligible ready 1 @@ -72,7 +71,7 @@ ID DC Name Class Drain Eligibility Status Running Allocs Single-node view in short mode: -``` +```shell $ nomad node status -short 1f3f03ea ID = c754da1f Name = nomad @@ -89,7 +88,7 @@ ID Eval ID Job ID Task Group Desired Status Client Status Full output for a single node: -``` +```shell $ nomad node status 1f3f03ea ID = c754da1f Name = nomad-server01 @@ -132,7 +131,7 @@ ID Eval ID Job ID Task Group Desired Status Client Status Using `-self` when on a Nomad Client: -``` +```shell $ nomad node status -self ID = c754da1f Name = nomad-client01 @@ -190,14 +189,19 @@ Client Status represents the emergent state of the allocation and include the following: - *pending*: The allocation is pending and will be running + - *running*: The allocation is currently running + - *complete*: The allocation was running and completed successfully + - *failed*: The allocation was running and completed with a non-zero exit code -- *lost*: The node that was running the allocation has failed or has been partitioned + +- *lost*: The node that was running the allocation has failed or has been + partitioned Using `-stats` to see detailed to resource usage information on the node: -``` +```shell $ nomad node status -stats c754da1f ID = c754da1f Name = nomad-client01 @@ -278,7 +282,7 @@ ed3665f5 8bf94335 example cache run running To view verbose information about the node: -``` +```shell $ nomad node status -verbose c754da1f ID = c754da1f-6337-b86d-47dc-2ef4c71aca14 Name = nomad diff --git a/website/source/docs/commands/operator.html.md.erb b/website/source/docs/commands/operator.html.md similarity index 59% rename from website/source/docs/commands/operator.html.md.erb rename to website/source/docs/commands/operator.html.md index 4bad91092..157253a5f 100644 --- a/website/source/docs/commands/operator.html.md.erb +++ b/website/source/docs/commands/operator.html.md @@ -14,10 +14,9 @@ as interacting with the Raft subsystem. This was added in Nomad 0.5.5. ~> Use this command with extreme caution, as improper use could lead to a Nomad outage and even loss of data. -See the [Outage Recovery](/guides/operations/outage.html) guide for some examples of how -this command is used. For an API to perform these operations programmatically, -please see the documentation for the [Operator](/api/operator.html) -endpoint. +See the [Outage Recovery guide] guide for some examples of how this command is +used. For an API to perform these operations programmatically, please see the +documentation for the [Operator] endpoint. ## Usage @@ -26,16 +25,27 @@ Usage: `nomad operator [options]` Run `nomad operator ` with no arguments for help on that subcommand. The following subcommands are available: -* [`operator autopilot get-config`][get-config] - Display the current Autopilot configuration -* [`operator autopilot set-config`][set-config] - Modify the current Autopilot configuration -* [`operator keygen`][keygen] - Generates a new encryption key -* [`operator keyring`][keyring] - Manages gossip layer encryption keys -* [`operator raft list-peers`][list] - Display the current Raft peer configuration -* [`operator raft remove-peer`][remove] - Remove a Nomad server from the Raft configuration +- [`operator autopilot get-config`][get-config] - Display the current Autopilot + configuration + +- [`operator autopilot set-config`][set-config] - Modify the current Autopilot + configuration + +- [`operator keygen`][keygen] - Generates a new encryption key + +- [`operator keyring`][keyring] - Manages gossip layer encryption keys + +- [`operator raft list-peers`][list] - Display the current Raft peer + configuration + +- [`operator raft remove-peer`][remove] - Remove a Nomad server from the Raft + configuration [get-config]: /docs/commands/operator/autopilot-get-config.html "Autopilot Get Config command" -[set-config]: /docs/commands/operator/autopilot-set-config.html "Autopilot Set Config command" [keygen]: /docs/commands/operator/keygen.html "Generates a new encryption key" [keyring]: /docs/commands/operator/keyring.html "Manages gossip layer encryption keys" [list]: /docs/commands/operator/raft-list-peers.html "Raft List Peers command" +[Operator]: /api/operator.html "Operator API documentation" +[Outage Recovery guide]: /guides/operations/outage.html [remove]: /docs/commands/operator/raft-remove-peer.html "Raft Remove Peer command" +[set-config]: /docs/commands/operator/autopilot-set-config.html "Autopilot Set Config command" diff --git a/website/source/docs/commands/operator/autopilot-get-config.html.md.erb b/website/source/docs/commands/operator/autopilot-get-config.html.md.erb index ac4e0734f..738df8e64 100644 --- a/website/source/docs/commands/operator/autopilot-get-config.html.md.erb +++ b/website/source/docs/commands/operator/autopilot-get-config.html.md.erb @@ -8,12 +8,12 @@ description: > # Command: operator autopilot get-config -The Autopilot operator command is used to view the current Autopilot configuration. See the -[Autopilot Guide](/guides/operations/autopilot.html) for more information about Autopilot. +The Autopilot operator command is used to view the current Autopilot +configuration. See the [Autopilot Guide] for more information about Autopilot. ## Usage -``` +```plaintext nomad operator autopilot get-config [options] ``` @@ -23,7 +23,8 @@ nomad operator autopilot get-config [options] The output looks like this: -``` +```shell +$ nomad operator autopilot get-config CleanupDeadServers = true LastContactThreshold = 200ms MaxTrailingLogs = 250 @@ -61,3 +62,5 @@ UpgradeMigrationTag = "" - `UpgradeVersionTag` - Controls the node-meta key to use for version info when performing upgrade migrations. If left blank, the Nomad version will be used. + +[Autopilot Guide]: /guides/operations/autopilot.html diff --git a/website/source/docs/commands/operator/autopilot-set-config.html.md.erb b/website/source/docs/commands/operator/autopilot-set-config.html.md.erb index d935c7278..1e6324ae9 100644 --- a/website/source/docs/commands/operator/autopilot-set-config.html.md.erb +++ b/website/source/docs/commands/operator/autopilot-set-config.html.md.erb @@ -8,13 +8,12 @@ description: > # Command: operator autopilot set-config -The Autopilot operator command is used to set the current Autopilot configuration. See the -[Autopilot Guide](/guides/operations/autopilot.html) for more information about Autopilot. - +The Autopilot operator command is used to set the current Autopilot +configuration. See the [Autopilot Guide] for more information about Autopilot. ## Usage -``` +```plaintext nomad operator autopilot set-config [options] ``` @@ -24,35 +23,41 @@ nomad operator autopilot set-config [options] ## Set Config Options -* `-cleanup-dead-servers` - Specifies whether to enable automatic removal of dead servers -upon the successful joining of new servers to the cluster. Must be one of `[true|false]`. +- `-cleanup-dead-servers` - Specifies whether to enable automatic removal of + dead servers upon the successful joining of new servers to the cluster. Must be + one of `[true|false]`. -* `-last-contact-threshold` - Controls the maximum amount of time a server can go without contact -from the leader before being considered unhealthy. Must be a duration value such as `200ms`. +- `-last-contact-threshold` - Controls the maximum amount of time a server can + go without contact from the leader before being considered unhealthy. Must be a + duration value such as `200ms`. -* `-max-trailing-logs` - Controls the maximum number of log entries that a server can trail -the leader by before being considered unhealthy. +- `-max-trailing-logs` - Controls the maximum number of log entries that a + server can trail the leader by before being considered unhealthy. -* `-server-stabilization-time` - Controls the minimum amount of time a server must be stable in -the 'healthy' state before being added to the cluster. Only takes effect if all servers are -running Raft protocol version 3 or higher. Must be a duration value such as `10s`. +- `-server-stabilization-time` - Controls the minimum amount of time a server + must be stable in the 'healthy' state before being added to the cluster. Only + takes effect if all servers are running Raft protocol version 3 or higher. Must + be a duration value such as `10s`. -* `-disable-upgrade-migration` - (Enterprise-only) Controls whether Nomad will avoid promoting -new servers until it can perform a migration. Must be one of `[true|false]`. +- `-disable-upgrade-migration` - (Enterprise-only) Controls whether Nomad will + avoid promoting new servers until it can perform a migration. Must be one of + `[true|false]`. -* `-redundancy-zone-tag`- (Enterprise-only) Controls the - [`redundancy_zone`](/docs/configuration/server.html#redundancy_zone) +- `-redundancy-zone-tag`- (Enterprise-only) Controls the [`redundancy_zone`] used for separating servers into different redundancy zones. -* `-upgrade-version-tag` - (Enterprise-only) Controls the - [`upgrade_version`](/docs/configuration/server.html#upgrade_version) to +- `-upgrade-version-tag` - (Enterprise-only) Controls the [`upgrade_version`] to use for version info when performing upgrade migrations. If left blank, the Nomad version will be used. The output looks like this: -``` +```plaintext Configuration updated! ``` The return code will indicate success or failure. + +[`redundancy_zone`]: /docs/configuration/server.html#redundancy_zone +[`upgrade_version`]: /docs/configuration/server.html#upgrade_version +[Autopilot Guide]: /guides/operations/autopilot.html diff --git a/website/source/docs/commands/operator/keygen.html.md.erb b/website/source/docs/commands/operator/keygen.html.md similarity index 58% rename from website/source/docs/commands/operator/keygen.html.md.erb rename to website/source/docs/commands/operator/keygen.html.md index 18e885674..bf8da1830 100644 --- a/website/source/docs/commands/operator/keygen.html.md.erb +++ b/website/source/docs/commands/operator/keygen.html.md @@ -3,27 +3,26 @@ layout: "docs" page_title: "Commands: operator keygen" sidebar_current: "docs-commands-operator-keygen" description: > - The `operator keygen` command generates an encryption key that can be used for Nomad - server's gossip traffic encryption. The keygen command uses a + The `operator keygen` command generates an encryption key that can be used for + Nomad server's gossip traffic encryption. The keygen command uses a cryptographically strong pseudo-random number generator to generate the key. --- # Command: operator keygen -The `operator keygen` command generates an encryption key that can be used for Nomad -server's gossip traffic encryption. The keygen command uses a cryptographically -strong pseudo-random number generator to generate the key. +The `operator keygen` command generates an encryption key that can be used for +Nomad server's gossip traffic encryption. The keygen command uses a +cryptographically strong pseudo-random number generator to generate the key. -## Usage +## Usage -``` +```plaintext nomad operator keygen ``` ## Example -``` -nomad operator keygen +```shell +$ nomad operator keygen YgZOXLMhC7TtZqeghMT8+w== ``` - diff --git a/website/source/docs/commands/operator/keyring.html.md.erb b/website/source/docs/commands/operator/keyring.html.md similarity index 76% rename from website/source/docs/commands/operator/keyring.html.md.erb rename to website/source/docs/commands/operator/keyring.html.md index 6a136efaf..77be14dc7 100644 --- a/website/source/docs/commands/operator/keyring.html.md.erb +++ b/website/source/docs/commands/operator/keyring.html.md @@ -24,34 +24,36 @@ All variations of the `keyring` command return 0 if all nodes reply and there are no errors. If any node fails to reply or reports failure, the exit code will be 1. - ## Usage -Usage: `nomad operator keyring [options]` +```plaintext +nomad operator keyring [options] +``` Only one actionable argument may be specified per run, including `-list`, `-install`, `-remove`, and `-use`. The list of available flags are: -* `-list` - List all keys currently in use within the cluster. +- `-list` - List all keys currently in use within the cluster. -* `-install` - Install a new encryption key. This will broadcast the new key to +- `-install` - Install a new encryption key. This will broadcast the new key to all members in the cluster. -* `-use` - Change the primary encryption key, which is used to encrypt messages. +- `-use` - Change the primary encryption key, which is used to encrypt messages. The key must already be installed before this operation can succeed. -* `-remove` - Remove the given key from the cluster. This operation may only be +- `-remove` - Remove the given key from the cluster. This operation may only be performed on keys which are not currently the primary key. ## Output -The output of the `nomad operator keyring -list` command consolidates information from -all the Nomad servers from all datacenters and regions to provide a simple and -easy to understand view of the cluster. +The output of the `nomad operator keyring -list` command consolidates +information from all the Nomad servers from all datacenters and regions to +provide a simple and easy to understand view of the cluster. -``` +```shell +$ nomad operator keyring -list ==> Gathering installed encryption keys... Key PGm64/neoebUBqYR/lZTbA== diff --git a/website/source/docs/commands/operator/raft-list-peers.html.md.erb b/website/source/docs/commands/operator/raft-list-peers.html.md.erb index 26bef9254..14d8d83ab 100644 --- a/website/source/docs/commands/operator/raft-list-peers.html.md.erb +++ b/website/source/docs/commands/operator/raft-list-peers.html.md.erb @@ -11,14 +11,13 @@ description: > The Raft list-peers command is used to display the current Raft peer configuration. -See the [Outage Recovery](/guides/operations/outage.html) guide for some examples of how -this command is used. For an API to perform these operations programmatically, -please see the documentation for the [Operator](/api/operator.html) -endpoint. +See the [Outage Recovery] guide for some examples of how this command is used. +For an API to perform these operations programmatically, please see the +documentation for the [Operator] endpoint. ## Usage -``` +```plaintext nomad operator raft list-peers [options] ``` @@ -28,7 +27,7 @@ nomad operator raft list-peers [options] ## List Peers Options -* `-stale`: The stale argument defaults to "false" which means the leader +- `-stale`: The stale argument defaults to "false" which means the leader provides the result. If the cluster is in an outage state without a leader, you may need to set `-stale` to "true" to get the configuration from a non-leader server. @@ -37,7 +36,7 @@ server. An example output with three servers is as follows: -``` +```shell $ nomad operator raft list-peers Node ID Address State Voter nomad-server01.global 10.10.11.5:4647 10.10.11.5:4647 follower true @@ -58,3 +57,6 @@ Raft configuration. - `Voter` is "true" or "false", indicating if the server has a vote in the Raft configuration. Future versions of Nomad may add support for non-voting servers. + +[Operator]: /api/operator.html +[Outage Recovery]: /guides/operations/outage.html diff --git a/website/source/docs/commands/operator/raft-remove-peer.html.md.erb b/website/source/docs/commands/operator/raft-remove-peer.html.md.erb index 37e6fbaa9..74ab39897 100644 --- a/website/source/docs/commands/operator/raft-remove-peer.html.md.erb +++ b/website/source/docs/commands/operator/raft-remove-peer.html.md.erb @@ -13,20 +13,17 @@ Remove the Nomad server with given address from the Raft configuration. There are rare cases where a peer may be left behind in the Raft quorum even though the server is no longer present and known to the cluster. This command can be used to remove the failed server so that it is no longer affects the Raft -quorum. If the server still shows in the output of the [`nomad -server members`](/docs/commands/server/members.html) command, it is preferable -to clean up by simply running [`nomad -server force-leave`](/docs/commands/server/force-leave.html) instead of this -command. +quorum. If the server still shows in the output of the [`nomad server members`] +command, it is preferable to clean up by running [`nomad server force-leave`] +instead of this command. -See the [Outage Recovery](/guides/operations/outage.html) guide for some examples of how -this command is used. For an API to perform these operations programmatically, -please see the documentation for the [Operator](/api/operator.html) -endpoint. +See the [Outage Recovery] guide for some examples of how this command is used. +For an API to perform these operations programmatically, please see the +documentation for the [Operator] endpoint. ## Usage -``` +```plaintext nomad operator raft remove-peer [options] ``` @@ -36,8 +33,13 @@ nomad operator raft remove-peer [options] ## Remove Peer Options -* `-peer-address`: Remove a Nomad server with given address from the Raft -configuration. The format is "IP:port" +- `-peer-address`: Remove a Nomad server with given address from the Raft + configuration. The format is "IP:port" -* `-peer-id`: Remove a Nomad server with the given ID from the Raft -configuration. The format is "id" +- `-peer-id`: Remove a Nomad server with the given ID from the Raft + configuration. The format is "id" + +[`nomad server force-leave`]: /docs/commands/server/force-leave.html "Nomad server force-leave command" +[`nomad server members`]: /docs/commands/server/members.html "Nomad server members command" +[Operator]: /api/operator.html "Nomad Operator API" +[Outage Recovery]: /guides/operations/outage.html diff --git a/website/source/docs/commands/quota.html.md.erb b/website/source/docs/commands/quota.html.md similarity index 68% rename from website/source/docs/commands/quota.html.md.erb rename to website/source/docs/commands/quota.html.md index 38ae5102c..701a3d416 100644 --- a/website/source/docs/commands/quota.html.md.erb +++ b/website/source/docs/commands/quota.html.md @@ -20,12 +20,12 @@ Usage: `nomad quota [options]` Run `nomad quota -h` for help on that subcommand. The following subcommands are available: -* [`quota apply`][quotaapply] - Create or update a quota specification -* [`quota delete`][quotadelete] - Delete a quota specification -* [`quota init`][quotainit] - Create an example quota specification file -* [`quota inspect`][quotainspect] - Inspect a quota specification -* [`quota list`][quotalist] - List quota specifications -* [`quota status`][quotastatus] - Display a quota's status and current usage +- [`quota apply`][quotaapply] - Create or update a quota specification +- [`quota delete`][quotadelete] - Delete a quota specification +- [`quota init`][quotainit] - Create an example quota specification file +- [`quota inspect`][quotainspect] - Inspect a quota specification +- [`quota list`][quotalist] - List quota specifications +- [`quota status`][quotastatus] - Display a quota's status and current usage [quotaapply]: /docs/commands/quota/apply.html [quotadelete]: /docs/commands/quota/delete.html diff --git a/website/source/docs/commands/quota/apply.html.md.erb b/website/source/docs/commands/quota/apply.html.md.erb index ec023362e..fc28bc784 100644 --- a/website/source/docs/commands/quota/apply.html.md.erb +++ b/website/source/docs/commands/quota/apply.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad quota apply [options] ``` @@ -28,13 +28,13 @@ specification can be read from stdin by setting the path to "-". ## Apply Options -* `-json`: Parse the input as a JSON quota specification. +- `-json`: Parse the input as a JSON quota specification. ## Examples Create a new quota specification: -``` +```shell $ nomad quota apply my-quota.hcl Successfully applied quota specification "my-quota"! ``` diff --git a/website/source/docs/commands/quota/delete.html.md.erb b/website/source/docs/commands/quota/delete.html.md.erb index 4baa2bf58..3ffce0abe 100644 --- a/website/source/docs/commands/quota/delete.html.md.erb +++ b/website/source/docs/commands/quota/delete.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad quota delete ``` @@ -29,7 +29,7 @@ The `quota delete` command requires the quota specification name as an argument. Delete a quota specification: -``` +```shell $ nomad quota delete my-quota Successfully deleted quota "my-quota"! ``` diff --git a/website/source/docs/commands/quota/init.html.md.erb b/website/source/docs/commands/quota/init.html.md.erb index d1b2222f6..e6b19488f 100644 --- a/website/source/docs/commands/quota/init.html.md.erb +++ b/website/source/docs/commands/quota/init.html.md.erb @@ -16,19 +16,19 @@ Enterprise. ## Usage -``` +```plaintext nomad quota init ``` ## Init Options -* `-json`: Create an example JSON quota specification. +- `-json`: Create an example JSON quota specification. ## Examples Create an example quota specification: -``` +```shell $ nomad quota init Example quota specification written to spec.hcl ``` diff --git a/website/source/docs/commands/quota/inspect.html.md.erb b/website/source/docs/commands/quota/inspect.html.md.erb index 5487c5136..403e4f2da 100644 --- a/website/source/docs/commands/quota/inspect.html.md.erb +++ b/website/source/docs/commands/quota/inspect.html.md.erb @@ -17,7 +17,7 @@ Enterprise. ## Usage -``` +```plaintext nomad quota inspect [options] ``` @@ -27,13 +27,13 @@ nomad quota inspect [options] ## Inspect Options -* `-t` : Format and display the quota using a Go template. +- `-t` : Format and display the quota using a Go template. ## Examples Inspect a quota specification: -``` +```shell $ nomad quota inspect default-quota { "Spec": { diff --git a/website/source/docs/commands/quota/list.html.md.erb b/website/source/docs/commands/quota/list.html.md.erb index 7380df3fd..fa2f5055c 100644 --- a/website/source/docs/commands/quota/list.html.md.erb +++ b/website/source/docs/commands/quota/list.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad quota list ``` @@ -25,15 +25,15 @@ nomad quota list ## List Options -* `-json`: Output the quota specifications in a JSON format. +- `-json`: Output the quota specifications in a JSON format. -* `-t`: Format and display the quotas specifications using a Go template. +- `-t`: Format and display the quotas specifications using a Go template. ## Examples List all quota specifications: -``` +```shell $ nomad quota list Name Description default Limit the shared default namespace diff --git a/website/source/docs/commands/quota/status.html.md.erb b/website/source/docs/commands/quota/status.html.md.erb index 626654bff..7de58835c 100644 --- a/website/source/docs/commands/quota/status.html.md.erb +++ b/website/source/docs/commands/quota/status.html.md.erb @@ -17,7 +17,7 @@ Enterprise. ## Usage -``` +```plaintext nomad quota status [options] ``` @@ -29,7 +29,7 @@ nomad quota status [options] View the status of a quota specification: -``` +```shell $ nomad quota status default-quota Name = default-quota Description = Limit the shared default namespace diff --git a/website/source/docs/commands/sentinel.html.md.erb b/website/source/docs/commands/sentinel.html.md similarity index 74% rename from website/source/docs/commands/sentinel.html.md.erb rename to website/source/docs/commands/sentinel.html.md index e3895423c..edcb72818 100644 --- a/website/source/docs/commands/sentinel.html.md.erb +++ b/website/source/docs/commands/sentinel.html.md @@ -20,10 +20,10 @@ Usage: `nomad sentinel [options]` Run `nomad sentinel -h` for help on that subcommand. The following subcommands are available: -* [`sentinel apply`][apply] - Create a new or update existing Sentinel policies -* [`sentinel delete`][delete] - Delete an existing Sentinel policies -* [`sentinel list`][list] - Display all Sentinel policies -* [`sentinel read`][read] - Inspects an existing Sentinel policies +- [`sentinel apply`][apply] - Create a new or update existing Sentinel policies +- [`sentinel delete`][delete] - Delete an existing Sentinel policies +- [`sentinel list`][list] - Display all Sentinel policies +- [`sentinel read`][read] - Inspects an existing Sentinel policies [delete]: /docs/commands/sentinel/delete.html [list]: /docs/commands/sentinel/list.html diff --git a/website/source/docs/commands/sentinel/apply.html.md.erb b/website/source/docs/commands/sentinel/apply.html.md.erb index 8cc64200c..09afb49ad 100644 --- a/website/source/docs/commands/sentinel/apply.html.md.erb +++ b/website/source/docs/commands/sentinel/apply.html.md.erb @@ -3,24 +3,27 @@ layout: "docs" page_title: "Commands: sentinel apply" sidebar_current: "docs-commands-sentinel-apply" description: > - The sentinel apply command is used to write a new, or update an existing, Sentinel policy. + The sentinel apply command is used to write a new, or update an existing, + Sentinel policy. --- # Command: sentinel apply -The `sentinel apply` command is used to write a new, or update an existing, Sentinel policy. +The `sentinel apply` command is used to write a new, or update an existing, +Sentinel policy. ~> Sentinel commands are new in Nomad 0.7 and are only available with Nomad Enterprise. ## Usage -``` +```plaintext nomad sentinel apply [options] ``` -The `sentinel apply` command requires two arguments, the policy name and the policy file. -The policy file can be read from stdin by specifying "-" as the file name. +The `sentinel apply` command requires two arguments, the policy name and the +policy file. The policy file can be read from stdin by specifying "-" as the +file name. ## General Options @@ -28,18 +31,19 @@ The policy file can be read from stdin by specifying "-" as the file name. ## Apply Options -* `-description` : Sets a human readable description for the policy +- `-description` : Sets a human readable description for the policy -* `-scope` : (default: submit-job) Sets the scope of the policy and when it should be enforced. +- `-scope` : (default: submit-job) Sets the scope of the policy and when it + should be enforced. -* `-level` : (default: advisory) Sets the enforcement level of the policy. Must be one of advisory, - soft-mandatory, hard-mandatory. +- `-level` : (default: advisory) Sets the enforcement level of the policy. Must + be one of advisory, soft-mandatory, hard-mandatory. ## Examples Write a policy: -``` +```shell $ nomad sentinel write -description "My test policy" foo test.sentinel Successfully wrote "foo" Sentinel policy! ``` diff --git a/website/source/docs/commands/sentinel/delete.html.md.erb b/website/source/docs/commands/sentinel/delete.html.md.erb index 93b4a74dc..1f43b83ee 100644 --- a/website/source/docs/commands/sentinel/delete.html.md.erb +++ b/website/source/docs/commands/sentinel/delete.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad sentinel delete [options] ``` @@ -29,7 +29,7 @@ The `sentinel delete` command requires a single argument, the policy name. Delete a policy: -``` +```shell $ nomad sentinel delete foo Successfully deleted "foo" Sentinel policy! ``` diff --git a/website/source/docs/commands/sentinel/list.html.md.erb b/website/source/docs/commands/sentinel/list.html.md.erb index 4a979115c..6906088f2 100644 --- a/website/source/docs/commands/sentinel/list.html.md.erb +++ b/website/source/docs/commands/sentinel/list.html.md.erb @@ -8,14 +8,15 @@ description: > # Command: sentinel list -The `sentinel list` command is used to display all the installed Sentinel policies. +The `sentinel list` command is used to display all the installed Sentinel +policies. ~> Sentinel commands are new in Nomad 0.7 and are only available with Nomad Enterprise. ## Usage -``` +```plaintext nomad sentinel list [options] ``` @@ -29,7 +30,7 @@ The `sentinel list` command requires no arguments. List all policies: -``` +```shell $ nomad sentinel list Name Scope Enforcement Level Description foo submit-job advisory my test policy diff --git a/website/source/docs/commands/sentinel/read.html.md.erb b/website/source/docs/commands/sentinel/read.html.md.erb index 782d79cad..de2b791b5 100644 --- a/website/source/docs/commands/sentinel/read.html.md.erb +++ b/website/source/docs/commands/sentinel/read.html.md.erb @@ -15,7 +15,7 @@ Enterprise. ## Usage -``` +```plaintext nomad sentinel read [options] ``` @@ -27,13 +27,13 @@ The `sentinel read` command requires a single argument, the policy name. ## Read Options -* `-raw` : Output the raw policy only. +- `-raw` : Output the raw policy only. ## Examples Read all policies: -``` +```shell $ nomad sentinel read foo Name = foo Scope = submit-job diff --git a/website/source/docs/commands/server.html.md.erb b/website/source/docs/commands/server.html.md similarity index 79% rename from website/source/docs/commands/server.html.md.erb rename to website/source/docs/commands/server.html.md index 912e13895..aa52802dd 100644 --- a/website/source/docs/commands/server.html.md.erb +++ b/website/source/docs/commands/server.html.md @@ -7,7 +7,7 @@ description: > --- # Command: server - + Command: `nomad server` The `server` command is used to interact with servers. @@ -19,9 +19,9 @@ Usage: `nomad server [options]` Run `nomad server -h` for help on that subcommand. The following subcommands are available: -* [`server force-leave`][force-leave] - Force a server into the 'left' state -* [`server join`][join] - Join server nodes together -* [`server members`][members] - Display a list of known servers and their status +- [`server force-leave`][force-leave] - Force a server into the 'left' state +- [`server join`][join] - Join server nodes together +- [`server members`][members] - Display a list of known servers and their status [force-leave]: /docs/commands/server/force-leave.html "Force a server into the 'left' state" [join]: /docs/commands/server/join.html "Join server nodes together" diff --git a/website/source/docs/commands/server/force-leave.html.md.erb b/website/source/docs/commands/server/force-leave.html.md.erb index dcab1c668..b12f1494f 100644 --- a/website/source/docs/commands/server/force-leave.html.md.erb +++ b/website/source/docs/commands/server/force-leave.html.md.erb @@ -3,7 +3,8 @@ layout: "docs" page_title: "Commands: server force-leave" sidebar_current: "docs-commands-server-force-leave" description: > - The server force-leave command is used to force a server into the "left" state. + The server force-leave command is used to force a server into the "left" + state. --- # Command: server force-leave @@ -15,7 +16,7 @@ eventually rejoin the cluster again. ## Usage -``` +```plaintext nomad server force-leave [options] ``` @@ -30,6 +31,6 @@ to enter the "left" state. Force-leave the server "node1": -``` +```shell $ nomad server force-leave node1 ``` diff --git a/website/source/docs/commands/server/join.html.md.erb b/website/source/docs/commands/server/join.html.md.erb index 60388ef8c..2d181ebbe 100644 --- a/website/source/docs/commands/server/join.html.md.erb +++ b/website/source/docs/commands/server/join.html.md.erb @@ -3,7 +3,8 @@ layout: "docs" page_title: "Commands: server join" sidebar_current: "docs-commands-server-join" description: > - The server join command is used to join the local server to one or more Nomad servers. + The server join command is used to join the local server to one or more Nomad + servers. --- # Command: server join @@ -15,7 +16,7 @@ handle discovery of the other server nodes in the cluster. ## Usage -``` +```plaintext nomad server join [options] [...] ``` @@ -32,7 +33,7 @@ be 1. Join the local server to a remote server: -``` +```shell $ nomad server join 10.0.0.8:4648 Joined 1 servers successfully ``` diff --git a/website/source/docs/commands/server/members.html.md.erb b/website/source/docs/commands/server/members.html.md.erb index d2667339f..723fd9b1a 100644 --- a/website/source/docs/commands/server/members.html.md.erb +++ b/website/source/docs/commands/server/members.html.md.erb @@ -14,7 +14,7 @@ which is only run on server nodes. ## Usage -``` +```plaintext nomad server members [options] ``` @@ -24,7 +24,7 @@ nomad server members [options] ## Server Members Options -* `-detailed`: Dump the basic member information as well as the raw set of tags +- `-detailed`: Dump the basic member information as well as the raw set of tags for each member. This mode reveals additional information not displayed in the standard output format. @@ -32,7 +32,7 @@ nomad server members [options] Default view: -``` +```shell $ nomad server members Name Addr Port Status Proto Build DC Region node1.global 10.0.0.8 4648 alive 2 0.1.0dev dc1 global @@ -41,7 +41,7 @@ node2.global 10.0.0.9 4648 alive 2 0.1.0dev dc1 global Detailed view: -``` +```shell $ nomad server members -detailed Name Addr Port Tags node1 10.0.0.8 4648 bootstrap=1,build=0.1.0dev,vsn=1,vsn_max=1,dc=dc1,port=4647,region=global,role=nomad,vsn_min=1 diff --git a/website/source/docs/commands/status.html.md.erb b/website/source/docs/commands/status.html.md.erb index 7ff6601ff..d8b3f975d 100644 --- a/website/source/docs/commands/status.html.md.erb +++ b/website/source/docs/commands/status.html.md.erb @@ -12,7 +12,7 @@ The `status` command displays the status output for any Nomad resource. ## Usage -``` +```plaintext nomad status [options] ``` @@ -31,7 +31,7 @@ for backwards compatibility and should not be relied on. Display the status of a job: -``` +```shell $ nomad status example ID = example Name = example @@ -63,7 +63,7 @@ e1d14a39 f9dabe93 cache 0 run running 08/28/17 23:01:39 UTC Display the status of an allocation: -``` +```shell $ nomad status e1d14a39 ID = e1d14a39 Eval ID = cc882755 @@ -99,7 +99,7 @@ Time Type Description Display the status of a deployment: -``` +```shell $ nomad status f5506391 ID = f5506391 Job ID = example @@ -114,7 +114,7 @@ cache 1 1 1 0 Display the status of a node: -``` +```shell $ nomad status f9dabe93 ID = f9dabe93 Name = nomad-server01 diff --git a/website/source/docs/commands/ui.html.md.erb b/website/source/docs/commands/ui.html.md.erb index b63215dd2..7f391bfa3 100644 --- a/website/source/docs/commands/ui.html.md.erb +++ b/website/source/docs/commands/ui.html.md.erb @@ -12,7 +12,7 @@ The `ui` command is used to open the Nomad Web UI. ## Usage -``` +```plaintext nomad ui [options] ``` @@ -22,7 +22,6 @@ will be opened in the default browser. An identifier may be provided, in which case the UI will be opened to view the details for that object. Supported identifiers are jobs, allocations and nodes. - ## General Options <%= partial "docs/commands/_general_options" %> @@ -31,21 +30,21 @@ details for that object. Supported identifiers are jobs, allocations and nodes. Open the UI homepage: -``` +```shell $ nomad ui Opening URL "http://127.0.0.1:4646" ``` Open the UI directly to look at a job: -``` +```shell $ nomad ui redis-job http://127.0.0.1:4646/ui/jobs/redis-job ``` Open the UI directly to look at an allocation: -``` +```shell $ nomad ui d4005969 Opening URL "http://127.0.0.1:4646/ui/allocations/d4005969-b16f-10eb-4fe1-a5374986083d" ``` diff --git a/website/source/docs/commands/version.html.md.erb b/website/source/docs/commands/version.html.md similarity index 96% rename from website/source/docs/commands/version.html.md.erb rename to website/source/docs/commands/version.html.md index bd0ffb6df..ad05dc4e3 100644 --- a/website/source/docs/commands/version.html.md.erb +++ b/website/source/docs/commands/version.html.md @@ -13,7 +13,7 @@ including the release version and the exact revision. ## Usage -``` +```plaintext nomad version ``` @@ -25,7 +25,7 @@ end, indicating that local, uncommitted changes were detected at build time. ## Examples -``` +```shell $ nomad version Nomad v0.0.0-615-gcf3c6aa-dev (cf3c6aa8a75a689987b689d75ae2ba73458465cb+CHANGES) ``` diff --git a/website/source/docs/configuration/consul.html.md b/website/source/docs/configuration/consul.html.md index 1fd8a9dec..3dac4d9a8 100644 --- a/website/source/docs/configuration/consul.html.md +++ b/website/source/docs/configuration/consul.html.md @@ -43,7 +43,7 @@ configuration, Nomad will automatically connect and configure with Consul. An important requirement is that each Nomad agent talks to a unique Consul agent. Nomad agents should be configured to talk to Consul agents and not -Consul servers. If you are observing flapping services, you may have have +Consul servers. If you are observing flapping services, you may have multiple Nomad agents talking to the same Consul agent. As such avoid configuring Nomad to talk to Consul via DNS such as consul.service.consul diff --git a/website/source/docs/drivers/docker.html.md b/website/source/docs/drivers/docker.html.md index f382b6f46..62d4943d8 100644 --- a/website/source/docs/drivers/docker.html.md +++ b/website/source/docs/drivers/docker.html.md @@ -413,6 +413,8 @@ The `docker` driver supports the following configuration in the job spec. Only * `pids_limit` - (Optional) An integer value that specifies the pid limit for the container. Defaults to unlimited. +Additionally, the docker driver supports customization of the container's user through the task's [`user` option](/docs/job-specification/task.html#user). + ### Container Name Nomad creates a container after pulling an image. Containers are named diff --git a/website/source/docs/job-specification/connect.html.md b/website/source/docs/job-specification/connect.html.md index e6baffafb..a8bc94583 100644 --- a/website/source/docs/job-specification/connect.html.md +++ b/website/source/docs/job-specification/connect.html.md @@ -38,11 +38,12 @@ level. sidecar_service {} } } + task "web" { - driver = "docker" - config { - image = "test/test:v1" - } + driver = "docker" + config { + image = "test/test:v1" + } } } } diff --git a/website/source/docs/job-specification/service.html.md b/website/source/docs/job-specification/service.html.md index 7cfd851cc..8859be214 100644 --- a/website/source/docs/job-specification/service.html.md +++ b/website/source/docs/job-specification/service.html.md @@ -73,7 +73,8 @@ for service discovery. For more details on using Nomad with Consul please see the [Consul integration documentation][service-discovery]. Nomad 0.10 also allows specifying the `service` stanza at the task group level. -This enables services in the same task group to opt into [Consul Connect][] integration. +This enables services in the same task group to opt into [Consul +Connect][connect] integration. ## `service` Parameters @@ -82,6 +83,9 @@ This enables services in the same task group to opt into [Consul Connect][] inte define multiple checks for the service. At this time, Nomad supports the `grpc`, `http`, `script`1, and `tcp` checks. +- `connect` - Configures the [Consul Connect][connect] integration. Only + available on group services. + - `name` `(string: "--")` - Specifies the name this service will be advertised as in Consul. If not supplied, this will default to the name of the job, group, and task concatenated together with a dash, like @@ -636,4 +640,4 @@ system of a task for that driver. [network]: /docs/job-specification/network.html "Nomad network Job Specification" [qemu]: /docs/drivers/qemu.html "Nomad qemu Driver" [restart_stanza]: /docs/job-specification/restart.html "restart stanza" -[Connect]: /docs/job-specification/connect.html "Nomad Consul Connect Integration" +[connect]: /docs/job-specification/connect.html "Nomad Consul Connect Integration" diff --git a/website/source/docs/job-specification/sidecar_service.html.md b/website/source/docs/job-specification/sidecar_service.html.md index 2e864ec76..231a83728 100644 --- a/website/source/docs/job-specification/sidecar_service.html.md +++ b/website/source/docs/job-specification/sidecar_service.html.md @@ -52,9 +52,11 @@ valid only within the context of a connect stanza. ## `sidecar_service` Parameters -- `port` `(string: )` Port label for sidecar service. +- `tags` (array: nil) - Custom Consul service tags for the sidecar service. -- `proxy` - ([proxy][]: nil) - This is used to configure the sidecar proxy service. +- `port` `(string: )` - Port label for sidecar service. + +- `proxy` ([proxy][]: nil) - This is used to configure the sidecar proxy service. ## `sidecar_service` Examples diff --git a/website/source/docs/job-specification/volume_mount.html.md b/website/source/docs/job-specification/volume_mount.html.md index 44056064e..9d8068845 100644 --- a/website/source/docs/job-specification/volume_mount.html.md +++ b/website/source/docs/job-specification/volume_mount.html.md @@ -27,10 +27,7 @@ job "docs" { volume "certs" { type = "host" read_only = true - - config { - source = "ca-certificates" - } + source = "ca-certificates" } task "example" { diff --git a/website/source/downloads.html.erb b/website/source/downloads.html.erb index 7558cbfba..b20d028f4 100644 --- a/website/source/downloads.html.erb +++ b/website/source/downloads.html.erb @@ -36,11 +36,6 @@ description: |-

Check out the v<%= latest_version %> CHANGELOG for information on the latest release.

- -

Nomad 0.10.0 Beta 1

-

- A beta for Nomad 0.10.0 is also available! The release candidate can be downloaded on the Nomad releases page. -

diff --git a/website/source/guides/install/production/requirements.html.md b/website/source/guides/install/production/requirements.html.md index c8e09ea63..b340d2b22 100644 --- a/website/source/guides/install/production/requirements.html.md +++ b/website/source/guides/install/production/requirements.html.md @@ -87,3 +87,23 @@ $ cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 $ echo "49152 65535" > /proc/sys/net/ipv4/ip_local_port_range ``` + +## Bridge Networking and `iptables` + +Nomad's task group networks and Consul Connect integration use bridge networking and iptables to send traffic between containers. The Linux kernel bridge module has three "tunables" that control whether traffic crossing the bridge are processed by iptables. Some operating systems (RedHat, CentOS, and Fedora in particular) configure these tunables to optimize for VM workloads where iptables rules might not be correctly configured for guest traffic. + +These tunables can be set to allow iptables processing for the bridge network as follows: + +``` +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-arptables +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables +``` + +To preserve these settings on startup of a client node, add a file including the following to `/etc/sysctl.d/` or remove the file your Linux distribution puts in that directory. + +``` +net.bridge.bridge-nf-call-arptables = 1 +net.bridge.bridge-nf-call-ip6tables = 1 +net.bridge.bridge-nf-call-iptables = 1 +``` diff --git a/website/source/guides/integrations/consul-connect/index.html.md b/website/source/guides/integrations/consul-connect/index.html.md index 4889c9141..eecc8cc59 100644 --- a/website/source/guides/integrations/consul-connect/index.html.md +++ b/website/source/guides/integrations/consul-connect/index.html.md @@ -8,8 +8,8 @@ description: |- # Consul Connect -~> **Note** This guide describes a new feature available in the [Nomad 0.10.0 - Beta release][download] of Nomad. +~> **Note:** This guide requires Nomad 0.10.0 or later and Consul 1.6.0 or + later. [Consul Connect](https://www.consul.io/docs/connect/index.html) provides service-to-service connection authorization and encryption using mutual @@ -57,6 +57,40 @@ run in dev mode with the following command: $ consul agent -dev ``` +To use Connect on a non-dev Consul agent, you will minimally need to enable the +GRPC port and set `connect` to enabled by adding some additional information to +your Consul client configurations, depending on format. + +For HCL configurations: + +```hcl +# ... + +ports { + "grpc" = 8502 +} + +connect { + enabled = true +} +``` + +For JSON configurations: + +```javascript +{ + // ... + "ports": { + "grpc": 8502 + }, + "connect": { + "enabled": true + } +} +``` + + + ### Nomad Nomad must schedule onto a routable interface in order for the proxies to @@ -81,6 +115,27 @@ $ sudo mkdir -p /opt/cni/bin $ sudo tar -C /opt/cni/bin -xzf cni-plugins.tgz ``` +Ensure the your Linux operating system distribution has been configured to allow +container traffic through the bridge network to be routed via iptables. These +tunables can be set as follows: + +``` +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-arptables +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables +$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables +``` + +To preserve these settings on startup of a client node, add a file including the +following to `/etc/sysctl.d/` or remove the file your Linux distribution puts in +that directory. + +``` +net.bridge.bridge-nf-call-arptables = 1 +net.bridge.bridge-nf-call-ip6tables = 1 +net.bridge.bridge-nf-call-iptables = 1 +``` + + ## Run the Connect-enabled Services Once Nomad and Consul are running, submit the following Connect-enabled services @@ -88,66 +143,71 @@ to Nomad by copying the HCL into a file named `connect.nomad` and running: `nomad run connect.nomad` ```hcl - job "countdash" { - datacenters = ["dc1"] - group "api" { - network { - mode = "bridge" - } +job "countdash" { + datacenters = ["dc1"] - service { - name = "count-api" - port = "9001" + group "api" { + network { + mode = "bridge" + } - connect { - sidecar_service {} - } - } + service { + name = "count-api" + port = "9001" - task "web" { - driver = "docker" - config { - image = "hashicorpnomad/counter-api:v1" - } - } - } + connect { + sidecar_service {} + } + } - group "dashboard" { - network { - mode = "bridge" - port "http" { - static = 9002 - to = 9002 - } - } + task "web" { + driver = "docker" - service { - name = "count-dashboard" - port = "9002" + config { + image = "hashicorpnomad/counter-api:v1" + } + } + } - connect { - sidecar_service { - proxy { - upstreams { - destination_name = "count-api" - local_bind_port = 8080 - } - } - } - } - } + group "dashboard" { + network { + mode = "bridge" - task "dashboard" { - driver = "docker" - env { - COUNTING_SERVICE_URL = "http://${NOMAD_UPSTREAM_ADDR_count_api}" - } - config { - image = "hashicorpnomad/counter-dashboard:v1" - } - } - } - } + port "http" { + static = 9002 + to = 9002 + } + } + + service { + name = "count-dashboard" + port = "9002" + + connect { + sidecar_service { + proxy { + upstreams { + destination_name = "count-api" + local_bind_port = 8080 + } + } + } + } + } + + task "dashboard" { + driver = "docker" + + env { + COUNTING_SERVICE_URL = "http://${NOMAD_UPSTREAM_ADDR_count_api}" + } + + config { + image = "hashicorpnomad/counter-dashboard:v1" + } + } + } +} ``` The job contains two task groups: an API service and a web frontend. @@ -157,33 +217,35 @@ The job contains two task groups: an API service and a web frontend. The API service is defined as a task group with a bridge network: ```hcl - group "api" { - network { - mode = "bridge" - } + group "api" { + network { + mode = "bridge" + } - ... - } + # ... + } ``` Since the API service is only accessible via Consul Connect, it does not define any ports in its network. The service stanza enables Connect: ```hcl - group "api" { - ... + group "api" { - service { - name = "count-api" - port = "9001" + # ... - connect { - sidecar_service {} - } - } + service { + name = "count-api" + port = "9001" - ... - } + connect { + sidecar_service {} + } + } + + # ... + + } ``` The `port` in the service stanza is the port the API service listens on. The @@ -196,17 +258,19 @@ The web frontend is defined as a task group with a bridge network and a static forwarded port: ```hcl - group "dashboard" { - network { - mode ="bridge" - port "http" { - static = 9002 - to = 9002 - } - } + group "dashboard" { + network { + mode = "bridge" - ... - } + port "http" { + static = 9002 + to = 9002 + } + } + + # ... + + } ``` The `static = 9002` parameter requests the Nomad scheduler reserve port 9002 on @@ -221,21 +285,21 @@ This allows you to connect to the web frontend in a browser by visiting The web frontend connects to the API service via Consul Connect: ```hcl - service { - name = "count-dashboard" - port = "9002" + service { + name = "count-dashboard" + port = "9002" - connect { - sidecar_service { - proxy { - upstreams { - destination_name = "count-api" - local_bind_port = 8080 - } - } - } - } - } + connect { + sidecar_service { + proxy { + upstreams { + destination_name = "count-api" + local_bind_port = 8080 + } + } + } + } + } ``` The `upstreams` stanza defines the remote service to access (`count-api`) and @@ -245,9 +309,9 @@ The web frontend is configured to communicate with the API service with an environment variable: ```hcl - env { - COUNTING_SERVICE_URL = "http://${NOMAD_UPSTREAM_ADDR_count_api}" - } + env { + COUNTING_SERVICE_URL = "http://${NOMAD_UPSTREAM_ADDR_count_api}" + } ``` The web frontend is configured via the `$COUNTING_SERVICE_URL`, so you must @@ -262,11 +326,10 @@ dashes (`-`) are converted to underscores (`_`) in environment variables so - Consul Connect Native is not yet supported. - Consul Connect HTTP and gRPC checks are not yet supported. - Consul ACLs are not yet supported. - - Only the Docker, exec, raw exec, and java drivers support network namespaces + - Only the Docker, exec, raw_exec, and java drivers support network namespaces and Connect. - Variable interpolation for group services and checks are not yet supported. - Consul Connect and network namespaces are only supported on Linux. [count-dashboard]: /assets/images/count-dashboard.png -[download]: https://releases.hashicorp.com/nomad/0.10.0-beta1/ diff --git a/website/source/guides/integrations/vault-integration/index.html.md b/website/source/guides/integrations/vault-integration/index.html.md index 687fb47a3..07b5c1c8f 100644 --- a/website/source/guides/integrations/vault-integration/index.html.md +++ b/website/source/guides/integrations/vault-integration/index.html.md @@ -183,7 +183,7 @@ You will generate the actual token in the next few steps. ### Step 5: Create a Token Role At this point, you must create a Vault token role that Nomad can use. The token -role allows you to limit what Vault policies are are accessible by jobs +role allows you to limit what Vault policies are accessible by jobs submitted to Nomad. We will use the following token role: ```json diff --git a/website/source/guides/load-balancing/fabio.html.md b/website/source/guides/load-balancing/fabio.html.md index 6cd5d0e3a..ad379f9f5 100644 --- a/website/source/guides/load-balancing/fabio.html.md +++ b/website/source/guides/load-balancing/fabio.html.md @@ -1,7 +1,7 @@ --- layout: "guides" page_title: "Load Balancing with Nomad" -sidebar_current: "guides-load-balancing" +sidebar_current: "guides-load-balancing-fabio" description: |- There are multiple approaches to load balancing within a Nomad cluster. One approach involves using [fabio][fabio]. Fabio integrates natively diff --git a/website/source/guides/load-balancing/haproxy.html.md b/website/source/guides/load-balancing/haproxy.html.md new file mode 100644 index 000000000..2dd62409f --- /dev/null +++ b/website/source/guides/load-balancing/haproxy.html.md @@ -0,0 +1,279 @@ +--- +layout: "guides" +page_title: "Load Balancing with HAProxy" +sidebar_current: "guides-load-balancing-haproxy" +description: |- + There are multiple approaches to load balancing within a Nomad cluster. + One approach involves using [HAProxy][haproxy] which natively integrates with + service discovery data from Consul. +--- + +# Load Balancing with HAProxy + +The main use case for HAProxy in this scenario is to distribute incoming HTTP(S) +and TCP requests from the internet to frontend services that can handle these +requests. This guide will show you one such example using a demo web +application. + +HAProxy version 1.8+ (LTS) includes the [server-template] directive, which lets +users specify placeholder backend servers to populate HAProxy’s load balancing +pools. Server-template can use Consul as one of these backend servers, +requesting SRV records from Consul DNS. + +## Reference Material + +- [HAProxy][haproxy] +- [Load Balancing Strategies for Consul][lb-strategies] + +## Estimated Time to Complete + +20 minutes + +## Prerequisites + +To perform the tasks described in this guide, you need to have a Nomad +environment with Consul installed. You can use this [repo][terraform-repo] to +easily provision a sandbox environment. This guide will assume a cluster with +one server node and three client nodes. + +-> **Note:** This guide is for demo purposes and only assumes a single server +node. Please consult the [reference architecture][reference-arch] for production +configuration. + +## Steps + +### Step 1: Create a Job for Demo Web App + +Create a job for a demo web application and name the file `webapp.nomad`: + +```hcl +job "demo-webapp" { + datacenters = ["dc1"] + + group "demo" { + count = 3 + + task "server" { + env { + PORT = "${NOMAD_PORT_http}" + NODE_IP = "${NOMAD_IP_http}" + } + + driver = "docker" + + config { + image = "hashicorp/demo-webapp-lb-guide" + } + + resources { + network { + mbits = 10 + port "http" {} + } + } + + service { + name = "demo-webapp" + port = "http" + + check { + type = "http" + path = "/" + interval = "2s" + timeout = "2s" + } + } + } + } +} +``` + +Note that this job deploys 3 instances of our demo web application which we will +load balance with HAProxy in the next few steps. + +### Step 2: Deploy the Demo Web App + +We can now deploy our demo web application: + +```shell +$ nomad run webapp.nomad +==> Monitoring evaluation "8f3af425" + Evaluation triggered by job "demo-webapp" + Evaluation within deployment: "dc4c1925" + Allocation "bf9f850f" created: node "d16a11fb", group "demo" + Allocation "25e0496a" created: node "b78e27be", group "demo" + Allocation "a97e7d39" created: node "01d3eb32", group "demo" + Evaluation status changed: "pending" -> "complete" +==> Evaluation "8f3af425" finished with status "complete" +``` + +### Step 3: Create a Job for HAProxy + +Create a job for HAProxy and name it `haproxy.nomad`. This will be our load +balancer that will balance requests to the deployed instances of our web +application. + +```hcl +job "haproxy" { + region = "global" + datacenters = ["dc1"] + type = "service" + + group "haproxy" { + count = 1 + + task "haproxy" { + driver = "docker" + + config { + image = "haproxy:2.0" + network_mode = "host" + + volumes = [ + "local/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg", + ] + } + + template { + data = < Monitoring evaluation "937b1a2d" + Evaluation triggered by job "haproxy" + Evaluation within deployment: "e8214434" + Allocation "53145b8b" created: node "d16a11fb", group "haproxy" + Evaluation status changed: "pending" -> "complete" +==> Evaluation "937b1a2d" finished with status "complete" +``` + +### Step 5: Check the HAProxy Statistics Page + +You can visit the statistics and monitoring page for HAProxy at +`http://:1936`. You can use this page to verify your +settings and for basic monitoring. + +[![Home Page][haproxy_ui]][haproxy_ui] + +Notice there are 10 pre-provisioned load balancer backend slots for your service +but that only three of them are being used, corresponding to the three allocations in the current job. + +### Step 6: Make a Request to the Load Balancer + +If you query the HAProxy load balancer, you should be able to see a response +similar to the one shown below (this command should be run from a +node inside your cluster): + +```shell +$ curl haproxy.service.consul:8080 +Welcome! You are on node 172.31.54.242:20124 +``` + +Note that your request has been forwarded to one of the several deployed +instances of the demo web application (which is spread across 3 Nomad clients). +The output shows the IP address of the host it is deployed on. If you repeat +your requests, you will see that the IP address changes. + +* Note: if you would like to access HAProxy from outside your cluster, you + can set up a load balancer in your environment that maps to an active port + `8080` on your clients (or whichever port you have configured for HAProxy to + listen on). You can then send your requests directly to your external load + balancer. + +[consul-template]: https://github.com/hashicorp/consul-template#consul-template +[consul-temp-syntax]: https://github.com/hashicorp/consul-template#service +[haproxy]: http://www.haproxy.org/ +[haproxy_ui]: /assets/images/haproxy_ui.png +[inline]: /docs/job-specification/template.html#inline-template +[lb-strategies]: https://www.hashicorp.com/blog/configuring-third-party-loadbalancers-with-consul-nginx-haproxy-f5/ +[reference-arch]: /guides/install/production/reference-architecture.html#high-availability +[remote-template]: /docs/job-specification/template.html#remote-template +[server-template]: https://www.haproxy.com/blog/whats-new-haproxy-1-8/#server-template-configuration-directive +[template-stanza]: /docs/job-specification/template.html +[terraform-repo]: https://github.com/hashicorp/nomad/tree/master/terraform#provision-a-nomad-cluster-in-the-cloud + diff --git a/website/source/guides/load-balancing/load-balancing.html.md b/website/source/guides/load-balancing/load-balancing.html.md index 6cbbcc9c4..f09334a90 100644 --- a/website/source/guides/load-balancing/load-balancing.html.md +++ b/website/source/guides/load-balancing/load-balancing.html.md @@ -16,6 +16,9 @@ Balancing Strategies for Consul](https://www.hashicorp.com/blog/load-balancing-strategies-for-consul)). - [Fabio](/guides/load-balancing/fabio.html) +- [NGINX](/guides/load-balancing/nginx.html) +- [HAProxy](/guides/load-balancing/haproxy.html) +- [Traefik](/guides/load-balancing/traefik.html) Please refer to the specific documentation above or in the sidebar for more detailed information about each strategy. diff --git a/website/source/guides/load-balancing/nginx.html.md b/website/source/guides/load-balancing/nginx.html.md new file mode 100644 index 000000000..c4b63f128 --- /dev/null +++ b/website/source/guides/load-balancing/nginx.html.md @@ -0,0 +1,293 @@ +--- +layout: "guides" +page_title: "Load Balancing with NGINX" +sidebar_current: "guides-load-balancing-nginx" +description: |- + There are multiple approaches to load balancing within a Nomad cluster. + One approach involves using [NGINX][nginx]. NGINX works well with Nomad's + template stanza to allow for dynamic updates to its load balancing + configuration. +--- + +# Load Balancing with NGINX + +You can use Nomad's [template stanza][template-stanza] to configure +[NGINX][nginx] so that it can dynamically update its load balancer configuration +to scale along with your services. + +The main use case for NGINX in this scenario is to distribute incoming HTTP(S) +and TCP requests from the internet to frontend services that can handle these +requests. This guide will show you one such example using a demo web +application. + +## Reference Material + +- [NGINX][nginx] +- [Load Balancing Strategies for Consul][lb-strategies] + +## Estimated Time to Complete + +20 minutes + +## Prerequisites + +To perform the tasks described in this guide, you need to have a Nomad +environment with Consul installed. You can use this [repo][terraform-repo] to +easily provision a sandbox environment. This guide will assume a cluster with +one server node and three client nodes. + +-> **Note:** This guide is for demo purposes and only assumes a single server +node. Please consult the [reference architecture][reference-arch] for production +configuration. + +## Steps + +### Step 1: Create a Job for Demo Web App + +Create a job for a demo web application and name the file `webapp.nomad`: + +```hcl +job "demo-webapp" { + datacenters = ["dc1"] + + group "demo" { + count = 3 + + task "server" { + env { + PORT = "${NOMAD_PORT_http}" + NODE_IP = "${NOMAD_IP_http}" + } + + driver = "docker" + + config { + image = "hashicorp/demo-webapp-lb-guide" + } + + resources { + network { + mbits = 10 + port "http"{} + } + } + + service { + name = "demo-webapp" + port = "http" + + check { + type = "http" + path = "/" + interval = "2s" + timeout = "2s" + } + } + } + } +} +``` + +Note that this job deploys 3 instances of our demo web application which we will +load balance with NGINX in the next few steps. + +### Step 2: Deploy the Demo Web App + +We can now deploy our demo web application: + +```shell +$ nomad run webapp.nomad +==> Monitoring evaluation "ea1e8528" + Evaluation triggered by job "demo-webapp" + Allocation "9b4bac9f" created: node "e4637e03", group "demo" + Allocation "c386de2d" created: node "983a64df", group "demo" + Allocation "082653f0" created: node "f5fdf017", group "demo" + Evaluation status changed: "pending" -> "complete" +==> Evaluation "ea1e8528" finished with status "complete" +``` + +### Step 3: Create a Job for NGINX + +Create a job for NGINX and name it `nginx.nomad`. This will be our load balancer +that will balance requests to the deployed instances of our web application. + +```hcl +job "nginx" { + datacenters = ["dc1"] + + group "nginx" { + count = 1 + + task "nginx" { + driver = "docker" + + config { + image = "nginx" + + port_map { + http = 80 + } + + volumes = [ + "local:/etc/nginx/conf.d", + ] + } + + template { + data = < Monitoring evaluation "45da5a89" + Evaluation triggered by job "nginx" + Allocation "c7f8af51" created: node "983a64df", group "nginx" + Evaluation status changed: "pending" -> "complete" +==> Evaluation "45da5a89" finished with status "complete" +``` + +### Step 5: Verify Load Balancer Configuration + +Consul Template supports [blocking queries][ct-blocking-queries]. This means +your NGINX deployment (which is using the [template][template-stanza] stanza) +will be notified immediately when a change in the health of one of the service +endpoints occurs and will re-render a new load balancer configuration file that +only includes healthy service instances. + +You can use the [alloc fs][alloc-fs] command on your NGINX allocation to read +the rendered load balancer configuration file. + +First, obtain the allocation ID of your NGINX deployment (output below is +abbreviated): + +```shell +$ nomad status nginx +ID = nginx +Name = nginx +... +Summary +Task Group Queued Starting Running Failed Complete Lost +nginx 0 0 1 0 0 0 + +Allocations +ID Node ID Task Group Version Desired Status Created Modified +76692834 f5fdf017 nginx 0 run running 17m40s ago 17m25s ago +``` + +* Keep in mind your allocation ID will be different. + +Next, use the `alloc fs` command to read the load balancer config: + +```shell +$ nomad alloc fs 766 nginx/local/load-balancer.conf +upstream backend { + + server 172.31.48.118:21354; + + server 172.31.52.52:25958; + + server 172.31.52.7:29728; + +} + +server { + listen 80; + + location / { + proxy_pass http://backend; + } +} +``` + +At this point, you can change the count of your `demo-webapp` job and repeat the +previous command to verify the load balancer config is dynamically changing. + +### Step 6: Make a Request to the Load Balancer + +If you query the NGINX load balancer, you should be able to see a response +similar to the one shown below (this command should be run from a node inside +your cluster): + +```shell +$ curl nginx.service.consul:8080 +Welcome! You are on node 172.31.48.118:21354 +``` + +Note that your request has been forwarded to one of the several deployed +instances of the demo web application (which is spread across 3 Nomad clients). +The output shows the IP address of the host it is deployed on. If you repeat +your requests, you will see that the IP address changes. + +* Note: if you would like to access NGINX from outside your cluster, you can set + up a load balancer in your environment that maps to an active port `8080` on + your clients (or whichever port you have configured for NGINX to listen on). + You can then send your requests directly to your external load balancer. + +[alloc-fs]: /docs/commands/alloc/fs.html +[consul-template]: https://github.com/hashicorp/consul-template#consul-template +[consul-temp-syntax]: https://github.com/hashicorp/consul-template#service +[ct-blocking-queries]: https://github.com/hashicorp/consul-template#key +[inline]: /docs/job-specification/template.html#inline-template +[lb-strategies]: https://www.hashicorp.com/blog/configuring-third-party-loadbalancers-with-consul-nginx-haproxy-f5/ +[nginx]: https://www.nginx.com/ +[reference-arch]: /guides/install/production/reference-architecture.html#high-availability +[remote-template]: /docs/job-specification/template.html#remote-template +[template-stanza]: /docs/job-specification/template.html +[terraform-repo]: https://github.com/hashicorp/nomad/tree/master/terraform#provision-a-nomad-cluster-in-the-cloud + diff --git a/website/source/guides/load-balancing/traefik.html.md b/website/source/guides/load-balancing/traefik.html.md new file mode 100644 index 000000000..b541a8541 --- /dev/null +++ b/website/source/guides/load-balancing/traefik.html.md @@ -0,0 +1,265 @@ +--- +layout: "guides" +page_title: "Load Balancing with Traefik" +sidebar_current: "guides-load-balancing-traefik" +description: |- + There are multiple approaches to load balancing within a Nomad cluster. + One approach involves using [Traefik][traefik] which natively integrates + with service discovery data from Consul. +--- + +# Load Balancing with Traefik + +The main use case for Traefik in this scenario is to distribute incoming HTTP(S) +and TCP requests from the internet to frontend services that can handle these +requests. This guide will show you one such example using a demo web +application. + +Traefik can natively integrate with Consul using the [Consul Catalog +Provider][traefik-consul-provider] and can use [tags][traefik-tags] to route +traffic. + +## Reference Material + +- [Traefik][traefik] +- [Traefik Consul Catalog Provider Documentation][traefik-consul-provider] + +## Estimated Time to Complete + +20 minutes + +## Prerequisites + +To perform the tasks described in this guide, you need to have a Nomad +environment with Consul installed. You can use this [repo][terraform-repo] to +easily provision a sandbox environment. This guide will assume a cluster with +one server node and three client nodes. + +-> **Note:** This guide is for demo purposes and only assumes a single server +node. Please consult the [reference architecture][reference-arch] for production +configuration. + +## Steps + +### Step 1: Create a Job for Demo Web App + +Create a job for a demo web application and name the file `webapp.nomad`: + +```hcl +job "demo-webapp" { + datacenters = ["dc1"] + + group "demo" { + count = 3 + + task "server" { + env { + PORT = "${NOMAD_PORT_http}" + NODE_IP = "${NOMAD_IP_http}" + } + + driver = "docker" + + config { + image = "hashicorp/demo-webapp-lb-guide" + } + + resources { + network { + mbits = 10 + port "http" {} + } + } + + service { + name = "demo-webapp" + port = "http" + tags = [ + "traefik.tags=service", + "traefik.frontend.rule=PathPrefixStrip:/myapp", + ] + + check { + type = "http" + path = "/" + interval = "2s" + timeout = "2s" + } + } + } + } +} +``` + +- Note that this job deploys 3 instances of our demo web application which we + will load balance with Traefik in the next few steps. +- We are using tags to configure routing to our web app. Even though our + application listens on `/`, it is possible to define `/myapp` as the route + because of the [`PathPrefixStrip`][matchers] option. + +### Step 2: Deploy the Demo Web App + +We can now deploy our demo web application: + +```shell +$ nomad run webapp.nomad +==> Monitoring evaluation "a2061ab7" + Evaluation triggered by job "demo-webapp" + Evaluation within deployment: "8ca6d358" + Allocation "1d14babe" created: node "2d6eea6e", group "demo" + Allocation "3abb950d" created: node "a62fa99d", group "demo" + Allocation "c65e14bf" created: node "a209a662", group "demo" + Evaluation status changed: "pending" -> "complete" +==> Evaluation "a2061ab7" finished with status "complete" +``` + +### Step 3: Create a Job for Traefik + +Create a job for Traefik and name it `traefik.nomad`. This will be our load +balancer that will balance requests to the deployed instances of our web +application. + +```hcl +job "traefik" { + region = "global" + datacenters = ["dc1"] + type = "service" + + group "traefik" { + count = 1 + + task "traefik" { + driver = "docker" + + config { + image = "traefik:1.7" + network_mode = "host" + + volumes = [ + "local/traefik.toml:/etc/traefik/traefik.toml", + ] + } + + template { + data = < Monitoring evaluation "e22ce276" + Evaluation triggered by job "traefik" + Evaluation within deployment: "c6466497" + Allocation "695c5632" created: node "a62fa99d", group "traefik" + Evaluation status changed: "pending" -> "complete" +==> Evaluation "e22ce276" finished with status "complete" +``` + +### Step 5: Check the Traefik Dashboard + +You can visit the dashboard for Traefik at +`http://:8081`. You can use this page to verify your +settings and for basic monitoring. + +[![Home Page][traefik_ui]][traefik_ui] + +### Step 6: Make a Request to the Load Balancer + +If you query the Traefik load balancer, you should be able to see a response +similar to the one shown below (this command should be run from a +node inside your cluster): + +```shell +$ curl http://traefik.service.consul:8080/myapp +Welcome! You are on node 172.31.28.103:28893 +``` + +Note that your request has been forwarded to one of the several deployed +instances of the demo web application (which is spread across 3 Nomad clients). +The output shows the IP address of the host it is deployed on. If you repeat +your requests, you will see that the IP address changes. + +* Note: if you would like to access Traefik from outside your cluster, you + can set up a load balancer in your environment that maps to an active port + `8080` on your clients (or whichever port you have configured for Traefik to + listen on). You can then send your requests directly to your external load + balancer. + +[inline]: /docs/job-specification/template.html#inline-template +[matchers]: https://docs.traefik.io/v1.4/basics/#matchers +[reference-arch]: /guides/install/production/reference-architecture.html#high-availability +[remote-template]: /docs/job-specification/template.html#remote-template +[template-stanza]: /docs/job-specification/template.html +[terraform-repo]: https://github.com/hashicorp/nomad/tree/master/terraform#provision-a-nomad-cluster-in-the-cloud +[traefik]: https://traefik.io/ +[traefik_ui]: /assets/images/traefik_ui.png +[traefik-consul-provider]: https://docs.traefik.io/v1.7/configuration/backends/consulcatalog/ +[traefik-tags]: https://docs.traefik.io/v1.5/configuration/backends/consulcatalog/#tags diff --git a/website/source/guides/operating-a-job/resource-utilization.html.md b/website/source/guides/operating-a-job/resource-utilization.html.md index 18012ccbb..43255fd82 100644 --- a/website/source/guides/operating-a-job/resource-utilization.html.md +++ b/website/source/guides/operating-a-job/resource-utilization.html.md @@ -64,10 +64,10 @@ Time Type Description Here we can see that we are near the limit of our configured CPU but we have plenty of memory headroom. We can use this information to alter our job's -resources to better reflect is actually needs: +resources to better reflect its actual needs: ```hcl -resource { +resources { cpu = 200 memory = 10 } diff --git a/website/source/guides/stateful-workloads/host-volumes.md b/website/source/guides/stateful-workloads/host-volumes.md index f672feb0f..01420f577 100644 --- a/website/source/guides/stateful-workloads/host-volumes.md +++ b/website/source/guides/stateful-workloads/host-volumes.md @@ -9,6 +9,8 @@ description: |- # Stateful Workloads with Nomad Host Volumes +~> **Note:** This guide requires Nomad 0.10.0 or later. + Nomad Host Volumes can manage storage for stateful workloads running inside your Nomad cluster. This guide walks you through deploying a MySQL workload to a node containing supporting storage. @@ -147,10 +149,7 @@ job "mysql-server" { volume "mysql" { type = "host" read_only = false - - config { - source = "mysql" - } + source = "mysql" } restart { diff --git a/website/source/guides/upgrade/upgrade-specific.html.md b/website/source/guides/upgrade/upgrade-specific.html.md index c54edd81a..3b93d8649 100644 --- a/website/source/guides/upgrade/upgrade-specific.html.md +++ b/website/source/guides/upgrade/upgrade-specific.html.md @@ -30,20 +30,6 @@ You can regain this behavior and disable deployments by setting `max_parallel` t For more information, see [`update` stanza][update]. -### Raft 3 -Nomad 0.10 defaults to Raft 3 which includes [Autopilot](/guides/operations/autopilot.html), -operator-friendly automatic cluster management. -Once all servers are upgraded and running with Raft protocol version 3, autopilot features are enabled. - -If existing servers are still on Raft protocol version 1, -new servers will need [`raft_protocol`](/docs/configuration/server.html#raft_protocol) -set to 2, in order to maintain backwards compatibility with -the old servers during the upgrade. After the servers have been migrated to -version 0.10.0 with Raft protocol version 2, `raft_protocol` can be moved up to 3 and the servers restarted -to match the default. - -For more information on upgrading Raft, see [Upgrading to Raft Protocol 3](/guides/upgrade/upgrade-specific.html#upgrading-to-raft-protocol-3). - ## Nomad 0.9.5 ### Template Rendering diff --git a/website/source/guides/web-ui/access.html.md b/website/source/guides/web-ui/access.html.md new file mode 100644 index 000000000..049adb02d --- /dev/null +++ b/website/source/guides/web-ui/access.html.md @@ -0,0 +1,41 @@ +--- +layout: "guides" +page_title: "Accessing the Web UI" +sidebar_current: "guides-web-ui-access" +description: |- + Learn how to access the Nomad Web UI from a browser or from the CLI. +--- + +# Accessing the Web UI + +The Nomad Web UI is served alongside the API. If you visit the Nomad server address in a web +browser, you will be redirected to the Web UI, which is served under `/ui`. If you are unsure what +port the Nomad HTTP API is running on, try the default port: `4646`. + +The first page you will see is a listing of all Jobs for the default namespace. + +[![Jobs List][img-jobs-list]][img-jobs-list] + +The entire Web UI sitemap is [documented as an API](/api/ui.html). + +## Getting to the Web UI from the CLI + +In order to make it as seamless as possible to jump between the CLI and UI, the Nomad CLI has a +[`ui` subcommand](/docs/commands/ui.html). This command can take any identifier and open the +appropriate web page. + +**Open the UI directly to look at a job:** + +``` +$ nomad ui redis-job +http://127.0.0.1:4646/ui/jobs/redis-job +``` + +**Open the UI directly to look at an allocation:** + +``` +$ nomad ui d4005969 +Opening URL "http://127.0.0.1:4646/ui/allocations/d4005969-b16f-10eb-4fe1-a5374986083d" +``` + +[img-jobs-list]: /assets/images/guide-ui-jobs-list.png diff --git a/website/source/guides/web-ui/index.html.md b/website/source/guides/web-ui/index.html.md new file mode 100644 index 000000000..69e5550c8 --- /dev/null +++ b/website/source/guides/web-ui/index.html.md @@ -0,0 +1,19 @@ +--- +layout: "guides" +page_title: "Web UI" +sidebar_current: "guides-web-ui" +description: |- + Learn how to use the Nomad Web UI. +--- + +# Using Nomad with the Web UI + +The Nomad Web UI offers an easy to use web experience for inspecting a Nomad cluster. It's built +into the Nomad binary and is served alongside the API. With zero additional configuration, you can +use the Web UI instead of the CLI to inspect cluster state and submit and manage jobs. + +1. [Accessing the Web UI](/guides/web-ui/access.html) +1. [Submitting a Job](/guides/web-ui/submitting-a-job.html) +1. [Operating a Job](/guides/web-ui/operating-a-job.html) +1. [Inspecting the Cluster](/guides/web-ui/inspecting-the-cluster.html) +1. [Securing the Web UI with ACLs](/guides/web-ui/securing.html) diff --git a/website/source/guides/web-ui/inspecting-the-cluster.html.md b/website/source/guides/web-ui/inspecting-the-cluster.html.md new file mode 100644 index 000000000..64beb0974 --- /dev/null +++ b/website/source/guides/web-ui/inspecting-the-cluster.html.md @@ -0,0 +1,148 @@ +--- +layout: "guides" +page_title: "Inspecting the Cluster" +sidebar_current: "guides-web-ui-inspecting-the-cluster" +description: |- + Learn how to inspect the state of the cluster from the Web UI. +--- + +# Inspecting the Cluster + +The Web UI can be a powerful tool for monitoring the state of the Nomad cluster from an +operator's perspective. This includes showing all client nodes, showing driver health for client nodes, +driver status, resource utilization, allocations by client node, and more. + +## Reviewing All Clients + +From any page, the Clients List page can be accessed from the left-hand navbar. On narrow screens +this navbar may need to opened from the top-right menu button. Here you see every client in the +cluster. The table of clients is searchable, sortable, and filterable. Each client row in the table +show basic information, such as the Node ID, name, state, address, datacenter, and how many +allocations are running in it. + +This view will also live-update as the state of client nodes change. + +[![Clients List][img-clients-list]][img-clients-list] + +## Filtering Clients + +If your Nomad cluster has many client nodes, it can be useful to filter the list of all client nodes +down to only those matching certain facets. The Web UI has three facets you can filter by: + +1. **Class:** The node of the client, including a dynamically generated list based on the node class + of each client node in the cluster. +2. **State:** The state of the cluster, including Initializing, Ready, Down, Ineligible, and + Draining. +3. **Datacenter:** The datacenter the client node is in, including a dynamically generated list based + on all the datacenters in the cluster. + +[![Clients filters][img-clients-filters]][img-clients-filters] + +## Inspecting an Individual Client + +From the Clients List page, clicking a client node in the table will direct you to the Client Detail +page for the client node. This page includes all information about the client node is live-updated +to always present up-to-date information. + +[![Client Detail][img-client-detail]][img-client-detail] + +### Resource Utilization + +Nomad as APIs for reading point-in-time resource utilization metrics for client nodes. The Web UI +uses these metrics to create time-series graphics for the current session. + +When viewing a client node, resource utilization will automatically start logging. + +[![Client Resource Utilization][img-client-resource-utilization]][img-client-resource-utilization] + +### Allocations + +Allocations belong to jobs and are placed on client nodes. The Client Detail page will list all +allocations for a client node, including completed, failed, and lost allocations, until they are +garbage-collected. + +This is presented in a searchable table which can additionally be filtered to only preempted +allocations. + +[![Client Allocations][img-client-allocations]][img-client-allocations] + +### Client Events + +Client nodes will also emit events on meaningful state changes, such as when the node becomes ready +for scheduling or when a driver becomes unhealthy. + +[![Client Events][img-client-events]][img-client-events] + +### Driver Status + +Task drivers are additional services running on a client node. Nomad will fingerprint and +communicate with the task driver to determine if the driver is available and healthy. This +information is reported through the Web UI on the Client Detail page. + +[![Client Driver Status][img-client-driver-status]][img-client-driver-status] + +### Attributes + +In order to allow job authors to constrain the placement of their jobs, Nomad fingerprints the +hardware of the node the client agent is running on. This is a deeply nested document of properties +that the Web UI presents in a scannable way. + +In addition to the hardware attributes, Nomad operators can annotate +[a client node with metadata](/docs/configuration/client.html#meta) as part of the client configuration. This metadata +is also presented on the Client Detail page. + +[![Client Attributes][img-client-attributes]][img-client-attributes] + +## When a Node is Draining + +A routine part of maintaining a Nomad cluster is draining nodes of allocations. This can be in +preparation of performing operating system upgrades or decommissioning an old node in favor of a new +VM. + +Drains are [performed from the CLI](/guides/operations/node-draining.html) but the status of a drain +can be seen from the Web UI. A client node will state if it is actively draining or ineligible for +scheduling. + +Since drains can be configured in a variety of ways, the Client Detail page will also present the +details of how the drain is performed. + +[![Client Drain][img-client-drain]][img-client-drain] + +## Reviewing All Servers + +Whereas client nodes are used to run your jobs, server nodes are used to run Nomad and maintain +availability. From any page, the Servers List page can be accessed from the left-hand navbar. + +Here you can see every server node. This will be a small list—[typically three or five](/docs/internals/consensus.html#deployment-table). + +[![Servers List][img-servers-list]][img-servers-list] + +## Inspecting an Individual Server + +Clicking a server node on the Servers List will expand the tags table for the server node. + +[![Server Detail][img-server-detail]][img-server-detail] + +## Access Control + +Depending on the size of your team and the details of you Nomad deployment, you may wish to control +which features different internal users have access to. This includes limiting who has access to see +and manage client nodes and see and manage server nodes. You can enforce this with Nomad's access +control list system. + +By default, all features—read and write—are available to all users of the Web UI. Check out the +[Securing the Web UI with ACLs](/guides/web-ui/securing.html) guide to learn how to prevent +anonymous users from having write permissions as well as how to continue to use Web UI write +features as a privileged user. + +[img-client-allocations]: /assets/images/guide-ui-img-client-allocations.png +[img-client-attributes]: /assets/images/guide-ui-img-client-attributes.png +[img-client-detail]: /assets/images/guide-ui-img-client-detail.png +[img-client-drain]: /assets/images/guide-ui-img-client-drain.png +[img-client-driver-status]: /assets/images/guide-ui-img-client-driver-status.png +[img-client-events]: /assets/images/guide-ui-img-client-events.png +[img-client-resource-utilization]: /assets/images/guide-ui-img-client-resource-utilization.png +[img-clients-filters]: /assets/images/guide-ui-img-clients-filters.png +[img-clients-list]: /assets/images/guide-ui-img-clients-list.png +[img-server-detail]: /assets/images/guide-ui-img-server-detail.png +[img-servers-list]: /assets/images/guide-ui-img-servers-list.png diff --git a/website/source/guides/web-ui/operating-a-job.html.md b/website/source/guides/web-ui/operating-a-job.html.md new file mode 100644 index 000000000..d3c79c308 --- /dev/null +++ b/website/source/guides/web-ui/operating-a-job.html.md @@ -0,0 +1,212 @@ +--- +layout: "guides" +page_title: "Operating a Job from the Web UI" +sidebar_current: "guides-web-ui-operating-a-job" +description: |- + Learn how to operate a job from the Web UI. +--- + +# Reviewing Job and Allocation Status + +The Web UI can be a powerful companion when monitoring and debugging jobs running in Nomad. The Web +UI will list all jobs, link jobs to allocations, allocations to client nodes, client nodes to driver +health, and much more. + +## Reviewing All Jobs + +The first page you will see in the Web UI is the Jobs List page. Here you will find every job for a +namespace in a region. The table of jobs is searchable, sortable, and filterable. Each job row in +the table shows basic information, such as job name, status, type, and priority, as well as richer +information such as a visual representation of all allocation statuses. + +This view will also live-update as jobs get submitted, get purged, and change status. + +[![Jobs List][img-jobs-list]][img-jobs-list] + +## Filtering Jobs + +If your Nomad cluster has many jobs, it can be useful to filter the list of all jobs down to only +those matching certain facets. The Web UI has four facets you can filter by: + +1. **Type:** The type of job, including Batch, Parameterized, Periodic, Service, and System. +2. **Status:** The status of the job, including Pending, Running, and Dead. +3. **Datacenter:** The datacenter the job is running in, including a dynamically generated list + based on the jobs in the namespace. +4. **Prefix:** The possible common naming prefix for a job, including a dynamically generated list + based on job names up to the first occurrence of `-`, `.`, and `_`. Only prefixes that match + multiple jobs are included. + +[![Job Filters][img-job-filters]][img-job-filters] + +## Monitoring an Allocation + +In Nomad, allocations are the schedulable units of work. This is where runtime metrics begin to +surface. An allocation is composed of one or more tasks, and the utilization metrics for tasks are +aggregated so they can be observed at the allocation level. + +### Resource Utilization + +Nomad has APIs for reading point-in-time resource utilization metrics for tasks and allocations. The +Web UI uses these metrics to create time-series graphs for the current session. + +When viewing an allocation, resource utilization will automatically start logging. + +[![Allocation Resource Utilization][img-alloc-resource-utilization]][img-alloc-resource-utilization] + +### Task Events + +When Nomad places, prepares, and starts a task, a series of task events are emitted to help debug +issues in the event that the task fails to start. + +Task events are listed on the Task Detail page and live-update as Nomad handles managing the task. + +[![Task Events][img-task-events]][img-task-events] + +### Rescheduled Allocations + +Allocations will be placed on any client node that satisfies the constraints of the job definition. +There are events, however, that will cause Nomad to reschedule allocations, (e.g., node failures). + +Allocations can be configured [in the job definition to reschedule](/docs/job-specification/reschedule.html) +to a different client node if the allocation ends in a failed status. This will happen after the +task has exhausted its [local restart attempts](/docs/job-specification/restart.html). + +The end result of this automatic procedure is a failed allocation and that failed allocation's +rescheduled successor. Since Nomad handles all of this automatically, the Web UI makes sure to +explain the state of allocations through icons and linking previous and next allocations in a +reschedule chain. + +[![Allocation Reschedule Icon][img-alloc-reschedule-icon]][img-alloc-reschedule-icon] + +[![Allocation Reschedule Details][img-alloc-reschedule-details]][img-alloc-reschedule-details] + +### Unhealthy Driver + +Given the nature of long-lived processes, it's possible for the state of the client node an +allocation is scheduled on to change during the lifespan of the allocation. Nomad attempts to +monitor pertinent conditions including driver health. + +The Web UI denotes when a driver an allocation depends on is unhealthy on the client node the +allocation is running on. + +[![Allocation Unhealthy Driver][img-alloc-unhealthy-driver]][img-alloc-unhealthy-driver] + +### Preempted Allocations + +Much like how Nomad will automatically reschedule allocations, Nomad will automatically preempt +allocations when necessary. When monitoring allocations in Nomad, it's useful to know what +allocations were preempted and what job caused the preemption. + +The Web UI makes sure to tell this full story by showing which allocation caused an allocation to be +preempted as well as the opposite: what allocations an allocation preempted. This makes it possible +to traverse down from a job to a preempted allocation, to the allocation that caused the preemption, +to the job that the preempting allocation is for. + +[![Allocation Preempter][img-alloc-preempter]][img-alloc-preempter] + +[![Allocation Preempted][img-alloc-preempted]][img-alloc-preempted] + +## Reviewing Logs for a Task + +A task will typically emit log information to `stdout` and `stderr`. Nomad captures these logs and +exposes them through an API. The Web UI uses these APIs to offer `head`, `tail`, and streaming logs +from the browser. + +The Web UI will first attempt to directly connect to the client node the task is running on. +Typically, client nodes are not accessible from the public internet. If this is the case, the Web UI +will fall back and proxy to the client node from the server node with no loss of functionality. + +[![Task Logs][img-task-logs]][img-task-logs] + +~> Not all browsers support streaming http requests. In the event that streaming is not supported, +logs will still be followed using interval polling. + +## Restarting or Stopping an Allocation or Task + +Nomad allows for restarting and stopping individual allocations and tasks. When a +task is restarted, Nomad will perform a local restart of the task. When an allocation is stopped, +Nomad will mark the allocation as complete and perform a reschedule onto a different client node. + +Both of these features are also available in the Web UI. + +[![Allocation Stop and Restart][img-alloc-stop-restart]][img-alloc-stop-restart] + +## Forcing a Periodic Instance + +Periodic jobs are configured like a cron job. Sometimes, we want to micromanage the job instead of +waiting for the period duration to elapse. Nomad calls this a +[periodic force](/docs/commands/job/periodic-force.html) and it can be done from the Web UI on the +Job Overview page for a periodic job. + +[![Periodic Force][img-periodic-force]][img-periodic-force] + +## Submitting a New Version of a Job + +From the Job Definition page, a job can be edited. After clicking the Edit button in the top-right +corner of the code window, the job definition JSON becomes editable. The edits can then be planned +and scheduled. + +[![Job Definition Edit][img-job-definition-edit]][img-job-definition-edit] + +~> Since each job within a namespace must have a unique name, it is possible to submit a new version +of a job from the Run Job screen. Always review the plan output! + +## Monitoring a Deployment + +When a system or service job includes the [`update` stanza](/docs/job-specification/update.html), a +deployment is created upon job submission. Job deployments can be monitored in realtime from the Web +UI. + +The Web UI will show as new allocations become placed, tallying towards the expected total, and +tally allocations as they becme healthy or unhealthy. + +Optionally, a job may use canary deployments to allow for additional health checks or manual testing +before a full roll out. If a job uses canaries and is not configured to automatically promote the +canary, the canary promotion operation can be done from the Job Overview page in the Web UI. + +[![Job Deployment with Canary Promotion][img-job-deployment-canary]][img-job-deployment-canary] + +## Stopping a Job + +Jobs can be stopped from the Job Overview page. Stopping a job will gracefully stop all allocations, +marking them as complete, and freeing up resources in the cluster. + +[![Job Stop][img-job-stop]][img-job-stop] + +## Access Control + +Depending on the size of your team and the details of your Nomad deployment, you may wish to control +which features different internal users have access to. This includes differentiation between +submitting jobs, restarting allocations, and viewing potentially sensitive logs. You can enforce +this with Nomad's access control list system. + +By default, all features—read and write—are available to all users of the Web UI. Check out the +[Securing the Web UI with ACLs](/guides/web-ui/securing.html) guide to learn how to prevent +anonymous users from having write permissions as well as how to continue to use Web UI write +features as a privileged user. + +## Best Practices + +Although the Web UI lets users submit jobs in an ad-hoc manner, Nomad was deliberately designed to +declare jobs using a configuration language. It is recommended to treat your job definitions, like +the rest of your infrastructure, as code. + +By checking in your job definition files as source control, you will always have a log of changes to +assist in debugging issues, rolling back versions, and collaborating on changes using development +best practices like code review. + +[img-jobs-list]: /assets/images/guide-ui-jobs-list.png +[img-job-filters]: /assets/images/guide-ui-img-job-filters.png +[img-alloc-resource-utilization]: /assets/images/guide-ui-img-alloc-resource-utilization.png +[img-task-events]: /assets/images/guide-ui-img-task-events.png +[img-alloc-reschedule-icon]: /assets/images/guide-ui-img-alloc-reschedule-icon.png +[img-alloc-reschedule-details]: /assets/images/guide-ui-img-alloc-reschedule-details.png +[img-alloc-unhealthy-driver]: /assets/images/guide-ui-img-alloc-unhealthy-driver.png +[img-alloc-preempter]: /assets/images/guide-ui-img-alloc-preempter.png +[img-alloc-preempted]: /assets/images/guide-ui-img-alloc-preempted.png +[img-task-logs]: /assets/images/guide-ui-img-task-logs.png +[img-alloc-stop-restart]: /assets/images/guide-ui-img-alloc-stop-restart.png +[img-periodic-force]: /assets/images/guide-ui-img-periodic-force.png +[img-job-definition-edit]: /assets/images/guide-ui-img-job-definition-edit.png +[img-job-deployment-canary]: /assets/images/guide-ui-img-job-deployment-canary.png +[img-job-stop]: /assets/images/guide-ui-img-job-stop.png diff --git a/website/source/guides/web-ui/securing.html.md b/website/source/guides/web-ui/securing.html.md new file mode 100644 index 000000000..db14a1dce --- /dev/null +++ b/website/source/guides/web-ui/securing.html.md @@ -0,0 +1,32 @@ +--- +layout: "guides" +page_title: "Web UI" +sidebar_current: "guides-web-ui-securing" +description: |- + Learn how to use ACLs to secure the Web UI +--- + +# Securing the Web UI with ACLs + +By default, all features—read and write—are available to all users of the Web UI. By using [Access Control Lists](/guides/security/acl.html), it is possible to lock down what users get access to which features. + +## Browsing the Web UI Without an Access Control Token + +When a user browses the Web UI without specifying an access control token, they assume the rules of the [anonymous policy](/guides/security/acl.html#set-an-anonymous-policy-optional-). Since Nomad ACLs use a default-deny model, if ACLs are enabled and no anonymous policy is authored, the Web UI will show unauthorized messages on every page other than the settings page. + +[![Not authorized to see jobs][img-jobs-list-unauthorized]][img-jobs-list-unauthorized] + +## Setting an Access Control Token + +From the ACL Tokens page, which is accessible from the top-right menu, you can set your access control token via the token Secret ID. + +This token is saved to local storage and can be manually cleared from the ACL Tokens page. + +[![ACL token page][img-acl-token]][img-acl-token] + +[![ACL token set][img-acl-token-set]][img-acl-token-set] + + +[img-jobs-list-unauthorized]: /assets/images/guide-ui-jobs-list-unauthorized.png +[img-acl-token]: /assets/images/guide-ui-acl-token.png +[img-acl-token-set]: /assets/images/guide-ui-acl-token-set.png diff --git a/website/source/guides/web-ui/submitting-a-job.html.md b/website/source/guides/web-ui/submitting-a-job.html.md new file mode 100644 index 000000000..bd2cb0ea0 --- /dev/null +++ b/website/source/guides/web-ui/submitting-a-job.html.md @@ -0,0 +1,184 @@ +--- +layout: "guides" +page_title: "Submitting a Job from the Web UI" +sidebar_current: "guides-web-ui-submitting-a-job" +description: |- + Learn how to submit a job from the Web UI. +--- + +# Submitting a Job + +On the Jobs List page of the Web UI (this is the home page), there is a "Run Job" button in the +top-left corner. Clicking this button will take you to the Job Run page. + +The first step in running a job is authoring the job HCL or JSON. Code can be authored directly in +the UI, complete with syntax highlighting, or it can be pasted in. After you have authored the job, +the next step is to run the plan. + +[![Job Run Page][img-job-run]][img-job-run] + +## Nomad plan + +It is best practice to run `nomad plan` before running `nomad run`, so the Web UI enforces this +best practice. From the Job Run page, underneath the code editor, there is a Plan button. Clicking +this button will proceed the run process to the second step. + +The second step to submitting a job is reviewing the job plan. If you are submitting a new job, the +plan will only show additions. If you are submitting a new version of the job, the plan will include +details on what has been changed, added, and removed. + +[![Job Plan Page][img-job-plan]][img-job-plan] + +The plan operation will also perform a scheduler dry-run. This dry-run is helpful for catching +potential issues early. Some potential issues are: + +1. There is not enough capacity in the cluster to start your job. +2. There is not enough capacity remaining in your quota to start your job. +3. Your job has an unresolvable hard constraint (e.g., required port not available). +4. In order to start your job, other jobs must be preempted. + +[![Job Plan Placement Failures][img-job-plan-placement-failures]][img-job-plan-placement-failures] + +From the plan step, you can either cancel to make edits, or run the job. When you run the job, you +are redirected to the Job Overview page. + +## Placement failures + +One class of potential issues when planning a job is a placement failure. This happens when Nomad +can tell ahead of time that a job cannot be started. Since Nomad does bookkeeping on cluster state +and node metadata, Nomad will already know the answer to basic constraints, such as available +capacity, available hardware, and available ports. + +Nomad will always let you submit a job to the cluster despite placement failures. The job will just +remain in a queued state until the placement failures are resolved. + +Keep in mind that there will always be the possibility that Nomad cannot start a job despite there +being no placement failures (e.g., artifact cannot download or container startup script errors). + +## Preemptions + +Another class of potential issues when planning a job is +[preemptions](/docs/internals/scheduling/preemption.html). This happens when the cluster does not +have capacity for your job, but your job is a high priority and the cluster has preemptions enabled. + +[![Job Plan Preemptions][img-job-plan-preemptions]][img-job-plan-preemptions] + +Unlike with placement failures, when you submit a job that has expected preemptions, the job will +start. However, other allocations will be stopped to free up capacity. + +~> With Nomad OSS, only system jobs can preempt allocations. Nomad Enterprise allows for both +service and batch type jobs to preempt lower priority allocations. + +## Job Overview + +Upon submitting a job, you will be redirected to the Job Overview page for the job you submitted. + +If this is a new job, the job will start in a queued state. If there are no placement failures, +allocations for the job will naturally transition from a starting to a running or failed state. +Nomad is quick to schedule allocations (i.e., find a client node to start the allocation on), but an +allocation may sit in the starting state for a while if it has to download +[source images](/docs/job-specification/task.html#task-examples) or +[other artifacts](/docs/job-specification/artifact.html). It may also sit in a starting state if the +task fails to start and requires retry attempts. + +If this is was an existing job that was resubmitted, the job overview will show old allocations +moving into a completed status before new allocations are spun up. The exact sequence of events +depends on the configuration of the job. + +No matter the configuration of the job, the Job Overview page will live-update as the state of the +job and its allocations change. + +[![Job Overview][img-job-overview]][img-job-overview] + +## Job Definition + +From the subnav on any job detail page, you can access the Job Definition page. + +The Job Definition page will show the job's underlying JSON representation. This can be useful for +quickly verifying how the job was configured. Many properties from the job configuration will also +be on the Job Overview page, but some deeper properties may only be available in the definition +itself. It can also be convenient to see everything at once rather than traversing through task +groups, allocations, and tasks. + +[![Job Definition][img-job-definition]][img-job-definition] + +## Job Versions + +From the subnav on any job detail page, you can access the Job Versions page. + +The Job Versions page will show a timeline view of every version of the job. Each version in the +timeline includes the version number, the time the version was submitted, whether the version is/was +stable, the number of changes, and the job diff. + +Reviewing the job diffs version by version can be used to debug issues in a similar manner to `git log`. + +[![Jobs Versions][img-job-versions]][img-job-versions] + +## Job Deployments + +From the subnav on any service job detail page, you can access the Job Deployments page. + +The Job Deployments page will show a timeline view of every deployment of the job. Each deployment +in the timeline includes the deployment ID, the deployment status, whether or not the deployment +requires promotion, the associated version number, the relative time the deployment started, and a +detailed allocation breakdown. + +The allocation breakdown includes information on allocation placement, including how many canaries +have been placed, how many canaries are expected, how many total allocations have been placed, how +many total allocations are desired, and the health of each allocation. + +[![Jobs Deployments][img-job-deployments]][img-job-deployments] + +## Job Allocations + +From the subnav on any job detail page, you can access the Job Allocations page. + +The Job Allocations page will show a complete table of every allocation for a job. Allocations, +being the unit of work in Nomad, are accessible from many places. The Job Overview page lists some +of the recent allocations for a job for convenience and the Job Task Group page will list all +allocations for that task group, but only the Job Allocations page shows every allocation across all +task groups for the job. + +[![Jobs Allocations][img-job-allocations]][img-job-allocations] + +## Job Evaluations + +From the subnav on any job detail page, you can access the Job Evaluations page. + +The Job Evaluations page will show the most recent evaluations for the job. Evaluations are an +internal detail of Nomad's inner scheduling process and as such are generally unimportant to +monitor, but an experienced Nomad user can use evaluations to diagnose potential issues. + +[![Job Evaluations][img-job-evaluations]][img-job-evaluations] + +## Access Control + +Depending on the size of your team and the details of your Nomad deployment, you may wish to control +which features different internal users have access to. You can enforce this with Nomad's access +control list system. + +By default, all features—read and write—are available to all users of the Web UI. Check out the +[Securing the Web UI with ACLs](/guides/web-ui/securing.html) guide to learn how to prevent +anonymous users from having write permissions as well as how to continue to use Web UI write +features as a privileged user. + +## Best Practices + +Although the Web UI lets users submit jobs in an ad-hoc manner, Nomad was deliberately designed to +declare jobs using a configuration language. It is recommended to treat your job definitions, like +the rest of your infrastructure, as code. + +By checking in your job definition files as source control, you will always have a log of changes to +assist in debugging issues, rolling back versions, and collaborating on changes using development +best practices like code review. + +[img-job-run]: /assets/images/guide-ui-img-job-run.png +[img-job-plan]: /assets/images/guide-ui-img-job-plan.png +[img-job-plan-placement-failures]: /assets/images/guide-ui-img-job-plan-placement-failures.png +[img-job-plan-preemptions]: /assets/images/guide-ui-img-job-plan-preemptions.png +[img-job-overview]: /assets/images/guide-ui-img-job-overview-system.png +[img-job-definition]: /assets/images/guide-ui-img-job-definition.png +[img-job-versions]: /assets/images/guide-ui-img-job-versions.png +[img-job-deployments]: /assets/images/guide-ui-img-job-deployments.png +[img-job-allocations]: /assets/images/guide-ui-img-job-allocations.png +[img-job-evaluations]: /assets/images/guide-ui-img-job-evaluations.png diff --git a/website/source/index.html.erb b/website/source/index.html.erb index 7674378ec..830567825 100644 --- a/website/source/index.html.erb +++ b/website/source/index.html.erb @@ -9,6 +9,10 @@ description: |-
+ + <%= inline_svg "logo-hashicorp.svg", height: 120, class: "logo" %>

Deploy and Manage Any Containerized, Legacy, or Batch Application

diff --git a/website/source/intro/who-uses-nomad.html.markdown b/website/source/intro/who-uses-nomad.html.markdown index 91548b947..6c1f790b1 100644 --- a/website/source/intro/who-uses-nomad.html.markdown +++ b/website/source/intro/who-uses-nomad.html.markdown @@ -73,9 +73,6 @@ Nomad is widely adopted and used in production by PagerDuty, Target, Citadel, Tr ####Elsevier * [Elsevier’s Container Framework with Nomad, Terraform, and Consul](https://www.hashicorp.com/resources/elsevier-nomad-container-framework-demo) -####Palantir - * [Enterprise Security at Palantir with the HashiCorp stack](https://www.hashicorp.com/resources/enterprise-security-hashicorp-stack) - ####Graymeta * [Backend Batch Processing At Scale with Nomad](https://www.hashicorp.com/resources/backend-batch-processing-nomad) diff --git a/website/source/layouts/guides.erb b/website/source/layouts/guides.erb index ed20dc29a..ed5985a4d 100644 --- a/website/source/layouts/guides.erb +++ b/website/source/layouts/guides.erb @@ -51,7 +51,7 @@ Consul > - Consul Connect Beta + Consul Connect > Vault @@ -255,10 +255,25 @@ > Load Balancing + + + > @@ -281,6 +296,27 @@ + > + Web UI + + + <% end %> diff --git a/website/redirects.txt b/website/source/redirects.txt similarity index 96% rename from website/redirects.txt rename to website/source/redirects.txt index cc1eb037d..93f71e9ad 100644 --- a/website/redirects.txt +++ b/website/source/redirects.txt @@ -36,6 +36,14 @@ # - Items are case-sensitive (please use all lowercase) # +# Nomad Learn Redirects +/intro/getting-started/install.html https://learn.hashicorp.com/nomad/getting-started/install +/intro/getting-started/running.html https://learn.hashicorp.com/nomad/getting-started/running +/intro/getting-started/jobs.html https://learn.hashicorp.com/nomad/getting-started/jobs +/intro/getting-started/cluster.html https://learn.hashicorp.com/nomad/getting-started/cluster +/intro/getting-started/ui.html https://learn.hashicorp.com/nomad/getting-started/ui +/intro/getting-started/next-steps.html https://learn.hashicorp.com/nomad/getting-started/next-steps + # Website /community.html /resources.html diff --git a/website/source/resources.html.markdown b/website/source/resources.html.markdown index ccfcaf567..482effd49 100644 --- a/website/source/resources.html.markdown +++ b/website/source/resources.html.markdown @@ -134,10 +134,6 @@ description: |- -
  • Palantir
  • -
  • Graymeta